这段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;