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

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

?? volume.c

?? FAT文件系統源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:

            ASSERT(pstm->s_blkDir != INVALID_BLOCK);

            if (FindBuffer(pvol, pstm->s_blkDir, NULL, FALSE, &pbuf) == ERROR_SUCCESS) {

                PDIRENTRY pde;

                pde = (PDIRENTRY)(pbuf->b_pdata + pstm->s_offDir);

                // Check the 8.3 name first...

                if (memcmp(pde->de_name, pstm->s_achOEM, sizeof(pde->de_name)) == 0) {

                    
                    DWORD clusEntry = GETDIRENTRYCLUSTER(pstm->s_pvol, pde);
                    if (clusEntry == NO_CLUSTER)
                        clusEntry = UNKNOWN_CLUSTER;

                    if ((pstm->s_flags & STF_DIRTY) ||
                        pde->de_attr == pstm->s_attr &&
                        pde->de_size == pstm->s_size && clusEntry == pstm->s_clusFirst)
                    {
                        pstm->s_flags &= ~STF_UNMOUNTED;
                    }
                }
                UnholdBuffer(pbuf);
            }
        }

        // If the stream is now (re)mounted, make sure all its handles are (re)mounted also.

        if (!(pstm->s_flags & STF_UNMOUNTED)) {

            PFHANDLE pfh, pfhEnd;

            pfh = pstm->s_dlOpenHandles.pfhNext;
            pfhEnd = (PFHANDLE)&pstm->s_dlOpenHandles;

            while (pfh != pfhEnd) {
                pfh->fh_flags &= ~FHF_UNMOUNTED;
                pfh = pfh->fh_dlOpenHandles.pfhNext;
            }
        }

        CloseStream(pstm);
        EnterCriticalSection(&pvol->v_csStms);
        goto restart;
    }

    LeaveCriticalSection(&pvol->v_csStms);

    // Make sure the buffer pool is clean too, now that we've finished
    // resurrecting and committing all resurrectable streams.

    if (CommitVolumeBuffers(pvol) == ERROR_SUCCESS) {

        DEBUGMSG(ZONE_INIT && (pvol->v_flags & VOLF_DIRTY),(DBGTEXT("FATFS!RefreshVolume: dirty data successfully committed\r\n")));
        pvol->v_flags &= ~VOLF_DIRTY;

    }
    else
        DEBUGMSG(ZONE_INIT,(DBGTEXT("FATFS!RefreshVolume: unable to commit dirty data to volume 0x%08x\r\n"), pvol));
}




DWORD LockVolume(PVOLUME pvol, DWORD dwFlags)
{
    DWORD dwError = ERROR_SUCCESS;
//    pvol->v_flags |= dwFlags;
//   return dwError;
    
    EnterCriticalSection(&pvol->v_cs);

    // Since VOLF_LOCKED is the concatenation of all lock flags, LockVolume
    // is disallowed if any lock of any kind is already in effect.  This
    // simplification should be fine for our purposes.

    if (!(pvol->v_flags & VOLF_LOCKED)) {

        pvol->v_flags |= dwFlags;

        if (CheckStreamHandles(pvol, NULL)) {
            pvol->v_flags &= ~dwFlags;
            dwError = ERROR_ACCESS_DENIED;
        }
    }
    else
        dwError = ERROR_DRIVE_LOCKED;

    LeaveCriticalSection(&pvol->v_cs);

    // If successful, wait until all threads are done before returning.
    // Easiest way to do this is simulate a quick power-off/power-on sequence. 
    // Since the volume's LOCKED bit is already set, we don't need to worry about
    // any new calls doing anything until the volume is unlocked.

    if (!dwError && cFATThreads > 1) {
        FAT_Notify(pvol, FSNOTIFY_POWER_OFF);
        FAT_Notify(pvol, FSNOTIFY_DEVICES_ON);
    }
    return dwError;
}


/*  UnlockVolume - Unlock a previously locked VOLUME
 *
 *  ENTRY
 *      pvol -> VOLUME structure
 *
 *  EXIT
 *      None
 */

