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

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

?? disk.c

?? FAT文件系統源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// 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:

    disk.c

Abstract:

    This file contains routines for mounting and accessing disks.

Revision History:

--*/

#include "fatfs.h"

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

#ifdef DEBUG
extern DWORD csecWrite, creqWrite;
#endif


DWORD GetDiskInfo(HANDLE hdsk, PDISK_INFO pdi)
{
    DWORD cb;

    if (FSDMGR_DiskIoControl((HDSK)hdsk,
                        IOCTL_DISK_GETINFO,
                        NULL, 0,
                        pdi, sizeof(*pdi),
                        &cb, NULL)) {
        pdi->di_flags |= DISK_INFO_FLAGS_FATFS_NEW_IOCTLS;
    }
    else
    if (FSDMGR_DiskIoControl((HDSK)hdsk,
                        DISK_IOCTL_GETINFO,
                        pdi, sizeof(*pdi),
                        NULL, 0,
                        &cb, NULL)) {
        // Make sure our private flags are never set by the driver
        DEBUGMSG((pdi->di_flags & DISK_INFO_FLAGS_FATFS_NEW_IOCTLS),(DBGTEXT("FATFS!GetDiskInfo: driver is setting reserved bit(s)!\r\n")));
        pdi->di_flags &= ~DISK_INFO_FLAGS_FATFS_NEW_IOCTLS;
    }
    else {
        DWORD status = GetLastError();
        DEBUGMSG(ZONE_DISKIO || ZONE_ERRORS,
                 (DBGTEXT("FATFS!GetDiskInfo: DISK_IOCTL_GETINFO failed %d\r\n"), status));
        return status;
    }

    DEBUGMSG(ZONE_DISKIO,
             (DBGTEXT("FATFS!GetDiskInfo: DISK_IOCTL_GETINFO returned %d bytes\r\n"), cb));

    DEBUGMSG(ZONE_DISKIO,
             (DBGTEXT("FATFS!GetDiskInfo: Sectors=%d (0x%08x), BPS=%d, CHS=%d:%d:%d\r\n"),
              pdi->di_total_sectors, pdi->di_total_sectors, pdi->di_bytes_per_sect, pdi->di_cylinders, pdi->di_heads, pdi->di_sectors));

    return ERROR_SUCCESS;
}


DWORD SetDiskInfo(HANDLE hdsk, PDISK_INFO pdi)
{
    DWORD cb;
    DWORD status = ERROR_SUCCESS;

    if (!(pdi->di_flags & DISK_INFO_FLAGS_FATFS_SIMULATED)) {
        if (FSDMGR_DiskIoControl((HDSK)hdsk,
                            (pdi->di_flags & DISK_INFO_FLAGS_FATFS_NEW_IOCTLS)? IOCTL_DISK_SETINFO : DISK_IOCTL_SETINFO,
                            pdi, sizeof(*pdi),
                            NULL, 0,
                            &cb, NULL) == FALSE) {
            status = GetLastError();
            
            DEBUGMSG(ZONE_DISKIO || ZONE_ERRORS,
                    (DBGTEXT("FATFS!SetDiskInfo: DISK_IOCTL_SETINFO failed %d\r\n"), status));
        }
        else {
            DEBUGMSG(ZONE_DISKIO,
                    (DBGTEXT("FATFS!SetDiskInfo: DISK_IOCTL_SETINFO returned %d bytes\r\n"), cb));

            DEBUGMSG(ZONE_DISKIO,
                    (DBGTEXT("FATFS!SetDiskInfo: Sectors=%d (0x%08x), BPS=%d, CHS=%d:%d:%d\r\n"),
                    pdi->di_total_sectors, pdi->di_total_sectors, pdi->di_bytes_per_sect, pdi->di_cylinders, pdi->di_heads, pdi->di_sectors));
        }
    }
    return status;
}

#if 0
DWORD NearestPwr2(unsigned int n)
{
    DWORD l=1;
    while((l << 1) <=  n) {
        l = l << 1;
    }
    return l;
}
#endif


