CcMdlWriteComplete2
VOID __fastcall CcMdlWriteComplete2(INT64 a1, LARGE_INTEGER *a2, INT64 a3, IO_STATUS_BLOCK *a4){
_LARGE_INTEGER v4;
__int64 v5;
__int16 v6;
_MDL *v7;
int Status;
__int16 v10;
_SHARED_CACHE_MAP *v11;
_MDL *Next;
UINT64 ByteCount;
__int64 v14;
PMDL v15;
INT64 Partition;
struct _MDL *v17;
NTSTATUS v18;
char v19;
UINT64 Flags;
_IO_STATUS_BLOCK IoStatus;
struct _KLOCK_QUEUE_HANDLE LockHandle;
_LARGE_INTEGER FileOffset;
PMDL Mdl;
Mdl = (PMDL)a3;
v4 = *a2;
FileOffset = *a2;
v5 = *(_QWORD *)(a1 + 40);
v6 = *(_WORD *)(a3 + 10);
v7 = (_MDL *)a3;
Status = 0;
IoStatus = 0i64;
v10 = v6 & 2;
memset(&LockHandle, 0, sizeof(LockHandle));
v11 = *(_SHARED_CACHE_MAP **)(v5 + 8);
do
{
Next = v7->Next;
if( v10 )
MmUnlockPages(v7);
ByteCount = v7->ByteCount;
if( (*(_DWORD *)(a1 + 80) & 0x10) != 0 )
{
LODWORD(Flags) = 1;
MmFlushSection(*(_SECTION_OBJECT_POINTERS **)(a1 + 40), &FileOffset, ByteCount, (_KEVENT *)a4, &IoStatus, Flags);
if( IoStatus.Status < 0 )
Status = IoStatus.Status;
}
else
{
CcSetDirtyInMask(v11, &FileOffset, ByteCount, 0i64);
}
v14 = v7->ByteCount;
v7 = Next;
v4.QuadPart += v14;
FileOffset = v4;
}
while( Next );
v15 = Mdl;
if( v10 )
{
Partition = CcGetPartition(v11);
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &LockHandle);
CcDecrementOpenCount((INT64)v11);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
if( Status < 0 )
{
FsRtlIsNtstatusExpected((unsigned int)Status);
v18 = -1073741591;
if( v19 )
v18 = Status;
RtlRaiseStatus(v18);
}
do
{
v17 = v15->Next;
IoFreeMdl(v15);
v15 = v17;
}
while( v17 );
}Referenced by:
CcMdlWriteComplete
FsRtlMdlWriteCompleteDev