阅读:1744回复:8
有关DeviceIoControl
我在Sys里DeviceControl()里switch(irp...){case IOCTL_LOCK_SYSTEMKEY:...}
在App里DeviceIoControl(hDevice,//设备接口 IOCTL_UNLOCK_SYSTEMKEY, NULL,NULL, NULL,NULL, &ret, NULL)) #define IOCTL_LOCK_SYSTEMKEY \\ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) 用GetLastError()返回却是1,说是功能错误。 请问各位可能是什么原因啊。 |
|
沙发#
发布于:2002-07-31 08:32
我在Sys里DeviceControl()里switch(irp...){case IOCTL_LOCK_SYSTEMKEY:...} IOCTL_LOCK_SYSTEMKEY IOCTL_UNLOCK_SYSTEMKEY 不知你在驱动里是否实现了IOCTL_LOCK_SYSTEMKEY |
|
板凳#
发布于:2002-07-31 08:46
甚是!
IOCTL_LOCK_SYSTEMKEY IOCTL_UNLOCK_SYSTEMKEY 是属笔误还是? 另外,switch()里面的因子应该是IoControlCode. |
|
|
地板#
发布于:2002-07-31 08:51
细心点啦。 ;)
|
|
地下室#
发布于:2002-07-31 10:14
有收获
|
|
5楼#
发布于:2002-07-31 10:25
不好意思,写错了,我说详细点。。。
#define IOCTL_LOCK_SYSTEMKEY \\ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER, FILE_ANY_ACCESS) #define IOCTL_UNLOCK_SYSTEMKEY \\ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_NEITHER, FILE_ANY_ACCESS) //这个函数是DriverStudio生成的用来处理控制码的。 NTSTATUS KbfilterDevice::InternalDeviceControl(KIrp I) { t << \"Entering KbfilterDevice::Internal Device Control, \" << I << EOL; ULONG IoctlCode = I.IoctlCode(); PCONNECT_DATA theConnectData; //Hook the callback routine switch(IoctlCode) { case IOCTL_LOCK_SYSTEMKEY: //my code... case IOCTL_UNLOCK_SYSTEMKEY: //my code... case IOCTL_INTERNAL_KEYBOARD_CONNECT: if(I.IoctlInputBufferSize() != sizeof(CONNECT_DATA)) return I.PnpComplete(STATUS_INVALID_PARAMETER); theConnectData = (PCONNECT_DATA)I.IoctlType3InputBuffer(); //Save the original service and device object for the // callback. m_RealClassService = (PMY_SERVICE_CALLBACK)theConnectData->ClassService; m_RealDeviceObject = theConnectData->ClassDeviceObject; //Put in our device object and callback theConnectData->ClassDeviceObject = m_pDeviceObject; theConnectData->ClassService = LinkTo(KBServiceCallback); break; //Don\'t allow a disconnect case IOCTL_INTERNAL_KEYBOARD_DISCONNECT: return I.PnpComplete(STATUS_NOT_IMPLEMENTED); } return PassThrough(I, LinkTo(InternalDeviceCompletion), this); } 我在应用程序里是这样的: if(!DeviceIoControl(hDevice,//hDevice是我用CreateFile获得的设备Handle. IOCTL_LOCK_SYSTEMKEY, NULL,NULL, NULL,NULL, &ret, NULL)) { printf(\"%d\",GetLastError()); CloseHandle(hDevice); return FALSE; } 用GetLastError()返回却是1,说是功能错误。 请问各位可能是什么原因啊。 |
|
6楼#
发布于:2002-07-31 10:26
按道理我感觉没有错呀,实在是搞不懂了。请各位帮我想想原因,谢谢!!
|
|
7楼#
发布于:2002-07-31 11:17
我估计是你的驱动里面控制部分返回值不对,你先总是返回SATUS_SUCCESS试试,如果还错,那就是DeviceControl参数中输入输出缓冲需要设置。
|
|
|
8楼#
发布于:2002-07-31 15:02
请问这种键盘过滤驱动,我在DeviceIoControl里该怎么设缓冲区。
|
|