KeSetSystemServiceCallback
NTSTATUS __stdcall KeSetSystemServiceCallback(_BYTE *a1, CHAR a2, INT64 a3, INT64 a4){
NTSTATUS v4;
__int64 v9;
__int64 v10;
unsigned int v11;
__int64 v12;
_DWORD *i;
__int64 v14;
_ETHREAD *CurrentThread;
unsigned __int64 v16;
char v17;
char v18;
signed __int32 v20[14];
v4 = 0;
if( a3 && a3 != *(__int64 *)((char *)&KiDynamicTraceCallouts[3] + (-(__int64)(a2 != 0) & 0xFFFFFFFFFFFFFFF8ui64)) )
return -1073741790;
LODWORD(v9) = KiGetSystemServiceTraceTable();
v10 = v9;
if( !v9 )
return -1073741670;
v11 = 0;
while( *a1 )
{
v11 = ((1025 * (v11 + (char)*a1)) >> 6) ^ (1025 * (v11 + (char)*a1));
++a1;
}
v12 = 0i64;
for( i = (_DWORD *)(v10 + 52); v11 != *i; i += 16 )
{
v12 = (unsigned int)(v12 + 1);
if( (unsigned int)v12 >= 0x1D7 )
return -1073741275;
}
v14 = (v12 << 6) + v10 + 16;
if( !v14 )
return -1073741275;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&KiSystemServiceTraceCallbackLock, 0i64);
v16 = -(__int64)(a2 != 0) & 0xFFFFFFFFFFFFFFF8ui64;
v17 = -a2;
v18 = *(_BYTE *)(v14 - (v17 != 0) + 41);
if( a3 )
{
if( v18 )
{
v4 = -1073740008;
}
else
{
*(_QWORD *)(v16 + v14 + 56) = a4;
_InterlockedOr(v20, 0);
*(_BYTE *)(v14 - (v17 != 0) + 41) = 1;
if( ++KiSystemServiceTraceCallbackCount == 1 )
_InterlockedOr(&KiDynamicTraceMask, 1u);
}
}
else if( v18 )
{
if( !--KiSystemServiceTraceCallbackCount )
_InterlockedAnd(&KiDynamicTraceMask, 0xFFFFFFFE);
*(_BYTE *)(v14 - (v17 != 0) + 41) = 0;
_InterlockedOr(v20, 0);
while( KiSystemServiceTraceCallbacksActive )
_mm_pause();
*(_QWORD *)(v16 + v14 + 56) = 0i64;
}
if( (_InterlockedExchangeAdd64(&KiSystemServiceTraceCallbackLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&KiSystemServiceTraceCallbackLock);
KeAbPostRelease(&KiSystemServiceTraceCallbackLock);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v4;
}Referenced by:
No references.