PspRevertContainerImpersonation
__int64 __fastcall PspRevertContainerImpersonation(ULONG_PTR BugCheckParameter1){
_ETHREAD *v1;
UINT8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
struct _KPRCB *v6;
__int64 v7;
UINT64 SpinCount;
v1 = *(_ETHREAD **)(BugCheckParameter1 + 1472);
if( !v1 )
return 3221225473i64;
if( (*(_DWORD *)(BugCheckParameter1 + 120) & 0x200) != 0 )
{
KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
_disable();
KiUpdateTotalCyclesCurrentThread((__int64)CurrentPrcb, BugCheckParameter1, 0i64);
_enable();
v6 = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)CurrentPrcb + 6) );
v7 = *((_QWORD *)v6 + 4247);
if( v7 )
{
if( *((_BYTE *)v6 + 32) <= 1u )
++*(_DWORD *)(v7 + 24);
}
}
_interlockedbittestandreset((volatile signed __int32 *)BugCheckParameter1, 0x12u);
*(_QWORD *)(BugCheckParameter1 + 104) = 0i64;
_interlockedbittestandreset((volatile signed __int32 *)(BugCheckParameter1 + 120), 9u);
_InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
__writecr8(0i64);
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
ExpAcquireSpinLockExclusive((INT64 *)PspThreadWorkOnBehalfLock, CurrentIrql);
*(_QWORD *)(BugCheckParameter1 + 1472) = 0i64;
KeClearSystemPriority((PVOID)BugCheckParameter1);
*(_DWORD *)PspThreadWorkOnBehalfLock = 0;
__writecr8(CurrentIrql);
EtwTraceThreadWorkOnBehalfUpdate(v1, 0i64);
ObDereferenceObjectDeferDeleteWithTag(v1, 0x746E6F43ui64);
return 0i64;
}Referenced by:
IopProcessWorkItem
NtRevertContainerImpersonation
NtSetInformationThread
PsImpersonateContainerOfThread
PspExitThread