void UnlockVolume(PVOLUME pvol)
{
//    pvol->v_flags &= ~VOLF_LOCKED;
//    return;
    // We need to clear the volume's lock flag first, because if
    // MountDisk decides to try to format it, it will need to be able
    // to (re)lock the volume.

    ASSERT(pvol->v_flags & VOLF_LOCKED);
    pvol->v_flags &= ~VOLF_LOCKED;

    if (pvol->v_flags & VOLF_MODIFIED) {

        DWORD dwOldFlags;
        HANDLE hdsk = pvol->v_pdsk->d_hdsk;

        // Reinvigorate our data structures since it appears that the disk
        // could have been significantly modified.

        EnterCriticalSection(&csFATFS);

        // Since the unmount/remount can cause the REMOUNTED or RECYCLED bits
        // to be set, and since this could be called *within* an earlier mount,
        // we don't want to lose the original bits for that earlier mount.

        dwOldFlags = pvol->v_flags;

        // We set the RETAIN bit, so that we don't have to worry about
        // UnmountVolume freeing the current VOLUME structure.  It will be
        // reset by UnmountVolume as soon as CloseVolume has completed.
        // (I used to set the FROZEN bit instead, but that doesn't get reset
        // until much later -- when the volume is reopened by OpenVolume -- and
        // it prevents legitimate ReadVolume/WriteVolume calls from working -JTP)

        pvol->v_flags |= VOLF_RETAIN;
        UnmountVolume(pvol, FALSE);

        // When UnmountVolume called CloseVolume, CloseVolume froze the volume
        // and set v_bMediaDesc to MAX_VOLUMES.  We set it to zero now to insure
        // that we will re-use the volume without delay.
        pvol->v_bMediaDesc = 0;

        if (pvol->v_flags & VOLF_FROZEN) {
            pvol->v_pdsk->pVol = pvol;
            pvol->v_flags &= ~VOLF_FROZEN;
        }    

#ifndef DEBUG
        MountDisk(hdsk, NULL, pvol->v_flags);
#else
        VERIFYTRUE(MountDisk(hdsk, NULL, pvol->v_flags));
#endif        

        // IMPORTANT NOTE: If the VOLF_FROZEN bit is *not* clear, then it's
        // possible that MountDisk (which calls MountVolume) may have recycled
        // the *wrong* volume (or allocated a completely new one), which means
        // that we may have just leaked a VOLUME;  at the very least, it probably
        // means our current pvol pointer is stale.

// TODO: Yadhug
//        ASSERT(!(pvol->v_flags & VOLF_FROZEN));

        // Restore the REMOUNTED and RECYCLED bits to their former glory

        pvol->v_flags &= ~(VOLF_REMOUNTED | VOLF_RECYCLED);
        pvol->v_flags |= dwOldFlags & (VOLF_REMOUNTED | VOLF_RECYCLED);

        LeaveCriticalSection(&csFATFS);

#if 0 
        if (pvol->v_volID > INVALID_AFS) {
            DEREGISTERAFS(pvol);
            pvol->v_volID = REGISTERAFS(pvol, pvol->v_volID);
        }
#endif        
    }
}


/*  OpenVolume - Allocate a VOLUME structure and validate volume
 *
 *  ENTRY
 *      pdsk -> DSK structure
 *      ppi -> partition info, if any
 *      ppbgbs - pointer to address of PBR (partition boot record) for volume
 *      pstmParent - pointer to parent stream (only if MiniFAT volume)
 *
 *  EXIT
 *      pointer to new VOLUME structure, or NULL if we couldn't make one
 */

