阅读:1595回复:1
tooflat老大,救救我吧,请教你的代码的问题啊
我在sfcreate中得倒文件全路径后直接调用你的例程中的SfEncryptDecryptFileByFileObject函数(在下面贴出来了),可是总是进入if(inforation == 0)语句中,看了ifs help doc,发现 information == 0 标识read失败。
是不是下面的代码有错误??? 还是调用的方法不对????如果不对,需要怎么调用?? 救救我吧,尝试了好几天了。。。。 NTSTATUS SfIssueReadWriteIrpSynchronously( IN PDEVICE_OBJECT DeviceObject, IN PFILE_OBJECT FileObject, IN ULONG MajorFunction, IN PIO_STATUS_BLOCK IoStatus, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER ByteOffset, IN ULONG IrpFlags ) { PIRP Irp = NULL; PIO_STACK_LOCATION IrpSp = NULL; KEVENT Event; NTSTATUS Status; ASSERT((MajorFunction == IRP_MJ_READ) || (MajorFunction == IRP_MJ_WRITE)); KeInitializeEvent(&Event, NotificationEvent, FALSE); Irp = IoBuildSynchronousFsdRequest( MajorFunction, DeviceObject, Buffer, Length, ByteOffset, &Event, IoStatus ); if (!Irp) return STATUS_INSUFFICIENT_RESOURCES; Irp->Flags |= IrpFlags ; Irp->Flags |= IRP_NOCACHE;//IRP_PAGING_IO+IRP_NOCACHE+IRP_SYNCHRONOUS_PAGING_IO(0x43); Irp->Flags |= IRP_READ_OPERATION;//IRP_PAGING_IO+IRP_NOCACHE+IRP_SYNCHRONOUS_PAGING_IO(0x43); //Irp->Tail.Overlay.Thread = pIrp->Tail.Overlay.Thread; Irp->RequestorMode = KernelMode; IrpSp = IoGetNextIrpStackLocation(Irp); IrpSp->FileObject = FileObject; IrpSp->DeviceObject = DeviceObject; Status = IoCallDriver(DeviceObject, Irp); if (STATUS_PENDING == Status) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); } return IoStatus->Status; } NTSTATUS SfEncryptDecryptFileByFileObject( IN PDEVICE_OBJECT DeviceObject, IN PFILE_OBJECT FileObject ) { IO_STATUS_BLOCK IoStatus = {0}; NTSTATUS Status; PVOID Buffer = NULL; LARGE_INTEGER ByteOffset; ByteOffset.QuadPart = 2; while(TRUE) { IoStatus.Status = STATUS_SUCCESS; IoStatus.Information = 0; Buffer = ExAllocatePool( NonPagedPool, 10 ); RtlZeroMemory(Buffer, MARKLEN * sizeof(CHAR)); Status = SfIssueReadWriteIrpSynchronously( DeviceObject, FileObject, IRP_MJ_READ, &IoStatus, Buffer, MARKLEN * sizeof(CHAR), &ByteOffset, 0 ); if (!NT_SUCCESS(Status)) { if (STATUS_END_OF_FILE == Status) Status = STATUS_SUCCESS; KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: Status == STATUS_END_OF_FILE\n")); break; } if (0 == IoStatus.Information) { KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: IoStatus.Information == 0 and %d\n", strlen(Buffer))); break; } break; } if (Buffer != NULL) { ExFreePool( Buffer ); } return Status; } |
|
沙发#
发布于:2007-07-13 04:14
还是不行啊,是不是irp、irpsp中的元素设置问题???
还有问题2:SfEncryptDecryptFileByFileObject调用后,是不是要到sfread中得倒数据,SfEncryptDecryptFileByFileObject中的Buffer变量会有数据吗?? |
|