PiPnpRtlEnsureObjectCached
NTSTATUS __stdcall PiPnpRtlEnsureObjectCached(WCHAR *ObjectName){
WCHAR *v1;
WCHAR *v2;
NTSTATUS v3;
int v4;
_ETHREAD *CurrentThread;
_PI_DM_OBJECT *v6;
_ETHREAD *v7;
NTSTATUS v8;
_PI_PNPRTL_OBJECT_EVENT *a4;
_PI_DM_OBJECT *Object;
HPNPOPCTX *hPnpOpCtx;
Object = 0i64;
hPnpOpCtx = 0i64;
a4 = 0i64;
v2 = v1;
v3 = PiDmGetObject(1, v1, &Object);
v4 = v3;
if( v3 < 0 )
{
if( v3 == -1073741772 )
{
v4 = PiDmAddCacheReferenceForObject(1, v2, &Object);
if( v4 >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v6 = Object;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object, 0i64);
v6[8] |= 1u;
ExReleasePushLockEx((ULONG_PTR)v6, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( PiPnpRtlBeginOperation(&hPnpOpCtx) >= 0 )
{
v7 = (_ETHREAD *)KeGetCurrentThread();
--v7->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 3456, 1);
v8 = PiPnpRtlObjectEventCreate(v2, 1, hPnpOpCtx, &a4);
ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 3456));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v8 >= 0 && a4 )
a4[1] |= 1u;
PiPnpRtlEndOperation(hPnpOpCtx);
}
}
}
}
else
{
v4 = 0;
}
if( Object )
PiDmObjectRelease(Object);
return v4;
}Referenced by:
PiCMCreateDevice