Make GetModuleFileNameA call GetModuleFileNameW. Small cleanups.
diff --git a/loader/module.c b/loader/module.c
index 161ef42..578561c 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -50,6 +50,14 @@
WINE_MODREF *exe_modref;
int process_detaching = 0; /* set on process detach to avoid deadlocks with thread detach */
+inline static HMODULE get_exe_module(void)
+{
+ HMODULE mod;
+ /* FIXME: should look into PEB */
+ LdrGetDllHandle( 0, 0, NULL, &mod );
+ return mod;
+}
+
/***********************************************************************
* wait_input_idle
*
@@ -922,46 +930,24 @@
LPSTR lpFileName, /* [out] filenamebuffer */
DWORD size ) /* [in] size of filenamebuffer */
{
- DWORD len = 0;
+ LPWSTR filenameW = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) );
- lpFileName[0] = 0;
-
- RtlEnterCriticalSection( &loader_section );
- if (!hModule && !(NtCurrentTeb()->tibflags & TEBF_WIN32))
+ if (!filenameW)
{
- /* 16-bit task - get current NE module name */
- NE_MODULE *pModule = NE_GetPtr( GetCurrentTask() );
- if (pModule) len = GetLongPathNameA(NE_MODULE_NAME(pModule), lpFileName, size);
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ return 0;
}
- else if (hModule || LdrGetDllHandle( 0, 0, NULL, &hModule ) == STATUS_SUCCESS)
- {
- 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", debugstr_an(lpFileName, len) );
- return len;
+ GetModuleFileNameW( hModule, filenameW, size );
+ WideCharToMultiByte( CP_ACP, 0, filenameW, -1, lpFileName, size, NULL, NULL );
+ HeapFree( GetProcessHeap(), 0, filenameW );
+ return strlen( lpFileName );
}
-
/***********************************************************************
* GetModuleFileNameW (KERNEL32.@)
*/
DWORD WINAPI GetModuleFileNameW( HMODULE hModule, LPWSTR lpFileName, DWORD size )
{
- DWORD len = 0;
-
lpFileName[0] = 0;
RtlEnterCriticalSection( &loader_section );
@@ -973,30 +959,25 @@
{
WCHAR path[MAX_PATH];
- MultiByteToWideChar( CP_ACP, 0, NE_MODULE_NAME(pModule), -1,
- path, MAX_PATH );
- len = GetLongPathNameW(path, lpFileName, size);
+ MultiByteToWideChar( CP_ACP, 0, NE_MODULE_NAME(pModule), -1, path, MAX_PATH );
+ GetLongPathNameW(path, lpFileName, size);
}
}
- else if (hModule || LdrGetDllHandle( 0, 0, NULL, &hModule ) == STATUS_SUCCESS)
+ else
{
LDR_MODULE* pldr;
NTSTATUS nts;
+ if (!hModule) hModule = get_exe_module();
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;
- }
+ if (nts == STATUS_SUCCESS) lstrcpynW(lpFileName, pldr->FullDllName.Buffer, size);
else SetLastError( RtlNtStatusToDosError( nts ) );
}
RtlLeaveCriticalSection( &loader_section );
- TRACE( "%s\n", debugstr_wn(lpFileName, len) );
- return len;
+ TRACE( "%s\n", debugstr_w(lpFileName) );
+ return strlenW(lpFileName);
}
/******************************************************************