PVOLUME OpenVolume(PDSK pdsk, PBIGFATBOOTSEC *ppbgbs, PDSTREAM pstmParent)
{
    extern CONST WCHAR awcFlags[]; // From apis.c
    extern CONST WCHAR awcUpdateAccess[]; // From apis.c
    extern CONST WCHAR awcCodePage[]; // From apis.c
    PVOLUME pvol;

    ASSERT(pdsk->d_hdsk != INVALID_HANDLE_VALUE);

    EnterCriticalSection(&csFATFS);

    // Find a reusable VOLUME or allocate a new one.

    pvol = FindVolume(pdsk, *ppbgbs);
    if (!pvol)
        goto exit;

    EnterCriticalSection(&pvol->v_cs);
    // 清除 相應的flag
    pvol->v_flags &= ~(VOLF_FROZEN | VOLF_UNCERTAIN | VOLF_DIRTY_WARN);
    
    pvol->v_flFATFS = FATFS_REGISTRY_FLAGS;    
    FSDMGR_GetRegistryValue((HDSK)pdsk->d_hdsk, awcFlags, &pvol->v_flFATFS);  

    FSDMGR_GetRegistryFlag((HDSK)pdsk->d_hdsk, awcUpdateAccess, &pvol->v_flFATFS, FATFS_UPDATE_ACCESS);

    DEBUGMSGW(ZONE_INIT,(DBGTEXTW("FATFS!OpenVolume: access time updates %s\r\n"), pvol->v_flFATFS & FATFS_UPDATE_ACCESS? TEXTW("enabled") : TEXTW("disabled")));
    DEBUGMSGW(ZONE_INIT,(DBGTEXTW("FATFS!OpenVolume: event logging %s\r\n"), pvol->v_flFATFS & FATFS_DISABLE_LOG? TEXTW("disabled") : TEXTW("enabled")));
    DEBUGMSGW(ZONE_INIT,(DBGTEXTW("FATFS!OpenVolume: automatic scanning %s\r\n"), pvol->v_flFATFS & FATFS_DISABLE_AUTOSCAN? TEXTW("disabled") : TEXTW("enabled")));
    DEBUGMSGW(ZONE_INIT,(DBGTEXTW("FATFS!OpenVolume: write verify %s\r\n"), pvol->v_flFATFS & FATFS_VERIFY_WRITES? TEXTW("enabled") : (pvol->v_flFATFS & FATFS_DISABLE_AUTOSCAN? TEXTW("disabled") : TEXTW("enabled on first 3 writes"))));
    DEBUGMSGW(ZONE_INIT,(DBGTEXTW("FATFS!OpenVolume: extra FAT on format %s\r\n"), pvol->v_flFATFS & FATFS_ENABLE_BACKUP_FAT? TEXTW("enabled") : TEXTW("disabled")));
    DEBUGMSGW(ZONE_INIT,(DBGTEXTW("FATFS!OpenVolume: force write through %s\r\n"), pvol->v_flFATFS & FATFS_FORCE_WRITETHROUGH? TEXTW("enabled") : TEXTW("disabled")));

    if (!FSDMGR_GetRegistryValue((HDSK)pdsk->d_hdsk, awcCodePage, &pvol->v_nCodePage)) {
        pvol->v_nCodePage = CP_OEMCP;
    }
    DEBUGMSG( ZONE_INIT,(DBGTEXTW("FATFS!OpenVolume: Codepage = %ld\r\n"), pvol->v_nCodePage));

    // Get the number of path cache entries from the registry
    if (!FSDMGR_GetRegistryValue((HDSK)pdsk->d_hdsk, awcPathCacheEntries, &pvol->v_cMaxCaches)) {
        pvol->v_cMaxCaches = MAX_CACHE_PER_VOLUME;
    }
    DEBUGMSG( ZONE_INIT,(DBGTEXTW("FATFS!OpenVolume: Number of path cache entries = %ld\r\n"), pvol->v_cMaxCaches));

    // Initialize the rest of the VOLUME structure now.  This doesn't perform
    // any I/O, and will return an error only if there is a problem allocating
    // memory for either the FAT or root directory streams.

    if (!InitVolume(pvol, *ppbgbs)) {
        DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!OpenVolume: InitVolume failed, volume not opened!\r\n")));
        CloseVolume(pvol, NULL);
        pvol = NULL;
        goto exit;
    }

    // Now make sure the volume is valid.  This will set the INVALID bit if
    // it isn't, but we will still register/mount the volume so that it can be
    // made valid (ie, formatted) later.

    TestVolume(pvol, ppbgbs);

  exit:
    LeaveCriticalSection(&csFATFS);
    return pvol;
}


