一、目的:
当計算機有一個或者多個
U
盤插入時,系統識別后,該應用可以自動獲取
U
盤的相關信息,如生産廠商信息,產品名,版本號,
VID&PID
,產品序列號等等一些
U
盤的相關信息。
二、實現思路:
1
、通過獲得
U
盤盤符獲得設備句柄
首先必須檢測當前系統連接的
U
盤設備,在這一方面最便捷的方法是掃描當前系統的各個驅動器,判斷當前系統所連設備屬性是否為
DRIVE_REMOVABLE
,如果是,表明設備是可移動設備,儅我們排除軟盤后,剩下的就是
U
盤設備了。
//
得到
U
盘盘
符;
LPTSTR lpDrives = new TCHAR[MAX_PATH];
DWORD dwLen = ::GetLogicalDriveStrings(MAX_PATH, lpDrives);
CString sDrives[26] = {""};
for(DWORD nIndex = 0; nIndex < dwLen / 4; nIndex++)
{
if(::GetDriveType(lpDrives + nIndex * 4) == DRIVE_REMOVABLE)
sDrives[nIndex] += (CString)(lpDrives + nIndex * 4);
if(sDrives[nIndex]!=
”
A://
”
&& sDrives[nIndex]!=
”
B://
”
)
{
//
…具體操作
代碼
;
}
}
delete lpDrives;
獲得上面這段代碼,獲得了具體的形如“
H:/
”的設備盤符,並且將這一組盤符存儲在
sDevice[26]
這樣一個字符串數組中。然後通過具體操作獲得的盤符經過一定的處理將其轉化為形如
”?//H:”
的設備路徑,然後再通過
CreateFile
獲得這個設備的句柄:
HANDLE hDeviceHandle = CreateFile(PATH,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
注意,這裡的第三項參數必須是
FILE_SHARE_READ | FILE_SHARE_WRITE,
因爲
U
盤設備是共享設備,第五個參數必須是
OPEN_EXISTING
,打開現有設備。
hDeviceHandle
就是我們所需要的
U
盤句柄了。
獲得這個句柄之後我們將用到一個比較關鍵的函數
DeviceIoControl
,儅我們對系統的各種設備進行操作時,這個函數是經常要用到的。這個函數中控制碼的種類很多,這裡我們主要討論利用
IOCTL_STORAGE_QUERY_PROPERTY
這個控制碼,获取设备属性信息,得到系统中所安装的各种固定的和可移动的硬盘、优盘和
CD/DVD-ROM/R/W
的接口类型、序列号、产品
ID
等信息。
這裡給出這樣一個函數:
//
取
设备
属性信息
//
(
in
)
hDevice --
设备
句柄
//
(
out
)
pDevDesc --
输
出的
设备
描述和属性信息
缓
冲区指
针
(
包含
连
接在一起的两部分
)
BOOL GetDriveProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
STORAGE_PROPERTY_QUERY Query; //
查询输
入参数
DWORD dwOutBytes; // IOCTL
输
出数据
长
度
BOOL bResult; // IOCTL
返回
值
//
指定
查询
方式
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
//
用
IOCTL_STORAGE_QUERY_PROPERTY
取
设备
属性信息