// usb.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
/*************************************************************
Win32控制台应用程序
编译环境:Visual Studio 2005
主要功能:
1). 读取U盘序列号,保存在USBSerial数组里。
2). 验证
第一次运行程序读取U盘序列号存放在
C:\Windows\system32\USBSerial.dat文件中
以后运行检验读取到的U盘序列号与保存在文件中的是否一致,
若相同,置 gTag 为1; 若不一致,置 gTag 为0;
***********************************************************/
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <initguid.h>
#include <setupapi.h>
#include <string.h>
#pragma comment(lib,"setupapi.lib")
wchar_t USBSerial[5][100] = {TEXT("")};
int gTag = 0;
#define MAX_DEVICE 256
//#define USBSERIAL_PATH C:\\Windows\\system32\\USBSerial.dat
DEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);
// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
#define INTERFACE_DETAIL_SIZE (1024)
// IOCTL控制码
#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
// 查询存储设备属性的类型
/*typedef enum _STORAGE_QUERY_TYPE {
PropertyStandardQuery = 0, // 读取描述
PropertyExistsQuery, // 测试是否支持
PropertyMaskQuery, // 读取指定的描述
PropertyQueryMaxDefined // 验证数据
} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
*/
// 查询存储设备还是适配器属性
//typedef enum _STORAGE_PROPERTY_ID {
// StorageDeviceProperty = 0, // 查询设备属性
// StorageAdapterProperty // 查询适配器属性
//} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
//
// 查询属性输入的数据结构
//typedef struct _STORAGE_PROPERTY_QUERY {
// STORAGE_PROPERTY_ID PropertyId; // 设备/适配器
// STORAGE_QUERY_TYPE QueryType; // 查询类型
// UCHAR AdditionalParameters[1]; // 额外的数据(仅定义了象征性的1个字节)
//} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
//
//// 查询属性输出的数据结构
//typedef struct _STORAGE_DEVICE_DESCRIPTOR {
// ULONG Version; // 版本
// ULONG Size; // 结构大小
// UCHAR DeviceType; // 设备类型
// UCHAR DeviceTypeModifier; // SCSI-2额外的设备类型
// BOOLEAN RemovableMedia; // 是否可移动
// BOOLEAN CommandQueueing; // 是否支持命令队列
// ULONG VendorIdOffset; // 厂家设定值的偏移
// ULONG ProductIdOffset; // 产品ID的偏移
// ULONG ProductRevisionOffset; &nb