PspWow64InitThread
NTSTATUS __stdcall PspWow64InitThread(PVOID BugCheckParameter1){
__int64 v1;
_QWORD *v2;
__int64 v3;
_QWORD *v4;
__int64 v5;
NTSTATUS v7;
__int64 v8;
unsigned __int16 v9;
unsigned int v10;
__int64 v11;
INT64 v12;
unsigned __int16 ProcessNtdllType;
INT64 a5;
UINT64 a6;
_DWORD *v16;
INT64 a4;
int v19;
_DWORD *v20;
__int64 v21;
_KAPC_STATE ApcState;
v21 = v3;
v4 = v2;
v5 = v1;
memset(&ApcState, 0, sizeof(ApcState));
v7 = 0;
LODWORD(a4) = 0;
v8 = *((_QWORD *)BugCheckParameter1 + 176);
if( !v8 || (v9 = *(_WORD *)(v8 + 8)) == 0 )
v9 = -31132;
v10 = RtlpArchContextFlagFromMachine(v9);
if( !v10 )
return -1073741811;
RtlpGetLegacyContextLength(v10, 0i64, (UINT64 *)&a4);
v20 = *(_DWORD **)(v5 + 16);
v11 = ~((unsigned int)a4 - 1i64) & ((unsigned __int64)v20 + (unsigned int)a4 + 3);
a4 = *(_QWORD *)(v5 + 40);
v12 = v4[31];
if( v12 == PspUserThreadStart )
{
ProcessNtdllType = PsWow64GetProcessNtdllType((INT64)BugCheckParameter1);
v12 = *((_QWORD *)PspWow64GetSharedInformation(ProcessNtdllType) + 4);
}
a5 = v4[16];
a6 = v4[17];
KiStackAttachProcess((_KPROCESS *)BugCheckParameter1, 0i64, &ApcState);
v16 = v20;
*(_QWORD *)(v21 + 5256) = v20;
*v16 = v9 << 16;
switch( v9 )
{
case 0x14Cu:
PspWow64InitThreadGuestx86((__int64)BugCheckParameter1, (_DWORD *)v11, v12, a4, a5, a6);
break;
case 0x1C4u:
PspWow64InitThreadGuestArm((INT64)BugCheckParameter1, (_DWORD *)v11, v12, a4, a5, a6);
break;
case 0x8664u:
memset(v11, 0i64);
*(_QWORD *)(v11 + 152) = a4;
*(_QWORD *)(v11 + 248) = v12;
*(_QWORD *)(v11 + 128) = a5;
*(_QWORD *)(v11 + 136) = a6;
*(_DWORD *)(v11 + 48) = 1048607;
break;
default:
v7 = -1073741811;
v19 = -1073741811;
break;
}
KiUnstackDetachProcess(&ApcState, 0i64);
return v7;
}Referenced by:
PspAllocateThread