用SetupAPI结合注册表获取USB优盘序列号
http://tech.ddvip.com 2007年06月14日 社区交流
内容摘要:用SetupAPI结合注册表获取USB优盘序列号
//---------------------------------------------------------------------------
#include<setupapi.h>
#include<stdio.h>
#include<objbase.h>
#ifndef__BORLANDC__
#pragmacomment(lib,"setupapi.lib")
#endif
//---------------------------------------------------------------------------
charg_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
};
//---------------------------------------------------------------------------
voidCrnReplaceString(LPSTRlpBuf,charc1,charc2)
{
intnLen=strlen(lpBuf);
LPSTRlpTemp=newchar[nLen];
memset(lpTemp,0,nLen);
intj=0;
for(inti=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优盘有效)
//charcDiskID:指定盘符,如'L'
//LPSTRlpPID:序列号存放的缓冲,如charszPID[32]
//byccrun(老妖)info@ccrun.com
//---------------------------------------------------------------------------
boolCrnGetUSBDiskID(charcDiskID,LPSTRlpPID)
{
charszDrv[4];
sprintf(szDrv,"%c:\",cDiskID);
if(GetDriveType(szDrv)!=DRIVE_REMOVABLE)
{
MessageBox(0,"指定的盘不是有效的优盘.",
"错误",MB_OK|MB_ICONWARNING);
returnfalse;
}
charlpRegPath[512]={0};
charlpRegValue[256]={0};
sprintf(lpRegPath,"SYSTEM\MountedDevices");
sprintf(lpRegValue,"\DosDevices\%c:",cDiskID);
//
DWORDdwDataSize(0);
DWORDdwRegType(REG_BINARY);
LPBYTElpRegBinData(NULL);
LPSTRlpUSBKeyData(NULL);
//查询注册表中映射驱动器的设备信息
HKEYhKey;
longlRet=::RegOpenKeyEx(
HKEY_LOCAL_MACHINE,//rootkey
lpRegPath,//要访问的键的位置
0, //
KEY_READ, //以查询的方式访问注册表
&hKey); //hKEY保存此函数所打开的键的句柄
if(lRet!=ERROR_SUCCESS)
returnfalse;
else
{
lRet=::RegQueryValueEx(hKey,//所打开的键的句柄
lpRegValue, //要查询的键值名
NULL,
&dwRegType, //查询数据的类型
lpRegBinData, //保存所查询的数据
&dwDataSize); //预设置的数据长度
if(lRet!=ERROR_SUCCESS)
{
::RegCloseKey(hKey);
returnfalse;
}
else
{
lpRegBinData=newBYTE[dwDataSize];
lpUSBKeyData=newchar[dwDataSize];
memset(lpUSBKeyData,0,dwDataSize);
lRet=::RegQueryValueEx(hKey,
lpRegValue,
NULL,
&dwRegType,
lpRegBinData,
&dwDataSize);
if(lRet!=ERROR_SUCCESS)
{
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=1021&d=fgp83l
delete[]lpRegBinData;
delete[]lpUSBKeyData;
::RegCloseKey(hKey);
returnfalse;
}
}
}
::RegCloseKey(hKey);
//过滤二进制串中的无用信息(将0x0字符去除)
intj=0;
for(DWORDi=0;i<dwDataSize;i++)
{
if(lpRegBinData[i]!=0x0)
{
lpUSBKeyData[j]=lpRegBinData[i];
j++;
}
}
delete[]lpRegBinData;
//I'msorry:YoucanremoveunderlineinyourCode.
MessageBox(0,g_strCrnVerify,"CrnGetUSBDiskID",0);
//I'msorry:Onlyfor[ZhuanTieBuLiuMing].--#
// 截取lpUSBKeyData中的有用信息,例:7&100a16f&0
// ??STORAGE#RemovableMedia#7&100a16f&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
// 63 63 72 75 6E 2E 63 6F 6D
LPSTRlpPos1=strstr(lpUSBKeyData,"#RemovableMedia#")+16;
LPSTRlpPos2=strstr(lpUSBKeyData,"RM");
strncpy(lpUSBKeyData,lpPos1,int(lpPos2)-int(lpPos1));
lpUSBKeyData[int(lpPos2)-int(lpPos1)-1]=0x0;
strcpy(lpUSBKeyData,strupr(lpUSBKeyData));
//DiskDevice(磁盘设备)的GUID
GUIDguidUSB;
CLSIDFromString(L"{53f56307-b6bf-11d0-94f2-00a0c91efb8b}",&guidUSB);
//
HDEVINFOhUSB=SetupDiGetClassDevs(
&guidUSB,NULL,0,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
if(hUSB==INVALID_HANDLE_VALUE)
{
delete[]lpUSBKeyData;
returnfalse;
}
//
intnDevIndex=0;
boolbSuccess;
SP_DEVINFO_DATADevData;
SP_DEVICE_INTERFACE_DATADevIntData;
PSP_DEVICE_INTERFACE_DETAIL_DATAlpDevIntDetailData;
DWORDdwBytesReturned;
//遍历磁盘设备
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))
{
//取得设备接口详细信息并根据转化后的路径在注册表中查询
LPSTRlpPathTemp=newchar[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;
LPSTRlpRegSzData=NULL;
dwDataSize=0;
lRet=::RegQueryValueEx(hKey,
"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet==ERROR_SUCCESS)
{
lpRegSzData=newchar[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;
returntrue;
}
//---------------------------------------------------------------------------
void__fastcallTForm1::Button1Click(TObject*Sender)
{
charlpPID[32];
if(CrnGetUSBDiskID('L',lpPID))
ShowMessage(lpPID);
}
来源:www.ccrun.com 作者:老妖 责编:豆豆技术应用
正在加载评论...