MmSetPermanentCacheAttribute

NTSTATUS __stdcall MmSetPermanentCacheAttribute(
        _LARGE_INTEGER StartAddress,
        _LARGE_INTEGER NumberOfBytes,
        _MEMORY_CACHING_TYPE CacheType,
        UINT64 Flags){
  NTSTATUS result; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  VOID *Pool; 
  void *v8; 
  VOID *v9; 
  NTSTATUS v10; 
  int v11; 

  v11 = 0;
  if( KeGetCurrentIrql() )
    return -1073741811;
  if( (Flags & 0xFFFFFFFE) != 0 )
    return -1073741582;
  if( (StartAddress.anonymous_0.LowPart & 0xFFF) != 0 )
    return -1073741585;
  if( (NumberOfBytes.anonymous_0.LowPart & 0xFFF) != 0 )
    return -1073741584;
  v5 = (unsigned __int64)StartAddress.QuadPart >> 12;
  v6 = (unsigned __int64)NumberOfBytes.QuadPart >> 12;
  if( !((unsigned __int64)NumberOfBytes.QuadPart >> 12) )
    return -1073741584;
  if( CacheType != MmCached )
    return -1073741583;
  Pool = MiAllocatePool(64i64, 0x30ui64, 0x6F49694Dui64);
  v8 = Pool;
  if( !Pool )
    return -1073741670;
  *((_QWORD *)Pool + 3) = v5;
  *((_DWORD *)Pool + 10) = 1;
  *((_QWORD *)Pool + 4) = v5 + v6 - 1;
  v10 = 0;
  v9 = Pool;
  KeGenericCallDpc((__int64)MiMakeIoRangePermanentDpc, (__int64)&v9);
  result = v10;
  if( v10 < 0 )
  {
    ExFreePoolWithTag(v8, 0);
    return v10;
  }
  return result;
}

Referenced by:

No references.