阅读:1282回复:2
发送自己的irp(read、write)
NTSTATUS
SpyBuildMyRWIrp( IN PDEVICE_OBJECT olddev, IN PIRP oldirp ) { PFILESPY_DEVICE_EXTENSION DevExt = (PFILESPY_DEVICE_EXTENSION) olddev->DeviceExtension; PIO_STACK_LOCATION oldIrpSp = IoGetCurrentIrpStackLocation(oldirp); PIO_STACK_LOCATION irpSp; PFILE_OBJECT FileObject = oldIrpSp->FileObject; PVOID Buffer = NULL; ULONG Length = MARKLEN; CHAR RWFlag = 1; Buffer = ExAllocatePoolWithTag(NonPagedPool, oldIrpSp->Parameters.Write.Length, FILESPY_POOL_TAG); if(Buffer == NULL) { return 0; } RtlCopyMemory( Buffer, MARKSTRING, MARKLEN); if(RWFlag) irp = IoBuildAsynchronousFsdRequest( IRP_MJ_READ,dev,Buffer,*length,offset,NULL); else irp = IoBuildAsynchronousFsdRequest( IRP_MJ_WRITE,dev,Buffer,*length,offset,NULL); if(irp == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } irp->Flags = 0x43; // KeInitializeEvent(&event,NotificationEvent,FALSE); my_context.event = &event; IoSetCompletionRoutine(irp,MyIrpComplete,&my_context,TRUE,TRUE,TRUE); //Buffer是缓冲。在Irp中被用做UserBuffer接收数据。offset是 这次读的偏移量。以上代码构造一个读irp.请注意,此时您还没有设置FileObject.实际上我是这样发出请求的: irpsp = IoGetNextIrpStackLocation(irp); // 关键: FileObject是否只需要设置此元素???如果我的加密标识放在文件尾部,我怎么得倒尾部的offset呢??? FileObject->CurrentByteOffset = 10; irpsp->FileObject = FileObject; status = IoCallDriver(dev,irp); irp = NULL; if(status == STATUS_PENDING) KeWaitForSingleObject(&event,Executive,KernelMode,FALSE,NULL); { UNICODE_STRING tempstr; RtlInitUnicodeString( &tempstr, L"\\tt111.txt" ); //KdPrint(("sfilter!SpyRead: tempstr: in 00 [%ws]--[%ws]\n", IrpSp->FileObject->FileName.Buffer, tempstr.Buffer)); if(!RtlEqualUnicodeString(Buffer , &tempstr, TRUE)) { KdPrint(("spy! SpyBuildMyRWIrp: %ws", Buffer)) } } return STATUS_SUCCESS; } // 再看看MyIrpComplete如何收场: // 一个通用的irp完成函数: static NTSTATUS MyIrpComplete ( PDEVICE_OBJECT dev, PIRP irp, PVOID context) { PMY_READ_CONTEXT my_context = (PMY_READ_CONTEXT)context; KeSetEvent(my_context->event,IO_NO_INCREMENT,FALSE); my_context->information = irp->IoStatus.Information; my_context->status = irp->IoStatus.Status; // 释放irp,过程非常复杂 if (irp->MdlAddress) { MmUnmapLockedPages( MmGetSystemAddressForMdl(irp->MdlAddress), irp->MdlAddress); MmUnlockPages(irp->MdlAddress); IoFreeMdl(irp->MdlAddress); } IoFreeIrp(irp); // 返回处理未结束.??? return STATUS_MORE_PROCESSING_REQUIRED; } 问题:: 1. FileObject是否只需要设置此元素???如果我的加密标识放在文件尾部,我怎么得倒尾部的offset呢??? 2. // 返回处理未结束.??? 什么“未结果”,以后需要怎么处理??? 楚老大的书给人一种感觉:没看郁闷,看完了更郁闷!!! |
|
最新喜欢:![]() |
沙发#
发布于:2007-07-09 17:16
问题::
1. FileObject是否只需要设置此元素???如果我的加密标识放在文件尾部,我怎么得倒尾部的offset呢??? 2. // 返回处理未结束.??? 什么“未结果”,以后需要怎么处理??? 楚老大的书给人一种感觉:没看郁闷,看完了更郁闷!!! |
|
板凳#
发布于:2007-07-09 20:31
这个问题不好办
|
|
|