reactos操作系统实现(123)

 目前,Reactos主要使用FAT的文件系统,因此下面就先来分析这个文件系统,以便了解这个文件系统的功能。这个文件系统的实现是在驱动程序FASTFAT.SYS里实现的,所以来分析这个驱动程序的源码,就可以了解FAT文件系统了。

 

6.2.1 FAT文件系统驱动程序入口函数

FAT的文件系统是当作一个驱动程序来加载到系统里,因此它也有驱动程序的形式了,也就是它的入口点函数,还是DriverEntry函数,它的实现代码如下:

#001  NTSTATUS NTAPI

#002  DriverEntry(PDRIVER_OBJECT DriverObject,

#003         PUNICODE_STRING RegistryPath)

#004  /*

#005   * FUNCTION: Called by the system to initialize the driver

#006   * ARGUMENTS:

#007   *           DriverObject = object describing this driver

#008   *           RegistryPath = path to our configuration entries

#009   * RETURNS: Success or failure

#010   */

#011  {

#012     PDEVICE_OBJECT DeviceObject;

 

FAT作为设备名称。

#013     UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"//Fat");

#014     NTSTATUS Status;

#015 

 

创建文件系统设备对象。

#016     Status = IoCreateDevice(DriverObject,

#017                sizeof(VFAT_GLOBAL_DATA),

#018                &DeviceName,

#019                FILE_DEVICE_DISK_FILE_SYSTEM,

#020                0,

#021                FALSE,

#022                &DeviceObject);

#023 

 

如果创建这个设备名称已经存在,就使用RosFat的名称来创建设备。

#024     if (Status == STATUS_OBJECT_NAME_EXISTS ||

#025         Status == STATUS_OBJECT_NAME_COLLISION)

#026       {

#027         /* Try an other name, if 'Fat' is already in use. 'Fat' is also used by fastfat.sys on W2K */

#028         RtlInitUnicodeString(&DeviceName, L"//RosFat");

#029         Status = IoCreateDevice(DriverObject,

#030                                 sizeof(VFAT_GLOBAL_DATA),

#031                                 &DeviceName,

#032                                 FILE_DEVICE_DISK_FILE_SYSTEM,

#033                                 0,

#034                                 FALSE,

#035                                 &DeviceObject);

#036       }

#037 

#038 

#039 

#040     if (!NT_SUCCESS(Status))

#041       {

#042         return (Status);

#043       }

#044 

 

获取FAT全局数据区的指针。

#045     VfatGlobalData = DeviceObject->DeviceExtension;

 

清空FAT全局数据区。

#046     RtlZeroMemory (VfatGlobalData, sizeof(VFAT_GLOBAL_DATA));

#047     VfatGlobalData->DriverObject = DriverObject;

#048     VfatGlobalData->DeviceObject = DeviceObject;

#049 

 

设置设备是直接访问IO的方式。

#050     DeviceObject->Flags |= DO_DIRECT_IO;

 

设置驱动程序的IRP消息处理函数。

#051     DriverObject->MajorFunction[IRP_MJ_CLOSE] = VfatBuildRequest;

#052     DriverObject->MajorFunction[IRP_MJ_CREATE] = VfatBuildRequest;

#053     DriverObject->MajorFunction[IRP_MJ_READ] = VfatBuildRequest;

#054     DriverObject->MajorFunction[IRP_MJ_WRITE] = VfatBuildRequest;

#055     DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = VfatBuildRequest;

#056     DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = VfatBuildRequest;

#057     DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = VfatBuildRequest;

#058     DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = VfatBuildRequest;

#059     DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION] =

#060       VfatBuildRequest;

#061     DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION] =

#062       VfatBuildRequest;

#063     DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = VfatShutdown;

#064     DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] = VfatBuildRequest;

#065     DriverObject->MajorFunction[IRP_MJ_CLEANUP] = VfatBuildRequest;

#066     DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = VfatBuildRequest;

#067 

#068     DriverObject->DriverUnload = NULL;

#069 

 

缓存管理函数。

#070     /* Cache manager */

#071     VfatGlobalData->CacheMgrCallbacks.AcquireForLazyWrite = VfatAcquireForLazyWrite;

#072     VfatGlobalData->CacheMgrCallbacks.ReleaseFromLazyWrite = VfatReleaseFromLazyWrite;

#073     VfatGlobalData->CacheMgrCallbacks.AcquireForReadAhead = VfatAcquireForReadAhead;

#074     VfatGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead = VfatReleaseFromReadAhead;

#075 

 

快速的I/O操作函数。

#076     /* Fast I/O */

#077     VfatInitFastIoRoutines(&VfatGlobalData->FastIoDispatch);

#078     DriverObject->FastIoDispatch = &VfatGlobalData->FastIoDispatch;

#079 

 

后备列表,以便提高速度。

#080     /* Private lists */

#081     ExInitializeNPagedLookasideList(&VfatGlobalData->FcbLookasideList,

#082                                     NULL, NULL, 0, sizeof(VFATFCB), TAG_FCB, 0);

#083     ExInitializeNPagedLookasideList(&VfatGlobalData->CcbLookasideList,

#084                                     NULL, NULL, 0, sizeof(VFATCCB), TAG_CCB, 0);

#085     ExInitializeNPagedLookasideList(&VfatGlobalData->IrpContextLookasideList,

#086                                     NULL, NULL, 0, sizeof(VFAT_IRP_CONTEXT), TAG_IRP, 0);

#087 

 

初始化资源列表。

#088     ExInitializeResourceLite(&VfatGlobalData->VolumeListLock);

#089     InitializeListHead(&VfatGlobalData->VolumeListHead);

 

注册文件系统到系统列表里。

#090     IoRegisterFileSystem(DeviceObject);

#091     return(STATUS_SUCCESS);

#092  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值