VhdInitialize
NTSTATUS __stdcall VhdInitialize(INT64 a1){
UINT8 *v2;
NTSTATUS DiskParameters;
CHAR v4;
__int64 v5;
CHAR v6;
__int64 v8;
_QWORD *v9;
_QWORD *i;
__int64 v11;
__int64 v12;
char v13;
WCHAR *v14;
int v15;
__int64 v16;
__int64 v17;
UINT64 v18;
VOID **PoolWithTag;
_UNICODE_STRING *v20;
WCHAR *v21;
__int64 v22;
int v23;
size_t v24;
VOID **v25;
VOID **v26;
__int64 v27;
_UNICODE_STRING GuidString;
__int128 v29;
__int128 v30;
int v31[52];
char v32;
int v33;
WCHAR *pszSrc;
__int64 v35;
v29 = 0i64;
v30 = 0i64;
memset(v31, 0i64, 0x90u);
v2 = *(UINT8 **)(a1 + 184);
GuidString = 0i64;
v32 = 0;
DiskParameters = 0;
pszSrc = 0i64;
v35 = 0i64;
v33 = 0;
strstr(v2, (UINT8 *)"vdisk(", v4);
if( !v5 )
return DiskParameters;
strstr((UINT8 *)(v5 + 1), (UINT8 *)"partition(", v6);
if( !v8 )
return DiskParameters;
v9 = *(_QWORD **)(a1 + 232);
for( i = (_QWORD *)*v9; ; i = (_QWORD *)*i )
{
if( i == v9 )
return DiskParameters;
v11 = i[7];
if( v11 )
break;
}
if( !i )
return DiskParameters;
DiskParameters = VhdiGetDiskParameters(v11, v31, &v35, &v32, (__int64 *)&pszSrc);
if( DiskParameters < 0 )
{
v12 = 1i64;
goto LABEL_36;
}
v13 = v32;
v14 = pszSrc;
if( v32 )
{
v15 = 110;
}
else
{
*(_QWORD *)&v30 = pszSrc;
*(_QWORD *)&v29 = v31;
*((_QWORD *)&v29 + 1) = v35;
v12 = 2i64;
*((_QWORD *)&v30 + 1) = &v33;
DiskParameters = PnpBootDeviceWait(
a1,
2,
(__int64(__fastcall *)(__int64, __int64, _UNICODE_STRING *))VhdiInitializeBootDisk,
(__int64)&v29);
if( DiskParameters < 0 )
goto LABEL_37;
v15 = 74;
}
v16 = -1i64;
v17 = -1i64;
do
++v17;
while( v14[v17] );
v18 = (unsigned int)(v15 + 2 * v17);
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v18, 1113876566i64);
v21 = (WCHAR *)PoolWithTag;
if( !PoolWithTag )
goto LABEL_21;
if( !v13 )
{
DiskParameters = RtlStringCbPrintfW((WCHAR *)PoolWithTag, 0x4Aui64, (WCHAR *)L"\\\\Device\\HarddiskVolume%lu");
goto LABEL_26;
}
if( RtlStringFromGUID((_GUID *)&RamdiskBootDiskGuid, &GuidString, v20) < 0 )
{
LABEL_21:
v12 = 3i64;
LABEL_23:
DiskParameters = -1073741801;
goto LABEL_37;
}
DiskParameters = RtlStringCbPrintfW(v21, 0x6Eui64, (WCHAR *)L"\\\\Device\\Ramdisk%wZ");
RtlFreeAnsiString(&GuidString);
LABEL_26:
if( DiskParameters < 0 )
{
v12 = 4i64;
goto LABEL_36;
}
v22 = -1i64;
do
++v22;
while( v21[v22] );
RtlStringCbCatW(v21, v18, v14);
DiskParameters = VhdiMountVhdFile(v21);
if( DiskParameters < 0 )
{
v12 = 5i64;
goto LABEL_36;
}
*(&stru_140CF2E80 + 981) = v21;
v23 = v22 - 1;
do
++v16;
while( v14[v16] );
v24 = 2 * (v16 + v23) + 14;
v25 = ExAllocatePoolWithTag(0x200ui64, v24, 1113876566i64);
v26 = v25;
if( !v25 )
{
v12 = 7i64;
goto LABEL_23;
}
memset(v25, 0i64, v24);
memmove(v26 + 1, v21 + 1, 2 * v23);
v27 = (unsigned int)(2 * v23 + 10);
*((_DWORD *)v26 + 1) = v27;
memmove((char *)v26 + v27, v14, 2 * (v16 + 1));
off_140C050D0 = v26;
*(_BYTE *)v26 = 1;
v12 = 0i64;
dword_140C122D0 = v24;
LABEL_36:
if( DiskParameters < 0 )
LABEL_37:
KeBugCheckEx(0x12Fu, (PVOID)v12, (PVOID)DiskParameters, 0i64, 0i64);
return DiskParameters;
}Referenced by:
IopInitializeBootDrivers