这段6的取U盘序列号的谁能改成XE的100分

宝龙哥 2011-11-04 10:01:16
//存为iUsbKey.h
/*
#include "iUsbKey.h"//用SetupAPI结合注册表获取USB优盘序列号
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text=iUsbKey();
}
*/

#include <setupapi.h>
#include <stdio.h>
#include <objbase.h>

//#ifndef __BORLANDC__
//#pragma comment(lib, "setupapi.lib")
//#endif
//---------------------------------------------------------------------------
void CrnReplaceString(LPSTR lpBuf, char c1, char c2){
int nLen = strlen(lpBuf);
LPSTR lpTemp = new char[nLen];
memset(lpTemp, 0, nLen);
int j=0;
for(int i=0; i < nLen; i++){
if(lpBuf[i] == c1){
if(c2 != 0x00){
lpTemp[j] = c2;
j++;
}
}else{
lpTemp[j] = lpBuf[i];
j++;
}
}
//
memset(lpBuf, 0, nLen);
strncpy(lpBuf, lpTemp, nLen);
delete []lpTemp;
}
//---------------------------------------------------------------------------
// 获取指定盘符的序列号(针对USB优盘有效)
// char cDiskID: 指定盘符,如 'L'
// LPSTR lpPID : 序列号存放的缓冲,如char szPID[32]
//---------------------------------------------------------------------------
//#include <setupapi.h>
//#include <stdio.h>
//#include <objbase.h>
bool CrnGetUSBDiskID(char cDiskID, LPSTR lpPID){
char szDrv[4];
sprintf(szDrv, "%c:\\", cDiskID);
if(GetDriveType(szDrv) != DRIVE_REMOVABLE){
//MessageBox(0, "指定的盘不是有效的优盘.","错误", MB_OK | MB_ICONWARNING);
return false;
}

char lpRegPath[512] = { 0 };
char lpRegValue[256] = { 0 };
sprintf(lpRegPath, "SYSTEM\\MountedDevices");
sprintf(lpRegValue, "\\DosDevices\\%c:", cDiskID);
//
DWORD dwDataSize(0);
DWORD dwRegType(REG_BINARY);
LPBYTE lpRegBinData(NULL);
LPSTR lpUSBKeyData(NULL);

// 查询注册表中映射驱动器的设备信息
HKEY hKey;
long lRet = ::RegOpenKeyEx(
HKEY_LOCAL_MACHINE, // root key
lpRegPath, // 要访问的键的位置
0, //
KEY_READ, // 以查询的方式访问注册表
&hKey); // hKEY保存此函数所打开的键的句柄
if(lRet != ERROR_SUCCESS)return false;
else{
lRet = ::RegQueryValueEx(hKey, // 所打开的键的句柄
lpRegValue, // 要查询的键值名
NULL,
&dwRegType, // 查询数据的类型
lpRegBinData, // 保存所查询的数据
&dwDataSize); // 预设置的数据长度
if(lRet != ERROR_SUCCESS){
::RegCloseKey(hKey);
return false;
}else{
lpRegBinData = new BYTE[dwDataSize];
lpUSBKeyData = new char[dwDataSize];
memset(lpUSBKeyData, 0, dwDataSize);
lRet = ::RegQueryValueEx(hKey,
lpRegValue,
NULL,
&dwRegType,
lpRegBinData,
&dwDataSize);
if(lRet != ERROR_SUCCESS){
delete []lpRegBinData;
delete []lpUSBKeyData;
::RegCloseKey(hKey);
return false;
}
}
}
::RegCloseKey(hKey);
// 过滤二进制串中的无用信息(将0x0字符去除)
int j = 0;
for(DWORD i=0; i<dwDataSize; i++){
if(lpRegBinData[i] != 0x0){
lpUSBKeyData[j] = lpRegBinData[i];
j++;
}
}
delete []lpRegBinData;

// I'm sorry: You can remove under line in your Code.
//MessageBox(0, g_strCrnVerify, "CrnGetUSBDiskID", 0);
// I'm sorry: Only for [Zhuan Tie Bu Liu Ming]. - -#

// 截取lpUSBKeyData中的有用信息, 例: 7&100a16f&0
// \??\STORAGE#RemovableMedia#7&100a16f&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
// 63 63 72 75 6E 2E 63 6F 6D
LPSTR lpPos1 = strstr(lpUSBKeyData, "#RemovableMedia#") + 16;
LPSTR lpPos2 = strstr(lpUSBKeyData, "RM");
strncpy(lpUSBKeyData, lpPos1, int(lpPos2) - int(lpPos1));
lpUSBKeyData[int(lpPos2) - int(lpPos1) - 1] = 0x0;
strcpy(lpUSBKeyData, strupr(lpUSBKeyData));

// Disk Device(磁盘设备)的GUID
GUID guidUSB;
CLSIDFromString(L"{53f56307-b6bf-11d0-94f2-00a0c91efb8b}", &guidUSB);

//
HDEVINFO hUSB = SetupDiGetClassDevs(
&guidUSB, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(hUSB == INVALID_HANDLE_VALUE){
delete []lpUSBKeyData;
return false;
}
//
int nDevIndex = 0;
bool bSuccess;
SP_DEVINFO_DATA DevData;
SP_DEVICE_INTERFACE_DATA DevIntData;
PSP_DEVICE_INTERFACE_DETAIL_DATA lpDevIntDetailData;
DWORD dwBytesReturned;
...全文
202 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2011-11-07
  • 打赏
  • 举报
回复
露个面,混个脸熟。
netying 2011-11-07
  • 打赏
  • 举报
回复
表示关注
宝龙哥 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zzbinfo 的回复:]
这个不是老妖写的么??,呵呵.你的下编译通不过看看是什么提示,会不会是字符操作的问题.
[/Quote]

是字符的问题,我转换后大不分可以用,只有一个循环取盘符的部分不好用,怀疑是字符转换后溢出,这是我修改后出问题的部分:
// 遍历磁盘设备
do{
DevIntData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
bSuccess = SetupDiEnumDeviceInterfaces(hUSB, NULL, &guidUSB,
nDevIndex, &DevIntData) > 0;
if(bSuccess){
// 获取接口详细信息
DevData.cbSize = sizeof(SP_DEVINFO_DATA);
dwBytesReturned = 0;
SetupDiGetDeviceInterfaceDetailA(hUSB, &DevIntData,
NULL, 0, &dwBytesReturned, &DevData);
if(dwBytesReturned != 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER){
lpDevIntDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)
GlobalAlloc(GMEM_FIXED, dwBytesReturned);
lpDevIntDetailData->cbSize =
sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if(SetupDiGetDeviceInterfaceDetail(hUSB, &DevIntData,
lpDevIntDetailData, dwBytesReturned, &dwBytesReturned, &DevData)){
// 取得设备接口详细信息并根据转化后的路径在注册表中查询
LPTSTR lpPathTemp = new wchar_t[wcslen(lpDevIntDetailData->DevicePath) + 256];
wcscpy(lpRegPath, L"SYSTEM\\CurrentControlSet\\Enum\\");
wcscpy(lpPathTemp, lpDevIntDetailData->DevicePath);
lpPos1 = LPTSTR(int(lpPathTemp) + 4);
lpPos2 = LPTSTR(int(wcsstr(lpPathTemp, L"{")) - 1);
wcsncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;
CrnReplaceString(lpPathTemp, '#', '\\');

wcscat(lpRegPath, lpPathTemp);
//
if(RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
lpRegPath,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS){
dwRegType = REG_SZ;
LPTSTR lpRegSzData = NULL;
dwDataSize = 0;
lRet = ::RegQueryValueEx(hKey,
L"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS){
lpRegSzData = new wchar_t[dwDataSize];
lRet = ::RegQueryValueEx(hKey,
L"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS){
wcscpy(lpRegSzData, _wcsupr(lpRegSzData));
if(!wcscmp(lpUSBKeyData, lpRegSzData)){
// 经比对,找到要查询的磁盘设备
wcscpy(lpPathTemp, LPTSTR(int(wcsstr(
lpDevIntDetailData->DevicePath, L"#")) + 1));
lpPos1 = LPTSTR(int(wcsstr(lpPathTemp, L"#")) + 1);
lpPos2 = LPTSTR(int(wcsstr(lpPathTemp, L"#{")));
wcsncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;

// 获取最终的磁盘序列号
CrnReplaceString(lpPathTemp, '&', 0x00);
if(lpPID)
wcsncpy(lpPID, _wcsupr(lpPathTemp), 32);
//
delete []lpRegSzData;
delete []lpPathTemp;
GlobalFree(lpDevIntDetailData);
::RegCloseKey(hKey);
break;
}
}
delete []lpRegSzData;
}
::RegCloseKey(hKey);
}
delete []lpPathTemp;
nDevIndex++;
}
GlobalFree(lpDevIntDetailData);
}
}
}while(bSuccess);
宝龙哥 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zzbinfo 的回复:]
这个不是老妖写的么??,呵呵.你的下编译通不过看看是什么提示,会不会是字符操作的问题.
[/Quote]

