PiDmListRemoveList
VOID __stdcall PiDmListRemoveList(
_PI_DM_OBJECT *ConstraintObjectToRemoveFrom,
_PI_DM_OBJECT *ConstraintObjectToEnumFrom){
_EX_PUSH_LOCK *v2;
_EX_PUSH_LOCK *v3;
_PI_DM_OBJECT_MANAGER *ObjectManagerForObjectType;
unsigned __int64 v6;
_ETHREAD *CurrentThread;
_PI_DM_OBJECT_MANAGER *v8;
_EX_PUSH_LOCK **v9;
_ETHREAD *v10;
_EX_PUSH_LOCK *i;
ULONG_PTR v12;
_ETHREAD *v13;
_ETHREAD *v14;
v3 = v2;
ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType((_PNP_OBJECT_TYPE)ConstraintObjectToEnumFrom[7]);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v8 = ObjectManagerForObjectType;
v9 = (_EX_PUSH_LOCK **)(v6 + 88);
if( (unsigned __int64)ConstraintObjectToEnumFrom >= v6 )
{
--CurrentThread->Tcb.KernelApcDisable;
if( (unsigned __int64)ConstraintObjectToEnumFrom > v6 )
{
ExAcquirePushLockSharedEx(v3, 0i64);
v14 = (_ETHREAD *)KeGetCurrentThread();
--v14->Tcb.KernelApcDisable;
}
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ConstraintObjectToEnumFrom, 0i64);
}
else
{
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ConstraintObjectToEnumFrom, 0i64);
v10 = (_ETHREAD *)KeGetCurrentThread();
--v10->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx(v3, 0i64);
}
for( i = *v9; i != (_EX_PUSH_LOCK *)v9; i = (_EX_PUSH_LOCK *)i->_bf_0 )
{
v13 = (_ETHREAD *)KeGetCurrentThread();
--v13->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx(i - 8, 0i64);
PiDmListRemoveObjectWorker(2i64, v8, ConstraintObjectToEnumFrom, &i[-8], 0i64);
ExReleasePushLockEx((_DWORD)i - 64, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
if( ConstraintObjectToEnumFrom >= (_PI_DM_OBJECT *)v3 )
{
if( ConstraintObjectToEnumFrom > (_PI_DM_OBJECT *)v3 )
{
ExReleasePushLockEx((ULONG_PTR)ConstraintObjectToEnumFrom, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v12 = (unsigned int)v3;
goto LABEL_8;
}
}
else
{
ExReleasePushLockEx((ULONG_PTR)v3, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
v12 = (unsigned int)ConstraintObjectToEnumFrom;
LABEL_8:
ExReleasePushLockEx(v12, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}Referenced by:
PiPnpRtlCmActionCallback