#pragma once #include #define _ALLOC_TAG 'kdqw' #define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) // // struct // typedef enum _STORAGE_QUERY_TYPE { PropertyStandardQuery = 0, PropertyExistsQuery, PropertyMaskQuery, PropertyQueryMaxDefined } STORAGE_QUERY_TYPE, * PSTORAGE_QUERY_TYPE; typedef enum _STORAGE_PROPERTY_ID { StorageDeviceProperty = 0, StorageAdapterProperty, StorageDeviceIdProperty, StorageDeviceUniqueIdProperty, StorageDeviceWriteCacheProperty, StorageMiniportProperty, StorageAccessAlignmentProperty, StorageDeviceSeekPenaltyProperty, StorageDeviceTrimProperty, StorageDeviceWriteAggregationProperty } STORAGE_PROPERTY_ID, * PSTORAGE_PROPERTY_ID; typedef enum _STORAGE_BUS_TYPE { BusTypeUnknown = 0x00, BusTypeScsi, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb, BusTypeRAID, BusTypeiScsi, BusTypeSas, BusTypeSata, BusTypeSd, BusTypeMmc, BusTypeVirtual, BusTypeFileBackedVirtual, BusTypeMax, BusTypeMaxReserved = 0x7F } STORAGE_BUS_TYPE, * PSTORAGE_BUS_TYPE; typedef unsigned char BYTE; typedef struct _STORAGE_PROPERTY_QUERY { STORAGE_PROPERTY_ID PropertyId; STORAGE_QUERY_TYPE QueryType; unsigned char AdditionalParameters[1]; } STORAGE_PROPERTY_QUERY, * PSTORAGE_PROPERTY_QUERY; typedef struct _STORAGE_DEVICE_DESCRIPTOR { DWORD Version; DWORD Size; BYTE DeviceType; BYTE DeviceTypeModifier; BOOLEAN RemovableMedia; BOOLEAN CommandQueueing; DWORD VendorIdOffset; DWORD ProductIdOffset; DWORD ProductRevisionOffset; DWORD SerialNumberOffset; STORAGE_BUS_TYPE BusType; DWORD RawPropertiesLength; BYTE RawDeviceProperties[1]; } STORAGE_DEVICE_DESCRIPTOR, * PSTORAGE_DEVICE_DESCRIPTOR; //#define _ALLOC_TAG 'ksiD' // Disk // 1. ¼öÁýÇÑ Á¤º¸¸¦ ´ãÀ» ±¸Á¶Ã¼ Á¤ÀÇ typedef struct _FULL_DISK_INFO { // [From GetStorageProperty] - Çϵå¿þ¾î ¹°¸® Á¤º¸ STORAGE_BUS_TYPE BusType; // BusTypeUsb, BusTypeSata, etc. BOOLEAN RemovableMedia; char VendorId[64]; char ProductId[64]; char SerialNumber[64]; char Productrevisionlevel[VOLUME_DESCRIPTION_LENGTH]; // [From QueryDeviceProperty] - À©µµ¿ì PnP ¸ÞŸµ¥ÀÌÅÍ WCHAR FriendlyName[260]; // "Samsung SSD 970..." WCHAR Description[260]; // "Disk Drive" WCHAR HardwareId[260]; // "SCSI\DiskSamsung..." WCHAR LocationInfo[260]; WCHAR EnumeratorName[260]; // "PCI", "USBSTOR" WCHAR InstanceId[260]; // ÀåÄ¡ ÀνºÅϽº °æ·Î ÀúÀå¿ë WCHAR ParentId[260]; // ÀåÄ¡ ÀνºÅϽº °æ·Î ÀúÀå¿ë } FULL_DISK_INFO, *PFULL_DISK_INFO; NTSTATUS GetVolumeProperties(PCFLT_RELATED_OBJECTS fltobject, PVOLUME_CONTEXT pVolumeContext); NTSTATUS CollectAllDiskInfo( __in PDEVICE_OBJECT pDeviceObject, __out PFULL_DISK_INFO pOutInfo ); VOID SafeQueryIdRoutine( _In_ PFLT_GENERIC_WORKITEM FltWorkItem, _In_ PFLT_FILTER Filter, _In_ PVOID Context ); NTSTATUS GetUsbIdFromVolume( __in PDEVICE_OBJECT pVolumeDeviceObject, __out PWCHAR pBuffer, __in ULONG BufferLength ); NTSTATUS GetDeviceInstanceId( __in PDEVICE_OBJECT pDeviceObject, __in const DEVPROPKEY* pKey, __out PWCHAR pBuffer, __in ULONG BufferLength );