reactos操作系统实现(133)
VfatReadDiskPartial函数主要用来构造一个IRP给底层驱动程序去读取数据返回。具体实现代码如下:
#001 NTSTATUS
#002 VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext,
#003 IN PLARGE_INTEGER ReadOffset,
#004 IN ULONG ReadLength,
#005 ULONG BufferOffset,
#006 IN BOOLEAN Wait)
#007 {
#008 PIRP Irp;
#009 PIO_STACK_LOCATION StackPtr;
#010 NTSTATUS Status;
#011 PVOID Buffer;
#012
#013 DPRINT ("VfatReadDiskPartial(IrpContext %p, ReadOffset %I64x, ReadLength %d, BufferOffset %x, Wait %d)/n",
#014 IrpContext, ReadOffset->QuadPart, ReadLength, BufferOffset, Wait);
#015
#016 DPRINT ("Building asynchronous FSD Request.../n");
#017
从IRP的MDL地址获取内存缓冲区。
#018 Buffer = (PCHAR)MmGetMdlVirtualAddress(IrpContext->Irp->MdlAddress) + BufferOffset;
#019
创建一个新的IRP。
#020 Irp = IoAllocateIrp(IrpContext->DeviceExt->StorageDevice->StackSize, TRUE);
#021 if (Irp == NULL)
#022 {
#023 DPRINT("IoAllocateIrp failed/n");
#024 return(STATUS_UNSUCCESSFUL);
#025 }
#026
设置IRP属性。
#027 Irp->UserIosb = NULL;
#028 Irp->Tail.Overlay.Thread = PsGetCurrentThread();
#029
#030 StackPtr = IoGetNextIrpStackLocation(Irp);
#031 StackPtr->MajorFunction = IRP_MJ_READ;
#032 StackPtr->MinorFunction = 0;
#033 StackPtr->Flags = 0;
#034 StackPtr->Control = 0;
设置访问设备对象。
#035 StackPtr->DeviceObject = IrpContext->DeviceExt->StorageDevice;
#036 StackPtr->FileObject = NULL;
#037 StackPtr->CompletionRoutine = NULL;
#038 StackPtr->Parameters.Read.Length = ReadLength;
#039 StackPtr->Parameters.Read.ByteOffset = *ReadOffset;
#040
创建一个直接内存访问MDL。
#041 if (!IoAllocateMdl(Buffer, ReadLength, FALSE, FALSE, Irp))
#042 {
#043 DPRINT("IoAllocateMdl failed/n");
#044 IoFreeIrp(Irp);
#045 return STATUS_UNSUCCESSFUL;
#046 }
#047
#048 IoBuildPartialMdl(IrpContext->Irp->MdlAddress, Irp->MdlAddress, Buffer, ReadLength);
#049
设置I/O完成端口函数。
#050 IoSetCompletionRoutine(Irp,
#051 VfatReadWritePartialCompletion,
#052 IrpContext,
#053 TRUE,
#054 TRUE,
#055 TRUE);
#056
#057 if (Wait)
#058 {
#059 KeInitializeEvent(&IrpContext->Event, NotificationEvent, FALSE);
#060 IrpContext->RefCount = 1;
#061 }
#062 else
#063 {
#064 InterlockedIncrement((PLONG)&IrpContext->RefCount);
#065 }
#066
调储存驱动程序来读取文件数据。
#067 DPRINT ("Calling IO Driver... with irp %p/n", Irp);
#068 Status = IoCallDriver (IrpContext->DeviceExt->StorageDevice, Irp);
#069
如果读取数据在阻塞状态,就等底层驱动程序完成。
#070 if (Wait && Status == STATUS_PENDING)
#071 {
#072 KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL);
#073 Status = IrpContext->Irp->IoStatus.Status;
#074 }
#075
#076 DPRINT("%x/n", Status);
#077 return Status;
#078 }
相关文章
- 操作系统进程的实现---中---05
- 操作系统文件使用磁盘的实现---20
- 操作系统之——银行家算法C语言实现
- 创建 macOS 操作系统的 App 图标文件 icons
- 操作系统安全性实训
- Linux操作系统安全加固:实现最佳主机防护(linux操作系统加固)
- 表 Linux 注册表:实现操作系统有力管理 (linux注册)
- Linux操作系统:实现快速、高效的管理(linuxbfd)
- Linux 启动过程详解:一步步实现操作系统的唤醒(linux启动详解)
- 任何来源:MacOS操作系统最新创新。(macos任何来源)
- 探索Linux系统:了解操作系统类型(查看linux操作系统类型)
- Linux:探索开源操作系统分支(linux的分支)
- 将操作系统移植到新的芯片架构的经验
- 注意:由于mongodb.dll是Windows操作系统中MongoDB数据库驱动程序文件的扩展名,因此建议您提供更为详细或具体的信息或上下文,以帮助我们更准确地为您提供标题。以下是针对不同情境的几个标题建议: 如何修复无法加载mongodb.dll文件的问题 遇到mongodb.dll缺失怎么办?快速恢复驱动程序 介绍Windows上使用mongodb.dll实现MongoDB数据库连接的方法 mongodb.dll文件及其在MongoDB应用程序中的作用(mongodb.dll)
- 特色Linux操作系统:技术稳定性的完美结合(speclinux)
- 探索Linux 0.12源码:了解操作系统的基础实现(linux0.12源码)
- 探究Linux进程通信机制,解析进程间通讯方式及内核原理,深入了解操作系统运转机制。(linux进程通信机制)
- 克隆Linux克隆:实现多操作系统的灵活切换(多linux引导)
- 实现U盘上的Linux操作系统安装(u盘上装linux系统)
- Linux操作系统汇总:实现完美体验(linux汇总)
- 使用Linux操作系统轻松搭建虚拟主机,实现网站高效运行!(linux搭建虚拟主机)
- 红帽企业Linux:开源操作系统中的新力量(红帽企业linux)
- 操作系统树莓派:让Linux成为你的主动操作系统(树莓派能运行Linux)
- 实现64位操作系统下安装MySQL 32位(64位装mysql32)
- 如何实现Linux操作系统的自动登录
- php根据操作系统转换文件名大小写的方法