CmpFindDrivers

INT64 __fastcall CmpFindDrivers(
        _HHIVE *Hive,
        INT64 ControlSet,
        _CM_SERVICE_LOAD_TYPE LoadType,
        WCHAR *BootFileSystem,
        _LIST_ENTRY *DriverListHead,
        _UNICODE_STRING *HardwareConfigurationNumber,
        const WCHAR *ManufacturingProfile,
        UINT64 *Flags){
  __int64 v8; 
  unsigned int v10; 
  __int64 v11; 
  unsigned int v12; 
  INT64 result; 
  _HHIVE *v14; 
  const WCHAR *v15; 
  UINT8 UpdateExistingDriver; 
  unsigned int v17; 
  unsigned int v18; 
  _CM_SERVICE_LOAD_TYPE v19; 
  _UNICODE_STRING *v20; 
  unsigned int v21; 
  _LIST_ENTRY *v22; 
  __int64 v23; 
  __int64 v24; 
  _LIST_ENTRY *Flink; 
  unsigned int v26; 
  UINT8 v27; 
  unsigned int v28; 
  _CM_SERVICE_LOAD_TYPE v29; 
  _UNICODE_STRING *v30; 
  _LIST_ENTRY *v31; 
  _CM_KEY_NODE *Source; 
  __int64 v33; 
  _HV_GET_CELL_CONTEXT v34; 
  int v35[2]; 
  _HV_GET_CELL_CONTEXT ServicesNodeContext; 
  _CM_KEY_NODE *ServicesNode; 
  _CM_KEY_NODE *Node; 
  _HV_GET_CELL_CONTEXT v39; 
  WCHAR *ProfileName; 
  __int64 ManufacturingServicesNode; 
  v8 = 0i64;
  LODWORD(HardwareConfigurationNumber) = 0;
  Node = 0i64;
  v39.Cell = -1;
  v10 = (unsigned int)BootFileSystem;
  v34.Cell = -1;
  v35[0] = -1;
  v11 = *(_QWORD *)&LoadType;
  ServicesNodeContext.Cell = -1;
  *(_DWORD *)&v39.BinContext = 0;
  v12 = ControlSet;
  *(_DWORD *)&v34.BinContext = 0;
  ManufacturingServicesNode = 0i64;
  v33 = 0i64;
  v35[1] = 0;
  ServicesNode = 0i64;
  *(_DWORD *)&ServicesNodeContext.BinContext = 0;
  if( !CmpLoadServicesNode(Hive, ControlSet, &ServicesNode, &ServicesNodeContext) )
    goto LABEL_15;
  v14 = 0i64;
  ManufacturingProfile = 0i64;
  v15 = 0i64;
  if( ProfileName
    && CmpLoadManufacturingProfileServicesNode(Hive, v12, ProfileName, (_CM_KEY_NODE **)&ManufacturingProfile, &v34) )
  {
    v15 = ManufacturingProfile;
    v14 = Hive;
  }
  if( CmpFindRedirectedDriverServiceStateNode(
         (ULONG_PTR)Hive,
         v12,
         v11,
         v10,
         &ManufacturingServicesNode,
         &v33,
         (__int64)v35) )
  {
    v8 = v33;
  }
  else
  {
    ManufacturingServicesNode = 0i64;
  }
  v33 = v8;
  result = CmpFindGroupOrderList((INT64)Hive, v12);
  LODWORD(ManufacturingProfile) = result;
  if( (_DWORD)result == -1 )
  {
LABEL_15:
    LOBYTE(result) = 0;
  }
  else
  {
    UpdateExistingDriver = (unsigned __int8)Flags;
    v17 = 0;
    v18 = result;
    while( 1 )
    {
      CmpFindSubKeyByNumber(Hive, ServicesNode, v17, (UINT *)&HardwareConfigurationNumber);
      v21 = (unsigned int)HardwareConfigurationNumber;
      ++v17;
      if( (_DWORD)HardwareConfigurationNumber == -1 )
        break;
      if( (unsigned __int8)CmpIsLoadType(
                              Hive,
                              (unsigned int)HardwareConfigurationNumber,
                              v19,
                              v20,
                              Source,
                              (UINT64 *)&v14->Signature) )
        CmpAddDriverToList(
          Hive,
          v21,
          (UINT64)Hive,
          (_UNICODE_STRING *)v18,
          (_LIST_ENTRY *)&CmpSystemHiveName,
          UpdateExistingDriver);
    }
    v22 = DriverListHead;
    v23 = ManufacturingServicesNode;
    v24 = v33;
    if( DriverListHead )
    {
      Flink = DriverListHead->Flink;
      if( DriverListHead->Flink != DriverListHead )
      {
        v26 = (unsigned int)ManufacturingProfile;
        v27 = (unsigned __int8)Flags;
        do
        {
          if( CmpLoadServicesNode((_HHIVE *)Flink[2].Flink, LODWORD(Flink[2].Blink), &Node, &v39) )
          {
            v28 = 0;
            while( 1 )
            {
              CmpFindSubKeyByNumber((_HHIVE *)Flink[2].Flink, Node, v28, (UINT *)&HardwareConfigurationNumber);
              v31 = Flink[2].Flink;
              ++v28;
              if( (_DWORD)HardwareConfigurationNumber == -1 )
                break;
              if( (unsigned __int8)CmpIsLoadType(
                                      (_HHIVE *)v31,
                                      (unsigned int)HardwareConfigurationNumber,
                                      v29,
                                      v30,
                                      Source,
                                      (UINT64 *)&v14->Signature) )
                CmpAddDriverToList(
                  (_HHIVE *)Flink[2].Flink,
                  (unsigned int)HardwareConfigurationNumber,
                  (UINT64)Hive,
                  (_UNICODE_STRING *)v26,
                  Flink + 1,
                  v27);
            }
            ((void(__fastcall *)(_LIST_ENTRY *, _HV_GET_CELL_CONTEXT *))v31[1].Flink)(v31, &v39);
            v22 = DriverListHead;
          }
          Flink = Flink->Flink;
        }
        while( Flink != v22 );
        v23 = ManufacturingServicesNode;
        v24 = v33;
      }
    }
    if( v14 && v15 )
      v14->ReleaseCellRoutine(v14, &v34);
    if( v23 && v24 )
      (*(void(__fastcall **)(__int64, int *))(v23 + 16))(v23, v35);
    result = ((__int64(__fastcall *)(_HHIVE *, _HV_GET_CELL_CONTEXT *))Hive->ReleaseCellRoutine)(
               Hive,
               &ServicesNodeContext);
    LOBYTE(result) = 1;
  }
  return result;
}

Referenced by:

CmGetSystemDriverList