任何人都有c/C++ IOCTL调用的经验吗? 基本上我试图确定一个USB记忆棒插入什么端口。 我有所有的USB信息和音量信息。可以链接这两个信息块,我需要驱动程序密钥或序列号。 但是打电话时的DeviceIoControl我越来越无效的句柄“最后的错误代码”安装目录在C调用IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER时出现无效句柄
我的驱动器的USB驱动器:\(不是驱动器号)请参见下面
//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;
为什么无用的错误隐藏在所有地方都投了? C风格在那!为什么要调用'new'来获得'MEDIA_SERIAL_NUMBER_DATA'结构? – 2012-03-21 16:42:07
谢谢比利,其实我需要我能得到的所有帮助。我是一个Java开发人员,这个东西很可怕! :-)理想情况下,我也想为此编写单元测试,但我猜这是不可能的。 – Derek 2012-03-21 21:18:51