/* * Process Hacker Plugins - * Hardware Devices Plugin * * Copyright (C) 2016 dmex * * This file is part of Process Hacker. * * Process Hacker is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Process Hacker is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Process Hacker. If not, see . */ #include "devices.h" typedef struct _COMMON_PAGE_CONTEXT { HWND ParentHandle; PPH_STRING DiskName; DV_DISK_ID DiskId; ULONG DiskIndex; HANDLE DeviceHandle; } COMMON_PAGE_CONTEXT, *PCOMMON_PAGE_CONTEXT; typedef struct _DV_DISK_PAGE_CONTEXT { HWND WindowHandle; HWND ListViewHandle; PH_LAYOUT_MANAGER LayoutManager; PCOMMON_PAGE_CONTEXT PageContext; } DV_DISK_PAGE_CONTEXT, *PDV_DISK_PAGE_CONTEXT; typedef enum _DISKDRIVE_DETAILS_INDEX { DISKDRIVE_DETAILS_INDEX_FS_CREATION_TIME, DISKDRIVE_DETAILS_INDEX_SERIAL_NUMBER, DISKDRIVE_DETAILS_INDEX_FILE_SYSTEM, DISKDRIVE_DETAILS_INDEX_FS_VERSION, DISKDRIVE_DETAILS_INDEX_LFS_VERSION, DISKDRIVE_DETAILS_INDEX_TOTAL_SIZE, DISKDRIVE_DETAILS_INDEX_TOTAL_FREE, DISKDRIVE_DETAILS_INDEX_TOTAL_SECTORS, DISKDRIVE_DETAILS_INDEX_TOTAL_CLUSTERS, DISKDRIVE_DETAILS_INDEX_FREE_CLUSTERS, DISKDRIVE_DETAILS_INDEX_TOTAL_RESERVED, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_SECTOR, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_CLUSTER, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_RECORD, DISKDRIVE_DETAILS_INDEX_TOTAL_CLUSTERS_PER_RECORD, DISKDRIVE_DETAILS_INDEX_MFT_RECORDS, DISKDRIVE_DETAILS_INDEX_MFT_SIZE, DISKDRIVE_DETAILS_INDEX_MFT_START, DISKDRIVE_DETAILS_INDEX_MFT_ZONE, DISKDRIVE_DETAILS_INDEX_MFT_ZONE_SIZE, DISKDRIVE_DETAILS_INDEX_MFT_MIRROR_START, DISKDRIVE_DETAILS_INDEX_FILE_READS, DISKDRIVE_DETAILS_INDEX_FILE_WRITES, DISKDRIVE_DETAILS_INDEX_DISK_READS, DISKDRIVE_DETAILS_INDEX_DISK_WRITES, DISKDRIVE_DETAILS_INDEX_FILE_READ_BYTES, DISKDRIVE_DETAILS_INDEX_FILE_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_METADATA_READS, DISKDRIVE_DETAILS_INDEX_METADATA_WRITES, DISKDRIVE_DETAILS_INDEX_METADATA_DISK_READS, DISKDRIVE_DETAILS_INDEX_METADATA_DISK_WRITES, DISKDRIVE_DETAILS_INDEX_METADATA_READ_BYTES, DISKDRIVE_DETAILS_INDEX_METADATA_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_MFT_READS, DISKDRIVE_DETAILS_INDEX_MFT_WRITES, DISKDRIVE_DETAILS_INDEX_MFT_READ_BYTES, DISKDRIVE_DETAILS_INDEX_MFT_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_READS, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_WRITES, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_READ_BYTES, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_BITMAP_READS, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES, DISKDRIVE_DETAILS_INDEX_BITMAP_READ_BYTES, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_READS, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_WRITES, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_READ_BYTES, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_USER_INDEX_READS, DISKDRIVE_DETAILS_INDEX_USER_INDEX_WRITES, DISKDRIVE_DETAILS_INDEX_USER_INDEX_READ_BYTES, DISKDRIVE_DETAILS_INDEX_USER_INDEX_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_LOGFILE_READS, DISKDRIVE_DETAILS_INDEX_LOGFILE_WRITES, DISKDRIVE_DETAILS_INDEX_LOGFILE_READ_BYTES, DISKDRIVE_DETAILS_INDEX_LOGFILE_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_WRITE, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_CREATE, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_SETINFO, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_FLUSH, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_FLUSH_LOGFILE, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_LAZY_WRITER, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_USER_REQUEST, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES, DISKDRIVE_DETAILS_INDEX_MFT2_WRITE_BYTES, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_WRITE, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_CREATE, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_SETINFO, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_FLUSH, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_FLUSH_LOGFILE, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_LAZY_WRITER, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_USER_REQUEST, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_FLUSH_LOGFILE, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_LAZY_WRITER, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_USER_REQUEST, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_WRITE, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_CREATE, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_SETINFO, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_FLUSH_LOGFILE, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_LAZY_WRITER, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_REQUEST, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_WRITE, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_CREATE, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_SETINFO, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_FLUSH, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CALLS, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CLUSTERS, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HINTS, DISKDRIVE_DETAILS_INDEX_ALLOCATE_RUNS_RETURNED, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HITS_HONORED, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HITS_CLUSTERS, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_CLUSTERS, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_MISS, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_MISS_CLUSTERS, DISKDRIVE_DETAILS_INDEX_LOGFILE_EXCEPTIONS, DISKDRIVE_DETAILS_INDEX_OTHER_EXCEPTIONS } DISKDRIVE_DETAILS_INDEX; VOID DiskDriveAddListViewItemGroups( _In_ HWND ListViewHandle, _In_ INT DiskGroupId ) { AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_FS_CREATION_TIME, L"Volume creation time", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_SERIAL_NUMBER, L"Volume serial number", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_FILE_SYSTEM, L"Volume file system", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_FS_VERSION, L"Volume version", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_LFS_VERSION, L"LFS version", NULL); //AddListViewItemGroupId(Context->ListViewHandle, diskGroupId, MAXINT, L"BytesPerPhysicalSector", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_SIZE, L"Total size", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_FREE, L"Total free", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_SECTORS, L"Total sectors", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_CLUSTERS, L"Total clusters", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_FREE_CLUSTERS, L"Free clusters", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_RESERVED, L"Reserved clusters", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_SECTOR, L"Bytes per sector", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_CLUSTER, L"Bytes per cluster", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_RECORD, L"Bytes per file record segment", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_TOTAL_CLUSTERS_PER_RECORD, L"Clusters per File record segment", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_RECORDS, L"MFT records", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_SIZE, L"MFT size", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_START, L"MFT start", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_ZONE, L"MFT Zone clusters", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_ZONE_SIZE, L"MFT zone size", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_MIRROR_START, L"MFT mirror start", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_FILE_READS, L"File reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_FILE_WRITES, L"File writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_DISK_READS, L"Disk reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_DISK_WRITES, L"Disk writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_FILE_READ_BYTES, L"File read bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_FILE_WRITE_BYTES, L"File write bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_METADATA_READS, L"Metadata reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_METADATA_WRITES, L"Metadata writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_METADATA_DISK_READS, L"Metadata disk reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_METADATA_DISK_WRITES, L"Metadata disk writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_METADATA_READ_BYTES, L"Metadata read bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_METADATA_WRITE_BYTES, L"Metadata write bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_READS, L"Mft reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_WRITES, L"Mft writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_READ_BYTES, L"Mft read bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_WRITE_BYTES, L"Mft write bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_READS, L"RootIndex reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_WRITES, L"RootIndex writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_READ_BYTES, L"RootIndex read bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_WRITE_BYTES, L"RootIndex write bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_READS, L"Bitmap reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES, L"Bitmap writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_READ_BYTES, L"Bitmap read bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITE_BYTES, L"Bitmap write bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_READS, L"Mft bitmap reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_WRITES, L"Mft bitmap writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_READ_BYTES, L"Mft bitmap read bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_WRITE_BYTES, L"Mft bitmap write bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_USER_INDEX_READS, L"User Index reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_USER_INDEX_WRITES, L"User Index writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_USER_INDEX_READ_BYTES, L"User Index read bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_USER_INDEX_WRITE_BYTES, L"User Index write bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_LOGFILE_READS, L"LogFile reads", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_LOGFILE_WRITES, L"LogFile writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_LOGFILE_READ_BYTES, L"LogFile read bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_LOGFILE_WRITE_BYTES, L"LogFile write bytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_WRITE, L"MftWritesUserLevel-Write", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_CREATE, L"MftWritesUserLevel-Create", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_SETINFO, L"MftWritesUserLevel-SetInfo", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_FLUSH, L"MftWritesUserLevel-Flush", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_FLUSH_LOGFILE, L"MftWritesFlushForLogFileFull", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_LAZY_WRITER, L"MftWritesLazyWriter", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_USER_REQUEST, L"MftWritesUserRequest", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES, L"Mft2Writes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_WRITE_BYTES, L"Mft2WriteBytes", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_WRITE, L"Mft2WritesUserLevel-Write", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_CREATE, L"Mft2WritesUserLevel-Create", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_SETINFO, L"Mft2WritesUserLevel-SetInfo", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_FLUSH, L"Mft2WritesUserLevel-Flush", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_FLUSH_LOGFILE, L"Mft2WritesFlushForLogFileFull", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_LAZY_WRITER, L"Mft2WritesLazyWriter", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_USER_REQUEST, L"Mft2WritesUserRequest", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_FLUSH_LOGFILE, L"BitmapWritesFlushForLogFileFull", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_LAZY_WRITER, L"BitmapWritesLazyWriter", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_USER_REQUEST, L"BitmapWritesUserRequest", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_WRITE, L"BitmapWritesUserLevel-Write", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_CREATE, L"BitmapWritesUserLevel-Create", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_SETINFO, L"BitmapWritesUserLevel-SetInfo", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_FLUSH_LOGFILE, L"MftBitmapWritesFlushForLogFileFull", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_LAZY_WRITER, L"MftBitmapWritesLazyWriter", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_REQUEST, L"MftBitmapWritesUserRequest", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_WRITE, L"MftBitmapWritesUserLevel-Write", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_CREATE, L"MftBitmapWritesUserLevel-Create", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_SETINFO, L"MftBitmapWritesUserLevel-SetInfo", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_FLUSH, L"MftBitmapWritesUserLevel-Flush", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CALLS, L"Allocate-Calls", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CLUSTERS, L"Allocate-Clusters", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HINTS, L"Allocate-Hints", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_RUNS_RETURNED, L"Allocate-RunsReturned", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HITS_HONORED, L"Allocate-HintsHonored", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HITS_CLUSTERS, L"Allocate-HintsClusters", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE, L"Allocate-Cache", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_CLUSTERS, L"Allocate-CacheClusters", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_MISS, L"Allocate-CacheMiss", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_MISS_CLUSTERS, L"Allocate-CacheMissClusters", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_LOGFILE_EXCEPTIONS, L"LogFileFullExceptions", NULL); AddListViewItemGroupId(ListViewHandle, DiskGroupId, DISKDRIVE_DETAILS_INDEX_OTHER_EXCEPTIONS, L"OtherExceptions", NULL); } VOID DiskDriveQueryFileSystem( _Inout_ PDV_DISK_PAGE_CONTEXT Context ) { PPH_LIST deviceMountHandles; deviceMountHandles = DiskDriveQueryMountPointHandles(Context->PageContext->DiskIndex); for (ULONG i = 0; i < deviceMountHandles->Count; i++) { USHORT fsInfoType; PVOID fsInfoBuffer; INT diskGroupId = -1; PFILE_FS_VOLUME_INFORMATION volumeInfo; PDISK_HANDLE_ENTRY diskEntry; diskEntry = deviceMountHandles->Items[i]; if (NT_SUCCESS(DiskDriveQueryVolumeInformation(diskEntry->DeviceHandle, &volumeInfo))) { SYSTEMTIME systemTime; PhLargeIntegerToLocalSystemTime(&systemTime, &volumeInfo->VolumeCreationTime); if (volumeInfo->VolumeLabelLength > 0) { diskGroupId = AddListViewGroup(Context->ListViewHandle, i, PhaFormatString(L"Volume %wc: [%s]", diskEntry->DeviceLetter, PhaCreateStringEx(volumeInfo->VolumeLabel, volumeInfo->VolumeLabelLength)->Buffer)->Buffer ); } else { diskGroupId = AddListViewGroup(Context->ListViewHandle, i, PhaFormatString(L"Volume %wc:", diskEntry->DeviceLetter)->Buffer ); } DiskDriveAddListViewItemGroups(Context->ListViewHandle, diskGroupId); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FS_CREATION_TIME, 1, PhaFormatDateTime(&systemTime)->Buffer); PhFree(volumeInfo); } else { diskGroupId = AddListViewGroup( Context->ListViewHandle, i, PhaFormatString(L"Volume %wc:", diskEntry->DeviceLetter)->Buffer ); DiskDriveAddListViewItemGroups(Context->ListViewHandle, diskGroupId); } if (DiskDriveQueryFileSystemInfo(diskEntry->DeviceHandle, &fsInfoType, &fsInfoBuffer)) { switch (fsInfoType) { case FILESYSTEM_STATISTICS_TYPE_NTFS: case FILESYSTEM_STATISTICS_TYPE_REFS: { PNTFS_FILESYSTEM_STATISTICS buffer = fsInfoBuffer; if (fsInfoType == FILESYSTEM_STATISTICS_TYPE_NTFS) { NTFS_VOLUME_INFO ntfsVolumeInfo; PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FILE_SYSTEM, 1, L"NTFS"); if (DiskDriveQueryNtfsVolumeInfo(diskEntry->DeviceHandle, &ntfsVolumeInfo)) { ntfsVolumeInfo.VolumeData.VolumeSerialNumber.QuadPart = _byteswap_uint64(ntfsVolumeInfo.VolumeData.VolumeSerialNumber.QuadPart); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_SERIAL_NUMBER, 1, PhaFormatString(L"0x%s", PH_AUTO_T(PH_STRING, PhBufferToHexString((PUCHAR)&ntfsVolumeInfo.VolumeData.VolumeSerialNumber.QuadPart, sizeof(ntfsVolumeInfo.VolumeData.VolumeSerialNumber.QuadPart)))->Buffer)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FS_VERSION, 1, PhaFormatString(L"%lu.%lu", ntfsVolumeInfo.ExtendedVolumeData.MajorVersion, ntfsVolumeInfo.ExtendedVolumeData.MinorVersion)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_LFS_VERSION, 1, PhaFormatString(L"%lu.%lu", ntfsVolumeInfo.ExtendedVolumeData.LfsMajorVersion, ntfsVolumeInfo.ExtendedVolumeData.LfsMinorVersion)->Buffer ); //PhSetListViewSubItem(Context->ListViewHandle, lvItemIndex, 1, // PhaFormatSize(ntfsVolumeInfo.ExtendedVolumeData.BytesPerPhysicalSector, -1)->Buffer // ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_SIZE, 1, PhaFormatSize(ntfsVolumeInfo.VolumeData.NumberSectors.QuadPart * ntfsVolumeInfo.VolumeData.BytesPerSector, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_FREE, 1, PhaFormatString(L"%s (%.2f%%)", PhaFormatSize(ntfsVolumeInfo.VolumeData.FreeClusters.QuadPart * ntfsVolumeInfo.VolumeData.BytesPerCluster, -1)->Buffer, (FLOAT)(ntfsVolumeInfo.VolumeData.FreeClusters.QuadPart * 100) / ntfsVolumeInfo.VolumeData.TotalClusters.QuadPart)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_SECTORS, 1, PhaFormatUInt64(ntfsVolumeInfo.VolumeData.NumberSectors.QuadPart, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_CLUSTERS, 1, PhaFormatUInt64(ntfsVolumeInfo.VolumeData.TotalClusters.QuadPart, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FREE_CLUSTERS, 1, PhaFormatUInt64(ntfsVolumeInfo.VolumeData.FreeClusters.QuadPart, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_RESERVED, 1, PhaFormatUInt64(ntfsVolumeInfo.VolumeData.TotalReserved.QuadPart, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_SECTOR, 1, PhaFormatString(L"%lu", ntfsVolumeInfo.VolumeData.BytesPerSector)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_CLUSTER, 1, PhaFormatString(L"%lu", ntfsVolumeInfo.VolumeData.BytesPerCluster)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_RECORD, 1, PhaFormatString(L"%lu", ntfsVolumeInfo.VolumeData.BytesPerFileRecordSegment)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_CLUSTERS_PER_RECORD, 1, PhaFormatString(L"%lu", ntfsVolumeInfo.VolumeData.ClustersPerFileRecordSegment)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_RECORDS, 1, PhaFormatUInt64(ntfsVolumeInfo.VolumeData.MftValidDataLength.QuadPart / ntfsVolumeInfo.VolumeData.BytesPerFileRecordSegment, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_SIZE, 1, PhaFormatString(L"%s (%.2f%%)", PhaFormatSize(ntfsVolumeInfo.VolumeData.MftValidDataLength.QuadPart, -1)->Buffer, (FLOAT)(ntfsVolumeInfo.VolumeData.MftValidDataLength.QuadPart * 100 / ntfsVolumeInfo.VolumeData.BytesPerCluster) / ntfsVolumeInfo.VolumeData.TotalClusters.QuadPart)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_START, 1, PhaFormatString(L"%I64u", ntfsVolumeInfo.VolumeData.MftStartLcn.QuadPart)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_ZONE, 1, PhaFormatString(L"%I64u - %I64u", ntfsVolumeInfo.VolumeData.MftZoneStart.QuadPart, ntfsVolumeInfo.VolumeData.MftZoneEnd.QuadPart)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_ZONE_SIZE, 1, PhaFormatString(L"%s (%.2f%%)", PhaFormatSize((ntfsVolumeInfo.VolumeData.MftZoneEnd.QuadPart - ntfsVolumeInfo.VolumeData.MftZoneStart.QuadPart) * ntfsVolumeInfo.VolumeData.BytesPerCluster, -1)->Buffer, (FLOAT)(ntfsVolumeInfo.VolumeData.MftZoneEnd.QuadPart - ntfsVolumeInfo.VolumeData.MftZoneStart.QuadPart) * 100 / ntfsVolumeInfo.VolumeData.TotalClusters.QuadPart)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_MIRROR_START, 1, PhaFormatString(L"%I64u", ntfsVolumeInfo.VolumeData.Mft2StartLcn.QuadPart)->Buffer ); } } else { REFS_VOLUME_DATA_BUFFER refsVolumeInfo; PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FILE_SYSTEM, 1, L"ReFS"); if (DiskDriveQueryRefsVolumeInfo(diskEntry->DeviceHandle, &refsVolumeInfo)) { refsVolumeInfo.VolumeSerialNumber.QuadPart = _byteswap_uint64(refsVolumeInfo.VolumeSerialNumber.QuadPart); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_SERIAL_NUMBER, 1, PhaFormatString(L"0x%s", PH_AUTO_T(PH_STRING, PhBufferToHexString((PUCHAR)&refsVolumeInfo.VolumeSerialNumber.QuadPart, sizeof(LONGLONG)))->Buffer)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FS_VERSION, 1, PhaFormatString(L"%lu.%lu", refsVolumeInfo.MajorVersion, refsVolumeInfo.MinorVersion)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_SIZE, 1, PhaFormatSize(refsVolumeInfo.NumberSectors.QuadPart * refsVolumeInfo.BytesPerSector, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_FREE, 1, PhaFormatString(L"%s (%.2f%%)", PhaFormatSize(refsVolumeInfo.FreeClusters.QuadPart * refsVolumeInfo.BytesPerCluster, -1)->Buffer, (FLOAT)(refsVolumeInfo.FreeClusters.QuadPart * 100) / refsVolumeInfo.TotalClusters.QuadPart)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_SECTORS, 1, PhaFormatUInt64(refsVolumeInfo.NumberSectors.QuadPart, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_CLUSTERS, 1, PhaFormatUInt64(refsVolumeInfo.TotalClusters.QuadPart, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FREE_CLUSTERS, 1, PhaFormatUInt64(refsVolumeInfo.FreeClusters.QuadPart, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_RESERVED, 1, PhaFormatUInt64(refsVolumeInfo.TotalReserved.QuadPart, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_SECTOR, 1, PhaFormatUInt64(refsVolumeInfo.BytesPerSector, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_TOTAL_BYTES_PER_CLUSTER, 1, PhaFormatUInt64(refsVolumeInfo.BytesPerCluster, TRUE)->Buffer ); } } // File System PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FILE_READS, 1, PhaFormatUInt64(buffer->FileSystemStatistics.UserFileReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FILE_WRITES, 1, PhaFormatUInt64(buffer->FileSystemStatistics.UserFileWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_DISK_READS, 1, PhaFormatUInt64(buffer->FileSystemStatistics.UserDiskReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_DISK_WRITES, 1, PhaFormatUInt64(buffer->FileSystemStatistics.UserDiskWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FILE_READ_BYTES, 1, PhaFormatSize(buffer->FileSystemStatistics.UserFileReadBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_FILE_WRITE_BYTES, 1, PhaFormatSize(buffer->FileSystemStatistics.UserFileWriteBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_METADATA_READS, 1, PhaFormatUInt64(buffer->FileSystemStatistics.MetaDataReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_METADATA_WRITES, 1, PhaFormatUInt64(buffer->FileSystemStatistics.MetaDataWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_METADATA_DISK_READS, 1, PhaFormatUInt64(buffer->FileSystemStatistics.MetaDataDiskReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_METADATA_DISK_WRITES, 1, PhaFormatUInt64(buffer->FileSystemStatistics.MetaDataDiskWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_METADATA_READ_BYTES, 1, PhaFormatSize(buffer->FileSystemStatistics.MetaDataReadBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_METADATA_WRITE_BYTES, 1, PhaFormatSize(buffer->FileSystemStatistics.MetaDataWriteBytes, -1)->Buffer ); // NTFS specific PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_READS, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_WRITES, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_READ_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.MftReadBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_WRITE_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.MftWriteBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_READS, 1, PhaFormatUInt64(buffer->NtfsStatistics.RootIndexReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_WRITES, 1, PhaFormatUInt64(buffer->NtfsStatistics.RootIndexWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_READ_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.RootIndexReadBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ROOT_INDEX_WRITE_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.RootIndexWriteBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_READS, 1, PhaFormatUInt64(buffer->NtfsStatistics.BitmapReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES, 1, PhaFormatUInt64(buffer->NtfsStatistics.BitmapWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_READ_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.BitmapReadBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITE_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.BitmapWriteBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_READS, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_WRITES, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_READ_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.MftBitmapReadBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_WRITE_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.MftBitmapWriteBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_USER_INDEX_READS, 1, PhaFormatUInt64(buffer->NtfsStatistics.UserIndexReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_USER_INDEX_WRITES, 1, PhaFormatUInt64(buffer->NtfsStatistics.UserIndexWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_USER_INDEX_READ_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.UserIndexReadBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_USER_INDEX_WRITE_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.UserIndexWriteBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_LOGFILE_READS, 1, PhaFormatUInt64(buffer->NtfsStatistics.LogFileReads, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_LOGFILE_WRITES, 1, PhaFormatUInt64(buffer->NtfsStatistics.LogFileWrites, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_LOGFILE_READ_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.LogFileReadBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_LOGFILE_WRITE_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.LogFileWriteBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_WRITE, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftWritesUserLevel.Write, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_CREATE, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftWritesUserLevel.Create, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_SETINFO, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftWritesUserLevel.SetInfo, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_USER_LEVEL_FLUSH, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftWritesUserLevel.Flush, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_FLUSH_LOGFILE, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftWritesFlushForLogFileFull, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_LAZY_WRITER, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftWritesLazyWriter, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_WRITES_USER_REQUEST, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftWritesUserRequest, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES, 1, PhaFormatUInt64(buffer->NtfsStatistics.Mft2Writes, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_WRITE_BYTES, 1, PhaFormatSize(buffer->NtfsStatistics.Mft2WriteBytes, -1)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_WRITE, 1, PhaFormatUInt64(buffer->NtfsStatistics.Mft2WritesUserLevel.Write, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_CREATE, 1, PhaFormatUInt64(buffer->NtfsStatistics.Mft2WritesUserLevel.Create, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_SETINFO, 1, PhaFormatUInt64(buffer->NtfsStatistics.Mft2WritesUserLevel.SetInfo, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_USER_LEVEL_FLUSH, 1, PhaFormatUInt64(buffer->NtfsStatistics.Mft2WritesUserLevel.Flush, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_FLUSH_LOGFILE, 1, PhaFormatUInt64(buffer->NtfsStatistics.Mft2WritesFlushForLogFileFull, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_LAZY_WRITER, 1, PhaFormatUInt64(buffer->NtfsStatistics.Mft2WritesLazyWriter, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT2_WRITES_USER_REQUEST, 1, PhaFormatUInt64(buffer->NtfsStatistics.Mft2WritesUserRequest, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_FLUSH_LOGFILE, 1, PhaFormatUInt64(buffer->NtfsStatistics.BitmapWritesFlushForLogFileFull, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_LAZY_WRITER, 1, PhaFormatUInt64(buffer->NtfsStatistics.BitmapWritesLazyWriter, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_USER_REQUEST, 1, PhaFormatUInt64(buffer->NtfsStatistics.BitmapWritesUserRequest, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_WRITE, 1, PhaFormatUInt64(buffer->NtfsStatistics.BitmapWritesUserLevel.Write, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_CREATE, 1, PhaFormatUInt64(buffer->NtfsStatistics.BitmapWritesUserLevel.Create, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_BITMAP_WRITES_SETINFO, 1, PhaFormatUInt64(buffer->NtfsStatistics.BitmapWritesUserLevel.SetInfo, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_FLUSH_LOGFILE, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapWritesFlushForLogFileFull, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_LAZY_WRITER, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapWritesLazyWriter, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_REQUEST, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapWritesUserRequest, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_WRITE, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapWritesUserLevel.Write, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_CREATE, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapWritesUserLevel.Create, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_SETINFO, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapWritesUserLevel.SetInfo, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_MFT_BITMAP_USER_LEVEL_FLUSH, 1, PhaFormatUInt64(buffer->NtfsStatistics.MftBitmapWritesUserLevel.Flush, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CALLS, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.Calls, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CLUSTERS, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.Clusters, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HINTS, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.Hints, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_RUNS_RETURNED, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.RunsReturned, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HITS_HONORED, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.HintsHonored, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_HITS_CLUSTERS, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.HintsClusters, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.Cache, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_CLUSTERS, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.CacheClusters, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_MISS, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.CacheMiss, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_ALLOCATE_CACHE_MISS_CLUSTERS, 1, PhaFormatUInt64(buffer->NtfsStatistics.Allocate.CacheMissClusters, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_LOGFILE_EXCEPTIONS, 1, PhaFormatUInt64(buffer->NtfsStatistics.LogFileFullExceptions, TRUE)->Buffer ); PhSetListViewSubItem(Context->ListViewHandle, DISKDRIVE_DETAILS_INDEX_OTHER_EXCEPTIONS, 1, PhaFormatUInt64(buffer->NtfsStatistics.OtherExceptions, TRUE)->Buffer ); // TODO: Additions for Windows 8.1 and Windows 10... } break; case FILESYSTEM_STATISTICS_TYPE_FAT: { //PFAT_FILESYSTEM_STATISTICS buffer = fsInfoBuffer; } break; case FILESYSTEM_STATISTICS_TYPE_EXFAT: { //PEXFAT_FILESYSTEM_STATISTICS buffer = fsInfoBuffer; } break; } PhFree(fsInfoBuffer); } NtClose(diskEntry->DeviceHandle); PhFree(diskEntry); } PhDereferenceObject(deviceMountHandles); } VOID DiskDriveQuerySmart( _Inout_ PDV_DISK_PAGE_CONTEXT Context ) { PPH_LIST attributes; if (DiskDriveQueryImminentFailure(Context->PageContext->DeviceHandle, &attributes)) { for (ULONG i = 0; i < attributes->Count; i++) { PSMART_ATTRIBUTES attribute = attributes->Items[i]; INT lvItemIndex = PhAddListViewItem( Context->ListViewHandle, MAXINT, SmartAttributeGetText(attribute->AttributeId), IntToPtr(attribute->AttributeId) ); PhSetListViewSubItem( Context->ListViewHandle, lvItemIndex, 1, PhaFormatString(L"%lu", attribute->CurrentValue)->Buffer ); PhSetListViewSubItem( Context->ListViewHandle, lvItemIndex, 2, PhaFormatString(L"%lu", attribute->WorstValue)->Buffer ); if (attribute->RawValue) { PhSetListViewSubItem( Context->ListViewHandle, lvItemIndex, 3, PhaFormatString(L"%lu", attribute->RawValue)->Buffer ); } PhFree(attribute); } PhDereferenceObject(attributes); } } //COLORREF NTAPI PhpColorItemColorFunction( // _In_ INT Index, // _In_ PVOID Param, // _In_opt_ PVOID Context // ) //{ // PSMART_ATTRIBUTES item = Param; // // if (item->FailureImminent) // return RGB(255, 119, 0);// RGB(255, 60, 40); // // return RGB(0xFF, 0xFF, 0xFF); //} INT_PTR CALLBACK DiskDriveSmartDetailsDlgProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { PDV_DISK_PAGE_CONTEXT context; if (uMsg == WM_INITDIALOG) { LPPROPSHEETPAGE propSheetPage = (LPPROPSHEETPAGE)lParam; context = PhAllocate(sizeof(DV_DISK_PAGE_CONTEXT)); memset(context, 0, sizeof(DV_DISK_PAGE_CONTEXT)); context->PageContext = (PCOMMON_PAGE_CONTEXT)propSheetPage->lParam; SetProp(hwndDlg, L"Context", (HANDLE)context); } else { context = (PDV_DISK_PAGE_CONTEXT)GetProp(hwndDlg, L"Context"); if (uMsg == WM_DESTROY) { RemoveProp(hwndDlg, L"Context"); PhFree(context); } } if (!context) return FALSE; switch (uMsg) { case WM_INITDIALOG: { context->WindowHandle = hwndDlg; context->ListViewHandle = GetDlgItem(hwndDlg, IDC_DETAILS_LIST); PhSetListViewStyle(context->ListViewHandle, FALSE, TRUE); PhSetControlTheme(context->ListViewHandle, L"explorer"); PhAddListViewColumn(context->ListViewHandle, 0, 0, 0, LVCFMT_LEFT, 240, L"Property"); PhAddListViewColumn(context->ListViewHandle, 1, 1, 1, LVCFMT_LEFT, 50, L"Value"); PhAddListViewColumn(context->ListViewHandle, 2, 2, 2, LVCFMT_LEFT, 50, L"Best"); PhAddListViewColumn(context->ListViewHandle, 3, 3, 3, LVCFMT_LEFT, 80, L"Raw"); PhSetExtendedListView(context->ListViewHandle); //ExtendedListView_SetItemColorFunction(context->ListViewHandle, PhpColorItemColorFunction); PhInitializeLayoutManager(&context->LayoutManager, hwndDlg); PhAddLayoutItem(&context->LayoutManager, context->ListViewHandle, NULL, PH_ANCHOR_ALL); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_DESCRIPTION), NULL, PH_ANCHOR_LEFT | PH_ANCHOR_BOTTOM); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_EDIT1), NULL, PH_ANCHOR_LEFT | PH_ANCHOR_BOTTOM | PH_ANCHOR_RIGHT); DiskDriveQuerySmart(context); } break; case WM_DESTROY: { PhDeleteLayoutManager(&context->LayoutManager); } break; case WM_SIZE: { PhLayoutManagerLayout(&context->LayoutManager); } break; case WM_NOTIFY: { LPNMHDR header = (LPNMHDR)lParam; if (header->code == LVN_ITEMCHANGED) { PWSTR description; if (ListView_GetSelectedCount(context->ListViewHandle) == 1) description = SmartAttributeGetDescription((SMART_ATTRIBUTE_ID)PhGetSelectedListViewItemParam(context->ListViewHandle)); else description = L""; SetDlgItemText(hwndDlg, IDC_EDIT1, description); } } break; } return FALSE; } INT_PTR CALLBACK DiskDriveFileSystemDetailsDlgProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { PDV_DISK_PAGE_CONTEXT context; if (uMsg == WM_INITDIALOG) { LPPROPSHEETPAGE propSheetPage = (LPPROPSHEETPAGE)lParam; context = PhAllocate(sizeof(DV_DISK_PAGE_CONTEXT)); memset(context, 0, sizeof(DV_DISK_PAGE_CONTEXT)); context->PageContext = (PCOMMON_PAGE_CONTEXT)propSheetPage->lParam; SetProp(hwndDlg, L"Context", (HANDLE)context); } else { context = (PDV_DISK_PAGE_CONTEXT)GetProp(hwndDlg, L"Context"); if (uMsg == WM_DESTROY) { RemoveProp(hwndDlg, L"Context"); PhFree(context); } } if (!context) return FALSE; switch (uMsg) { case WM_INITDIALOG: { context->WindowHandle = hwndDlg; context->ListViewHandle = GetDlgItem(hwndDlg, IDC_DETAILS_LIST); PhCenterWindow(GetParent(hwndDlg), context->PageContext->ParentHandle); PhSetListViewStyle(context->ListViewHandle, FALSE, TRUE); PhSetControlTheme(context->ListViewHandle, L"explorer"); PhAddListViewColumn(context->ListViewHandle, 0, 0, 0, LVCFMT_LEFT, 290, L"Property"); PhAddListViewColumn(context->ListViewHandle, 1, 1, 1, LVCFMT_LEFT, 130, L"Value"); PhSetExtendedListView(context->ListViewHandle); ListView_EnableGroupView(context->ListViewHandle, TRUE); PhInitializeLayoutManager(&context->LayoutManager, hwndDlg); PhAddLayoutItem(&context->LayoutManager, context->ListViewHandle, NULL, PH_ANCHOR_ALL); DiskDriveQueryFileSystem(context); } break; case WM_DESTROY: { PhDeleteLayoutManager(&context->LayoutManager); } break; case WM_SIZE: { PhLayoutManagerLayout(&context->LayoutManager); } break; } return FALSE; } VOID FreeDiskDriveDetailsContext( _In_ PCOMMON_PAGE_CONTEXT Context ) { if (Context->DeviceHandle) NtClose(Context->DeviceHandle); DeleteDiskId(&Context->DiskId); PhClearReference(&Context->DiskName); PhFree(Context); } NTSTATUS ShowDiskDriveDetailsDialogThread( _In_ PVOID Parameter ) { PROPSHEETHEADER propSheetHeader = { sizeof(propSheetHeader) }; PROPSHEETPAGE propSheetPage; HPROPSHEETPAGE pages[2]; PCOMMON_PAGE_CONTEXT pageContext = Parameter; HANDLE deviceHandle; if (NT_SUCCESS(DiskDriveCreateHandle(&deviceHandle, pageContext->DiskId.DevicePath))) { pageContext->DeviceHandle = deviceHandle; } propSheetHeader.dwFlags = PSH_NOAPPLYNOW | PSH_NOCONTEXTHELP; propSheetHeader.pszCaption = L"Disk Drive"; propSheetHeader.nPages = 0; propSheetHeader.nStartPage = 0; propSheetHeader.phpage = pages; // General //memset(&propSheetPage, 0, sizeof(PROPSHEETPAGE)); //propSheetPage.dwSize = sizeof(PROPSHEETPAGE); //propSheetPage.hInstance = PluginInstance->DllBase; //propSheetPage.pszTemplate = MAKEINTRESOURCE(IDD_DISKDRIVE_DETAILS_GENERAL); //propSheetPage.pfnDlgProc = DiskDriveDetailsDlgProc; //pages[propSheetHeader.nPages++] = CreatePropertySheetPage(&propSheetPage); // FileSystem memset(&propSheetPage, 0, sizeof(PROPSHEETPAGE)); propSheetPage.dwSize = sizeof(PROPSHEETPAGE); propSheetPage.hInstance = PluginInstance->DllBase; propSheetPage.pszTemplate = MAKEINTRESOURCE(IDD_DISKDRIVE_DETAILS_FILESYSTEM); propSheetPage.pfnDlgProc = DiskDriveFileSystemDetailsDlgProc; propSheetPage.lParam = (LPARAM)pageContext; pages[propSheetHeader.nPages++] = CreatePropertySheetPage(&propSheetPage); // SMART memset(&propSheetPage, 0, sizeof(PROPSHEETPAGE)); propSheetPage.dwSize = sizeof(PROPSHEETPAGE); propSheetPage.hInstance = PluginInstance->DllBase; propSheetPage.pszTemplate = MAKEINTRESOURCE(IDD_DISKDRIVE_DETAILS_SMART); propSheetPage.pfnDlgProc = DiskDriveSmartDetailsDlgProc; propSheetPage.lParam = (LPARAM)pageContext; pages[propSheetHeader.nPages++] = CreatePropertySheetPage(&propSheetPage); PhModalPropertySheet(&propSheetHeader); FreeDiskDriveDetailsContext(pageContext); return STATUS_SUCCESS; } VOID ShowDiskDriveDetailsDialog( _In_ PDV_DISK_SYSINFO_CONTEXT Context ) { HANDLE dialogThread = NULL; PCOMMON_PAGE_CONTEXT pageContext; pageContext = PhAllocate(sizeof(COMMON_PAGE_CONTEXT)); memset(pageContext, 0, sizeof(COMMON_PAGE_CONTEXT)); pageContext->ParentHandle = GetParent(GetParent(Context->WindowHandle)); pageContext->DiskIndex = Context->DiskEntry->DiskIndex; //pageContext->Length = Context->DiskEntry->DiskLength; PhSetReference(&pageContext->DiskName, Context->DiskEntry->DiskName); CopyDiskId(&pageContext->DiskId, &Context->DiskEntry->Id); if (dialogThread = PhCreateThread(0, ShowDiskDriveDetailsDialogThread, pageContext)) NtClose(dialogThread); else FreeDiskDriveDetailsContext(pageContext); }