diff --git a/dlls/kernel/dosmem.c b/dlls/kernel/dosmem.c index 69f3586e3b2..f2546de151e 100644 --- a/dlls/kernel/dosmem.c +++ b/dlls/kernel/dosmem.c @@ -41,6 +41,7 @@ #include "wine/winbase16.h" #include "kernel_private.h" +#include "toolhelp.h" #include "miscemu.h" #include "wine/debug.h" diff --git a/dlls/kernel/format_msg.c b/dlls/kernel/format_msg.c index fe9f843c38f..da893a53ffc 100644 --- a/dlls/kernel/format_msg.c +++ b/dlls/kernel/format_msg.c @@ -33,7 +33,7 @@ #include "winuser.h" #include "winnls.h" #include "wine/unicode.h" - +#include "kernel_private.h" #include "heap.h" #include "wine/debug.h" @@ -172,7 +172,7 @@ DWORD WINAPI FormatMessageA( } if ((dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) && (!bufsize)) { - hmodule = GetModuleHandleA("kernel32"); + hmodule = kernel32_handle; bufsize=load_messageA(hmodule,dwMessageId,dwLanguageId,NULL,100); } @@ -399,7 +399,7 @@ DWORD WINAPI FormatMessageW( } if ((dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) && (!bufsize)) { - hmodule = GetModuleHandleA("kernel32"); + hmodule = kernel32_handle; bufsize=load_messageA(hmodule,dwMessageId,dwLanguageId,NULL,100); } diff --git a/dlls/kernel/kernel_main.c b/dlls/kernel/kernel_main.c index 951fe4bc28d..49e39b0ac9b 100644 --- a/dlls/kernel/kernel_main.c +++ b/dlls/kernel/kernel_main.c @@ -42,6 +42,7 @@ #include "thread.h" #include "stackframe.h" #include "wincon.h" +#include "toolhelp.h" #include "kernel_private.h" #include "console_private.h" diff --git a/dlls/kernel/kernel_private.h b/dlls/kernel/kernel_private.h index 21985b6856d..6c91d231711 100644 --- a/dlls/kernel/kernel_private.h +++ b/dlls/kernel/kernel_private.h @@ -44,6 +44,8 @@ static inline HANDLE console_handle_unmap(HANDLE h) return h != INVALID_HANDLE_VALUE ? (HANDLE)((DWORD)h ^ 3) : INVALID_HANDLE_VALUE; } +extern HMODULE kernel32_handle; + /* Size of per-process table of DOS handles */ #define DOS_TABLE_SIZE 256 extern HANDLE dos_handles[DOS_TABLE_SIZE]; @@ -65,12 +67,6 @@ extern void SELECTOR_FreeBlock( WORD sel ); #define IS_SELECTOR_32BIT(sel) \ (wine_ldt_is_system(sel) || (wine_ldt_copy.flags[LOWORD(sel) >> 3] & WINE_LDT_FLAGS_32BIT)) -extern HGLOBAL16 GLOBAL_CreateBlock( UINT16 flags, const void *ptr, DWORD size, - HGLOBAL16 hOwner, unsigned char selflags ); -extern BOOL16 GLOBAL_FreeBlock( HGLOBAL16 handle ); -extern BOOL16 GLOBAL_MoveBlock( HGLOBAL16 handle, const void *ptr, DWORD size ); -extern HGLOBAL16 GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL16 hOwner, unsigned char selflags ); - /* this structure is always located at offset 0 of the DGROUP segment */ #include "pshpack1.h" typedef struct diff --git a/dlls/kernel/locale.c b/dlls/kernel/locale.c index ed771e7318c..0f35f519068 100644 --- a/dlls/kernel/locale.c +++ b/dlls/kernel/locale.c @@ -41,14 +41,13 @@ #include "winnls.h" #include "winerror.h" #include "thread.h" +#include "kernel_private.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(nls); #define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER) -static const WCHAR kernel32W[] = { 'K','E','R','N','E','L','3','2','\0' }; - /* current code pages */ static const union cptable *ansi_cptable; static const union cptable *oem_cptable; @@ -383,7 +382,6 @@ found: static LANGID get_language_id(LPCSTR Lang, LPCSTR Country, LPCSTR Charset, LPCSTR Dialect) { LANG_FIND_DATA l_data; - HMODULE hKernel32; if(!Lang) { @@ -397,9 +395,7 @@ static LANGID get_language_id(LPCSTR Lang, LPCSTR Country, LPCSTR Charset, LPCST if (Country) strcpynAtoW(l_data.country, Country, sizeof(l_data.country)); else l_data.country[0] = 0; - hKernel32 = GetModuleHandleW(kernel32W); - - EnumResourceLanguagesW(hKernel32, (LPCWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE, + EnumResourceLanguagesW(kernel32_handle, (LPCWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE, find_language_id_proc, (LPARAM)&l_data); if (l_data.n_found == 1) goto END; @@ -410,7 +406,7 @@ static LANGID get_language_id(LPCSTR Lang, LPCSTR Country, LPCSTR Charset, LPCST { /* retry without country name */ l_data.country[0] = 0; - EnumResourceLanguagesW(hKernel32, (LPCWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE, + EnumResourceLanguagesW(kernel32_handle, (LPCWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE, find_language_id_proc, (LONG)&l_data); if (!l_data.n_found) { @@ -882,7 +878,6 @@ INT WINAPI GetLocaleInfoW( LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len ) LANGID lang_id; HRSRC hrsrc; HGLOBAL hmem; - HMODULE hModule; INT ret; UINT lcflags; const WCHAR *p; @@ -945,13 +940,13 @@ INT WINAPI GetLocaleInfoW( LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len ) if (SUBLANGID(lang_id) == SUBLANG_NEUTRAL) lang_id = MAKELANGID(PRIMARYLANGID(lang_id), SUBLANG_DEFAULT); - hModule = GetModuleHandleW( kernel32W ); - if (!(hrsrc = FindResourceExW( hModule, (LPWSTR)RT_STRING, (LPCWSTR)((lctype >> 4) + 1), lang_id ))) + if (!(hrsrc = FindResourceExW( kernel32_handle, (LPWSTR)RT_STRING, + (LPCWSTR)((lctype >> 4) + 1), lang_id ))) { SetLastError( ERROR_INVALID_FLAGS ); /* no such lctype */ return 0; } - if (!(hmem = LoadResource( hModule, hrsrc ))) + if (!(hmem = LoadResource( kernel32_handle, hrsrc ))) return 0; p = LockResource( hmem ); @@ -1675,7 +1670,7 @@ LCID WINAPI ConvertDefaultLocale( LCID lcid ) BOOL WINAPI IsValidLocale( LCID lcid, DWORD flags ) { /* check if language is registered in the kernel32 resources */ - return FindResourceExW( GetModuleHandleW(kernel32W), (LPWSTR)RT_STRING, + return FindResourceExW( kernel32_handle, (LPWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE, LANGIDFROMLCID(lcid)) != 0; } @@ -1716,7 +1711,7 @@ static BOOL CALLBACK enum_lang_proc_w( HMODULE hModule, LPCWSTR type, BOOL WINAPI EnumSystemLocalesA( LOCALE_ENUMPROCA lpfnLocaleEnum, DWORD dwFlags ) { TRACE("(%p,%08lx)\n", lpfnLocaleEnum, dwFlags); - EnumResourceLanguagesA( GetModuleHandleW(kernel32W), (LPSTR)RT_STRING, + EnumResourceLanguagesA( kernel32_handle, (LPSTR)RT_STRING, (LPCSTR)LOCALE_ILANGUAGE, enum_lang_proc_a, (LONG)lpfnLocaleEnum); return TRUE; @@ -1731,7 +1726,7 @@ BOOL WINAPI EnumSystemLocalesA( LOCALE_ENUMPROCA lpfnLocaleEnum, DWORD dwFlags ) BOOL WINAPI EnumSystemLocalesW( LOCALE_ENUMPROCW lpfnLocaleEnum, DWORD dwFlags ) { TRACE("(%p,%08lx)\n", lpfnLocaleEnum, dwFlags); - EnumResourceLanguagesW( GetModuleHandleW(kernel32W), (LPWSTR)RT_STRING, + EnumResourceLanguagesW( kernel32_handle, (LPWSTR)RT_STRING, (LPCWSTR)LOCALE_ILANGUAGE, enum_lang_proc_w, (LONG)lpfnLocaleEnum); return TRUE; @@ -2548,7 +2543,6 @@ static BOOL NLS_RegGetDword(HKEY hKey, LPCWSTR szValueName, DWORD *lpVal) static BOOL NLS_GetLanguageGroupName(LGRPID lgrpid, LPWSTR szName, ULONG nameSize) { - HMODULE hModule = GetModuleHandleW(kernel32W); LANGID langId; LPCWSTR szResourceName = (LPCWSTR)(((lgrpid + 0x2000) >> 4) + 1); HRSRC hResource; @@ -2560,11 +2554,11 @@ static BOOL NLS_GetLanguageGroupName(LGRPID lgrpid, LPWSTR szName, ULONG nameSiz if (SUBLANGID(langId) == SUBLANG_NEUTRAL) langId = MAKELANGID( PRIMARYLANGID(langId), SUBLANG_DEFAULT ); - hResource = FindResourceExW( hModule, (LPWSTR)RT_STRING, szResourceName, langId ); + hResource = FindResourceExW( kernel32_handle, (LPWSTR)RT_STRING, szResourceName, langId ); if (hResource) { - HGLOBAL hResDir = LoadResource( hModule, hResource ); + HGLOBAL hResDir = LoadResource( kernel32_handle, hResource ); if (hResDir) { diff --git a/dlls/kernel/ne_segment.c b/dlls/kernel/ne_segment.c index cd445dfbb50..aae639b70e4 100644 --- a/dlls/kernel/ne_segment.c +++ b/dlls/kernel/ne_segment.c @@ -41,6 +41,7 @@ #include "module.h" #include "stackframe.h" #include "builtin16.h" +#include "toolhelp.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(fixup); diff --git a/dlls/kernel/process.c b/dlls/kernel/process.c index ce569f57ca2..c4ac1ea9f99 100644 --- a/dlls/kernel/process.c +++ b/dlls/kernel/process.c @@ -64,6 +64,7 @@ static BOOL oem_file_apis; static unsigned int server_startticks; int main_create_flags = 0; +HMODULE kernel32_handle = 0; /* Process flags */ #define PDB32_DEBUGGED 0x0001 /* Process is being debugged */ @@ -613,6 +614,7 @@ static RTL_USER_PROCESS_PARAMETERS *init_user_process_params( size_t info_size ) */ static BOOL process_init( char *argv[], char **environ ) { + static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2',0}; BOOL ret; size_t info_size = 0; RTL_USER_PROCESS_PARAMETERS *params; @@ -698,6 +700,8 @@ static BOOL process_init( char *argv[], char **environ ) params->hStdError = hstderr; } + kernel32_handle = GetModuleHandleW(kernel32W); + LOCALE_Init(); /* Copy the parent environment */ diff --git a/dlls/kernel/thunk.c b/dlls/kernel/thunk.c index 9480a25f7c2..2999bae5661 100644 --- a/dlls/kernel/thunk.c +++ b/dlls/kernel/thunk.c @@ -127,7 +127,7 @@ static void _write_ftprolog(LPBYTE relayCode ,DWORD *targetTable) { *x++ = 0x0f;*x++=0xb6;*x++=0xd1; /* movzbl edx,cl */ *x++ = 0x8B;*x++=0x14;*x++=0x95;*(DWORD**)x= targetTable; x+=4; /* mov edx, [4*edx + targetTable] */ - *x++ = 0x68; *(DWORD*)x = (DWORD)GetProcAddress(GetModuleHandleA("KERNEL32"),"FT_Prolog"); + *x++ = 0x68; *(DWORD*)x = (DWORD)GetProcAddress(kernel32_handle,"FT_Prolog"); x+=4; /* push FT_Prolog */ *x++ = 0xC3; /* lret */ /* fill rest with 0xCC / int 3 */ @@ -154,7 +154,7 @@ static void _write_qtthunk( *x++ = 0x8A;*x++=0x4D;*x++=0xFC; /* movb cl,[ebp-04] */ *x++ = 0x8B;*x++=0x14;*x++=0x8D;*(DWORD**)x= targetTable; x+=4; /* mov edx, [4*ecx + targetTable */ - *x++ = 0xB8; *(DWORD*)x = (DWORD)GetProcAddress(GetModuleHandleA("KERNEL32"),"QT_Thunk"); + *x++ = 0xB8; *(DWORD*)x = (DWORD)GetProcAddress(kernel32_handle,"QT_Thunk"); x+=4; /* mov eax , QT_Thunk */ *x++ = 0xFF; *x++ = 0xE0; /* jmp eax */ /* should fill the rest of the 32 bytes with 0xCC */ @@ -817,13 +817,12 @@ LPVOID WINAPI ThunkInitLSF( LPCSTR dll16, /* [in] name of win16 dll */ LPCSTR dll32 /* [in] name of win32 dll */ ) { - HMODULE hkrnl32 = GetModuleHandleA("KERNEL32"); LPDWORD addr,addr2; /* FIXME: add checks for valid code ... */ /* write pointers to kernel32.89 and kernel32.90 (+ordinal base of 1) */ - *(DWORD*)(thunk+0x35) = (DWORD)GetProcAddress(hkrnl32,(LPSTR)90); - *(DWORD*)(thunk+0x6D) = (DWORD)GetProcAddress(hkrnl32,(LPSTR)89); + *(DWORD*)(thunk+0x35) = (DWORD)GetProcAddress(kernel32_handle,(LPSTR)90); + *(DWORD*)(thunk+0x6D) = (DWORD)GetProcAddress(kernel32_handle,(LPSTR)89); if (!(addr = _loadthunk( dll16, thkbuf, dll32, NULL, len ))) @@ -1973,7 +1972,7 @@ SEGPTR WINAPI Get16DLLAddress(HMODULE16 handle, LPSTR func_name) /* jmpl QT_Thunk */ *thunk++ = 0xea; - *(FARPROC *)thunk = GetProcAddress(GetModuleHandleA("KERNEL32"),"QT_Thunk"); + *(FARPROC *)thunk = GetProcAddress(kernel32_handle,"QT_Thunk"); thunk += sizeof(FARPROC16); *(WORD *)thunk = wine_get_cs(); diff --git a/dlls/kernel/toolhelp.h b/dlls/kernel/toolhelp.h index b241d29c4dd..fb7d6584d75 100644 --- a/dlls/kernel/toolhelp.h +++ b/dlls/kernel/toolhelp.h @@ -103,6 +103,13 @@ BOOL16 WINAPI GlobalEntryHandle16( GLOBALENTRY *pGlobal, HGLOBAL16 hItem ); BOOL16 WINAPI GlobalEntryModule16( GLOBALENTRY *pGlobal, HMODULE16 hModule, WORD wSeg ); +/* FIXME: Wine internal functions */ +extern HGLOBAL16 GLOBAL_CreateBlock( UINT16 flags, const void *ptr, DWORD size, + HGLOBAL16 hOwner, unsigned char selflags ); +extern BOOL16 GLOBAL_FreeBlock( HGLOBAL16 handle ); +extern BOOL16 GLOBAL_MoveBlock( HGLOBAL16 handle, const void *ptr, DWORD size ); +extern HGLOBAL16 GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL16 hOwner, unsigned char selflags ); + /* Local heap */ typedef struct