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

//---------------------------------------------------------------------------#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]// by ccrun(老妖) info@ccrun.com//---------------------------------------------------------------------------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;    // 遍历磁盘设备    do    {        DevIntData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);        bSuccess = SetupDiEnumDeviceInterfaces(hUSB, NULL, &guidUSB,                nDevIndex, &DevIntData) > 0;// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1021&d=fgp83l        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];    if(CrnGetUSBDiskID('L', lpPID))        ShowMessage(lpPID);}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, char
strncpy
bcb 读取优盘序列号、优盘序列号、优盘序列号查询、bcb 获取优盘序列号、win7 优盘注册表信息,以便于您获取更多的相关知识。

时间: 2024-10-20 03:18:47

用SetupAPI结合注册表获取USB优盘序列号的相关文章

C# 系统应用之通过注册表获取USB使用记录(一)

该文章是"个人电脑历史记录清除软件"项目的系统应用系列文章.前面已经讲述了如何清除IE浏览器的历史记录.获取Windows最近访问文件记录.清除回收站等功能.现在我需要完成的是删除USB设备上的U盘.手机.移动硬盘等记录,真心觉得这方面资料特别少.这篇文章首先主要讲述了通过注册表获取USB使用记录,希望对大家有所帮助. 一.注册表基本知识 注册表(registry)是Windows系统中一个重要的数据库,它用于存储有关应用程序.用户和系统信息.注册表的结构就像一颗树.树的顶级节点(hi

VC读注册表获取安装程序

Windows 系统中,安装程序都可以在注册表 HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion\Uninstall获取,并且xp.vista .win7.win8都一样 打开注册表命令:regedit,依次展开上述注册表路径,安装程序列表如下图: 获取系统安装程序列表: // 获取系统安装程序列表 BOOL CMyListCtrlTestDlg::AllRegKey(HKEY hKey, LPCTSTR szDesKeyI

通过手动导入注册表获取Win7管理员权限

通过手动导入注册表获取Win7管理员权限 有一种现象叫咱自己的电脑,咱也明明是超级管理员.但Win7 人家不承认,特别是当你要对system下的文件下手时,Win就愣是睁眼说瞎话,什么必须拥有管理员权限才能进行操作.我怎么就没有权限了. 当然,可能人家也是出安全考虑,虽然这种机制咱大伙也不是相当了解的十分透彻.好在人家还没有把你给弄上绝路,好歹还给咱留了写其他的途径,比如咱们就可以通过手动导入注册表来获取本属于你的管理员权限. 下满四步邹: 1.随便建一过.reg为后缀的文件. 2.将下面的代码

Powershell实现从注册表获取本地关联文件的扩展名_PowerShell

适用于所有版本. 在先前的技巧中我们知道如何用一行命令获取多行注册表记录,这里,我们再来回顾下这段代码: 复制代码 代码如下: $lookup = Get-ItemProperty Registry::HKCR\.[a-f]?? |   Select-Object -Property PSChildName, '(default)', ContentType, PerceivedType |   Group-Object -Property PSChildName -AsHashTable -A

C++访问注册表获取已安装软件信息列表示例代码_C 语言

复制代码 代码如下: // ---------------------------------------------------------------// FlieNmae: //   SofInfo.h// Remark://   通过读取注册表获得本机已安装软件信息.// ---------------------------------------------------------------#pragma once#include <vector> struct SoftInfo

windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码

   下面的代码可以用于跨平台设备信息的获取 搭建传输的socket平台参考下面博文:   http://blog.csdn.net/wangyaninglm/article/details/41940287       GetsysInfo.h:   #ifndef _H_GETSYSINFO #define _H_GETSYSINFO #pragma once #include <afxtempl.h> class GetSysInfo { public: GetSysInfo(void)

Powershell实现从注册表获取用户配置脚本分享_PowerShell

支持所有版本. 要获得本地用户的配置文件,可以使用这个脚本: 复制代码 代码如下: $path = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*'   Get-ItemProperty -Path $path |   Select-Object -Property PSChildName, ProfileImagePath 这将获得ProfileList下所有的键值

C#中如何获取注册表信息

注册表 实现方式:利用Microsoft.win32类提供的注册表类访问系统注册表获取ODBC数据服务列表. 具体实现:     Microsoft.win32提供了RegistryKey类,用来访问系统的注册表.    ///定义注册表子Path    string strRegPath = @"SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources";    ///创建两个RegistryKey类,一个将指向Root Path,另一个将指向子Path   

利用InstallShield获取注册表键值的脚本_其它

Use  nvType = REGDB_NUMBER;  szKey = "\\SYSTEM\\CurrentControlSet\\Servic  es\\{58ECC408-265E-4342-9DA4-70BF1796D81D}\\Parameters\\Tcpip";  szName = "EnableDHCP"  RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );  RegDBGetKeyvalueEx ( szKey,