Fix the UDFS recognizer.
Patch by Pater Hater.

CORE-9816

svn path=/trunk/; revision=71490
This commit is contained in:
Pierre Schweitzer 2016-06-01 20:13:15 +00:00
parent aa9a01829c
commit 990964945a

View file

@ -25,74 +25,80 @@ FsRecIsUdfsVolume(IN PDEVICE_OBJECT DeviceObject,
{ {
PVOLSTRUCTDESC VolumeStructDesc = NULL; PVOLSTRUCTDESC VolumeStructDesc = NULL;
LARGE_INTEGER Offset; LARGE_INTEGER Offset;
ULONG State = 0; BOOLEAN ret = FALSE;
int i;
PAGED_CODE(); PAGED_CODE();
Offset.QuadPart = UDFS_VRS_START_OFFSET; Offset.QuadPart = 16 * SectorSize;
while (TRUE) for (i = 0; i < 16; i++)
{ {
if (!FsRecReadBlock(DeviceObject, if (!FsRecReadBlock(DeviceObject,
&Offset, &Offset,
SectorSize, SectorSize,
SectorSize, SectorSize,
(PVOID)&VolumeStructDesc, (PVOID *)&VolumeStructDesc,
NULL)) NULL))
{ {
break; break;
} }
switch (State) if (!strncmp((const char*)VolumeStructDesc->Ident,
VSD_STD_ID_BEA01,
VSD_STD_ID_LEN))
{ {
case 0: DPRINT("BEA01 found\n");
}
if (!strncmp((const char*)VolumeStructDesc->Ident, if (!strncmp((const char*)VolumeStructDesc->Ident,
VSD_STD_ID_BEA01, VSD_STD_ID_NSR03,
VSD_STD_ID_LEN)) VSD_STD_ID_LEN))
{ {
State = 1; DPRINT("NSR03 found\n");
} ret = TRUE;
else }
{
ExFreePool(VolumeStructDesc);
return FALSE;
}
break;
case 1: if (!strncmp((const char*)VolumeStructDesc->Ident,
VSD_STD_ID_NSR02,
VSD_STD_ID_LEN))
{
DPRINT("NSR02 found\n");
ret = TRUE;
}
if (!strncmp((const char*)VolumeStructDesc->Ident, if (!strncmp((const char*)VolumeStructDesc->Ident,
VSD_STD_ID_NSR03, VSD_STD_ID_TEA01,
VSD_STD_ID_LEN) || VSD_STD_ID_LEN))
!strncmp((const char*)VolumeStructDesc->Ident, {
VSD_STD_ID_NSR02, DPRINT("TEA01 found\n");
VSD_STD_ID_LEN)) }
{
State = 2;
}
break;
case 2: if (!strncmp((const char*)VolumeStructDesc->Ident,
VSD_STD_ID_CD001,
VSD_STD_ID_LEN))
{
DPRINT("CD001 found\n");
}
if (!strncmp((const char*)VolumeStructDesc->Ident, if (!strncmp((const char*)VolumeStructDesc->Ident,
VSD_STD_ID_TEA01, VSD_STD_ID_CDW02,
VSD_STD_ID_LEN)) VSD_STD_ID_LEN))
{ {
ExFreePool(VolumeStructDesc); DPRINT("CDW02 found\n");
return TRUE; }
}
break; if (!strncmp((const char*)VolumeStructDesc->Ident,
VSD_STD_ID_BOOT2,
VSD_STD_ID_LEN))
{
DPRINT("BOOT2 found\n");
} }
Offset.QuadPart += SectorSize; Offset.QuadPart += SectorSize;
if (Offset.QuadPart == UDFS_AVDP_SECTOR)
{
ExFreePool(VolumeStructDesc);
return FALSE;
}
} }
ExFreePool(VolumeStructDesc); if (VolumeStructDesc)
return TRUE; ExFreePool(VolumeStructDesc);
return ret;
} }
NTSTATUS NTSTATUS