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