微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

reactos操作系统实现(135)

当从IO管理器里调用函数IopParseDevice来分析设备时,就可以找到相应的磁盘设备,并在这函数调用函数IopCheckVpbMounted来检查这个文件系统是否加载,如果没有加载,就会调用函数IopMountVolume来加载文件卷,那么在这函数里就会构造一个IRP发送给文件系统驱动程序,驱动程序就收到主功能码为IRP_MJ_FILE_SYstem_CONTROL和次功能码为IRP_MN_MOUNT_VOLUMEIRP处理请求。在FAT文件系统里是通过函数VfatFileSystemControl来处理相应的功能码,具体实现如下:

#001 NTSTATUS VfatFileSystemControl(PVFAT_IRP_CONTEXT IrpContext)

#002 /*

#003 * FUNCTION: File system control

#004 */

#005 {

#006

#007 NTSTATUS Status;

#008

#009 DPRINT("VfatFileSystemControl(IrpContext %p)/n",IrpContext);

#010

#011 ASSERT(IrpContext);

#012 ASSERT(IrpContext->Irp);

#013 ASSERT(IrpContext->Stack);

#014

#015 IrpContext->Irp->IoStatus.information = 0;

#016

这里区分次功能码,并分派给不同的函数处理。

#017 switch (IrpContext->MinorFunction)

#018 {

#019 case IRP_MN_USER_FS_REQUEST:

#020 switch(IrpContext->Stack->Parameters.DeviceIoControl.IoControlCode)

#021 {

#022 case FSCTL_GET_VOLUME_BITMAP:

#023 Status = VfatGetVolumeBitmap(IrpContext);

#024 break;

#025 case FSCTL_GET_RETRIEVAL_POINTERS:

#026 Status = VfatGetRetrievalPointers(IrpContext);

#027 break;

#028 case FSCTL_MOVE_FILE:

#029 Status = VfatMoveFile(IrpContext);

#030 break;

#031 #ifdef USE_ROS_CC_AND_FS

#032 case FSCTL_ROS_QUERY_LCN_MAPPING:

#033 Status = VfatRosQueryLcnMapping(IrpContext);

#034 break;

#035 #endif

#036 case FSCTL_IS_VOLUME_DIRTY:

#037 Status = VfatIsVolumeDirty(IrpContext);

#038 break;

#039 case FSCTL_MARK_VOLUME_DIRTY:

#040 Status = VfatMarkVolumeDirty(IrpContext);

#041 break;

#042 default:

#043 Status = STATUS_INVALID_DEVICE_REQUEST;

#044 }

#045 break;

#046

这里就是实现加载文件卷的功能码处理。

#047 case IRP_MN_MOUNT_VOLUME:

#048 Status = VfatMount(IrpContext);

#049 break;

#050

#051 case IRP_MN_VERIFY_VOLUME:

#052 DPRINT("VFATFS: IRP_MN_VERIFY_VOLUME/n");

#053 Status = VfatVerify(IrpContext);

#054 break;

#055

#056 default:

#057 DPRINT("VFAT FSC: MinorFunction %d/n",IrpContext->MinorFunction);

#058 Status = STATUS_INVALID_DEVICE_REQUEST;

#059 break;

#060 }

#061

#062 IrpContext->Irp->IoStatus.Status = Status;

#063

#064 IoCompleteRequest (IrpContext->Irp,IO_NO_INCREMENT);

#065 VfatFreeIrpContext(IrpContext);

#066 return (Status);

#067 }

#068

原文地址:https://www.jb51.cc/react/308389.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