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; 
  UINT8 *MappedSystemVa; 
  const unsigned __int8 *p_MappedSystemVa; 
  __int16 v12; 
  __int64 v13; 
  KIRQL v14; 
  UINT64 CompressedBufferSize; 
  UINT64 UncompressedChunkSize; 
  UINT64 FinalCompressedSize[9]; 
  LODWORD(FinalCompressedSize[0]) = 0;
  v6 = MemoryDescriptorList;
  StartVa = (unsigned __int64)MemoryDescriptorList[1].StartVa;
  v9 = *(_MDL **)(StartVa + 16);
  MappedSystemVa = (UINT8 *)v9->MappedSystemVa;
  memmove((UINT8 *)a4, MappedSystemVa, 0x1000ui64);
  p_MappedSystemVa = (const unsigned __int8 *)&v6[1].MappedSystemVa;
  LODWORD(UncompressedChunkSize) = 4096;
  LODWORD(CompressedBufferSize) = StartVa - ((_DWORD)v6 + 72) + 4096;
  v12 = (_WORD)v6 + 72;
  if( (int)RtlCompressBuffer(
              *((_WORD *)v6[1].Process + 2016),
              (UINT8 *)a4,
              0x1000ui64,
              (UINT8 *)&v6[1].MappedSystemVa,
              CompressedBufferSize,
              UncompressedChunkSize,
              FinalCompressedSize,
              a3) < 0 )
  {
    LODWORD(FinalCompressedSize[0]) = 4096;
    p_MappedSystemVa = 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(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((PEX_SPIN_LOCK)(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.