diff --git a/memory/global.c b/memory/global.c
index 45088c2..ce11ed2 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -17,6 +17,7 @@
 #include "miscemu.h"
 #include "dde_mem.h"
 #include "stackframe.h"
+#include "module.h"
 #include "options.h"
 #include "stddebug.h"
 #include "debug.h"
@@ -206,6 +207,7 @@
     {
 	ptr = HeapAlloc( SystemHeap, 0, size );
     }
+      /* FIXME: free discardable blocks and try again? */
     if (!ptr) return 0;
 
       /* Allocate the selector(s) */
@@ -274,7 +276,7 @@
     HANDLE16 owner = GetCurrentPDB();
 
     if (flags & GMEM_DDESHARE)
-        owner = GetExePtr(owner);  /* Make it a module handle */
+        owner = MODULE_HANDLEtoHMODULE16(owner);  /* Make it a module handle */
     return GLOBAL_Alloc( flags, size, owner, FALSE, FALSE, FALSE );
 }
 
@@ -313,8 +315,11 @@
             (pArena->lockCount > 0) || (pArena->pageLockCount > 0)) return 0;
         HeapFree( SystemHeap, 0, (void *)pArena->base );
         pArena->base = 0;
-        /* Note: we rely on the fact that SELECTOR_ReallocBlock won't */
-        /* change the selector if we are shrinking the block */
+
+        /* Note: we rely on the fact that SELECTOR_ReallocBlock won't 
+         * change the selector if we are shrinking the block.
+	 * FIXME: shouldn't we keep selectors until the block is deleted?
+	 */
         SELECTOR_ReallocBlock( sel, 0, 1, SEGMENT_DATA, 0, 0 );
         return handle;
     }
@@ -411,15 +416,20 @@
 {
     dprintf_global( stddeb, "WIN16_GlobalLock16(%04x) -> %08lx\n",
                     handle, MAKELONG( 0, GlobalHandleToSel(handle)) );
-    if (!handle) return 0;
+    if (handle)
+    {
+	if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
 
 #ifdef CONFIG_IPC
-    if (is_dde_handle(handle))
-        return PTR_SEG_OFF_TO_SEGPTR( DDE_GlobalHandleToSel(handle), 0 );
+	if (is_dde_handle(handle))
+	    return PTR_SEG_OFF_TO_SEGPTR( DDE_GlobalHandleToSel(handle), 0 );
 #endif  /* CONFIG_IPC */
 
-    if (!GET_ARENA_PTR(handle)->base) return (SEGPTR)0;
-    return PTR_SEG_OFF_TO_SEGPTR( GlobalHandleToSel(handle), 0 );
+	if (!GET_ARENA_PTR(handle)->base) return (SEGPTR)0;
+	return PTR_SEG_OFF_TO_SEGPTR( GlobalHandleToSel(handle), 0 );
+	/* FIXME: put segment value in CX as well */
+    }
+    return (SEGPTR)0;
 }
 
 
diff --git a/memory/local.c b/memory/local.c
index 894beba..c0062dc 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -16,6 +16,7 @@
 #include <string.h>
 #include "windows.h"
 #include "ldt.h"
+#include "task.h"
 #include "global.h"
 #include "heap.h"
 #include "instance.h"
@@ -333,7 +334,7 @@
     if (start == 0) {
       /* Check if the segment is the DGROUP of a module */
 
-	if ((pModule = MODULE_GetPtr( GetExePtr( selector ) )))
+	if ((pModule = MODULE_GetPtr( selector )))
 	{
 	    SEGTABLEENTRY *pSeg = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1;
 	    if (pModule->dgroup && (pSeg->selector == selector)) {
@@ -1582,7 +1583,6 @@
     NE_MODULE *pModule;
     WORD ds;
 
-    module = GetExePtr( module );
     if (!(pModule = MODULE_GetPtr( module ))) return 0;
     ds = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector;
     return MAKELONG( LOCAL_CountFree( ds ), LOCAL_HeapSize( ds ) );
diff --git a/memory/string.c b/memory/string.c
index 72efb86..60194a3 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -8,6 +8,7 @@
 #include <ctype.h>
 #include <string.h>
 #include "windows.h"
+#include "winerror.h"
 #include "ldt.h"
 #include "stddebug.h"
 #include "debug.h"
@@ -147,6 +148,12 @@
  */
 INT32 WINAPI lstrcmp32A( LPCSTR str1, LPCSTR str2 )
 {
+    /* Win95 KERNEL32.DLL does it that way. Hands off! */
+    if (!str1 || !str2) {
+    	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
+
     dprintf_string(stddeb,"strcmp: '%s' and '%s'\n",
 		 (str1)?str1:"NULL",(str2)?str2:"NULL");
     return (INT32)strcmp( str1, str2 );
@@ -158,6 +165,10 @@
  */
 INT32 WINAPI lstrcmp32W( LPCWSTR str1, LPCWSTR str2 )
 {
+    if (!str1 || !str2) {
+    	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
     while (*str1 && (*str1 == *str2)) { str1++; str2++; }
     return (INT32)(*str1 - *str2);
 }
@@ -179,6 +190,10 @@
 {
     INT32 res;
 
+    if (!str1 || !str2) {
+    	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
     dprintf_string(stddeb,"strcmpi '%s' and '%s'\n",
 		 (str1)?str1:"NULL",(str2)?str2:"NULL");
     while (*str1)
@@ -198,6 +213,10 @@
 {
     INT32 res;
 
+    if (!str1 || !str2) {
+    	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
     while (*str1)
     {
         /* FIXME: Unicode */
diff --git a/memory/virtual.c b/memory/virtual.c
index f3765b2..0788836 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -118,19 +118,19 @@
     UINT32 addr = view->base;
     BYTE prot = view->prot[0];
 
-    fprintf( stderr, "View: %08x - %08x%s",
+    dprintf_virtual( stddeb, "View: %08x - %08x%s",
              view->base, view->base + view->size - 1,
              (view->flags & VFLAG_SYSTEM) ? " (system)" : "" );
     if (view->mapping && view->mapping->file)
-        fprintf( stderr, " %s @ %08x\n",
+        dprintf_virtual( stddeb, " %s @ %08x\n",
                  view->mapping->file->unix_name, view->offset );
     else
-        fprintf( stderr, " (anonymous)\n");
+        dprintf_virtual( stddeb, " (anonymous)\n");
 
     for (count = i = 1; i < view->size >> page_shift; i++, count++)
     {
         if (view->prot[i] == prot) continue;
-        fprintf( stderr, "      %08x - %08x %s\n",
+        dprintf_virtual( stddeb, "      %08x - %08x %s\n",
                  addr, addr + (count << page_shift) - 1,
                  VIRTUAL_GetProtStr(prot) );
         addr += (count << page_shift);
@@ -138,7 +138,7 @@
         count = 0;
     }
     if (count)
-        fprintf( stderr, "      %08x - %08x %s\n",
+        dprintf_virtual( stddeb, "      %08x - %08x %s\n",
                  addr, addr + (count << page_shift) - 1,
                  VIRTUAL_GetProtStr(prot) );
 }
@@ -150,7 +150,7 @@
 void VIRTUAL_Dump(void)
 {
     FILE_VIEW *view = VIRTUAL_FirstView;
-    fprintf( stderr, "\nDump of all virtual memory views:\n\n" );
+    dprintf_virtual( stddeb, "\nDump of all virtual memory views:\n\n" );
     while (view)
     {
         VIRTUAL_DumpView( view );
