2025-05-13 19:45:22 +03:00

1092 lines
59 KiB
C

/*
* 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 <http://www.gnu.org/licenses/>.
*/
#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);
}