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