盘符与设备名称转换 (C: <---> \Device\HarddiskVolume1)

本文通过一个C++示例程序展示了如何枚举计算机上从C盘到Z盘的所有磁盘符号,并使用Windows API函数QueryDosDevice获取每个磁盘符对应的设备路径。
部署运行你感兴趣的模型镜像
#include <string.h>
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
int _tmain (int argc, _TCHAR * argv[])
{
         TCHAR drv = 0;
         TCHAR cDiskSymbol [] = _T( "C:");
         for(drv =_T( 'C'); drv <= _T( 'Z'); drv ++)
        {
                 cDiskSymbol[0] = drv ;
                {
                         TCHAR szBuf [MAX_PATH] = { 0 };
                         QueryDosDevice(cDiskSymbol , szBuf, MAX_PATH);
                         _tprintf(_T ("==== %s === %s  ===\n"), cDiskSymbol , szBuf);
                }
        }
         getchar();
         return 0;
}


--------------------------------------------------------------------------------------------

输出结果

==== C: === \Device\HarddiskVolume1  ===
==== D: === \Device\HarddiskVolume2  ===
==== E: === \Device\HarddiskVolume3  ===
==== F: === \Device\CdRom0  ===
==== G: === \Device\HarddiskVolume4  ===
==== H: ===   ===
==== I: === \Device\HarddiskVolume5  ===
==== J: ===   ===
==== K: ===   ===
==== L: ===   ===
==== M: ===   ===
==== N: ===   ===
==== O: ===   ===
==== P: ===   ===
==== Q: ===   ===
==== R: ===   ===
==== S: ===   ===
==== T: ===   ===
==== U: ===   ===
==== V: ===   ===
==== W: ===   ===
==== X: ===   ===
==== Y: ===   ===
==== Z: ===   ===

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

