diff --git a/loader/module.c b/loader/module.c
index 24ed16b..161ef42 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -50,8 +50,6 @@
 WINE_MODREF *exe_modref;
 int process_detaching = 0;  /* set on process detach to avoid deadlocks with thread detach */
 
-CRITICAL_SECTION loader_section = CRITICAL_SECTION_INIT( "loader_section" );
-
 /***********************************************************************
  *           wait_input_idle
  *
@@ -72,31 +70,7 @@
 
 
 /*************************************************************************
- *		MODULE32_LookupHMODULE
- * looks for the referenced HMODULE in the current process
- * NOTE: Assumes that the process critical section is held!
- */
-WINE_MODREF *MODULE32_LookupHMODULE( HMODULE hmod )
-{
-    WINE_MODREF	*wm;
-
-    if (!hmod)
-    	return exe_modref;
-
-    if (!HIWORD(hmod)) {
-    	ERR("tried to lookup %p in win32 module handler!\n",hmod);
-        SetLastError( ERROR_INVALID_HANDLE );
-	return NULL;
-    }
-    for ( wm = MODULE_modref_list; wm; wm=wm->next )
-	if (wm->module == hmod)
-	    return wm;
-    SetLastError( ERROR_INVALID_HANDLE );
-    return NULL;
-}
-
-/*************************************************************************
- *		MODULE_InitDLL
+ *              MODULE_InitDLL
  */
 BOOL MODULE_InitDLL( WINE_MODREF *wm, DWORD type, LPVOID lpReserved )
 {
@@ -123,6 +97,7 @@
     return retv;
 }
 
+
 /*************************************************************************
  *		MODULE_DllProcessAttach
  *
@@ -947,24 +922,36 @@
 	LPSTR lpFileName,	/* [out] filenamebuffer */
         DWORD size )		/* [in] size of filenamebuffer */
 {
-    RtlEnterCriticalSection( &loader_section );
+    DWORD       len = 0;
 
     lpFileName[0] = 0;
+
+    RtlEnterCriticalSection( &loader_section );
     if (!hModule && !(NtCurrentTeb()->tibflags & TEBF_WIN32))
     {
         /* 16-bit task - get current NE module name */
         NE_MODULE *pModule = NE_GetPtr( GetCurrentTask() );
-        if (pModule) GetLongPathNameA(NE_MODULE_NAME(pModule), lpFileName, size);
+        if (pModule) len = GetLongPathNameA(NE_MODULE_NAME(pModule), lpFileName, size);
     }
-    else
+    else if (hModule || LdrGetDllHandle( 0, 0, NULL, &hModule ) == STATUS_SUCCESS)
     {
-        WINE_MODREF *wm = MODULE32_LookupHMODULE( hModule );
-        if (wm) lstrcpynA( lpFileName, wm->filename, size );
-    }
+        LDR_MODULE* pldr;
+        NTSTATUS    nts;
 
+        nts = LdrFindEntryForAddress( hModule, &pldr );
+        if (nts == STATUS_SUCCESS)
+        {
+            WideCharToMultiByte( CP_ACP, 0, 
+                                 pldr->FullDllName.Buffer, pldr->FullDllName.Length,
+                                 lpFileName, size, NULL, NULL );
+            len = min(size, pldr->FullDllName.Length / sizeof(WCHAR));
+        }
+        else SetLastError( RtlNtStatusToDosError( nts ) );
+    }
     RtlLeaveCriticalSection( &loader_section );
-    TRACE("%s\n", lpFileName );
-    return strlen(lpFileName);
+
+    TRACE( "%s\n", debugstr_an(lpFileName, len) );
+    return len;
 }
 
 
@@ -973,13 +960,43 @@
  */
 DWORD WINAPI GetModuleFileNameW( HMODULE hModule, LPWSTR lpFileName, DWORD size )
 {
-    LPSTR fnA = HeapAlloc( GetProcessHeap(), 0, size * 2 );
-    if (!fnA) return 0;
-    GetModuleFileNameA( hModule, fnA, size * 2 );
-    if (size > 0 && !MultiByteToWideChar( CP_ACP, 0, fnA, -1, lpFileName, size ))
-        lpFileName[size-1] = 0;
-    HeapFree( GetProcessHeap(), 0, fnA );
-    return strlenW(lpFileName);
+    DWORD       len = 0;
+
+    lpFileName[0] = 0;
+
+    RtlEnterCriticalSection( &loader_section );
+    if (!hModule && !(NtCurrentTeb()->tibflags & TEBF_WIN32))
+    {
+        /* 16-bit task - get current NE module name */
+        NE_MODULE *pModule = NE_GetPtr( GetCurrentTask() );
+        if (pModule)
+        {
+            WCHAR    path[MAX_PATH];
+
+            MultiByteToWideChar( CP_ACP, 0, NE_MODULE_NAME(pModule), -1, 
+                                 path, MAX_PATH );
+            len = GetLongPathNameW(path, lpFileName, size);
+        }
+    }
+    else if (hModule || LdrGetDllHandle( 0, 0, NULL, &hModule ) == STATUS_SUCCESS)
+    {
+        LDR_MODULE* pldr;
+        NTSTATUS    nts;
+
+        nts = LdrFindEntryForAddress( hModule, &pldr );
+        if (nts == STATUS_SUCCESS)
+        {
+            len = min(size, pldr->FullDllName.Length / sizeof(WCHAR));
+            strncpyW(lpFileName, pldr->FullDllName.Buffer, len);
+            if (len < size) lpFileName[len] = 0;
+        }
+        else SetLastError( RtlNtStatusToDosError( nts ) );
+
+    }
+    RtlLeaveCriticalSection( &loader_section );
+
+    TRACE( "%s\n", debugstr_wn(lpFileName, len) );
+    return len;
 }
 
 /******************************************************************
