jkgear
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2005-09-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1956回复:10

帮忙看下源码,谢谢

楼主#
更多 发布于:2005-01-07 16:16
            附件中是完整的sfilter.c。
很简单的源码,以sfilter为基础。
就是截取IRP_MJ_READ,每次读请求时dbgprint读的文件名,文件大小等信息。
SfRead的代码如下:

NTSTATUS
SfRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    PSFILTER_DEVICE_EXTENSION      extension;
PDEVICE_OBJECT         attachedDevice;
PIO_STACK_LOCATION     irpSp = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS               status;
PFILE_OBJECT           file  = irpSp->FileObject;
LARGE_INTEGER          offset = irpSp->Parameters.Read.ByteOffset;
ULONG                  length = irpSp->Parameters.Read.Length;
    WCHAR                  nameBuf[512];
UNICODE_STRING         name;


if(!(DeviceObject->DriverObject==gSFilterDriverObject))
{
   Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
        Irp->IoStatus.Information = 0;
   status = Irp->IoStatus.Status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
   return status;
}


extension        =    DeviceObject->DeviceExtension;
attachedDevice   =    extension->AttachedToDeviceObject;

if(extension->StorageStackDeviceObject==NULL)
{
   IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(attachedDevice,Irp);
}

    RtlInitEmptyUnicodeString(&name,nameBuf,512);
if(file)
{
   if( file->FileName.Buffer && !(file->Flags & FO_DIRECT_DEVICE_OPEN) )
        RtlCopyUnicodeString(&name,&file->FileName);

}
    else
{
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(attachedDevice,Irp);
}

DbgPrint("xxx irp flag = %xrn",Irp->Flags);
DbgPrint("xxx file read: %wZ rn",&name);
DbgPrint("xxx read offset = %ld ",offset);
DbgPrint("xxx read length = %ldrn",length);

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

}

用INF文件安装后重起就蓝屏,大侠帮忙
附件名称/大小 下载次数 最后更新
2005-01-07_sfilter.c (186KB)  29

最新喜欢:

aasa2aasa2 TH1999TH1999
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-07 17:01
一下子还看不出什么问题  :)
建议你对照着Sfilter中的SfCreate来写,或者直接参考filemon中的代码。
在交流中学习。。。
jkgear
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2005-09-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-07 17:38
重起后蓝平显示的是:PROCESS1_INITIALIZATION_FAILED

代码中,除了SfRead这段外,我添加的有:
973行:NTSTATUS
SfRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

994行:#pragma alloc_text(PAGE, SfRead)

1191行:    DriverObject->MajorFunction[IRP_MJ_READ] =SfRead;

就这几初,原始未经修改的sfilter是可以安装到系统中的,可以用WINOBJ观看到文件系统中有了sfilterCDO.用DBGview也可以看到相应的dbgprint.添的这点代码就是找不到错了,大侠帮忙呀
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-01-07 17:43
DbgPrint("xxx file read: %wZ rn",&name);
-》%ws  name->Buffer
---内核开发合作或提供基础技术服务QQ:22863668 ---
jkgear
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2005-09-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-07 18:09
 
DbgPrint("xxx file read: %wZ rn",&name);
-》%ws name->Buffer
 



把DbgPrint("xxx file read: %wZ rn",&name);改为
DbgPrint("xxx file read: %ws rn",(&name)->Buffer);

依然是蓝屏,显示的信息也是PROCESS1_INITIALIZATION_FAILED
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-07 20:38
nameBuf没清空,看下面的代码,对else没处理。

if( file->FileName.Buffer && !(file->Flags & FO_DIRECT_DEVICE_OPEN) )
RtlCopyUnicodeString(&name,&file->FileName);

你的sfilter代码比较新,2003的ifskit ?
System Internals http://sys.xiloo.com
toadwolf
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2013-11-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-08 02:15
系统启动的时候文件系统是很早就MOUNT的. 当系统想要LOAD别的驱动程序的时候, 它需要读那个驱动的SYS文件, 于是进到了你的SfRead里面. 你的SfRead打印了一堆东西然后就直接完成了这个Read的IRP, 实际上什么也没有读( Irp->IoStatus.Information = 0;), 系统就认为读那个驱动的SYS文件时出错, 于是BSOD.

既然是过滤驱动, 就要把IRP往下传!!!!!!

toad
jkgear
驱动牛犊
驱动牛犊
  • 注册日期2004-09-24
  • 最后登录2005-09-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-09 14:05
我的系统是2000,安装的IFS KIT是2003的。蓝屏原因toadwolf说对了。非常感谢各位的支持。以下是修改后的SfRead

NTSTATUS
SfRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    PSFILTER_DEVICE_EXTENSION      extension;
PDEVICE_OBJECT         attachedDevice;
PIO_STACK_LOCATION     irpSp = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS               status;
PFILE_OBJECT           file  = irpSp->FileObject;
LARGE_INTEGER          offset = irpSp->Parameters.Read.ByteOffset;
ULONG                  length = irpSp->Parameters.Read.Length;
    WCHAR                  nameBuf[512];
UNICODE_STRING         name;
// KEVENT                 event;


if(!(DeviceObject->DriverObject==gSFilterDriverObject))
{
   Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
        Irp->IoStatus.Information = 0;
   status = Irp->IoStatus.Status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
   return status;
}


extension        =    DeviceObject->DeviceExtension;
attachedDevice   =    extension->AttachedToDeviceObject;

if(extension->StorageStackDeviceObject==NULL)
{
   IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(attachedDevice,Irp);
}

    RtlInitEmptyUnicodeString(&name,nameBuf,512);
if(file)
{
   if( file->FileName.Buffer && !(file->Flags & FO_DIRECT_DEVICE_OPEN) )
        RtlCopyUnicodeString(&name,&file->FileName);

}
    else
{
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(attachedDevice,Irp);
}

    DbgPrint("File Name: %ws",(&name)->Buffer);
DbgPrint("Irp Flag : %x",Irp->Flags);
DbgPrint("Read Offset : %ld",offset);
DbgPrint("Read Length : %ld",length);
    DbgPrint("                         ");

IoSkipCurrentIrpStackLocation(Irp);
    return IoCallDriver(attachedDevice,Irp);

   


}
FengYunII
驱动牛犊
驱动牛犊
  • 注册日期2004-12-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-14 10:37
长见识
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-18 09:44
这样的铁子好,大家都应该像这个兄弟学习把改正后的代码贴出来给大家一个借鉴,其他兄弟是否同意?
Ideas for life!
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-20 17:44
没有人响应阿,自己顶!!!
Ideas for life!
游客

返回顶部