CcSetLogHandleForFile

VOID __stdcall CcSetLogHandleForFile(PFILE_OBJECT FileObject, PVOID LogHandle, PFLUSH_TO_LSN FlushToLsnRoutine){
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  char *SharedCacheMap; 
  INT64 Partition; 
  bool v8; 
  char **v9; 
  void **v10; 
  INT64 *v11; 
  INT64 v12; 
  INT64 **v13; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  memset(&LockHandle, 0, sizeof(LockHandle));
  SectionObjectPointer = FileObject->SectionObjectPointer;
  SharedCacheMap = (char *)SectionObjectPointer->SharedCacheMap;
  if( !*((_DWORD *)SharedCacheMap + 1) )
    KeBugCheckEx(0x34u, 0x27Bui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  if( (*((_DWORD *)SharedCacheMap + 38) & 0x1000000) != 0 )
    KeBugCheckEx(0x34u, 0x281ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  Partition = CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap);
  KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &LockHandle);
  v8 = *((_QWORD *)SharedCacheMap + 30) == 0i64;
  *((_QWORD *)SharedCacheMap + 31) = FlushToLsnRoutine;
  if( !v8 )
  {
    v9 = (char **)*((_QWORD *)SharedCacheMap + 15);
    v10 = (void **)*((_QWORD *)SharedCacheMap + 16);
    if( v9[1] != SharedCacheMap + 120 || *v10 != SharedCacheMap + 120 )
      goto LABEL_14;
    *v10 = v9;
    v9[1] = (char *)v10;
  }
  if( LogHandle )
  {
    *((_DWORD *)SharedCacheMap + 38) |= 0x2000000u;
    v11 = (INT64 *)(SharedCacheMap + 120);
    if( *((_DWORD *)SharedCacheMap + 28) )
      v12 = Partition + 96;
    else
      v12 = Partition + 32;
    v13 = *(INT64 ***)(v12 + 8);
    if( *v13 == (INT64 *)v12 )
    {
      *v11 = v12;
      *((_QWORD *)SharedCacheMap + 16) = v13;
      *v13 = v11;
      *(_QWORD *)(v12 + 8) = v11;
      goto LABEL_12;
    }
LABEL_14:
    __fastfail(3u);
  }
LABEL_12:
  *((_QWORD *)SharedCacheMap + 30) = LogHandle;
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

No references.