void SetupDiskCache(PVOLUME pvol)
{
    DWORD dwFlags = 0;
    DWORD dwCacheSize = 0, dwDataCacheSize = 0, dwFatCacheSize = 0;
    BOOL fEnableCache = FALSE, fFatWarm = FALSE, fDataWarm = FALSE;
    BOOL fWriteBack = FALSE;
    DWORD dwStartFatCache;

    DWORD dwLen = sizeof(DWORD);

    if (!FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"EnableCache", &fEnableCache)) {
        fEnableCache = FALSE;
    }
    if (!FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"CacheSize", &dwCacheSize)) {
        dwCacheSize = -1;
    }    

    // Keep setting dwCacheSize = -1 as option for disabling cache for backwards compatibility.
    if (!fEnableCache || dwCacheSize == -1) {
        pvol->v_FATCacheId = INVALID_CACHE_ID;
        pvol->v_DataCacheId = INVALID_CACHE_ID;
        return;
    }
   
    FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"EnableFatCacheWarm", &fFatWarm);
    FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"EnableDataCacheWarm", &fDataWarm);
    if (!fFatWarm) {
        // Allow EnableCacheWarm to also be used to warm FAT cache for backwards compatibility
        FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"EnableCacheWarm", &fFatWarm);
    }
    
    FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"FatCacheSize", &dwFatCacheSize);
    FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"DataCacheSize", &dwDataCacheSize);
    FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"EnableWriteBack", &fWriteBack);

    if (!dwFatCacheSize) {
        // If the FAT cache size was set to 0, use the size of the FAT, up to 512 sectors.
        dwFatCacheSize = min( 512, pvol->v_csecFAT);
    }

    if (!dwDataCacheSize) {        
        if (dwCacheSize) {
            // For backwards compatibility, still honor CacheSize reg setting
            dwDataCacheSize = dwCacheSize;
        } else {
            dwDataCacheSize = min (1024, 2 * pvol->v_csecFAT);
        }
    }
   
    // Set up the FAT cache flags
    if (fFatWarm) {
        dwFlags |= CACHE_FLAG_WARM;
    }      
    if (fWriteBack) {
        dwFlags |= CACHE_FLAG_WRITEBACK;
    }

    // Set up the FAT cache.
    dwStartFatCache = pvol->v_secBlkBias;

#ifdef TFAT    
    // For TFAT, only cache FAT1.  FAT0 will be uncached to ensure transactions
    // are committed properly.
    if (pvol->v_fTfat)
        dwStartFatCache += pvol->v_csecFAT; 
#endif

    pvol->v_FATCacheId = FSDMGR_CreateCache ((HDSK)pvol->v_pdsk->d_hdsk, dwStartFatCache, pvol->v_secBlkBias + pvol->v_secEndAllFATs - 1,
         dwFatCacheSize, pvol->v_pdsk->d_diActive.di_bytes_per_sect, dwFlags);

    // Set up the data cache flags
    dwFlags = 0;
    if (fDataWarm) {
        dwFlags |= CACHE_FLAG_WARM;
    }      
    if (fWriteBack) {
        dwFlags |= CACHE_FLAG_WRITEBACK;
    }

    // Set up data cache
    pvol->v_DataCacheId = FSDMGR_CreateCache ((HDSK)pvol->v_pdsk->d_hdsk, pvol->v_secBlkBias + pvol->v_secEndAllFATs, 
        pvol->v_pdsk->d_diActive.di_total_sectors - 1, dwDataCacheSize, pvol->v_pdsk->d_diActive.di_bytes_per_sect, dwFlags);

    
        
}