是字符问题,经过我修改后在XE先编译可以取得所有U盘序列号,但取得盘符部分的循环里有问题,跳不出来,估计是某个部分字符转换后溢出了,但我找不到原因
// 遍历磁盘设备
do{
DevIntData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
bSuccess = SetupDiEnumDeviceInterfaces(hUSB, NULL, &guidUSB,
nDevIndex, &DevIntData) > 0;
if(bSuccess){
// 获取接口详细信息
DevData.cbSize = sizeof(SP_DEVINFO_DATA);
dwBytesReturned = 0;
SetupDiGetDeviceInterfaceDetailA(hUSB, &DevIntData,
NULL, 0, &dwBytesReturned, &DevData);
if(dwBytesReturned != 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER){
lpDevIntDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)
GlobalAlloc(GMEM_FIXED, dwBytesReturned);
lpDevIntDetailData->cbSize =
sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if(SetupDiGetDeviceInterfaceDetail(hUSB, &DevIntData,
lpDevIntDetailData, dwBytesReturned, &dwBytesReturned, &DevData)){
// 取得设备接口详细信息并根据转化后的路径在注册表中查询
LPTSTR lpPathTemp = new wchar_t[wcslen(lpDevIntDetailData->DevicePath) + 256];
wcscpy(lpRegPath, L"SYSTEM\\CurrentControlSet\\Enum\\");
wcscpy(lpPathTemp, lpDevIntDetailData->DevicePath);
lpPos1 = LPTSTR(int(lpPathTemp) + 4);
lpPos2 = LPTSTR(int(wcsstr(lpPathTemp, L"{")) - 1);
wcsncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;
CrnReplaceString(lpPathTemp, '#', '\\');

wcscat(lpRegPath, lpPathTemp);
//
if(RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
lpRegPath,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS){
dwRegType = REG_SZ;
LPTSTR lpRegSzData = NULL;
dwDataSize = 0;
lRet = ::RegQueryValueEx(hKey,
L"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS){
lpRegSzData = new wchar_t[dwDataSize];
lRet = ::RegQueryValueEx(hKey,
L"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS){
wcscpy(lpRegSzData, _wcsupr(lpRegSzData));
if(!wcscmp(lpUSBKeyData, lpRegSzData)){
// 经比对,找到要查询的磁盘设备
wcscpy(lpPathTemp, LPTSTR(int(wcsstr(
lpDevIntDetailData->DevicePath, L"#")) + 1));
lpPos1 = LPTSTR(int(wcsstr(lpPathTemp, L"#")) + 1);
lpPos2 = LPTSTR(int(wcsstr(lpPathTemp, L"#{")));
wcsncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;

// 获取最终的磁盘序列号
CrnReplaceString(lpPathTemp, '&', 0x00);
if(lpPID)
wcsncpy(lpPID, _wcsupr(lpPathTemp), 32);
//
delete []lpRegSzData;
delete []lpPathTemp;
GlobalFree(lpDevIntDetailData);
::RegCloseKey(hKey);
break;
}
}
delete []lpRegSzData;
}
::RegCloseKey(hKey);
}
delete []lpPathTemp;
nDevIndex++;
}
GlobalFree(lpDevIntDetailData);
}
}
}while(bSuccess);
这是我修改后出问题的部分
zzbinfo 2011-11-07
  • 打赏
  • 举报
