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.