reactos操作系统实现(139)

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

#001  static NTSTATUS

#002  FATDelEntry(

#003      IN PDEVICE_EXTENSION DeviceExt,

#004      IN PVFATFCB pFcb)

#005  {

#006      ULONG CurrentCluster = 0, NextCluster, i;

#007      PVOID Context = NULL;

#008      LARGE_INTEGER Offset;

#009      PFAT_DIR_ENTRY pDirEntry;

#010 

#011      ASSERT(pFcb);

#012      ASSERT(pFcb->parentFcb);

#013 

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

#015      DPRINT("delete entry: %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: check status */

#048          WriteCluster(DeviceExt, CurrentCluster, 0);

#049          CurrentCluster = NextCluster;

#050      }

#051      return STATUS_SUCCESS;

#052  }

posted @ 2009-11-22 11:58  ajuanabc  阅读(156)  评论(0编辑  收藏  举报