reactos操作系统实现(130)

 vfatMakeRootFCB函数是用来创建FAT文件系统的根目录,实现代码如下:

#001  PVFATFCB

#002  vfatMakeRootFCB(PDEVICE_EXTENSION  pVCB)

#003  {

#004     PVFATFCB  FCB;

#005     ULONG FirstCluster, CurrentCluster, Size = 0;

#006     NTSTATUS Status = STATUS_SUCCESS;

 

设置根目录名称。

#007     UNICODE_STRING NameU = RTL_CONSTANT_STRING(L"//");

#008 

 

根据文件名称创建一块文件控制块。

#009     FCB = vfatNewFCB(pVCB, &NameU);

#010     if (FCB->Flags & FCB_IS_FATX_ENTRY)

#011     {

 

如果扩展的FAT入口,就进行相应的扩展的FAT属性设置。

#012         memset(FCB->entry.FatX.Filename, ' ', 42);

 

设置FAT最大的文件大小。

#013         FCB->entry.FatX.FileSize = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;

 

设置当前控制块为目录属性。

#014         FCB->entry.FatX.Attrib = FILE_ATTRIBUTE_DIRECTORY;

 

设置为第一簇。

#015         FCB->entry.FatX.FirstCluster = 1;

#016         Size = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;

#017     }

#018     else

#019     {

 

设置FAT的属性。

#020         memset(FCB->entry.Fat.ShortName, ' ', 11);

#021         FCB->entry.Fat.FileSize = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;

#022         FCB->entry.Fat.Attrib = FILE_ATTRIBUTE_DIRECTORY;

 

设置FAT32支持的目录属性。

#023         if (pVCB->FatInfo.FatType == FAT32)

#024         {

#025             CurrentCluster = FirstCluster = pVCB->FatInfo.RootCluster;

#026             FCB->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0xffff);

#027             FCB->entry.Fat.FirstClusterHigh = (unsigned short)(FirstCluster >> 16);

#028 

#029             while (CurrentCluster != 0xffffffff && NT_SUCCESS(Status))

#030             {

#031                 Size += pVCB->FatInfo.BytesPerCluster;

#032                 Status = NextCluster (pVCB, FirstCluster, &CurrentCluster, FALSE);

#033             }

#034         }

#035         else

#036         {

 

设置FAT16FAT12的属性。

#037             FCB->entry.Fat.FirstCluster = 1;

#038             Size = pVCB->FatInfo.rootDirectorySectors * pVCB->FatInfo.BytesPerSector;

#039         }

#040     }

#041     FCB->ShortHash.Hash = FCB->Hash.Hash;

#042     FCB->RefCount = 2;

#043     FCB->dirIndex = 0;

#044     FCB->RFCB.FileSize.QuadPart = Size;

#045     FCB->RFCB.ValidDataLength.QuadPart = Size;

#046     FCB->RFCB.AllocationSize.QuadPart = Size;

#047     FCB->RFCB.IsFastIoPossible = FastIoIsNotPossible;

#048 

 

为文件控制块创建缓存。

#049     vfatFCBInitializeCacheFromVolume(pVCB, FCB);

 

把文件控制块添加HASH表里,以便加速访问。

#050     vfatAddFCBToTable(pVCB, FCB);

#051 

#052     return(FCB);

#053  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

caimouse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值