// 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