From a160db2c72cacc4a95338ac77f0bc2de3ef1d448 Mon Sep 17 00:00:00 2001 From: Luke Usher Date: Fri, 30 Sep 2016 06:45:47 +0100 Subject: [PATCH] XApiVerifyMediaInDrive now passes validation without patches --- import/OpenXDK/include/xboxkrnl/xboxkrnl.h | 38 ++++++++++++++++++++++ src/CxbxKrnl/CxbxKrnl.cpp | 29 ----------------- src/CxbxKrnl/EmuKrnl.cpp | 19 ++++++++++- 3 files changed, 56 insertions(+), 30 deletions(-) diff --git a/import/OpenXDK/include/xboxkrnl/xboxkrnl.h b/import/OpenXDK/include/xboxkrnl/xboxkrnl.h index 111847cd4..2d236f241 100644 --- a/import/OpenXDK/include/xboxkrnl/xboxkrnl.h +++ b/import/OpenXDK/include/xboxkrnl/xboxkrnl.h @@ -1008,6 +1008,44 @@ static VOID WRITE_REGISTER_ULONG(PVOID Address, ULONG Value) }; } +typedef struct _SCSI_PASS_THROUGH_DIRECT { + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + PVOID DataBuffer; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +}SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; + +typedef struct _MODE_PARAMETER_HEADER10 { + UCHAR ModeDataLength[2]; + UCHAR MediumType; + UCHAR DeviceSpecificParameter; + UCHAR Reserved[2]; + UCHAR BlockDescriptorLength[2]; +}MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10; + +typedef struct _DVDX2_AUTHENTICATION_PAGE { + UCHAR Unknown[2]; + UCHAR PartitionArea; + UCHAR CDFValid; + UCHAR Authentication; + UCHAR Unknown2[3]; + ULONG Unknown3[3]; +} DVDX2_AUTHENTICATION_PAGE, *PDVDX2_AUTHENTICATION_PAGE; + +typedef struct _DVDX2_AUTHENTICATION { + MODE_PARAMETER_HEADER10 Header; + DVDX2_AUTHENTICATION_PAGE AuthenticationPage; +} DVDX2_AUTHENTICATION, *PDVDX2_AUTHENTICATION; + // ****************************************************************** // * Debug // ****************************************************************** diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index ea750fb62..9e0aa95ee 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -454,35 +454,6 @@ extern "C" CXBXKRNL_API void CxbxKrnlInit strncpy_s((PSTR)DummyKernel->SectionHeader.Name, 8, "DONGS", 8); } - - // - // load the necessary pieces of XbeHeader - // - - { - /* - Xbe::Header *MemXbeHeader = (Xbe::Header*)0x00010000; - - uint32 old_protection = 0; - - VirtualProtect(MemXbeHeader, pXbeHeader->dwSizeofImage, PAGE_READWRITE, &old_protection); - - // we sure hope we aren't corrupting anything necessary for an .exe to survive :] - MemXbeHeader->dwSizeofHeaders = pXbeHeader->dwSizeofHeaders; - MemXbeHeader->dwCertificateAddr = pXbeHeader->dwCertificateAddr; - MemXbeHeader->dwPeHeapReserve = pXbeHeader->dwPeHeapReserve; - MemXbeHeader->dwPeHeapCommit = pXbeHeader->dwPeHeapCommit; - MemXbeHeader->dwPeStackCommit = pXbeHeader->dwPeStackCommit; - - memcpy(&MemXbeHeader->dwInitFlags, &pXbeHeader->dwInitFlags, sizeof(pXbeHeader->dwInitFlags)); - - memcpy((void*)pXbeHeader->dwCertificateAddr, &((uint08*)pXbeHeader)[pXbeHeader->dwCertificateAddr - 0x00010000], sizeof(Xbe::Certificate)); */ - - // Patch AllowedMediaTypes to prevent XapiVerifyMediaInDrive() being called - // This is necessary as we do not emulate XDVD verification - ((Xbe::Certificate*)pXbeHeader->dwCertificateAddr)->dwAllowedMedia |= 0x00FFFFFF; - } - // Initialize devices : char szBuffer[260]; SHGetSpecialFolderPath(NULL, szBuffer, CSIDL_APPDATA, TRUE); diff --git a/src/CxbxKrnl/EmuKrnl.cpp b/src/CxbxKrnl/EmuKrnl.cpp index 68495367c..56e203ecd 100644 --- a/src/CxbxKrnl/EmuKrnl.cpp +++ b/src/CxbxKrnl/EmuKrnl.cpp @@ -3245,7 +3245,24 @@ XBSYSAPI EXPORTNUM(196) xboxkrnl::NTSTATUS NTAPI xboxkrnl::NtDeviceIoControlFile ");\n", GetCurrentThreadId(), FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, IoControlCode, InputBufferLength, OutputBuffer, OutputBufferLength); - CxbxKrnlCleanup("NtDeviceIoControlFile Not Implemented"); + switch (IoControlCode) + { + // IOCTL_SCSI_PASS_THROUGH_DIRECT + case 0x4D014: + { + PSCSI_PASS_THROUGH_DIRECT PassThrough = (PSCSI_PASS_THROUGH_DIRECT)InputBuffer; + PDVDX2_AUTHENTICATION Authentication = (PDVDX2_AUTHENTICATION)PassThrough->DataBuffer; + + // Should be just enough info to pass XapiVerifyMediaInDrive + Authentication->AuthenticationPage.CDFValid = 1; + Authentication->AuthenticationPage.PartitionArea = 1; + Authentication->AuthenticationPage.Authentication = 1; + break; + } + default: + CxbxKrnlCleanup("NtDeviceIoControlFile Not Implemented"); + } + return STATUS_SUCCESS; }