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