回复
这个不是老妖写的么??,呵呵.你的下编译通不过看看是什么提示,会不会是字符操作的问题.
宝龙哥 2011-11-07
  • 打赏
  • 举报
回复
你们的都是加了#include <vcl.h>
编译就通过了吗?我的XE加了也不行啊
cgl_lgs 2011-11-06
  • 打赏
  • 举报
回复
是不是没打好补丁啊。
另外,你要在最前面增加 :
#include <vcl.h>
柯本 2011-11-06
  • 打赏
  • 举报
回复
头上加
#include <vcl.h>
程序能在CB2010及CB XE2下编译通过(XE没环境测试)
宝龙哥 2011-11-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cgl_lgs 的回复:]
什么都不用改啊。。。
只是你把函数贴重了。。。
[/Quote]

XE下根本就编译不过
cgl_lgs 2011-11-05
  • 打赏
  • 举报
回复
什么都不用改啊。。。
只是你把函数贴重了。。。
宝龙哥 2011-11-04
  • 打赏
  • 举报
回复

// 遍历磁盘设备
do{
DevIntData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
bSuccess = SetupDiEnumDeviceInterfaces(hUSB, NULL, &guidUSB,
nDevIndex, &DevIntData) > 0;
if(bSuccess){
// 获取接口详细信息
DevData.cbSize = sizeof(SP_DEVINFO_DATA);
dwBytesReturned = 0;
SetupDiGetDeviceInterfaceDetailA(hUSB, &DevIntData,
NULL, 0, &dwBytesReturned, &DevData);
if(dwBytesReturned != 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER){
lpDevIntDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)
GlobalAlloc(GMEM_FIXED, dwBytesReturned);
lpDevIntDetailData->cbSize =
sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if(SetupDiGetDeviceInterfaceDetailA(hUSB, &DevIntData,
lpDevIntDetailData, dwBytesReturned, &dwBytesReturned, &DevData)){
// 取得设备接口详细信息并根据转化后的路径在注册表中查询
LPSTR lpPathTemp = new char[strlen(lpDevIntDetailData->DevicePath) + 256];
strcpy(lpRegPath, "SYSTEM\\CurrentControlSet\\Enum\\");
strcpy(lpPathTemp, lpDevIntDetailData->DevicePath);
lpPos1 = LPSTR(int(lpPathTemp) + 4);
lpPos2 = LPSTR(int(strstr(lpPathTemp, "{")) - 1);
strncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;
CrnReplaceString(lpPathTemp, '#', '\\');

strcat(lpRegPath, lpPathTemp);
//
if(RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
lpRegPath,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS){
dwRegType = REG_SZ;
LPSTR lpRegSzData = NULL;
dwDataSize = 0;
lRet = ::RegQueryValueEx(hKey,
"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS){
lpRegSzData = new char[dwDataSize];
lRet = ::RegQueryValueEx(hKey,
"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS){
strcpy(lpRegSzData, strupr(lpRegSzData));
if(!strcmp(lpUSBKeyData, lpRegSzData)){
// 经比对,找到要查询的磁盘设备
strcpy(lpPathTemp, LPSTR(int(strstr(
lpDevIntDetailData->DevicePath, "#")) + 1));
lpPos1 = LPSTR(int(strstr(lpPathTemp, "#")) + 1);
lpPos2 = LPSTR(int(strstr(lpPathTemp, "#{")));
strncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;

// 获取最终的磁盘序列号
CrnReplaceString(lpPathTemp, '&', 0x00);
if(lpPID)
strncpy(lpPID, strupr(lpPathTemp), 32);
//
delete []lpRegSzData;
delete []lpPathTemp;
GlobalFree(lpDevIntDetailData);
::RegCloseKey(hKey);
break;
}
}
delete []lpRegSzData;
}
::RegCloseKey(hKey);
}
delete []lpPathTemp;
nDevIndex++;
}
GlobalFree(lpDevIntDetailData);
}
}
}while(bSuccess);