/*  CloseVolume - Free a VOLUME structure (if no open handles)
 *
 *  ENTRY
 *      pvol - pointer to VOLUME
 *      pwsVolName - pointer to volume name buffer (assumed to be MAX_PATH)
 *
 *  EXIT
 *      TRUE if freed, FALSE if not.  If not freed, then at a minimum,
 *      the disk handle is invalidated and the volume is marked FROZEN.
 *
 *  NOTES
 *      The volume's critical section should be held by the caller,
 *      and is the caller's responsibility to unhold if this returns FALSE
 *      (ie, volume not freed).
 */

BOOL CloseVolume(PVOLUME pvol, PWSTR pwsVolName)
{
    BOOL fSuccess = TRUE;
    PDSTREAM pstm, pstmEnd;
    PFHANDLE pfh, pfhEnd;

    DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!CloseVolume(0x%x)\r\n"), pvol));

    ASSERT(pvol);

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

#ifdef PATH_CACHING
    // We destroy the path cache first, releasing any streams
    // that it may have been holding onto, so that our assertion
    // checks below don't give us false fits.

    PathCacheDestroyAll(pvol);
#endif

    // Walk the open stream list, and for each open stream, walk
    // the open handle list, and for each open handle, mark it as
    // unmounted.  Streams with no open handles are immediately
    // closed;  the only streams that should fall into that category
    // are the special streams for the FAT and root directory.

    EnterCriticalSection(&pvol->v_csStms);

    pstm = pvol->v_dlOpenStreams.pstmNext;
    pstmEnd = (PDSTREAM)&pvol->v_dlOpenStreams;

    while (pstm != pstmEnd) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品污www在线观看| 日韩高清不卡在线| 国产黄色精品视频| 精品国产乱码久久久久久蜜臀| 亚洲国产精品自拍| 欧美日本国产视频| 久久成人羞羞网站| 久久久美女艺术照精彩视频福利播放| 久久精品国产**网站演员| 精品99久久久久久| 成人福利视频在线| 亚洲精品日韩专区silk| 欧美日韩高清一区| 麻豆91免费看| 国产精品毛片大码女人| 一本色道久久综合狠狠躁的推荐| 亚洲影院免费观看| 4438x亚洲最大成人网| 国产呦萝稀缺另类资源| 国产精品毛片大码女人| 91国产免费观看| 美女网站色91| 国产欧美va欧美不卡在线| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲一区免费视频| 精品国产成人在线影院| 成人不卡免费av| 亚洲va欧美va人人爽| 337p粉嫩大胆色噜噜噜噜亚洲| 成人国产视频在线观看| 丝袜亚洲另类欧美综合| 久久精品亚洲乱码伦伦中文| 91在线视频网址| 日本不卡123| 最新热久久免费视频| 在线观看91精品国产麻豆| 国产精品综合网| 一区二区免费视频| 2欧美一区二区三区在线观看视频| 97久久精品人人做人人爽50路 | 精品影视av免费| 久久午夜羞羞影院免费观看| 色狠狠桃花综合| 久久er精品视频| 一区二区三区中文字幕精品精品| 日韩亚洲电影在线| 日本黄色一区二区| 国产一区在线观看麻豆| 亚洲1区2区3区视频| 国产精品午夜免费| 欧美成人在线直播| 欧美性猛交xxxxxxxx| 成人国产电影网| 国模娜娜一区二区三区| 偷窥少妇高潮呻吟av久久免费| 久久久五月婷婷| 国产精品成人一区二区三区夜夜夜| 宅男噜噜噜66一区二区66| av电影一区二区| 韩国精品主播一区二区在线观看| 亚洲国产精品影院| 中文字幕亚洲区| 久久九九99视频| 日韩欧美一级片| 911国产精品| 在线观看日韩电影| 色综合色狠狠综合色| 懂色av一区二区三区免费看| 精品一区二区三区免费视频| 日韩黄色免费电影| 亚洲成人资源网| 一区二区三区国产精品| 亚洲日本va午夜在线影院| 国产女主播在线一区二区| 久久人人爽爽爽人久久久| 在线观看91精品国产麻豆| 在线观看国产日韩| 色婷婷综合久久久中文字幕| 成人免费看视频| 成人午夜视频在线观看| 国产福利电影一区二区三区| 狠狠色狠狠色综合| 精品一区二区在线看| 狠狠狠色丁香婷婷综合激情 | 一区二区三区久久| 亚洲天堂精品在线观看| 亚洲欧美区自拍先锋| 亚洲婷婷综合久久一本伊一区| 国产嫩草影院久久久久| 国产精品视频在线看| 国产精品亲子伦对白| 中文字幕 久热精品 视频在线| 久久精品日韩一区二区三区| ww久久中文字幕| 欧美一卡二卡在线| 欧美草草影院在线视频| 欧美一区二区三区视频在线| 日韩三级在线观看| xfplay精品久久| 欧美国产日本视频| 国产精品久久三区| 亚洲一区二区偷拍精品| 日日噜噜夜夜狠狠视频欧美人| 麻豆免费精品视频| 国产成人精品www牛牛影视| 波多野结衣欧美| 欧美亚洲一区二区在线观看| 欧美一区二区三区视频在线 | 国产精品69久久久久水密桃| 成人免费的视频| 日韩精品中文字幕一区二区三区| 欧美成人r级一区二区三区| 国产情人综合久久777777| 亚洲免费av观看| 奇米888四色在线精品| 国产风韵犹存在线视精品| 一本色道久久综合精品竹菊| 91精品婷婷国产综合久久| 久久久精品欧美丰满| 亚洲免费观看高清完整版在线观看 | 亚洲一区二区三区四区在线免费观看 | 国产精品蜜臀av| 亚洲超碰97人人做人人爱| 国产麻豆成人精品| 在线观看视频一区二区| 久久网这里都是精品| 一级特黄大欧美久久久| 国产美女一区二区三区| 欧美三级午夜理伦三级中视频| 久久婷婷成人综合色| 亚洲动漫第一页| 成人黄色网址在线观看| 日韩一二在线观看| 亚洲精品伦理在线| 精品亚洲porn| 欧美午夜片在线看| 国产女人aaa级久久久级 | 午夜亚洲国产au精品一区二区| 国产一区二区三区不卡在线观看 | 国产女主播一区| 一区二区三区国产豹纹内裤在线| 日韩国产欧美在线观看| 国产精品一区二区不卡| 欧洲一区在线电影| 亚洲精品一区二区三区精华液 | 欧美无砖专区一中文字| 欧美成人激情免费网| 亚洲美女电影在线| 国产美女精品人人做人人爽| 欧美嫩在线观看| 国产精品麻豆一区二区| 久久电影国产免费久久电影| av午夜精品一区二区三区| 欧美成人精品二区三区99精品| 亚洲国产精品久久人人爱 | 欧洲精品中文字幕| 国产偷国产偷精品高清尤物| 久久国产精品无码网站| 日本韩国视频一区二区| 久久精品亚洲麻豆av一区二区| 亚洲亚洲人成综合网络| 成人性生交大片免费| 国产日韩欧美综合一区| 五月天久久比比资源色| 91在线视频网址| 国产三级一区二区| 国产精品一二二区| 精品毛片乱码1区2区3区| 午夜精品久久久久久久99樱桃| 成人v精品蜜桃久久一区| 精品乱人伦小说| 国产在线看一区| 日韩一级在线观看| 日韩高清不卡在线| 欧美日韩国产一级| 日韩在线一区二区三区| 欧美在线三级电影| 亚洲日本在线a| 成人高清伦理免费影院在线观看| 中文字幕精品一区二区三区精品 | 日日夜夜精品视频免费| 欧美三级电影一区| 亚洲综合色视频| 91在线视频免费观看| 欧美极品xxx| 成人午夜av电影| 国产精品理论在线观看| 色94色欧美sute亚洲线路一久 | 欧美疯狂做受xxxx富婆| 五月天中文字幕一区二区| 欧美午夜电影在线播放| 亚洲香蕉伊在人在线观| 欧美综合欧美视频| 自拍偷自拍亚洲精品播放| 欧美视频一区二区三区在线观看| 亚洲日本韩国一区| 在线观看免费一区| 亚洲欧美国产三级| 91麻豆精品国产91久久久| 日韩黄色片在线观看|