reactos操作系统实现(139)

来源:互联网 发布:淘宝中老年高腰女裤" 编辑:程序博客网 时间:2024/04/27 15:12

 当用户删除文件时,就会通过ReactOSAPI调用IO管理器函数,然后创建IRP包发送到文件系统驱动程序来,然后就调用下面函数来把文件分配的簇从FAT分配表时删除。具体实现的代码如下:

#001  static NTSTATUS

#002  FATDelEntry(

#003      IN PDEVICE_EXTENSIONDeviceExt,

#004      IN PVFATFCB pFcb)

#005  {

#006      ULONG CurrentCluster =0, NextCluster, i;

#007      PVOID Context = NULL;

#008      LARGE_INTEGER Offset;

#009      PFAT_DIR_ENTRYpDirEntry;

#010 

#011      ASSERT(pFcb);

#012     ASSERT(pFcb->parentFcb);

#013 

#014      DPRINT("delEntryPathName /'%wZ/'/n", &pFcb->PathNameU);

#015      DPRINT("deleteentry: %d to %d/n", pFcb->startIndex, pFcb->dirIndex);

 

下面开始从目录项里找到首簇开始位置。

#016      Offset.u.HighPart = 0;

#017      for (i =pFcb->startIndex; i <= pFcb->dirIndex; i++)

#018      {

#019          if (Context == NULL|| ((i * sizeof(FAT_DIR_ENTRY)) % PAGE_SIZE) == 0)

#020          {

#021              if (Context)

#022              {

#023                 CcSetDirtyPinnedData(Context, NULL);

#024                 CcUnpinData(Context);

#025              }

#026              Offset.u.LowPart= (i * sizeof(FAT_DIR_ENTRY) / PAGE_SIZE) * PAGE_SIZE;

#027              CcPinRead(pFcb->parentFcb->FileObject,&Offset, PAGE_SIZE, TRUE,

#028                       &Context, (PVOID*)&pDirEntry);

#029          }

 

把目录清除。

#030          pDirEntry[i %(PAGE_SIZE / sizeof(FAT_DIR_ENTRY))].Filename[0] = 0xe5;

 

获取需要删除的目录项。

#031          if (i ==pFcb->dirIndex)

#032          {

#033              CurrentCluster =

#034             vfatDirEntryGetFirstCluster(DeviceExt,

#035                                         (PDIR_ENTRY)&pDirEntry[i % (PAGE_SIZE / sizeof(FAT_DIR_ENTRY))]);

#036          }

#037      }

#038      if (Context)

#039      {

#040         CcSetDirtyPinnedData(Context, NULL);

#041          CcUnpinData(Context);

#042      }

#043 

 

下面开始删除所有使用的簇,也就是把FAT表上标记为0.

#044      while (CurrentCluster&& CurrentCluster != 0xffffffff)

#045      {

#046         GetNextCluster(DeviceExt, CurrentCluster, &NextCluster);

#047          /* FIXME: checkstatus */

#048         WriteCluster(DeviceExt, CurrentCluster, 0);

#049          CurrentCluster =NextCluster;

#050      }

#051      return STATUS_SUCCESS;

#052  }

原创粉丝点击