HLE (D3D)
This commit is contained in:
parent
d6a94e0654
commit
71085835de
|
@ -57,7 +57,7 @@ typedef signed long sint32;
|
|||
// ******************************************************************
|
||||
// * Define this to trace intercepted function calls
|
||||
// ******************************************************************
|
||||
//#define _DEBUG_TRACE
|
||||
#define _DEBUG_TRACE
|
||||
|
||||
// ******************************************************************
|
||||
// * func : RoundUp
|
||||
|
|
|
@ -65,7 +65,7 @@ extern "C"
|
|||
// ******************************************************************
|
||||
// * Basic types
|
||||
// ******************************************************************
|
||||
typedef char CHAR;
|
||||
typedef char CHAR, CCHAR;
|
||||
typedef short SHORT;
|
||||
typedef long LONG;
|
||||
typedef unsigned char UCHAR;
|
||||
|
@ -130,6 +130,32 @@ typedef unsigned __int64 ULONGLONG;
|
|||
#define IN
|
||||
#define OUT
|
||||
|
||||
// ******************************************************************
|
||||
// * KPROCESSOR_MODE
|
||||
// ******************************************************************
|
||||
typedef CCHAR KPROCESSOR_MODE;
|
||||
|
||||
// ******************************************************************
|
||||
// * MODE
|
||||
// ******************************************************************
|
||||
typedef enum _MODE
|
||||
{
|
||||
KernelMode,
|
||||
UserMode,
|
||||
MaximumMode
|
||||
}
|
||||
MODE;
|
||||
|
||||
// ******************************************************************
|
||||
// * LARGE_INTEGER
|
||||
// ******************************************************************
|
||||
typedef struct _LARGE_INTEGER
|
||||
{
|
||||
DWORD LowPart;
|
||||
LONG HighPart;
|
||||
}
|
||||
LARGE_INTEGER, *PLARGE_INTEGER;
|
||||
|
||||
// ******************************************************************
|
||||
// * LDT_ENTRY
|
||||
// ******************************************************************
|
||||
|
@ -169,6 +195,16 @@ typedef struct _LDT_ENTRY
|
|||
}
|
||||
LDT_ENTRY, *PLDT_ENTRY;
|
||||
|
||||
// ******************************************************************
|
||||
// * KeDelayExecutionThread
|
||||
// ******************************************************************
|
||||
NTSYSAPI NTSTATUS NTAPI KeDelayExecutionThread
|
||||
(
|
||||
IN KPROCESSOR_MODE WaitMode,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Interval
|
||||
);
|
||||
|
||||
// ******************************************************************
|
||||
// * NtSetLdtEntries
|
||||
// ******************************************************************
|
||||
|
@ -264,7 +300,7 @@ typedef struct _IO_STATUS_BLOCK
|
|||
IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
|
||||
|
||||
// ******************************************************************
|
||||
// * NtSetLdtEntries
|
||||
// * ZwOpenFile
|
||||
// ******************************************************************
|
||||
NTSYSAPI NTSTATUS NTAPI ZwOpenFile
|
||||
(
|
||||
|
|
|
@ -245,6 +245,10 @@ void EmuXInstallWrappers(OOVPATable *OovpaTable, uint32 OovpaTableSize, void (*E
|
|||
// ******************************************************************
|
||||
for(uint32 a=0;a<OovpaTableSize/sizeof(OOVPATable);a++)
|
||||
{
|
||||
#ifdef _DEBUG_TRACE
|
||||
printf("EmuXInstallWrappers: Searching for %s...", OovpaTable[a].szFuncName);
|
||||
#endif
|
||||
|
||||
OOVPA *Oovpa = OovpaTable[a].Oovpa;
|
||||
|
||||
uint32 count = Oovpa->Count;
|
||||
|
@ -287,13 +291,23 @@ void EmuXInstallWrappers(OOVPATable *OovpaTable, uint32 OovpaTableSize, void (*E
|
|||
if(v == count)
|
||||
{
|
||||
#ifdef _DEBUG_TRACE
|
||||
printf("EmuXInstallWrappers: 0x%.08X -> %s\n", cur, OovpaTable[a].szFuncName);
|
||||
printf("Found! (0x%.08X)\n", cur);
|
||||
#endif
|
||||
|
||||
EmuXInstallWrapper((void*)cur, OovpaTable[a].lpRedirect);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * not found
|
||||
// ******************************************************************
|
||||
if(cur == upper && v != count)
|
||||
{
|
||||
#ifdef _DEBUG_TRACE
|
||||
printf("None (OK)\n");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
// ******************************************************************
|
||||
|
@ -332,13 +346,23 @@ void EmuXInstallWrappers(OOVPATable *OovpaTable, uint32 OovpaTableSize, void (*E
|
|||
if(v == count)
|
||||
{
|
||||
#ifdef _DEBUG_TRACE
|
||||
printf("EmuXInstallWrappers: 0x%.08X -> %s\n", cur, OovpaTable[a].szFuncName);
|
||||
printf("Found! (0x%.08X)\n", cur);
|
||||
#endif
|
||||
|
||||
EmuXInstallWrapper((void*)cur, OovpaTable[a].lpRedirect);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * not found
|
||||
// ******************************************************************
|
||||
if(cur == upper && v != count)
|
||||
{
|
||||
#ifdef _DEBUG_TRACE
|
||||
printf("None (OK)\n");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ HWND g_EmuXWindow = NULL; // Rendering Window
|
|||
// * static
|
||||
// ******************************************************************
|
||||
static LRESULT WINAPI EmuXMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
static void EmuXProcessMessages(PVOID);
|
||||
static void EmuXRenderWindow(PVOID);
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuXInitD3D
|
||||
|
@ -64,7 +64,7 @@ VOID xboxkrnl::EmuXInitD3D()
|
|||
// * spark up a new thread to handle window message processing
|
||||
// ******************************************************************
|
||||
{
|
||||
_beginthread(EmuXProcessMessages, 0, NULL);
|
||||
_beginthread(EmuXRenderWindow, 0, NULL);
|
||||
|
||||
while(g_EmuXWindow == NULL)
|
||||
Sleep(10);
|
||||
|
@ -80,24 +80,9 @@ VOID xboxkrnl::EmuXInitD3D()
|
|||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuXMsgProc
|
||||
// * func: EmuXRenderWindow
|
||||
// ******************************************************************
|
||||
LRESULT WINAPI EmuXMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuXProcessMessages
|
||||
// ******************************************************************
|
||||
void EmuXProcessMessages(PVOID)
|
||||
void EmuXRenderWindow(PVOID)
|
||||
{
|
||||
// ******************************************************************
|
||||
// * register window class
|
||||
|
@ -109,7 +94,7 @@ void EmuXProcessMessages(PVOID)
|
|||
CS_CLASSDC,
|
||||
EmuXMsgProc,
|
||||
0, 0, GetModuleHandle(NULL),
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_APPWORKSPACE + 1), NULL,
|
||||
"CxbxRender",
|
||||
NULL
|
||||
};
|
||||
|
@ -155,6 +140,21 @@ void EmuXProcessMessages(PVOID)
|
|||
ExitProcess(0);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuXMsgProc
|
||||
// ******************************************************************
|
||||
LRESULT WINAPI EmuXMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * func: EmuXIDirect3D8_CreateDevice
|
||||
// ******************************************************************
|
||||
|
|
|
@ -93,7 +93,7 @@ DWORD WINAPI PsCreateSystemThreadExProxy
|
|||
}
|
||||
#endif
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
__asm
|
||||
{
|
||||
|
@ -173,7 +173,7 @@ XBSYSAPI EXPORTNUM(24) NTSTATUS NTAPI xboxkrnl::ExQueryNonVolatileSetting
|
|||
break;
|
||||
}
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -188,7 +188,23 @@ XBSYSAPI EXPORTNUM(49) VOID DECLSPEC_NORETURN xboxkrnl::HalReturnToFirmware
|
|||
{
|
||||
EmuXSwapFS(); // Win2k/XP FS
|
||||
|
||||
// ******************************************************************
|
||||
// * debug trace
|
||||
// ******************************************************************
|
||||
#ifdef _DEBUG_TRACE
|
||||
{
|
||||
printf("EmuXKrnl (0x%.08X): HalReturnToFirmware\n"
|
||||
"(\n"
|
||||
" Routine : 0x%.08X\n"
|
||||
");\n",
|
||||
GetCurrentThreadId(), Routine);
|
||||
}
|
||||
#endif
|
||||
|
||||
MessageBox(NULL, "HalReturnToFirmware()", "EmuXKrnl", MB_OK);
|
||||
|
||||
ExitProcess(0);
|
||||
|
||||
/*
|
||||
ReturnFirmwareHalt = 0x0,
|
||||
ReturnFirmwareReboot = 0x1,
|
||||
|
@ -198,9 +214,46 @@ XBSYSAPI EXPORTNUM(49) VOID DECLSPEC_NORETURN xboxkrnl::HalReturnToFirmware
|
|||
ReturnFirmwareAll = 0x5
|
||||
*/
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
}
|
||||
|
||||
exit(1);
|
||||
// ******************************************************************
|
||||
// * 0x0063 - KeDelayExecutionThread
|
||||
// ******************************************************************
|
||||
XBSYSAPI EXPORTNUM(99) NTSTATUS NTAPI xboxkrnl::KeDelayExecutionThread
|
||||
(
|
||||
IN KPROCESSOR_MODE WaitMode,
|
||||
IN BOOLEAN Alertable,
|
||||
IN PLARGE_INTEGER Interval
|
||||
)
|
||||
{
|
||||
EmuXSwapFS(); // Win2k/XP FS
|
||||
|
||||
// ******************************************************************
|
||||
// * debug trace
|
||||
// ******************************************************************
|
||||
#ifdef _DEBUG_TRACE
|
||||
{
|
||||
printf("EmuXKrnl (0x%.08X): KeDelayExecutionThread\n"
|
||||
"(\n"
|
||||
" WaitMode : 0x%.08X\n"
|
||||
" Alertable : 0x%.08X\n"
|
||||
" Interval : 0x%.08X\n"
|
||||
");\n",
|
||||
GetCurrentThreadId(), WaitMode, Alertable, Interval);
|
||||
printf("%.08X <-> %.08X\n", Interval->HighPart, Interval->LowPart);
|
||||
}
|
||||
#endif
|
||||
|
||||
// TODO: Worry about Interval.LargePart if necessary
|
||||
if((sint32)Interval->LowPart < 0)
|
||||
Sleep(-(sint32)Interval->LowPart/10000);
|
||||
else
|
||||
EmuXPanic();
|
||||
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
@ -235,7 +288,7 @@ XBSYSAPI EXPORTNUM(107) VOID NTAPI xboxkrnl::KeInitializeDpc
|
|||
Dpc->Type = DpcObject;
|
||||
Dpc->DeferredContext = DeferredContext;
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -276,7 +329,7 @@ XBSYSAPI EXPORTNUM(113) VOID NTAPI xboxkrnl::KeInitializeTimerEx
|
|||
Timer->DueTime.QuadPart = 0;
|
||||
Timer->Period = 0;
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -308,7 +361,7 @@ XBSYSAPI EXPORTNUM(149) xboxkrnl::BOOLEAN NTAPI xboxkrnl::KeSetTimer
|
|||
}
|
||||
#endif
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -346,7 +399,7 @@ XBSYSAPI EXPORTNUM(184) NTSTATUS xboxkrnl::NtAllocateVirtualMemory
|
|||
|
||||
*BaseAddress = VirtualAlloc(*BaseAddress, AllocationSize, AllocationType, Protect);
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -377,7 +430,7 @@ XBSYSAPI EXPORTNUM(187) NTSTATUS NTAPI xboxkrnl::NtClose
|
|||
if(CloseHandle(Handle) != TRUE)
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -416,7 +469,7 @@ XBSYSAPI EXPORTNUM(202) NTSTATUS xboxkrnl::NtOpenFile
|
|||
}
|
||||
#endif
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -453,7 +506,7 @@ XBSYSAPI EXPORTNUM(218) NTSTATUS NTAPI xboxkrnl::NtQueryVolumeInformationFile
|
|||
}
|
||||
#endif
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -514,7 +567,7 @@ XBSYSAPI EXPORTNUM(255) NTSTATUS NTAPI xboxkrnl::PsCreateSystemThreadEx
|
|||
if(ThreadId != NULL)
|
||||
*ThreadId = dwThreadId;
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -542,13 +595,13 @@ XBSYSAPI EXPORTNUM(277) VOID NTAPI xboxkrnl::RtlEnterCriticalSection
|
|||
}
|
||||
#endif
|
||||
|
||||
// We have to initialize this because the xbox software doesn't seem
|
||||
// We have to initialize this because the Xbox software doesn't seem
|
||||
// to always do it. Redundant initializations seem to be ok :/
|
||||
InitializeCriticalSection((win32::PRTL_CRITICAL_SECTION)CriticalSection);
|
||||
|
||||
EnterCriticalSection((win32::PRTL_CRITICAL_SECTION)CriticalSection);
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
@ -576,7 +629,7 @@ XBSYSAPI EXPORTNUM(291) VOID NTAPI xboxkrnl::RtlInitializeCriticalSection
|
|||
|
||||
InitializeCriticalSection((win32::PRTL_CRITICAL_SECTION)CriticalSection);
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -606,7 +659,7 @@ XBSYSAPI EXPORTNUM(294) VOID NTAPI xboxkrnl::RtlLeaveCriticalSection
|
|||
|
||||
LeaveCriticalSection((win32::PRTL_CRITICAL_SECTION)CriticalSection);
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
@ -632,7 +685,7 @@ XBSYSAPI EXPORTNUM(301) xboxkrnl::ULONG NTAPI xboxkrnl::RtlNtStatusToDosError
|
|||
}
|
||||
#endif
|
||||
|
||||
EmuXSwapFS(); // XBox FS
|
||||
EmuXSwapFS(); // Xbox FS
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -45,8 +45,8 @@
|
|||
// * not implemented yet (no prototype exists). otherwise, enable
|
||||
// * "#define PANIC(numb) cxbx_panic"
|
||||
// ******************************************************************
|
||||
#define PANIC(numb) EmuXPanic
|
||||
//#define PANIC(numb) numb
|
||||
//#define PANIC(numb) EmuXPanic
|
||||
#define PANIC(numb) numb
|
||||
|
||||
CXBXKRNL_API uint32 KernelThunkTable[367] =
|
||||
{
|
||||
|
@ -149,7 +149,7 @@ CXBXKRNL_API uint32 KernelThunkTable[367] =
|
|||
(uint32)PANIC(0x0060), // 0x0060 (96)
|
||||
(uint32)PANIC(0x0061), // 0x0061 (97)
|
||||
(uint32)PANIC(0x0062), // 0x0062 (98)
|
||||
(uint32)PANIC(0x0063), // 0x0063 (99)
|
||||
(uint32)&xboxkrnl::KeDelayExecutionThread, // 0x0063 (99)
|
||||
(uint32)PANIC(0x0064), // 0x0064 (100)
|
||||
(uint32)PANIC(0x0065), // 0x0065 (101)
|
||||
(uint32)PANIC(0x0066), // 0x0066 (102)
|
||||
|
|
Loading…
Reference in New Issue