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

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,sizeof(VFATFCB),TAG_FCB,0);

#083 ExInitializeNPagedLookasideList(&VfatglobalData->CcbLookasideList,

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

#085 ExInitializeNPagedLookasideList(&VfatglobalData->IrpContextLookasideList,

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

#087

初始化资源列表。

#088 ExInitializeResourceLite(&VfatglobalData->VolumeListLock);

#089 InitializeListHead(&VfatglobalData->VolumeListHead);

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

#090 IoRegisterFileSystem(DeviceObject);

#091 return(STATUS_SUCCESS);

#092}

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

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

相关推荐