ObpHandleRevocationBlockRemoveInsertedObject
VOID __stdcall ObpHandleRevocationBlockRemoveInsertedObject(
_HANDLE_REVOCATION_INFO *RevocationInfo,
_OB_HANDLE_REVOCATION_BLOCK *RevocationBlock,
UINT64 NewState,
UINT8 RevocationBlockLocked){
_ETHREAD *CurrentThread;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
if( RevocationBlock == (_OB_HANDLE_REVOCATION_BLOCK *)_InterlockedCompareExchange64(
(volatile signed __int64 *)&RevocationInfo->RevocationBlock,
2i64,
(signed __int64)RevocationBlock) )
{
if( !RevocationBlockLocked )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&RevocationBlock->Lock, 0i64);
}
Flink = RevocationInfo->ListEntry.Flink;
if( (_HANDLE_REVOCATION_INFO *)RevocationInfo->ListEntry.Flink->Blink != RevocationInfo
|| (Blink = RevocationInfo->ListEntry.Blink, (_HANDLE_REVOCATION_INFO *)Blink->Flink != RevocationInfo) )
{
__fastfail(3u);
}
Blink->Flink = Flink;
Flink->Blink = Blink;
if( !RevocationBlockLocked )
{
ExReleasePushLockEx((_DWORD)RevocationBlock + 16, 0);
KeLeaveCriticalRegion();
}
ExReleaseRundownProtection(&RevocationBlock->Rundown);
RevocationInfo->RevocationBlock = (_OB_HANDLE_REVOCATION_BLOCK *)NewState;
}
}Referenced by:
ObDestroyHandleRevocationBlock
ObRevokeHandles
ObpHandleRevocationBlockRemoveObject