阅读:1672回复:7
tooflat老大,快来啊,create中读标识的问题
tooflat的代码, 我应用了,可是,我读出来的是“??????”乱码,为什么???
我在我的sfread中有异或加解密,本来怀疑是它的问题,可是,我去掉了后,还是一样,啊。。。。。。?????????? 下面的代码在sfcreate中得倒文件全路径后调用的。 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); IrpSp = IoGetNextIrpStackLocation(Irp); IrpSp->FileObject = FileObject; 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; UCHAR Buffer[512] = {'\0'}; LARGE_INTEGER ByteOffset; ULONG Offset = 0; BOOLEAN EndOfFile = FALSE; ByteOffset.QuadPart = 0; RtlZeroMemory(Buffer, 512 * sizeof(CHAR)); while (TRUE) { IoStatus.Status = STATUS_SUCCESS; IoStatus.Information = 0; Status = SfIssueReadWriteIrpSynchronously( DeviceObject, FileObject, IRP_MJ_READ, &IoStatus, Buffer, sizeof(Buffer), &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) { ULONG j =0; KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: IoStatus.Information == 0 and %d\n", sizeof(Buffer))); KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: [%d][%s]\n", strlen(Buffer), Buffer)); break; } if (IoStatus.Information < sizeof(Buffer)) EndOfFile = TRUE; KdPrint(("sfilter!SpyCreate: SfEncryptDecryptFileByFileObject: in %s\n",Buffer)); } // Status = SfIssueReadWriteIrpSynchronously( // DeviceObject, // FileObject, // IRP_MJ_WRITE, // &IoStatus, // Buffer, // IoStatus.Information, // &ByteOffset, // 0 // ); // if (!NT_SUCCESS(Status)) // { // if (STATUS_END_OF_FILE == Status) // Status = STATUS_SUCCESS; // // break; // } // // if (EndOfFile) // break; ByteOffset.QuadPart += sizeof(Buffer); // by wengzuhong test start break; // by wengzuhong test end } return Status; } |
|
沙发#
发布于:2007-07-12 15:21
为什么总是进入if (0 == IoStatus.Information)中啊
|
|
板凳#
发布于:2007-07-13 13:11
file size == 0 ??
|
|
地板#
发布于:2007-07-13 13:29
文件中有数据啊 (测试的文件:12094byte)
|
|
地下室#
发布于:2007-07-13 13:32
我打印了一下Buffer的大小,结果发现,strlen(Buffer) = 0;
这是怎么回事??那我先前读出来的“???”又算什么? 在前面我都有RtlZeroMemory的动作的。 难道Buffer被清掉了? |
|
5楼#
发布于:2007-07-13 13:36
确认一下:
是: 在sfcreate中得倒文件全路径后调用的SfEncryptDecryptFileByFileObject函数吗?? |
|
6楼#
发布于:2007-07-13 13:41
对了,我只对tt111.txt文件测试。
在sfread中也做了判断是否为tt111.txt文件。 我在sfcreate中调用SfEncryptDecryptFileByFileObject之前也做了判断是否为tt111.txt文件,那SfEncryptDecryptFileByFileObject的读动作会不会进入sfread中???会出什么问题? |
|
7楼#
发布于:2007-07-27 18:08
支持顶一下,请toolflat老大解答下
|
|