KiInitializeContextThread
unsigned __int64 __fastcall KiInitializeContextThread(INT64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5){
__int64 v5;
unsigned __int64 v7;
_QWORD *v8;
char *v9;
__int64 v10;
_OWORD *v11;
_CONTEXT *p_ContextRecord;
__int128 v13;
__int128 v14;
__int128 v15;
__int128 v16;
__int128 v17;
__int128 v18;
__int128 v19;
unsigned __int64 v20;
__int128 v21;
__int64 *v22;
unsigned __int64 v23;
__int128 v24;
__int128 v25;
__int128 v26;
CHAR v27;
char v28;
unsigned __int64 result;
unsigned __int64 v30;
char *ExtendedFeature2;
_KPROCESSOR_MODE PreviousMode;
_CONTEXT ContextRecord;
v5 = *(_QWORD *)(a1 + 40);
v7 = (v5 - (unsigned int)KiXSaveAreaLength) & 0xFFFFFFFFFFFFFFC0ui64;
v8 = (_QWORD *)(v7 - 48);
memset((VOID *)(v7 - 48), 0i64, v5 - (v7 - 48));
*v8 = v5;
v9 = 0i64;
v8[1] = v5 - (unsigned int)KeKernelStackSize;
*(_DWORD *)(v7 + 24) = 8064;
if( a5 )
{
v10 = 9i64;
v11 = (_OWORD *)a5;
p_ContextRecord = &ContextRecord;
do
{
v13 = v11[1];
*(_OWORD *)&p_ContextRecord->P1Home = *v11;
v14 = v11[2];
*(_OWORD *)&p_ContextRecord->P3Home = v13;
v15 = v11[3];
*(_OWORD *)&p_ContextRecord->P5Home = v14;
v16 = v11[4];
*(_OWORD *)&p_ContextRecord->ContextFlags = v15;
v17 = v11[5];
*(_OWORD *)&p_ContextRecord->SegGs = v16;
v18 = v11[6];
*(_OWORD *)&p_ContextRecord->Dr1 = v17;
v19 = v11[7];
v11 += 8;
*(_OWORD *)&p_ContextRecord->Dr3 = v18;
p_ContextRecord = (_CONTEXT *)((char *)p_ContextRecord + 128);
*(_OWORD *)&p_ContextRecord[-1].LastExceptionToRip = v19;
--v10;
}
while( v10 );
v20 = v7 - 448;
v21 = v11[1];
v22 = (__int64 *)(v7 - 768);
*(_OWORD *)&p_ContextRecord->P1Home = *v11;
v23 = v7 - 832;
v24 = v11[2];
*(_OWORD *)&p_ContextRecord->P3Home = v21;
v25 = v11[3];
*(_OWORD *)&p_ContextRecord->P5Home = v24;
v26 = v11[4];
*(_OWORD *)&p_ContextRecord->ContextFlags = v25;
*(_OWORD *)&p_ContextRecord->SegGs = v26;
ContextRecord.ContextFlags = ContextRecord.ContextFlags & 6 | 0x100001;
ContextRecord.SegCs = 51;
ContextRecord.SegSs = 43;
memset((VOID *)(v7 - 768), 0i64, 0x140u);
memset((VOID *)(v7 - 448), 0i64, 0x190u);
*(_BYTE *)(v20 + 43) = 1;
LOBYTE(PreviousMode) = 1;
KxContextToKframes(
(PKTRAP_FRAME)(v7 - 448),
(PKEXCEPTION_FRAME)(v7 - 768),
&ContextRecord,
ContextRecord.ContextFlags,
PreviousMode);
*v22 = a4;
v22[1] = a3;
v22[2] = a2;
v22[39] = (__int64)KiStartUserThreadReturn;
*(_QWORD *)(v7 - 832 + 56) = KiStartUserThread;
*(_WORD *)v7 = 639;
*(_DWORD *)(v20 + 44) = 8064;
if( ((unsigned __int64)KeFeatureBits & 0x800000) != 0 )
*(_QWORD *)(v7 + 512) = 1i64;
v27 = 0;
}
else
{
v23 = v7 - 160;
*(_QWORD *)(v7 - 96) = a4;
v20 = 0i64;
v27 = 1;
*(_QWORD *)(v7 - 88) = a3;
*(_QWORD *)(v7 - 80) = a2;
*(_QWORD *)(v7 - 160 + 56) = KxStartSystemThread;
*(_QWORD *)(v7 - 56) = 0i64;
}
KiSetSwitchingNpxState(a1, v27);
*(_BYTE *)(a1 + 562) = v28;
result = v20 + 128;
*(_BYTE *)(v23 + 40) = 1;
*(_QWORD *)(v23 + 48) = v20 + 128;
if( KUSER_SHARED_DATA.XState.EnabledFeatures )
{
result = KUSER_SHARED_DATA.XState.ControlFlags;
if( (KUSER_SHARED_DATA.XState._bf_0 & 2) != 0 )
{
v30 = 0x8000000000000003ui64;
*(_QWORD *)(v7 + 520) = 0x8000000000000003ui64;
if( (*(_DWORD *)(a1 + 116) & 0x100000) != 0 )
{
if( (*(_DWORD *)(a5 + 48) & 0x100040) == 1048640 )
{
ExtendedFeature2 = RtlLocateExtendedFeature2((_DWORD *)(a5 + 1232), 0xBu, 0xFFFFF780000003D8ui64, 0i64);
v30 = *(_QWORD *)(v7 + 520);
v9 = ExtendedFeature2;
}
*(_QWORD *)(v7 + 512) |= 0x800ui64;
*(_QWORD *)(v7 + 520) = v30 | 0x800;
result = (unsigned __int64)RtlLocateSupervisorFeature((PXSAVE_AREA_HEADER)(v7 + 512), 0xBu);
*(_OWORD *)result = *(_OWORD *)v9;
}
}
}
*(_QWORD *)(a1 + 40) = v8;
*(_QWORD *)(a1 + 88) = v23;
*(_QWORD *)(a1 + 96) = v7;
return result;
}Referenced by:
No references.