阅读:2349回复:4
如何在IRP_MJ_READ中得到文件的内容,求救!
为了在虚拟磁盘中对不同的文件用不同的分组密码加密,在filemon中的IRP_MJ_READ中可以得到文件名,现在我想得到文件内容,就可以针对不同的文件加密。可以我在IRP_MJ_READ中构造一个IRP传到下层得到文件内容时,机器就没有响应了。我的程序有什么问题,请指教。或者有什么更好的方法。
PIRP MyIrp; KEVENT event; IO_STATUS_BLOCK IoStatusBlock; PIO_STACK_LOCATION nextStackLocation; PVOID MyreadBuffer; ULONG MyreadBufferLength; hookExt = HookDevice->DeviceExtension; FileObject = currentIrpStack->FileObject; case IRP_MJ_READ: KeInitializeEvent(&event, SynchronizationEvent, FALSE); MyIrp= IoAllocateIrp(HookDevice->StackSize, FALSE); if(!MyIrp) { return FALSE; } MyreadBuffer = ExAllocatePool(NonPagedPool,1024); MyIrp->AssociatedIrp.SystemBuffer =MyreadBuffer; MyIrp->UserEvent = &event; MyIrp->UserIosb = &IoStatusBlock; MyIrp->Tail.Overlay.Thread = PsGetCurrentThread(); MyIrp->Tail.Overlay.OriginalFileObject = FileObject; MyIrp->RequestorMode = KernelMode; MyIrp->Flags = 0; nextStackLocation = IoGetNextIrpStackLocation(MyIrp); nextStackLocation->MajorFunction = IRP_MJ_READ; nextStackLocation->DeviceObject = HookDevice; nextStackLocation->FileObject = FileObject; nextStackLocation->Parameters.QueryFile.Length =1024; IoSetCompletionRoutine(MyIrp, ReadCompleted, 0, TRUE, TRUE, TRUE); (void) IoCallDriver(hookExt->FileSystem, MyIrp); KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, 0); return NT_SUCCESS( IoStatusBlock.Status); break; NTSTATUS ReadCompleted( PDEVICE_OBJECT DeviceObject, PIRP Irp ) { PIO_STACK_LOCATION IrpStack; IrpStack = IoGetCurrentIrpStackLocation(Irp); DebugPrint(\"IRP %I.Reading %u bytes from %x\", Irp,IrpStack->Parameters.Read.Length, Irp->AssociatedIrp.SystemBuffer); if(Irp->PendingReturned) { IoMarkIrpPending(Irp); } return Irp->IoStatus.Status; } |
|
最新喜欢:![]() |
沙发#
发布于:2003-05-23 09:32
RtlMoveMemory(IrpNextStack,IrpCurStack,sizeof(IO_STACK_LOCATION));
改成: *IrpNextStack=*IrpCurStack; |
|
|
板凳#
发布于:2003-05-23 08:43
vcmfc,我改成这样还是死机.为什么?
IrpCurStack=IoGetCurrentIrpStackLocation(Irp); IrpNextStack=IoGetNextIrpStackLocation(Irp); RtlMoveMemory(IrpNextStack,IrpCurStack,sizeof(IO_STACK_LOCATION)); if( (Irp->Flags & IRP_NOCACHE) || (Irp->Flags & IRP_PAGING_IO) || (Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO) ) { IoSetCompletionRoutine( Irp , ReadCompleted , NULL ,TRUE ,TRUE ,TRUE ); IoCallDriver( hookExt->FileSystem , Irp ); } NTSTATUS ReadCompleted( PDEVICE_OBJECT DeviceObject, PIRP Irp ) { PIO_STACK_LOCATION IrpStack; IrpStack = IoGetCurrentIrpStackLocation(Irp); DebugPrint(\"IRP yang\"); if(Irp->PendingReturned) { IoMarkIrpPending(Irp); } return STATUS_SUCCESS; } |
|
地板#
发布于:2003-05-22 17:25
我们老板的要求是,做一个虚拟的分区,分区中不同的文件用不同的密钥进行分组算法加密。无论是.txt,.doc,还是.exe,.rm。要求是在分区中可以打开,对用户进行透明的加解密。在这里加密是对扇区而言的吗?我现在只能在filedisk基础上做到对分区级的加密,想在filemon的基础上做到对文件级的加密。扇区级的还没想到。我看过一些你的帖子,很受启发,还要请你多请教。
|
|
地下室#
发布于:2003-05-22 16:07
无须自已构造,将这个IRP传下去,设置完成例程,在完成例程里加密。
跟我做的一个东东完全一样。不同文件使用不同的密钥。。。。你会吐血的。 你是不是要加密Microsoft Office文档。 :D :D :D :D :D |
|