ObCheckRefTraceProcess
NTSTATUS __fastcall ObCheckRefTraceProcess(__int64 a1){
NTSTATUS result;
const char *ProcessImageFileName;
INT8 v4;
_ETHREAD *CurrentThread;
struct _STRING DestinationString;
UNICODE_STRING String1;
DestinationString = 0i64;
String1 = 0i64;
if( (ObpTraceFlags & 0x20) == 0 )
return 0;
ProcessImageFileName = (const char *)PsGetProcessImageFileName(a1);
RtlInitAnsiString(&DestinationString, ProcessImageFileName, v4);
if( !DestinationString.Length )
return 0;
result = RtlAnsiStringToUnicodeString(&String1, &DestinationString, 1u);
if( result >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)&ObpStackTraceLock, 0i64);
if( (ObpTraceFlags & 0x20) != 0 && (unsigned __int8)RtlPrefixUnicodeString(&String1, (INT64 *)ObpTraceProcessName) )
_InterlockedOr((volatile signed __int32 *)(a1 + 1120), 0x200u);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&ObpStackTraceLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&ObpStackTraceLock);
KeAbPostRelease(&ObpStackTraceLock);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
RtlFreeAnsiString(&String1);
return 0;
}
return result;
}Referenced by:
No references.