CcRemoveVacbArray

VOID __stdcall CcRemoveVacbArray(_VACB_ARRAY_HEADER *VacbArrayHeader){
  unsigned int v1; 
  __int64 VacbArrayIndex; 
  unsigned int v4; 
  _QWORD *v5; 
  int v6; 
  unsigned int *v7; 
  __int64 v8; 
  unsigned int **v9; 

  v1 = 0;
  if( VacbArrayHeader->MappingCount )
    KeBugCheckEx(0x34u, (PVOID)0x20D, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
  VacbArrayIndex = VacbArrayHeader->VacbArrayIndex;
  if( *(_VACB_ARRAY_HEADER **)(*(&CmpDummyThreadEvent + 352) + 8 * VacbArrayIndex) != VacbArrayHeader )
    KeBugCheckEx(0x34u, (PVOID)0x213, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
  v4 = dword_140C50308;
  if( (_DWORD)VacbArrayIndex == dword_140C50308 && dword_140C50308 )
  {
    v5 = (_QWORD *)(*(&CmpDummyThreadEvent + 352) + 8i64 * dword_140C50308);
    while( !*v5 )
    {
      --v5;
      if( !--v4 )
        goto LABEL_10;
    }
    dword_140C50308 = v4;
  }
LABEL_10:
  v6 = *(&CmpDummyThreadEvent + 712);
  *(_QWORD *)(*(&CmpDummyThreadEvent + 352) + 8 * VacbArrayIndex) = 0i64;
  if( !v6 )
    KeBugCheckEx(0x34u, (PVOID)0x22F, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
  *(&CmpDummyThreadEvent + 712) = v6 - 1;
  do
  {
    v7 = &VacbArrayHeader[2].VacbArrayIndex + 10 * v1;
    v8 = *(_QWORD *)v7;
    if( *(unsigned int **)(*(_QWORD *)v7 + 8i64) != v7 || (v9 = (unsigned int **)*((_QWORD *)v7 + 1), *v9 != v7) )
      __fastfail(3u);
    ++v1;
    *v9 = (unsigned int *)v8;
    *(_QWORD *)(v8 + 8) = v9;
  }
  while( v1 < 0xCCC );
  *(&CmpDummyThreadEvent + 702) -= 3276;
}

Referenced by:

CcDereferenceVacbArray