IopInitializeBootDrivers

UINT64 __stdcall IopInitializeBootDrivers(_LOADER_PARAMETER_BLOCK *LoaderBlock, _DRIVER_OBJECT **PreviousDriver){
  _LOADER_PARAMETER_BLOCK *v2; 
  NTSTATUS RegistryValue; 
  _QWORD *v4; 
  unsigned int GroupOrderIndex; 
  __int64 v6; 
  unsigned int v7; 
  unsigned __int16 i; 
  __int64 v9; 
  _QWORD *v10; 
  unsigned __int16 v11; 
  unsigned __int16 v12; 
  unsigned __int16 v13; 
  const _UNICODE_STRING *v14; 
  _LIST_ENTRY *Flink; 
  VOID *v16; 
  _QWORD *v17; 
  _LIST_ENTRY *v18; 
  VOID **PoolWithTag; 
  VOID **v20; 
  unsigned int v21; 
  UINT16 DriverTagPriority; 
  __int64 **v23; 
  __int64 *j; 
  _TREE_ENTRY *v25; 
  unsigned __int16 v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 *v29; 
  NTSTATUS v30; 
  _LOADER_PARAMETER_EXTENSION *Extension; 
  __int64 ArcOSDataDeviceName; 
  _LIST_ENTRY *p_AttachedHives; 
  _LIST_ENTRY *v34; 
  UINT64 *v35; 
  NTSTATUS Index; 
  unsigned __int16 v37; 
  void **v38; 
  void *v39; 
  __int64 v41; 
  void *v42; 
  int started; 
  _UNICODE_STRING *v44; 
  void **v45; 
  __int64 v46; 
  int v47; 
  void *v48; 
  UINT64 v49; 
  VOID *v50; 
  HPNPCTX *v51; 
  INT64 v52; 
  INT64 v53; 
  unsigned __int16 *v54; 
  INT64 v55; 
  INT64 v56; 
  INT64 v57; 
  PVOID v58; 
  UINT64 dwFlags; 
  INT64 dwFlagsa; 
  UINT64 pszFormat; 
  INT64 pszFormata; 
  VOID **phkResult; 
  int pRegDisposition; 
  int pRegDispositiona; 
  UINT64 *pRegDispositionb; 
  VOID *Handle; 
  PVOID Object; 
  CHAR v69[4]; 
  _DWORD HardwareConfigIndex[3]; 
  int v71; 
  VOID *hKey; 
  VOID *v73; 
  _UNICODE_STRING KeyName; 
  _LOADER_PARAMETER_BLOCK *v75; 
  _UNICODE_STRING DriverName; 
  _UNICODE_STRING DestinationString; 
  _UNICODE_STRING v78; 
  _UNICODE_STRING GroupName; 
  _UNICODE_STRING String2; 
  __int16 pszDest[64]; 

  v75 = LoaderBlock;
  *(_DWORD *)(&DriverName.MaximumLength + 1) = 0;
  v2 = LoaderBlock;
  memset(HardwareConfigIndex, 0, sizeof(HardwareConfigIndex));
  Handle = 0i64;
  *(_DWORD *)(&KeyName.MaximumLength + 1) = 0;
  String2 = 0i64;
  *(_DWORD *)(&v78.MaximumLength + 1) = 0;
  GroupName = 0i64;
  v73 = 0i64;
  hKey = 0i64;
  *(_DWORD *)v69 = 0;
  DestinationString = 0i64;
  Object = 0i64;
  PnpDiagnosticTrace(&KMPnPEvt_BootStart_Start, 0, 0i64);
  PnpDriverImageLoadPolicy = 3;
  KeyName.Buffer = L"\\Registry\\Machine\\System\\CurrentControlSet\\Policies\\EarlyLaunch";
  *(_DWORD *)&KeyName.Length = 8388734;
  if( IopOpenRegistryKeyEx(&Handle, 0i64, &KeyName, 0x20019ui64) >= 0
    || (*(_DWORD *)&KeyName.Length = 8257660,
        KeyName.Buffer = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\EarlyLaunch",
        IopOpenRegistryKeyEx(&Handle, 0i64, &KeyName, 0x20019ui64) >= 0) )
  {
    RegistryValue = IopGetRegistryValue(
                      Handle,
                      (PWCHAR)L"DriverLoadPolicy",
                      0i64,
                      (_KEY_VALUE_FULL_INFORMATION **)&HardwareConfigIndex[1]);
    ZwClose((_HANDLE)Handle);
    if( RegistryValue >= 0 )
    {
      if( *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 4i64) == 4
        && *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 12i64) >= 4u )
      {
        PnpDriverImageLoadPolicy = *(_DWORD *)(*(unsigned int *)(*(_QWORD *)&HardwareConfigIndex[1] + 8i64)
                                             + *(_QWORD *)&HardwareConfigIndex[1]);
      }
      ExFreePoolWithTag(*(PVOID *)&HardwareConfigIndex[1], 0);
    }
  }
  if( PnpDriverImageLoadPolicy == 8 )
  {
    PnpDriverImageLoadPolicy = 0;
  }
  else if( (PnpDriverImageLoadPolicy & 0xFFFFFFF8) != 0 )
  {
    PnpDriverImageLoadPolicy = 3;
  }
  PipInitializeDriverDependentDLLs(0, (_LIST_ENTRY *)v2);
  PipInitializeCoreDriversByGroup(CoreDriverGroup, v2);
  PsNotifyCoreDriversInitialized();
  PipInitializeEarlyLaunchDrivers(v2);
  *(&stru_140C452E0 + 312) = 1;
  PnpNotifyEarlyLaunchStatusUpdate(0);
  PipInitializeDriverDependentDLLs(1, (_LIST_ENTRY *)v2);
  PipInitializeCoreDriversByGroup(CoreExtensionsDriverGroup, v2);
  PipInitializeCoreDriversByGroup(TpmCoreDriverGroup, v2);
  *(&stru_140C452E0 + 141) = 3;
  PipInitComputerIds(v2);
  *(_DWORD *)&v78.Length = 2097182;
  v78.Buffer = L"\\FileSystem\\RAW";
  DriverName.Buffer = (wchar_t *)&word_140A76040;
  *(_DWORD *)&DriverName.Length = 0x20000;
  PnpInitializeBootStartDriver(
    &v78,
    (INT64)&DriverName,
    (INT64)RawInitialize,
    0i64,
    &v2->LoadOrderListHead,
    0,
    0,
    pRegDisposition,
    (INT64)&Object);
  v4 = Object;
  if( !Object )
    return 0i64;
  GroupOrderIndex = PpInitGetGroupOrderIndex(0i64);
  *(&stru_140C452E0 + 122) = GroupOrderIndex;
  v71 = 0xFFFF;
  if( (unsigned __int16)GroupOrderIndex == 0xFFFF )
  {
    if( *(&stru_140CF2E80 + 920) && *(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
    {
      v49 = 16i64;
      goto LABEL_122;
    }
    return 0i64;
  }
  *(&stru_140C452E0 + 63) = ExAllocatePoolWithTag(1ui64, 16i64 * GroupOrderIndex, 1852403792i64);
  v6 = *(&stru_140C452E0 + 63);
  if( !*(&stru_140C452E0 + 63) )
  {
    if( *(&stru_140CF2E80 + 920) && *(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
    {
      v49 = 17i64;
      goto LABEL_122;
    }
    return 0i64;
  }
  v7 = *(&stru_140C452E0 + 122);
  for( i = 0; i < v7; *v10 = v10 )
  {
    v9 = i++;
    v10 = (_QWORD *)(v6 + 16 * v9);
    v10[1] = v10;
  }
  PipInitializeDriverDependentDLLs(2, (_LIST_ENTRY *)v2);
  RtlInitUnicodeString(&DestinationString, L"System Reserved");
  RtlInitUnicodeString(&String2, L"Boot Bus Extender");
  v11 = word_140C50A34[0];
  v12 = 0;
  v13 = 0;
  if( !word_140C50A34[0] )
    goto LABEL_18;
  do
  {
    v14 = (const _UNICODE_STRING *)((char *)qword_140C50A38 + 16 * v13);
    if( !RtlCompareUnicodeString(v14, &DestinationString, 1u) )
      goto LABEL_20;
    if( !RtlCompareUnicodeString(v14, &String2, 1u) )
    {
      LOWORD(v71) = v13;
LABEL_20:
      ++v12;
    }
    if( v12 >= 2u )
      break;
    ++v13;
  }
  while( v13 < v11 );
  v2 = v75;
  v4 = Object;
LABEL_18:
  Flink = v2->BootDriverListHead.Flink;
  while( Flink != &v2->BootDriverListHead )
  {
    v18 = Flink;
    Flink = Flink->Flink;
    if( SLODWORD(v18[3].Blink) >= 0 )
    {
      PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x30ui64, 1852403792i64);
      v20 = PoolWithTag;
      if( PoolWithTag )
      {
        PoolWithTag[2] = 0i64;
        PoolWithTag[4] = 0i64;
        PoolWithTag[5] = 0i64;
        PoolWithTag[1] = PoolWithTag;
        *PoolWithTag = PoolWithTag;
        PoolWithTag[3] = v18;
        if( IopOpenRegistryKeyEx(&Handle, 0i64, (_UNICODE_STRING *)&v18[2], 0x20019ui64) < 0 )
        {
          ExFreePoolWithTag(v20, 0);
        }
        else
        {
          v20[4] = Handle;
          v21 = PpInitGetGroupOrderIndex(Handle);
          DriverTagPriority = PipGetDriverTagPriority(Handle);
          *((_WORD *)v20 + 22) = DriverTagPriority;
          v23 = (__int64 **)(*(&stru_140C452E0 + 63) + 16i64 * v21);
          for( j = *v23; j != (__int64 *)v23 && *((_WORD *)j + 22) <= DriverTagPriority; j = (__int64 *)*j )
            ;
          v16 = (VOID *)j[1];
          v17 = *(_QWORD **)v16;
          if( *(VOID **)(*(_QWORD *)v16 + 8i64) != v16 )
            goto LABEL_143;
          *v20 = v17;
          v20[1] = v16;
          v17[1] = v20;
          *(_QWORD *)v16 = v20;
        }
      }
    }
  }
  PnpNotifyEarlyLaunchStatusUpdate(1);
  v25 = 0i64;
  v26 = 0;
  if( !*(&stru_140C452E0 + 122) )
  {
LABEL_37:
    PnpNotifyEarlyLaunchStatusUpdate(2);
    PipUnloadEarlyLaunchDrivers(v2);
    *(&PnpReplaceEvent + 6681) = 1;
    PnpRequestDeviceAction(0i64, 0, 0, 0i64, 0i64, 0i64, 0i64);
    if( PnpWaitForDevicesToStart() )
    {
      if( IopCallBootDriverReinitializationRoutines() && !PnpWaitForDevicesToStart() )
      {
        if( !*(&stru_140CF2E80 + 920) || !*(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
          return 0i64;
        v49 = 20i64;
LABEL_122:
        HdlspKernelAddLogEntry(v49, 0i64);
        return 0i64;
      }
      if( memicmp(v2->ArcBootDeviceName, "ramdisk(", 8u) )
        v30 = -1073741275;
      else
        v30 = RamdiskStart(v2);
      if( (v30 < 0 || PnpWaitForDevicesToStart()) && (VhdInitialize((INT64)v2) < 0 || PnpWaitForDevicesToStart()) )
      {
        if( IopCreateArcNames(v2) < 0 )
          return 0i64;
        PnpBootDeviceWait(
          (__int64)v2,
          1,
          (__int64(__fastcall *)(__int64, __int64, _UNICODE_STRING *))IopMarkBootPartition,
          0i64);
        Extension = v2->Extension;
        *(&PnpReplaceEvent + 6682) = 1;
        if( (Extension->_bf_84 & 0x400) != 0
          && (SbpStartLanman() < 0 || SbpWaitForVmbus() < 0 || SbpAddTransportToInstance() < 0) )
        {
          return 0i64;
        }
        ArcOSDataDeviceName = (__int64)v2->ArcOSDataDeviceName;
        if( ArcOSDataDeviceName )
        {
          if( (int)PnpBootDeviceWait(
                      (__int64)v2,
                      3,
                      (__int64(__fastcall *)(__int64, __int64, _UNICODE_STRING *))PipCriticalDeviceWaitCallback,
                      ArcOSDataDeviceName) < 0 )
            return 0i64;
        }
        p_AttachedHives = &v2->Extension->AttachedHives;
        v34 = p_AttachedHives->Flink;
        if( p_AttachedHives->Flink != p_AttachedHives )
        {
          while( (LODWORD(v34[1].Blink) & 0x80u) == 0
               || (int)PnpBootDeviceWait(
                         (__int64)v2,
                         4,
                         (__int64(__fastcall *)(__int64, __int64, _UNICODE_STRING *))PipCriticalDeviceWaitCallback,
                         (__int64)v34[5].Blink) >= 0 )
          {
            v34 = v34->Flink;
            if( v34 == &v2->Extension->AttachedHives )
              goto LABEL_51;
          }
          return 0i64;
        }
LABEL_51:
        if( PiCreateDriverDataDirectoryRoot() < 0 )
          return 0i64;
        pszDest[0] = 0;
        Index = PipHardwareConfigGetIndex(v35);
        if( Index >= 0 )
        {
          LODWORD(dwFlags) = 2048;
          Index = RtlStringCchPrintfExW((WCHAR *)pszDest, 0x40ui64, 0i64, 0i64, dwFlags, (WCHAR *)L"%d");
        }
        v37 = 0;
        if( !*(&stru_140C452E0 + 122) )
        {
LABEL_57:
          ExFreePoolWithTag(*(&stru_140C452E0 + 63), 0);
          PnpDiagnosticTrace(&KMPnPEvt_BootStart_Stop, 0, 0i64);
          return 1i64;
        }
        while( 1 )
        {
          while( 1 )
          {
            v38 = (void **)(*(&stru_140C452E0 + 63) + 16i64 * v37);
            v39 = *v38;
            if( *v38 != v38 )
              break;
            if( (unsigned int)++v37 >= *(&stru_140C452E0 + 122) )
              goto LABEL_57;
          }
          if( *((void ***)v39 + 1) != v38 )
            break;
          v45 = *(void ***)v39;
          if( *(void **)(*(_QWORD *)v39 + 8i64) != v39 )
            break;
          *v38 = v45;
          v45[1] = v38;
          v46 = *((_QWORD *)v39 + 2);
          if( Index >= 0 && !*((_BYTE *)v39 + 46) && !*(_QWORD *)(v46 + 8) )
          {
            if( *(_QWORD *)(*(_QWORD *)(v46 + 48) + 8i64) )
            {
              v47 = *(_DWORD *)(v46 + 16);
              if( (v47 & 0x400) == 0
                && (v47 & 8) == 0
                && IopGetRegistryValue(
                     *((PVOID *)v39 + 4),
                     (PWCHAR)L"Start",
                     0i64,
                     (_KEY_VALUE_FULL_INFORMATION **)&HardwareConfigIndex[1]) >= 0 )
              {
                v48 = *(void **)&HardwareConfigIndex[1];
                if( *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 4i64) == 4
                  && *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 12i64) >= 4u )
                {
                  *(_DWORD *)v69 = *(_DWORD *)(*(unsigned int *)(*(_QWORD *)&HardwareConfigIndex[1] + 8i64)
                                             + *(_QWORD *)&HardwareConfigIndex[1]);
                  if( !*(_DWORD *)v69 )
                  {
                    *(_DWORD *)v69 = 3;
                    if( PiCreateDriverRedirectedStateKey(*(_QWORD *)(v46 + 48) + 24) >= 0 )
                    {
                      v50 = v73;
                    }
                    else
                    {
                      v50 = (VOID *)*((_QWORD *)v39 + 4);
                      v73 = v50;
                    }
                    LODWORD(dwFlags) = 2;
                    if( PnpCtxRegCreateKey(
                           *(&stru_140CF2E80 + 607),
                           v50,
                           (WCHAR *)L"StartOverride",
                           0i64,
                           dwFlags,
                           0i64,
                           &hKey,
                           0i64) >= 0 )
                    {
                      LODWORD(pszFormat) = 4;
                      PnpCtxRegSetValue((HPNPCTX *)4, hKey, (WCHAR *)pszDest, 4ui64, v69, pszFormat);
                      PnpCtxRegCloseKey(
                        v51,
                        hKey,
                        v52,
                        v53,
                        dwFlagsa,
                        pszFormata,
                        (INT64)phkResult,
                        (INT64)pRegDispositionb);
                      hKey = 0i64;
                      if( (byte_140C130BB & 1) != 0 )
                      {
                        v54 = (unsigned __int16 *)(*(_QWORD *)(v46 + 48) + 24i64);
                        Object = 0i64;
                        if( (int)PnpUnicodeStringToWstr((__int16 **)&Object, 0i64, v54) >= 0 )
                        {
                          v58 = Object;
                          if( (byte_140C130BB & 1) != 0 )
                            McTemplateK0dzd_EtwWriteTransfer(
                              v56,
                              v55,
                              v57,
                              HardwareConfigIndex[0],
                              (const WCHAR *)Object,
                              v69[0]);
                          PnpUnicodeStringToWstrFree(v58, *(_QWORD *)(v46 + 48) + 24i64);
                        }
                      }
                    }
                    if( v50 != *((VOID **)v39 + 4) )
                    {
                      ZwClose((_HANDLE)v50);
                      v73 = 0i64;
                    }
                  }
                }
                ExFreePoolWithTag(v48, 0);
              }
            }
          }
          if( v46 )
            ObfDereferenceObjectWithTag((VOID *)v46, 0x746C6644ui64);
          if( *((_BYTE *)v39 + 46) )
            *(_DWORD *)(*(_QWORD *)(*((_QWORD *)v39 + 3) + 48i64) + 104i64) |= 0x20000u;
          ZwClose(*((_QWORD *)v39 + 4));
          ExFreePoolWithTag(v39, 0);
        }
LABEL_143:
        __fastfail(3u);
      }
    }
    if( !*(&stru_140CF2E80 + 920) || !*(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
      return 0i64;
    v49 = 19i64;
    goto LABEL_122;
  }
LABEL_32:
  v27 = 16i64 * v26;
  v28 = v27 + *(&stru_140C452E0 + 63);
  v29 = *(__int64 **)(v27 + *(&stru_140C452E0 + 63));
  while( 1 )
  {
    if( v29 == (__int64 *)v28 )
    {
      if( v26 == (_WORD)v71 )
      {
        IopAllocateLegacyBootResources(Internal, 0i64);
        *(&PnpReplaceEvent + 6680) = 1;
        *(&PnpReplaceEvent + 683) = IopAllocateBootResources;
      }
      if( (unsigned int)++v26 >= *(&stru_140C452E0 + 122) )
        goto LABEL_37;
      goto LABEL_32;
    }
    Handle = (VOID *)v29[4];
    v41 = v29[3];
    v75 = (_LOADER_PARAMETER_BLOCK *)v41;
    *(_QWORD *)&DestinationString.Length = *(_QWORD *)(v41 + 48);
    *((_BYTE *)v29 + 47) = 1;
    if( IopGetDriverNameFromKeyNode(Handle, &DriverName) >= 0 )
    {
      if( IopGetRegistryValue(Handle, (PWCHAR)L"Group", 0i64, (_KEY_VALUE_FULL_INFORMATION **)&HardwareConfigIndex[1]) >= 0 )
      {
        v42 = *(void **)&HardwareConfigIndex[1];
        if( *(_DWORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 12i64) )
        {
          GroupName.Length = *(_WORD *)(*(_QWORD *)&HardwareConfigIndex[1] + 12i64);
          GroupName.MaximumLength = GroupName.Length;
          GroupName.Buffer = (wchar_t *)(*(_QWORD *)&HardwareConfigIndex[1]
                                       + *(unsigned int *)(*(_QWORD *)&HardwareConfigIndex[1] + 8i64));
          v25 = PipLookupGroupName(&GroupName, 1ui64);
        }
        ExFreePoolWithTag(v42, 0);
        v41 = (__int64)v75;
      }
      v4 = 0i64;
      if( !(unsigned int)PipCheckDependencies(Handle) )
        goto LABEL_96;
      v4 = (_QWORD *)v29[2];
      Object = v4;
      if( !v4 && !*((_BYTE *)v29 + 46) )
      {
        started = PnpInitializeBootStartDriver(
                    &DriverName,
                    v41 + 32,
                    *(_QWORD *)(*(_QWORD *)&DestinationString.Length + 56i64),
                    *(INT64 *)&DestinationString.Length,
                    &v2->LoadOrderListHead,
                    0,
                    1,
                    pRegDispositiona,
                    (INT64)&Object);
        v4 = Object;
        *((_DWORD *)v29 + 10) = started;
        if( !v4 )
          goto LABEL_96;
        ObfReferenceObjectWithTag(v4, 0x746C6644ui64);
      }
      if( v4 )
      {
        if( v25 )
          ++v25[7];
        v29[2] = (__int64)v4;
        goto LABEL_72;
      }
LABEL_96:
      *((_BYTE *)v29 + 46) = 1;
LABEL_72:
      ExFreePoolWithTag(DriverName.Buffer, 0);
      v25 = 0i64;
      goto LABEL_73;
    }
    *((_BYTE *)v29 + 46) = 1;
LABEL_73:
    if( !*((_BYTE *)v29 + 46) )
    {
      PnpLockDeviceActionQueue();
      PipApplyFunctionToServiceInstances(v44, (VOID *)(v4[6] + 24i64));
      PnpUnlockDeviceActionQueue();
      PnpWaitForEmptyDeviceActionQueue();
      PnpRequestDeviceAction(0i64, 7, 0, 0i64, 0i64, 0i64, 0i64);
    }
    if( PnpWaitForEmptyDeviceEventQueue() < 0 )
      break;
    v29 = (__int64 *)*v29;
    v28 = v27 + *(&stru_140C452E0 + 63);
  }
  if( *(&stru_140CF2E80 + 920) && *(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
  {
    v49 = 18i64;
    goto LABEL_122;
  }
  return 0i64;
}

Referenced by:

IoInitSystemPreDrivers