那里有人有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:\_USB\MP1",
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;
答案 0 :(得分:2)
如果查看DeviceIoControl函数的“备注”部分,则会显示:
要检索设备的句柄,必须使用设备名称或与设备关联的驱动程序名称来调用
CreateFile
函数。要指定设备名称,请使用以下格式:
\\.\DeviceName
DeviceIoControl可以接受特定设备的句柄。例如,要使用
CreateFile
打开逻辑驱动器A:的句柄,请指定\\.\a:
。或者,您可以使用名称\\.\PhysicalDrive0
,\\.\PhysicalDrive1
等来打开系统上物理驱动器的句柄。
您没有打开设备句柄,因此DeviceIoControl不适用于该情况。
答案 1 :(得分:1)
我看到的第一个大问题是必须使用FILE_FLAG_BACKUP_SEMANTICS标志调用CreateFile函数才能获得目录的有效句柄。所以,对于初学者,请尝试:
hVolume = CreateFile( L"C:\_USB\MP1",
dwAccessFlags,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL );
答案 2 :(得分:0)
嗯......我认为你从CreateFile获得的句柄是你安装驱动器的目录的句柄,而不是驱动器本身。为了确保获得所需设备的句柄,您应该使用设备路径,例如: \\.\Device\HarddiskVolume1
。 WinObj或DeviceTree可能会帮助您找到USB驱动器的路径。