IopGetBootDiskInformation
NTSTATUS __stdcall IopGetBootDiskInformation(_BOOTDISK_INFORMATION *BootDiskInformation, UINT64 Size){
unsigned int v2;
ULONG Signature;
bool v6;
_LOADER_PARAMETER_BLOCK *v7;
_BOOTDISK_INFORMATION *v8;
_ARC_DISK_INFORMATION *ArcDiskInformation;
char *ArcBootDeviceName;
NTSTATUS DeviceObjectPointer;
_DEVICE_OBJECT *v12;
_IRP *v13;
NTSTATUS Status;
unsigned int v15;
UINT64 i;
_IRP *v17;
NTSTATUS v18;
_DRIVE_LAYOUT_INFORMATION_EX *PoolWithTag;
int v20;
_ARC_DISK_SIGNATURE *j;
UINT8 v22;
__int64 v23;
__int64 v24;
UINT64 OutputBufferLength;
UINT64 DiskSignature;
__int64 v27;
PFILE_OBJECT FileObject;
__int128 FileObject_8;
__int64 v30;
PDEVICE_OBJECT DeviceObject;
_IO_STATUS_BLOCK IoStatusBlock;
_ARC_DISK_INFORMATION *Flink;
_BOOTDISK_INFORMATION *v34;
_ARC_DISK_INFORMATION *v35;
_UNICODE_STRING ObjectName;
_STRING String1;
_STRING SourceString;
_STRING DestinationString;
_STRING String2;
__int128 OutputBuffer;
__int64 v42;
INT8 pszDest[128];
INT8 v44[128];
VOID *ReturnAddress;
v34 = BootDiskInformation;
v42 = 0i64;
DestinationString = 0i64;
DeviceObject = 0i64;
v2 = Size;
SourceString = 0i64;
FileObject = 0i64;
ObjectName = 0i64;
v30 = 0i64;
String1 = 0i64;
IoStatusBlock = 0i64;
OutputBuffer = 0i64;
FileObject_8 = 0i64;
String2 = 0i64;
Signature = 0;
LODWORD(DiskSignature) = 0;
HIDWORD(DiskSignature) = IoGetConfigurationInformation()->DiskCount;
if( (unsigned int)InitializationPhase >= 2 )
return -1073741431;
if( v2 < 0x18 )
return -1073741811;
v6 = v2 < 0x40;
v7 = KeLoaderBlock_0;
v8 = 0i64;
if( !v6 )
v8 = BootDiskInformation;
ArcDiskInformation = KeLoaderBlock_0->ArcDiskInformation;
ArcBootDeviceName = KeLoaderBlock_0->ArcBootDeviceName;
v35 = ArcDiskInformation;
Flink = (_ARC_DISK_INFORMATION *)ArcDiskInformation->DiskSignatures.Flink->Flink;
RtlInitAnsiString(&DestinationString, ArcBootDeviceName);
RtlInitAnsiString(&String2, v7->ArcHalDeviceName);
LODWORD(v27) = 0;
if( HIDWORD(DiskSignature) )
{
do
{
RtlStringCchPrintfA(pszDest, 0x80ui64, (INT8 *)"\\Device\\Harddisk%d\\Partition0");
RtlInitAnsiString(&SourceString, pszDest);
if( RtlAnsiStringToUnicodeString(&ObjectName, &SourceString, 1u) < 0 )
goto LABEL_26;
DeviceObjectPointer = IoGetDeviceObjectPointer(&ObjectName, 0x80ui64, &FileObject, &DeviceObject);
RtlFreeAnsiString(&ObjectName);
if( DeviceObjectPointer < 0 )
goto LABEL_26;
v12 = DeviceObject;
LODWORD(OutputBufferLength) = 24;
v13 = IopBuildDeviceIoControlRequest(
0x70000ui64,
DeviceObject,
0i64,
0i64,
&OutputBuffer,
OutputBufferLength,
0,
(_KEVENT *)&FileObject_8,
&IoStatusBlock,
ReturnAddress);
if( !v13 )
goto LABEL_11;
LOWORD(FileObject_8) = 0;
v30 = (__int64)&FileObject_8 + 8;
BYTE2(FileObject_8) = 6;
*((_QWORD *)&FileObject_8 + 1) = (char *)&FileObject_8 + 8;
DWORD1(FileObject_8) = 0;
Status = IofCallDriver((UINT64)v12, (UINT64)v13);
if( Status == 259 )
{
KeWaitForSingleObject((UINT64)&FileObject_8, 5, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status >= 0 )
{
v15 = 4096;
for( i = 4096i64; ; i = v15 )
{
PoolWithTag = (_DRIVE_LAYOUT_INFORMATION_EX *)ExAllocatePoolWithTag(0x200ui64, i, 1866624841i64);
if( !PoolWithTag )
break;
LODWORD(OutputBufferLength) = v15;
v17 = IopBuildDeviceIoControlRequest(
0x70050ui64,
v12,
0i64,
0i64,
PoolWithTag,
OutputBufferLength,
0,
(_KEVENT *)&FileObject_8,
&IoStatusBlock,
ReturnAddress);
if( !v17 )
break;
KeResetEvent((_KEVENT *)&FileObject_8);
v18 = IofCallDriver((UINT64)v12, (UINT64)v17);
if( v18 == 259 )
{
KeWaitForSingleObject((UINT64)&FileObject_8, 5, 0, 0, 0i64);
v18 = IoStatusBlock.Status;
}
if( v18 != -1073741789 )
goto LABEL_23;
ExFreePoolWithTag(PoolWithTag, 0);
v15 *= 2;
}
v18 = -1073741670;
LABEL_23:
ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
if( v18 >= 0 )
{
v20 = HIDWORD(v42);
if( HIDWORD(v42) < 0x200 )
v20 = 512;
HIDWORD(v42) = v20;
for( j = (_ARC_DISK_SIGNATURE *)ArcDiskInformation->DiskSignatures.Flink;
j != (_ARC_DISK_SIGNATURE *)ArcDiskInformation;
j = *(_ARC_DISK_SIGNATURE **)j )
{
if( Flink != ArcDiskInformation || HIDWORD(DiskSignature) != 1 || PoolWithTag->PartitionStyle )
{
v22 = IopVerifyDiskSignature(PoolWithTag, j, &DiskSignature);
Signature = DiskSignature;
if( !v22 )
continue;
}
v23 = 0i64;
if( PoolWithTag->PartitionCount )
{
v24 = (__int64)v34;
do
{
if( !Signature && !PoolWithTag->PartitionStyle )
Signature = PoolWithTag->Mbr.Signature;
if( *(&PoolWithTag->PartitionEntry[0].PartitionNumber + 36 * v23) )
{
RtlStringCchPrintfA(v44, 0x80ui64, (INT8 *)"%spartition(%d)");
RtlInitAnsiString(&String1, v44);
if( RtlEqualString(&String1, &DestinationString, 1u) )
{
*(_DWORD *)(v24 + 16) = Signature;
*(_QWORD *)v24 = *(&PoolWithTag->PartitionEntry[0].StartingOffset.QuadPart + 18 * v23);
if( v8 )
{
if( PoolWithTag->PartitionStyle == 1 )
{
LOBYTE(v8[2].SystemPartitionOffset) = 1;
*(_OWORD *)&v8[1].BootPartitionOffset = *(_OWORD *)&PoolWithTag->Mbr.Signature;
}
else
{
LOBYTE(v8[2].SystemPartitionOffset) = 0;
}
}
}
if( RtlEqualString(&String1, &String2, 1u) )
{
*(_DWORD *)(v24 + 20) = Signature;
*(_QWORD *)(v24 + 8) = *(&PoolWithTag->PartitionEntry[0].StartingOffset.QuadPart + 18 * v23);
if( PoolWithTag->PartitionStyle == 1 )
{
if( v8 )
{
BYTE1(v8[2].SystemPartitionOffset) = 1;
*(_OWORD *)&v8[1].BootDeviceSignature = *(_OWORD *)&PoolWithTag->Mbr.Signature;
}
}
else if( v8 )
{
BYTE1(v8[2].SystemPartitionOffset) = 0;
}
}
}
v23 = (unsigned int)(v23 + 1);
}
while( (unsigned int)v23 < PoolWithTag->PartitionCount );
ArcDiskInformation = v35;
LODWORD(DiskSignature) = Signature;
}
}
LABEL_25:
ExFreePoolWithTag(PoolWithTag, 0);
goto LABEL_26;
}
if( PoolWithTag )
goto LABEL_25;
}
else
{
LABEL_11:
ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
}
LABEL_26:
LODWORD(v27) = v27 + 1;
}
while( (unsigned int)v27 < HIDWORD(DiskSignature) );
}
return 0;
}Referenced by:
IoGetBootDiskInformation