SetupDiDestroyDeviceInfoList(hUSB);

delete []lpUSBKeyData;

return true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char lpPID[32];
AnsiString txt=ExtractFilePath(ExpandFileName(Application->ExeName)).SubString(1,1);//取得当前程序所在的盘符
if(CrnGetUSBDiskID(txt.c_str()[0], lpPID))
//if(CrnGetUSBDiskID('L', lpPID))//指定L盘
ShowMessage(lpPID);
else MessageBox(0, "指定的盘不是有效的优盘.","错误", MB_OK | MB_ICONWARNING);
}
宝龙哥 2011-11-04
  • 打赏
  • 举报
回复

// 获取最终的磁盘序列号
CrnReplaceString(lpPathTemp, '&', 0x00);
if(lpPID)
strncpy(lpPID, strupr(lpPathTemp), 32);
//
delete []lpRegSzData;
delete []lpPathTemp;
GlobalFree(lpDevIntDetailData);
::RegCloseKey(hKey);
break;
}
}
delete []lpRegSzData;
}
::RegCloseKey(hKey);
}
delete []lpPathTemp;
nDevIndex++;
}
GlobalFree(lpDevIntDetailData);
}
}
}while(bSuccess);

SetupDiDestroyDeviceInfoList(hUSB);

delete []lpUSBKeyData;

