CcUninitializeCacheMap
VOID __fastcall CcUninitializeCacheMap(
_FILE_OBJECT *FileObject,
_LARGE_INTEGER *TruncateSize,
_CACHE_UNINITIALIZE_EVENT *UninitializeEvent){
bool v4;
_FILE_OBJECT *v5;
char *Partition;
unsigned __int8 CurrentIrql;
_FILE_OBJECT **PrivateCacheMap;
_LARGE_INTEGER *SharedCacheMap;
_FILE_OBJECT *v10;
void **v11;
_CACHE_UNINITIALIZE_EVENT *v12;
ULONG LowPart;
bool v14;
unsigned __int64 OldIrql;
_FILE_OBJECT *v16;
__int64 v17;
_DEVICE_OBJECT *DeviceObject;
VOID *FsContext;
_KLOCK_QUEUE_HANDLE LockQueue;
_KLOCK_QUEUE_HANDLE LockHandle;
_KLOCK_QUEUE_HANDLE v22;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)((char *)&WheapErrorSourceTable + 1512);
v4 = 0;
LockQueue.LockQueue.Next = 0i64;
v5 = 0i64;
Partition = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v22, 0, sizeof(v22));
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
*(_QWORD *)&LockQueue.OldIrql = CurrentIrql;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)&WheapErrorSourceTable + 189);
PrivateCacheMap = (_FILE_OBJECT **)FileObject->PrivateCacheMap;
SharedCacheMap = (_LARGE_INTEGER *)FileObject->SectionObjectPointer->SharedCacheMap;
if( SharedCacheMap )
{
Partition = (char *)CcGetPartition((_QWORD *)FileObject->SectionObjectPointer->SharedCacheMap);
if( _InterlockedIncrement64((volatile signed __int64 *)Partition + 121) <= 1 )
__fastfail(0xEu);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)Partition + 16, &LockHandle);
}
if( PrivateCacheMap )
{
if( PrivateCacheMap[1] != FileObject )
KeBugCheckEx(0x34u, (PVOID)0x93D, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
if( !Partition )
KeBugCheckEx(0x34u, (PVOID)0x943, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
if( PrivateCacheMap[14] )
{
v22.LockQueue.Lock = (unsigned __int64 *volatile)(Partition + 192);
v22.LockQueue.Next = 0i64;
KxAcquireQueuedSpinLock(&v22.LockQueue, (UINT64 *)Partition + 24);
v16 = PrivateCacheMap[14];
if( v16 )
{
v17 = *(_QWORD *)&v16->Type;
v5 = PrivateCacheMap[14];
++CcDbgNumberOfNoopedReadAheads;
DeviceObject = v16->DeviceObject;
if( *(_FILE_OBJECT **)(v17 + 8) != v16 || *(_FILE_OBJECT **)&DeviceObject->Type != v16 )
goto LABEL_66;
*(_QWORD *)&DeviceObject->Type = v17;
*(_QWORD *)(v17 + 8) = DeviceObject;
v16->DeviceObject = 0i64;
*(_QWORD *)&v16->Type = 0i64;
if( (_FILE_OBJECT *)v16->Vpb != FileObject )
KeBugCheckEx(0x34u, (PVOID)0x964, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
--SharedCacheMap->anonymous_0.HighPart;
--SharedCacheMap[67].anonymous_0.LowPart;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v22);
}
--SharedCacheMap->anonymous_0.HighPart;
v10 = PrivateCacheMap[12];
v11 = (void **)PrivateCacheMap[13];
if( (_FILE_OBJECT **)v10->DeviceObject == PrivateCacheMap + 12 && *v11 == PrivateCacheMap + 12 )
{
*v11 = v10;
v10->DeviceObject = (_DEVICE_OBJECT *)v11;
if( PrivateCacheMap == (_FILE_OBJECT **)&SharedCacheMap[47] )
{
*(_WORD *)PrivateCacheMap = 0;
PrivateCacheMap = 0i64;
}
FileObject->PrivateCacheMap = 0i64;
goto LABEL_13;
}
LABEL_66:
__fastfail(3u);
}
LABEL_13:
if( SharedCacheMap )
{
if( TruncateSize )
{
if( TruncateSize->QuadPart || !SharedCacheMap[1].QuadPart )
{
if( (_LARGE_INTEGER *)SharedCacheMap[28].QuadPart == &SharedCacheMap[28] )
SharedCacheMap[1] = *TruncateSize;
}
else
{
SharedCacheMap[19].anonymous_0.LowPart |= 0x10u;
}
}
if( SharedCacheMap->anonymous_0.HighPart )
{
if( UninitializeEvent )
{
if( (_LARGE_INTEGER *)SharedCacheMap[28].QuadPart == &SharedCacheMap[28] )
{
*(_QWORD *)UninitializeEvent = SharedCacheMap[34].QuadPart;
SharedCacheMap[34].QuadPart = (LONGLONG)UninitializeEvent;
v4 = (FileObject->DeviceObject->Characteristics & 0x10) != 0;
}
else
{
KeSetEvent((PRKEVENT)((char *)UninitializeEvent + 8), 0, 0);
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
OldIrql = LockHandle.OldIrql;
goto LABEL_27;
}
if( (_LARGE_INTEGER *)SharedCacheMap[28].QuadPart != &SharedCacheMap[28] )
KeBugCheckEx(0x34u, (PVOID)0x9E0, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
v12 = UninitializeEvent;
if( UninitializeEvent )
{
*(_QWORD *)UninitializeEvent = SharedCacheMap[34].QuadPart;
SharedCacheMap[34].QuadPart = (LONGLONG)UninitializeEvent;
v4 = (FileObject->DeviceObject->Characteristics & 0x10) != 0;
}
LowPart = SharedCacheMap[19].anonymous_0.LowPart;
if( (LowPart & 4) == 0 && !UninitializeEvent )
goto LABEL_21;
if( (LowPart & 0x20) != 0 )
{
LABEL_23:
Partition[633] = 1;
if( Partition[966] )
{
SharedCacheMap[19].anonymous_0.LowPart |= 0x10000u;
v14 = 1;
}
else
{
v14 = v12 && (SharedCacheMap[19].anonymous_0.LowPart & 0x20) == 0;
}
CcScheduleLazyWriteScan((UINT8)Partition, v14);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
OldIrql = LockHandle.OldIrql;
LABEL_27:
__writecr8(OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
__writecr8(LockQueue.OldIrql);
goto LABEL_28;
}
if( SharedCacheMap[14].anonymous_0.LowPart
|| (LowPart & 0x400) != 0 && SharedCacheMap[5].QuadPart != 0x7FFFFFFFFFFFFFFFi64 )
{
LABEL_21:
if( (LowPart & 0x20) == 0 )
CcInsertIntoDirtySharedCacheMapList((_SHARED_CACHE_MAP *)SharedCacheMap);
goto LABEL_23;
}
CcDeleteSharedCacheMap((_SHARED_CACHE_MAP *)SharedCacheMap, (UINT8)&LockQueue, (UINT64)&LockHandle, 0i64);
v4 = 0;
}
else
{
if( TruncateSize && !TruncateSize->QuadPart && FileObject->SectionObjectPointer->DataSectionObject )
{
if( Partition )
KeBugCheckEx(0x34u, (PVOID)0xA82, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
__writecr8(LockQueue.OldIrql);
CcPurgeCacheSection((INT64 *)FileObject->SectionObjectPointer, (UINT64)TruncateSize, 0i64, 0);
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
__writecr8(LockQueue.OldIrql);
}
if( UninitializeEvent )
KeSetEvent((PRKEVENT)((char *)UninitializeEvent + 8), 0, 0);
}
LABEL_28:
if( PrivateCacheMap )
ExFreePoolWithTag(PrivateCacheMap, 0);
if( v4 )
CcAdjustWriteBehindThreadPoolIfNeeded((UINT8)Partition);
if( v5 )
{
HalPutDmaAdapter((PADAPTER_OBJECT)FileObject);
FsContext = v5->FsContext;
if( FsContext )
IoDiskIoAttributionDereference(FsContext);
CcFreeWorkQueueEntry((_WORK_QUEUE_ENTRY *)v5);
}
if( Partition )
CcDereferencePartition((INT64)Partition);
}Referenced by:
CcPurgeCacheSection