CcSetDirtyPinnedData
VOID __stdcall CcSetDirtyPinnedData(PVOID BcbVoid, _LARGE_INTEGER *Lsn){
UINT64 *v2;
__int16 v4;
__int64 *v6;
PVOID v7;
_SHARED_CACHE_MAP *v8;
_CC_PARTITION *Partition;
__int64 v10;
unsigned __int8 CurrentIrql;
signed __int32 v12;
ULONG_PTR *v13;
unsigned int Flags;
__int64 v15;
_SHARED_CACHE_MAP *v16;
_ETHREAD *CurrentThread;
_FAST_MUTEX *p_BcbLock;
unsigned __int8 v19;
__int64 v20;
__int64 v21;
int SessionId;
bool v23;
unsigned __int8 v24;
unsigned int v25;
__int64 v26;
LONGLONG v27;
LONGLONG QuadPart;
LONGLONG v29;
_LARGE_INTEGER v30;
unsigned __int64 OldIrql_low;
unsigned __int32 v32;
unsigned int v33;
unsigned int v34;
__int64 v35;
__int64 v36;
signed __int32 v37;
_CC_PARTITION *v38;
__int64 v39[2];
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT64 SpinCount;
int v42;
unsigned int v43;
v4 = *(_WORD *)BcbVoid;
memset(&LockHandle, 0, sizeof(LockHandle));
if( v4 != 765 && v4 != 762 )
KeBugCheckEx(0x34u, 0xE79ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
v6 = v39;
v7 = BcbVoid;
v39[0] = (__int64)BcbVoid;
v39[1] = 0i64;
if( v4 == 762 )
{
v7 = (PVOID)*((_QWORD *)BcbVoid + 2);
v6 = (__int64 *)((char *)BcbVoid + 16);
}
v8 = (_SHARED_CACHE_MAP *)*((_QWORD *)v7 + 22);
Partition = v8->Partition;
v38 = Partition;
if( v8->Section )
{
v10 = *(_QWORD *)((v8->FileObjectFastRef.Value & 0xFFFFFFFFFFFFFFF0ui64) + 0x28);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset(&dword_140C4C6C0, 0x1Fu) )
LODWORD(SpinCount) = ExpWaitForSpinLockExclusiveAndAcquire((RTL_BITMAP *)&dword_140C4C6C0, CurrentIrql, v2);
v12 = dword_140C4C6C0;
while( (v12 & 0xBFFFFFFF) != 0x80000000 )
{
if( (v12 & 0x40000000) == 0 )
{
v37 = _InterlockedCompareExchange(&dword_140C4C6C0, v12 | 0x40000000, v12);
v23 = v12 == v37;
v12 = v37;
if( !v23 )
continue;
}
KeYieldProcessorEx(&SpinCount);
v12 = dword_140C4C6C0;
}
if( *(_QWORD *)v10 )
v13 = *(ULONG_PTR **)(qword_140C4E388 + 8i64 * (*(_WORD *)(*(_QWORD *)v10 + 60i64) & 0x3FF));
else
v13 = &MiSystemPartition;
dword_140C4C6C0 = 0;
__writecr8(CurrentIrql);
Partition = v38;
if( v38 != *(_CC_PARTITION **)(v13[22] + 8) )
KeBugCheckEx(0x34u, 0x1313ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
}
Flags = v8->Flags;
if( (Flags & 0x1000000) != 0 && *((_QWORD *)v8->V1.LogHandle + 17) == -1i64 )
{
*((_QWORD *)v8->V1.LogHandle + 17) = KUSER_SHARED_DATA.TickCountQuad;
Flags = v8->Flags;
}
if( (Flags & 0x200) != 0 )
{
v15 = *v6;
if( *v6 )
{
while( 1 )
{
v39[0] = v15;
++v6;
if( (v15 & 1) != 0 )
KeBugCheckEx(0x34u, 0xED9ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
v16 = *(_SHARED_CACHE_MAP **)(v15 + 176);
v43 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
p_BcbLock = &v16->BcbLock;
--*((_WORD *)CurrentThread + 243);
if( ++*((_BYTE *)CurrentThread + 794) != 1 )
KeBugCheckEx(0x192u, (ULONG_PTR)CurrentThread, (ULONG_PTR)&v16->BcbLock, KeGetCurrentIrql(), 0i64);
v19 = *((_BYTE *)CurrentThread + 792);
v42 = 0;
if( !v19 )
{
if( !*((_BYTE *)CurrentThread + 870) )
{
v21 = 0i64;
LABEL_61:
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
goto LABEL_24;
}
v36 = *((unsigned __int8 *)CurrentThread + 870);
*((_BYTE *)CurrentThread + 870) = 0;
v19 = *((_BYTE *)CurrentThread + 792) | v36;
}
_BitScanForward((unsigned int *)&v20, v19);
v42 = v20;
*((_BYTE *)CurrentThread + 792) = v19 & ~(1 << v20);
v21 = *((_QWORD *)CurrentThread + 100) + 96 * v20;
if( !v21 )
goto LABEL_61;
if( (unsigned __int64)p_BcbLock >= 0xFFFF800000000000ui64
&& MiState[(((unsigned __int64)p_BcbLock >> 39) & 0x1FF) + 12296] == 1 )
{
SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
}
else
{
SessionId = -1;
}
*(_DWORD *)(v21 + 40) = SessionId;
*(_QWORD *)(v21 + 32) = (unsigned __int64)p_BcbLock & 0x7FFFFFFFFFFFFFFCi64;
LABEL_24:
--*((_BYTE *)CurrentThread + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, (__int64)&v16->BcbLock, &v43);
v23 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
if( v23 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
KiCheckForKernelApcDelivery();
v24 = KeGetCurrentIrql();
__writecr8(1ui64);
if( !_interlockedbittestandreset(&p_BcbLock->Count, 0) )
ExpAcquireFastMutexContended(&v16->BcbLock, (PVOID)v21);
if( v21 )
*(_BYTE *)(v21 + 26) |= 1u;
v16->BcbLock.Owner = KeGetCurrentThread();
v25 = v24;
v26 = v39[0];
v16->BcbLock.OldIrql = v25;
if( !*(_BYTE *)(v26 + 2) )
{
v33 = *(_DWORD *)(v26 + 4) >> 12;
*(_BYTE *)(v26 + 2) = 1;
if( Lsn )
{
*(_LARGE_INTEGER *)(v26 + 40) = *Lsn;
*(_LARGE_INTEGER *)(v26 + 48) = *Lsn;
}
KeAcquireInStackQueuedSpinLock((UINT64 *)Partition + 16, &LockHandle);
if( !v16->DirtyPages && (v16->Flags & 2) == 0 )
{
CcScheduleLazyWriteScan((UINT8)Partition, 0);
CcInsertIntoDirtySharedCacheMapList(v16);
}
CcChargeDirtyPages((INT64)v16, 0i64, 0i64, v33);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( (v16->Flags & 0x10000000) != 0 )
{
v34 = v33 << 12;
v35 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 68) + 2232i64);
if( v35 )
{
if( v34 )
_InterlockedExchangeAdd64((volatile signed __int64 *)(v35 + 8), v34);
_InterlockedExchangeAdd64((volatile signed __int64 *)(v35 + 24), 1ui64);
v26 = v39[0];
}
else
{
v26 = v39[0];
}
}
}
if( Lsn )
{
v27 = *(_QWORD *)(v26 + 40);
QuadPart = Lsn->QuadPart;
if( !v27 || QuadPart < v27 )
{
*(_QWORD *)(v26 + 40) = QuadPart;
QuadPart = Lsn->QuadPart;
}
v29 = *(_QWORD *)(v26 + 48);
if( !v29 || QuadPart > v29 )
{
*(_QWORD *)(v26 + 48) = QuadPart;
QuadPart = Lsn->QuadPart;
}
if( QuadPart > v16->LargestLSN.QuadPart )
v16->LargestLSN.QuadPart = QuadPart;
}
v30 = *(_LARGE_INTEGER *)(v26 + 32);
if( v30.QuadPart > v16->ValidDataGoal.QuadPart )
v16->ValidDataGoal = v30;
OldIrql_low = LOBYTE(v16->BcbLock.OldIrql);
v16->BcbLock.Owner = 0i64;
v32 = _InterlockedCompareExchange(&p_BcbLock->Count, 1, 0);
if( v32 )
ExpReleaseFastMutexContended(&v16->BcbLock, v32);
__writecr8(OldIrql_low);
KeAbPostRelease(&v16->BcbLock);
v15 = *v6;
if( !*v6 )
return;
Partition = v38;
}
}
}
else
{
CcSetDirtyInMask(v8, (_LARGE_INTEGER *)BcbVoid + 1, *((unsigned int *)BcbVoid + 1), 0i64);
}
}Referenced by:
CcPreparePinWrite
CcReleaseByteRangeFromWrite
CcUnpinRepinnedBcb
CcZeroDataInCache