reactos操作系统实现(135)
2009-11-18 22:34
399 查看
当从IO管理器里调用函数IopParseDevice来分析设备时,就可以找到相应的磁盘设备,并在这个函数里调用函数IopCheckVpbMounted来检查这个文件系统是否加载,如果没有加载,就会调用函数IopMountVolume来加载文件卷,那么在这个函数里就会构造一个IRP发送给文件系统驱动程序,驱动程序就收到主功能码为IRP_MJ_FILE_SYSTEM_CONTROL和次功能码为IRP_MN_MOUNT_VOLUME的IRP处理请求。在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
#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
相关文章推荐
- reactos操作系统实现(135)
- reactos操作系统实现(135)
- reactos操作系统实现(3)
- reactos操作系统实现(136)
- reactos操作系统实现(138)
- reactos操作系统实现(139)
- reactos操作系统实现(144)
- reactos操作系统实现(147)
- reactos操作系统实现(8)
- reactos操作系统实现(151)
- reactos操作系统实现(126)
- reactos操作系统实现(1)
- reactos操作系统实现(129)
- reactos操作系统实现(2)
- reactos操作系统实现(106)
- reactos操作系统实现(107)
- reactos操作系统实现(110)
- reactos操作系统实现(112)
- reactos操作系统实现(117)
- reactos操作系统实现(119)