XApiVerifyMediaInDrive now passes validation without patches

This commit is contained in:
Luke Usher 2016-09-30 06:45:47 +01:00
parent cedc176eb6
commit a160db2c72
3 changed files with 56 additions and 30 deletions

View File

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

View File

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

View File

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