136 lines
3.2 KiB
C
136 lines
3.2 KiB
C
#pragma once
|
|
|
|
#include <devpkey.h>
|
|
#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
|
|
); |