调用IOCTLSTORAGE_GET_MEDIA_SERIAL_NUMBER时句柄无效
Invalid handle when calling IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER
有人有c/c++IOCTL调用的经验吗?基本上,我试图确定USB记忆棒插入的端口。我有所有的USB信息和音量信息。为了链接这两个信息块,我需要驱动程序密钥或序列号。然而,当调用DeviceIoControl时,我得到了无效的句柄作为"最后一个错误代码"
我的驱动器USB驱动器安装到c:\中的目录(不是驱动器号)请参阅下面的
//get a handle on the volume
HANDLE hVolume;
DWORD dwAccessFlags;
dwAccessFlags = GENERIC_READ | GENERIC_WRITE;
hVolume = CreateFile(L"C:_USBMP1",
dwAccessFlags,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL );
if (hVolume == INVALID_HANDLE_VALUE) {
printf("Invalid Handle");
}
//use the handle
MEDIA_SERIAL_NUMBER_DATA* pserialNumberData = new MEDIA_SERIAL_NUMBER_DATA;
wstring result;
//HANDLE hVolume = OpenVolume(vname.substr(0, vname.length() - 1).c_str());
DWORD bytesReturned = 0;
LPDWORD lpBytesReturned = &bytesReturned;
OVERLAPPED over;
LPOVERLAPPED lpOver = &over;
BOOL success = 1;
success = DeviceIoControl(
(HANDLE) hVolume, // handle to device
IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER, // dwIoControlCode
NULL, // lpInBuffer
0, // nInBufferSize
(LPVOID) pserialNumberData, // output buffer
(DWORD) sizeof(MEDIA_SERIAL_NUMBER_DATA), // size of output buffer
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOver // OVERLAPPED structure
);
wcout << L"--> GetSn() DeviceIoControl success " << success << endl;
wcout << L"--> GetSn() DeviceIoControl Last error number " << GetLastError() << endl;
wcout << L"--> GetSn() DeviceIoControl Bytes Returned " << bytesReturned << endl;
wcout << L"--> GetSn() DeviceIoControl struct size " << sizeof(MEDIA_SERIAL_NUMBER_DATA) << endl;
如果查看DeviceIoControl函数的备注部分,它会显示:
要检索设备的句柄,必须使用设备名称或与设备关联的驱动程序名称调用
CreateFile
函数。要指定设备名称,请使用以下格式:\.DeviceName
DeviceIoControl可以接受特定设备的句柄。例如,要打开逻辑驱动器a的句柄:使用
CreateFile
,请指定\.a:
。或者,可以使用名称\.PhysicalDrive0
、\.PhysicalDrive1
等打开系统上物理驱动器的句柄。
您没有打开设备句柄,因此DeviceIoControl在这种情况下不起作用。
我看到的第一个大问题是,必须使用FILE_FLAG_BACKUP_SEMANTICS标志调用CreateFile函数,才能获得目录的有效句柄。因此,对于初学者来说,请尝试:
hVolume = CreateFile( L"C:_USBMP1",
dwAccessFlags,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL );
嗯。。。我认为从CreateFile获得的句柄是安装驱动器的目录的句柄,而不是驱动器本身。为了确保获得所需设备的句柄,您应该使用设备路径,例如\.DeviceHarddiskVolume1
。WinObj或DeviceTree可能会帮助您找到usb驱动器的路径。
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 是否需要关闭来自 WinHTTP 异步的句柄?
- 句柄OK全部崩溃
- 我需要通过窗口句柄(HWND)获取文件,我该怎么办?
- 什么是 C# 等同于C++句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取现有进程句柄
- GetModuleHandle() 无法检索由 "notepad.exe" 加载的"advapi32.dll"的句柄
- 更正GLSL无绑定纹理句柄中的结构布局
- 带有资源句柄的TensorFlow自定义C++操作