PipInitializeCoreDriversByGroup

VOID __stdcall PipInitializeCoreDriversByGroup(_CORE_DRIVER_GROUP_TYPE GroupType, _LOADER_PARAMETER_BLOCK *LoaderBlock){
  int v2; 
  __int64 v4; 
  _UNICODE_STRING **v5; 
  _UNICODE_STRING *v6; 
  _UNICODE_STRING *v7; 
  NTSTATUS DriverNameFromKeyNode; 
  INT64 v9; 
  _UNICODE_STRING *v10; 
  int v11; 
  _UNICODE_STRING DriverName; 
  VOID *Handle; 
  INT64 v14; 

  v14 = 0i64;
  v2 = 0;
  Handle = 0i64;
  DriverName = 0i64;
  if( GroupType )
  {
    if( GroupType == CoreExtensionsDriverGroup )
    {
      v4 = 96i64;
      v2 = 1;
    }
    else
    {
      if( GroupType != TpmCoreDriverGroup )
        return;
      v4 = 112i64;
    }
  }
  else
  {
    v4 = 80i64;
  }
  v5 = (_UNICODE_STRING **)((char *)LoaderBlock + v4);
  if( (_LOADER_PARAMETER_BLOCK *)((char *)LoaderBlock + v4) )
  {
    v6 = *v5;
    *(&stru_140C452E0 + 141) = GroupType;
    while( v6 != (_UNICODE_STRING *)v5 )
    {
      v7 = v6;
      v6 = *(_UNICODE_STRING **)&v6->Length;
      if( SLODWORD(v7[3].Buffer) >= 0 )
      {
        DriverName.Buffer = 0i64;
        Handle = 0i64;
        DriverNameFromKeyNode = IopOpenRegistryKeyEx(&Handle, 0i64, v7 + 2, 0x20019ui64);
        if( DriverNameFromKeyNode >= 0 )
        {
          DriverNameFromKeyNode = IopGetDriverNameFromKeyNode(Handle, &DriverName);
          if( DriverNameFromKeyNode >= 0 )
          {
            DriverNameFromKeyNode = PnpInitializeBootStartDriver(
                                      &DriverName,
                                      (INT64)&v7[2],
                                      *(_QWORD *)(*(_QWORD *)&v7[3].Length + 56i64),
                                      *(_QWORD *)&v7[3].Length,
                                      &LoaderBlock->LoadOrderListHead,
                                      0,
                                      v2,
                                      v11,
                                      (INT64)&v14);
            if( DriverNameFromKeyNode >= 0 )
            {
              v9 = v14;
              if( v14 )
              {
                PnpLockDeviceActionQueue();
                PipApplyFunctionToServiceInstances(v10, (VOID *)(*(_QWORD *)(v9 + 48) + 24i64));
                PnpUnlockDeviceActionQueue();
                PnpWaitForEmptyDeviceActionQueue();
                PnpRequestDeviceAction(0i64, 7, 0, 0i64, 0i64, 0i64, 0i64);
                if( PnpWaitForEmptyDeviceEventQueue() < 0
                  && *(&stru_140CF2E80 + 920)
                  && *(_QWORD *)(*(&stru_140CF2E80 + 920) + 8i64) )
                {
                  HdlspKernelAddLogEntry(0x12ui64, 0i64);
                }
              }
            }
          }
        }
        if( Handle )
          ZwClose((_HANDLE)Handle);
        if( DriverName.Buffer )
          ExFreePoolWithTag(DriverName.Buffer, 0);
        if( DriverNameFromKeyNode < 0 )
          *(_DWORD *)(*(_QWORD *)&v7[3].Length + 104i64) |= 0x20000u;
      }
    }
  }
}

Referenced by:

IopInitializeBootDrivers