IoWritePartitionTable
NTSTATUS __stdcall IoWritePartitionTable(
_DEVICE_OBJECT *DeviceObject,
UINT64 BytesPerSector,
UINT64 SectorsPerTrack,
UINT64 NumberOfHeads,
_DRIVE_LAYOUT_INFORMATION *Layout){
ULONG PartitionCount;
VOID **PoolWithTag;
struct SC_DISK_LAYOUT *v8;
NTSTATUS v9;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 v14[46];
SC_DISK::SC_DISK((SC_DISK *)v14);
PartitionCount = Layout->PartitionCount;
v14[44] = 0i64;
v14[0] = (__int64)&NT_DISK::`vftable';
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 144 * PartitionCount + 48, 1414557513i64);
v8 = (struct SC_DISK_LAYOUT *)PoolWithTag;
if( PoolWithTag )
{
*(_DWORD *)PoolWithTag = 0;
v10 = 0i64;
*((_DWORD *)PoolWithTag + 1) = Layout->PartitionCount;
for( *((_DWORD *)PoolWithTag + 2) = Layout->Signature;
(unsigned int)v10 < Layout->PartitionCount;
HIDWORD(PoolWithTag[v11 + 10]) = Layout->PartitionEntry[v12].HiddenSectors )
{
v11 = 18 * v10;
v12 = (unsigned int)v10;
v10 = (unsigned int)(v10 + 1);
LODWORD(PoolWithTag[v11 + 6]) = 0;
PoolWithTag[v11 + 7] = (VOID *)Layout->PartitionEntry[v12].StartingOffset.QuadPart;
PoolWithTag[v11 + 8] = (VOID *)Layout->PartitionEntry[v12].PartitionLength.QuadPart;
LODWORD(PoolWithTag[v11 + 9]) = Layout->PartitionEntry[v12].PartitionNumber;
BYTE4(PoolWithTag[v11 + 9]) = Layout->PartitionEntry[v12].RewritePartition;
LOBYTE(PoolWithTag[v11 + 10]) = Layout->PartitionEntry[v12].PartitionType;
BYTE1(PoolWithTag[v11 + 10]) = Layout->PartitionEntry[v12].BootIndicator;
BYTE2(PoolWithTag[v11 + 10]) = Layout->PartitionEntry[v12].RecognizedPartition;
}
v9 = NT_DISK::Initialize((NT_DISK *)v14, DeviceObject);
if( v9 >= 0 )
v9 = SC_DISK::WritePartitionTable((SC_DISK *)v14, v8);
ExFreePoolWithTag(v8, 0);
}
else
{
v9 = -1073741670;
}
v14[0] = (__int64)&NT_DISK::`vftable';
SC_DISK::~SC_DISK((SC_DISK *)v14);
return v9;
}Referenced by:
No references.