阅读:1010回复:2
tooflat文件系统驱动学习..问题来拉
由于工作的需要,刚刚学习文件系统驱动,买了<文件系统内幕>(此站的),觉得楚狂人教程不错,就开始学习他的,同时借鉴了tooflat的代码,可是刚刚开始就出现无数次的蓝屏啊,
就下面的代码问题: 1. 我争取在sfread涵数中添加我对文件数据操作的代码,不在sfreadcomplete中,所以用拉楚老大的waitforobject的代码段(书上写的),取不到文件的信息?? NTSTATUS SfRead( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PSFILTER_DEVICE_EXTENSION DevExt = (PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension; PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); NTSTATUS Status = STATUS_SUCCESS; PAGED_CODE(); ASSERT(IrpSp); ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)); ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject)); if (!DevExt->StorageStackDeviceObject) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(DevExt->AttachedToDeviceObject, Irp); } if ((Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(DevExt->AttachedToDeviceObject, Irp); } { //test KEVENT waitEvent; UNICODE_STRING filename; UNICODE_STRING tempstr; //RtlCopyUnicodeString(&filename, &IrpSp->FileObject->FileName); filename = IrpSp->FileObject->FileName; RtlInitUnicodeString( &tempstr, L"\\test11.txt" ); KdPrint(("sfilter!SfRead: tempstr: 0[%ws]", tempstr.Buffer)); //KdPrint(("sfilter!SfRead: filename: 1[%ws]", filename.Buffer)); if(!RtlCompareUnicodeString(&filename, &tempstr, 0)) { KeInitializeEvent( &waitEvent, NotificationEvent, FALSE); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine( Irp, SfReadCompletion, &waitEvent, TRUE, TRUE, TRUE); Status = IoCallDriver(DevExt->AttachedToDeviceObject, Irp); if(STATUS_PENDING == Status) { Status = KeWaitForSingleObject( &waitEvent, Executive, KernelMode, FALSE, NULL); ASSERT(STATUS_PENDING == Status); if(Irp->MdlAddress == NULL) { KdPrint(("sfilter!SfRead: filename: !!!![%ws], rd offset: [%u], rd.length: [%u],wt.offset: [%u], wt.length: [%u]\n" , IrpSp->FileObject->FileName.Buffer , IrpSp->Parameters.Read.ByteOffset.QuadPart , IrpSp->Parameters.Read.Length , IrpSp->Parameters.Write.ByteOffset.QuadPart , IrpSp->Parameters.Write.Length)); } } } } IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS SfReadCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { //PREAD_WRITE_COMPLETION_CONTEXT CompletionCtx = (PREAD_WRITE_COMPLETION_CONTEXT) Context; UNREFERENCED_PARAMETER(DeviceObject); UNREFERENCED_PARAMETER(Irp); ASSERT(Context != NULL); KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); //return STATUS_MORE_PROCESSING_REQUIRED ; return STATUS_SUCCESS; } |
|
沙发#
发布于:2007-05-31 17:26
还有:
if (DevExt->DriveLetter != DEBUG_VOLUME) 我将DEBUG_VOLUME设置成 L"D",然后在D盘上操作,为什么没等过. |
|
板凳#
发布于:2007-06-01 10:59
没人啊?tooflat/devia/znsoft人呢? 支持一下啊
|
|