PiDmEnumObjectsWithCallback
NTSTATUS __fastcall PiDmEnumObjectsWithCallback(
PNP_OBJECT_TYPE ObjectType,
INT64 a2,
INT64 *EnumCallback,
PI_DM_OBJECT *a4,
VOID *a5,
UINT8 *a6,
VOID *Context){
NTSTATUS v10;
_PI_DM_OBJECT_MANAGER *ObjectManagerForObjectType;
UINT64 v12;
const wchar_t *v13;
_ETHREAD *CurrentThread;
_RTL_BALANCED_LINKS *v15;
_EX_PUSH_LOCK *Parent;
_ETHREAD *v17;
_RTL_BALANCED_LINKS *v18;
VOID **v20;
VOID **v21;
UINT64 *MatchData;
UINT64 NextFlag;
__int64 RestartKey[2];
__int64 v25[14];
v10 = 0;
memset(v25, 0i64, sizeof(v25));
RestartKey[0] = 0i64;
HIDWORD(MatchData) = 0;
NextFlag = (UINT64)v25;
LOBYTE(MatchData) = 0;
ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType((_PNP_OBJECT_TYPE)ObjectType);
LODWORD(v25[3]) = 0;
v12 = (UINT64)ObjectManagerForObjectType;
HIDWORD(v25[3]) = ObjectType;
v13 = L"\\\\?\\";
if( ObjectType != 3 )
v13 = (const wchar_t *)&dword_1407CF120;
v25[2] = (__int64)v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite(v12, 1);
v15 = RtlEnumerateGenericTableLikeADirectory(
(_RTL_AVL_TABLE *)(v12 + 104),
0i64,
0i64,
0i64,
RestartKey,
(char *)&MatchData + 4,
(UINT64)&NextFlag,
v20,
MatchData,
(VOID *)NextFlag);
if( v15 )
{
Parent = (_EX_PUSH_LOCK *)v15->Parent;
_InterlockedIncrement((volatile signed __int32 *)&v15->Parent->LeftChild);
}
else
{
Parent = 0i64;
}
ExReleaseResourceLite((PERESOURCE)v12);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
while( Parent )
{
if( PiDmObjectIsEnumerable(Parent) )
v10 = ((__int64(__fastcall *)(_EX_PUSH_LOCK *, INT64 *, UINT64 **))a2)(Parent, EnumCallback, &MatchData);
if( v10 < 0 || (_BYTE)MatchData )
{
PiDmObjectRelease((_PI_DM_OBJECT *)Parent);
return v10;
}
NextFlag = (UINT64)Parent;
v17 = (_ETHREAD *)KeGetCurrentThread();
--v17->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite(v12, 1);
v18 = RtlEnumerateGenericTableLikeADirectory(
(_RTL_AVL_TABLE *)(v12 + 104),
0i64,
0i64,
(VOID *)1,
RestartKey,
(char *)&MatchData + 4,
(UINT64)&NextFlag,
v21,
MatchData,
(VOID *)NextFlag);
if( v18 )
{
Parent = (_EX_PUSH_LOCK *)v18->Parent;
_InterlockedIncrement((volatile signed __int32 *)&v18->Parent->LeftChild);
}
else
{
Parent = 0i64;
}
ExReleaseResourceLite((PERESOURCE)v12);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
PiDmObjectRelease((_PI_DM_OBJECT *)NextFlag);
}
return v10;
}Referenced by:
PiDmGetObjectList
PiDmListInit
PpDevCfgInit