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

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

?? volume.c

?? FAT文件系統源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// This source code is licensed under Microsoft Shared Source License
// Version 1.0 for Windows CE.
// For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223.
//
/*++


Module Name:

    volume.c

Abstract:

    This file contains routines for mounting volumes, direct volume access, etc.

Revision History:

--*/

#include "fatfs.h"

// Warning if you change this then change storemgr.h
static const GUID FATFS_MOUNT_GUID = { 0x169e1941, 0x4ce, 0x4690, { 0x97, 0xac, 0x77, 0x61, 0x87, 0xeb, 0x67, 0xcc } };

#if defined(UNDER_WIN95) && !defined(INCLUDE_FATFS)
#include <pcmd.h>               // for interacting with ReadVolume/WriteVolume
#endif


ERRFALSE(offsetof(BOOTSEC, bsBPB) == offsetof(BIGFATBOOTSEC, bgbsBPB));


/*  ReadVolume
 *
 *  Like ReadWriteDisk, except it takes a PVOLUME, and it works with
 *  volume-relative BLOCKS instead of disk-relative SECTORS.
 *
 *  For now, the caller must specify a block number that starts on a sector
 *  boundary, and the number of blocks must map to a whole number of sectors.
 *
 *  Entry:
 *      pvol        address of VOLUME structure
 *      block       0-based block number
 *      cBlocks     number of blocks to read
 *      pvBuffer    address of buffer to read sectors into
 *
 *  Exit:
 *      ERROR_SUCCESS if successful, else GetLastError() from the FSDMGR_DiskIoControl call issued
 */         

DWORD ReadVolume(PVOLUME pvol, DWORD block, int cBlocks, PVOID pvBuffer)
{
#ifdef UNDER_WIN95
    if (ZONE_BUFFERS && ZONE_PROMPTS) {
        WCHAR wsBuf[10];
        DBGPRINTFW(TEXTW("Read:  block %d, total %d;  allow (Y/N)? "), block, cBlocks);
        DBGSCANFW(wsBuf, ARRAYSIZE(wsBuf));
        if (TOLOWER(wsBuf[0]) == 'n')
            return ERROR_BAD_UNIT;
    }
#endif

    // Assert that the shifted bits in both block and cBlocks are zero

    ASSERT(pvol->v_log2cblkSec<=0? 1 : (((block | cBlocks) & ((1 << pvol->v_log2cblkSec) - 1)) == 0));

    if (pvol->v_flags & VOLF_FROZEN) {
        DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!ReadVolume: frozen volume, cannot read block %d!\r\n"), block));
        return ERROR_DEV_NOT_EXIST;
    }

    // NOTE that all sectors computed in this function are relative to
    // block 0, and that before they are passed to ReadWriteDisk, they are
    // adjusted by v_secBlkBias (the sector bias for block 0).  Thus, it is
    // impossible for this function to read from any of the volume's reserved
    // sectors (eg, the boot sector and BPB) or hidden sectors, because they
    // precede block 0.
    //
    // See the code in IOCTL_DISK_READ_SECTORS and IOCTL_DISK_WRITE_SECTORS
    // to access sectors outside the normal block range.

    return ReadWriteDisk(pvol, pvol->v_pdsk->d_hdsk, READ_DISK_CMD, &pvol->v_pdsk->d_diActive, 
        pvol->v_secBlkBias + (block>>pvol->v_log2cblkSec), (cBlocks>>pvol->v_log2cblkSec), pvBuffer, TRUE);
}


/*  WriteVolume
 *
 *  Like ReadWriteDisk, except it takes a PVOLUME, and it works with
 *  volume-relative BLOCKS instead of disk-relative SECTORS.
 *
 *  For now, the caller must specify a block number that starts on a sector
 *  boundary, and the number of blocks must map to a whole number of sectors.
 *
 *  Entry:
 *      pvol        address of VOLUME structure
 *      block       0-based block number
 *      cBlocks     number of blocks to write
 *      pvBuffer    address of buffer to write sectors from
 *
 *  Exit:
 *      ERROR_SUCCESS if successful, else GetLastError() from the FSDMGR_DiskIoControl call issued
 */         
