MiInitializeWowPeb
int __fastcall MiInitializeWowPeb(__int64 a1, __int64 a2, __int64 a3, __int64 a4){
__int64 v8;
__int16 v9;
int result;
__int64 v11;
__int64 v12;
__int64 v13;
int v14;
__int16 v15;
char v16;
UINT64 v17;
__int64 v18;
__int64 v19;
__int16 v20;
unsigned __int64 v21;
__int64 v22;
__int16 v23;
int v24;
ULONG Size;
__int64 v26;
__int64 v27[7];
v27[0] = 0i64;
v26 = 0i64;
v8 = *(_QWORD *)(a3 + 1408);
if( v8 && ((v9 = *(_WORD *)(v8 + 8), v9 == 332) || v9 == 452) )
{
result = MmCheckImageMapping(a3);
if( result < 0 )
return result;
LODWORD(v11) = RtlImageDirectoryEntryToData(*(PVOID *)(a3 + 1312), 0, 0xAu, (UINT64 *)&Size);
v12 = v11;
v26 = v11;
if( v11 )
{
if( (v11 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v13 = *(unsigned int *)(v26 + 48);
if( ((unsigned int)v13 & KeActiveProcessors.Bitmap[*(unsigned __int16 *)(a4 + 8)]) != v13 )
v13 = 0i64;
*(_QWORD *)a4 = v13;
v12 = v26;
}
*(_DWORD *)a1 = *(unsigned __int16 *)(a2 + 92);
*(_DWORD *)(a1 + 4) = *(unsigned __int16 *)(a2 + 72);
*(_DWORD *)(a1 + 8) = *(unsigned __int16 *)(a2 + 74);
v14 = *(_DWORD *)(a2 + 76);
if( v14 )
{
if( v12 )
{
v15 = *(_WORD *)(v12 + 52);
if( v15 )
{
*(_WORD *)(a1 + 26) = v15;
v14 = *(_DWORD *)(a2 + 76);
}
}
*(_DWORD *)(a1 + 12) = (unsigned __int8)v14;
*(_DWORD *)(a1 + 16) = BYTE1(v14);
*(_WORD *)(a1 + 24) = HIWORD(v14);
*(_DWORD *)(a1 + 20) = (v14 ^ 0xBFFFFFFF) >> 30;
}
v16 = 1;
v17 = 1i64;
}
else
{
v17 = 2i64;
v16 = 1;
}
result = MiCreatePebOrTeb(v17, 0i64);
if( result >= 0 )
{
v18 = v27[0];
**(_QWORD **)(a3 + 1408) = v27[0];
v19 = *(_QWORD *)(a3 + 1408);
if( v19 )
{
v20 = *(_WORD *)(v19 + 8);
if( v20 == 332 || v20 == 452 )
{
v21 = *(_QWORD *)(a1 + 32);
if( v21 > 0x40000000 )
{
v21 = 0x100000i64;
*(_QWORD *)(a1 + 32) = 0x100000i64;
}
if( *(_QWORD *)(a1 + 40) > v21 )
*(_QWORD *)(a1 + 40) = 0x2000i64;
}
}
v22 = *(_QWORD *)(a3 + 1408);
if( !v22 || (v23 = *(_WORD *)(v22 + 8), v23 != 332) && v23 != 452 )
v16 = 0;
v24 = *(_DWORD *)(a1 + 12);
if( v16 )
{
*(_DWORD *)(v18 + 164) = v24;
*(_DWORD *)(v18 + 168) = *(_DWORD *)(a1 + 16);
*(_WORD *)(v18 + 172) = *(_WORD *)(a1 + 24);
*(_DWORD *)(v18 + 176) = *(_DWORD *)(a1 + 20);
*(_WORD *)(v18 + 174) = *(_WORD *)(a1 + 26);
*(_DWORD *)(v18 + 120) = *(_DWORD *)(a1 + 32);
*(_DWORD *)(v18 + 124) = *(_DWORD *)(a1 + 40);
*(_DWORD *)(v18 + 100) = KeNumberProcessors_0;
*(_DWORD *)(v18 + 104) = NtGlobalFlag;
*(_DWORD *)(v18 + 1144) = *(_DWORD *)NtGlobalFlag2;
*(_QWORD *)(v18 + 112) = qword_140C4DB60;
*(_DWORD *)(v18 + 520) = dword_140CFA198;
*(_DWORD *)(v18 + 128) = qword_140CFA1A8;
*(_DWORD *)(v18 + 132) = qword_140CFA1A0;
*(_DWORD *)(v18 + 468) = *(_DWORD *)(a1 + 60);
*(_DWORD *)(v18 + 180) = *(_DWORD *)a1;
*(_DWORD *)(v18 + 184) = *(_DWORD *)(a1 + 4);
*(_DWORD *)(v18 + 188) = *(_DWORD *)(a1 + 8);
*(_BYTE *)v18 = *(_BYTE *)(a1 + 96);
*(_BYTE *)(v18 + 3) = *(_BYTE *)(a1 + 97);
*(_DWORD *)(v18 + 4) = *(_DWORD *)(a1 + 104);
*(_DWORD *)(v18 + 8) = *(_DWORD *)(a1 + 112);
*(_DWORD *)(v18 + 88) = *(_DWORD *)(a1 + 120);
*(_DWORD *)(v18 + 92) = *(_DWORD *)(a1 + 128);
*(_DWORD *)(v18 + 96) = *(_DWORD *)(a1 + 136);
*(_DWORD *)(v18 + 1136) = *(_DWORD *)(a1 + 144);
*(_DWORD *)(v18 + 1140) = *(_DWORD *)(a1 + 152);
}
else
{
*(_DWORD *)(v18 + 280) = v24;
*(_DWORD *)(v18 + 284) = *(_DWORD *)(a1 + 16);
*(_WORD *)(v18 + 288) = *(_WORD *)(a1 + 24);
*(_DWORD *)(v18 + 292) = *(_DWORD *)(a1 + 20);
*(_WORD *)(v18 + 290) = *(_WORD *)(a1 + 26);
*(_QWORD *)(v18 + 200) = *(_QWORD *)(a1 + 32);
*(_QWORD *)(v18 + 208) = *(_QWORD *)(a1 + 40);
*(_DWORD *)(v18 + 184) = KeNumberProcessors_0;
*(_DWORD *)(v18 + 188) = NtGlobalFlag;
*(_DWORD *)(v18 + 1988) = *(_DWORD *)NtGlobalFlag2;
*(_QWORD *)(v18 + 192) = qword_140C4DB60;
*(_QWORD *)(v18 + 792) = (unsigned int)dword_140CFA198;
*(_QWORD *)(v18 + 216) = qword_140CFA1A8;
*(_QWORD *)(v18 + 224) = qword_140CFA1A0;
*(_DWORD *)(v18 + 704) = *(_DWORD *)(a1 + 60);
*(_DWORD *)(v18 + 296) = *(_DWORD *)a1;
*(_DWORD *)(v18 + 300) = *(_DWORD *)(a1 + 4);
*(_DWORD *)(v18 + 304) = *(_DWORD *)(a1 + 8);
*(_BYTE *)v18 = *(_BYTE *)(a1 + 96);
*(_BYTE *)(v18 + 3) = *(_BYTE *)(a1 + 97);
*(_QWORD *)(v18 + 8) = *(_QWORD *)(a1 + 104);
*(_QWORD *)(v18 + 16) = *(_QWORD *)(a1 + 112);
*(_QWORD *)(v18 + 160) = *(_QWORD *)(a1 + 120);
*(_QWORD *)(v18 + 168) = *(_QWORD *)(a1 + 128);
*(_QWORD *)(v18 + 176) = *(_QWORD *)(a1 + 136);
*(_QWORD *)(v18 + 1976) = *(_QWORD *)(a1 + 144);
*(_DWORD *)(v18 + 1984) = *(_DWORD *)(a1 + 152);
}
return 0;
}
return result;
}Referenced by:
MmCreatePeb