CcDeferWrite
VOID __stdcall CcDeferWrite(
PFILE_OBJECT FileObject,
PCC_POST_DEFERRED_WRITE PostRoutine,
PVOID Context1,
PVOID Context2,
ULONG BytesToWrite,
BOOLEAN Retrying){
char *PoolWithTag;
INT64 PartitionFromFileObject;
KSPIN_LOCK *v12;
_LIST_ENTRY *v13;
_LIST_ENTRY *v14;
struct _KLOCK_QUEUE_HANDLE LockHandle;
KLOCK_QUEUE_HANDLE v16;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v16, 0, sizeof(v16));
PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x60ui64, 0x77446343ui64);
if( PoolWithTag )
{
KeAcquireInStackQueuedSpinLock(&CcMasterLock, &LockHandle);
PartitionFromFileObject = CcGetPartitionFromFileObject((INT64)FileObject);
if( _InterlockedIncrement64((volatile signed __int64 *)(PartitionFromFileObject + 968)) <= 1 )
__fastfail(0xEu);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( _InterlockedIncrement64((volatile signed __int64 *)(PartitionFromFileObject + 968)) <= 1 )
__fastfail(0xEu);
v12 = (KSPIN_LOCK *)(PartitionFromFileObject + 832);
*((_QWORD *)PoolWithTag + 5) = 0i64;
v13 = (_LIST_ENTRY *)(PoolWithTag + 24);
v14 = (_LIST_ENTRY *)(PartitionFromFileObject + 784);
*((_QWORD *)PoolWithTag + 1) = FileObject;
*((_DWORD *)PoolWithTag + 4) = BytesToWrite;
*((_QWORD *)PoolWithTag + 9) = PartitionFromFileObject;
*(_DWORD *)PoolWithTag = 6292220;
*((_QWORD *)PoolWithTag + 6) = PostRoutine;
*((_QWORD *)PoolWithTag + 7) = Context1;
*((_QWORD *)PoolWithTag + 8) = Context2;
*((_QWORD *)PoolWithTag + 11) = KUSER_SHARED_DATA.TickCountQuad;
PoolWithTag[80] = 0;
if( Retrying )
ExInterlockedInsertHeadList(v14, v13, v12);
else
ExInterlockedInsertTailList(v14, v13, v12);
CcPostDeferredWrites();
KeAcquireInStackQueuedSpinLock((UINT64 *)(PartitionFromFileObject + 128), &v16);
CcScheduleLazyWriteScan(PartitionFromFileObject, 1u);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v16);
__writecr8(v16.OldIrql);
CcDereferencePartition(PartitionFromFileObject);
}
else
{
((void(__fastcall *)(PVOID, PVOID))PostRoutine)(Context1, Context2);
}
}Referenced by:
No references.