shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
阅读:1792回复:9

文件过滤驱动与应用层通信的问题

楼主#
更多 发布于:2007-03-28 10:33
  我在应用层用这段代码打开下层过滤驱动对象,但是却报“函数不正确”的错误,而后我又用同样的方法打开NDIS的Passthru,却没有任何问题。    
    HANDLE handle = CreateFile(
        "\\\\.\\SFilter",
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if (INVALID_HANDLE_VALUE == handle)
    {
        LPVOID lpMsgBuf;
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            GetLastError(),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
            (LPTSTR) &lpMsgBuf,
            0,
            NULL);
        AfxMessageBox((LPTSTR)lpMsgBuf) ;
    }

在过滤驱动的DriverEntry中创建符号连接的代码如下:
        RtlInitUnicodeString( &nameString, L"\\FileSystem\\Filters\\SFilter" );

    status = IoCreateDevice( DriverObject,
                             0,                      //has no device extension
                             &nameString,
                             FILE_DEVICE_DISK_FILE_SYSTEM,
                             FILE_DEVICE_SECURE_OPEN,
                             FALSE,
                             &gSFilterControlDeviceObject );

    //////ADD BY Shenhui
    RtlInitUnicodeString(&symbolicName, L"\\DosDevices\\SFilter") ;
    status = IoCreateSymbolicLink(&symbolicName, &nameString) ;
    if (!NT_SUCCESS(status))
    {
        IoDeleteDevice(gSFilterControlDeviceObject) ;
        return status ;
    }
而且我用windbg跟踪过滤驱动,符号连接也是成功创建的,请各位指点迷津。
作一名真实,诚实,优秀的科技工作者!
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
沙发#
发布于:2007-03-29 23:02
难道没有人实验过?我不断的改变CreateFile中的参数,依然返回失败
作一名真实,诚实,优秀的科技工作者!
bladellz
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望121点
  • 贡献值0点
  • 好评度120点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-31 10:25
IRP_MJ_DEVICE_CONTROL需要处理IRP_MJ_CREATE,
sample code:
switch(IrpStack->MajorFunction)
case IRP_MJ_CREATE:                      // you need to handle irp_mj_create
         break;
case IRP_MJ_DEVICE_CONTROL:
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2007-03-31 22:37
这个好像和处不处理IRP_MJ_CREATE没有多少关系啊 ,我加上了这个还是不行
作一名真实,诚实,优秀的科技工作者!
bladellz
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望121点
  • 贡献值0点
  • 好评度120点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-01 10:09

CreateFile打开驱动句柄不就是发送IRP_MJ_CREATE吗
OSRONLINE有人问过这个问题
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2007-04-01 12:18
我看了IFS的帮助,已经可以了,谢谢你
作一名真实,诚实,优秀的科技工作者!
lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-06-04 20:47
请问shenhui
     我也碰到一样的问题
   感觉代码基本上已经和FileSpy一样了SfCreate等都搞了,
和你开始时碰到一样的问题
   搞了好久 还没头绪,如何解决的?
  IFS帮助具体什么地方?
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
7楼#
发布于:2007-06-05 20:06
你要在sfcreate例程中对DeviceObject == gSFilterControlDeviceObject的情况进行处理;
if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))为真,那么要在这里完成IRP并返回STATUS_SUCCESS
作一名真实,诚实,优秀的科技工作者!
lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2007-06-05 20:53
我的其实是由于粗心大意,在SfCreate中处理了,但是忘了return了,导致在下面被return invalid_device状态
费了好久时间才发现。
多谢楼主了
xhjjxm
驱动小牛
驱动小牛
  • 注册日期2005-08-03
  • 最后登录2010-07-28
  • 粉丝0
  • 关注0
  • 积分1011分
  • 威望208点
  • 贡献值0点
  • 好评度87点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-06-23 23:39
这种类似的问题常会把人给搞叉了!
游客

返回顶部