Fixed a few problems.

diff --git a/loader/dos/dosvm.c b/loader/dos/dosvm.c
index b5fd544..0dea056 100644
--- a/loader/dos/dosvm.c
+++ b/loader/dos/dosvm.c
@@ -398,7 +398,7 @@
   int objc;
   BOOL got_msg = FALSE;
 
-  objs[0]=GetStdHandle(STD_INPUT_HANDLE);
+  objs[0]=lpDosTask->hConInput;
   objs[1]=hObject;
   objc=hObject?2:1;
   do {
@@ -684,7 +684,7 @@
     /* callback event, perform it with dummy context */
     CONTEXT86 context;
     memset(&context,0,sizeof(context));
-    (*relay)(lpDosTask,&context,data);
+    (*relay)(NULL,&context,data);
   } else {
     ERR_(int)("IRQ without DOS task: should not happen");
   }
diff --git a/msdos/int09.c b/msdos/int09.c
index 0ed10dc..c68f4ca 100644
--- a/msdos/int09.c
+++ b/msdos/int09.c
@@ -14,8 +14,10 @@
 
 DEFAULT_DEBUG_CHANNEL(int)
 
+#define QUEUELEN 31
+
 typedef struct {
-  BYTE queuelen,queue[15],ascii[15];
+  BYTE queuelen,queue[QUEUELEN],ascii[QUEUELEN];
 } KBDSYSTEM;
 
 /**********************************************************************
@@ -76,6 +78,10 @@
     sys = calloc(1,sizeof(KBDSYSTEM));
     DOSVM_SetSystemData(0x09,sys);
   }
+  if (sys->queuelen == QUEUELEN) {
+    ERR("keyboard queue overflow\n");
+    return;
+  }
   /* add scancode to queue */
   sys->queue[sys->queuelen] = scan;
   sys->ascii[sys->queuelen++] = ascii;