阅读:2448回复:12
重新问几个文件系统端口驱动程序的问题,20分
filedisk中对于来自上层的读写请求是怎样转换到指定文件的读写的?请高手指出!因为我没有看见代码里有读写那个指定文件的操作,是不是用的文件映射?
filedisk的代码虽然很简单,但我是一个初学者,请问有没有中文注释版本? 像ramdisk、虚拟光驱这种,是不是用的端口驱动来实现的? 谢谢! |
|
最新喜欢:nicol |
沙发#
发布于:2002-11-28 17:52
不会和端口驱动打交道,所谓虚拟,就是你来模拟,拿到了i/o请求后你模拟设备应该返回的数据,而不让i/o请求去找真实的设备(实际上也不存在),原理就是这样,所以你要模拟什么盘的话,就的对它的真实结构非常的熟,呵呵原理就是这么简单。
另外:其实注释的英文很简单,就是换成中文也对你没有什么太大的帮助,要想搞驱动,英文是必须的。 |
|
|
板凳#
发布于:2002-11-28 18:19
谢谢deltali大侠的回答!
但是我到哪儿去获得I/O请求呢?不写驱动好像是不行的,可能不是端口驱动而已。应该在那一层获得上面来的请求呢? |
|
地板#
发布于:2002-11-28 18:53
首先,我不是什么大侠,菜鸟是也,呵呵。
i/o请求是从i/o管理器传过来的。你的驱动是接受这些i/o,并作处理。肯定是要写驱动的。 |
|
|
地下室#
发布于:2002-11-29 09:10
这样我就明白多了! :)
比如说,现在我的程序要虚拟一个硬盘,把它安装成k盘,是不是说我在注册这个k盘的时候就可以告诉系统,我的这个k盘要使用我指定的驱动,而不是一般的硬盘驱动呢? 负责这部分工作的系统叫什么?也是i/o管理器吗? 分好像只能给一次啊? :o还是我操作不对? [编辑 - 11/29/02 by dengyl] |
|
5楼#
发布于:2002-11-29 09:32
filedisk里面负责处理读写I/O的大概就是这段代码,但是我怎么看都看不出来它是怎么样处理读写操作的 :(
难道我找的不对,但是代码就那么一点,应该没错 :mad: FileDiskReadWrite ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PDEVICE_EXTENSION device_extension; PIO_STACK_LOCATION io_stack; device_extension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; if (!device_extension->media_in_device) { Irp->IoStatus.Status = STATUS_NO_MEDIA_IN_DEVICE; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NO_MEDIA_IN_DEVICE; } io_stack = IoGetCurrentIrpStackLocation(Irp); if (io_stack->Parameters.Read.Length == 0) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } IoMarkIrpPending(Irp); ExInterlockedInsertTailList( &device_extension->list_head, &Irp->Tail.Overlay.ListEntry, &device_extension->list_lock ); KeSetEvent( &device_extension->request_event, (KPRIORITY) 0, FALSE ); return STATUS_PENDING; } |
|
6楼#
发布于:2002-11-29 10:06
处理了啊,函数返回STATUS_NO_MEDIA_IN_DEVICE,告诉系统驱动器里没有磁盘(可移动驱动器),真正的读写里面没有实现
|
|
7楼#
发布于:2002-11-29 10:16
返回STATUS_NO_MEDIA_IN_DEVICE只是在(!device_extension->media_in_device)的条件下,后面还有对其他情况的处理。
我想可能在这里面: IoMarkIrpPending(Irp); ExInterlockedInsertTailList( &device_extension->list_head, &Irp->Tail.Overlay.ListEntry, &device_extension->list_lock ); KeSetEvent( &device_extension->request_event, (KPRIORITY) 0, FALSE ); 不知道STATUS_PENDING是什么含义? 在msdn里是这么说的: STATUS_PENDING Indicates the client is retaining ownership of the buffer containing the given TSDU until it calls TdiReturnChainedPackets with the given TsduDescriptor. |
|
8楼#
发布于:2002-11-29 10:46
哦,看错了
是IoMarkIrpPending(Irp)和return STATUS_PENDING; 意思是IRP正在处理中,具体的处理代码在别的地方 |
|
9楼#
发布于:2002-11-29 11:39
终于被我找到了 :cool:
case IRP_MJ_READ: ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); break; 在这个函数里, VOID FileDiskThread ( IN PVOID Context ) 在FileDiskCreateDevice()里有这么一句: status = PsCreateSystemThread( &thread_handle, (ACCESS_MASK) 0L, NULL, NULL, NULL, FileDiskThread, //可能是处理I/O请求的代码所在 device_object ); 这就明白了 :cool: |
|
10楼#
发布于:2002-11-29 11:53
刚想说,你就知道了,呵呵。
|
|
|
11楼#
发布于:2002-12-01 17:00
《window内核实验》的最后一个实验例子就是虚拟硬盘,Xixi,不过没代码不完整,便思路有了,下面就好办了。
|
|
12楼#
发布于:2002-12-02 14:07
还想问一下filedisk里的那个驱动是WDM驱动吗?是不是不能在win98下用?
还有那个mksparse,好像不能用。 |
|