dengyl
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2448回复:12

重新问几个文件系统端口驱动程序的问题,20分

楼主#
更多 发布于:2002-11-28 13:30
filedisk中对于来自上层的读写请求是怎样转换到指定文件的读写的?请高手指出!因为我没有看见代码里有读写那个指定文件的操作,是不是用的文件映射?

filedisk的代码虽然很简单,但我是一个初学者,请问有没有中文注释版本?

像ramdisk、虚拟光驱这种,是不是用的端口驱动来实现的?

谢谢!

最新喜欢:

nicolnicol
deltali
驱动小牛
驱动小牛
  • 注册日期2002-10-25
  • 最后登录2010-07-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-28 17:52
不会和端口驱动打交道,所谓虚拟,就是你来模拟,拿到了i/o请求后你模拟设备应该返回的数据,而不让i/o请求去找真实的设备(实际上也不存在),原理就是这样,所以你要模拟什么盘的话,就的对它的真实结构非常的熟,呵呵原理就是这么简单。
另外:其实注释的英文很简单,就是换成中文也对你没有什么太大的帮助,要想搞驱动,英文是必须的。
我又来了,生命不息,驱动不止。
dengyl
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-28 18:19
谢谢deltali大侠的回答!

但是我到哪儿去获得I/O请求呢?不写驱动好像是不行的,可能不是端口驱动而已。应该在那一层获得上面来的请求呢?
deltali
驱动小牛
驱动小牛
  • 注册日期2002-10-25
  • 最后登录2010-07-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-28 18:53
首先,我不是什么大侠,菜鸟是也,呵呵。
i/o请求是从i/o管理器传过来的。你的驱动是接受这些i/o,并作处理。肯定是要写驱动的。
我又来了,生命不息,驱动不止。
dengyl
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-29 09:10
这样我就明白多了! :)
比如说,现在我的程序要虚拟一个硬盘,把它安装成k盘,是不是说我在注册这个k盘的时候就可以告诉系统,我的这个k盘要使用我指定的驱动,而不是一般的硬盘驱动呢?
负责这部分工作的系统叫什么?也是i/o管理器吗?

分好像只能给一次啊? :o还是我操作不对?

[编辑 -  11/29/02 by  dengyl]
dengyl
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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;
}
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-29 10:06
处理了啊,函数返回STATUS_NO_MEDIA_IN_DEVICE,告诉系统驱动器里没有磁盘(可移动驱动器),真正的读写里面没有实现
dengyl
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-29 10:46
哦,看错了
是IoMarkIrpPending(Irp)和return STATUS_PENDING;
意思是IRP正在处理中,具体的处理代码在别的地方
dengyl
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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:
deltali
驱动小牛
驱动小牛
  • 注册日期2002-10-25
  • 最后登录2010-07-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-29 11:53
刚想说,你就知道了,呵呵。
我又来了,生命不息,驱动不止。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-01 17:00
《window内核实验》的最后一个实验例子就是虚拟硬盘,Xixi,不过没代码不完整,便思路有了,下面就好办了。
dengyl
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2002-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-02 14:07
还想问一下filedisk里的那个驱动是WDM驱动吗?是不是不能在win98下用?
还有那个mksparse,好像不能用。
游客

返回顶部