BiSpacesUpdatePhysicalDevicePath
INT64 __fastcall BiSpacesUpdatePhysicalDevicePath(UINT64 *a1){
UINT64 v2;
int IsSpace;
unsigned int v4;
WCHAR *PoolWithTag;
WCHAR *v6;
WCHAR *v7;
_DWORD *v8;
_DWORD *v9;
int PhysicalPartitions;
__int64 v11;
unsigned int v12;
VOID *v13;
UINT64 v14;
UINT64 v15;
BYTE v17;
v2 = *a1;
IsSpace = 0;
v17 = 0;
v4 = 108;
if( *(_DWORD *)v2 == 2 )
{
IsSpace = SyspartIsSpace((WCHAR *)(v2 + 20), &v17);
if( IsSpace >= 0 )
{
if( v17 )
{
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x208ui64, 0x4B444342ui64);
v6 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x208ui64, 0x4B444342ui64);
v7 = v6;
if( PoolWithTag && v6 )
{
swprintf_s(PoolWithTag, 0x104ui64, (WCHAR *)L"%s\\%s");
while( 1 )
{
v8 = ExAllocatePoolWithTag(PagedPool, v4, 0x4B444342ui64);
v9 = v8;
if( !v8 )
goto LABEL_24;
PhysicalPartitions = SyspartGetPhysicalPartitions(PoolWithTag, v8, v4);
IsSpace = PhysicalPartitions;
if( ((PhysicalPartitions + 0x80000000) & 0x80000000) == 0 && PhysicalPartitions != -2147483643 )
break;
if( v9[1] <= v4 )
{
if( v9[2] )
{
swprintf_s(v7, 0x104ui64, (WCHAR *)L"\\Device\\Harddisk%u\\Partition%u");
v11 = -1i64;
do
++v11;
while( v7[v11] );
v12 = 2 * v11 + 2;
v13 = ExAllocatePoolWithTag(PagedPool, (unsigned int)(2 * v11 + 62), 0x4B444342ui64);
v14 = (UINT64)v13;
if( v13 )
{
v15 = *a1;
*(_OWORD *)v13 = *(_OWORD *)*a1;
*((_OWORD *)v13 + 1) = *(_OWORD *)(v15 + 16);
*((_OWORD *)v13 + 2) = *(_OWORD *)(v15 + 32);
*((_QWORD *)v13 + 6) = *(_QWORD *)(v15 + 48);
*((_DWORD *)v13 + 14) = *(_DWORD *)(v15 + 56);
memmove((UINT8 *)v13 + 20, (UINT8 *)v7, v12);
if( v15 )
ExFreeHeapPool((PVOID)v15);
*a1 = v14;
}
else
{
IsSpace = -1073741801;
}
}
else
{
IsSpace = -1073741823;
}
goto LABEL_23;
}
v4 = v9[1];
ExFreeHeapPool(v9);
}
BiLogMessage();
LABEL_23:
ExFreeHeapPool(v9);
goto LABEL_25;
}
LABEL_24:
IsSpace = -1073741801;
LABEL_25:
if( PoolWithTag )
ExFreeHeapPool(PoolWithTag);
if( v7 )
ExFreeHeapPool(v7);
}
}
else
{
BiLogMessage();
}
}
return(unsigned int)IsSpace;
}Referenced by:
BiUpdateEfiEntry