ObReferenceFileObjectForWrite
NTSTATUS __stdcall ObReferenceFileObjectForWrite(
PVOID Handle,
INT8 AccessMode,
PVOID *FileObject,
OBJECT_HANDLE_INFORMATION *HandleInformation){
_ETHREAD *CurrentThread;
unsigned __int64 v5;
ULONG_PTR v7;
__int64 v8;
_HANDLE_TABLE *v9;
_HANDLE_TABLE_ENTRY *v10;
_HANDLE_TABLE_ENTRY *v11;
INT64 LowValue;
signed __int64 HighValue;
INT64 v14;
unsigned __int128 v15;
unsigned __int8 v16;
__int64 v17;
bool v18;
struct _DMA_ADAPTER *v19;
unsigned int v20;
int v21;
__int64 v22;
int v23;
unsigned __int64 v24;
int v26;
NTSTATUS v27;
int v28;
int v29[8];
INT64 v30;
INT64 CurrentValue[2];
ULONG_PTR v32;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = 0i64;
v7 = (ULONG_PTR)Handle;
*(_OWORD *)CurrentValue = 0i64;
if( (int)Handle < 0 )
{
if( !AccessMode && Handle != (PVOID)-1i64 && Handle != (PVOID)-2i64 )
{
v9 = (_HANDLE_TABLE *)ObpKernelHandleTable;
v7 = (unsigned __int64)Handle ^ 0xFFFFFFFF80000000ui64;
v32 = ObpKernelHandleTable;
goto LABEL_3;
}
}
else
{
v8 = *((_QWORD *)CurrentThread + 23);
v9 = *(_HANDLE_TABLE **)(v8 + 1392);
v32 = (ULONG_PTR)v9;
if( (*(_DWORD *)(v8 + 1124) & 0x4000000) != 0 )
{
LABEL_3:
--*((_WORD *)CurrentThread + 242);
if( (v7 & 0x3FC) != 0 && (v10 = ExpLookupHandleTableEntry(v9, (_EXHANDLE)v7), (v11 = v10) != 0i64) )
{
_m_prefetchw(v10);
LowValue = v10->LowValue;
HighValue = v11->HighValue;
CurrentValue[1] = HighValue;
CurrentValue[0] = LowValue;
v14 = LowValue;
while( (v14 & 0x1FFFE) != 0 )
{
if( (v14 & 1) != 0 )
{
*(_QWORD *)&v15 = v14;
*((_QWORD *)&v15 + 1) = HighValue;
v16 = _InterlockedCompareExchange128(&v11->VolatileLowValue, HighValue, v14 - 2, (signed __int64 *)&v15);
HighValue = v15 >> 64;
v17 = v15;
v14 = v15;
*(_OWORD *)CurrentValue = v15;
if( v16 )
{
if( (unsigned __int16)((unsigned __int64)v17 >> 1) != 16 )
{
v5 = (v17 >> 16) & 0xFFFFFFFFFFFFFFF0ui64;
goto LABEL_10;
}
CurrentValue[0] = v17 ^ ((unsigned int)v17 ^ (2 * (unsigned int)((unsigned __int64)v17 >> 1) - 2)) & 0x1FFFE;
v5 = (CurrentValue[0] >> 16) & 0xFFFFFFFFFFFFFFF0ui64;
ObpIncrPointerCountEx((volatile INT64 *)v5, 32752i64);
v28 = ExFastReplenishHandleTableEntry(&v11->VolatileLowValue, (unsigned __int64 *)CurrentValue, 32752);
if( v28 )
_InterlockedExchangeAdd64((volatile signed __int64 *)v5, -v28);
LABEL_30:
LODWORD(HighValue) = CurrentValue[1];
v14 = CurrentValue[0];
goto LABEL_10;
}
v9 = (_HANDLE_TABLE *)v32;
}
else
{
ExpBlockOnLockedHandleEntry(v9, v11, v14);
_m_prefetchw(v11);
HighValue = v11->HighValue;
CurrentValue[0] = v11->LowValue;
v14 = CurrentValue[0];
CurrentValue[1] = HighValue;
}
}
if( ExLockHandleTableEntry((__int64)v9, &v11->LowValue) )
{
v5 = (v11->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64;
*(_HANDLE_TABLE_ENTRY *)CurrentValue = *v11;
v26 = ExSlowReplenishHandleTableEntry((unsigned __int64 *)v11);
ObpIncrPointerCountEx((volatile INT64 *)v5, (unsigned int)(v26 + 1));
_InterlockedExchangeAdd64(&v11->VolatileLowValue, 1ui64);
_InterlockedOr(v29, 0);
if( v9->HandleContentionEvent.Value )
{
ExfUnblockPushLock(&v9->HandleContentionEvent, 0i64);
LODWORD(HighValue) = CurrentValue[1];
v14 = CurrentValue[0];
goto LABEL_10;
}
goto LABEL_30;
}
}
else
{
LODWORD(HighValue) = CurrentValue[1];
v14 = CurrentValue[0];
}
if( v7 )
{
ExHandleLogBadReference((ULONG_PTR)v9, v7, *((_BYTE *)KeGetCurrentThread() + 562));
LODWORD(HighValue) = CurrentValue[1];
v14 = CurrentValue[0];
}
v11 = 0i64;
LABEL_10:
v18 = (*((_WORD *)CurrentThread + 242))++ == 0xFFFF;
if( v18
&& *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152)
&& !*((_WORD *)CurrentThread + 243) )
{
KiCheckForKernelApcDelivery();
}
if( !v11 )
{
v27 = -1073741816;
LABEL_36:
*FileObject = 0i64;
return v27;
}
if( ObpTraceFlags )
ObpPushStackInfo(v5, 1, 1i64, 1953261124i64);
v19 = (struct _DMA_ADAPTER *)(v5 + 48);
if( (POBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(v5 + 24) ^ (unsigned __int64)BYTE1(v5)] == IoFileObjectType )
{
v20 = HighValue & 0x1FFFFFF;
v21 = ~(unsigned __int8)(*(_DWORD *)(v5 + 128) >> 5) & 4;
HandleInformation->GrantedAccess = v20;
v22 = (v14 >> 17) & 7;
v23 = v21 | 2;
HandleInformation->HandleAttributes = v22;
if( (v20 & v23) != 0 )
{
if( !AccessMode )
goto LABEL_22;
if( (*(_BYTE *)(v5 + 26) & 0x40) == 0 )
goto LABEL_22;
v24 = v5 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*(_BYTE *)(v5 + 26) & 0x7F));
if( !*(_BYTE *)(*(_QWORD *)v24 + 24i64) )
goto LABEL_22;
if( *(_QWORD *)(*(_QWORD *)v24 + 16i64) != 1i64 )
{
LODWORD(v22) = HandleInformation->HandleAttributes;
LABEL_22:
if( (v22 & 4) == 0
|| !AccessMode
|| (LODWORD(v30) = v23, ObpAuditObjectAccess(v32, (VOID *)v7, &v11->VolatileLowValue, (UINT8 *)v5, v30)) )
{
*FileObject = v19;
return 0;
}
v27 = -1073741816;
goto LABEL_53;
}
v27 = -1073700858;
}
else
{
v27 = -1073741790;
}
}
else
{
v27 = -1073741788;
}
LABEL_53:
HalPutDmaAdapter(v19);
goto LABEL_36;
}
}
return -1073741816;
}Referenced by:
NtWriteFile