ObHandleRevocationBlockAddObject
NTSTATUS __stdcall ObHandleRevocationBlockAddObject(_OB_HANDLE_REVOCATION_BLOCK *RevocationBlock, VOID *Object){
char v3;
_HANDLE_REVOCATION_INFO *v4;
UINT8 v5;
_ETHREAD *CurrentThread;
UINT8 v7;
_LIST_ENTRY *Blink;
NTSTATUS result;
v3 = 0;
v4 = OBJECT_HEADER_TO_HANDLE_REVOCATION_INFO((_OBJECT_HEADER *)((char *)Object - 48));
v5 = ExAcquireRundownProtection(&RevocationBlock->Rundown);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = v5;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&RevocationBlock->Lock, 0i64);
if( !_InterlockedCompareExchange64(
(volatile signed __int64 *)&v4->RevocationBlock,
(signed __int64)RevocationBlock,
0i64) )
{
Blink = RevocationBlock->RevocationInfos.Blink;
if( (_OB_HANDLE_REVOCATION_BLOCK *)Blink->Flink != RevocationBlock )
__fastfail(3u);
v4->ListEntry.Flink = &RevocationBlock->RevocationInfos;
v3 = 1;
v4->ListEntry.Blink = Blink;
Blink->Flink = &v4->ListEntry;
RevocationBlock->RevocationInfos.Blink = &v4->ListEntry;
}
ExReleasePushLockEx((_DWORD)RevocationBlock + 16, 0);
KeLeaveCriticalRegion();
if( v7 )
{
if( !v3 )
ExReleaseRundownProtection(&RevocationBlock->Rundown);
}
return result;
}Referenced by:
ObpCreateHandle