ObpReferenceProcessObjectByHandle
NTSTATUS __stdcall ObpReferenceProcessObjectByHandle(
PVOID Handle,
_EPROCESS *Process,
_HANDLE_TABLE *HandleTable,
INT8 AccessMode,
UINT64 Tag,
PVOID *Object,
_OBJECT_HANDLE_INFORMATION *HandleInformation,
_HANDLE_TABLE_ENTRY_INFO *ObjectInfo){
_EXHANDLE v8;
_ETHREAD *CurrentThread;
_HANDLE_TABLE_ENTRY *v12;
_HANDLE_TABLE_ENTRY *v13;
__int64 LowValue;
__int32 bf_0;
_OBJECT_HEADER *v16;
int v17;
_HANDLE_TABLE_ENTRY_INFO v18;
__int64 v19;
unsigned int v20;
NTSTATUS result;
bool v22;
_HANDLE_TABLE_ENTRY_INFO *HandleExtraInfo;
int v24[14];
v8 = (_EXHANDLE)Handle;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*Object = 0i64;
if( (int)Handle >= 0 )
{
LABEL_6:
--CurrentThread->Tcb.KernelApcDisable;
if( (v8._bf_0 & 0x3FC) != 0
&& (v12 = ExpLookupHandleTableEntry(HandleTable, v8), (v13 = v12) != 0i64)
&& ExLockHandleTableEntry(HandleTable, v12) )
{
LowValue = v13->LowValue;
bf_0 = v13->LeafHandleValue.$E5B3C52FE72490EE6A49ADBB8529F30E::_bf_0;
v16 = (_OBJECT_HEADER *)((v13->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
v17 = bf_0 & 0x1FFFFFF;
if( HandleTable->ExtraInfoPages
&& (HandleExtraInfo = ExpGetHandleExtraInfo(HandleTable, v8.GenericHandleOverlay),
LowValue = v13->LowValue,
bf_0 = v13->LeafHandleValue.$E5B3C52FE72490EE6A49ADBB8529F30E::_bf_0,
HandleExtraInfo) )
{
v18 = *HandleExtraInfo;
}
else
{
v18 = 0i64;
}
v19 = (LowValue >> 17) & 7;
*ObjectInfo = v18;
v20 = v19 | 8;
if( (bf_0 & 0x2000000) == 0 )
v20 = v19;
HandleInformation->HandleAttributes = v20;
HandleInformation->GrantedAccess = v17;
ObpIncrPointerCount(v16);
_InterlockedExchangeAdd64(&v13->VolatileLowValue, 1ui64);
_InterlockedOr(v24, 0);
if( HandleTable->HandleContentionEvent._bf_0 )
ExfUnblockPushLock(&HandleTable->HandleContentionEvent._bf_0, 0i64);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
if( ObpTraceFlags )
ObpPushStackInfo(v16, 1u, 1ui64, (unsigned int)Tag);
*Object = &v16->Body;
return 0;
}
else
{
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
return -1073741816;
}
}
if( Handle == (PVOID)-1i64 )
{
v22 = ObpTraceFlags == 0;
HandleInformation->GrantedAccess = 0x1FFFFF;
HandleInformation->HandleAttributes = 0;
*ObjectInfo = 0i64;
if( !v22 )
ObpPushStackInfo((_OBJECT_HEADER *)&Process[-1].DynamicEnforcedCetCompatibleRanges, 1u, 1ui64, (unsigned int)Tag);
ObpIncrPointerCount((_OBJECT_HEADER *)&Process[-1].DynamicEnforcedCetCompatibleRanges);
result = 0;
*Object = Process;
}
else
{
if( Handle != (PVOID)-2i64 )
{
if( AccessMode )
return -1073741816;
HandleTable = ::HandleTable;
v8 = (_EXHANDLE)((unsigned __int64)Handle ^ 0xFFFFFFFF80000000ui64);
goto LABEL_6;
}
v22 = ObpTraceFlags == 0;
HandleInformation->GrantedAccess = 0x1FFFFF;
HandleInformation->HandleAttributes = 0;
*ObjectInfo = 0i64;
if( !v22 )
ObpPushStackInfo(
(_OBJECT_HEADER *)(&CurrentThread[-1].LockEntries[5].CpuPriorityKey + 8),
1u,
1ui64,
(unsigned int)Tag);
ObpIncrPointerCount((_OBJECT_HEADER *)(&CurrentThread[-1].LockEntries[5].CpuPriorityKey + 8));
result = 0;
*Object = CurrentThread;
}
return result;
}Referenced by:
ObCaptureObjectStateForDuplication