SmcGetCacheStats
NTSTATUS __stdcall SmcGetCacheStats(
PDEVICE_OBJECT DeviceObject,
ULONG SectorSize,
BOOL ReturnRecognizedPartitions,
_DRIVE_LAYOUT_INFORMATION **PartitionBuffer){
__int64 v4;
_SMC_CACHE *v6;
_EX_PUSH_LOCK *v7;
int Path;
unsigned int v9;
unsigned int v10;
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *v12;
_EX_PUSH_LOCK *v13;
__int64 v14;
v4 = *(_QWORD *)&SectorSize;
memset((VOID *)(*(_QWORD *)&SectorSize + 8i64), 0i64, 0x460u);
v6 = SmcCacheReference((_SMC_CACHE_MANAGER *)&DeviceObject->Type, *(unsigned int *)(v4 + 4));
v7 = (_EX_PUSH_LOCK *)v6;
if( !v6 )
return -1073741672;
v9 = *(_DWORD *)(v4 + 28) & 0xFFFFFFC0 | 1;
*(_DWORD *)(v4 + 28) = v9;
*(_QWORD *)(v4 + 8) = *((_QWORD *)v6 + 2);
*(_DWORD *)(v4 + 20) = v6[2];
*(_DWORD *)(v4 + 24) = v6[6];
*(_DWORD *)(v4 + 100) = v6[8];
*(_DWORD *)(v4 + 28) = v9 ^ ((unsigned __int8)v9 ^ (unsigned __int8)((unsigned __int8)v6[7] << 6)) & 0x40;
if( (*(_DWORD *)v4 & 0x100) != 0 || (Path = SmKmFileInfoGetPath(v6 + 10, (WCHAR *)(v4 + 104), 0x400ui64), Path >= 0) )
{
*(_DWORD *)(v4 + 96) = 0;
v10 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v12 = v7 + 20;
ExAcquirePushLockSharedEx(v7 + 20, 0i64);
v13 = v7 + 21;
v14 = 16i64;
do
{
if( LODWORD(v13->_bf_0) != -1 )
{
*(_DWORD *)(v4 + 4i64 * v10 + 32) = v13->_bf_0;
if( (HIDWORD(v13->Ptr) & 3) == 0 )
*(_DWORD *)(v4 + 96) |= 1 << v10;
++v10;
}
v13 += 3;
--v14;
}
while( v14 );
if( _InterlockedCompareExchange64(&v12->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v12);
KeAbPostRelease(v12);
KeLeaveCriticalRegion();
*(_DWORD *)(v4 + 16) = v10;
Path = 0;
}
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&DeviceObject->DriverObject + 4 * (*(_DWORD *)(v4 + 4) & 0xF));
return Path;
}Referenced by:
SmcProcessStatsRequest