From 66e0d7d6d1a32350f378ccacf106a71e04341d53 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Sat, 5 Apr 2003 09:03:02 +0000 Subject: [PATCH] kernel level HLE --- Doc/Changelog.txt | 16 +-- Include/Win32/CxbxKrnl/xntdll.h | 118 +++++++++++++++++----- Include/Win32/InputConfig.h | 7 +- Source/Win32/Cxbx/DlgControllerConfig.cpp | 40 +++++--- Source/Win32/CxbxKrnl/EmuFS.cpp | 10 +- Source/Win32/CxbxKrnl/EmuKrnl.cpp | 110 +++++++++++--------- Source/Win32/CxbxKrnl/EmuXapi.cpp | 7 +- Source/Win32/CxbxKrnl/KernelThunk.cpp | 2 +- Source/Win32/CxbxKrnl/Xapi.1.0.3911.inl | 10 +- Source/Win32/CxbxKrnl/Xapi.1.0.4034.inl | 32 +++--- Source/Win32/CxbxKrnl/Xapi.1.0.4361.inl | 48 +++------ Source/Win32/CxbxKrnl/Xapi.1.0.4627.inl | 15 ++- Source/Win32/EmuShared.cpp | 94 +++++++---------- Source/Win32/InputConfig.cpp | 2 +- 14 files changed, 296 insertions(+), 215 deletions(-) diff --git a/Doc/Changelog.txt b/Doc/Changelog.txt index 32fe9bb55..1ca86a1df 100644 --- a/Doc/Changelog.txt +++ b/Doc/Changelog.txt @@ -5,19 +5,23 @@ version: 0.7.0 (??/??/??) - Added Controller Input and Configuration! +- __declspec(thread) style TLS is working!! + - Added Recent Xbe/Exe file menus -- Fixed GUI color issues +- Massive code re-organization. + +- Lots of random optimizations + +- Went lower level with certain components of + emulation. This should allow progress to move + faster, ironically. - Some Xbe parsing and debug output fixes. You should now be able to deal with the slightly odd Linux Xbe files. -- __declspec(thread) style TLS is working!! - -- Massive code re-organization. - -- Lots of random optimizations +- Fixed GUI color issues version: 0.6.0-pre12 (02/23/03) -------------------------------- diff --git a/Include/Win32/CxbxKrnl/xntdll.h b/Include/Win32/CxbxKrnl/xntdll.h index c0e875e12..60561aed0 100644 --- a/Include/Win32/CxbxKrnl/xntdll.h +++ b/Include/Win32/CxbxKrnl/xntdll.h @@ -211,34 +211,18 @@ typedef struct _STRING STRING, ANSI_STRING, *PSTRING, *PANSI_STRING; // ****************************************************************** -// * KeDelayExecutionThread +// * RTL_CRITICAL_SECTION // ****************************************************************** -NTSYSAPI NTSTATUS NTAPI KeDelayExecutionThread -( - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Interval -); - -// ****************************************************************** -// * NtSetLdtEntries -// ****************************************************************** -NTSYSAPI NTSTATUS NTAPI NtSetLdtEntries -( - IN USHORT Selector1, - IN LDT_ENTRY Descriptor1, - IN USHORT Selector2, - IN LDT_ENTRY Descriptor2 -); - -// ****************************************************************** -// * 0x0121 - RtlInitAnsiString -// ****************************************************************** -typedef VOID (NTAPI *FPTR_RtlInitAnsiString) -( - IN OUT PANSI_STRING DestinationString, - IN PCSZ SourceString -); +typedef struct _RTL_CRITICAL_SECTION +{ + DWORD Unknown[4]; // 0x00 + LONG LockCount; // 0x10 + LONG RecursionCount; // 0x14 + HANDLE OwningThread; // 0x18 + HANDLE LockSemaphore; + DWORD Reserved; +} +RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; // ****************************************************************** // * Valid values for the Attributes field @@ -336,6 +320,86 @@ NTSYSAPI NTSTATUS NTAPI ZwOpenFile IN ULONG OpenOptions ); +// ****************************************************************** +// * KeDelayExecutionThread +// ****************************************************************** +NTSYSAPI NTSTATUS NTAPI KeDelayExecutionThread +( + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Interval +); + +// ****************************************************************** +// * NtSetLdtEntries +// ****************************************************************** +NTSYSAPI NTSTATUS NTAPI NtSetLdtEntries +( + IN USHORT Selector1, + IN LDT_ENTRY Descriptor1, + IN USHORT Selector2, + IN LDT_ENTRY Descriptor2 +); + +// ****************************************************************** +// * RtlNtStatusToDosError +// ****************************************************************** +typedef ULONG (NTAPI *FPTR_RtlNtStatusToDosError)(NTSTATUS Status); + +// ****************************************************************** +// * RtlInitAnsiString +// ****************************************************************** +typedef VOID (NTAPI *FPTR_RtlInitAnsiString) +( + IN OUT PANSI_STRING DestinationString, + IN PCSZ SourceString +); + +// ****************************************************************** +// * NtAllocateVirtualMemory +// ****************************************************************** +typedef NTSTATUS (NTAPI *FPTR_NtAllocateVirtualMemory) +( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG RegionSize, + IN ULONG AllocationType, + IN ULONG Protect +); + +// ****************************************************************** +// * NtClose +// ****************************************************************** +typedef NTSTATUS (NTAPI *FPTR_NtClose) +( + IN HANDLE Handle +); + +// ****************************************************************** +// * RtlInitializeCriticalSection +// ****************************************************************** +typedef VOID (NTAPI *FPTR_RtlInitializeCriticalSection) +( + IN PRTL_CRITICAL_SECTION CriticalSection +); + +// ****************************************************************** +// * RtlEnterCriticalSection +// ****************************************************************** +typedef VOID (NTAPI *FPTR_RtlEnterCriticalSection) +( + IN PRTL_CRITICAL_SECTION CriticalSection +); + +// ****************************************************************** +// * RtlLeaveCriticalSection +// ****************************************************************** +typedef VOID (NTAPI *FPTR_RtlLeaveCriticalSection) +( + IN PRTL_CRITICAL_SECTION CriticalSection +); + #if defined(__cplusplus) } #endif diff --git a/Include/Win32/InputConfig.h b/Include/Win32/InputConfig.h index e4e97283f..988178612 100644 --- a/Include/Win32/InputConfig.h +++ b/Include/Win32/InputConfig.h @@ -34,6 +34,8 @@ #ifndef INPUTCONFIG_H #define INPUTCONFIG_H +#include + // ****************************************************************** // * Input Device Component IDs // ****************************************************************** @@ -125,9 +127,10 @@ class InputConfig void Get(InputDeviceComponent idc, int *dwDevice, int *dwInfo, int *dwFlags); // ****************************************************************** - // * To enumerate device names + // * To enumerate and set device names // ****************************************************************** const char *GetDeviceName(int offset) { return (const char*)m_DeviceName[offset]; } + void SetDeviceName(int offset, const char *device_name) { strncpy(m_DeviceName[offset], device_name, 259); } private: // ****************************************************************** @@ -138,7 +141,7 @@ class InputConfig // ****************************************************************** // * Devices used by one or more input mappings // ****************************************************************** - char m_DeviceName[260][MAX_INPUT_DEVICES]; + char m_DeviceName[MAX_INPUT_DEVICES][260]; // ****************************************************************** // * Input Device Components diff --git a/Source/Win32/Cxbx/DlgControllerConfig.cpp b/Source/Win32/Cxbx/DlgControllerConfig.cpp index d691940d7..340e51559 100644 --- a/Source/Win32/Cxbx/DlgControllerConfig.cpp +++ b/Source/Win32/Cxbx/DlgControllerConfig.cpp @@ -371,6 +371,8 @@ void ConfigureInput(HWND hWndDlg, HWND hWndButton, InputDeviceComponent idc) int b=0; + dwFlags = INPUT_MAPPING_JOYSTICK; + if(abs(InputState.lX) > JOYSTICK_DETECT_SENSITIVITY) { dwHow = FIELD_OFFSET(DIJOYSTATE, lX); @@ -425,7 +427,7 @@ void ConfigureInput(HWND hWndDlg, HWND hWndButton, InputDeviceComponent idc) g_InputConfig.Map(idc, DeviceInstance.tszInstanceName, ObjectInstance.dwType, dwFlags); - printf("Cxbx: Detected %s on %s (dwType : %.08X)\n", ObjectInstance.tszName, DeviceInstance.tszInstanceName, ObjectInstance.dwType); + printf("Cxbx: Detected %s on %s\n", ObjectInstance.tszName, DeviceInstance.tszInstanceName, ObjectInstance.dwType); sprintf(szNewText, "%s Successfully Mapped To %s On %s!", szOrgText, ObjectInstance.tszName, DeviceInstance.tszInstanceName); } @@ -439,6 +441,8 @@ void ConfigureInput(HWND hWndDlg, HWND hWndButton, InputDeviceComponent idc) g_pInputDev[v]->GetDeviceState(256, InputState); + dwFlags = INPUT_MAPPING_KEYBOARD; + for(int v=0;v<256;v++) { if(InputState[v] != 0) @@ -466,13 +470,15 @@ void ConfigureInput(HWND hWndDlg, HWND hWndButton, InputDeviceComponent idc) g_pInputDev[v]->GetDeviceState(sizeof(DIMOUSESTATE2), &InputState); + dwFlags = INPUT_MAPPING_MOUSE; + // detect button changes for(int b=0;b<8;b++) { if(InputState.rgbButtons[b] & 0x80) { dwHow = b; - dwFlags &= INPUT_MAPPING_MOUSE_CLICK; + dwFlags |= INPUT_MAPPING_MOUSE_CLICK; break; } } @@ -492,7 +498,7 @@ void ConfigureInput(HWND hWndDlg, HWND hWndButton, InputDeviceComponent idc) LONG delta_lX=0, delta_lY=0, delta_lZ=0; LONG absd_lX=0, absd_lY=0, absd_lZ=0; - if(InputState.lX == -1 || InputState.lY == -1 || InputState.lZ == -1) + if(LastMouse_lY == -1 || LastMouse_lY == -1 || LastMouse_lZ == -1) delta_lX = delta_lY = delta_lZ = 0; else { @@ -509,37 +515,43 @@ void ConfigureInput(HWND hWndDlg, HWND hWndButton, InputDeviceComponent idc) max = (max > absd_lZ) ? max : absd_lZ; + LastMouse_lX = InputState.lX; + LastMouse_lY = InputState.lY; + LastMouse_lZ = InputState.lZ; + if(max > MOUSE_DETECT_SENSITIVITY) { if(max == absd_lX && absd_lX > MOUSE_DETECT_SENSITIVITY) { - dwHow = FIELD_OFFSET(DIMOUSESTATE2, lX); + dwHow = DIMOFS_X; dwFlags |= (delta_lX > 0) ? INPUT_MAPPING_AXIS_POSITIVE : INPUT_MAPPING_AXIS_NEGATIVE; } else if(max == absd_lY && absd_lY > MOUSE_DETECT_SENSITIVITY) { - dwHow = FIELD_OFFSET(DIMOUSESTATE2, lY); + dwHow = DIMOFS_Y; dwFlags |= (delta_lY > 0) ? INPUT_MAPPING_AXIS_POSITIVE : INPUT_MAPPING_AXIS_NEGATIVE; } else if(max == absd_lZ && absd_lZ > MOUSE_DETECT_SENSITIVITY) { - dwHow = FIELD_OFFSET(DIMOUSESTATE2, lZ); + dwHow = DIMOFS_Z; dwFlags |= (delta_lZ > 0) ? INPUT_MAPPING_AXIS_POSITIVE : INPUT_MAPPING_AXIS_NEGATIVE; } - LastMouse_lX = InputState.lX; - LastMouse_lY = InputState.lY; - LastMouse_lZ = InputState.lZ; - if(dwHow != -1) { - g_pInputDev[v]->GetObjectInfo(&ObjectInstance, dwHow, DIPH_BYOFFSET); - g_InputConfig.Map(idc, "SysMouse", dwHow, dwFlags); - printf("Cxbx: Detected Movement on the %s %s on SysMouse\n", (dwFlags & INPUT_MAPPING_AXIS_POSITIVE) ? "Positive" : "Negative", ObjectInstance.tszName); + ObjectInstance.dwSize = sizeof(ObjectInstance); - sprintf(szNewText, "%s Successfully Mapped To %s %s On %s!", szOrgText, (dwFlags & INPUT_MAPPING_AXIS_POSITIVE) ? "Positive" : "Negative", ObjectInstance.tszName, "SysMouse"); + char *szDirection = (dwFlags & INPUT_MAPPING_AXIS_POSITIVE) ? "Positive" : "Negative"; + char *szObjName = "Unknown"; + + if(g_pInputDev[v]->GetObjectInfo(&ObjectInstance, dwHow, DIPH_BYOFFSET) == DI_OK) + szObjName = ObjectInstance.tszName; + + printf("Cxbx: Detected Movement on the %s %s on SysMouse\n", szDirection, szObjName); + + sprintf(szNewText, "%s Successfully Mapped To %s %s On %s!", szOrgText, szDirection, szObjName, "SysMouse"); } } } diff --git a/Source/Win32/CxbxKrnl/EmuFS.cpp b/Source/Win32/CxbxKrnl/EmuFS.cpp index 5b08f9fbe..423acbbcc 100644 --- a/Source/Win32/CxbxKrnl/EmuFS.cpp +++ b/Source/Win32/CxbxKrnl/EmuFS.cpp @@ -123,6 +123,8 @@ void EmuGenerateFS() // HACK: This converts from XBE stack form to Windows form (I guess?!) TLSPtr = (void*)((uint32)TLSPtr+20 + (2*8)); + + NewPcr->PrcbData.CurrentThread->TlsData = TLSPtr; } // ****************************************************************** @@ -142,10 +144,12 @@ void EmuGenerateFS() // ****************************************************************** // * Save "TLSPtr" inside NewFS.StackBase // ****************************************************************** - __asm { - mov eax, TLSPtr - mov fs:[0x04], eax + __asm + { + mov eax, TLSPtr + mov fs:[0x04], eax + } } // ****************************************************************** diff --git a/Source/Win32/CxbxKrnl/EmuKrnl.cpp b/Source/Win32/CxbxKrnl/EmuKrnl.cpp index 87f2b0087..ea2046f3b 100644 --- a/Source/Win32/CxbxKrnl/EmuKrnl.cpp +++ b/Source/Win32/CxbxKrnl/EmuKrnl.cpp @@ -58,36 +58,43 @@ namespace xntdll // ****************************************************************** // * Loaded at run-time to avoid linker conflicts // ****************************************************************** -xntdll::FPTR_RtlInitAnsiString NT_RtlInitAnsiString = (xntdll::FPTR_RtlInitAnsiString)GetProcAddress(GetModuleHandle("ntdll"), "RtlInitAnsiString"); +HMODULE hNtDll = GetModuleHandle("ntdll"); +xntdll::FPTR_RtlInitAnsiString NT_RtlInitAnsiString = (xntdll::FPTR_RtlInitAnsiString)GetProcAddress(hNtDll, "RtlInitAnsiString"); +xntdll::FPTR_RtlNtStatusToDosError NT_RtlNtStatusToDosError = (xntdll::FPTR_RtlNtStatusToDosError)GetProcAddress(hNtDll, "RtlNtStatusToDosError"); +xntdll::FPTR_NtAllocateVirtualMemory NT_NtAllocateVirtualMemory = (xntdll::FPTR_NtAllocateVirtualMemory)GetProcAddress(hNtDll, "NtAllocateVirtualMemory"); +xntdll::FPTR_NtClose NT_NtClose = (xntdll::FPTR_NtClose)GetProcAddress(hNtDll, "NtClose"); +xntdll::FPTR_RtlInitializeCriticalSection NT_RtlInitializeCriticalSection = (xntdll::FPTR_RtlInitializeCriticalSection)GetProcAddress(hNtDll, "RtlInitializeCriticalSection"); +xntdll::FPTR_RtlEnterCriticalSection NT_RtlEnterCriticalSection = (xntdll::FPTR_RtlEnterCriticalSection)GetProcAddress(hNtDll, "RtlEnterCriticalSection"); +xntdll::FPTR_RtlLeaveCriticalSection NT_RtlLeaveCriticalSection = (xntdll::FPTR_RtlLeaveCriticalSection)GetProcAddress(hNtDll, "RtlLeaveCriticalSection"); // ****************************************************************** -// * (HELPER) PsCreateSystemThreadExProxyParam +// * (Helper) PCSTProxyParam // ****************************************************************** -typedef struct _PsCreateSystemThreadExProxyParam +typedef struct _PCSTProxyParam { IN PVOID StartContext1; IN PVOID StartContext2; IN PVOID StartRoutine; } -PsCreateSystemThreadExProxyParam; +PCSTProxyParam; // ****************************************************************** -// * PsCreateSystemThreadExProxy +// * (Helper) PCSTProxy // ****************************************************************** #pragma warning(push) #pragma warning(disable: 4731) // disable ebp modification warning -DWORD WINAPI PsCreateSystemThreadExProxy +DWORD WINAPI PCSTProxy ( IN PVOID Parameter ) { - PsCreateSystemThreadExProxyParam *iPsCreateSystemThreadExProxyParam = (PsCreateSystemThreadExProxyParam*)Parameter; + PCSTProxyParam *iPCSTProxyParam = (PCSTProxyParam*)Parameter; - uint32 StartContext1 = (uint32)iPsCreateSystemThreadExProxyParam->StartContext1; - uint32 StartContext2 = (uint32)iPsCreateSystemThreadExProxyParam->StartContext2; - uint32 StartRoutine = (uint32)iPsCreateSystemThreadExProxyParam->StartRoutine; + uint32 StartContext1 = (uint32)iPCSTProxyParam->StartContext1; + uint32 StartContext2 = (uint32)iPCSTProxyParam->StartContext2; + uint32 StartRoutine = (uint32)iPCSTProxyParam->StartRoutine; - delete iPsCreateSystemThreadExProxyParam; + delete iPCSTProxyParam; EmuGenerateFS(); @@ -96,7 +103,7 @@ DWORD WINAPI PsCreateSystemThreadExProxy // ****************************************************************** #ifdef _DEBUG_TRACE { - printf("EmuKrnl (0x%.08X): PsCreateSystemThreadExProxy\n" + printf("EmuKrnl (0x%.08X): PCSTProxy\n" "(\n" " StartContext1 : 0x%.08X\n" " StartContext2 : 0x%.08X\n" @@ -108,6 +115,9 @@ DWORD WINAPI PsCreateSystemThreadExProxy EmuSwapFS(); // Xbox FS + // ****************************************************************** + // * use the special calling convention + // ****************************************************************** __asm { mov esi, StartRoutine @@ -122,8 +132,6 @@ callComplete: nop } - // EmuSwapFS(); - return 0; } #pragma warning(pop) @@ -214,19 +222,10 @@ XBSYSAPI EXPORTNUM(49) VOID DECLSPEC_NORETURN xboxkrnl::HalReturnToFirmware } #endif - MessageBox(NULL, "HalReturnToFirmware()", "EmuKrnl", MB_OK); + MessageBox(NULL, "Warning: XBE is quitting (HalReturnToFirmware).\n\nThis process may not terminate elegantly.", "Cxbx", MB_OK); ExitProcess(0); - /* - ReturnFirmwareHalt = 0x0, - ReturnFirmwareReboot = 0x1, - ReturnFirmwareQuickReboot = 0x2, - ReturnFirmwareHard = 0x3, - ReturnFirmwareFatal = 0x4, - ReturnFirmwareAll = 0x5 - */ - EmuSwapFS(); // Xbox FS } @@ -375,9 +374,14 @@ XBSYSAPI EXPORTNUM(149) xboxkrnl::BOOLEAN NTAPI xboxkrnl::KeSetTimer EmuSwapFS(); // Xbox FS - return FALSE; + return TRUE; } +// ****************************************************************** +// * 0x00A4 - LaunchDataPage (actually a pointer) +// ****************************************************************** +XBSYSAPI EXPORTNUM(164) xboxkrnl::DWORD xboxkrnl::LaunchDataPage = 0; + // ****************************************************************** // * 0x00B8 - NtAllocateVirtualMemory // ****************************************************************** @@ -385,7 +389,7 @@ XBSYSAPI EXPORTNUM(184) NTSTATUS xboxkrnl::NtAllocateVirtualMemory ( IN OUT PVOID *BaseAddress, IN ULONG ZeroBits, - IN OUT SIZE_T AllocationSize, + IN OUT PULONG AllocationSize, IN DWORD AllocationType, IN DWORD Protect ) @@ -409,11 +413,11 @@ XBSYSAPI EXPORTNUM(184) NTSTATUS xboxkrnl::NtAllocateVirtualMemory } #endif - *BaseAddress = VirtualAlloc(*BaseAddress, AllocationSize, AllocationType, Protect); + NTSTATUS ret = NT_NtAllocateVirtualMemory(GetCurrentProcess(), BaseAddress, ZeroBits, AllocationSize, AllocationType, Protect); EmuSwapFS(); // Xbox FS - return STATUS_SUCCESS; + return ret; } // ****************************************************************** @@ -439,12 +443,11 @@ XBSYSAPI EXPORTNUM(187) NTSTATUS NTAPI xboxkrnl::NtClose } #endif - if(CloseHandle(Handle) != TRUE) - return STATUS_UNSUCCESSFUL; + NTSTATUS ret = NT_NtClose(Handle); EmuSwapFS(); // Xbox FS - return STATUS_SUCCESS; + return ret; } // ****************************************************************** @@ -565,19 +568,24 @@ XBSYSAPI EXPORTNUM(255) NTSTATUS NTAPI xboxkrnl::PsCreateSystemThreadEx } #endif - DWORD dwThreadId = NULL; + // ****************************************************************** + // * create thread, using our special proxy technique + // ****************************************************************** + { + DWORD dwThreadId; - // PsCreateSystemThreadExProxy is responsible for cleaning up this pointer - ::PsCreateSystemThreadExProxyParam *iPsCreateSystemThreadProxyParam = new ::PsCreateSystemThreadExProxyParam(); + // PCSTProxy is responsible for cleaning up this pointer + ::PCSTProxyParam *iPCSTProxyParam = new ::PCSTProxyParam(); - iPsCreateSystemThreadProxyParam->StartContext1 = StartContext1; - iPsCreateSystemThreadProxyParam->StartContext2 = StartContext2; - iPsCreateSystemThreadProxyParam->StartRoutine = StartRoutine; + iPCSTProxyParam->StartContext1 = StartContext1; + iPCSTProxyParam->StartContext2 = StartContext2; + iPCSTProxyParam->StartRoutine = StartRoutine; - *ThreadHandle = CreateThread(NULL, NULL, &PsCreateSystemThreadExProxy, iPsCreateSystemThreadProxyParam, NULL, &dwThreadId); + *ThreadHandle = CreateThread(NULL, NULL, &PCSTProxy, iPCSTProxyParam, NULL, &dwThreadId); - if(ThreadId != NULL) - *ThreadId = dwThreadId; + if(ThreadId != NULL) + *ThreadId = dwThreadId; + } EmuSwapFS(); // Xbox FS @@ -607,13 +615,14 @@ XBSYSAPI EXPORTNUM(277) VOID NTAPI xboxkrnl::RtlEnterCriticalSection } #endif - // We have to initialize this because the Xbox software doesn't seem - // to always do it. Redundant initializations seem to be ok :/ - InitializeCriticalSection((::PRTL_CRITICAL_SECTION)CriticalSection); + // This seems redundant, but xbox software doesn't always do it + NT_RtlInitializeCriticalSection((xntdll::_RTL_CRITICAL_SECTION*)CriticalSection); - EnterCriticalSection((::PRTL_CRITICAL_SECTION)CriticalSection); + NT_RtlEnterCriticalSection((xntdll::_RTL_CRITICAL_SECTION*)CriticalSection); EmuSwapFS(); // Xbox FS + + return; } // ****************************************************************** @@ -671,7 +680,7 @@ XBSYSAPI EXPORTNUM(291) VOID NTAPI xboxkrnl::RtlInitializeCriticalSection } #endif - InitializeCriticalSection((::PRTL_CRITICAL_SECTION)CriticalSection); + NT_RtlInitializeCriticalSection((xntdll::_RTL_CRITICAL_SECTION*)CriticalSection); EmuSwapFS(); // Xbox FS @@ -688,6 +697,9 @@ XBSYSAPI EXPORTNUM(294) VOID NTAPI xboxkrnl::RtlLeaveCriticalSection { EmuSwapFS(); // Win2k/XP FS + // Note: We need to execute this before debug output to avoid trouble + NT_RtlLeaveCriticalSection((xntdll::_RTL_CRITICAL_SECTION*)CriticalSection); + // ****************************************************************** // * debug trace // ****************************************************************** @@ -701,9 +713,9 @@ XBSYSAPI EXPORTNUM(294) VOID NTAPI xboxkrnl::RtlLeaveCriticalSection } #endif - LeaveCriticalSection((::PRTL_CRITICAL_SECTION)CriticalSection); - EmuSwapFS(); // Xbox FS + + return; } // ****************************************************************** @@ -729,7 +741,9 @@ XBSYSAPI EXPORTNUM(301) xboxkrnl::ULONG NTAPI xboxkrnl::RtlNtStatusToDosError } #endif + ULONG ret = NT_RtlNtStatusToDosError(Status); + EmuSwapFS(); // Xbox FS - return 0; + return ret; } \ No newline at end of file diff --git a/Source/Win32/CxbxKrnl/EmuXapi.cpp b/Source/Win32/CxbxKrnl/EmuXapi.cpp index fb16ed183..f6bb12eac 100644 --- a/Source/Win32/CxbxKrnl/EmuXapi.cpp +++ b/Source/Win32/CxbxKrnl/EmuXapi.cpp @@ -337,6 +337,8 @@ HANDLE WINAPI xapi::EmuCreateThread lpThreadId ); + printf("Returned : %d\n", RetHandle); + EmuSwapFS(); // XBox FS return RetHandle; @@ -418,8 +420,9 @@ VOID WINAPI xapi::EmuXapiBootDash(DWORD UnknownA, DWORD UnknownB, DWORD UnknownC } #endif - // TODO: Cleanly "Boot Dash" :-) - exit(0); + MessageBox(NULL, "Warning: XBE has done a bad bad thing.\n\nThis process may not terminate elegantly.", "Cxbx", MB_OK); + + ExitProcess(0); EmuSwapFS(); // XBox FS diff --git a/Source/Win32/CxbxKrnl/KernelThunk.cpp b/Source/Win32/CxbxKrnl/KernelThunk.cpp index 8ef8426de..5cbde0867 100644 --- a/Source/Win32/CxbxKrnl/KernelThunk.cpp +++ b/Source/Win32/CxbxKrnl/KernelThunk.cpp @@ -228,7 +228,7 @@ extern "C" CXBXKRNL_API uint32 KernelThunkTable[367] = (uint32)PANIC(0x00A1), // 0x00A1 (161) (uint32)PANIC(0x00A2), // 0x00A2 (162) (uint32)PANIC(0x00A3), // 0x00A3 (163) - (uint32)PANIC(0x00A4), // 0x00A4 (164) + (uint32)&xboxkrnl::LaunchDataPage, // 0x00A4 (164) (uint32)PANIC(0x00A5), // 0x00A5 (165) (uint32)PANIC(0x00A6), // 0x00A6 (166) (uint32)PANIC(0x00A7), // 0x00A7 (167) diff --git a/Source/Win32/CxbxKrnl/Xapi.1.0.3911.inl b/Source/Win32/CxbxKrnl/Xapi.1.0.3911.inl index 3a1d0b2f1..f8d38f76d 100644 --- a/Source/Win32/CxbxKrnl/Xapi.1.0.3911.inl +++ b/Source/Win32/CxbxKrnl/Xapi.1.0.3911.inl @@ -177,6 +177,7 @@ SOOVPA<9> __cinit_1_0_3911 = // ****************************************************************** OOVPATable XAPI_1_0_3911[] = { + /* Too High Level // CreateThread { (OOVPA*)&CreateThread_1_0_3911, @@ -187,6 +188,8 @@ OOVPATable XAPI_1_0_3911[] = "EmuCreateThread" #endif }, + */ + /* Too High Level // XapiInitProcess { (OOVPA*)&XapiInitProcess_1_0_3911, @@ -197,6 +200,7 @@ OOVPATable XAPI_1_0_3911[] = "EmuXapiInitProcess" #endif }, + */ // XapiBootToDash { (OOVPA*)&XapiBootDash_1_0_3911, @@ -207,6 +211,7 @@ OOVPATable XAPI_1_0_3911[] = "EmuXapiBootDash" #endif }, + /* Too High Level // __rtinit { (OOVPA*)&__rtinit_1_0_3911, @@ -216,7 +221,8 @@ OOVPATable XAPI_1_0_3911[] = #ifdef _DEBUG_TRACE "Emu__rtinit", #endif - }, + },*/ + /* Too High Level // __cinit { (OOVPA*)&__cinit_1_0_3911, @@ -226,7 +232,7 @@ OOVPATable XAPI_1_0_3911[] = #ifdef _DEBUG_TRACE "Emu__cinit", #endif - }, + },*/ }; // ****************************************************************** diff --git a/Source/Win32/CxbxKrnl/Xapi.1.0.4034.inl b/Source/Win32/CxbxKrnl/Xapi.1.0.4034.inl index b6dbed863..5ae3cd5d7 100644 --- a/Source/Win32/CxbxKrnl/Xapi.1.0.4034.inl +++ b/Source/Win32/CxbxKrnl/Xapi.1.0.4034.inl @@ -31,14 +31,14 @@ // * All rights reserved // * // ****************************************************************** -/* + // ****************************************************************** // * XInitDevices // ****************************************************************** -// * NOTE: We are actually intercepting USBD_Init, because XInitDevices -// * Simply redirects to that function +// * NOTE: We are actually intercepting USBD_Init, because +// * XInitDevices Simply redirects to that function // ****************************************************************** -SOOVPA<10> XInitDevices_1_0_4361 = +SOOVPA<10> XInitDevices_1_0_4034 = { 0, // Large == 0 10, // Count == 10 @@ -67,7 +67,7 @@ SOOVPA<10> XInitDevices_1_0_4361 = // ****************************************************************** // * XGetDevices // ****************************************************************** -SOOVPA<14> XGetDevices_1_0_4361 = +SOOVPA<14> XGetDevices_1_0_4034 = { 0, // Large == 0 14, // Count == 14 @@ -98,11 +98,11 @@ SOOVPA<14> XGetDevices_1_0_4361 = { 0x20, 0x04 }, // (Offset,Value)-Pair #14 } }; - +/* // ****************************************************************** // * XInputOpen // ****************************************************************** -SOOVPA<12> XInputOpen_1_0_4361 = +SOOVPA<12> XInputOpen_1_0_4034 = { 0, // Large == 0 12, // Count == 12 @@ -287,10 +287,9 @@ SOOVPA<7> XapiInitProcess_1_0_4361 = // ****************************************************************** OOVPATable XAPI_1_0_4034[] = { - /* // XInitDevices { - (OOVPA*)&XInitDevices_1_0_4361, + (OOVPA*)&XInitDevices_1_0_4034, xapi::EmuXInitDevices, @@ -300,7 +299,7 @@ OOVPATable XAPI_1_0_4034[] = }, // XGetDevices { - (OOVPA*)&XGetDevices_1_0_4361, + (OOVPA*)&XGetDevices_1_0_4034, xapi::EmuXGetDevices, @@ -308,9 +307,10 @@ OOVPATable XAPI_1_0_4034[] = "EmuXGetDevices" #endif }, +/* These functions havent been rev'd yet (may be same as new/old) // XInputOpen { - (OOVPA*)&XInputOpen_1_0_4361, + (OOVPA*)&XInputOpen_1_0_4034, xapi::EmuXInputOpen, @@ -339,6 +339,7 @@ OOVPATable XAPI_1_0_4034[] = #endif }, */ + /* Too High Level // CreateThread (* unchanged since 1.0.3911 *) { (OOVPA*)&CreateThread_1_0_3911, @@ -349,6 +350,7 @@ OOVPATable XAPI_1_0_4034[] = "EmuCreateThread" #endif }, + */ /* // CloseHandle (*???*) { @@ -361,6 +363,7 @@ OOVPATable XAPI_1_0_4034[] = #endif }, */ + /* Too High Level // XapiInitProcess (* unchanged since 1.0.3911 *) { (OOVPA*)&XapiInitProcess_1_0_3911, @@ -371,6 +374,7 @@ OOVPATable XAPI_1_0_4034[] = "EmuXapiInitProcess" #endif }, + */ // XapiBootToDash (* unchanged since 1.0.3911 *) { (OOVPA*)&XapiBootDash_1_0_3911, @@ -381,6 +385,7 @@ OOVPATable XAPI_1_0_4034[] = "EmuXapiBootDash" #endif }, + /* Too High Level // __rtinit (* unchanged since 1.0.3911 *) { (OOVPA*)&__rtinit_1_0_3911, @@ -390,7 +395,8 @@ OOVPATable XAPI_1_0_4034[] = #ifdef _DEBUG_TRACE "Emu__rtinit", #endif - }, + },*/ + /* Too High Level // __cinit (* unchanged since 1.0.3911 *) { (OOVPA*)&__cinit_1_0_3911, @@ -400,7 +406,7 @@ OOVPATable XAPI_1_0_4034[] = #ifdef _DEBUG_TRACE "Emu__cinit", #endif - }, + },*/ }; // ****************************************************************** diff --git a/Source/Win32/CxbxKrnl/Xapi.1.0.4361.inl b/Source/Win32/CxbxKrnl/Xapi.1.0.4361.inl index af205dfc1..e957eaaba 100644 --- a/Source/Win32/CxbxKrnl/Xapi.1.0.4361.inl +++ b/Source/Win32/CxbxKrnl/Xapi.1.0.4361.inl @@ -32,38 +32,6 @@ // * // ****************************************************************** -// ****************************************************************** -// * XInitDevices -// ****************************************************************** -// * NOTE: We are actually intercepting USBD_Init, because XInitDevices -// * Simply redirects to that function -// ****************************************************************** -SOOVPA<10> XInitDevices_1_0_4361 = -{ - 0, // Large == 0 - 10, // Count == 10 - - { - // XInitDevices+0x03 : push 0xB4 - { 0x03, 0x68 }, // (Offset,Value)-Pair #1 - { 0x04, 0xB4 }, // (Offset,Value)-Pair #2 - - // XInitDevices+0x10 : jmp +0x13 - { 0x10, 0x74 }, // (Offset,Value)-Pair #3 - { 0x11, 0x13 }, // (Offset,Value)-Pair #4 - - // XInitDevices+0x5B : movzx eax, byte ptr [esi+0xA1] - { 0x5B, 0x0F }, // (Offset,Value)-Pair #5 - { 0x5C, 0xB6 }, // (Offset,Value)-Pair #6 - { 0x5D, 0x86 }, // (Offset,Value)-Pair #7 - { 0x5E, 0xA1 }, // (Offset,Value)-Pair #8 - - // XInitDevices+0x8B : retn 8 - { 0x8B, 0xC2 }, // (Offset,Value)-Pair #9 - { 0x8C, 0x08 }, // (Offset,Value)-Pair #10 - } -}; - // ****************************************************************** // * XGetDevices // ****************************************************************** @@ -287,9 +255,9 @@ SOOVPA<7> XapiInitProcess_1_0_4361 = // ****************************************************************** OOVPATable XAPI_1_0_4361[] = { - // XInitDevices + // XInitDevices (* unchanged since 1.0.4034 *) { - (OOVPA*)&XInitDevices_1_0_4361, + (OOVPA*)&XInitDevices_1_0_4034, xapi::EmuXInitDevices, @@ -337,6 +305,7 @@ OOVPATable XAPI_1_0_4361[] = "EmuXInputGetState" #endif }, + /* Too High Level // CreateThread { (OOVPA*)&CreateThread_1_0_4361, @@ -347,6 +316,8 @@ OOVPATable XAPI_1_0_4361[] = "EmuCreateThread" #endif }, + */ + /* Too High Level // CloseHandle { (OOVPA*)&CloseHandle_1_0_4361, @@ -357,6 +328,8 @@ OOVPATable XAPI_1_0_4361[] = "EmuCloseHandle" #endif }, + */ + /* Too High Level // XapiInitProcess { (OOVPA*)&XapiInitProcess_1_0_4361, @@ -367,6 +340,7 @@ OOVPATable XAPI_1_0_4361[] = "EmuXapiInitProcess" #endif }, + */ // XapiBootToDash (* unchanged since 1.0.3911 *) { (OOVPA*)&XapiBootDash_1_0_3911, @@ -377,6 +351,7 @@ OOVPATable XAPI_1_0_4361[] = "EmuXapiBootDash" #endif }, + /* Too High Level // __rtinit (* unchanged since 1.0.3911 *) { (OOVPA*)&__rtinit_1_0_3911, @@ -386,7 +361,8 @@ OOVPATable XAPI_1_0_4361[] = #ifdef _DEBUG_TRACE "Emu__rtinit", #endif - }, + },*/ + /* Too High Level // __cinit (* unchanged since 1.0.3911 *) { (OOVPA*)&__cinit_1_0_3911, @@ -396,7 +372,7 @@ OOVPATable XAPI_1_0_4361[] = #ifdef _DEBUG_TRACE "Emu__cinit", #endif - }, + },*/ }; // ****************************************************************** diff --git a/Source/Win32/CxbxKrnl/Xapi.1.0.4627.inl b/Source/Win32/CxbxKrnl/Xapi.1.0.4627.inl index 294900fc4..2801f2694 100644 --- a/Source/Win32/CxbxKrnl/Xapi.1.0.4627.inl +++ b/Source/Win32/CxbxKrnl/Xapi.1.0.4627.inl @@ -37,9 +37,9 @@ // ****************************************************************** OOVPATable XAPI_1_0_4627[] = { - // XInitDevices (* unchanged since 1.0.4361 *) + // XInitDevices (* unchanged since 1.0.4034 *) { - (OOVPA*)&XInitDevices_1_0_4361, + (OOVPA*)&XInitDevices_1_0_4034, xapi::EmuXInitDevices, @@ -87,6 +87,7 @@ OOVPATable XAPI_1_0_4627[] = "EmuXInputGetState" #endif }, + /* Too High Level // CreateThread (* unchanged since 1.0.4361 *) { (OOVPA*)&CreateThread_1_0_4361, @@ -97,6 +98,8 @@ OOVPATable XAPI_1_0_4627[] = "EmuCreateThread" #endif }, + */ + /* Too High Level // CloseHandle (* unchanged since 1.0.4361 *) { (OOVPA*)&CloseHandle_1_0_4361, @@ -107,6 +110,8 @@ OOVPATable XAPI_1_0_4627[] = "EmuCloseHandle" #endif }, + */ + /* Too High Level // XapiInitProcess (* unchanged since 1.0.4361 *) { (OOVPA*)&XapiInitProcess_1_0_4361, @@ -117,6 +122,7 @@ OOVPATable XAPI_1_0_4627[] = "EmuXapiInitProcess" #endif }, + */ // XapiBootToDash (* unchanged since 1.0.3911 *) { (OOVPA*)&XapiBootDash_1_0_3911, @@ -127,6 +133,7 @@ OOVPATable XAPI_1_0_4627[] = "EmuXapiBootDash" #endif }, + /* Too High Level // __rtinit (* unchanged since 1.0.3911 *) { (OOVPA*)&__rtinit_1_0_3911, @@ -136,7 +143,8 @@ OOVPATable XAPI_1_0_4627[] = #ifdef _DEBUG_TRACE "Emu__rtinit", #endif - }, + },*/ + /* Too High Level // __cinit (* unchanged since 1.0.3911 *) { (OOVPA*)&__cinit_1_0_3911, @@ -147,6 +155,7 @@ OOVPATable XAPI_1_0_4627[] = "Emu__cinit", #endif }, + */ }; // ****************************************************************** diff --git a/Source/Win32/EmuShared.cpp b/Source/Win32/EmuShared.cpp index 6f72f59d6..bd6ef56c4 100644 --- a/Source/Win32/EmuShared.cpp +++ b/Source/Win32/EmuShared.cpp @@ -103,8 +103,8 @@ CXBXKRNL_API void EmuShared::Init() // ****************************************************************** if(init) { - g_EmuShared->LoadInputConfiguration(); g_EmuShared->InitInputConfiguration(); + g_EmuShared->LoadInputConfiguration(); } } @@ -157,66 +157,44 @@ CXBXKRNL_API void EmuShared::LoadInputConfiguration() // * Load configuration from registry // ****************************************************************** { - /* DWORD dwDisposition, dwType, dwSize; HKEY hKey; if(RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Cxbx\\Input", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { - for(int v=0;v