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