PsSetProcessFaultInformation
INT64 __fastcall PsSetProcessFaultInformation(INT64 a1, INT64 *rdx0){
int v4;
volatile signed __int64 *v5;
_ETHREAD *v6;
void(__fastcall **ExtensionTable)(INT64, struct _KTHREAD *, INT64 *);
signed __int32 v9;
signed __int32 v10;
_ETHREAD *CurrentThread;
_ETHREAD *v12;
int a2;
int v14;
if( (*(_DWORD *)rdx0 & 1) != 0 )
{
_m_prefetchw((const void *)(a1 + 2172));
v9 = *(_DWORD *)(a1 + 2172);
do
{
v10 = v9;
v9 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 2172), v9 | 4, v9);
}
while( v10 != v9 );
if( (v9 & 4) == 0 )
{
if( dword_140C0EE84 < KUSER_SHARED_DATA.TelemetryCoverageRound )
{
if( !dword_140C0EE80 )
dword_140C0EE80 = TelemetryCoverageStringHashInternal((_BYTE *)off_140C0EE78, &a2);
EtwTelemetryCoverageReport((INT64)&off_140C0EE78);
}
PspRecordCrashedProcessIntoBlackbox(a1);
PsSetProcessTelemetryAppState((_QWORD *)a1, 4);
}
}
v4 = *(_DWORD *)rdx0;
if( (*(_DWORD *)rdx0 & 2) != 0 )
{
if( dword_140C0EE6C < KUSER_SHARED_DATA.TelemetryCoverageRound )
{
if( !dword_140C0EE68 )
dword_140C0EE68 = TelemetryCoverageStringHashInternal((_BYTE *)off_140C0EE60, &v14);
EtwTelemetryCoverageReport((INT64)&off_140C0EE60);
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v5 = (volatile signed __int64 *)(a1 + 1080);
ExAcquirePushLockExclusiveEx(a1 + 1080, 0i64);
if( (*(_BYTE *)(a1 + 2171) & 7) != 7 )
*(_BYTE *)(a1 + 2171) ^= (*(_BYTE *)(a1 + 2171) ^ (*(_BYTE *)(a1 + 2171) + 1)) & 7;
if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 1080));
KeAbPostRelease((PVOID)(a1 + 1080));
KeLeaveCriticalRegionThread((__int64)CurrentThread);
v4 = *(_DWORD *)rdx0;
}
else
{
v5 = (volatile signed __int64 *)(a1 + 1080);
}
if( (v4 & 4) != 0 )
{
v6 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v6 + 242);
ExAcquirePushLockExclusiveEx((UINT64)v5, 0i64);
if( (*(_BYTE *)(a1 + 2171) & 0x38u) < 0x38 )
*(_BYTE *)(a1 + 2171) ^= (*(_BYTE *)(a1 + 2171) ^ (*(_BYTE *)(a1 + 2171) + 8)) & 0x38;
if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v5);
KeAbPostRelease((PVOID)v5);
KeLeaveCriticalRegionThread((__int64)v6);
v4 = *(_DWORD *)rdx0;
}
if( (v4 & 8) != 0 )
{
v12 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v12 + 242);
ExAcquirePushLockExclusiveEx((UINT64)v5, 0i64);
*(_BYTE *)(a1 + 2171) |= 0x40u;
if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v5);
KeAbPostRelease((PVOID)v5);
KeLeaveCriticalRegionThread((__int64)v12);
}
ExtensionTable = (void(__fastcall **)(INT64, struct _KTHREAD *, INT64 *))ExGetExtensionTable(PspHwTraceExtensionHost);
if( ExtensionTable )
{
(*ExtensionTable)(a1, KeGetCurrentThread(), rdx0);
ExReleaseExtensionTable(PspHwTraceExtensionHost);
}
return 0i64;
}Referenced by:
DbgkForwardException
NtSetInformationProcess