从USB存储器中检索序列号(Windows环境c++)
Retrieve serial number from USB memory (Windows environment c++)
我需要从USB存储器中检索序列号,即制造商分配的硬盘序列号。由于这个原因,我不能像其他线程中建议的那样使用GetVolumeInformation()。我需要一个"唯一"号码
我想问你是否可以在C++和Windows环境(Visual C++)中分享一个例子
谢谢!
您可以查看这篇文章:-http://oroboro.com/usb-serial-number/
#include <WinIOCtl.h>
#include <api/usbioctl.h>
#include <Setupapi.h>
DEFINE_GUID( GUID_DEVINTERFACE_USB_DISK,
0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2,
0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b );
void getDeviceInfo( int vol )
{
UsbDeviceInfo info;
// get the device handle
char devicePath[7] = "\\.\@:";
devicePath[4] = (char)( vol + 'A' );
HANDLE deviceHandle = CreateFile( devicePath, 0,
FILE_SHARE_READ |
FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL );
if ( deviceHandle == INVALID_HANDLE_VALUE )
return;
// to get the device number
DWORD volumeDeviceNumber = getDeviceNumber( deviceHandle );
CloseHandle( deviceHandle );
// Get device interface info set handle
// for all devices attached to the system
HDEVINFO hDevInfo = SetupDiGetClassDevs(
&GUID_DEVINTERFACE_USB_DISK, NULL, NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE );
if ( hDevInfo == INVALID_HANDLE_VALUE )
return;
// Get a context structure for the device interface
// of a device information set.
BYTE Buf[1024];
PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
SP_DEVICE_INTERFACE_DATA spdid;
SP_DEVINFO_DATA spdd;
spdid.cbSize = sizeof( spdid );
DWORD dwIndex = 0;
while ( true )
{
if ( ! SetupDiEnumDeviceInterfaces( hDevInfo, NULL,
&GUID_DEVINTERFACE_USB_DISK,
dwIndex, &spdid ))
break;
DWORD dwSize = 0;
SetupDiGetDeviceInterfaceDetail( hDevInfo, &spdid, NULL,
0, &dwSize, NULL );
if (( dwSize != 0 ) && ( dwSize <= sizeof( Buf )))
{
pspdidd->cbSize = sizeof( *pspdidd ); // 5 Bytes!
ZeroMemory((PVOID)&spdd, sizeof(spdd));
spdd.cbSize = sizeof(spdd);
long res = SetupDiGetDeviceInterfaceDetail(
hDevInfo, &spdid, pspdidd,
dwSize, &dwSize, &spdd );
if ( res )
{
HANDLE hDrive = CreateFile( pspdidd->DevicePath,0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL );
if ( hDrive != INVALID_HANDLE_VALUE )
{
DWORD usbDeviceNumber = getDeviceNumber( hDrive );
if ( usbDeviceNumber == volumeDeviceNumber )
{
fprintf( "%s", pspdidd->DevicePath );
}
}
CloseHandle( hDrive );
}
}
dwIndex++;
}
SetupDiDestroyDeviceInfoList(hDevInfo);
return;
}
您可以通过使用设备的句柄:呼叫DeviceIOControl()
来获得设备编号
DWORD getDeviceNumber( HANDLE deviceHandle )
{
STORAGE_DEVICE_NUMBER sdn;
sdn.DeviceNumber = -1;
DWORD dwBytesReturned = 0;
if ( !DeviceIoControl( deviceHandle,
IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL, 0, &sdn, sizeof( sdn ),
&dwBytesReturned, NULL ) )
{
// handle error - like a bad handle.
return U32_MAX;
}
return sdn.DeviceNumber;
}
接下来是一种识别卷是否是可移动介质的方法(例如,像usb或firewire磁盘):
bool isRemovableMedia( s32 vol )
{
char rootPath[5] = "@:\";
rootPath[0] = (char)( vol + 'A' );
char szDosDeviceName[MAX_PATH];
char dosDevicePath[3] = "@:";
// get the drive type
UINT DriveType = GetDriveType( rootPath );
if ( DriveType != DRIVE_REMOVABLE )
return false;
dosDevicePath[0] = (char)( vol + 'A' );
QueryDosDevice( dosDevicePath, szDosDeviceName, MAX_PATH );
if ( strstr( szDosDeviceName,"\Floppy") != NULL )
{
// its a floppy
return false;
}
return true;
}
相关文章:
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- "C.UTF-8" C++ Windows 上的语言环境?
- CMake 看不到SDL2_PATH环境变量 (Windows)
- 为什么我不能将 Windows 环境路径与 ofstream 一起使用来编写文本文件?
- C++ 无法删除 Windows 环境中的文件
- Windows 10 环境中的"This version of XAudio2 is available only in Windows 8"错误
- WINDOWS环境下的c++opencv应用程序的低延迟视频流
- 如何在Qt5中使用Windows环境变量
- 是否可以在Windows 8环境上在Visual Studio 2005上运行VC ,Win32应用程序
- 在Windows环境下在PostgreSQL 9.1中创建函数
- 创建一个可以在 Windows 环境中的现有生成文件项目上运行的 clang 工具
- 从USB存储器中检索序列号(Windows环境c++)
- 在 C++ 文件上的 Windows 环境中运行 Unix 类似命令"./a.out <data.txt"
- 用C++检测Windows环境下的片上系统(SOC)平台
- 如何在单个Windows环境中准备生成.dll和unix .so的构建作业
- 如何在MSYS上访问windows环境变量
- 在Windows环境下使用C/ c++检查VPN的连通性
- 如何在Windows环境下获取主叫用户桌面的绝对路径
- 如何知道驱动程序是加载我的USB设备在windows环境
- 部署工具 企业 - 什么是最适合 Windows 环境的