阅读:1424回复:5
filter ioctrl问题??急,3x
我用ddk中的kbfilter去过滤截获键盘按键成功。我想通过ioctrl方式去控制动态的过滤按键。
我用IoRegisterDeviceInterface注册GUID的方式,但是在win32中我得到了,该驱动的句柄,不过进行ioctrl操作中老是不对,查看返回的值是1(invalid-function)。可是我明明定义了这个操作。觉得非常奇怪! 那位大侠指点一下。万分感谢! |
|
沙发#
发布于:2004-12-08 09:46
代码贴上来看看.
|
|
|
板凳#
发布于:2004-12-13 15:46
首先感谢,wowocock!
[编辑 - 12/13/04 by zyyz1100] [编辑 - 12/13/04 by zyyz1100] |
|
地板#
发布于:2004-12-13 15:46
我直接在AddDevice中: //----------------------------------- // Register and enable our device interface status = IoRegisterDeviceInterface(PDO, &UPPER_GUID, NULL, &devExt->ifSymLinkName); if( !NT_SUCCESS(status)) { IoDeleteDevice(device); return status; } IoSetDeviceInterfaceState(&devExt->ifSymLinkName, TRUE); DebugPrint2(100,"Symbolic Link Name is %T",&devExt->ifSymLinkName); 然后我想通过UPPER_GUID该GUID在WIN32中打开这个filter,进行IOCTRL操作,可是发现根本不行。我在WIN32中的打开接口句柄程序: HANDLE GetDeviceViaInterface( GUID* pGuid, DWORD instance) { // Get handle to relevant device information set HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if(info==INVALID_HANDLE_VALUE) { TRACE("No HDEVINFO available for this GUID\n"); return NULL; } // Get interface data for the requested instance SP_INTERFACE_DEVICE_DATA ifdata; ifdata.cbSize = sizeof(ifdata); if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata)) { TRACE("No SP_INTERFACE_DEVICE_DATA available for this GUID instance\n"); SetupDiDestroyDeviceInfoList(info); return NULL; } // Get size of symbolic link name DWORD ReqLen; SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]); if( ifDetail==NULL) { SetupDiDestroyDeviceInfoList(info); return NULL; } // Get symbolic link name ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL)) { SetupDiDestroyDeviceInfoList(info); delete ifDetail; return NULL; } TRACE("Symbolic link is %s\n",ifDetail->DevicePath); // Open file HANDLE rv = CreateFile( ifDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( rv==INVALID_HANDLE_VALUE) rv = NULL; delete ifDetail; SetupDiDestroyDeviceInfoList(info); return rv; } 在debug方式下面,我确实得到了ifDetail->DevicePath,可是createfile的时候就失败,看了好久没有结果。后来发现,当把GENERIC_READ | GENERIC_WRITE改为GENERIC_WRITE就可以得到句柄,不过进行deviceioctrl时,返回错误,INVALID_FUNCTION。 不知道怎么回事,请大虾,帮帮忙! 还有msdn中讲到可以通过create object,再建symbliclink方式我也试了试可是还是不成功。迷惑中。 万分感谢! |
|
地下室#
发布于:2004-12-13 16:43
建议你把他改成KMD的方式然后通过SYMBOLIC LINK来访问,而且还可以动态加载和卸载(参考我以前的文章)
|
|
|
5楼#
发布于:2004-12-14 20:23
status = IoRegisterDeviceInterface(PDO, &UPPER_GUID, NULL, &devExt->ifSymLinkName);
这里的PDO是指向什么? 如果是在keyboard的stack中,你应该在CreateFile返回5(访问被拒绝的错误) 正确的方式你需要做一个另外的DeiviceObject来通信 |
|
|