From b62333551ca1f31b9df6e54947c3cc79041e3586 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Mon, 16 Dec 2019 21:53:02 +0000 Subject: [PATCH] kernel: Define and init IdexChannelObject --- import/OpenXDK/include/xboxkrnl/xbox.h | 2 +- import/OpenXDK/include/xboxkrnl/xboxkrnl.h | 39 ++++++++++++++++++++++ src/core/kernel/exports/EmuKrnl.cpp | 19 +++++------ src/core/kernel/exports/EmuKrnlKi.cpp | 2 ++ 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/import/OpenXDK/include/xboxkrnl/xbox.h b/import/OpenXDK/include/xboxkrnl/xbox.h index f58d95587..322b7a6cb 100644 --- a/import/OpenXDK/include/xboxkrnl/xbox.h +++ b/import/OpenXDK/include/xboxkrnl/xbox.h @@ -483,7 +483,7 @@ XBSYSAPI EXPORTNUM(355) UCHAR XePublicKeyDataChihiroBoot[284]; // ****************************************************************** // * 0x0165 - IdexChannelObject // ****************************************************************** -XBSYSAPI EXPORTNUM(357) BYTE IdexChannelObject[0x100]; +XBSYSAPI EXPORTNUM(357) IDE_CHANNEL_OBJECT IdexChannelObject; // ****************************************************************** // * 0x0169 - RtlSnprintf() diff --git a/import/OpenXDK/include/xboxkrnl/xboxkrnl.h b/import/OpenXDK/include/xboxkrnl/xboxkrnl.h index e98e2b298..1ce88310e 100644 --- a/import/OpenXDK/include/xboxkrnl/xboxkrnl.h +++ b/import/OpenXDK/include/xboxkrnl/xboxkrnl.h @@ -2617,6 +2617,45 @@ typedef struct _IO_COMPLETION_BASIC_INFORMATION { LONG Depth; } IO_COMPLETION_BASIC_INFORMATION, *PIO_COMPLETION_BASIC_INFORMATION; +typedef VOID(*PIDE_INTERRUPT_ROUTINE) (void); + +typedef VOID(*PIDE_FINISHIO_ROUTINE) (void); + +typedef BOOLEAN(*PIDE_POLL_RESET_COMPLETE_ROUTINE) (void); + +typedef VOID(*PIDE_TIMEOUT_EXPIRED_ROUTINE) (void); + +typedef VOID(*PIDE_START_PACKET_ROUTINE) ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +typedef VOID(*PIDE_START_NEXT_PACKET_ROUTINE) (void); + +typedef struct _IDE_CHANNEL_OBJECT +{ + PIDE_INTERRUPT_ROUTINE InterruptRoutine; + PIDE_FINISHIO_ROUTINE FinishIoRoutine; + PIDE_POLL_RESET_COMPLETE_ROUTINE PollResetCompleteRoutine; + PIDE_TIMEOUT_EXPIRED_ROUTINE TimeoutExpiredRoutine; + PIDE_START_PACKET_ROUTINE StartPacketRoutine; + PIDE_START_NEXT_PACKET_ROUTINE StartNextPacketRoutine; + KIRQL InterruptIrql; + BOOLEAN ExpectingBusMasterInterrupt; + BOOLEAN StartPacketBusy; + BOOLEAN StartPacketRequested; + UCHAR Timeout; + UCHAR IoRetries; + UCHAR MaximumIoRetries; + PIRP CurrentIrp; + KDEVICE_QUEUE DeviceQueue; + ULONG PhysicalRegionDescriptorTablePhysical; + KDPC TimerDpc; + KDPC FinishDpc; + KTIMER Timer; + KINTERRUPT InterruptObject; +} IDE_CHANNEL_OBJECT, *PIDE_CHANNEL_OBJECT; + // ****************************************************************** // * Debug // ****************************************************************** diff --git a/src/core/kernel/exports/EmuKrnl.cpp b/src/core/kernel/exports/EmuKrnl.cpp index 58034af82..bb275a186 100644 --- a/src/core/kernel/exports/EmuKrnl.cpp +++ b/src/core/kernel/exports/EmuKrnl.cpp @@ -84,7 +84,7 @@ void InsertTailList(xboxkrnl::PLIST_ENTRY pListHead, xboxkrnl::PLIST_ENTRY pEntr } //#define RemoveEntryList(e) do { PLIST_ENTRY f = (e)->Flink, b = (e)->Blink; f->Blink = b; b->Flink = f; (e)->Flink = (e)->Blink = NULL; } while (0) - + // Returns TRUE if the list has become empty after removing the element, FALSE otherwise. xboxkrnl::BOOLEAN RemoveEntryList(xboxkrnl::PLIST_ENTRY pEntry) { @@ -97,13 +97,13 @@ xboxkrnl::BOOLEAN RemoveEntryList(xboxkrnl::PLIST_ENTRY pEntry) if (_EX_Flink != nullptr) { _EX_Flink->Blink = _EX_Blink; - } - - if (_EX_Blink != nullptr && _EX_Flink != nullptr) { - return (_EX_Flink == _EX_Blink); - } - // If we reach here then it means we have erroneously been called on a detached element. In this case, - // always report FALSE to avoid possible side effects + } + + if (_EX_Blink != nullptr && _EX_Flink != nullptr) { + return (_EX_Flink == _EX_Blink); + } + // If we reach here then it means we have erroneously been called on a detached element. In this case, + // always report FALSE to avoid possible side effects return FALSE; } @@ -463,8 +463,7 @@ XBSYSAPI EXPORTNUM(163) xboxkrnl::VOID FASTCALL xboxkrnl::KiUnlockDispatcherData // ****************************************************************** // * 0x0165 - IdexChannelObject // ****************************************************************** -// TODO : Determine size, structure & filling behind IdexChannelObject -XBSYSAPI EXPORTNUM(357) xboxkrnl::BYTE xboxkrnl::IdexChannelObject[0x100] = { }; +XBSYSAPI EXPORTNUM(357) xboxkrnl::IDE_CHANNEL_OBJECT xboxkrnl::IdexChannelObject = { }; // ****************************************************************** // * 0x0169 - RtlSnprintf() diff --git a/src/core/kernel/exports/EmuKrnlKi.cpp b/src/core/kernel/exports/EmuKrnlKi.cpp index 4aea1e75e..ef97d4f87 100644 --- a/src/core/kernel/exports/EmuKrnlKi.cpp +++ b/src/core/kernel/exports/EmuKrnlKi.cpp @@ -112,6 +112,8 @@ xboxkrnl::VOID xboxkrnl::KiInitSystem() KiTimerTableListHead[i].Time.u.HighPart = 0xFFFFFFFF; KiTimerTableListHead[i].Time.u.LowPart = 0; } + + InitializeListHead(&IdexChannelObject.DeviceQueue.DeviceListHead); } xboxkrnl::VOID xboxkrnl::KiTimerLock()