wow64: Load the backend cpu dll at process init.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2021-07-22 13:33:57 +02:00
parent c516826184
commit 42dec97d1a
2 changed files with 101 additions and 1 deletions

View File

@ -27,10 +27,14 @@
#include "winnt.h"
#include "winternl.h"
#include "wine/exception.h"
#include "wow64_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(wow);
USHORT native_machine = 0;
USHORT current_machine = 0;
void *dummy = RtlUnwind;
BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved )
@ -54,6 +58,55 @@ void __cdecl __wine_spec_unimplemented_stub( const char *module, const char *fun
}
/**********************************************************************
* load_cpu_dll
*/
static HMODULE load_cpu_dll(void)
{
NTSTATUS status;
HMODULE module;
UNICODE_STRING str;
WCHAR path[MAX_PATH];
const WCHAR *dir, *name;
switch (current_machine)
{
case IMAGE_FILE_MACHINE_I386:
name = (native_machine == IMAGE_FILE_MACHINE_ARM64 ? L"xtajit.dll" : L"wow64cpu.dll");
break;
case IMAGE_FILE_MACHINE_ARM:
name = L"wowarmhw.dll";
break;
default:
ERR( "unsupported machine %04x\n", current_machine );
RtlExitUserProcess( 1 );
}
dir = get_machine_wow64_dir( IMAGE_FILE_MACHINE_TARGET_HOST );
swprintf( path, MAX_PATH, L"%s\\%s", dir, name );
RtlInitUnicodeString( &str, path );
if ((status = LdrLoadDll( NULL, 0, &str, &module )))
{
ERR( "failed to load CPU dll %x\n", status );
NtTerminateProcess( GetCurrentProcess(), status );
}
return module;
}
/**********************************************************************
* process_init
*/
static void process_init(void)
{
RtlWow64GetProcessMachines( GetCurrentProcess(), &current_machine, &native_machine );
if (!current_machine) current_machine = native_machine;
load_cpu_dll();
}
/**********************************************************************
* Wow64SystemServiceEx (NTDLL.@)
*/
@ -69,5 +122,11 @@ NTSTATUS WINAPI Wow64SystemServiceEx( UINT num, UINT *args )
*/
void WINAPI Wow64LdrpInitialize( CONTEXT *context )
{
FIXME( "stub\n" );
static BOOL init_done;
if (!init_done)
{
init_done = TRUE;
process_init();
}
}

View File

@ -0,0 +1,41 @@
/*
* WoW64 private definitions
*
* Copyright 2021 Alexandre Julliard
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __WOW64_PRIVATE_H
#define __WOW64_PRIVATE_H
extern USHORT native_machine DECLSPEC_HIDDEN;
extern USHORT current_machine DECLSPEC_HIDDEN;
/* cf. GetSystemWow64Directory2 */
static inline const WCHAR *get_machine_wow64_dir( USHORT machine )
{
switch (machine)
{
case IMAGE_FILE_MACHINE_TARGET_HOST: return L"\\??\\C:\\windows\\system32";
case IMAGE_FILE_MACHINE_I386: return L"\\??\\C:\\windows\\syswow64";
case IMAGE_FILE_MACHINE_ARMNT: return L"\\??\\C:\\windows\\sysarm32";
case IMAGE_FILE_MACHINE_AMD64: return L"\\??\\C:\\windows\\sysx8664";
case IMAGE_FILE_MACHINE_ARM64: return L"\\??\\C:\\windows\\sysarm64";
default: return NULL;
}
}
#endif /* __WOW64_PRIVATE_H */