- added LDR_MODULE structure to WINE_MODREF and made dummy filling of
this structure
- implementation of LdrFindEntry
- implementation of GetModuleFileName[AW] on top of LdrFindEntry
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;
}
/******************************************************************