以下代码有没有问题: // 功能:通过U盘盘符得到U盘的ID 包含pid, vid // 入口参数: // [out] csDeviceID:设备ID信息, 如 USB\VID_17EF&PID_3801\907117000F7F // [in] csDiskSymbol:可移动设备盘符 单个字母 如 H // 返回值: // 成功返回true // 失败返回false BOOL GetDiskDeviceIDBySymbol(PCHAR csDiskSymbol, PCHAR csDeviceID) { //判断该盘符对应的磁盘类型 //WriteLog("csDiskSymbol1", FALSE); //WriteLog(csDiskSymbol, TRUE); HANDLE hVolume = CreateFile(csDiskSymbol, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); if (hVolume == INVALID_HANDLE_VALUE) { return FALSE; } //WriteLog("csDiskSymbol2", FALSE); //WriteLog(csDiskSymbol, TRUE); //通过DeviceIoControl获取设备的STORAGE_DEVICE_NUMBER STORAGE_DEVICE_NUMBER sdnDiskDeviceNum; //包含有关设备的信息。 DWORD dwBytesReturned = 0; if (!DeviceIoControl(hVolume, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdnDiskDeviceNum, sizeof(sdnDiskDeviceNum), &dwBytesReturned, NULL)) { //m_csErrorMsg.Format(_T("DeviceIoControl fail, error code:%d"), GetLastError()); return FALSE; } CloseHandle(hVolume); if (sdnDiskDeviceNum.DeviceNumber == -1) { return FALSE; } //WriteLog("csDiskSymbol3", FALSE); //WriteLog(csDiskSymbol, TRUE); // //已根据盘符得到设备的STORAGE_DEVICE_NUMBER,然后枚举USB设备,找到相同的STORAGE_DEVICE_NUMBER的设备, (只需比较DeviceNumber和DeviceType) const GUID* pGuid = &GUID_DEVINTERFACE_DISK; //GUID_DEVINTERFACE_DISK GUID_DEVINTERFACE_USB_DEVICE HDEVINFO hDevInfo = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDevInfo == INVALID_HANDLE_VALUE) { //m_csErrorMsg.Format(_T("SetupDiGetClassDevs, error code:%d"), GetLastError()); return FALSE; } SP_DEVINFO_DATA DevInfoData; DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); SP_DEVICE_INTERFACE_DATA DevInterfaceData; DevInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); PSP_DEVICE_INTERFACE_DETAIL_DATA pDevInterfaceDetailData = NULL; //SetupDiGetDeviceInterfaceDetail用于存放信息,需要根据实际大小动态分配 DWORD dwRequiredSize = 0; //保存SetupDiGetDeviceInterfaceDetail返回的实际需要的缓存区大小 DWORD dwInstance = 0; //设备Instance //WriteLog("csDiskSymbol4", FALSE); //WriteLog(csDiskSymbol, TRUE); //枚举所有设备 DWORD index = 0; while (SetupDiEnumDeviceInterfaces(hDevInfo, NULL, pGuid, index, &DevInterfaceData)) { //先直接调用函数,目的是获取第一个设备所需要的缓存区大小dwRequiredSize; SetupDiGetDeviceInterfaceDetail(hDevInfo, &DevInterfaceData, NULL, 0, &dwRequiredSize, &DevInfoData); //得到大小后分配内存 pDevInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(dwRequiredSize); pDevInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //再次调用获取信息 if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &DevInterfaceData, pDevInterfaceDetailData, dwRequiredSize, &dwRequiredSize, &DevInfoData)) { //m_csErrorMsg.Format(_T("SetupDiGetDeviceInterfaceDetail, error code:%d"), GetLastError()); free(pDevInterfaceDetailData); SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE; } HANDLE hDrive = CreateFile(pDevInterfaceDetailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDrive == INVALID_HANDLE_VALUE) { //m_csErrorMsg.Format(_T("CreateFile INVALID_HANDLE_VALUE, error code:%d"), GetLastError()); free(pDevInterfaceDetailData); SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE; } STORAGE_DEVICE_NUMBER sdnDeviceInfoByEnumDevice; //每次枚举时获取的设备信息 DWORD dwBytesReturned2 = 0; if (DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdnDeviceInfoByEnumDevice, sizeof(sdnDeviceInfoByEnumDevice), &dwBytesReturned2, NULL )) { // 比较由盘符获取的DeviceNumber,DeviceType枚举时获取的DeviceNumber,DeviceType,相同则说明盘符对应此USB设备 if (sdnDiskDeviceNum.DeviceNumber == sdnDeviceInfoByEnumDevice.DeviceNumber && sdnDiskDeviceNum.DeviceType == sdnDeviceInfoByEnumDevice.DeviceType) { dwInstance = DevInfoData.DevInst; } } free(pDevInterfaceDetailData); CloseHandle(hDrive); ++index; } //WriteLog("csDiskSymbol5", FALSE); //WriteLog(csDiskSymbol, TRUE); if (index == 0) { //m_csErrorMsg.Format(_T("SetupDiEnumDeviceInterfaces, error code:%d"), GetLastError()); SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE; } //m_csErrorMsg.Format(_T("SetupDiEnumDeviceInterfaces, error code:%d"), GetLastError()); //获取InstanceParent DWORD dwInstanceParent = 0; CM_Get_Parent(&dwInstanceParent, dwInstance, 0); WCHAR buffer[256] = { 0 }; CM_Get_Device_ID(dwInstanceParent, buffer, sizeof(buffer), 0); // 得到设备ID,如 USB\VID_17EF&PID_3801\907117000F7F SetupDiDestroyDeviceInfoList(hDevInfo); sprintf(csDeviceID, "%s", buffer); //csDeviceID.Format(_T("%s"), buffer); //找到的设备的ID, 我也不知道有没有可能两个设备这个ID是相同的 //csDeviceID.MakeUpper(); //WriteLog("csDiskSymbol6", FALSE); //WriteLog(csDiskSymbol, TRUE); return TRUE; }
最新发布
11-06
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值