/*  ReadWriteDisk
 *
 *  Reads/writes a set of contiguous sectors from a disk to/from memory.
 *
 *  Entry:
 *      pvol        pointer to VOLUME, NULL if none
 *      hdsk        handle to disk
 *      cmd         READ_DISK_CMD, WRITE_DISK_CMD, or WRITETHROUGH_DISK_CMD
 *      pdi         address of DISK_INFO structure
 *      sector      0-based sector number
 *      cSectors    number of sectors to read/write
 *      pvBuffer    address of buffer to read/write sectors to/from
 *
 *  Exit:
 *      ERROR_SUCCESS if successful, else GetLastError() from the FSDMGR_DiskIoControl call issued
 */   
DWORD ReadWriteDisk(PVOLUME pvol, HANDLE hdsk, DWORD cmd, PDISK_INFO pdi, DWORD sector, int cSectors, 
                                          PVOID pvBuffer, BOOL fRemapFats)
{
    DWORD dwError = ERROR_SUCCESS;
    // DWORD dwOffset;
    // DWORD dwSector;
    BOOL  bRWFromDisk = TRUE;
    DWORD dwCacheId;
    
#ifdef TFAT
    // Here is where we are going to redirect any writes to the FAT1 from FAT0;
    if  ( pvol && pvol->v_fTfat && (pvol->v_flags & VOLF_BACKUP_FAT) &&
           IS_FAT_SECTOR(pvol, sector) && fRemapFats )
    {
        if( sector < ( pvol->v_secBlkBias + pvol->v_csecFAT )) 
        {
            // Keep track what FAT sectors are modified
            if (WRITE_DISK_CMD == cmd || WRITETHROUGH_DISK_CMD == cmd)
            {
                DWORD sec; 

                for (sec = sector - pvol->v_secBlkBias; sec < sector + cSectors - pvol->v_secBlkBias; sec++)
                {
                    ASSERT (sec < pvol->v_secEndAllFATs);
                    ASSERT ((sec >> 3) < pvol->v_DirtySectorsInFAT.dwSize);
                    pvol->v_DirtySectorsInFAT.lpBits[ sec >> 3] |= 1 << (sec & 7);
                }
            }

        	// This is a read/write to the FAT0, redirect to FAT1
            DEBUGMSGW( ZONE_TFAT && ZONE_DISKIO, ( DBGTEXTW( "FATFS!ReadWriteDisk: %s to sector %d, rerouting to sector %d\r\n" ),
                ( cmd == READ_DISK_CMD ) ? DBGTEXTW( "READ" ) : DBGTEXTW( "WRITE" ), 
                sector, sector + pvol->v_csecFAT));

            sector += pvol->v_csecFAT;
        }
        else
        {
            DEBUGMSGW( ZONE_TFAT || ZONE_ERRORS, ( DBGTEXTW( "FATFS!ReadWriteDisk: %s to sector %d -- out of range warning\r\n" ),
                ( cmd == READ_DISK_CMD ) ? DBGTEXTW( "READ" ) : DBGTEXTW( "WRITE" ), sector));
            ASSERT(FALSE);
        }
    }
#endif

    if (pvol && sector >= pvol->v_secBlkBias && pvol->v_FATCacheId != INVALID_CACHE_ID && pvol->v_DataCacheId != INVALID_CACHE_ID)
    {
        dwCacheId = pvol->v_DataCacheId;

        if (IS_FAT_SECTOR(pvol, sector))
        {
            dwCacheId = pvol->v_FATCacheId;

#ifdef TFAT
            // If this is a FAT0 sector, write directly to disk
            if (pvol->v_fTfat && sector < ( pvol->v_secBlkBias + pvol->v_csecFAT )) 
                return UncachedReadWriteDisk ((HDSK)hdsk, cmd, pdi, sector, cSectors, pvBuffer);
#endif
        }

        if (cmd == READ_DISK_CMD) 
        {
            dwError = FSDMGR_CachedRead (dwCacheId, sector, cSectors, pvBuffer, 0);
        } 
        else 
        {
            dwError = FSDMGR_CachedWrite (dwCacheId, sector, cSectors, pvBuffer, 
                (cmd == WRITETHROUGH_DISK_CMD) ? CACHE_FORCE_WRITETHROUGH : 0);
        }
    }
    else
    {
        // This is typically used for reading the boot sector, which is not cached, or if caching disabled.
        dwError = UncachedReadWriteDisk ((HDSK)hdsk, cmd, pdi, sector, cSectors, pvBuffer);
    }

    return dwError;
}    


