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