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