CcPinFileData

__int64 __fastcall CcPinFileData(
        __int64 a1,
        __int64 *a2,
        unsigned int a3,
        char a4,
        char a5,
        __int64 a6,
        _QWORD *a7,
        __int64 *a8,
        _QWORD *a9){
  char v10; 
  __int64 v11; 
  _SHARED_CACHE_MAP *v12; 
  __int64 *v13; 
  __int64 v14; 
  _FAST_MUTEX *p_BcbLock; 
  _ETHREAD *CurrentThread; 
  unsigned __int8 v17; 
  __int64 v18; 
  int SessionId; 
  bool v20; 
  unsigned __int8 CurrentIrql; 
  __int64 v22; 
  unsigned __int64 v23; 
  unsigned int v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 QuadPart; 
  unsigned __int64 v28; 
  _VACB **p_BcbList; 
  char *v30; 
  __int16 v31; 
  unsigned int v32; 
  unsigned int v33; 
  char v34; 
  __int64 v35; 
  __int64 *v36; 
  _FAST_MUTEX *v37; 
  unsigned __int64 OldIrql_low; 
  unsigned __int32 v39; 
  ERESOURCE *v40; 
  __int16 v41; 
  __int64 v42; 
  _ETHREAD *v43; 
  NTSTATUS v44; 
  unsigned __int64 v45; 
  char *v46; 
  unsigned int v47; 
  _ETHREAD *v48; 
  unsigned __int8 v49; 
  __int64 v50; 
  __int64 v51; 
  int v52; 
  __int16 v53; 
  unsigned __int8 v54; 
  unsigned __int64 v55; 
  unsigned __int32 v56; 
  __int64 v57; 
  struct _KEVENT *v58; 
  unsigned int v59; 
  UINT64 v60; 
  int v61; 
  ERESOURCE *v62; 
  int v63; 
  __int64 v64; 
  unsigned int v65; 
  __int16 v66; 
  unsigned int v67; 
  unsigned int v68; 
  __int64 v69; 
  ERESOURCE *v70; 
  unsigned __int8 v71; 
  _ETHREAD *v72; 
  char v73; 
  __int64 v74; 
  __int64 v76; 
  struct _KEVENT *v77; 
  char v78; 
  ULONG_PTR BugCheckParameter4; 
  UINT64 PerformingReadAhead; 
  unsigned __int8 v81; 
  int v82; 
  char *P; 
  _VACB *Vacb; 
  UINT64 ReceivedLength; 
  __int64 v86; 
  __int64 v87; 
  int v88; 
  unsigned int v89; 
  __int64 v90; 
  char *v91; 
  int v92; 
  unsigned int v93; 
  int v94; 
  int v95; 
  int v96; 
  char *v97; 
  __int64 v98; 
  __int64 v99; 
  _SHARED_CACHE_MAP *v100; 
  int v101; 
  _ETHREAD *v102; 
  _ETHREAD *v103; 
  UINT8 ReturnResult; 
  __int64 *v105; 
  unsigned int v106; 
  char v107; 
  v107 = a4;
  v106 = a3;
  v105 = a2;
  v10 = a6;
  v11 = 0i64;
  v90 = 0i64;
  ReceivedLength = 0i64;
  Vacb = 0i64;
  v12 = *(_SHARED_CACHE_MAP **)(*(_QWORD *)(a1 + 40) + 8i64);
  v100 = v12;
  if( *a2 + a3 > v12->SectionSize.QuadPart )
    KeBugCheckEx(0x34u, 0x128ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  *a7 = 0i64;
  v13 = a8;
  *a8 = 0i64;
  if( (v10 & 4) != 0 )
  {
    LODWORD(ReceivedLength) = 0x40000 - (*(_DWORD *)a2 & 0x3FFFF);
    CcReferenceFileOffset(v12, *(_LARGE_INTEGER *)a2);
  }
  else
  {
    LODWORD(PerformingReadAhead) = 0;
    LODWORD(BugCheckParameter4) = (v10 & 0x40) != 0;
    LODWORD(v14) = CcGetVirtualAddress(
                     v12,
                     *(_LARGE_INTEGER *)a2,
                     &Vacb,
                     &ReceivedLength,
                     BugCheckParameter4,
                     PerformingReadAhead);
    *v13 = v14;
  }
  p_BcbLock = &v12->BcbLock;
  v93 = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 243);
  if( ++*((_BYTE *)CurrentThread + 794) != 1 )
    KeBugCheckEx(0x192u, (ULONG_PTR)CurrentThread, (ULONG_PTR)&v12->BcbLock, KeGetCurrentIrql(), 0i64);
  v92 = 0;
  v17 = *((_BYTE *)CurrentThread + 792);
  if( v17 )
    goto LABEL_6;
  if( *((_BYTE *)CurrentThread + 870) )
  {
    v78 = *((_BYTE *)CurrentThread + 870);
    *((_BYTE *)CurrentThread + 870) = 0;
    v17 = *((_BYTE *)CurrentThread + 792) | v78;
LABEL_6:
    _BitScanForward((unsigned int *)&v18, v17);
    v92 = v18;
    *((_BYTE *)CurrentThread + 792) = v17 & ~(1 << v18);
    v11 = *((_QWORD *)CurrentThread + 100) + 96 * v18;
  }
  if( v11 )
  {
    if( (unsigned __int64)p_BcbLock >= 0xFFFF800000000000ui64
      && MiState[(((unsigned __int64)p_BcbLock >> 39) & 0x1FF) + 12296] == 1 )
    {
      SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
    }
    else
    {
      SessionId = -1;
    }
    *(_DWORD *)(v11 + 40) = SessionId;
    *(_QWORD *)(v11 + 32) = (unsigned __int64)p_BcbLock & 0x7FFFFFFFFFFFFFFCi64;
  }
  else
  {
    _interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
  }
  --*((_BYTE *)CurrentThread + 794);
  KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, (__int64)&v12->BcbLock, &v93);
  v20 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
  if( v20 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
    KiCheckForKernelApcDelivery();
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(1ui64);
  if( !_interlockedbittestandreset(&p_BcbLock->Count, 0) )
    ExpAcquireFastMutexContended(&v12->BcbLock, (PVOID)v11);
  if( v11 )
    *(_BYTE *)(v11 + 26) |= 1u;
  v12->BcbLock.Owner = KeGetCurrentThread();
  v12->BcbLock.OldIrql = CurrentIrql;
  v82 = 1;
  v87 = 0i64;
  v86 = 0i64;
  v22 = *a2;
  v23 = HIDWORD(*a2);
  v24 = v106;
  v25 = *a2 + v106;
  v90 = v25;
  v97 = 0i64;
  v26 = v22 + 0x80000;
  QuadPart = v12->SectionSize.QuadPart;
  v28 = HIDWORD(v22);
  if( QuadPart <= 0x200000 || (LODWORD(v28) = v23, (v12->Flags & 0x200) == 0) )
  {
    LODWORD(v23) = v28;
    goto LABEL_113;
  }
  if( QuadPart <= 0x2000000 )
  {
    if( v26 < QuadPart )
    {
      p_BcbList = &v12->Vacbs[2 * (v26 >> 19)] + ((unsigned __int64)(unsigned int)QuadPart >> 18);
      goto LABEL_23;
    }
LABEL_113:
    p_BcbList = (_VACB **)&v12->BcbList;
    goto LABEL_23;
  }
  p_BcbList = (_VACB **)CcGetBcbListHeadLargeOffset((INT64)v12, v22 + 0x80000, 1);
  v24 = v106;
LABEL_23:
  v30 = (char *)*p_BcbList - 16;
  v97 = v30;
  if( (_DWORD)v23 || (v31 = *(_WORD *)v30, *(_WORD *)v30 != 765) || *((_DWORD *)v30 + 9) )
  {
    while( *(_WORD *)v30 == 765 && v22 < *((_QWORD *)v30 + 4) )
    {
      v74 = *((_QWORD *)v30 + 1);
      if( v22 >= v74 )
      {
        v34 = 1;
        goto LABEL_34;
      }
      if( v25 >= v74 )
        v25 = *((_QWORD *)v30 + 1);
      v90 = v25;
      v30 = (char *)(*((_QWORD *)v30 + 2) - 16i64);
      v97 = v30;
    }
  }
  else
  {
    v32 = v90;
    while( v31 == 765 && (unsigned int)v22 < *((_DWORD *)v30 + 8) )
    {
      v33 = *((_DWORD *)v30 + 2);
      if( (unsigned int)v22 >= v33 )
      {
        v34 = 1;
        goto LABEL_34;
      }
      if( v32 >= v33 )
      {
        v32 = *((_DWORD *)v30 + 2);
        LODWORD(v90) = v32;
        v25 = v90;
      }
      v30 = (char *)(*((_QWORD *)v30 + 2) - 16i64);
      v97 = v30;
      v31 = *(_WORD *)v30;
    }
  }
  v34 = 0;
LABEL_34:
  P = v30;
  if( !v34 )
  {
    if( (v10 & 8) != 0 )
    {
      v30 = 0i64;
      P = 0i64;
      v81 = 0;
      v36 = a8;
      goto LABEL_72;
    }
    v87 = v22;
    v64 = v25 - v22;
    v63 = v22 & 0xFFF;
    LODWORD(v64) = v63 + v64;
    v86 = v64;
    v65 = v63 + ReceivedLength;
    LODWORD(ReceivedLength) = v63 + ReceivedLength;
    if( (v107 || (v12->Flags & 4) != 0) && (v66 = v22, !a5) )
    {
      v67 = HIDWORD(ReceivedLength);
    }
    else
    {
      v66 = v22;
      v67 = 2;
      HIDWORD(ReceivedLength) = 2;
      if( !v63 )
      {
        if( v24 >= 0x1000 )
          v67 = 3;
        HIDWORD(ReceivedLength) = v67;
      }
      if( (v64 & 0xFFF) == 0 )
      {
        v67 |= 4u;
        HIDWORD(ReceivedLength) = v67;
      }
    }
    if( (v12->Flags & 0x200) == 0 )
      v107 = 1;
    v68 = (v64 + 4095) & 0xFFFFF000;
    LODWORD(v86) = v68;
    *a8 -= v66 & 0xFFF;
    LODWORD(v87) = v87 & 0xFFFFF000;
    if( v68 > v65 )
    {
      v68 = v65;
      LODWORD(v86) = v65;
    }
    v69 = CcAllocateInitializeBcb(v12, v30, &v87, &v86);
    v30 = (char *)v69;
    P = (char *)v69;
    if( (v10 & 1) != 0 )
    {
      if( !v69 )
      {
        KeReleaseGuardedMutex(&v12->BcbLock);
        RtlRaiseStatus(-1073741670);
      }
      if( !v107 )
      {
        v70 = (ERESOURCE *)(v69 + 72);
        if( (v10 & 2) != 0 )
        {
          if( !ExAcquireResourceExclusiveLite(v70, 0) )
            KeBugCheckEx(0x34u, 0x201F6ui64, (ULONG_PTR)v30, 0i64, 0i64);
        }
        else if( !ExAcquireSharedStarveExclusive(v70, 0) )
        {
          KeBugCheckEx(0x34u, 0x201FDui64, (ULONG_PTR)v30, 0i64, 0i64);
        }
      }
      KeReleaseGuardedMutex(&v12->BcbLock);
      v82 = 0;
      if( (v10 & 4) == 0 )
      {
        CcMapAndRead(v68, v67, 1u, (VOID *)*a8);
        ExAcquireFastMutex(&v12->BcbLock);
        if( !*((_QWORD *)v30 + 23) )
        {
          *((_QWORD *)v30 + 23) = *a8;
          *((_QWORD *)v30 + 7) = Vacb;
          Vacb = 0i64;
        }
        KeReleaseGuardedMutex(&v12->BcbLock);
        *a8 = *((_QWORD *)v30 + 23) + (unsigned int)(*(_DWORD *)a2 - *((_DWORD *)v30 + 2));
      }
      v36 = a8;
      goto LABEL_71;
    }
    if( !v69 )
    {
      v81 = 0;
      v36 = a8;
      goto LABEL_72;
    }
    if( !v107 && !ExAcquireSharedStarveExclusive((ERESOURCE *)(v69 + 72), 0) )
      KeBugCheckEx(0x34u, 0x2025Dui64, (ULONG_PTR)v30, 0i64, 0i64);
    KeReleaseGuardedMutex(&v12->BcbLock);
    v82 = 0;
    if( !CcMapAndRead(v68, v67, 0, (VOID *)*a8) )
    {
      v81 = 0;
      v36 = a8;
      goto LABEL_72;
    }
    ExAcquireFastMutex(&v12->BcbLock);
    v36 = a8;
    if( !*((_QWORD *)v30 + 23) )
    {
      *((_QWORD *)v30 + 23) = *a8;
      *((_QWORD *)v30 + 7) = Vacb;
      Vacb = 0i64;
    }
    goto LABEL_132;
  }
  if( (v12->Flags & 0x200) == 0 )
    v107 = 1;
  if( *((_QWORD *)v30 + 23) )
  {
    if( (v10 & 1) != 0 )
    {
      ++*((_DWORD *)v30 + 16);
      KeReleaseGuardedMutex(&v12->BcbLock);
      v82 = 0;
      if( !v107 )
      {
        v62 = (ERESOURCE *)(v30 + 72);
        if( (v10 & 2) != 0 )
          ExAcquireResourceExclusiveLite(v62, 1u);
        else
          ExAcquireSharedStarveExclusive(v62, 1u);
      }
    }
    else
    {
      if( !v107 && !ExAcquireSharedStarveExclusive((ERESOURCE *)(v30 + 72), 0) )
      {
        v30 = 0i64;
        P = 0i64;
        v81 = 0;
        v36 = a8;
        goto LABEL_72;
      }
      ++*((_DWORD *)v30 + 16);
      KeReleaseGuardedMutex(&v12->BcbLock);
      v82 = 0;
    }
    v36 = a8;
    *a8 = *((_QWORD *)v30 + 23) + (unsigned int)(*(_DWORD *)a2 - *((_DWORD *)v30 + 2));
    goto LABEL_71;
  }
  v35 = (unsigned int)(v22 - *((_DWORD *)v30 + 2));
  v36 = a8;
  *a8 -= v35;
  v87 = *((_QWORD *)v30 + 1);
  v86 = *((unsigned int *)v30 + 1);
  if( (v10 & 1) == 0 )
  {
    if( !v107 && !ExAcquireSharedStarveExclusive((ERESOURCE *)(v30 + 72), 0) )
    {
      v30 = 0i64;
      P = 0i64;
      v81 = 0;
      goto LABEL_72;
    }
    ++*((_DWORD *)v30 + 16);
    KeReleaseGuardedMutex(&v12->BcbLock);
    v82 = 0;
    if( !CcMapAndRead(*((unsigned int *)v30 + 1), 0i64, 0, (VOID *)*v36) )
    {
      v81 = 0;
      goto LABEL_72;
    }
    ExAcquireFastMutex(&v12->BcbLock);
    if( !*((_QWORD *)v30 + 23) )
    {
      *((_QWORD *)v30 + 23) = *v36;
      *((_QWORD *)v30 + 7) = Vacb;
      Vacb = 0i64;
    }
LABEL_132:
    KeReleaseGuardedMutex(&v12->BcbLock);
    *v36 = *((_QWORD *)v30 + 23) + (unsigned int)(*(_DWORD *)a2 - *((_DWORD *)v30 + 2));
    goto LABEL_71;
  }
  ++*((_DWORD *)v30 + 16);
  v37 = &v12->BcbLock;
  v12->BcbLock.Owner = 0i64;
  OldIrql_low = LOBYTE(v12->BcbLock.OldIrql);
  v39 = _InterlockedCompareExchange(&v12->BcbLock.Count, 1, 0);
  if( v39 )
    ExpReleaseFastMutexContended(&v12->BcbLock, v39);
  __writecr8(OldIrql_low);
  KeAbPostRelease(&v12->BcbLock);
  v82 = 0;
  if( !v107 )
  {
    v40 = (ERESOURCE *)(v30 + 72);
    if( (v10 & 2) != 0 )
    {
      ExAcquireResourceExclusiveLite(v40, 1u);
    }
    else
    {
      if( (v40->Flag & 0x41) == 1 )
        KeBugCheckEx(0x1C6u, 0xFui64, (ULONG_PTR)v40, 0i64, 0i64);
      v41 = v40->Flag & 1;
      if( v41 )
      {
        v71 = KeGetCurrentIrql();
        v72 = (_ETHREAD *)KeGetCurrentThread();
        if( v71 > 1u )
          KeBugCheckEx(0x1C6u, 0i64, v71, 1ui64, 0i64);
        if( (*((_BYTE *)v72 + 192) & 2) != 0 )
          KeBugCheckEx(0x1C6u, 6ui64, 0i64, 0i64, 0i64);
        if( !v71 && (*((_DWORD *)v72 + 29) & 0x400) == 0 && !*((_DWORD *)v72 + 121) )
          KeBugCheckEx(0x1C6u, 7ui64, 0i64, 0i64, 0i64);
      }
      if( v41 )
        ExpFastResourceLegacyAcquireSharedStarveExclusive(v40);
      else
        ExpAcquireSharedStarveExclusive(v40, 1);
    }
  }
  if( (v10 & 4) == 0 )
  {
    v42 = *a8;
    v43 = (_ETHREAD *)KeGetCurrentThread();
    v102 = v43;
    v94 = 0;
    v101 = 0;
    v44 = 0;
    v95 = 0;
    ReturnResult = 1;
    v45 = ((v42 & 0xFFF) + (unsigned __int64)(unsigned int)v86 + 4095) >> 12;
    v88 = v45;
    v46 = (char *)(v42 & 0xFFFFFFFFFFFFF000ui64);
    v91 = v46;
    v47 = *((unsigned __int8 *)v43 + 1308) + 4 * *((_DWORD *)v43 + 322);
    while( (_DWORD)v45 )
    {
      *((_BYTE *)v43 + 1308) = 1;
      v59 = v45 - 1;
      if( (unsigned int)(v45 - 1) > *((_DWORD *)v43 + 322) )
      {
        if( v59 > 0xF )
          v59 = 15;
        *((_DWORD *)v43 + 322) = v59;
      }
      v94 = 0;
      v60 = (unsigned int)((_DWORD)v45 << 12);
      v91 = (char *)(unsigned int)v60;
      MmCheckCachedPageStates(v46, v60, 0i64, &ReturnResult);
      v44 = v61;
      v95 = v61;
      if( v61 < 0 )
        break;
      v46 = &v46[(_QWORD)v91];
      v91 = v46;
      LODWORD(v45) = 0;
      v88 = 0;
    }
    *((_BYTE *)v43 + 1308) = v47 & 3;
    *((_DWORD *)v43 + 322) = v47 >> 2;
    if( v44 < 0 )
      RtlRaiseStatus(v44);
    v99 = 0i64;
    v89 = 0;
    v48 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v48 + 243);
    if( ++*((_BYTE *)v48 + 794) != 1 )
      KeBugCheckEx(0x192u, (ULONG_PTR)v48, (ULONG_PTR)&v12->BcbLock, KeGetCurrentIrql(), 0i64);
    v99 = 0i64;
    v98 = 0i64;
    v96 = 0;
    v49 = *((_BYTE *)v48 + 792);
    if( !v49 )
    {
      if( !*((_BYTE *)v48 + 870) )
      {
        v51 = 0i64;
        v98 = 0i64;
        goto LABEL_54;
      }
      v73 = *((_BYTE *)v48 + 870);
      *((_BYTE *)v48 + 870) = 0;
      *((_BYTE *)v48 + 792) |= v73;
      v49 = *((_BYTE *)v48 + 792);
    }
    _BitScanForward((unsigned int *)&v50, v49);
    v96 = v50;
    *((_BYTE *)v48 + 792) = v49 & ~(1 << v50);
    v51 = *((_QWORD *)v48 + 100) + 96 * v50;
    v98 = v51;
LABEL_54:
    v99 = v51;
    if( v51 )
    {
      if( (unsigned __int64)v37 >= 0xFFFF800000000000ui64
        && MiState[(((unsigned __int64)v37 >> 39) & 0x1FF) + 12296] == 1 )
      {
        v52 = MmGetSessionIdEx(*((_QWORD *)v48 + 23));
      }
      else
      {
        v52 = -1;
      }
      *(_DWORD *)(v51 + 40) = v52;
      *(_QWORD *)(v51 + 32) = (unsigned __int64)v37 & 0x7FFFFFFFFFFFFFFCi64;
    }
    else
    {
      _interlockedbittestandset((volatile signed __int32 *)v48 + 30, 0x10u);
    }
    --*((_BYTE *)v48 + 794);
    KiAbThreadRemoveBoosts((ULONG_PTR)v48, (__int64)&v12->BcbLock, &v89);
    v53 = *((_WORD *)v48 + 243);
    *((_WORD *)v48 + 243) = v53 + 1;
    if( v53 == -1 && *((_ETHREAD **)v48 + 19) != (_ETHREAD *)((char *)v48 + 152) )
      KiCheckForKernelApcDelivery();
    v54 = KeGetCurrentIrql();
    __writecr8(1ui64);
    if( !_interlockedbittestandreset(&v37->Count, 0) )
      ExpAcquireFastMutexContended(&v12->BcbLock, (PVOID)v51);
    if( v51 )
      *(_BYTE *)(v51 + 26) |= 1u;
    v103 = (_ETHREAD *)KeGetCurrentThread();
    v12->BcbLock.Owner = v103;
    v12->BcbLock.OldIrql = v54;
    if( !*((_QWORD *)P + 23) )
    {
      *((_QWORD *)P + 23) = *a8;
      *((_QWORD *)P + 7) = Vacb;
      Vacb = 0i64;
    }
    v12->BcbLock.Owner = 0i64;
    v55 = LOBYTE(v12->BcbLock.OldIrql);
    v56 = _InterlockedCompareExchange(&v37->Count, 1, 0);
    if( v56 )
      ExpReleaseFastMutexContended(&v12->BcbLock, v56);
    __writecr8(v55);
    KeAbPostRelease(&v12->BcbLock);
    v30 = P;
    v36 = a8;
    *a8 = *((_QWORD *)P + 23) + (unsigned int)(*(_DWORD *)a2 - *((_DWORD *)P + 2));
    goto LABEL_71;
  }
  v30 = P;
  v36 = a8;
