阅读:1956回复:10
帮忙看下源码,谢谢
附件中是完整的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 17:01
一下子还看不出什么问题 :)
建议你对照着Sfilter中的SfCreate来写,或者直接参考filemon中的代码。 |
|
|
板凳#
发布于: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.添的这点代码就是找不到错了,大侠帮忙呀 |
|
驱动老牛
![]() |
地板#
发布于:2005-01-07 17:43
DbgPrint("xxx file read: %wZ rn",&name);
-》%ws name->Buffer |
|
地下室#
发布于:2005-01-07 18:09
DbgPrint("xxx file read: %wZ rn",&name); 把DbgPrint("xxx file read: %wZ rn",&name);改为 DbgPrint("xxx file read: %ws rn",(&name)->Buffer); 依然是蓝屏,显示的信息也是PROCESS1_INITIALIZATION_FAILED |
|
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 ? |
|
|
6楼#
发布于:2005-01-08 02:15
系统启动的时候文件系统是很早就MOUNT的. 当系统想要LOAD别的驱动程序的时候, 它需要读那个驱动的SYS文件, 于是进到了你的SfRead里面. 你的SfRead打印了一堆东西然后就直接完成了这个Read的IRP, 实际上什么也没有读( Irp->IoStatus.Information = 0;), 系统就认为读那个驱动的SYS文件时出错, 于是BSOD.
既然是过滤驱动, 就要把IRP往下传!!!!!! toad |
|
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); } |
|
8楼#
发布于:2005-01-14 10:37
长见识
|
|
9楼#
发布于:2005-01-18 09:44
这样的铁子好,大家都应该像这个兄弟学习把改正后的代码贴出来给大家一个借鉴,其他兄弟是否同意?
|
|
|
10楼#
发布于:2005-01-20 17:44
没有人响应阿,自己顶!!!
|
|
|