MiInitializeCreateSectionPacket
NTSTATUS __stdcall MiInitializeCreateSectionPacket(
INT64 *a1,
INT64 a2,
INT64 a3,
INT64 a4,
UINT64 a5,
CHAR a6,
INT64 a7,
CHAR a8,
UINT64 a9,
INT64 a10,
CHAR a11,
INT64 a12,
INT64 a13){
int v13;
int v15;
UINT64 v16;
NTSTATUS ProtectionMask;
unsigned int v18;
NTSTATUS result;
int v20;
int v21;
int v22;
int v23;
unsigned int v24;
char v25;
__int64 v26[3];
v13 = a5;
if( (a5 & 0x7F) != 0 )
return -1073741811;
a1[20] = a7;
*((_DWORD *)a1 + 42) = a12;
a1[19] = a3;
*((_BYTE *)a1 + 24) = a8;
*((_DWORD *)a1 + 5) = a5;
a1[1] = a2;
*((_DWORD *)a1 + 7) = a4;
*((_BYTE *)a1 + 72) = a11;
if( (a6 & 1) != 0 )
*(_DWORD *)a1 |= 0x800u;
if( (a6 & 2) != 0 )
{
v20 = *(_DWORD *)a1 | 1;
*(_DWORD *)a1 = v20;
if( (a6 & 4) != 0 )
*(_DWORD *)a1 = v20 | 0x30000;
}
v15 = ((unsigned __int16)a4 ^ (unsigned __int16)*((_DWORD *)a1 + 35)) & 0xFFF;
a1[6] = a10;
*((_DWORD *)a1 + 35) ^= v15;
a1[5] = a9;
if( (a5 & 0x1100000) == 17825792 )
{
*(_DWORD *)a1 |= 0x200u;
v13 = a5 & 0xFFEFFFFF;
}
if( (v13 & 0x100000) == 0 )
{
if( (v13 & 0x2000000) == 0 )
goto LABEL_9;
*(_DWORD *)a1 |= 0x10u;
if( (v13 & 0x400000) != 0 )
{
v13 &= ~0x400000u;
v25 = 12;
}
else
{
v25 = 4;
}
v24 = v13 & 0xFDFFFFFF;
goto LABEL_42;
}
v22 = *(_DWORD *)a1;
if( (v13 & 0x200000) != 0 )
{
v13 &= ~0x200000u;
v22 |= 0x40u;
}
v23 = v22 | 0x20;
v24 = v13 & 0xFFEFFFFF;
*(_DWORD *)a1 = v23;
if( (v24 & 0x400000) == 0 )
{
v25 = 1;
LABEL_42:
v13 = v24 | 0x1000000;
*((_BYTE *)a1 + 24) = v25;
goto LABEL_9;
}
*(_DWORD *)a1 = v23 | 0x100;
v13 = v24 & 0xFEBFFFFF | 0x1000000;
*((_BYTE *)a1 + 24) = 12;
LABEL_9:
v26[0] = 0i64;
if( (v13 & 0x40000) == 0 )
goto LABEL_10;
if( !a9 || a10 )
return -1073741811;
result = PsReferencePartitionByHandle((VOID *)a9, 2ui64, a11, 0x70434D4Du, v26);
if( result >= 0 )
{
if( *(_MI_PARTITION **)v26[0] == &Irp )
PsDereferencePartition(v26[0]);
else
a1[22] = v26[0];
a1[5] = 0i64;
v13 &= ~0x40000u;
LABEL_10:
if( (v13 & 0x1000000) != 0 )
{
if( (a6 & 8) != 0 )
*(_DWORD *)a1 |= 0x80000u;
if( (*(_BYTE *)&KeGetCurrentThread()->ApcState.Process->Pcb.SecureState & 1) != 0 )
*(_DWORD *)a1 |= 0x480000u;
if( (v13 & 0x11000000) == 285212672 )
{
if( *((_DWORD *)a1 + 7) != 2 )
return -1073741755;
v13 &= ~0x10000000u;
}
else
{
*(_DWORD *)a1 |= 0x400u;
v21 = *(_DWORD *)a1;
if( (*(_DWORD *)a1 & 0x20) != 0 && (MiFlags & 0x10000) != 0 )
{
*(_DWORD *)a1 = v21 | 0x80000;
}
else if( (MiFlags & 0x100000) != 0 )
{
*(_DWORD *)a1 = v21 | 0x80000;
}
}
}
else if( (v13 & 0x10000000) != 0 )
{
*((_DWORD *)a1 + 7) |= 0x200u;
}
else if( (v13 & 0x40000000) != 0 )
{
*((_DWORD *)a1 + 7) |= 0x400u;
}
v16 = *((unsigned int *)a1 + 7);
*((_DWORD *)a1 + 4) = v13;
ProtectionMask = MiMakeProtectionMask(v16);
*((_DWORD *)a1 + 8) = ProtectionMask;
if( ProtectionMask != -1 )
{
if( !a13 )
return 0;
*((_BYTE *)a1 + 192) = *(_BYTE *)a13;
*((_DWORD *)a1 + 49) = *(_DWORD *)(a13 + 4);
v18 = *(_DWORD *)(a13 + 8);
if( v18 <= (unsigned __int16)KeNumberNodes )
{
*((_DWORD *)a1 + 43) = v18;
return 0;
}
return -1073741811;
}
return -1073741755;
}
return result;
}Referenced by:
MiCreateSection