阅读:1388回复:6
zhaock 在吗?还是刚才那个问题!!急啊
还是刚才那个问题
我按照你的方法,还是没能加密? NTSTATUS FilemonWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp); PFILE_OBJECT FileObject; // PHOOK_EXTENSION hookExt = DeviceObject->DeviceExtension; PFILE_CONTEXT FileCtxPtr = NULL; PREAD_WRITE_COMPLETION_CONTEXT CompletionCtx = NULL; PVOID OldBuffer = NULL; PVOID MyBuffer = NULL; ULONG Length = 0; ULONG Offset = 0; if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { IoSkipCurrentIrpStackLocation(Irp); return STATUS_INVALID_PARAMETER; } if(Irp->MdlAddress) { OldBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress); } else { OldBuffer = Irp->UserBuffer; } Length = currentIrpStack->Parameters.Write.Length; MyBuffer = ExAllocatePool(NonPagedPool,Length); CompletionCtx->OldMdl = Irp->MdlAddress; CompletionCtx->OldUserBuffer = Irp->UserBuffer; CompletionCtx->OldSystemBuffer = Irp->AssociatedIrp.SystemBuffer; CompletionCtx->OldBuffer = OldBuffer; CompletionCtx->MyBuffer = MyBuffer; CompletionCtx->Length = Length; Irp->MdlAddress = IoAllocateMdl(MyBuffer,Length,FALSE, TRUE, NULL); for(Offset = 0 ; Offset < Length ; ++Offset) { ((PCHAR)MyBuffer)[Offset] = ~(((PCHAR)OldBuffer)[Offset]+1); } MmBuildMdlForNonPagedPool(Irp->MdlAddress); Irp->UserBuffer=MmGetMdlVirtualAddress(Irp->MdlAddress); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp,WriteCompletion,CompletionCtx,TRUE,TRUE,TRUE); IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS WriteCompletion(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp, IN PREAD_WRITE_COMPLETION_CONTEXT Context) { PREAD_WRITE_COMPLETION_CONTEXT CompletionCtx = Context; IoFreeMdl(Irp->MdlAddress); Irp->MdlAddress = CompletionCtx->OldMdl; Irp->UserBuffer = CompletionCtx->OldUserBuffer; Irp->AssociatedIrp.SystemBuffer = CompletionCtx->OldSystemBuffer; ExFreePool(CompletionCtx->MyBuffer); return STATUS_SUCCESS; } |
|
沙发#
发布于:2005-05-16 18:24
<IoSetCompletionRoutine(Irp,WriteCompletion,CompletionCtx,TRUE,TRUE,TRUE);
<IoCompleteRequest(Irp, IO_NO_INCREMENT); 显然不对呀,去掉IoCompleteRequest,你要call IoCallDriver, 往下传呀 |
|
板凳#
发布于:2005-05-16 18:47
为什么现在改了还是没有用啊
return IoCallDriver( hookExt->FileSystem , Irp ); |
|
地板#
发布于:2005-05-16 19:11
你设个断点看看OldBuffer 是不是你真要写的数据;
现在的问题,是写成功了,只是明文的,还是根本就没有写 成功? 而且你的CompletionCtx 要动态分配,并在回调里释放, 你设置一个断点,看看回调是不是真的被调用了 |
|
地下室#
发布于:2005-05-16 20:12
我看了看你的代码,问题确实不少,我也从驱动网上下了一个例子,
是用sfilter的,我看你的代码也是根据它来改的。 你先把我前面说的问题看看,一步步都改过来 然后把你调试中遇到的问题,贴上来。 只有这样,一步步调试,才能真正提高你的驱动水平。 |
|
5楼#
发布于:2005-05-16 20:21
好的,我自己试试
[编辑 - 5/17/05 by Hell_Fire_1981] |
|
6楼#
发布于:2005-05-17 08:59
现在正在按照zhaock大哥教我的方法改程序,等改好了,我再贴出来,大家一起看看!
再次感谢zhaock大哥! :cool: :cool: :cool: :cool: :cool: :cool: |
|