PsSetProcessWin32Process
INT64 __stdcall PsSetProcessWin32Process(_EPROCESS *Process, PVOID Win32Process, PVOID PrevWin32Process){
_ETHREAD *CurrentThread;
unsigned int v4;
volatile INT64 *v8;
WORK_QUEUE_ITEM *PoolWithTag;
WORK_QUEUE_ITEM *v11;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0;
--*((_WORD *)CurrentThread + 242);
v8 = (volatile INT64 *)((char *)Process + 1080);
ExAcquirePushLockExclusiveEx((UINT64)Process + 1080, 0i64);
if( Win32Process )
{
if( (*((_DWORD *)Process + 281) & 8) != 0 || *((_QWORD *)Process + 161) )
{
v4 = -1073741558;
}
else
{
*((_QWORD *)Process + 161) = Win32Process;
if( ((*((_QWORD *)Process + 302) | (*((_QWORD *)Process + 302) >> 30)) & 0x3FFFFFFFi64) != 0 )
{
PoolWithTag = (WORK_QUEUE_ITEM *)ExAllocatePoolWithTag(PagedPool, 0x28ui64, 0x65446954ui64);
v11 = PoolWithTag;
if( PoolWithTag )
{
ObfReferenceObjectWithTag(Process, 0x624A7350u);
v11[1].List.Flink = (_LIST_ENTRY *)Process;
v11->WorkerRoutine = (void(__fastcall *)(void *))PspTimerDelayWorkerRoutine;
v11->Parameter = v11;
v11->List.Flink = 0i64;
ExQueueWorkItem(v11, NormalWorkQueue);
}
}
}
}
else if( *((PVOID *)Process + 161) == PrevWin32Process )
{
*((_QWORD *)Process + 161) = 0i64;
}
else
{
v4 = -1073741823;
}
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v8);
KeAbPostRelease((PVOID)v8);
KeLeaveCriticalRegionThread((__int64)CurrentThread);
return v4;
}Referenced by:
No references.