MiMarkKernelImageCfgBits
NTSTATUS __fastcall MiMarkKernelImageCfgBits(_KLDR_DATA_TABLE_ENTRY *DataTableEntry, INT64 a2){
int KernelCfgBitmapPageTables;
_ETHREAD *CurrentThread;
UINT64 SizeOfImage;
void *DllBase;
unsigned int v8;
_QWORD *v9;
_QWORD *v10;
UINT64 v11;
unsigned __int64 v12;
__int64 v13;
UINT64 Size;
_MMPTE *EndPte;
__int64 v16;
UINT64 v17[2];
int v18;
__int64 v19;
int v20;
__int64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
INT64 v25[14];
v16 = 0i64;
v19 = 0i64;
v20 = 0;
v22 = 0i64;
v24 = 0i64;
EndPte = 0i64;
LODWORD(Size) = 0;
if( a2 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&stru_140C4C980, 0i64);
KernelCfgBitmapPageTables = MiAllocateKernelCfgBitmapPageTables(
(INT64)DataTableEntry->DllBase,
DataTableEntry->SizeOfImage);
MiReleaseKernelCfgLock();
if( KernelCfgBitmapPageTables >= 0 )
{
SizeOfImage = DataTableEntry->SizeOfImage;
DllBase = DataTableEntry->DllBase;
v8 = DataTableEntry->SizeOfImage;
v17[0] = (UINT64)DataTableEntry;
v17[1] = 0i64;
v21 = 0i64;
v23 = 0i64;
v18 = (v8 >> 12) + ((SizeOfImage & 0xFFF) != 0);
KernelCfgBitmapPageTables = VslCompleteSecureDriverLoad(
(INT64)DataTableEntry->SectionPointer,
(INT64)DllBase,
SizeOfImage);
MiUnlockDriverPages(v17);
if( KernelCfgBitmapPageTables >= 0 )
{
v9 = RtlImageDirectoryEntryToData(DataTableEntry->DllBase, 1u, 0xAu, &Size);
v10 = v9;
if( v9 && (unsigned int)Size >= 0xB0 && v9[21] )
{
v11 = 0i64;
while( 1 )
{
LODWORD(v11) = MiSnapDriverRange(DataTableEntry, v11, 2ui64, 0i64, &EndPte);
if( EndPte )
{
v12 = v10[20];
v13 = (_QWORD)MmGetPteBase() << 25;
if( v12 >= (((_QWORD)EndPte << 25) - v13) >> 16 && v12 <= (((v16 << 25) - v13) | 0xFFF0000) >> 16 )
break;
}
if( !(_DWORD)v11 )
return KernelCfgBitmapPageTables;
}
DataTableEntry->Flags |= 0x800u;
}
else
{
DataTableEntry->Flags |= 0x100u;
}
}
}
}
else if( (MiFlags & 0x8000) != 0 )
{
memset(v25, 0i64, 0x68u);
v25[1] = (INT64)DataTableEntry->DllBase;
KernelCfgBitmapPageTables = VslpEnterIumSecureMode(2u, 217, 0i64, (INT64)v25);
if( (MiFlags & 0x80000) != 0 )
MiFlushKernelCfgBitmap((INT64)DataTableEntry->DllBase, DataTableEntry->SizeOfImage);
}
else
{
return 0;
}
return KernelCfgBitmapPageTables;
}Referenced by:
MiInitializeKernelCfg
MiProcessKernelCfgImage