CmpFileFlushAndPurge

INT64 __fastcall CmpFileFlushAndPurge(INT64 a1, UINT64 a2){
  __int64 v2; 
  IRP *v4; 
  void *v5; 
  NTSTATUS v6; 
  struct _DMA_ADAPTER *v7; 
  unsigned int v8; 
  _DEVICE_OBJECT *RelatedDeviceObject; 
  IRP *Irp; 
  _ETHREAD *CurrentThread; 
  __int64 v12; 
  __int64 v13; 
  unsigned int v15; 
  _KEVENT v16; 
  PVOID Object; 
  v2 = (unsigned int)a2;
  memset(&v16, 0, sizeof(v16));
  KeInitializeEvent(&v16, SynchronizationEvent, 0);
  v4 = 0i64;
  if( (*(_DWORD *)(a1 + 160) & 0x20000) != 0 && !(_DWORD)v2 )
  {
    LOBYTE(v15) = CmpFileFlush((_HHIVE *)a1, 0i64);
    return v15;
  }
  else
  {
    v5 = *(void **)(a1 + 8 * v2 + 1536);
    if( !v5 || BYTE1(NlsMbCodePageTag) )
    {
      return 0;
    }
    else
    {
      Object = 0i64;
      v6 = ObReferenceObjectByHandle(v5, 2u, *(POBJECT_TYPE *)CmIoFileObjectType, 0, &Object, 0i64);
      v7 = (struct _DMA_ADAPTER *)Object;
      v8 = v6;
      if( v6 >= 0 )
      {
        RelatedDeviceObject = IoGetRelatedDeviceObject((_FILE_OBJECT *)Object);
        Irp = IoAllocateIrp(*((_BYTE *)RelatedDeviceObject + 76), 0);
        v4 = Irp;
        if( Irp )
        {
          *((_QWORD *)Irp + 24) = v7;
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          *((_QWORD *)v4 + 20) = 0i64;
          *((_WORD *)v4 + 32) = 0;
          *((_QWORD *)v4 + 11) = 0i64;
          *((_QWORD *)v4 + 13) = 0i64;
          v7 = (struct _DMA_ADAPTER *)Object;
          *((_QWORD *)v4 + 19) = CurrentThread;
          v12 = *((_QWORD *)v4 + 23);
          *((_BYTE *)v4 + 68) = 0;
          *(_WORD *)(v12 - 72) = 265;
          *(_QWORD *)(v12 - 24) = v7;
          *(_QWORD *)(v12 - 32) = RelatedDeviceObject;
          v13 = *((_QWORD *)v4 + 23);
          *(_QWORD *)(v13 - 16) = SmKmGenericCompletion;
          *(_QWORD *)(v13 - 8) = &v16;
          *(_BYTE *)(v13 - 69) = -32;
          v8 = IofCallDriver(RelatedDeviceObject, v4);
          if( v8 == 259 )
          {
            KeWaitForSingleObject(&v16, Executive, 0, 0, 0i64);
            v8 = *((_DWORD *)v4 + 12);
          }
        }
        else
        {
          v8 = -1073741670;
        }
      }
      if( v7 )
        HalPutDmaAdapter(v7);
      if( v4 )
        IoFreeIrp(v4);
    }
  }
  return v8;
}

Referenced by:

CmpFlushHive
HvExtendHivePrimaryFileValidDataLength
HvValidateOrInvalidatePrimaryFileHeader
HvWriteHivePrimaryFile
HvWriteLogFile