CmpFileFlushAndPurge

INT64 __fastcall CmpFileFlushAndPurge(_HHIVE *Hive, UINT64 FileType){
  __int64 v2; 
  UINT64 v4; 
  VOID *v5; 
  NTSTATUS v6; 
  _ADAPTER_OBJECT *v7; 
  unsigned int v8; 
  UINT64 v9; 
  UINT64 v10; 
  INT64 v11; 
  VOID **Irp; 
  _ETHREAD *CurrentThread; 
  __int64 v14; 
  __int64 v15; 
  UINT64 v17[2]; 
  __int64 v18; 
  PVOID Object; 

  v2 = (unsigned int)FileType;
  *(_OWORD *)v17 = 0i64;
  v18 = 0i64;
  KeInitializeEvent((INT64)v17, 1, 0);
  v4 = 0i64;
  if( (Hive->HiveFlags & 0x20000) != 0 && !(_DWORD)v2 )
  {
    return(unsigned int)CmpFileFlush(Hive, 0i64);
  }
  else
  {
    v5 = (VOID *)*((_QWORD *)&Hive[1].Signature + v2);
    if( !v5 || BYTE1(NlsMbCodePageTag) )
    {
      return 0;
    }
    else
    {
      Object = 0i64;
      v6 = ObReferenceObjectByHandle(v5, 2ui64, (_OBJECT_TYPE *)**(&CmpDummyThreadEvent + 344), 0, &Object, 0i64);
      v7 = (_ADAPTER_OBJECT *)Object;
      v8 = v6;
      if( v6 >= 0 )
      {
        LODWORD(v9) = IoGetRelatedDeviceObject((INT64)Object);
        v10 = v9;
        LOBYTE(v11) = *(_BYTE *)(v9 + 76);
        Irp = IoAllocateIrp(v11, 0);
        v4 = (UINT64)Irp;
        if( Irp )
        {
          Irp[24] = v7;
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          *(_QWORD *)(v4 + 160) = 0i64;
          *(_WORD *)(v4 + 64) = 0;
          *(_QWORD *)(v4 + 88) = 0i64;
          *(_QWORD *)(v4 + 104) = 0i64;
          v7 = (_ADAPTER_OBJECT *)Object;
          *(_QWORD *)(v4 + 152) = CurrentThread;
          v14 = *(_QWORD *)(v4 + 184);
          *(_BYTE *)(v4 + 68) = 0;
          *(_WORD *)(v14 - 72) = 265;
          *(_QWORD *)(v14 - 24) = v7;
          *(_QWORD *)(v14 - 32) = v10;
          v15 = *(_QWORD *)(v4 + 184);
          *(_QWORD *)(v15 - 16) = SmKmGenericCompletion;
          *(_QWORD *)(v15 - 8) = v17;
          *(_BYTE *)(v15 - 69) = -32;
          v8 = IofCallDriver(v10, v4);
          if( v8 == 259 )
          {
            KeWaitForSingleObject((UINT64)v17, 0, 0, 0, 0i64);
            v8 = *(_DWORD *)(v4 + 48);
          }
        }
        else
        {
          v8 = -1073741670;
        }
      }
      if( v7 )
        HalPutDmaAdapter(v7);
      if( v4 )
        IoFreeIrp((PIRP)v4);
    }
  }
  return v8;
}

Referenced by:

CmpFlushHive
HvExtendHivePrimaryFileValidDataLength
HvValidateOrInvalidatePrimaryFileHeader
HvWriteHivePrimaryFile
HvWriteLogFile