PspWriteTebIdealProcessor
void __fastcall PspWriteTebIdealProcessor(__int64 a1, __int64 a2){
__int64 v4;
struct _PROCESSOR_NUMBER *v5;
__int64 v6;
__int64 v7;
__int64 v8;
char v9;
char v10;
struct _PROCESSOR_NUMBER *v11;
struct _PROCESSOR_NUMBER *i;
struct _PROCESSOR_NUMBER v13;
__int64 v14;
int v15[8];
char v16;
char v17;
struct _PROCESSOR_NUMBER ProcNumber;
struct _PROCESSOR_NUMBER v19;
struct _PROCESSOR_NUMBER *v20;
__int64 v21;
__int64 v22;
struct _PROCESSOR_NUMBER *p_ProcNumber;
__int64 v24;
__int64 v25;
_KAPC_STATE ApcState;
v25 = a2;
memset(&ApcState, 0, sizeof(ApcState));
ProcNumber = 0;
v19 = 0;
v4 = 0i64;
v21 = 0i64;
v5 = 0i64;
v22 = 0i64;
v6 = *(_QWORD *)(a2 + 240);
v20 = (struct _PROCESSOR_NUMBER *)v6;
v24 = v6;
v7 = *(_QWORD *)(a2 + 544);
p_ProcNumber = &ProcNumber;
v8 = *(_QWORD *)(v7 + 1408);
if( v8 )
{
v14 = v6 + 0x2000;
if( *(_WORD *)(v8 + 8) == 0x8664 )
{
v5 = (struct _PROCESSOR_NUMBER *)v14;
v22 = v14;
}
else
{
v4 = v14;
v21 = v14;
}
}
v9 = 0;
v17 = 0;
if( a2 != a1 )
{
if( !ExAcquireRundownProtection((PEX_RUNDOWN_REF)(a2 + 1272)) )
return;
v9 = 1;
v17 = 1;
}
v10 = 0;
v16 = 0;
if( v7 != *(_QWORD *)(a1 + 184) )
{
KiStackAttachProcess((_KPROCESS *)v7, 0i64, &ApcState);
v10 = 1;
v16 = 1;
}
KeGetProcessorNumberFromIndex(*(_DWORD *)(a2 + 196), &ProcNumber);
v11 = v20;
for( i = p_ProcNumber; ; *i = v19 )
{
ProcNumber.Reserved = ProcNumber.Number;
v13 = ProcNumber;
v11[1489] = ProcNumber;
if( v5 )
v5[1489] = v13;
if( v4 )
{
LOWORD(v20) = v13.Group;
BYTE2(v20) = v13.Number & 0x1F;
BYTE3(v20) = v13.Reserved & 0x1F;
*(_DWORD *)(v4 + 3956) = (_DWORD)v20;
}
_InterlockedOr(v15, 0);
KeGetProcessorNumberFromIndex(*(_DWORD *)(a2 + 196), &v19);
if( v19.Group == ProcNumber.Group && v19.Number == ProcNumber.Number )
break;
}
if( v10 )
KiUnstackDetachProcess(&ApcState, 0i64);
if( v9 )
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(a2 + 1272));
}Referenced by:
NtSetInformationThread
PspUserThreadStartup