HLE (D3D)

This commit is contained in:
Aaron Robinson 2003-02-21 04:51:03 +00:00
parent d6a94e0654
commit 71085835de
6 changed files with 158 additions and 45 deletions

View File

@ -57,7 +57,7 @@ typedef signed long sint32;
// ******************************************************************
// * Define this to trace intercepted function calls
// ******************************************************************
//#define _DEBUG_TRACE
#define _DEBUG_TRACE
// ******************************************************************
// * func : RoundUp

View File

@ -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
(

View File

@ -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
}
}
}
}

View File

@ -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
// ******************************************************************

View File

@ -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;
}

View File

@ -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)