CcPrepareMdlWrite
VOID __stdcall CcPrepareMdlWrite(
_FILE_OBJECT *FileObject,
_LARGE_INTEGER *FileOffset,
UINT64 Length,
_MDL **MdlChain,
_IO_STATUS_BLOCK *IoStatus){
unsigned int v5;
unsigned int v7;
_FAST_MUTEX *SharedCacheMap;
char v9;
LONGLONG QuadPart;
unsigned int v11;
__int64 v12;
unsigned int v13;
__int64 v14;
char v15;
_SHARED_CACHE_MAP *v16;
_MDL *v17;
_KEVENT *v18;
_MDL *Next;
unsigned __int64 *Partition;
UINT64 RequestHighPriorityMapping;
UINT64 PerformingReadAhead;
UINT64 ReceivedLength;
int v24;
int v25;
unsigned __int64 v26;
INT64 Mdl;
_VACB *Vacb;
LONGLONG v29;
_KLOCK_QUEUE_HANDLE LockHandle;
_FAST_MUTEX *v31;
__int64 v32;
VOID *BaseAddress;
_MDL *i;
_ETHREAD *CurrentThread;
_ETHREAD *v36;
_ETHREAD *v37;
int v38;
v38 = Length;
v5 = Length;
Mdl = 0i64;
v26 = 0i64;
v24 = 0;
v7 = 0;
v25 = 0;
Vacb = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
SharedCacheMap = (_FAST_MUTEX *)FileObject->SectionObjectPointer->SharedCacheMap;
v31 = SharedCacheMap;
if( (FileObject->Flags & 0x10) == 0 )
{
CcForceWriteThrough(FileObject, (unsigned int)Length, (_SHARED_CACHE_MAP *)SharedCacheMap, 0);
if( v9 )
RtlRaiseStatus(-1073741670);
}
QuadPart = FileOffset->QuadPart;
v29 = QuadPart;
while( v5 )
{
LODWORD(ReceivedLength) = 0;
v32 = 0i64;
LODWORD(PerformingReadAhead) = 0;
LODWORD(RequestHighPriorityMapping) = 0;
BaseAddress = CcGetVirtualAddress(
(_SHARED_CACHE_MAP *)SharedCacheMap,
(_LARGE_INTEGER)QuadPart,
&Vacb,
&ReceivedLength,
RequestHighPriorityMapping,
PerformingReadAhead);
v11 = ReceivedLength;
if( (unsigned int)ReceivedLength > v5 )
v11 = v5;
ReceivedLength = v11 | 0x200000000i64;
v12 = QuadPart + v11;
v32 = v12;
v13 = 2;
if( (QuadPart & 0xFFF) == 0 )
{
if( v11 >= 0x1000 )
v13 = 3;
HIDWORD(ReceivedLength) = v13;
}
if( (v12 & 0xFFF) == 0 )
{
v13 |= 4u;
HIDWORD(ReceivedLength) = v13;
}
v26 = QuadPart & 0xFFFFFFFFFFFFF000ui64;
ExAcquireFastMutex(SharedCacheMap + 5);
v26 = *(_QWORD *)&SharedCacheMap->OldIrql - v26;
v14 = v26;
KeReleaseGuardedMutex(SharedCacheMap + 5);
if( v14 <= 0 )
{
v13 |= 7u;
LABEL_15:
HIDWORD(ReceivedLength) = v13;
goto LABEL_16;
}
if( (unsigned int)v26 <= 0x1000 && !HIDWORD(v26) )
{
v13 |= 6u;
goto LABEL_15;
}
LABEL_16:
CcMapAndRead(v11, v13, 1u, BaseAddress);
Mdl = (INT64)IoAllocateMdl(BaseAddress, v11, 0, 0, 0i64);
if( !Mdl )
RtlRaiseStatus(-1073741670);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v15 = CurrentThread->DisablePageFaultClustering + 2;
v24 = CurrentThread->DisablePageFaultClustering + 2;
v36 = CurrentThread;
CurrentThread->DisablePageFaultClustering = 1;
MiProbeAndLockPages(Mdl, 0, 1i64);
v37 = (_ETHREAD *)KeGetCurrentThread();
v37->DisablePageFaultClustering = v15 - 2;
v24 = 0;
ExAcquireFastMutex(SharedCacheMap + 5);
if( v12 > *(_QWORD *)&SharedCacheMap->OldIrql )
*(_QWORD *)&SharedCacheMap->OldIrql = v12;
KeReleaseGuardedMutex(SharedCacheMap + 5);
v16 = Vacb->SharedCacheMap;
if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)&Vacb->Overlay) )
{
v18 = (_KEVENT *)*((_QWORD *)v16 + 23);
if( v18 )
KeSetEvent(v18, 0, 0);
_InterlockedAdd((volatile signed __int32 *)v16 + 136, 0xFFFFFFFF);
}
Vacb = 0i64;
v17 = *MdlChain;
if( *MdlChain )
{
for( i = *MdlChain; ; i = Next )
{
Next = v17->Next;
if( !v17->Next )
break;
v17 = v17->Next;
}
v17->Next = (_MDL *)Mdl;
}
else
{
*MdlChain = (_MDL *)Mdl;
}
Mdl = 0i64;
QuadPart = v12;
v29 = v12;
v7 = ReceivedLength + v25;
v25 += ReceivedLength;
v5 = v38 - ReceivedLength;
v38 -= ReceivedLength;
}
Partition = (unsigned __int64 *)CcGetPartition(SharedCacheMap);
IoStatus->Status = 0;
IoStatus->Information = v7;
KeAcquireInStackQueuedSpinLock(Partition + 16, &LockHandle);
++*(&SharedCacheMap->Count + 1);
++*(_DWORD *)&SharedCacheMap[9].gap14[12];
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}Referenced by:
FsRtlPrepareMdlWriteDev