// 將傳入的內容通過調用函數ReadWriteDisk 寫到磁盤中去
DWORD WriteVolume(PVOLUME pvol, DWORD block, int cBlocks, PVOID pvBuffer, BOOL fWriteThrough)
{
    DWORD sec, csec;

#ifdef UNDER_WIN95
    if (ZONE_BUFFERS && ZONE_PROMPTS) {
        WCHAR wsBuf[10];
        DBGPRINTFW(TEXTW("Write: block %d, total %d;  allow (Y/N)? "), block, cBlocks);
        DBGSCANFW(wsBuf, ARRAYSIZE(wsBuf));
        if (TOLOWER(wsBuf[0]) == 'n')
            return ERROR_BAD_UNIT;
    }
#endif

    // Assert that the shifted bits in both block and cBlocks are zero
    // 如果括號中的條件為假,則程序終止并輸出位置信息
    ASSERT(pvol->v_log2cblkSec<=0? 1 : (((block | cBlocks) & ((1 << pvol->v_log2cblkSec) - 1)) == 0));

    if (pvol->v_flags & VOLF_FROZEN) {
        DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!WriteVolume: frozen volume, cannot write block %d!\r\n"), block));
        return ERROR_DEV_NOT_EXIST;
    }

    // NOTE that all sectors computed in this function are relative to
    // block 0, and that before they are passed to ReadWriteDisk, they are
    // adjusted by v_secBlkBias (the sector bias for block 0).  Thus, it is
    // impossible for this function to write to any of the volume's reserved
    // sectors (eg, the boot sector and BPB) or hidden sectors, because they
    // precede block 0.
    //
    // See the code in IOCTL_DISK_READ_SECTORS and IOCTL_DISK_WRITE_SECTORS
    // to access sectors outside the normal block range.
    // 計算sector的個數
    sec = block >> pvol->v_log2cblkSec;
    csec = cBlocks >> pvol->v_log2cblkSec;

    // If we have multiple FATs, and we're writing to the FAT region,
    // adjust and/or mirror the write appropriately.

#ifdef TFAT   //  no backup FAT support on TFAT
    if (!pvol->v_fTfat)
#endif
    {
        if ((pvol->v_flags & VOLF_BACKUP_FAT) && sec < pvol->v_secEndAllFATs) {
            DWORD secEnd, secBackup;

            secEnd = sec + csec;

            // Check for write to root directory area that starts inside
            // a backup FAT.  Backup FATs are not buffered, hence any buffered
            // data inside the range of the backup FAT could be stale and
            // must NOT be written.

            if (sec >= pvol->v_secEndFAT) {
                ASSERT(secEnd > pvol->v_secEndAllFATs);
                csec = secEnd - pvol->v_secEndAllFATs;
                sec = pvol->v_secEndAllFATs;
                goto write;
            }

            // Check for write to end of the active FAT that ends inside
            // a backup FAT.  Backup FATs are not buffered, hence any buffered
            // data inside the range of the backup FAT could be stale and
            // must NOT be written.

            secBackup = sec;

            if (secEnd > pvol->v_secEndFAT) {

                DWORD csecFATWrite;

                csecFATWrite = pvol->v_secEndFAT - sec;
                //帶書寫的內容位于包括了對fat2的操作
                if (secEnd < pvol->v_secEndAllFATs) {
                    csec = csecFATWrite;
                }
                else {
                    //待寫入的內容既包括了fat表,又包括了data的區域數據
                    DWORD cbFATWrite;
                    PBYTE pFAT, pFATBackup;

                    // The current buffer spans all the FATs, so we need to
                    // copy the FAT data to the backup FAT location(s) instead of
                    // doing extra writes.

                    pFAT = (PBYTE)pvBuffer;
                    pFATBackup = pFAT + (pvol->v_csecFAT << pvol->v_log2cbSec);
                    cbFATWrite = (csecFATWrite << pvol->v_log2cbSec);     
                    //fat表的操作是以sector為單位的
                    while ((secBackup += pvol->v_csecFAT) < pvol->v_secEndAllFATs) {
                        memcpy(pFATBackup, pFAT, cbFATWrite);
                        pFATBackup += pvol->v_csecFAT << pvol->v_log2cbSec;
                    }
                    goto write;
                }
            }

            // If we're still here, we've got a FAT write that's been restricted
            // to the just the sectors within the active FAT.  Start cycling through
            // the backup FATs now.   
            while ((secBackup += pvol->v_csecFAT) < pvol->v_secEndAllFATs) {

                DEBUGMSG(ZONE_FATIO,(DBGTEXT("FATFS!WriteVolume: mirroring %d FAT sectors at %d to %d\r\n"), csec, sec, secBackup));

                ASSERT(secBackup + csec <= pvol->v_secEndAllFATs);

                // We ignore any error here, on the assumption that perhaps the
                // backup FAT has simply gone bad.
                // warning
                // warning
                // warning
                // warning
                // warning
                // warning
                // warning
                // warning
                // warning
                // warning
                ReadWriteDisk(pvol, pvol->v_pdsk->d_hdsk, WRITE_DISK_CMD, &pvol->v_pdsk->d_diActive, 
                    pvol->v_secBlkBias + secBackup, csec, pvBuffer, TRUE);
            }
        }
    }
  write:

    // TEST_BREAK
    PWR_BREAK_NOTIFY(51);
    
    return ReadWriteDisk(pvol, pvol->v_pdsk->d_hdsk, fWriteThrough ? WRITETHROUGH_DISK_CMD : WRITE_DISK_CMD, 
        &pvol->v_pdsk->d_diActive, pvol->v_secBlkBias + sec, csec, pvBuffer, TRUE);        
}


