ObpStopRuntimeStackTrace
NTSTATUS __stdcall ObpStopRuntimeStackTrace(){
_ETHREAD *CurrentThread;
wchar_t *Buffer;
unsigned int v2;
_STACK_TABLE *v3;
_OBJECT_REF_INFO **v4;
_SINGLE_LIST_ENTRY *v5;
_SINGLE_LIST_ENTRY *v6;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Buffer = 0i64;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&stru_140C25A40, 0i64);
if( (ObpTraceFlags & 2) != 0 )
{
if( (ObpTraceFlags & 0x10) != 0 )
memset(dword_140C25940, 0i64, 0x40u);
if( (ObpTraceFlags & 0x20) != 0 )
{
Buffer = stru_140C259D0.Buffer;
RtlInitUnicodeStringEx(&stru_140C259D0, 0i64);
}
dword_140C259F8 = 0;
v2 = dword_140C259FC | ObpTraceFlags & 0xFFFFFF8C;
ObpTraceFlags = v2;
if( (v2 & 1) != 0 )
{
qword_140C259F0 = (unsigned __int64)&unk_140C25980 & -(__int64)((v2 & 0x10) != 0);
qword_140C259C0 = (PCUNICODE_STRING)((unsigned __int64)&qword_140C259E0 & -(__int64)((v2 & 0x20) != 0));
if( (_InterlockedExchangeAdd64(&stru_140C25A40._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C25A40);
KeAbPostRelease(&stru_140C25A40);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
else
{
qword_140C259F0 = 0i64;
qword_140C259C0 = 0i64;
dword_140C25A10 = 0;
dword_140C25A14 = 0;
v3 = (_STACK_TABLE *)StackTable;
v4 = (_OBJECT_REF_INFO **)ObjectTable;
ObpTraceFlags = v2 & 0xFFFFFF8C;
RtlpInterlockedFlushSList();
StackTable = 0i64;
v6 = v5;
ObjectTable = 0i64;
if( (_InterlockedExchangeAdd64(&stru_140C25A40._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C25A40);
KeAbPostRelease(&stru_140C25A40);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
ObpDestroyStackAndObjectTables(v3, v4, v6);
}
if( Buffer )
ExFreePoolWithTag(Buffer, 0x7452624Fu);
}
else
{
if( (_InterlockedExchangeAdd64(&stru_140C25A40._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C25A40);
KeAbPostRelease(&stru_140C25A40);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
return 0;
}Referenced by:
ObSetRefTraceInformation