liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
阅读:4996回复:25

天呀,有没有一个sfilter和用户程序通信的例子啊??help,

楼主#
更多 发布于:2007-01-04 11:19
  看了无数帖子,搞了几天都不成功,,天啊,谁有这样的例子啊?吧代码文件传一下,help me

下面这个帖子是说的和我同样的问题,,
http://www.eggheadcafe.com/forumarchives/win32programmerkernel/Mar2000/post26109576.asp
这个问题论坛也有很多相关帖子..
但是没有人总结一下,,我们菜鸟看不明白..
h--e--l--p------
大家好
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-01-04 19:44
给我一个可以通信的例子给100Y,用支付宝支付,
大家好
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2007-01-05 00:03
你还是自己研究吧

不知道你想实现什么,是从应用程序中主动找驱动,还是从驱动中通知应用程序

不过都不是啥难点,已经讨论过很多次了.
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
地板#
发布于:2007-01-05 00:22
ddk中general有现成的例子,不过如果是用tooflat大虾的sfilter,要处理好IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-01-05 08:32
我想做的很简单!!只要可以用CreateFile打开设备就可以了!!我看了计划所有的帖子和所有的尝试。最后都失败了,一打开设备就兰屏重启,搞了一个星期了。我是这么做的,将原来IFS 2003的sfilter.c的做了如下修改:

//增加设备链接,这个是成功的,驱动载入后用工具可以看到链接名字

    RtlInitUnicodeString( &linkString, DOS_DEVICE_NAME);
    status = IoCreateSymbolicLink( &linkString, &nameString );
    KdPrint(( "SFilter!IoCreateSymbolicLink\n"));

    if (!NT_SUCCESS(status)) {
        IoDeleteSymbolicLink( &linkString );
        status = IoCreateSymbolicLink( &linkString, &nameString );

        if (!NT_SUCCESS(status)) {
       KdPrint(( "SFilter!DriverEntry: IoCreateSymbolicLink failed\n"));

            IoDeleteDevice(gSFilterControlDeviceObject);
            return status;
        }

//增加了IRP_MJ_DEVICE_CONTROL
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SfDeviceIoControl;
//SfDeviceIoControl例程如下(例程基本没有什么处理):

NTSTATUS
SfDeviceIoControl (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
)
{  
    NTSTATUS status = STATUS_SUCCESS;
    PIO_STACK_LOCATION irpStack;
    unsigned long cbin;
    unsigned long cbout;
    unsigned long code;
    HANDLE    hEvent = NULL;
    
    if (DeviceObject == gSFilterControlDeviceObject) {
        Irp->IoStatus.Information = 0;
    
        irpStack = IoGetCurrentIrpStackLocation( Irp );
        cbin = irpStack->Parameters.DeviceIoControl.InputBufferLength;
        cbout = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
        code=irpStack->Parameters.DeviceIoControl.IoControlCode;
    status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0L;

        Irp->IoStatus.Status = status;
        

        IoCompleteRequest( Irp, IO_NO_INCREMENT );
        return status;

    }

    IoSkipCurrentIrpStackLocation(Irp);    
    //
    // Call the appropriate file system driver with the request.
    //
    return IoCallDriver(((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp);
}



//最后我对SfCreate例程做了如下修改:

    if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {
        KdPrint(( "SFilter!SfCreate:IS_MY_CONTROL_DEVICE_OBJECT\n"));

        Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_SUCCESS;

    }

//我就这么做的,,
这是我看了很多帖子,参照很多代码后修改的。。
难道sfilter还有不为人知的秘密吗??就这么简单的东西让我搞了一个星期。。
只要用CreateFile打开这个设备就兰屏重启。。
我也是写了N年C的老程序员,写这个程序让我太郁闷,,打击太大了,,
有人能指点一下吗??
大家好
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-01-05 08:43
我写了几个驱动,,都可以和用户程序通信的,但是sfilter就是不可以。。打开设备就兰屏了,
大家好
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
6楼#
发布于:2007-01-05 09:07
看一下createfile的处理,对于自己的控制设备,要改一下代码...
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
7楼#
发布于:2007-01-05 09:08
你追一下就清楚了,对于普通的fs irp,应该传到下面,但如果是你的控制irp,则到你的控制设备就应该完成,并告诉它已经open..否则 .... 天晓得下面会怎么处理,,那重启还是轻的...
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-01-05 09:15
引用第7楼znsoft2007-01-05 09:08发表的“”:
你追一下就清楚了,对于普通的fs irp,应该传到下面,但如果是你的控制irp,则到你的控制设备就应该完成,并告诉它已经open..否则 .... 天晓得下面会怎么处理,,那重启还是轻的...



//我对SfCreate例程做了如下修改:

  if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {
    KdPrint(( "SFilter!SfCreate:IS_MY_CONTROL_DEVICE_OBJECT\n"));

    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;//不管是OPENED还是0都兰屏
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;

  }

你说的我已经做了,如上(同样兰屏)。

难道sfilter还有其他地方禁止了与用户程序的通信吗??

我在本站下载了十几分sfilter代码。。没有一个是有通信的。。

那些做成功了的也不说怎么搞的。。
大家好
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-01-05 09:25
希望有人帮我,我把代码给你
qq
397437395,
大家好
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
10楼#
发布于:2007-01-05 09:31
用户被禁言,该主题自动屏蔽!
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-01-05 09:34
这里是代码,,
附件名称/大小 下载次数 最后更新
help_sfilter.rar (86KB)  176 2007-01-05 09:34
大家好
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-01-05 09:36
刚才不知道怎么传,现在代码我传了,
附件的文档里也把修改的几个地方说明了,,用用比较工具可以一幕了然。。
大家好
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
13楼#
发布于:2007-01-05 10:06
用户被禁言,该主题自动屏蔽!
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-01-05 11:26
引用第13楼tracera2007-01-05 10:06发表的“”:
驱动部分create unload (删除你创建的符号连接) close也应该处理(同 create).试试


谢谢版主!!
正如你所说。。
只要在SfCleanupClose()加下面一段就OK了!!

SfCleanupClose()
{

    if (DeviceObject == gSFilterControlDeviceObject) {

        Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;

        IoCompleteRequest( Irp, IO_NO_INCREMENT );
        return STATUS_SUCCESS;
    }

。。。。。。。。。

}
大家好
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-01-05 11:27
问题已经解决!
大家好
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-01-05 11:33
其实参考filespy就知道了的。。,,兰屏出现是因为只注意了create要改而没有注意到close也要改
大家好
liudaocan80
驱动牛犊
驱动牛犊
  • 注册日期2006-10-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分390分
  • 威望40点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-01-05 11:40
unload的时候符号连接确实没删除,但是这个是无关紧要的吧,驱动加载时创建符号链接不成功会删除符号链接重新创建的,。。
大家好
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
18楼#
发布于:2007-01-05 12:46
用户被禁言,该主题自动屏蔽!
bladellz
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望121点
  • 贡献值0点
  • 好评度120点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-01-05 17:09
汗。。。

自己好好琢磨下

IS_MY_CONTROL_DEVICE_OBJECT
上一页
游客

返回顶部