VhdInitialize
INT64 __fastcall VhdInitialize(INT64 a1){
CHAR *v2;
int v3;
CHAR *v4;
_QWORD *v6;
_QWORD *i;
INT64 v8;
int v9;
ULONG_PTR v10;
char v11;
WCHAR *v12;
int v13;
__int64 v14;
__int64 v15;
UINT64 v16;
WCHAR *PoolWithTag;
__int64 v18;
__int64 v19;
unsigned int v20;
unsigned int v21;
UINT8 *v22;
UINT8 *v23;
__int64 v24;
struct _UNICODE_STRING GuidString;
__int128 v26;
__int128 v27;
INT64 result[26];
INT64 a4;
int v30;
NTSTRSAFE_PCWSTR pszSrc;
INT64 a3;
v26 = 0i64;
v27 = 0i64;
memset((INT64)result, 0i64);
v2 = *(CHAR **)(a1 + 184);
GuidString = 0i64;
LOBYTE(a4) = 0;
v3 = 0;
pszSrc = 0i64;
a3 = 0i64;
v30 = 0;
v4 = strstr(v2, "vdisk(");
if( !v4 || !strstr(v4 + 1, "partition(") )
return(unsigned int)v3;
v6 = *(_QWORD **)(a1 + 232);
for( i = (_QWORD *)*v6; ; i = (_QWORD *)*i )
{
if( i == v6 )
return(unsigned int)v3;
v8 = i[7];
if( v8 )
break;
}
if( !i )
return(unsigned int)v3;
VhdiGetDiskParameters(v8, (INT64)result, (INT64)&a3, (INT64)&a4, (INT64)&pszSrc);
v3 = v9;
if( v9 < 0 )
{
v10 = 1i64;
goto LABEL_36;
}
v11 = a4;
v12 = (WCHAR *)pszSrc;
if( (_BYTE)a4 )
{
v13 = 110;
}
else
{
*(_QWORD *)&v27 = pszSrc;
*(_QWORD *)&v26 = result;
*((_QWORD *)&v26 + 1) = a3;
v10 = 2i64;
*((_QWORD *)&v27 + 1) = &v30;
v3 = PnpBootDeviceWait(a1, 2, VhdiInitializeBootDisk, (__int64)&v26);
if( v3 < 0 )
goto LABEL_37;
v13 = 74;
}
v14 = -1i64;
v15 = -1i64;
do
++v15;
while( v12[v15] );
v16 = (unsigned int)(v13 + 2 * v15);
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, v16, 0x42646856ui64);
v18 = (__int64)PoolWithTag;
if( !PoolWithTag )
goto LABEL_21;
if( !v11 )
{
v3 = RtlStringCbPrintfW(PoolWithTag, 0x4Aui64, (WCHAR *)L"\\\\Device\\HarddiskVolume%lu");
goto LABEL_26;
}
if( (int)RtlStringFromGUID(&RamdiskBootDiskGuid, &GuidString) < 0 )
{
LABEL_21:
v10 = 3i64;
LABEL_23:
v3 = -1073741801;
goto LABEL_37;
}
v3 = RtlStringCbPrintfW((WCHAR *)v18, 0x6Eui64, (WCHAR *)L"\\\\Device\\Ramdisk%wZ");
RtlFreeAnsiString(&GuidString);
LABEL_26:
if( v3 < 0 )
{
v10 = 4i64;
goto LABEL_36;
}
v19 = -1i64;
do
++v19;
while( *(_WORD *)(v18 + 2 * v19) );
RtlStringCbCatW((PWCHAR)v18, v16, v12);
v3 = VhdiMountVhdFile((WCHAR *)v18);
if( v3 < 0 )
{
v10 = 5i64;
goto LABEL_36;
}
NtVhdBootFile = v18;
v20 = v19 - 1;
do
++v14;
while( v12[v14] );
v21 = 2 * (v14 + v20) + 14;
v22 = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, v21, 0x42646856ui64);
v23 = v22;
if( !v22 )
{
v10 = 7i64;
goto LABEL_23;
}
memset((INT64)v22, 0i64);
memmove(v23 + 8, (UINT8 *)(v18 + 2), 2i64 * v20);
v24 = 2 * v20 + 10;
*((_DWORD *)v23 + 1) = v24;
memmove(&v23[v24], (UINT8 *)v12, 2i64 * (unsigned int)(v14 + 1));
off_140C050D0 = v23;
*v23 = 1;
v10 = 0i64;
LODWORD(dword_140C122D0) = v21;
LABEL_36:
if( v3 < 0 )
LABEL_37:
KeBugCheckEx(0x12Fu, v10, v3, 0i64, 0i64);
return(unsigned int)v3;
}Referenced by:
IopInitializeBootDrivers