ObQueryObjectAuditingByHandle
NTSTATUS __stdcall ObQueryObjectAuditingByHandle(VOID *Handle, UINT8 *GenerateOnClose){
_ETHREAD *CurrentThread;
unsigned __int64 v4;
char v5;
_EPROCESS *Process;
VOID *v7;
INT64 v8;
_HANDLE_TABLE *ObjectTable;
_HANDLE_TABLE_ENTRY *v10;
__int64 v11;
NTSTATUS v12;
int v14[8];
const VOID *v15;
INT64 v16;
PVOID v17;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = (unsigned __int64)Handle;
v5 = 0;
Process = CurrentThread->Tcb.ApcState.Process;
if( ObpIsKernelHandle(Handle, CurrentThread->Tcb.PreviousMode) )
{
ObjectTable = HandleTable;
v4 ^= 0xFFFFFFFF80000000ui64;
}
else if( KeGetCurrentThread()->ApcStateIndex == 1 )
{
ObjectTable = ObReferenceProcessHandleTable(Process);
if( !ObjectTable )
return -1073741816;
v5 = 1;
}
else
{
ObjectTable = Process->ObjectTable;
}
--CurrentThread->Tcb.KernelApcDisable;
v10 = ExMapHandleToPointer(ObjectTable, (VOID *)v4, v7, v8, v15, v16, v17);
if( v10 )
{
v11 = v10->LowValue >> 17;
_InterlockedExchangeAdd64(&v10->VolatileLowValue, 1ui64);
_InterlockedOr(v14, 0);
if( ObjectTable->HandleContentionEvent._bf_0 )
ExfUnblockPushLock(&ObjectTable->HandleContentionEvent._bf_0, 0i64);
*GenerateOnClose = (v11 & 4) != 0;
v12 = 0;
}
else
{
v12 = -1073741816;
}
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
if( v5 )
ExReleaseRundownProtection(&Process->RundownProtect);
return v12;
}Referenced by:
No references.