DWORD UncachedReadWriteDisk (HDSK hdsk, DWORD cmd, PDISK_INFO pdi, DWORD sector, int cSectors, PVOID pvBuffer)
{
    DWORD dwError;
    
    if (cmd == READ_DISK_CMD) 
    {
        dwError = FSDMGR_ReadDisk (hdsk, sector, cSectors, pvBuffer, cSectors * pdi->di_bytes_per_sect);
    } 
    else 
    {
        dwError = FSDMGR_WriteDisk (hdsk, sector, cSectors, pvBuffer, cSectors * pdi->di_bytes_per_sect);
    }

    return dwError;
}

     

/*  FreeClusterOnDisk - Calls IOCTL_DISK_DELETE_SECTORS on sectors that are freed
 *
 *  ENTRY
 *      pvol - pointer to volume
 *      dwStartCluster - starting cluster to free
 *      dwNumClusters - number of clusters to free
 *

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
经典三级一区二区| 亚洲成人激情av| 美女视频黄 久久| 91精品国产综合久久精品app| 久久女同精品一区二区| 国产精品原创巨作av| 国产精品久久久久久久裸模| av动漫一区二区| 一区二区高清免费观看影视大全| 欧美日韩aaa| 国产精品一区二区男女羞羞无遮挡 | 色综合久久六月婷婷中文字幕| 亚洲一区二区三区四区在线观看 | 欧美一级一区二区| 日韩欧美亚洲国产另类| 成人av资源在线| 青青草国产精品97视觉盛宴| 国产日产亚洲精品系列| 精品视频在线看| 成人午夜电影小说| 蜜臀av一区二区三区| 蜜臀国产一区二区三区在线播放 | 福利一区二区在线观看| 日韩vs国产vs欧美| 亚洲精品成a人| 精品对白一区国产伦| 在线国产电影不卡| 懂色av中文字幕一区二区三区| 成人av网站在线| 欧美麻豆精品久久久久久| va亚洲va日韩不卡在线观看| 在线观看欧美黄色| 欧美成人一区二区三区片免费| 欧美亚洲尤物久久| 欧洲在线/亚洲| 欧美tk—视频vk| 一区二区三区**美女毛片| 蜜臀av一区二区在线免费观看| 美女视频网站黄色亚洲| 成人aaaa免费全部观看| 91麻豆精品91久久久久久清纯| 久久精品夜夜夜夜久久| 日韩欧美在线观看一区二区三区| 欧美久久久久久蜜桃| 国产调教视频一区| 亚洲国产精品视频| 亚洲成人精品一区| 成人动漫在线一区| 日韩美女主播在线视频一区二区三区| 国产片一区二区| 日本美女一区二区三区视频| av电影天堂一区二区在线| 欧美一区二区三区人| 亚洲精品中文在线影院| 国产99久久精品| 欧美一区二区三区四区高清| 亚洲免费观看高清| 午夜亚洲国产au精品一区二区| 亚洲精品欧美激情| 国产白丝网站精品污在线入口| 91精品蜜臀在线一区尤物| 一区二区三区日韩欧美精品| 国产91精品久久久久久久网曝门| 日韩一区二区精品在线观看| 亚洲一二三四区不卡| 色综合激情久久| 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲国产精品99久久久久久久久| 国产精品欧美综合在线| 一区二区三区高清在线| 9i看片成人免费高清| 国产亚洲综合在线| 国产剧情一区在线| 国产欧美日韩在线| 国产另类ts人妖一区二区| 精品国一区二区三区| 久久电影国产免费久久电影| 国产**成人网毛片九色| 久久综合色之久久综合| 亚洲自拍偷拍九九九| 色婷婷av一区二区三区gif| 亚洲摸摸操操av| 91福利视频网站| 精品日韩av一区二区| 国产在线精品视频| 欧美视频三区在线播放| 日韩在线播放一区二区| 成人精品视频网站| 日韩美女视频19| 激情深爱一区二区| 91一区二区三区在线观看| 欧美巨大另类极品videosbest | 国精产品一区一区三区mba桃花 | 国产精品免费人成网站| 91丨porny丨首页| 一区二区三区中文在线观看| 精品视频在线免费| 国精品**一区二区三区在线蜜桃| 久久久国产精品午夜一区ai换脸| 成人av影院在线| 亚洲狠狠爱一区二区三区| 91精品欧美福利在线观看| 国产精品自在在线| 依依成人精品视频| 欧美不卡视频一区| aa级大片欧美| 蜜臀av性久久久久蜜臀aⅴ流畅 | 欧美怡红院视频| 久久精品国产免费| 最新成人av在线| 欧美一区二区黄| aa级大片欧美| 蜜臀久久久久久久| 亚洲欧美日韩一区二区| 欧美一卡2卡三卡4卡5免费| 不卡视频在线观看| 日韩精品免费专区| 亚洲欧美综合色| 99在线精品视频| 免费在线看成人av| 亚洲日本在线天堂| 2020国产精品| 欧美日本免费一区二区三区| 国产成人综合亚洲网站| 久久久久久久久99精品| 欧美系列亚洲系列| 成人激情校园春色| 久久疯狂做爰流白浆xx| 丝袜亚洲另类欧美综合| 精品久久久久99| 欧美丰满嫩嫩电影| 色婷婷综合在线| 高清成人免费视频| 精品一区二区免费在线观看| 亚洲自拍偷拍欧美| 亚洲日本一区二区| 国产视频一区在线播放| 日韩精品综合一本久道在线视频| 在线一区二区三区四区| 成人h动漫精品一区二| 国产一区二区福利视频| 蜜臀国产一区二区三区在线播放| 亚洲一二三四区不卡| 亚洲三级在线播放| 国产精品女人毛片| 欧美国产日韩一二三区| 久久久不卡网国产精品一区| 日韩丝袜美女视频| 日韩一级黄色大片| 91精品国产91热久久久做人人| 欧美午夜理伦三级在线观看| 色av一区二区| 91久久免费观看| 在线观看三级视频欧美| 在线观看欧美精品| 欧美三级午夜理伦三级中视频| 一本久久精品一区二区 | 国产精品久久久久久久久久免费看| 日韩一区二区三区在线视频| 91精品欧美福利在线观看| 欧美老女人第四色| 欧美一区二区在线观看| 日韩一级大片在线| 26uuu亚洲综合色欧美| 国产日韩欧美精品一区| 欧美国产日韩精品免费观看| 中文字幕一区二区三中文字幕| 国产精品久久久久精k8| 中文字幕综合网| 午夜精品一区二区三区三上悠亚| 亚洲国产美国国产综合一区二区 | 欧美一区二区三区四区视频| 日韩欧美色综合网站| 久久女同性恋中文字幕| 中文文精品字幕一区二区| 亚洲视频在线观看三级| 亚洲国产人成综合网站| 久久99久久久久久久久久久| 国产真实乱子伦精品视频| 成人免费观看视频| 欧美三级一区二区| 亚洲精品在线免费观看视频| 日本一二三不卡| 一区二区三区四区乱视频| 久久国产精品区| 99久久综合精品| 欧美精品三级在线观看| 久久蜜臀中文字幕| 亚洲综合色网站| 极品尤物av久久免费看| 91一区在线观看| 精品日韩一区二区三区| 亚洲品质自拍视频网站| 久久精品国产久精国产| 色综合天天性综合| 国产一区二区视频在线播放| 91女神在线视频| 亚洲精品一区二区三区影院 | 91电影在线观看| 精品国产一区二区三区四区四 |