ExReleaseResourceAndLeaveCriticalRegion
VOID __stdcall ExReleaseResourceAndLeaveCriticalRegion(PERESOURCE Resource){
__int16 v2;
ULONG_PTR v3;
void *v4;
ULONG_PTR v5;
_ETHREAD *v6;
bool v7;
unsigned __int8 CurrentIrql;
_ETHREAD *CurrentThread;
struct _KLOCK_QUEUE_HANDLE LockHandle;
if( (Resource->Flag & 0x41) == 1 )
KeBugCheckEx(0x1C6u, 0xFui64, (ULONG_PTR)Resource, 0i64, 0i64);
v2 = Resource->Flag & 1;
if( v2 )
{
CurrentIrql = KeGetCurrentIrql();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( CurrentIrql > 2u )
KeBugCheckEx(0x1C6u, 0i64, CurrentIrql, 2ui64, 0i64);
if( !CurrentIrql && (*((_DWORD *)CurrentThread + 29) & 0x400) == 0 && !*((_DWORD *)CurrentThread + 121) )
KeBugCheckEx(0x1C6u, 7ui64, 0i64, 0i64, 0i64);
}
if( v2 )
{
ExpFastResourceLegacyRelease(Resource);
}
else
{
v3 = (ULONG_PTR)KeGetCurrentThread();
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, &LockHandle);
if( ExpResourceEnforcesOwnershipTransfer((INT64)Resource) && (v3 & 3) != 3 && v3 != v5 )
KeBugCheckEx(0x16Eu, (ULONG_PTR)Resource, v5, v3, 0i64);
if( (Resource->ReservedLowFlags & 0x80u) == 0 )
ExpReleaseResourceSharedForThreadLite(v4, (PVOID)v3);
else
ExpReleaseResourceExclusiveForThreadLite(v4, (PVOID)v3);
}
v6 = (_ETHREAD *)KeGetCurrentThread();
v7 = (*((_WORD *)v6 + 242))++ == 0xFFFF;
if( v7 && *((_ETHREAD **)v6 + 19) != (_ETHREAD *)((char *)v6 + 152) && !*((_WORD *)v6 + 243) )
KiCheckForKernelApcDelivery();
}Referenced by:
No references.