SMKM_STORE_MGR::SmCompressCtxProcessEntry
__int64 __fastcall SMKM_STORE_MGR::SmCompressCtxProcessEntry(
__int64 a1,
__int64 a2,
VOID *a3,
VOID *a4,
PMDL MemoryDescriptorList){
PMDL v6;
unsigned __int64 StartVa;
_MDL *v9;
const VOID *MappedSystemVa;
void **p_MappedSystemVa;
__int16 v12;
__int64 v13;
UINT8 v14;
UINT64 CompressedBufferSize;
UINT64 UncompressedChunkSize;
__int64 FinalCompressedSize[9];
LODWORD(FinalCompressedSize[0]) = 0;
v6 = MemoryDescriptorList;
StartVa = (unsigned __int64)MemoryDescriptorList[1].StartVa;
v9 = *(_MDL **)(StartVa + 16);
MappedSystemVa = v9->MappedSystemVa;
memmove(a4, MappedSystemVa, 0x1000u);
p_MappedSystemVa = &v6[1].MappedSystemVa;
LODWORD(UncompressedChunkSize) = 4096;
LODWORD(CompressedBufferSize) = StartVa - ((_DWORD)v6 + 72) + 4096;
v12 = (_WORD)v6 + 72;
if( RtlCompressBuffer(
(UINT16)v6[1].Process[1].WoW64Process,
(UINT8 *)a4,
0x1000ui64,
(UINT8 *)&v6[1].MappedSystemVa,
CompressedBufferSize,
UncompressedChunkSize,
(UINT64 *)FinalCompressedSize,
a3) < 0 )
{
LODWORD(FinalCompressedSize[0]) = 4096;
p_MappedSystemVa = (void **)MappedSystemVa;
IoBuildPartialMdl(v9, v6, (char *)v9->StartVa + v9->ByteOffset, 0i64);
}
else
{
v13 = LODWORD(FinalCompressedSize[0]);
v6->Next = 0i64;
v6->MdlFlags = 0;
v6->ByteCount = v13;
v6->ByteOffset = v12 & 0xFFF;
v6->StartVa = (void *)((unsigned __int64)p_MappedSystemVa & 0xFFFFFFFFFFFFF000ui64);
v6->Size = 8 * ((((unsigned __int64)(v12 & 0xFFF) + v13 + 4095) >> 12) + 6);
MmBuildMdlForNonPagedPool(v6);
}
MemoryDescriptorList = 0i64;
MetroHash64::Hash(
(const unsigned __int8 *)p_MappedSystemVa,
LODWORD(FinalCompressedSize[0]),
(unsigned __int8 *const)&MemoryDescriptorList);
*(_QWORD *)&v6[1].Size = MemoryDescriptorList;
v6->Next = v9;
*(_DWORD *)(StartVa + 8) |= 0x80000000;
*(_QWORD *)(StartVa + 16) = v6;
v14 = ExAcquireSpinLockExclusive((INT64 *)(a1 + 112));
*(_QWORD *)StartVa = *(_DWORD *)StartVa & 7 | ((**(_QWORD **)(a1 + 104) & 0xFFFFFFFFFFFFFFF8ui64) + 8);
**(_QWORD **)(a1 + 104) = StartVa | **(_DWORD **)(a1 + 104) & 7;
*(_QWORD *)(a1 + 104) = StartVa;
return SMKM_STORE_MGR::SmCompressCtxProcessReadyQueue(a1, a2, v14, 0);
}
Referenced by:
No references.