/*  InitVolume - Initialize a VOLUME structure
 *
 *  ENTRY
 *      pvol - pointer to VOLUME
 *      pbgbs - pointer to PBR (partition boot record) for volume
 *
 *  EXIT
 *      TRUE if VOLUME structure successfully initialized, FALSE if not
 */

BOOL InitVolume(PVOLUME pvol, PBIGFATBOOTSEC pbgbs)
{
    DWORD cmaxClus;
    PBIGFATBPB pbpb;
    PDSTREAM pstmFAT;
    PDSTREAM pstmRoot;

    ASSERT(OWNCRITICALSECTION(&pvol->v_cs));

    //清除volume的相關標記位
    pvol->v_flags &= ~(VOLF_INVALID | VOLF_12BIT_FAT | VOLF_16BIT_FAT | VOLF_32BIT_FAT | VOLF_BACKUP_FAT);

    // Initialize the cache IDs
    // 清楚fatcache和datacache的相關標記
    pvol->v_FATCacheId = INVALID_CACHE_ID;
    pvol->v_DataCacheId = INVALID_CACHE_ID;


#ifdef TFAT

    pvol->v_fTfat = FALSE;
    if ((memcmp(pbgbs->bgbsFileSysType, "TFAT", 4) == 0) ||
         (memcmp(((PBOOTSEC)pbgbs)->bsFileSysType, "TFAT", 4) == 0) ||
         ((pvol->v_flFATFS & FATFS_FORCE_TFAT) && (pbgbs->bgbsBPB.oldBPB.BPB_NumberOfFATs == 2 ||
         pbgbs->bgbsBPB.oldBPB.BPB_NumberOfFATs == 0)))
    {
        pvol->v_fTfat = TRUE;

        if (pbgbs->bgbsBPB.oldBPB.BPB_NumberOfFATs == 0)
        {
            // Last transacation was not done yet, we will sync FAT later. For now, change NOF back in order 
            // to init the volume properly
            pbgbs->bgbsBPB.oldBPB.BPB_NumberOfFATs = 2;
        }        
    }
    
#endif
    //為pvol的buffer建立一個事件,可能后續會用來進行同步之類的
    //根據注冊表項中buffersize的值進行buffer的分配并建立鏈表
    if (!BufInit (pvol) || !AllocBufferPool(pvol))
        return FALSE;

    // Allocate special DSTREAMs for the FAT and the root directory,
    // using PSEUDO cluster numbers 0 and 1.  Root directories of FAT32
    // volumes do have a REAL cluster number, and if we're in a nested init
    // path, we need to use it, but otherwise we'll just use ROOT_PSEUDO_CLUSTER
    // and record the real cluster number when we figure it out, in the
    // FAT32-specific code farther down...

    pstmFAT = OpenStream(pvol, FAT_PSEUDO_CLUSTER, NULL, NULL, NULL, OPENSTREAM_CREATE);
    ASSERT(pvol->v_pstmFAT == NULL || pvol->v_pstmFAT == pstmFAT);

    pstmRoot = OpenStream(pvol, pvol->v_pstmRoot? pvol->v_pstmRoot->s_clusFirst : ROOT_PSEUDO_CLUSTER, NULL, NULL, NULL, OPENSTREAM_CREATE);

    ASSERT(pvol->v_pstmRoot == NULL || pvol->v_pstmRoot == pstmRoot);

    if (!pstmFAT || !pstmRoot)
        goto exit;

    // Add extra refs to these special streams to make them stick around;
    // we only want to do this if the current open is their only reference,
    // because if they've been resurrected, then they still have their original
    // extra refs.

    if (pstmFAT->s_refs == 1) {
        pstmFAT->s_refs++;
    }

    if (pstmRoot->s_refs == 1) {
        pstmRoot->s_refs++;
    }

    pvol->v_pstmFAT = pstmFAT;
    pvol->v_pstmRoot = pstmRoot;
    // 文件屬性單元
    pstmRoot->s_attr = ATTR_DIRECTORY;

    // We have completed the required stream initialization for this
    // volume.  Now perform boot sector verification and BPB validation.
    // 上面完成了fatstream和rootstream的初始化工作,接下來將對bootsec和bpb單元進行處理
    if (pvol->v_pdsk->d_diActive.di_flags & DISK_INFO_FLAG_UNFORMATTED) {
        RETAILMSG(TRUE,(DBGTEXT("FATFS!InitVolume: driver has set 'unformatted' bit, marking volume invalid\r\n")));
        pvol->v_flags |= VOLF_INVALID;
    }
   
    if (!(pvol->v_flags & VOLF_INVALID)) 
    {
        // 驗證bootsector  初始化跳轉指令單元
        if (pbgbs->bgbsJump[0] != BSNOP     &&
            pbgbs->bgbsJump[0] != BS2BYTJMP &&
            pbgbs->bgbsJump[0] != BS3BYTJMP) 
        {
            RETAILMSG(TRUE,(DBGTEXT("FATFS!InitVolume: sector 0 byte 0 suspicious (0x%x)\r\n"), pbgbs->bgbsJump[0]));
        }
        // 對bpb的相關屬性進行驗證,即BytesPerSector,BPB_NumberOfFATs,BPB_NumberOfFATs以及BPB結束標志
        if (pbgbs->bgbsBPB.oldBPB.BPB_BytesPerSector < DEFAULT_SECTOR_SIZE ||
            Log2(pbgbs->bgbsBPB.oldBPB.BPB_BytesPerSector) == -1 ||
            pbgbs->bgbsBPB.oldBPB.BPB_NumberOfFATs < 1 ||
            *(PWORD)((PBYTE)pbgbs+DEFAULT_SECTOR_SIZE-2) != BOOTSECTRAILSIGH) {
            DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!InitVolume: invalid BPB, volume deemed invalid\r\n")));
            pvol->v_flags |= VOLF_INVALID;
        }        

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲国产怡红院影院| 亚洲欧洲99久久| 中国色在线观看另类| 亚洲曰韩产成在线| 国产一区二区三区免费观看| 97国产精品videossex| 欧美成人一区二区三区| 一区二区三区在线看| 国产成人夜色高潮福利影视| 91国在线观看| 国产精品免费丝袜| 久久99精品久久久| 欧美久久一二区| √…a在线天堂一区| 国产一区二区电影| 欧美一级二级三级乱码| 亚洲一区二区三区激情| 99久久精品免费看国产 | 久久综合色婷婷| 亚洲一级不卡视频| 99久免费精品视频在线观看| www日韩大片| 免费美女久久99| 在线成人免费观看| 亚洲一区二区欧美日韩| 色8久久人人97超碰香蕉987| 中文天堂在线一区| 国产精品一区二区免费不卡| 日韩欧美一二区| 日韩av一区二区三区四区| 欧美性猛交xxxx乱大交退制版| 国产精品伦理在线| 成人免费精品视频| 国产清纯白嫩初高生在线观看91| 久久国产精品72免费观看| 日韩欧美一区电影| 蜜桃视频在线一区| 日韩视频中午一区| 乱中年女人伦av一区二区| 欧美一级一级性生活免费录像| 亚洲va韩国va欧美va| 欧美少妇一区二区| 视频一区国产视频| 日韩欧美国产午夜精品| 精品亚洲成a人在线观看| 久久香蕉国产线看观看99| 国产一区在线精品| 国产午夜亚洲精品午夜鲁丝片| 国产福利一区二区| 国产精品欧美经典| 色婷婷激情一区二区三区| 亚洲自拍欧美精品| 91精品福利在线一区二区三区| 久久精品99久久久| 欧美国产在线观看| 色噜噜偷拍精品综合在线| 亚洲国产精品嫩草影院| 欧美精品在线观看播放| 国产一区二区调教| 亚洲视频1区2区| 欧美日韩一区二区三区四区| 日韩主播视频在线| 国产欧美一区二区精品性色| www.欧美.com| 午夜电影久久久| 久久久久高清精品| 色域天天综合网| 蜜臀99久久精品久久久久久软件| 久久久噜噜噜久久中文字幕色伊伊| 不卡一区二区在线| 婷婷中文字幕一区三区| 久久这里只有精品视频网| av一区二区三区四区| 肉肉av福利一精品导航| 中文字幕巨乱亚洲| 91精品欧美一区二区三区综合在 | 国内偷窥港台综合视频在线播放| 欧美激情中文字幕一区二区| 欧美日韩在线播放| 福利一区二区在线| 国产大陆亚洲精品国产| 亚洲精品视频一区二区| 2020国产成人综合网| 在线视频一区二区三区| 国产精品一区专区| 亚洲va中文字幕| 中文字幕在线播放不卡一区| 日韩欧美的一区| 欧洲精品视频在线观看| 成人高清视频免费观看| 美女尤物国产一区| 亚洲风情在线资源站| 中文字幕一区二区三区在线播放 | 久久久久久久久一| 欧美一区二区在线免费播放| 一本久道中文字幕精品亚洲嫩| 激情图片小说一区| 日本中文字幕一区二区有限公司| 亚洲四区在线观看| 国产精品美女久久久久久2018 | 日产精品久久久久久久性色| 亚洲精品欧美综合四区| 欧美激情艳妇裸体舞| 久久综合色婷婷| 精品国产乱码久久久久久夜甘婷婷| 欧美亚洲综合色| 99九九99九九九视频精品| 丁香桃色午夜亚洲一区二区三区| 免费成人深夜小野草| 日韩电影一区二区三区四区| 亚洲妇女屁股眼交7| 有码一区二区三区| 伊人色综合久久天天人手人婷| 国产精品国产三级国产aⅴ中文| 久久久精品2019中文字幕之3| 日韩欧美在线不卡| 欧美哺乳videos| 欧美xxxx在线观看| 亚洲精品一区二区三区精华液| 欧美一区二区三区成人| 日韩免费成人网| 精品日韩在线一区| 久久久久久久网| 日本一二三四高清不卡| 国产精品另类一区| 亚洲三级电影全部在线观看高清| 亚洲视频免费观看| 亚洲精品美腿丝袜| 亚洲成人中文在线| 日一区二区三区| 国模大尺度一区二区三区| 国产一区二区三区综合| 成人av手机在线观看| 色偷偷一区二区三区| 欧美三级日韩三级| 日韩欧美成人午夜| 国产精品午夜电影| 亚洲电影你懂得| 免费国产亚洲视频| 国产成人午夜99999| 99久久伊人网影院| 欧美视频在线观看一区| 91精品国产美女浴室洗澡无遮挡| 精品免费日韩av| 国产精品国产精品国产专区不蜜| 亚洲资源中文字幕| 久久狠狠亚洲综合| 91亚洲资源网| 91精品国产色综合久久ai换脸| 久久免费偷拍视频| 一区二区免费看| 久久99国产精品麻豆| 不卡的av电影在线观看| 欧美区视频在线观看| 国产亚洲成av人在线观看导航| 亚洲男女毛片无遮挡| 一区二区在线观看视频| 久久狠狠亚洲综合| 色综合网站在线| 精品少妇一区二区| 尤物视频一区二区| 国产精品亚洲成人| 欧美人xxxx| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 国产精品国产三级国产| 日本大胆欧美人术艺术动态| 丰满白嫩尤物一区二区| 欧美日韩一级视频| 中国色在线观看另类| 免费欧美在线视频| 欧美色网站导航| 亚洲国产经典视频| 毛片av一区二区| 色噜噜狠狠成人网p站| 国产日韩欧美激情| 青青青爽久久午夜综合久久午夜| 99久久精品情趣| 久久精品视频网| 日本vs亚洲vs韩国一区三区二区| 99国产精品久久久久久久久久久| 精品成人在线观看| 免费看日韩精品| 欧美日韩一区二区在线观看| 136国产福利精品导航| 国产呦萝稀缺另类资源| 欧美一区二区成人| 亚洲18影院在线观看| 91成人免费电影| 一区在线观看免费| 成人综合婷婷国产精品久久| 26uuu精品一区二区在线观看| 日韩精品久久久久久| 欧美色欧美亚洲另类二区| 亚洲另类春色国产| 91热门视频在线观看| 最新国产の精品合集bt伙计| av在线一区二区| 中文字幕一区av| 99在线热播精品免费| 18欧美亚洲精品|