获取磁盘总线类型和厂商信息以及产品信息的
2012-05-07 17:08
295 查看
以下是从群聊天中整理的代码
#ifndef VolumeType_h__
#define VolumeType_h__
#pragma once
#include <WinIoCtl.h>
#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef enum _STORAGE_PROPERTY_ID {
StorageDeviceProperty = 0,
StorageAdapterProperty,
StorageDeviceIdProperty
} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
typedef enum _STORAGE_QUERY_TYPE {
PropertyStandardQuery = 0,
PropertyExistsQuery,
PropertyMaskQuery,
PropertyQueryMaxDefined
} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
typedef struct _STORAGE_PROPERTY_QUERY {
STORAGE_PROPERTY_ID PropertyId;
STORAGE_QUERY_TYPE QueryType;
UCHAR AdditionalParameters[1];
} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
typedef struct _STORAGE_DEVICE_DESCRIPTOR {
ULONG Version;
ULONG Size;
UCHAR DeviceType;
UCHAR DeviceTypeModifier;
BOOLEAN RemovableMedia;
BOOLEAN CommandQueueing;
ULONG VendorIdOffset;
ULONG ProductIdOffset;
ULONG ProductRevisionOffset;
ULONG SerialNumberOffset;
STORAGE_BUS_TYPE BusType;
ULONG RawPropertiesLength;
UCHAR RawDeviceProperties[1];
} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
typedef struct _STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER {
STORAGE_DEVICE_DESCRIPTOR sdd;
BYTE Vendor_ID[VENDOR_ID_LENGTH+1];
BYTE Product_ID[PRODUCT_ID_LENGTH+1];
BYTE Revision[REVISION_LENGTH+1];
BYTE SerNum[SERIAL_NUMBER_LENGTH+1];
} STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER, *PSTORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER;
//#define offsetof(TYPE,MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
#define VENDOR_ID "HangZhou"
#define PRODUCT_ID "ChangJin Virtual"
#define PRODUCT_REV "0"
BOOL QueryDeviceProperity(CONST CHAR* szPath,PSTORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER pDevDesc);
BOOL IsDiskLessDevice(CHAR Ch);
#endif // VolumeType_h__
#include "StdAfx.h"
#include "VolumeType.h"
BOOL QueryDeviceProperity(CONST CHAR* szPath,PSTORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER pDevDesc)
{
if( !szPath || !pDevDesc )
return FALSE;
HANDLE hDevice = ::CreateFile(szPath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (INVALID_HANDLE_VALUE == hDevice)
{
return FALSE;
}
STORAGE_PROPERTY_QUERY Query;
DWORD dwReturned;
BOOL bRtn;
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
pDevDesc->sdd.Size = sizeof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER);
pDevDesc->sdd.VendorIdOffset = offsetof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER,Vendor_ID);
pDevDesc->sdd.ProductIdOffset= offsetof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER,Product_ID);
pDevDesc->sdd.ProductRevisionOffset= offsetof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER,Revision);
pDevDesc->sdd.SerialNumberOffset= offsetof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER,SerNum);
bRtn = ::DeviceIoControl(hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query, sizeof(STORAGE_PROPERTY_QUERY),
pDevDesc, pDevDesc->sdd.Size,
&dwReturned,(LPOVERLAPPED)NULL);
CloseHandle(hDevice);
return bRtn;
}
BOOL IsDiskLessDevice(CHAR Ch)
{
CHAR szDev[] = "\\\\.\\C:";
STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER Buffer;
ZeroMemory(&Buffer,sizeof(Buffer));
if( Ch >= 'a' && Ch <= 'z' )
Ch -= 'a' - 'A';
if( Ch < 'A' || Ch > 'Z' )
return FALSE;
szDev[4] = Ch;
if( QueryDeviceProperity(szDev,&Buffer) )
{
if( Buffer.sdd.BusType == BusTypeiScsi &&
!memcmp(Buffer.Vendor_ID,VENDOR_ID,strlen(VENDOR_ID)) &&
!memcmp(Buffer.Product_ID,PRODUCT_ID,strlen(PRODUCT_ID) ) )
{
return TRUE;
}
}
return FALSE;
}
#ifndef VolumeType_h__
#define VolumeType_h__
#pragma once
#include <WinIoCtl.h>
#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef enum _STORAGE_PROPERTY_ID {
StorageDeviceProperty = 0,
StorageAdapterProperty,
StorageDeviceIdProperty
} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
typedef enum _STORAGE_QUERY_TYPE {
PropertyStandardQuery = 0,
PropertyExistsQuery,
PropertyMaskQuery,
PropertyQueryMaxDefined
} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
typedef struct _STORAGE_PROPERTY_QUERY {
STORAGE_PROPERTY_ID PropertyId;
STORAGE_QUERY_TYPE QueryType;
UCHAR AdditionalParameters[1];
} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
typedef struct _STORAGE_DEVICE_DESCRIPTOR {
ULONG Version;
ULONG Size;
UCHAR DeviceType;
UCHAR DeviceTypeModifier;
BOOLEAN RemovableMedia;
BOOLEAN CommandQueueing;
ULONG VendorIdOffset;
ULONG ProductIdOffset;
ULONG ProductRevisionOffset;
ULONG SerialNumberOffset;
STORAGE_BUS_TYPE BusType;
ULONG RawPropertiesLength;
UCHAR RawDeviceProperties[1];
} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
typedef struct _STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER {
STORAGE_DEVICE_DESCRIPTOR sdd;
BYTE Vendor_ID[VENDOR_ID_LENGTH+1];
BYTE Product_ID[PRODUCT_ID_LENGTH+1];
BYTE Revision[REVISION_LENGTH+1];
BYTE SerNum[SERIAL_NUMBER_LENGTH+1];
} STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER, *PSTORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER;
//#define offsetof(TYPE,MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
#define VENDOR_ID "HangZhou"
#define PRODUCT_ID "ChangJin Virtual"
#define PRODUCT_REV "0"
BOOL QueryDeviceProperity(CONST CHAR* szPath,PSTORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER pDevDesc);
BOOL IsDiskLessDevice(CHAR Ch);
#endif // VolumeType_h__
#include "StdAfx.h"
#include "VolumeType.h"
BOOL QueryDeviceProperity(CONST CHAR* szPath,PSTORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER pDevDesc)
{
if( !szPath || !pDevDesc )
return FALSE;
HANDLE hDevice = ::CreateFile(szPath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (INVALID_HANDLE_VALUE == hDevice)
{
return FALSE;
}
STORAGE_PROPERTY_QUERY Query;
DWORD dwReturned;
BOOL bRtn;
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
pDevDesc->sdd.Size = sizeof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER);
pDevDesc->sdd.VendorIdOffset = offsetof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER,Vendor_ID);
pDevDesc->sdd.ProductIdOffset= offsetof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER,Product_ID);
pDevDesc->sdd.ProductRevisionOffset= offsetof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER,Revision);
pDevDesc->sdd.SerialNumberOffset= offsetof(STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER,SerNum);
bRtn = ::DeviceIoControl(hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query, sizeof(STORAGE_PROPERTY_QUERY),
pDevDesc, pDevDesc->sdd.Size,
&dwReturned,(LPOVERLAPPED)NULL);
CloseHandle(hDevice);
return bRtn;
}
BOOL IsDiskLessDevice(CHAR Ch)
{
CHAR szDev[] = "\\\\.\\C:";
STORAGE_DEVICE_DESCRIPTOR_WITH_BUFFER Buffer;
ZeroMemory(&Buffer,sizeof(Buffer));
if( Ch >= 'a' && Ch <= 'z' )
Ch -= 'a' - 'A';
if( Ch < 'A' || Ch > 'Z' )
return FALSE;
szDev[4] = Ch;
if( QueryDeviceProperity(szDev,&Buffer) )
{
if( Buffer.sdd.BusType == BusTypeiScsi &&
!memcmp(Buffer.Vendor_ID,VENDOR_ID,strlen(VENDOR_ID)) &&
!memcmp(Buffer.Product_ID,PRODUCT_ID,strlen(PRODUCT_ID) ) )
{
return TRUE;
}
}
return FALSE;
}
相关文章推荐
- 获取系统磁盘类型信息以及判断是否是U盘
- 【Flume】【源码分析】flume中http监控类型的源码分析,度量信息分析,以及flume的事件总线
- IOS模拟器能获取运营商信息,网络连接类型以及地理位置吗?
- 获取磁盘列表以及磁盘信息的一些WIN32 API
- SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
- Android获取系统的硬件信息、系统版本以及如何检测ROM类型
- 获取磁盘相关信息以及网卡相关信息
- 获取磁盘列表以及磁盘信息的一些WIN32 API
- IOS模拟器能获取运营商信息,网络连接类型以及地理位置吗?
- 2014-06-06:IOCTL_STORAGE_GET_DEVICE_NUMBER获取磁盘信息如磁盘号、磁盘类型、分区号
- 获取磁盘列表以及磁盘信息的一些WIN32 API
- Android获取系统的硬件信息、系统版本以及如何检测ROM类型
- SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
- 获取与一个磁盘的组织以及剩余空间容量有关的信息以及代码测试
- java获取cpu,内存,磁盘等信息 String类型转换为long,int
- python笔记 - 数据类型以及类型信息的获取
- JS 客户端验证文件类型,获取图片信息
- linux 系统下查看raid信息,以及磁盘信息
- C#获取本机相关mac和ip信息以及服务器ip
- VC中GetLastError()获取错误信息的使用,以及错误代码的含义