* autoload.cc (GetNativeSystemInfo): Add.

(IsWow64Process): Add.
	* init.cc (respawn_wow64_process): New function.
	(dll_entry): If process has been started from a 64 bit
	process, call respawn_wow64_process.
	* uname.cc (uname): On 64 bit systems, use GetNativeSystemInfo.
	Show actual CPU type.
This commit is contained in:
Corinna Vinschen
2004-07-24 09:41:34 +00:00
parent 61e6420f32
commit 65c5aa77fb
5 changed files with 54 additions and 2 deletions

View File

@@ -87,14 +87,41 @@ munge_threadfunc ()
}
}
static void __attribute__ ((noreturn))
respawn_wow64_process ()
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
GetStartupInfo (&si);
if (!CreateProcessA (NULL, GetCommandLineA (), NULL, NULL, TRUE,
CREATE_DEFAULT_ERROR_MODE
| GetPriorityClass (GetCurrentProcess ()),
NULL, NULL, &si, &pi))
api_fatal ("Failed to create process <%s>: %E", GetCommandLineA ());
CloseHandle (pi.hThread);
if (WaitForSingleObject (pi.hProcess, INFINITE) == WAIT_FAILED)
api_fatal ("Waiting for process %d failed: %E", pi.dwProcessId);
CloseHandle (pi.hProcess);
ExitProcess (0);
}
extern void __stdcall dll_crt0_0 ();
extern "C" int WINAPI
dll_entry (HANDLE h, DWORD reason, void *static_load)
{
BOOL is_64bit_machine = FALSE;
switch (reason)
{
case DLL_PROCESS_ATTACH:
/* Is the stack at an unusual high address? Check if we're running on
a 64 bit machine. If so, respawn. */
if (&is_64bit_machine >= (PBOOL) 0x400000
&& IsWow64Process (hMainProc, &is_64bit_machine)
&& is_64bit_machine)
respawn_wow64_process ();
prime_threads ();
dynamically_loaded = (static_load == NULL);
dll_crt0_0 ();