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