MiFlushComplete
VOID __stdcall MiFlushComplete(VOID *Context, _IO_STATUS_BLOCK *IoStatus, UINT64 Reserved){
__int64 v3;
__int16 v6;
UINT64 *v7;
_MI_CONTROL_AREA_WAIT_BLOCK *v8;
__int64 v9;
v3 = *((_QWORD *)Context + 9);
v6 = *(_WORD *)(v3 + 10);
if( (v6 & 0x200) != 0 )
{
MiRetardMdl((_MDL *)v3);
v6 = *(_WORD *)(v3 + 10);
}
v7 = (UINT64 *)(v3
+ 48
+ 8
* ((*(unsigned int *)(v3 + 40)
+ 4095i64
+ (unsigned __int64)((*(_DWORD *)(v3 + 32) + *(_DWORD *)(v3 + 44)) & 0xFFF)) >> 12));
if( (v6 & 1) != 0 )
MmUnmapLockedPages(*(VOID **)(v3 + 24), (_MDL *)v3);
MiUnlockMdlWritePages((UINT64 *)(v3 + 48), v7, IoStatus);
if( IoStatus->Status < 0 )
IoStatus->Information = 0i64;
v8 = MiDecrementModifiedWriteCount(*((_CONTROL_AREA **)Context + 4), 0i64);
if( v8 )
MiReleaseControlAreaWaiters(v8);
if( (VOID *)v3 != (char *)Context + 80 )
{
ExFreePoolWithTag((PVOID)v3, 0);
*((_QWORD *)Context + 9) = (char *)Context + 80;
}
*((_QWORD *)Context + 2) = 0i64;
KeSetEvent((PRKEVENT)((char *)Context + 48), 0, 0);
v9 = *((_QWORD *)Context + 5);
if( v9 )
{
if( IoStatus->Status < 0 )
*(_DWORD *)(v9 + 20) = IoStatus->Status;
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v9 + 16), 0xFFFFFFFF) == 1 )
MiFreeOverlappedFlushEntry((_MI_OVERLAPPED_FLUSH_ENTRY *)v9);
}
}Referenced by:
MiIssueAsynchronousFlush