BSOne.SFC/Tocsg.Module/Bs1Flt/bs1flt/bs1flt_vol.h

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
);