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