技术开发 频道

用SetupAPI结合注册表获取USB优盘序列号


【IT168技术文档】

//--------------------------------------------------------------------------- #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); }
0
相关文章