LABEL_71:
  v81 = 1;
LABEL_72:
  if( (v10 & 6) == 6 && v30 && *((_QWORD *)v30 + 23) )
  {
    v57 = *(_QWORD *)(*((_QWORD *)v30 + 7) + 8i64);
    if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)(*((_QWORD *)v30 + 7) + 16i64)) )
    {
      v58 = *(struct _KEVENT **)(v57 + 184);
      if( v58 )
        KeSetEvent(v58, 0);
      _InterlockedDecrement((volatile signed __int32 *)(v57 + 544));
    }
    *((_QWORD *)v30 + 23) = 0i64;
    *((_QWORD *)v30 + 7) = 0i64;
    v30 = P;
  }
  if( v82 )
    KeReleaseGuardedMutex(&v12->BcbLock);
  if( Vacb )
  {
    v76 = *((_QWORD *)Vacb + 1);
    if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)Vacb + 4) )
    {
      v77 = *(struct _KEVENT **)(v76 + 184);
      if( v77 )
        KeSetEvent(v77, 0);
      _InterlockedDecrement((volatile signed __int32 *)(v76 + 544));
    }
    v30 = P;
  }
  if( (v10 & 4) != 0 )
    CcDereferenceFileOffset((INT64)v12, *a2);
  if( v81 )
  {
    *a7 = v30;
    *a9 = *((_QWORD *)v30 + 4);
  }
  else
  {
    *v36 = 0i64;
    if( v30 )
      CcUnpinFileDataEx(v30, v107, 0);
  }
  return v81;
}

Referenced by:

CcMapData
CcMapDataCommon
CcPinMappedData
CcPinRead
CcPreparePinWrite
CcZeroDataInCache