return true;
}
//---------------------------------------------------------------------------

//AnsiString iUsbKey(){
String iUsbKey(){
char lpPID[32];
AnsiString txt=ExtractFilePath(ExpandFileName(Application->ExeName)).SubString(1,1);//取得当前程序所在的盘符
String Key;
if(CrnGetUSBDiskID(txt.c_str()[0], lpPID))Key=lpPID;
return Key;
////if(CrnGetUSBDiskID('L', lpPID))//指定L盘
//ShowMessage(lpPID);
//else MessageBox(0, "指定的盘不是有效的优盘.","错误", MB_OK | MB_ICONWARNING);
}







//参考资料:--------------------------------------------------

用SetupAPI结合注册表获取USB优盘序列号
 原作者:ccrun(老妖)
更新日期:2007-06-08 15:31:19
浏览次数:382
 关键字:USB,优盘,序列号,Disk Device,SetupAPI,注册表
//---------------------------------------------------------------------------
// 获取优盘序列号的代码, by ccrun(老妖)
// 参考: http://www.2ccc.com/article.asp?articleid=4167
// 以下代码在 C++Builder 6.0 和 VC 6.0 中编译通过
// 看帖请回帖, 转帖请留名.
//---------------------------------------------------------------------------

#include <setupapi.h>
#include <stdio.h>
#include <objbase.h>

//#ifndef __BORLANDC__
//#pragma comment(lib, "setupapi.lib")
//#endif

