PiPnpRtlBeginOperation
NTSTATUS __stdcall PiPnpRtlBeginOperation(HPNPOPCTX **hPnpOpCtx){
_ETHREAD *CurrentThread;
NTSTATUS CurrentOperation;
NTSTATUS v4;
HPNPOPCTX *v5;
VOID **PoolWithTag;
VOID **v7;
_ETHREAD *v8;
INT64 v9;
__int64 v10;
_QWORD *v11;
VOID *FreeRoutine;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*hPnpOpCtx = 0i64;
FreeRoutine = 0i64;
CurrentOperation = PiPnpRtlGetCurrentOperation((PI_PNPRTL_OPERATION **)&FreeRoutine);
v4 = CurrentOperation;
if( CurrentOperation == -1073741275 )
{
v4 = 0;
}
else if( CurrentOperation < 0 )
{
return v4;
}
v5 = (HPNPOPCTX *)FreeRoutine;
if( FreeRoutine )
{
++*((_DWORD *)FreeRoutine + 36);
}
else
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x98ui64, 1097887312i64);
FreeRoutine = PoolWithTag;
v7 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
*((_DWORD *)PoolWithTag + 36) = 1;
PoolWithTag[2] = CurrentThread;
RtlInitializeGenericTableAvl(
(PRTL_AVL_TABLE)(PoolWithTag + 3),
(PRTL_AVL_COMPARE_ROUTINE)PiPnpRtlObjectEventCompareObjects,
(PRTL_AVL_ALLOCATE_ROUTINE)PiPnpRtlOperationAllocateGenericTableEntry,
(PRTL_AVL_FREE_ROUTINE)PiPnpRtlOperationFreeGenericTableEntry,
0i64);
v7[17] = v7 + 16;
v7[16] = v7 + 16;
v8 = (_ETHREAD *)KeGetCurrentThread();
--v8->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 3584, 1, v9);
v10 = *(&PnpReplaceEvent + 428);
if( *(_UNKNOWN **)(*(&PnpReplaceEvent + 428) + 8i64) != (_UNKNOWN *)((char *)&PnpReplaceEvent + 3424) )
__fastfail(3u);
v11 = FreeRoutine;
*(_QWORD *)FreeRoutine = *(&PnpReplaceEvent + 428);
v11[1] = (char *)&PnpReplaceEvent + 3424;
*(_QWORD *)(v10 + 8) = v11;
*(&PnpReplaceEvent + 428) = v11;
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 3584));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v5 = (HPNPOPCTX *)FreeRoutine;
}
*hPnpOpCtx = v5;
return v4;
}Referenced by:
IoReportDetectedDevice
IoReportRootDevice
IopRegisterDeviceInterface
IopRemoveDevice
PiCMCreateDevice
PiCMDeleteClassKey
PiCMDeleteDevice
PiCMDeleteObject
PiDcHandleCustomDeviceEvent
PiDcUpdateDeviceContainerMembership
PiDqActionDataGetChangedProperties
PiDqActionDataGetRequestedProperties
PiDqIrpPropertySet
PiDqQueryEvaluateFilter
PiInitializeDevice
PiPnpRtlEnsureObjectCached
PiPnpRtlObjectEventWorker
PiProcessAddBootDevices
PiProcessClearDeviceProblem
PiProcessNewDeviceNode
PiProcessQueryDeviceState
PiProcessSetDeviceProblem
PiSwPropertySet
PipClearDevNodeProblem
PipEnumerateCompleted
PipMergeDependencyEdgeList
PipProcessStartPhase3
PipSetDevNodeProblem
PnpNewDeviceNodeDependencyCheck
PnpProcessTargetDeviceEvent
PnpUnlinkDeviceRemovalRelations
PpDevCfgProcessDevices