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.