zyyz1100
驱动牛犊
驱动牛犊
  • 注册日期2003-01-11
  • 最后登录2009-10-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望12点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1424回复:5

filter ioctrl问题??急,3x

楼主#
更多 发布于:2004-12-07 15:37
我用ddk中的kbfilter去过滤截获键盘按键成功。我想通过ioctrl方式去控制动态的过滤按键。
我用IoRegisterDeviceInterface注册GUID的方式,但是在win32中我得到了,该驱动的句柄,不过进行ioctrl操作中老是不对,查看返回的值是1(invalid-function)。可是我明明定义了这个操作。觉得非常奇怪!
那位大侠指点一下。万分感谢!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-12-08 09:46
代码贴上来看看.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
zyyz1100
驱动牛犊
驱动牛犊
  • 注册日期2003-01-11
  • 最后登录2009-10-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望12点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-13 15:46
首先感谢,wowocock!

[编辑 -  12/13/04 by  zyyz1100]

[编辑 -  12/13/04 by  zyyz1100]
zyyz1100
驱动牛犊
驱动牛犊
  • 注册日期2003-01-11
  • 最后登录2009-10-12
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望12点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于: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方式我也试了试可是还是不成功。迷惑中。
万分感谢!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-12-13 16:43
建议你把他改成KMD的方式然后通过SYMBOLIC LINK来访问,而且还可以动态加载和卸载(参考我以前的文章)
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-14 20:23
status = IoRegisterDeviceInterface(PDO, &UPPER_GUID, NULL, &devExt->ifSymLinkName);
这里的PDO是指向什么?
如果是在keyboard的stack中,你应该在CreateFile返回5(访问被拒绝的错误)
正确的方式你需要做一个另外的DeiviceObject来通信
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部