//---------------------------------------------------------------------------
//char g_strCrnVerify[] =
//{//老妖的宣传信息
//0xBB, 0xB6, 0xD3, 0xAD, 0xB9, 0xE2, 0xC1, 0xD9, 0x20, 0x43,
//0x2B, 0x2B, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x65, 0x72, 0xD1,
//0xD0, 0xBE, 0xBF, 0x20, 0x2D, 0x20, 0x68, 0x74, 0x74, 0x70,
//0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x63, 0x63, 0x72,
//0x75, 0x6E, 0x2E, 0x63, 0x6F, 0x6D
//};
//---------------------------------------------------------------------------
void CrnReplaceString(LPSTR lpBuf, char c1, char c2){
int nLen = strlen(lpBuf);
LPSTR lpTemp = new char[nLen];
memset(lpTemp, 0, nLen);
int j=0;
for(int i=0; i < nLen; i++){
if(lpBuf[i] == c1){
if(c2 != 0x00){
lpTemp[j] = c2;
j++;
}
}else{
lpTemp[j] = lpBuf[i];
j++;
}
}
//
memset(lpBuf, 0, nLen);
strncpy(lpBuf, lpTemp, nLen);
delete []lpTemp;
}
//---------------------------------------------------------------------------
// 获取指定盘符的序列号(针对USB优盘有效)
// char cDiskID: 指定盘符,如 'L'
// LPSTR lpPID : 序列号存放的缓冲,如char szPID[32]
//---------------------------------------------------------------------------
//#include <setupapi.h>
//#include <stdio.h>
//#include <objbase.h>
bool CrnGetUSBDiskID(char cDiskID, LPSTR lpPID){
char szDrv[4];
sprintf(szDrv, "%c:\\", cDiskID);
if(GetDriveType(szDrv) != DRIVE_REMOVABLE){
//MessageBox(0, "指定的盘不是有效的优盘.","错误", MB_OK | MB_ICONWARNING);
return false;
}

char lpRegPath[512] = { 0 };
char lpRegValue[256] = { 0 };
sprintf(lpRegPath, "SYSTEM\\MountedDevices");
sprintf(lpRegValue, "\\DosDevices\\%c:", cDiskID);
//
DWORD dwDataSize(0);
DWORD dwRegType(REG_BINARY);
LPBYTE lpRegBinData(NULL);
LPSTR lpUSBKeyData(NULL);

// 查询注册表中映射驱动器的设备信息
HKEY hKey;
long lRet = ::RegOpenKeyEx(
HKEY_LOCAL_MACHINE, // root key
lpRegPath, // 要访问的键的位置
0, //
KEY_READ, // 以查询的方式访问注册表
&hKey); // hKEY保存此函数所打开的键的句柄
if(lRet != ERROR_SUCCESS)return false;
else{
lRet = ::RegQueryValueEx(hKey, // 所打开的键的句柄
lpRegValue, // 要查询的键值名
NULL,
&dwRegType, // 查询数据的类型
lpRegBinData, // 保存所查询的数据
&dwDataSize); // 预设置的数据长度
if(lRet != ERROR_SUCCESS){
::RegCloseKey(hKey);
return false;
}else{
lpRegBinData = new BYTE[dwDataSize];
lpUSBKeyData = new char[dwDataSize];
memset(lpUSBKeyData, 0, dwDataSize);
lRet = ::RegQueryValueEx(hKey,
lpRegValue,
NULL,
&dwRegType,
lpRegBinData,
&dwDataSize);
if(lRet != ERROR_SUCCESS){
delete []lpRegBinData;
delete []lpUSBKeyData;
::RegCloseKey(hKey);
return false;
}
}
}
::RegCloseKey(hKey);
// 过滤二进制串中的无用信息(将0x0字符去除)
int j = 0;
for(DWORD i=0; i<dwDataSize; i++){
if(lpRegBinData[i] != 0x0){
lpUSBKeyData[j] = lpRegBinData[i];
j++;
}
}
delete []lpRegBinData;

// I'm sorry: You can remove under line in your Code.
//MessageBox(0, g_strCrnVerify, "CrnGetUSBDiskID", 0);
// I'm sorry: Only for [Zhuan Tie Bu Liu Ming]. - -#

// 截取lpUSBKeyData中的有用信息, 例: 7&100a16f&0
// \??\STORAGE#RemovableMedia#7&100a16f&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
// 63 63 72 75 6E 2E 63 6F 6D
LPSTR lpPos1 = strstr(lpUSBKeyData, "#RemovableMedia#") + 16;
LPSTR lpPos2 = strstr(lpUSBKeyData, "RM");
strncpy(lpUSBKeyData, lpPos1, int(lpPos2) - int(lpPos1));
lpUSBKeyData[int(lpPos2) - int(lpPos1) - 1] = 0x0;
strcpy(lpUSBKeyData, strupr(lpUSBKeyData));

// Disk Device(磁盘设备)的GUID
GUID guidUSB;
CLSIDFromString(L"{53f56307-b6bf-11d0-94f2-00a0c91efb8b}", &guidUSB);

//
HDEVINFO hUSB = SetupDiGetClassDevs(
&guidUSB, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(hUSB == INVALID_HANDLE_VALUE){
delete []lpUSBKeyData;
return false;
}
//
int nDevIndex = 0;
bool bSuccess;
SP_DEVINFO_DATA DevData;
SP_DEVICE_INTERFACE_DATA DevIntData;
PSP_DEVICE_INTERFACE_DETAIL_DATA lpDevIntDetailData;
DWORD dwBytesReturned;
宝龙哥 2011-11-04
  • 打赏
  • 举报
回复
// 遍历磁盘设备
do{
DevIntData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
bSuccess = SetupDiEnumDeviceInterfaces(hUSB, NULL, &guidUSB,
nDevIndex, &DevIntData) > 0;
if(bSuccess){
// 获取接口详细信息
DevData.cbSize = sizeof(SP_DEVINFO_DATA);
dwBytesReturned = 0;
SetupDiGetDeviceInterfaceDetailA(hUSB, &DevIntData,
NULL, 0, &dwBytesReturned, &DevData);
if(dwBytesReturned != 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER){
lpDevIntDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)
GlobalAlloc(GMEM_FIXED, dwBytesReturned);
lpDevIntDetailData->cbSize =
sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if(SetupDiGetDeviceInterfaceDetailA(hUSB, &DevIntData,
lpDevIntDetailData, dwBytesReturned, &dwBytesReturned, &DevData)){
// 取得设备接口详细信息并根据转化后的路径在注册表中查询
LPSTR lpPathTemp = new char[strlen(lpDevIntDetailData->DevicePath) + 256];
strcpy(lpRegPath, "SYSTEM\\CurrentControlSet\\Enum\\");
strcpy(lpPathTemp, lpDevIntDetailData->DevicePath);
lpPos1 = LPSTR(int(lpPathTemp) + 4);
lpPos2 = LPSTR(int(strstr(lpPathTemp, "{")) - 1);
strncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;
CrnReplaceString(lpPathTemp, '#', '\\');

strcat(lpRegPath, lpPathTemp);
//
if(RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
lpRegPath,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS){
dwRegType = REG_SZ;
LPSTR lpRegSzData = NULL;
dwDataSize = 0;
lRet = ::RegQueryValueEx(hKey,
"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS){
lpRegSzData = new char[dwDataSize];
lRet = ::RegQueryValueEx(hKey,
"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS){
strcpy(lpRegSzData, strupr(lpRegSzData));
if(!strcmp(lpUSBKeyData, lpRegSzData)){
// 经比对,找到要查询的磁盘设备
strcpy(lpPathTemp, LPSTR(int(strstr(
lpDevIntDetailData->DevicePath, "#")) + 1));
lpPos1 = LPSTR(int(strstr(lpPathTemp, "#")) + 1);
lpPos2 = LPSTR(int(strstr(lpPathTemp, "#{")));
strncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