kernel32: Move some module functions to kernelbase.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0b45fc4750
commit
05d00276c6
|
@ -377,7 +377,7 @@
|
||||||
@ stdcall DeleteVolumeMountPointW(wstr)
|
@ stdcall DeleteVolumeMountPointW(wstr)
|
||||||
@ stdcall -arch=x86_64 DequeueUmsCompletionListItems(ptr long ptr)
|
@ stdcall -arch=x86_64 DequeueUmsCompletionListItems(ptr long ptr)
|
||||||
@ stdcall DeviceIoControl(long long ptr long ptr long ptr ptr)
|
@ stdcall DeviceIoControl(long long ptr long ptr long ptr ptr)
|
||||||
@ stdcall DisableThreadLibraryCalls(long)
|
@ stdcall -import DisableThreadLibraryCalls(long)
|
||||||
@ stdcall -import DisconnectNamedPipe(long)
|
@ stdcall -import DisconnectNamedPipe(long)
|
||||||
@ stdcall DnsHostnameToComputerNameA (str ptr ptr)
|
@ stdcall DnsHostnameToComputerNameA (str ptr ptr)
|
||||||
@ stdcall DnsHostnameToComputerNameW (wstr ptr ptr)
|
@ stdcall DnsHostnameToComputerNameW (wstr ptr ptr)
|
||||||
|
@ -718,12 +718,12 @@
|
||||||
@ stdcall GetMailslotInfo(long ptr ptr ptr ptr)
|
@ stdcall GetMailslotInfo(long ptr ptr ptr ptr)
|
||||||
@ stdcall GetMaximumProcessorCount(long)
|
@ stdcall GetMaximumProcessorCount(long)
|
||||||
# @ stub GetMaximumProcessorGroupCount
|
# @ stub GetMaximumProcessorGroupCount
|
||||||
@ stdcall GetModuleFileNameA(long ptr long)
|
@ stdcall -import GetModuleFileNameA(long ptr long)
|
||||||
@ stdcall GetModuleFileNameW(long ptr long)
|
@ stdcall -import GetModuleFileNameW(long ptr long)
|
||||||
@ stdcall GetModuleHandleA(str)
|
@ stdcall -import GetModuleHandleA(str)
|
||||||
@ stdcall GetModuleHandleExA(long ptr ptr)
|
@ stdcall -import GetModuleHandleExA(long ptr ptr)
|
||||||
@ stdcall GetModuleHandleExW(long ptr ptr)
|
@ stdcall -import GetModuleHandleExW(long ptr ptr)
|
||||||
@ stdcall GetModuleHandleW(wstr)
|
@ stdcall -import GetModuleHandleW(wstr)
|
||||||
# @ stub GetNamedPipeAttribute
|
# @ stub GetNamedPipeAttribute
|
||||||
# @ stub GetNamedPipeClientComputerNameA
|
# @ stub GetNamedPipeClientComputerNameA
|
||||||
# @ stub GetNamedPipeClientComputerNameW
|
# @ stub GetNamedPipeClientComputerNameW
|
||||||
|
|
|
@ -233,33 +233,6 @@ BOOL WINAPI SetDefaultDllDirectories( DWORD flags )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* DisableThreadLibraryCalls (KERNEL32.@)
|
|
||||||
*
|
|
||||||
* Inform the module loader that thread notifications are not required for a dll.
|
|
||||||
*
|
|
||||||
* PARAMS
|
|
||||||
* hModule [I] Module handle to skip calls for
|
|
||||||
*
|
|
||||||
* RETURNS
|
|
||||||
* Success: TRUE. Thread attach and detach notifications will not be sent
|
|
||||||
* to hModule.
|
|
||||||
* Failure: FALSE. Use GetLastError() to determine the cause.
|
|
||||||
*
|
|
||||||
* NOTES
|
|
||||||
* This is typically called from the dll entry point of a dll during process
|
|
||||||
* attachment, for dlls that do not need to process thread notifications.
|
|
||||||
*/
|
|
||||||
BOOL WINAPI DisableThreadLibraryCalls( HMODULE hModule )
|
|
||||||
{
|
|
||||||
NTSTATUS nts = LdrDisableThreadCalloutsForDll( hModule );
|
|
||||||
if (nts == STATUS_SUCCESS) return TRUE;
|
|
||||||
|
|
||||||
SetLastError( RtlNtStatusToDosError( nts ) );
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetBinaryTypeW [KERNEL32.@]
|
* GetBinaryTypeW [KERNEL32.@]
|
||||||
*
|
*
|
||||||
|
@ -402,194 +375,6 @@ BOOL WINAPI GetBinaryTypeA( LPCSTR lpApplicationName, LPDWORD lpBinaryType )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetModuleHandleExA (KERNEL32.@)
|
|
||||||
*/
|
|
||||||
BOOL WINAPI GetModuleHandleExA( DWORD flags, LPCSTR name, HMODULE *module )
|
|
||||||
{
|
|
||||||
WCHAR *nameW;
|
|
||||||
|
|
||||||
if (!name || (flags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS))
|
|
||||||
return GetModuleHandleExW( flags, (LPCWSTR)name, module );
|
|
||||||
|
|
||||||
if (!(nameW = FILE_name_AtoW( name, FALSE ))) return FALSE;
|
|
||||||
return GetModuleHandleExW( flags, nameW, module );
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetModuleHandleExW (KERNEL32.@)
|
|
||||||
*/
|
|
||||||
BOOL WINAPI GetModuleHandleExW( DWORD flags, LPCWSTR name, HMODULE *module )
|
|
||||||
{
|
|
||||||
NTSTATUS status = STATUS_SUCCESS;
|
|
||||||
HMODULE ret;
|
|
||||||
ULONG_PTR magic;
|
|
||||||
BOOL lock;
|
|
||||||
|
|
||||||
if (!module)
|
|
||||||
{
|
|
||||||
SetLastError( ERROR_INVALID_PARAMETER );
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we are messing with the refcount, grab the loader lock */
|
|
||||||
lock = (flags & GET_MODULE_HANDLE_EX_FLAG_PIN) || !(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT);
|
|
||||||
if (lock)
|
|
||||||
LdrLockLoaderLock( 0, NULL, &magic );
|
|
||||||
|
|
||||||
if (!name)
|
|
||||||
{
|
|
||||||
ret = NtCurrentTeb()->Peb->ImageBaseAddress;
|
|
||||||
}
|
|
||||||
else if (flags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)
|
|
||||||
{
|
|
||||||
void *dummy;
|
|
||||||
if (!(ret = RtlPcToFileHeader( (void *)name, &dummy ))) status = STATUS_DLL_NOT_FOUND;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UNICODE_STRING wstr;
|
|
||||||
RtlInitUnicodeString( &wstr, name );
|
|
||||||
status = LdrGetDllHandle( NULL, 0, &wstr, &ret );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status == STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
if (flags & GET_MODULE_HANDLE_EX_FLAG_PIN)
|
|
||||||
LdrAddRefDll( LDR_ADDREF_DLL_PIN, ret );
|
|
||||||
else if (!(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT))
|
|
||||||
LdrAddRefDll( 0, ret );
|
|
||||||
}
|
|
||||||
else SetLastError( RtlNtStatusToDosError( status ) );
|
|
||||||
|
|
||||||
if (lock)
|
|
||||||
LdrUnlockLoaderLock( 0, magic );
|
|
||||||
|
|
||||||
if (status == STATUS_SUCCESS) *module = ret;
|
|
||||||
else *module = NULL;
|
|
||||||
|
|
||||||
return (status == STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetModuleHandleA (KERNEL32.@)
|
|
||||||
*
|
|
||||||
* Get the handle of a dll loaded into the process address space.
|
|
||||||
*
|
|
||||||
* PARAMS
|
|
||||||
* module [I] Name of the dll
|
|
||||||
*
|
|
||||||
* RETURNS
|
|
||||||
* Success: A handle to the loaded dll.
|
|
||||||
* Failure: A NULL handle. Use GetLastError() to determine the cause.
|
|
||||||
*/
|
|
||||||
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR module)
|
|
||||||
{
|
|
||||||
HMODULE ret;
|
|
||||||
|
|
||||||
GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, module, &ret );
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetModuleHandleW (KERNEL32.@)
|
|
||||||
*
|
|
||||||
* Unicode version of GetModuleHandleA.
|
|
||||||
*/
|
|
||||||
HMODULE WINAPI GetModuleHandleW(LPCWSTR module)
|
|
||||||
{
|
|
||||||
HMODULE ret;
|
|
||||||
|
|
||||||
GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, module, &ret );
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetModuleFileNameA (KERNEL32.@)
|
|
||||||
*
|
|
||||||
* Get the file name of a loaded module from its handle.
|
|
||||||
*
|
|
||||||
* RETURNS
|
|
||||||
* Success: The length of the file name, excluding the terminating NUL.
|
|
||||||
* Failure: 0. Use GetLastError() to determine the cause.
|
|
||||||
*
|
|
||||||
* NOTES
|
|
||||||
* This function always returns the long path of hModule
|
|
||||||
* The function doesn't write a terminating '\0' if the buffer is too
|
|
||||||
* small.
|
|
||||||
*/
|
|
||||||
DWORD WINAPI GetModuleFileNameA(
|
|
||||||
HMODULE hModule, /* [in] Module handle (32 bit) */
|
|
||||||
LPSTR lpFileName, /* [out] Destination for file name */
|
|
||||||
DWORD size ) /* [in] Size of lpFileName in characters */
|
|
||||||
{
|
|
||||||
LPWSTR filenameW = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) );
|
|
||||||
DWORD len;
|
|
||||||
|
|
||||||
if (!filenameW)
|
|
||||||
{
|
|
||||||
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ((len = GetModuleFileNameW( hModule, filenameW, size )))
|
|
||||||
{
|
|
||||||
len = FILE_name_WtoA( filenameW, len, lpFileName, size );
|
|
||||||
if (len < size)
|
|
||||||
lpFileName[len] = '\0';
|
|
||||||
else
|
|
||||||
SetLastError( ERROR_INSUFFICIENT_BUFFER );
|
|
||||||
}
|
|
||||||
HeapFree( GetProcessHeap(), 0, filenameW );
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* GetModuleFileNameW (KERNEL32.@)
|
|
||||||
*
|
|
||||||
* Unicode version of GetModuleFileNameA.
|
|
||||||
*/
|
|
||||||
DWORD WINAPI GetModuleFileNameW( HMODULE hModule, LPWSTR lpFileName, DWORD size )
|
|
||||||
{
|
|
||||||
ULONG len = 0;
|
|
||||||
ULONG_PTR magic;
|
|
||||||
LDR_MODULE *pldr;
|
|
||||||
NTSTATUS nts;
|
|
||||||
WIN16_SUBSYSTEM_TIB *win16_tib;
|
|
||||||
|
|
||||||
if (!hModule && ((win16_tib = NtCurrentTeb()->Tib.SubSystemTib)) && win16_tib->exe_name)
|
|
||||||
{
|
|
||||||
len = min(size, win16_tib->exe_name->Length / sizeof(WCHAR));
|
|
||||||
memcpy( lpFileName, win16_tib->exe_name->Buffer, len * sizeof(WCHAR) );
|
|
||||||
if (len < size) lpFileName[len] = '\0';
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
LdrLockLoaderLock( 0, NULL, &magic );
|
|
||||||
|
|
||||||
if (!hModule) hModule = NtCurrentTeb()->Peb->ImageBaseAddress;
|
|
||||||
nts = LdrFindEntryForAddress( hModule, &pldr );
|
|
||||||
if (nts == STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
len = min(size, pldr->FullDllName.Length / sizeof(WCHAR));
|
|
||||||
memcpy(lpFileName, pldr->FullDllName.Buffer, len * sizeof(WCHAR));
|
|
||||||
if (len < size)
|
|
||||||
{
|
|
||||||
lpFileName[len] = '\0';
|
|
||||||
SetLastError( 0 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
SetLastError( ERROR_INSUFFICIENT_BUFFER );
|
|
||||||
}
|
|
||||||
else SetLastError( RtlNtStatusToDosError( nts ) );
|
|
||||||
|
|
||||||
LdrUnlockLoaderLock( 0, magic );
|
|
||||||
done:
|
|
||||||
TRACE( "%s\n", debugstr_wn(lpFileName, len) );
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* get_dll_system_path
|
* get_dll_system_path
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -263,7 +263,7 @@
|
||||||
@ stdcall DestroyPrivateObjectSecurity(ptr)
|
@ stdcall DestroyPrivateObjectSecurity(ptr)
|
||||||
@ stdcall DeviceIoControl(long long ptr long ptr long ptr ptr) kernel32.DeviceIoControl
|
@ stdcall DeviceIoControl(long long ptr long ptr long ptr ptr) kernel32.DeviceIoControl
|
||||||
@ stdcall DisablePredefinedHandleTableInternal(long)
|
@ stdcall DisablePredefinedHandleTableInternal(long)
|
||||||
@ stdcall DisableThreadLibraryCalls(long) kernel32.DisableThreadLibraryCalls
|
@ stdcall DisableThreadLibraryCalls(long)
|
||||||
@ stdcall DisassociateCurrentThreadFromCallback(ptr) ntdll.TpDisassociateCallback
|
@ stdcall DisassociateCurrentThreadFromCallback(ptr) ntdll.TpDisassociateCallback
|
||||||
# @ stub DiscardVirtualMemory
|
# @ stub DiscardVirtualMemory
|
||||||
@ stdcall DisconnectNamedPipe(long)
|
@ stdcall DisconnectNamedPipe(long)
|
||||||
|
@ -556,14 +556,14 @@
|
||||||
# @ stub GetMemoryErrorHandlingCapabilities
|
# @ stub GetMemoryErrorHandlingCapabilities
|
||||||
# @ stub GetModuleBaseNameA
|
# @ stub GetModuleBaseNameA
|
||||||
# @ stub GetModuleBaseNameW
|
# @ stub GetModuleBaseNameW
|
||||||
@ stdcall GetModuleFileNameA(long ptr long) kernel32.GetModuleFileNameA
|
@ stdcall GetModuleFileNameA(long ptr long)
|
||||||
# @ stub GetModuleFileNameExA
|
# @ stub GetModuleFileNameExA
|
||||||
# @ stub GetModuleFileNameExW
|
# @ stub GetModuleFileNameExW
|
||||||
@ stdcall GetModuleFileNameW(long ptr long) kernel32.GetModuleFileNameW
|
@ stdcall GetModuleFileNameW(long ptr long)
|
||||||
@ stdcall GetModuleHandleA(str) kernel32.GetModuleHandleA
|
@ stdcall GetModuleHandleA(str)
|
||||||
@ stdcall GetModuleHandleExA(long ptr ptr) kernel32.GetModuleHandleExA
|
@ stdcall GetModuleHandleExA(long ptr ptr)
|
||||||
@ stdcall GetModuleHandleExW(long ptr ptr) kernel32.GetModuleHandleExW
|
@ stdcall GetModuleHandleExW(long ptr ptr)
|
||||||
@ stdcall GetModuleHandleW(wstr) kernel32.GetModuleHandleW
|
@ stdcall GetModuleHandleW(wstr)
|
||||||
# @ stub GetModuleInformation
|
# @ stub GetModuleInformation
|
||||||
@ stub GetNLSVersion
|
@ stub GetNLSVersion
|
||||||
@ stub GetNLSVersionEx
|
@ stub GetNLSVersionEx
|
||||||
|
|
|
@ -37,6 +37,176 @@
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(module);
|
WINE_DEFAULT_DEBUG_CHANNEL(module);
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Modules
|
||||||
|
***********************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* DisableThreadLibraryCalls (kernelbase.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI DECLSPEC_HOTPATCH DisableThreadLibraryCalls( HMODULE module )
|
||||||
|
{
|
||||||
|
return set_ntstatus( LdrDisableThreadCalloutsForDll( module ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetModuleFileNameA (kernelbase.@)
|
||||||
|
*/
|
||||||
|
DWORD WINAPI DECLSPEC_HOTPATCH GetModuleFileNameA( HMODULE module, LPSTR filename, DWORD size )
|
||||||
|
{
|
||||||
|
LPWSTR filenameW = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) );
|
||||||
|
DWORD len;
|
||||||
|
|
||||||
|
if (!filenameW)
|
||||||
|
{
|
||||||
|
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ((len = GetModuleFileNameW( module, filenameW, size )))
|
||||||
|
{
|
||||||
|
len = file_name_WtoA( filenameW, len, filename, size );
|
||||||
|
if (len < size)
|
||||||
|
filename[len] = 0;
|
||||||
|
else
|
||||||
|
SetLastError( ERROR_INSUFFICIENT_BUFFER );
|
||||||
|
}
|
||||||
|
HeapFree( GetProcessHeap(), 0, filenameW );
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetModuleFileNameW (kernelbase.@)
|
||||||
|
*/
|
||||||
|
DWORD WINAPI DECLSPEC_HOTPATCH GetModuleFileNameW( HMODULE module, LPWSTR filename, DWORD size )
|
||||||
|
{
|
||||||
|
ULONG len = 0;
|
||||||
|
ULONG_PTR magic;
|
||||||
|
LDR_MODULE *pldr;
|
||||||
|
WIN16_SUBSYSTEM_TIB *win16_tib;
|
||||||
|
|
||||||
|
if (!module && ((win16_tib = NtCurrentTeb()->Tib.SubSystemTib)) && win16_tib->exe_name)
|
||||||
|
{
|
||||||
|
len = min( size, win16_tib->exe_name->Length / sizeof(WCHAR) );
|
||||||
|
memcpy( filename, win16_tib->exe_name->Buffer, len * sizeof(WCHAR) );
|
||||||
|
if (len < size) filename[len] = 0;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
LdrLockLoaderLock( 0, NULL, &magic );
|
||||||
|
|
||||||
|
if (!module) module = NtCurrentTeb()->Peb->ImageBaseAddress;
|
||||||
|
if (set_ntstatus( LdrFindEntryForAddress( module, &pldr )))
|
||||||
|
{
|
||||||
|
len = min( size, pldr->FullDllName.Length / sizeof(WCHAR) );
|
||||||
|
memcpy( filename, pldr->FullDllName.Buffer, len * sizeof(WCHAR) );
|
||||||
|
if (len < size)
|
||||||
|
{
|
||||||
|
filename[len] = 0;
|
||||||
|
SetLastError( 0 );
|
||||||
|
}
|
||||||
|
else SetLastError( ERROR_INSUFFICIENT_BUFFER );
|
||||||
|
}
|
||||||
|
|
||||||
|
LdrUnlockLoaderLock( 0, magic );
|
||||||
|
done:
|
||||||
|
TRACE( "%s\n", debugstr_wn(filename, len) );
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetModuleHandleA (kernelbase.@)
|
||||||
|
*/
|
||||||
|
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA( LPCSTR module )
|
||||||
|
{
|
||||||
|
HMODULE ret;
|
||||||
|
|
||||||
|
GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, module, &ret );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetModuleHandleW (kernelbase.@)
|
||||||
|
*/
|
||||||
|
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleW( LPCWSTR module )
|
||||||
|
{
|
||||||
|
HMODULE ret;
|
||||||
|
|
||||||
|
GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, module, &ret );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetModuleHandleExA (kernelbase.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI DECLSPEC_HOTPATCH GetModuleHandleExA( DWORD flags, LPCSTR name, HMODULE *module )
|
||||||
|
{
|
||||||
|
WCHAR *nameW;
|
||||||
|
|
||||||
|
if (!name || (flags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS))
|
||||||
|
return GetModuleHandleExW( flags, (LPCWSTR)name, module );
|
||||||
|
|
||||||
|
if (!(nameW = file_name_AtoW( name, FALSE ))) return FALSE;
|
||||||
|
return GetModuleHandleExW( flags, nameW, module );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GetModuleHandleExW (kernelbase.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI DECLSPEC_HOTPATCH GetModuleHandleExW( DWORD flags, LPCWSTR name, HMODULE *module )
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_SUCCESS;
|
||||||
|
HMODULE ret = NULL;
|
||||||
|
ULONG_PTR magic;
|
||||||
|
BOOL lock;
|
||||||
|
|
||||||
|
if (!module)
|
||||||
|
{
|
||||||
|
SetLastError( ERROR_INVALID_PARAMETER );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we are messing with the refcount, grab the loader lock */
|
||||||
|
lock = (flags & GET_MODULE_HANDLE_EX_FLAG_PIN) || !(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT);
|
||||||
|
if (lock) LdrLockLoaderLock( 0, NULL, &magic );
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
{
|
||||||
|
ret = NtCurrentTeb()->Peb->ImageBaseAddress;
|
||||||
|
}
|
||||||
|
else if (flags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)
|
||||||
|
{
|
||||||
|
void *dummy;
|
||||||
|
if (!(ret = RtlPcToFileHeader( (void *)name, &dummy ))) status = STATUS_DLL_NOT_FOUND;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UNICODE_STRING wstr;
|
||||||
|
RtlInitUnicodeString( &wstr, name );
|
||||||
|
status = LdrGetDllHandle( NULL, 0, &wstr, &ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
if (flags & GET_MODULE_HANDLE_EX_FLAG_PIN)
|
||||||
|
LdrAddRefDll( LDR_ADDREF_DLL_PIN, ret );
|
||||||
|
else if (!(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT))
|
||||||
|
LdrAddRefDll( 0, ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lock) LdrUnlockLoaderLock( 0, magic );
|
||||||
|
|
||||||
|
*module = ret;
|
||||||
|
return set_ntstatus( status );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Resources
|
* Resources
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
@ -89,7 +259,7 @@ static NTSTATUS get_res_nameW( LPCWSTR name, UNICODE_STRING *str )
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* EnumResourceLanguagesExA (KERNEL32.@)
|
* EnumResourceLanguagesExA (kernelbase.@)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI DECLSPEC_HOTPATCH EnumResourceLanguagesExA( HMODULE module, LPCSTR type, LPCSTR name,
|
BOOL WINAPI DECLSPEC_HOTPATCH EnumResourceLanguagesExA( HMODULE module, LPCSTR type, LPCSTR name,
|
||||||
ENUMRESLANGPROCA func, LONG_PTR param,
|
ENUMRESLANGPROCA func, LONG_PTR param,
|
||||||
|
@ -149,7 +319,7 @@ done:
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* EnumResourceLanguagesExW (KERNEL32.@)
|
* EnumResourceLanguagesExW (kernelbase.@)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI DECLSPEC_HOTPATCH EnumResourceLanguagesExW( HMODULE module, LPCWSTR type, LPCWSTR name,
|
BOOL WINAPI DECLSPEC_HOTPATCH EnumResourceLanguagesExW( HMODULE module, LPCWSTR type, LPCWSTR name,
|
||||||
ENUMRESLANGPROCW func, LONG_PTR param,
|
ENUMRESLANGPROCW func, LONG_PTR param,
|
||||||
|
|
Loading…
Reference in New Issue