亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rw.c

?? 一個類似windows
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 * COPYRIGHT:        See COPYING in the top level directory
 * PROJECT:          ReactOS kernel
 * FILE:             drivers/fs/vfat/rw.c
 * PURPOSE:          VFAT Filesystem
 * PROGRAMMER:       Jason Filby (jasonfilby@yahoo.com)
 *
 */

/* INCLUDES *****************************************************************/

#define NDEBUG
#include "vfat.h"

/*
 * Uncomment to enable strict verification of cluster/offset pair
 * caching. If this option is enabled you lose all the benefits of
 * the caching and the read/write operations will actually be
 * slower. It's meant only for debugging!!!
 * - Filip Navara, 26/07/2004
 */
/* #define DEBUG_VERIFY_OFFSET_CACHING */

/* FUNCTIONS *****************************************************************/

NTSTATUS
NextCluster(PDEVICE_EXTENSION DeviceExt,
	    ULONG FirstCluster,
	    PULONG CurrentCluster,
	    BOOLEAN Extend)
     /*
      * Return the next cluster in a FAT chain, possibly extending the chain if
      * necessary
      */
{
 if (FirstCluster == 1)
    {
      (*CurrentCluster) += DeviceExt->FatInfo.SectorsPerCluster;
      return(STATUS_SUCCESS);
    }
  else
    {
      if (Extend)
        return GetNextClusterExtend(DeviceExt, (*CurrentCluster), CurrentCluster);
      else
        return GetNextCluster(DeviceExt, (*CurrentCluster), CurrentCluster);
    }
}

NTSTATUS
OffsetToCluster(PDEVICE_EXTENSION DeviceExt,
		ULONG FirstCluster,
		ULONG FileOffset,
		PULONG Cluster,
		BOOLEAN Extend)
     /*
      * Return the cluster corresponding to an offset within a file,
      * possibly extending the file if necessary
      */
{
  ULONG CurrentCluster;
  ULONG i;
  NTSTATUS Status;
/*
  DPRINT("OffsetToCluster(DeviceExt %x, Fcb %x, FirstCluster %x,"
         " FileOffset %x, Cluster %x, Extend %d)\n", DeviceExt,
         Fcb, FirstCluster, FileOffset, Cluster, Extend);
*/
  if (FirstCluster == 0)
  {
    DbgPrint("OffsetToCluster is called with FirstCluster = 0!\n");
    KEBUGCHECK(0);
  }

  if (FirstCluster == 1)
    {
      /* root of FAT16 or FAT12 */
      *Cluster = DeviceExt->FatInfo.rootStart + FileOffset
	/ (DeviceExt->FatInfo.BytesPerCluster) * DeviceExt->FatInfo.SectorsPerCluster;
      return(STATUS_SUCCESS);
    }
  else
    {
      CurrentCluster = FirstCluster;
      if (Extend)
        {
          for (i = 0; i < FileOffset / DeviceExt->FatInfo.BytesPerCluster; i++)
            {
              Status = GetNextClusterExtend (DeviceExt, CurrentCluster, &CurrentCluster);
              if (!NT_SUCCESS(Status))
                return(Status);
    	    }
          *Cluster = CurrentCluster;
       }
     else
        {
          for (i = 0; i < FileOffset / DeviceExt->FatInfo.BytesPerCluster; i++)
            {
              Status = GetNextCluster (DeviceExt, CurrentCluster, &CurrentCluster);
              if (!NT_SUCCESS(Status))
                return(Status);
    	    }
          *Cluster = CurrentCluster;
       }
     return(STATUS_SUCCESS);
   }
}

static NTSTATUS
VfatReadFileData (PVFAT_IRP_CONTEXT IrpContext,
                  ULONG Length,
		  LARGE_INTEGER ReadOffset,
		  PULONG LengthRead)
