ExReleaseResourceAndLeaveCriticalRegion
VOID __stdcall ExReleaseResourceAndLeaveCriticalRegion(_ERESOURCE *Resource){
__int16 v2;
_ETHREAD *v3;
void *v4;
_ETHREAD *v5;
_ETHREAD *v6;
bool v7;
unsigned __int8 CurrentIrql;
_ETHREAD *CurrentThread;
_KLOCK_QUEUE_HANDLE LockHandle;
if( (Resource->Flag & 0x41) == 1 )
KeBugCheckEx(0x1C6u, (PVOID)0xF, Resource, 0i64, 0i64);
v2 = Resource->Flag & 1;
if( v2 )
{
CurrentIrql = KeGetCurrentIrql();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( CurrentIrql > 2u )
KeBugCheckEx(0x1C6u, 0i64, (PVOID)CurrentIrql, (PVOID)2, 0i64);
if( !CurrentIrql && (CurrentThread->Tcb._bf_0 & 0x400) == 0 && !CurrentThread->Tcb.WaitBlock[3].SpareLong )
KeBugCheckEx(0x1C6u, (PVOID)7, 0i64, 0i64, 0i64);
}
if( v2 )
{
ExpFastResourceLegacyRelease(Resource);
}
else
{
v3 = (_ETHREAD *)KeGetCurrentThread();
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, &LockHandle);
if( ExpResourceEnforcesOwnershipTransfer((INT64)Resource) && ((unsigned __int8)v3 & 3) != 3 && v3 != v5 )
KeBugCheckEx(0x16Eu, Resource, v5, v3, 0i64);
if( (Resource->ReservedLowFlags & 0x80u) == 0 )
ExpReleaseResourceSharedForThreadLite(v4, v3);
else
ExpReleaseResourceExclusiveForThreadLite(v4, v3);
}
v6 = (_ETHREAD *)KeGetCurrentThread();
v7 = v6->Tcb.KernelApcDisable++ == -1;
if( v7
&& ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v6->Tcb.ApcState.ApcListHead[0].Flink != &v6->Tcb.152
&& !v6->Tcb.SpecialApcDisable )
{
KiCheckForKernelApcDelivery();
}
}Referenced by:
No references.