CmpFindDrivers

char __fastcall CmpFindDrivers(
        PVOID BugCheckParameter3,
        __int64 a2,
        __int64 a3,
        unsigned int a4,
        __int64 a5,
        INT64 a6,
        __int64 a7,
        __int64 a8,
        __int64 a9,
        __int64 a10,
        __int64 a11){
  __int64 v11; 
  unsigned int v15; 
  UINT64 *Flags; 
  __int64 v17; 
  unsigned int GroupOrderList; 
  INT64 *v19; 
  unsigned int v20; 
  unsigned int v21; 
  _CM_SERVICE_LOAD_TYPE v22; 
  _UNICODE_STRING *v23; 
  unsigned int v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  _UNICODE_STRING *v28; 
  unsigned int v30; 
  INT64 *v31; 
  unsigned int v32; 
  _CM_SERVICE_LOAD_TYPE v33; 
  _UNICODE_STRING *v34; 
  __int64 v35; 
  _UNICODE_STRING *Source; 
  __int64 v37; 
  INT64 v38; 
  int v39[2]; 
  INT64 v40; 
  INT64 v41; 
  INT64 v42; 

  v11 = 0i64;
  LODWORD(a6) = 0;
  v42 = 0i64;
  a9 = 0xFFFFFFFFi64;
  v38 = 0xFFFFFFFFi64;
  v39[0] = -1;
  v40 = 0xFFFFFFFFi64;
  v15 = a2;
  a11 = 0i64;
  v37 = 0i64;
  v39[1] = 0;
  v41 = 0i64;
  if( !CmpLoadServicesNode((INT64)BugCheckParameter3, a2, &v41, (INT64)&v40) )
    return 0;
  Flags = 0i64;
  a7 = 0i64;
  v17 = 0i64;
  if( a10
    && CmpLoadManufacturingProfileServicesNode((INT64)BugCheckParameter3, v15, (const _WCHAR *)a10, &a7, (INT64)&v38) )
  {
    v17 = a7;
    Flags = (UINT64 *)BugCheckParameter3;
  }
  if( CmpFindRedirectedDriverServiceStateNode(
         (void(__fastcall **)(_QWORD, _QWORD))BugCheckParameter3,
         v15,
         a3,
         a4,
         &a11,
         &v37,
         (__int64)v39) )
  {
    v11 = v37;
  }
  else
  {
    a11 = 0i64;
  }
  v37 = v11;
  GroupOrderList = CmpFindGroupOrderList((__int64)BugCheckParameter3, v15);
  LODWORD(a7) = GroupOrderList;
  if( GroupOrderList == -1 )
    return 0;
  v19 = (INT64 *)a8;
  v20 = 0;
  v21 = GroupOrderList;
  while( 1 )
  {
    CmpFindSubKeyByNumber((_HHIVE *)BugCheckParameter3, (_CM_KEY_NODE *)v41, v20, (UINT *)&a6);
    v24 = a6;
    ++v20;
    if( (_DWORD)a6 == -1 )
      break;
    if( (unsigned __int8)CmpIsLoadType(
                            (_HHIVE *)BugCheckParameter3,
                            (unsigned int)a6,
                            v22,
                            v23,
                            (_CM_KEY_NODE *)Source,
                            Flags) )
      CmpAddDriverToList(
        (UINT64)BugCheckParameter3,
        v24,
        (UINT64)BugCheckParameter3,
        v21,
        (_UNICODE_STRING *)&CmpSystemHiveName,
        v19);
  }
  v25 = a5;
  v26 = a11;
  v27 = v37;
  if( a5 )
  {
    v28 = *(_UNICODE_STRING **)a5;
    if( *(_QWORD *)a5 != a5 )
    {
      v30 = a7;
      v31 = (INT64 *)a8;
      do
      {
        if( CmpLoadServicesNode(*(_QWORD *)&v28[2].Length, LODWORD(v28[2].Buffer), &v42, (INT64)&a9) )
        {
          v32 = 0;
          while( 1 )
          {
            CmpFindSubKeyByNumber(*(_HHIVE **)&v28[2].Length, (_CM_KEY_NODE *)v42, v32, (UINT *)&a6);
            v35 = *(_QWORD *)&v28[2].Length;
            ++v32;
            if( (_DWORD)a6 == -1 )
              break;
            if( (unsigned __int8)CmpIsLoadType(
                                    (_HHIVE *)v35,
                                    (unsigned int)a6,
                                    v33,
                                    v34,
                                    (_CM_KEY_NODE *)Source,
                                    Flags) )
              CmpAddDriverToList(
                *(_QWORD *)&v28[2].Length,
                (unsigned int)a6,
                (UINT64)BugCheckParameter3,
                v30,
                v28 + 1,
                v31);
          }
          (*(void(__fastcall **)(__int64, __int64 *))(v35 + 16))(v35, &a9);
          v25 = a5;
        }
        v28 = *(_UNICODE_STRING **)&v28->Length;
      }
      while( v28 != (_UNICODE_STRING *)v25 );
      v26 = a11;
      v27 = v37;
    }
  }
  if( Flags && v17 )
    ((void(__fastcall *)(UINT64 *, INT64 *))Flags[2])(Flags, &v38);
  if( v26 && v27 )
    (*(void(__fastcall **)(__int64, int *))(v26 + 16))(v26, v39);
  (*((void(__fastcall **)(PVOID, INT64 *))BugCheckParameter3 + 2))(BugCheckParameter3, &v40);
  return 1;
}

Referenced by:

CmGetSystemDriverList