MiIssueAsynchronousFlush
_MI_FLUSH_ENTRY *__stdcall MiIssueAsynchronousFlush(
_FILE_OBJECT *FileObject,
_MI_FLUSH_ENTRY *FlushEntry,
_MI_FLUSH_ARRAY *FlushArray,
_MI_OVERLAPPED_FLUSH_ENTRY *OverlappedFlushEntry,
UINT64 StartingOffset,
UINT8 IrpSpFlags,
_IO_PRIORITY_HINT IoPriority,
VOID *IoAttributionContext){
_MDL *v10;
_MI_FLUSH_ENTRY *v11;
NTSTATUS v12;
unsigned __int8 CurrentIrql;
int v15;
unsigned __int8 v16;
_IO_STATUS_BLOCK *Alertable;
UINT64 v18;
VOID *ApcContext;
VOID *v20;
_IO_STATUS_BLOCK *v21;
_IRP **v22;
*((_BYTE *)FlushEntry + 50) = 6;
*((_WORD *)FlushEntry + 24) = 0;
*((_QWORD *)FlushEntry + 8) = FlushEntry + 14;
*((_QWORD *)FlushEntry + 7) = FlushEntry + 14;
FlushEntry[13] = 0;
v10 = (_MDL *)*((_QWORD *)FlushEntry + 9);
v11 = FlushEntry;
*FlushEntry = 0;
*((_QWORD *)FlushEntry + 1) = 0i64;
*((_QWORD *)FlushEntry + 2) = (char *)v10 + 8 * ((unsigned __int64)v10->ByteCount >> 12) + 48;
if( OverlappedFlushEntry )
_InterlockedAdd(OverlappedFlushEntry + 4, 1u);
LOBYTE(ApcContext) = IrpSpFlags;
LODWORD(v18) = 0;
LODWORD(Alertable) = IoPriority;
v12 = IoAsynchronousPageWrite(
FileObject,
v10,
(_LARGE_INTEGER *)&StartingOffset,
MiFlushComplete,
FlushEntry,
Alertable,
v18,
ApcContext,
(_IO_PRIORITY_HINT)IoAttributionContext,
(UINT64)FlushEntry,
(_BYTE)FlushEntry + 24,
v20,
v21,
v22);
if( (v12 & 0xC0000000) == -1073741824 )
{
*v11 = v12;
*((_QWORD *)v11 + 1) = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
MiFlushComplete(v11, (_IO_STATUS_BLOCK *)v11, 0i64);
__writecr8(CurrentIrql);
if( OverlappedFlushEntry )
OverlappedFlushEntry[5] = v12;
v10->ByteCount = 0;
}
else
{
v15 = 0;
v16 = KeGetCurrentIrql();
__writecr8(1ui64);
do
{
LABEL_9:
v11 += 66;
if( v11 >= FlushArray + 528 )
v11 = FlushArray;
if( !*((_QWORD *)v11 + 2) || v11[13] == 1 )
{
__writecr8(v16);
return v11;
}
++v15;
}
while( v15 != 8 );
__writecr8(v16);
KeWaitForMultipleObjects(
8ui64,
(VOID **)FlushArray + 264,
WaitAny,
WrPageOut,
0,
0,
0i64,
(_KWAIT_BLOCK *)(FlushArray + 544));
v11 = FlushArray;
while( *v11 >= 0 )
{
v11 += 66;
if( !--v15 )
{
v16 = KeGetCurrentIrql();
__writecr8(1ui64);
goto LABEL_9;
}
}
*(_DWORD *)(*((_QWORD *)v11 + 9) + 40i64) = 0;
}
return 0i64;
}Referenced by:
MiFlushSectionInternal