IopGetBootDiskInformation
NTSTATUS __stdcall IopGetBootDiskInformation(_BOOTDISK_INFORMATION *BootDiskInformation, UINT64 Size){
unsigned int v2;
int v4;
INT8 v5;
bool v7;
_LOADER_PARAMETER_BLOCK *v8;
_BOOTDISK_INFORMATION *v9;
__int64 **v10;
const char *v11;
INT8 v12;
INT8 v13;
NTSTATUS DeviceObjectPointer;
_DEVICE_OBJECT *v15;
_IRP *v16;
NTSTATUS Status;
unsigned int v18;
UINT64 i;
UINT64 v20;
_IRP *v21;
UINT8 v22;
UINT8 v23;
NTSTATUS v24;
_DWORD *PoolWithTag;
int v26;
__int64 *j;
char v28;
__int64 v29;
__int64 v30;
INT8 v31;
IRP *Timeout;
UINT64 OutputBufferLength;
int v34;
ULONG DiskCount;
__int64 v36;
PFILE_OBJECT FileObject;
_KEVENT FileObject_8;
PDEVICE_OBJECT DeviceObject;
_IO_STATUS_BLOCK IoStatusBlock;
__int64 **v41;
_BOOTDISK_INFORMATION *v42;
__int64 **v43;
struct _UNICODE_STRING ObjectName;
STRING String1;
struct _STRING SourceString;
struct _STRING DestinationString;
STRING String2;
__int128 OutputBuffer;
__int64 v50;
char pszDest[128];
INT8 v52[128];
PVOID ReturnAddress;
v42 = BootDiskInformation;
v50 = 0i64;
DestinationString = 0i64;
DeviceObject = 0i64;
v2 = Size;
SourceString = 0i64;
FileObject = 0i64;
ObjectName = 0i64;
String1 = 0i64;
IoStatusBlock = 0i64;
OutputBuffer = 0i64;
memset(&FileObject_8, 0, sizeof(FileObject_8));
String2 = 0i64;
v4 = 0;
v34 = 0;
DiskCount = IoGetConfigurationInformation()->DiskCount;
if( *(_DWORD *)InitializationPhase >= 2u )
return -1073741431;
if( v2 < 0x18 )
return -1073741811;
v7 = v2 < 0x40;
v8 = KeLoaderBlock_0;
v9 = 0i64;
if( !v7 )
v9 = BootDiskInformation;
v10 = (__int64 **)*((_QWORD *)KeLoaderBlock_0 + 29);
v11 = (const char *)*((_QWORD *)KeLoaderBlock_0 + 23);
v43 = v10;
v41 = (__int64 **)**v10;
RtlInitAnsiString(&DestinationString, v11, v5);
RtlInitAnsiString(&String2, *((PCSZ *)v8 + 24), v12);
LODWORD(v36) = 0;
if( DiskCount )
{
do
{
RtlStringCchPrintfA(pszDest, 0x80ui64, (INT8 *)"\\Device\\Harddisk%d\\Partition0");
RtlInitAnsiString(&SourceString, pszDest, v13);
if( RtlAnsiStringToUnicodeString(&ObjectName, &SourceString, 1u) < 0 )
goto LABEL_26;
DeviceObjectPointer = IoGetDeviceObjectPointer(&ObjectName, 0x80ui64, &FileObject, &DeviceObject);
RtlFreeAnsiString(&ObjectName);
if( DeviceObjectPointer < 0 )
goto LABEL_26;
v15 = DeviceObject;
LODWORD(OutputBufferLength) = 24;
v16 = IopBuildDeviceIoControlRequest(
0x70000ui64,
DeviceObject,
0i64,
0i64,
&OutputBuffer,
OutputBufferLength,
0,
&FileObject_8,
&IoStatusBlock,
ReturnAddress);
if( !v16 )
goto LABEL_11;
LOWORD(FileObject_8.Header.Lock) = 0;
FileObject_8.Header.WaitListHead.Blink = &FileObject_8.Header.WaitListHead;
FileObject_8.Header.Size = 6;
FileObject_8.Header.WaitListHead.Flink = &FileObject_8.Header.WaitListHead;
FileObject_8.Header.SignalState = 0;
Status = IofCallDriver(v15, v16);
if( Status == 259 )
{
KeWaitForSingleObject(&FileObject_8, Suspended, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status >= 0 )
{
v18 = 4096;
for( i = 4096i64; ; i = v18 )
{
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, i, 0x6F426F49ui64);
if( !PoolWithTag )
break;
LODWORD(OutputBufferLength) = v18;
v21 = IopBuildDeviceIoControlRequest(
0x70050ui64,
v15,
0i64,
0i64,
PoolWithTag,
OutputBufferLength,
0,
&FileObject_8,
&IoStatusBlock,
ReturnAddress);
if( !v21 )
break;
KeResetEvent(&FileObject_8, v20, v22, v23, Timeout);
v24 = IofCallDriver(v15, v21);
if( v24 == 259 )
{
KeWaitForSingleObject(&FileObject_8, Suspended, 0, 0, 0i64);
v24 = IoStatusBlock.Status;
}
if( v24 != -1073741789 )
goto LABEL_23;
ExFreePoolWithTag(PoolWithTag, 0);
v18 *= 2;
}
v24 = -1073741670;
LABEL_23:
ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
if( v24 >= 0 )
{
v26 = HIDWORD(v50);
if( HIDWORD(v50) < 0x200 )
v26 = 512;
HIDWORD(v50) = v26;
for( j = *v10; j != (__int64 *)v10; j = (__int64 *)*j )
{
if( v41 != v10 || DiskCount != 1 || *PoolWithTag )
{
v28 = IopVerifyDiskSignature((__int64)PoolWithTag, (__int64)j, &v34);
v4 = v34;
if( !v28 )
continue;
}
v29 = 0i64;
if( PoolWithTag[1] )
{
v30 = (__int64)v42;
do
{
if( !v4 && !*PoolWithTag )
v4 = PoolWithTag[2];
if( PoolWithTag[36 * v29 + 18] )
{
RtlStringCchPrintfA(v52, 0x80ui64, (INT8 *)"%spartition(%d)");
RtlInitAnsiString(&String1, v52, v31);
if( RtlEqualString(&String1, &DestinationString, 1u) )
{
*(_DWORD *)(v30 + 16) = v4;
*(_QWORD *)v30 = *(_QWORD *)&PoolWithTag[36 * v29 + 14];
if( v9 )
{
if( *PoolWithTag == 1 )
{
LOBYTE(v9[2].SystemPartitionOffset) = 1;
*(_OWORD *)&v9[1].BootPartitionOffset = *(_OWORD *)(PoolWithTag + 2);
}
else
{
LOBYTE(v9[2].SystemPartitionOffset) = 0;
}
}
}
if( RtlEqualString(&String1, &String2, 1u) )
{
*(_DWORD *)(v30 + 20) = v4;
*(_QWORD *)(v30 + 8) = *(_QWORD *)&PoolWithTag[36 * v29 + 14];
if( *PoolWithTag == 1 )
{
if( v9 )
{
BYTE1(v9[2].SystemPartitionOffset) = 1;
*(_OWORD *)&v9[1].BootDeviceSignature = *(_OWORD *)(PoolWithTag + 2);
}
}
else if( v9 )
{
BYTE1(v9[2].SystemPartitionOffset) = 0;
}
}
}
v29 = (unsigned int)(v29 + 1);
}
while( (unsigned int)v29 < PoolWithTag[1] );
v10 = v43;
v34 = v4;
}
}
LABEL_25:
ExFreePoolWithTag(PoolWithTag, 0);
goto LABEL_26;
}
if( PoolWithTag )
goto LABEL_25;
}
else
{
LABEL_11:
ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
}
LABEL_26:
LODWORD(v36) = v36 + 1;
}
while( (unsigned int)v36 < DiskCount );
}
return 0;
}Referenced by:
IoGetBootDiskInformation