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 -arch=x86_64 DequeueUmsCompletionListItems(ptr long ptr)
|
||||
@ stdcall DeviceIoControl(long long ptr long ptr long ptr ptr)
|
||||
@ stdcall DisableThreadLibraryCalls(long)
|
||||
@ stdcall -import DisableThreadLibraryCalls(long)
|
||||
@ stdcall -import DisconnectNamedPipe(long)
|
||||
@ stdcall DnsHostnameToComputerNameA (str ptr ptr)
|
||||
@ stdcall DnsHostnameToComputerNameW (wstr ptr ptr)
|
||||
|
@ -718,12 +718,12 @@
|
|||
@ stdcall GetMailslotInfo(long ptr ptr ptr ptr)
|
||||
@ stdcall GetMaximumProcessorCount(long)
|
||||
# @ stub GetMaximumProcessorGroupCount
|
||||
@ stdcall GetModuleFileNameA(long ptr long)
|
||||
@ stdcall GetModuleFileNameW(long ptr long)
|
||||
@ stdcall GetModuleHandleA(str)
|
||||
@ stdcall GetModuleHandleExA(long ptr ptr)
|
||||
@ stdcall GetModuleHandleExW(long ptr ptr)
|
||||
@ stdcall GetModuleHandleW(wstr)
|
||||
@ stdcall -import GetModuleFileNameA(long ptr long)
|
||||
@ stdcall -import GetModuleFileNameW(long ptr long)
|
||||
@ stdcall -import GetModuleHandleA(str)
|
||||
@ stdcall -import GetModuleHandleExA(long ptr ptr)
|
||||
@ stdcall -import GetModuleHandleExW(long ptr ptr)
|
||||
@ stdcall -import GetModuleHandleW(wstr)
|
||||
# @ stub GetNamedPipeAttribute
|
||||
# @ stub GetNamedPipeClientComputerNameA
|
||||
# @ 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.@]
|
||||
*
|
||||
|
@ -402,194 +375,6 @@ BOOL WINAPI GetBinaryTypeA( LPCSTR lpApplicationName, LPDWORD lpBinaryType )
|
|||
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
|
||||
*/
|
||||
|
|
|
@ -263,7 +263,7 @@
|
|||
@ stdcall DestroyPrivateObjectSecurity(ptr)
|
||||
@ stdcall DeviceIoControl(long long ptr long ptr long ptr ptr) kernel32.DeviceIoControl
|
||||
@ stdcall DisablePredefinedHandleTableInternal(long)
|
||||
@ stdcall DisableThreadLibraryCalls(long) kernel32.DisableThreadLibraryCalls
|
||||
@ stdcall DisableThreadLibraryCalls(long)
|
||||
@ stdcall DisassociateCurrentThreadFromCallback(ptr) ntdll.TpDisassociateCallback
|
||||
# @ stub DiscardVirtualMemory
|
||||
@ stdcall DisconnectNamedPipe(long)
|
||||
|
@ -556,14 +556,14 @@
|
|||
# @ stub GetMemoryErrorHandlingCapabilities
|
||||
# @ stub GetModuleBaseNameA
|
||||
# @ stub GetModuleBaseNameW
|
||||
@ stdcall GetModuleFileNameA(long ptr long) kernel32.GetModuleFileNameA
|
||||
@ stdcall GetModuleFileNameA(long ptr long)
|
||||
# @ stub GetModuleFileNameExA
|
||||
# @ stub GetModuleFileNameExW
|
||||
@ stdcall GetModuleFileNameW(long ptr long) kernel32.GetModuleFileNameW
|
||||
@ stdcall GetModuleHandleA(str) kernel32.GetModuleHandleA
|
||||
@ stdcall GetModuleHandleExA(long ptr ptr) kernel32.GetModuleHandleExA
|
||||
@ stdcall GetModuleHandleExW(long ptr ptr) kernel32.GetModuleHandleExW
|
||||
@ stdcall GetModuleHandleW(wstr) kernel32.GetModuleHandleW
|
||||
@ stdcall GetModuleFileNameW(long ptr long)
|
||||
@ stdcall GetModuleHandleA(str)
|
||||
@ stdcall GetModuleHandleExA(long ptr ptr)
|
||||
@ stdcall GetModuleHandleExW(long ptr ptr)
|
||||
@ stdcall GetModuleHandleW(wstr)
|
||||
# @ stub GetModuleInformation
|
||||
@ stub GetNLSVersion
|
||||
@ stub GetNLSVersionEx
|
||||
|
|
|
@ -37,6 +37,176 @@
|
|||
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
|
||||
***********************************************************************/
|
||||
|
@ -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,
|
||||
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,
|
||||
ENUMRESLANGPROCW func, LONG_PTR param,
|
||||
|
|
Loading…
Reference in New Issue