/*
 * FUNCTION: Reads data from a file
 */
{
  ULONG CurrentCluster;
  ULONG FirstCluster;
  ULONG StartCluster;
  ULONG ClusterCount;
  LARGE_INTEGER StartOffset;
  PDEVICE_EXTENSION DeviceExt;
  BOOLEAN First = TRUE;
  PVFATFCB Fcb;
  PVFATCCB Ccb;
  NTSTATUS Status;
  ULONG BytesDone;
  ULONG BytesPerSector;
  ULONG BytesPerCluster;
  ULONG LastCluster;
  ULONG LastOffset;

  /* PRECONDITION */
  ASSERT(IrpContext);
  DeviceExt = IrpContext->DeviceExt;
  ASSERT(DeviceExt);
  ASSERT(DeviceExt->FatInfo.BytesPerCluster);
  ASSERT(IrpContext->FileObject);
  ASSERT(IrpContext->FileObject->FsContext2 != NULL);

  DPRINT("VfatReadFileData(DeviceExt %x, FileObject %x, "
	 "Length %d, ReadOffset 0x%I64x)\n", DeviceExt,
	 IrpContext->FileObject, Length, ReadOffset.QuadPart);

  *LengthRead = 0;

  Ccb = (PVFATCCB)IrpContext->FileObject->FsContext2;
  Fcb = IrpContext->FileObject->FsContext;
  BytesPerSector = DeviceExt->FatInfo.BytesPerSector;
  BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster;

  ASSERT(ReadOffset.QuadPart + Length <= ROUND_UP(Fcb->RFCB.FileSize.QuadPart, BytesPerSector));
  ASSERT(ReadOffset.u.LowPart % BytesPerSector == 0);
  ASSERT(Length % BytesPerSector == 0);

  /* Is this a read of the FAT? */
  if (Fcb->Flags & FCB_IS_FAT)
  {
    ReadOffset.QuadPart += DeviceExt->FatInfo.FATStart * BytesPerSector;
    Status = VfatReadDiskPartial(IrpContext, &ReadOffset, Length, 0, TRUE);

    if (NT_SUCCESS(Status))
    {
      *LengthRead = Length;
    }
    else
    {
      DPRINT1("FAT reading failed, Status %x\n", Status);
    }
    return Status;
  }
  /* Is this a read of the Volume ? */
  if (Fcb->Flags & FCB_IS_VOLUME)
  {
    Status = VfatReadDiskPartial(IrpContext, &ReadOffset, Length, 0, TRUE);
    if (NT_SUCCESS(Status))
    {
      *LengthRead = Length;
    }
    else
    {
      DPRINT1("Volume reading failed, Status %x\n", Status);
    }
    return Status;
  }

  /*
   * Find the first cluster
   */
  FirstCluster = CurrentCluster =
    vfatDirEntryGetFirstCluster (DeviceExt, &Fcb->entry);

  if (FirstCluster == 1)
  {
    // Directory of FAT12/16 needs a special handling
    CHECKPOINT;
    if (ReadOffset.u.LowPart + Length > DeviceExt->FatInfo.rootDirectorySectors * BytesPerSector)
    {
      Length = DeviceExt->FatInfo.rootDirectorySectors * BytesPerSector - ReadOffset.u.LowPart;
    }
    ReadOffset.u.LowPart += DeviceExt->FatInfo.rootStart * BytesPerSector;

    // Fire up the read command

    Status = VfatReadDiskPartial (IrpContext, &ReadOffset, Length, 0, TRUE);
    if (NT_SUCCESS(Status))
    {
      *LengthRead = Length;
    }
    return Status;
  }

  ExAcquireFastMutex(&Fcb->LastMutex);
  LastCluster = Fcb->LastCluster;
  LastOffset = Fcb->LastOffset;
  ExReleaseFastMutex(&Fcb->LastMutex);

  /*
   * Find the cluster to start the read from
   */
  if (LastCluster > 0 && ReadOffset.u.LowPart >= LastOffset)
  {
    Status = OffsetToCluster(DeviceExt, LastCluster,
                             ROUND_DOWN(ReadOffset.u.LowPart, BytesPerCluster) -
                             LastOffset,
                             &CurrentCluster, FALSE);
#ifdef DEBUG_VERIFY_OFFSET_CACHING
    /* DEBUG VERIFICATION */
    {
      ULONG CorrectCluster;
      OffsetToCluster(DeviceExt, FirstCluster,
                      ROUND_DOWN(ReadOffset.u.LowPart, BytesPerCluster),
                      &CorrectCluster, FALSE);
      if (CorrectCluster != CurrentCluster)
        KEBUGCHECK(FAT_FILE_SYSTEM);
    }
#endif
  }
  else
  {
    Status = OffsetToCluster(DeviceExt, FirstCluster,
                             ROUND_DOWN(ReadOffset.u.LowPart, BytesPerCluster),
                             &CurrentCluster, FALSE);
  }
  if (!NT_SUCCESS(Status))
  {
    return(Status);
  }

  ExAcquireFastMutex(&Fcb->LastMutex);
  Fcb->LastCluster = CurrentCluster;
  Fcb->LastOffset = ROUND_DOWN (ReadOffset.u.LowPart, BytesPerCluster);
  ExReleaseFastMutex(&Fcb->LastMutex);

  KeInitializeEvent(&IrpContext->Event, NotificationEvent, FALSE);
  IrpContext->RefCount = 1;

  while (Length > 0 && CurrentCluster != 0xffffffff)
  {
    StartCluster = CurrentCluster;
    StartOffset.QuadPart = ClusterToSector(DeviceExt, StartCluster) * BytesPerSector;
    BytesDone = 0;
    ClusterCount = 0;

    do
    {
      ClusterCount++;
      if (First)
      {
        BytesDone =  min (Length, BytesPerCluster - (ReadOffset.u.LowPart % BytesPerCluster));
      	StartOffset.QuadPart += ReadOffset.u.LowPart % BytesPerCluster;
      	First = FALSE;
      }
      else
      {
      	if (Length - BytesDone > BytesPerCluster)
      	{
      	  BytesDone += BytesPerCluster;
      	}
      	else
      	{
      	  BytesDone = Length;
      	}
      }
      Status = NextCluster(DeviceExt, FirstCluster, &CurrentCluster, FALSE);
    }
    while (StartCluster + ClusterCount == CurrentCluster && NT_SUCCESS(Status) && Length > BytesDone);
    DPRINT("start %08x, next %08x, count %d\n",
           StartCluster, CurrentCluster, ClusterCount);

    ExAcquireFastMutex(&Fcb->LastMutex);
    Fcb->LastCluster = StartCluster + (ClusterCount - 1);
    Fcb->LastOffset = ROUND_DOWN(ReadOffset.u.LowPart, BytesPerCluster) + (ClusterCount - 1) * BytesPerCluster;
    ExReleaseFastMutex(&Fcb->LastMutex);

    // Fire up the read command
    Status = VfatReadDiskPartial (IrpContext, &StartOffset, BytesDone, *LengthRead, FALSE);
    if (!NT_SUCCESS(Status) && Status != STATUS_PENDING)
      {
        break;
      }
    *LengthRead += BytesDone;
    Length -= BytesDone;
    ReadOffset.u.LowPart += BytesDone;
  }
  if (0 != InterlockedDecrement((PLONG)&IrpContext->RefCount))
    {
      KeWaitForSingleObject(&IrpContext->Event, Executive, KernelMode, FALSE, NULL);
    }
  if (NT_SUCCESS(Status) || Status == STATUS_PENDING)
    {
      if (Length > 0)
        {
	  Status = STATUS_UNSUCCESSFUL;
	}
      else
        {
          Status = IrpContext->Irp->IoStatus.Status;
	}
    }
  return Status;
}

