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