static NTSTATUS
VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext,
		  ULONG Length,
		  LARGE_INTEGER WriteOffset)
{
   PDEVICE_EXTENSION DeviceExt;
   PVFATFCB Fcb;
   PVFATCCB Ccb;
   ULONG Count;
   ULONG FirstCluster;
   ULONG CurrentCluster;
   ULONG BytesDone;
   ULONG StartCluster;
   ULONG ClusterCount;
   NTSTATUS Status = STATUS_SUCCESS;
   BOOLEAN First = TRUE;
   ULONG BytesPerSector;
   ULONG BytesPerCluster;
   LARGE_INTEGER StartOffset;
   ULONG BufferOffset;
   ULONG LastCluster;
   ULONG LastOffset;

   /* PRECONDITION */
   ASSERT(IrpContext);
   DeviceExt = IrpContext->DeviceExt;
   ASSERT(DeviceExt);
   ASSERT(DeviceExt->FatInfo.BytesPerCluster);
   ASSERT(IrpContext->FileObject);
   ASSERT(IrpContext->FileObject->FsContext2 != NULL);

   Ccb = (PVFATCCB)IrpContext->FileObject->FsContext2;
   Fcb = IrpContext->FileObject->FsContext;
   BytesPerCluster = DeviceExt->FatInfo.BytesPerCluster;
   BytesPerSector = DeviceExt->FatInfo.BytesPerSector;

   DPRINT("VfatWriteFileData(DeviceExt %x, FileObject %x, "
	  "Length %d, WriteOffset 0x%I64x), '%wZ'\n", DeviceExt,
	  IrpContext->FileObject, Length, WriteOffset,
	  &Fcb->PathNameU);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91国偷自产一区二区三区观看 | 中文字幕一区av| 在线观看亚洲精品视频| 国产一区二区三区在线看麻豆| 亚洲欧美日韩久久| 精品日韩欧美在线| 欧美丝袜丝nylons| 国产福利电影一区二区三区| 婷婷久久综合九色国产成人| 中文字幕乱码日本亚洲一区二区| 欧美日韩国产大片| 99国产欧美另类久久久精品| 久久se这里有精品| 亚洲午夜在线电影| 亚洲欧洲精品成人久久奇米网| 日韩精品中午字幕| 欧美精品在线视频| 91丨九色porny丨蝌蚪| 激情久久五月天| 五月婷婷久久综合| 亚洲精品欧美综合四区| 中文字幕不卡在线| 久久尤物电影视频在线观看| 日韩一区二区在线看| 在线免费精品视频| 一本大道av一区二区在线播放| 福利电影一区二区| 精品在线一区二区三区| 日韩—二三区免费观看av| 亚洲国产精品综合小说图片区| 亚洲视频中文字幕| 中文字幕一区二区三区乱码在线 | 夜夜嗨av一区二区三区网页 | 在线免费观看日本一区| 99国产精品国产精品久久| 成人app网站| 不卡的av网站| 91小视频在线观看| 91免费观看国产| 97久久精品人人澡人人爽| av一区二区三区在线| 99久久亚洲一区二区三区青草| a4yy欧美一区二区三区| 不卡一卡二卡三乱码免费网站| 国产 欧美在线| 不卡的电影网站| 欧美日韩高清一区二区三区| 在线视频一区二区三| 欧美视频在线播放| 欧美亚洲一区二区在线观看| 欧美性做爰猛烈叫床潮| 欧美精品18+| 日韩欧美高清一区| 久久久久一区二区三区四区| 国产欧美日本一区视频| 亚洲天堂av一区| 一区二区三区91| 奇米四色…亚洲| 国产精品羞羞答答xxdd| av不卡一区二区三区| 欧美色精品在线视频| 91精品婷婷国产综合久久性色 | 久久国产精品99久久久久久老狼| 国产一二精品视频| 99国产欧美另类久久久精品| 欧美视频日韩视频| 欧美不卡视频一区| 国产精品全国免费观看高清| 亚洲免费观看在线视频| 天天色图综合网| 国产精品一区二区在线观看不卡| av成人动漫在线观看| 欧美乱妇23p| 久久精品免视看| 亚洲精品欧美专区| 美女被吸乳得到大胸91| fc2成人免费人成在线观看播放| 91国在线观看| 久久免费电影网| 夜夜嗨av一区二区三区| 麻豆91小视频| 色综合网色综合| 日韩一区二区三区观看| 国产精品乱码一区二区三区软件 | 国产精品网曝门| 亚洲国产精品人人做人人爽| 精品午夜一区二区三区在线观看| av影院午夜一区| 日韩精品一区二区三区蜜臀 | 成人黄动漫网站免费app| 欧美日本在线观看| 中文av一区特黄| 日韩制服丝袜av| 成人精品在线视频观看| 宅男噜噜噜66一区二区66| 国产精品久久久久影视| 麻豆精品国产传媒mv男同| 色一情一乱一乱一91av| 久久女同精品一区二区| 亚洲777理论| 97精品久久久久中文字幕| 日韩一级片在线观看| 亚洲欧美日韩国产手机在线| 国产在线不卡视频| 欧美巨大另类极品videosbest| 中文字幕+乱码+中文字幕一区| 视频一区二区中文字幕| 91在线视频免费观看| 久久久国产午夜精品| 日韩精品一卡二卡三卡四卡无卡| 99久久伊人精品| 日本一区二区动态图| 经典一区二区三区| 91精品视频网| 天堂va蜜桃一区二区三区| 色丁香久综合在线久综合在线观看| 久久久亚洲精品石原莉奈| 蜜桃视频在线观看一区| 欧美三级日韩三级| 亚洲精品视频一区| 一本色道久久综合亚洲精品按摩 | 亚洲老司机在线| 成人动漫一区二区| 久久精品日韩一区二区三区| 黄色精品一二区| 欧美不卡视频一区| 蜜桃视频一区二区三区在线观看| 欧美片网站yy| 亚洲大片一区二区三区| 91成人免费在线视频| 尤物av一区二区| 欧美三日本三级三级在线播放| 亚洲欧美激情插| 在线视频一区二区三| 亚洲制服丝袜在线| 欧美日本一区二区| 日本大胆欧美人术艺术动态| 欧美酷刑日本凌虐凌虐| 日韩精品乱码免费| 欧美一区午夜视频在线观看| 美腿丝袜亚洲综合| 精品裸体舞一区二区三区| 国产一区二区美女| 亚洲国产经典视频| 99精品视频一区二区| 亚洲精品国产一区二区三区四区在线| 91免费视频网址| 亚洲国产日产av| 日韩美女视频一区二区在线观看| 狠狠网亚洲精品| 欧美激情资源网| 99国产精品久久久久久久久久 | 菠萝蜜视频在线观看一区| 国产精品久久久久久久久动漫| 麻豆国产欧美日韩综合精品二区 | 韩国毛片一区二区三区| 久久精品这里都是精品| 国产成人高清视频| 日本一区二区三区在线观看| 成人h动漫精品| 亚洲一区在线播放| 欧美午夜精品久久久久久孕妇| 亚洲午夜免费视频| 欧美在线不卡一区| 另类欧美日韩国产在线| 久久婷婷国产综合精品青草| 国产91丝袜在线播放九色| 精品国产乱码久久久久久图片| 成人国产视频在线观看| 亚洲男人的天堂一区二区| 欧美在线观看视频一区二区| 午夜视频在线观看一区二区| 久久久蜜桃精品| 99国产精品久久久久| 午夜精品福利在线| 欧美日韩精品电影| 美女一区二区三区在线观看| 精品国产伦理网| 91网站最新地址| 美女精品自拍一二三四| 国产日产欧美一区| 91一区在线观看| 日韩av中文在线观看| 成人免费在线视频| 欧美色综合天天久久综合精品| 老司机精品视频一区二区三区| 26uuu欧美| 欧美三级韩国三级日本三斤| 日本午夜一本久久久综合| 国产亚洲精品aa| 国产精品一区二区久久不卡| 亚洲高清三级视频| 久久亚洲一区二区三区明星换脸 | 国产成人综合亚洲91猫咪| 亚洲欧美电影院| 欧美一级生活片| 成人av在线观| 国产自产2019最新不卡| 亚洲另类春色国产| 精品久久国产字幕高潮|