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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? volume.c

?? 從大量的wince源代碼中剝離出的fat文件系統(tǒng)源代碼.移植性非常高. 里面帶有source i.rar
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):

                pbgbs = (PVOID)LocalReAlloc((HLOCAL)pbgbs,
                                            pdsk->d_diActive.di_bytes_per_sect,
                                            LMEM_MOVEABLE);
                if (pbgbs) {
                    DEBUGALLOC(pdsk->d_diActive.di_bytes_per_sect - cbSecOrig);
                    *ppbgbs = pbgbs;        // update the caller's buffer address, too
                }
                else {
                    dwError = GetLastError();
                    DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!TestVolume: out of memory, volume deemed invalid (%d)\n"), dwError));
                    pvol->v_flags |= VOLF_INVALID;
                    goto exit;
                }
            }
        }
        else {

            // If SetDiskInfo returned an error, then revert to the
            // size originally reported, but continue trying to mount.

            pdsk->d_diActive.di_bytes_per_sect = cbSecOrig;
            DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!TestVolume: SetDiskInfo call to driver failed (%d)\n"), GetLastError()));
        }
    }

    // Perform some trial reads now (first sector of first FAT, first
    // sector of second FAT if one exists, and anything else we think of).
    // We will clear VOLF_INVALID only on success.  NOTE that we can now reuse
    // the sector containing the BPB;  we've extracted everything we needed
    // from it.

#ifdef FAT32
    if (pvol->v_flags & VOLF_32BIT_FAT) {

        PBIGFATBOOTFSINFO pFSInfo;

        dwError = ReadWriteDisk(pvol,
                                pdsk->d_hdsk,
                                DISK_IOCTL_READ,
                                &pdsk->d_diActive,
                                pvol->v_secVolBias + 1,
                                1,
                                pbgbs);

        if (dwError != ERROR_SUCCESS
            ||
            *(PDWORD)((PBYTE)pbgbs + 0) != SECONDBOOTSECSIG
            ||
            *(PDWORD)((PBYTE)pbgbs + OFFSETTRLSIG) != BOOTSECTRAILSIG)
        {
            DEBUGMSGBREAK(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!TestVolume: error verifying extended boot sector, volume deemed invalid (%d)\n"), dwError));
            pvol->v_flags |= VOLF_INVALID;
            goto exit;
        }

        // If secFSInfo happens to be 1 (which is typical), then there's no need
        // to perform another read, since it's the same sector we just read (above).

        if (pvol->v_secFSInfo != 1) {
            dwError = ReadWriteDisk(pvol,
                                    pdsk->d_hdsk,
                                    DISK_IOCTL_READ,
                                    &pdsk->d_diActive,
                                    pvol->v_secVolBias + pvol->v_secFSInfo,
                                    1,
                                    pbgbs);
        }

        if (dwError != ERROR_SUCCESS
            ||
            *(PDWORD)((PBYTE)pbgbs + 0) != SECONDBOOTSECSIG
            ||
            *(PDWORD)((PBYTE)pbgbs + OFFSETTRLSIG) != BOOTSECTRAILSIG
            ||
            (pFSInfo = (PBIGFATBOOTFSINFO)((PBYTE)pbgbs + OFFSETFSINFOFRMSECSTRT))->bfFSInf_Sig != FSINFOSIG)
        {
            DEBUGMSGBREAK(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!TestVolume: error verifying FS info sector, volume deemed invalid (%d)\n"), dwError));
            pvol->v_flags |= VOLF_INVALID;
            goto exit;
        }

        // If we're still here, then assume that we can use the BIGFATBOOTFSINFO fields,
        // if they look valid....

        if (pFSInfo->bfFSInf_free_clus_cnt < pvol->v_clusMax &&
            pFSInfo->bfFSInf_next_free_clus <= pvol->v_clusMax) {

            pvol->v_cclusFree = pFSInfo->bfFSInf_free_clus_cnt;
            pvol->v_clusAlloc = pFSInfo->bfFSInf_next_free_clus;
        }
        else {
            // Note that if the FSInfo fields are simply UNKNOWN_CLUSTER, then my assumption
            // is that they simply haven't been initialized yet (as opposed to being truly bogus).

            DEBUGMSG((ZONE_INIT || ZONE_ERRORS) &&
                     pFSInfo->bfFSInf_free_clus_cnt != UNKNOWN_CLUSTER &&
                     pFSInfo->bfFSInf_next_free_clus != UNKNOWN_CLUSTER, (DBGTEXT("FATFS!TestVolume: FS info data suspicious (%x,%x), ignoring...\n"), pFSInfo->bfFSInf_free_clus_cnt, pFSInfo->bfFSInf_next_free_clus));
        }
    }
#endif  // FAT32

    dwError = ReadWriteDisk(pvol,
                            pdsk->d_hdsk,
                            DISK_IOCTL_READ,
                            &pdsk->d_diActive,
                            pvol->v_secBlkBias + 0,
                            1,
                            pbgbs);

    if (dwError != ERROR_SUCCESS || !ValidateFATSector(pvol, pbgbs))
    {
        DEBUGMSGBREAK(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!TestVolume: error reading first FAT, volume deemed invalid (%d)\n"), dwError));
        pvol->v_flags |= VOLF_INVALID;
        goto exit;
    }

    if (pvol->v_flags & VOLF_BACKUP_FAT) {

        dwError = ReadWriteDisk(pvol,
                                pdsk->d_hdsk,
                                DISK_IOCTL_READ,
                                &pdsk->d_diActive,
                                pvol->v_secBlkBias + pvol->v_csecFAT,
                                1,
                                pbgbs);

        if (dwError != ERROR_SUCCESS || !ValidateFATSector(pvol, pbgbs))
        {
            DEBUGMSGBREAK(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!TestVolume: error reading backup FAT, volume deemed invalid (%d)\n"), dwError));
            pvol->v_flags |= VOLF_INVALID;
            goto exit;
        }
    }

    // Verify we can read the last sector in the last cluster of the volume too...
#if 0
    dwError = ReadWriteDisk(pvol,
                            pdsk->d_hdsk,
                            DISK_IOCTL_READ,
                            &pdsk->d_diActive,
                            CLUSTERTOSECTOR(pvol, pvol->v_clusMax) +
                                (1 << pvol->v_log2csecClus) - 1,
                            1,
                            pbgbs);

    if (dwError != ERROR_SUCCESS)
    {
        DEBUGMSGBREAK(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FATFS!TestVolume: error reading last sector, volume deemed invalid (%d)\n"), dwError));
        pvol->v_flags |= VOLF_INVALID;
        goto exit;
    }
#endif

    // If we modified the drive parameters but the volume isn't valid anyway, restore the default parameters.

  exit:
    if ((pvol->v_flags & (VOLF_MODDISKINFO | VOLF_INVALID)) == (VOLF_MODDISKINFO | VOLF_INVALID)) {
        pvol->v_flags &= ~VOLF_MODDISKINFO;
        pdsk->d_diActive.di_bytes_per_sect = cbSecOrig;
        SetDiskInfo(pdsk->d_hdsk, &pdsk->d_diActive);
    }

    return dwError;
}


/*  RefreshVolume - Refresh a VOLUME's handles
 *
 *  ENTRY
 *      pvol - pointer to VOLUME
 *
 *  EXIT
 *      Stream handles are restored, provided the volume is valid AND
 *      the streams appear to be in the same state we left them.
 */

void RefreshVolume(PVOLUME pvol)
{
    PDSTREAM pstm, pstmEnd;

    if (!(pvol->v_flags & (VOLF_REMOUNTED | VOLF_RECYCLED)))
        return;

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

    // Walk the open stream list, regenerate each stream, then walk the
    // open handle list for each successfully regenerated stream, and clear
    // the unmounted bit for each open handle.

    // First, make sure the VISITED bit is clear in every stream currently
    // open on this volume.

    EnterCriticalSection(&pvol->v_csStms);

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

    while (pstm != pstmEnd) {
        pstm->s_flags &= ~STF_VISITED;
        pstm = pstm->s_dlOpenStreams.pstmNext;
    }

    // Now find the next unvisited stream.  Note that every iteration of the
    // loop starts with the volume critical section held.

  restart:
    pstm = pvol->v_dlOpenStreams.pstmNext;
    while (pstm != pstmEnd) {

        if (pstm->s_flags & STF_VISITED) {
            pstm = pstm->s_dlOpenStreams.pstmNext;
            continue;
        }

        pstm->s_flags |= STF_VISITED;

        // Add a ref to insure that the stream can't go away once we
        // let go of the volume's critical section.

        pstm->s_refs++;
        
        LeaveCriticalSection(&pvol->v_csStms);
        EnterCriticalSection(&pstm->s_cs);

        // Find/read the block containing this stream's DIRENTRY, unless
        // it's a VOLUME-based stream, in which case we'll just automatically
        // remount it.

        ASSERT(pstm->s_pvol == pvol);

        // Volume handles are always remounted, regardless

        if (pstm->s_flags & STF_VOLUME)
            pstm->s_flags &= ~STF_UNMOUNTED;

        if ((pstm->s_flags & STF_UNMOUNTED) && !(pvol->v_flags & VOLF_INVALID)) {

            PBUF pbuf;

            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\n")));
        pvol->v_flags &= ~VOLF_DIRTY;

    }
    else
        DEBUGMSG(ZONE_INIT,(DBGTEXT("FATFS!RefreshVolume: unable to commit dirty data to volume 0x%08x\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
 */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美一区二区久久| 国产色产综合产在线视频| 免播放器亚洲一区| 欧美激情一区二区三区四区| 在线观看国产精品网站| 九九国产精品视频| 亚洲欧美日韩电影| 亚洲精品一区二区三区四区高清| 99视频精品在线| 久久99国产精品久久99| 亚洲乱码中文字幕| 久久综合色天天久久综合图片| 色系网站成人免费| 国产白丝网站精品污在线入口| 五月天网站亚洲| 国产精品久久久久久久久动漫 | 亚洲欧美日韩人成在线播放| 91精品中文字幕一区二区三区| 成人视屏免费看| 久久精品二区亚洲w码| 亚洲小说欧美激情另类| 中文字幕av一区二区三区高 | 精品国产一区二区三区四区四| 在线观看三级视频欧美| 福利视频网站一区二区三区| 日韩国产高清影视| 亚洲一二三区视频在线观看| 国产精品国产三级国产a| 2021国产精品久久精品| 欧美一二三区在线| 欧美日韩中文一区| 色婷婷av一区二区三区大白胸 | 在线一区二区三区| 成人深夜在线观看| 国产在线精品免费| 九色综合狠狠综合久久| 日韩电影在线一区二区三区| 一个色综合av| 亚洲三级电影网站| 国产精品丝袜黑色高跟| 国产亚洲va综合人人澡精品 | 国产一区二区0| 麻豆精品视频在线观看| 日本在线不卡一区| 日本不卡一区二区三区高清视频| 亚洲一区二区三区四区在线| 亚洲综合清纯丝袜自拍| 一区二区日韩av| 亚洲一区在线看| 亚洲一区二区三区视频在线| 亚洲一区免费在线观看| 一区二区三区在线免费观看| 亚洲美女免费视频| 一区二区三区国产精华| 91在线云播放| 99视频有精品| 色婷婷精品久久二区二区蜜臀av | 久久精品国产99| 国产在线精品视频| 粉嫩绯色av一区二区在线观看| 成人综合婷婷国产精品久久蜜臀| 成人激情av网| 色悠悠久久综合| 欧美视频一区二区三区四区 | 日韩欧美电影一二三| 欧美电视剧在线看免费| 久久久综合网站| 国产片一区二区| 中文字幕综合网| 亚洲1区2区3区4区| 狠狠色狠狠色综合系列| 国产一区二区三区电影在线观看| 国产馆精品极品| 99久久99久久精品国产片果冻 | 午夜欧美大尺度福利影院在线看| 日韩电影免费在线观看网站| 国产精品一品视频| aaa亚洲精品| 8x福利精品第一导航| 国产亚洲精品超碰| 一区二区三区日本| 制服丝袜在线91| 久久久久九九视频| 亚洲色图欧美偷拍| 日韩av在线播放中文字幕| 国产麻豆视频一区二区| 97精品超碰一区二区三区| 欧美精品久久99久久在免费线 | 日韩欧美成人激情| 国产精品久久久久天堂| 肉丝袜脚交视频一区二区| 国产一区二区精品久久91| 91黄视频在线| 久久夜色精品国产噜噜av | 综合激情网...| 日本美女一区二区三区视频| 成人亚洲精品久久久久软件| 欧美日韩中文精品| 欧美国产日本韩| 日韩精品一二三| 成人激情开心网| 日韩精品一区二区三区在线播放| 亚洲色图一区二区| 国产伦精品一区二区三区免费| 欧美主播一区二区三区美女| 国产午夜精品久久久久久久| 色av成人天堂桃色av| 久久这里只有精品视频网| 一区二区在线观看视频| 国产成人免费视频网站高清观看视频| 欧美视频精品在线| 国产精品人成在线观看免费| 蜜桃av一区二区在线观看 | 老司机精品视频在线| 91成人看片片| 国产精品美女久久久久aⅴ| 麻豆国产欧美日韩综合精品二区| 欧美性生交片4| 国产精品成人免费精品自在线观看 | 欧美激情在线一区二区| 蜜臀99久久精品久久久久久软件| 欧美影院午夜播放| 日韩码欧中文字| 成人性生交大合| 久久先锋影音av鲁色资源网| 久热成人在线视频| 欧美嫩在线观看| 亚洲综合一二区| 91色在线porny| 国产精品久久久久三级| 国产精品系列在线观看| 久久只精品国产| 精油按摩中文字幕久久| 91精品中文字幕一区二区三区| 一区二区三区四区乱视频| av一区二区不卡| 国产精品无圣光一区二区| 国产ts人妖一区二区| 26uuu亚洲综合色欧美| 久久国产乱子精品免费女| 欧美一区永久视频免费观看| 91国偷自产一区二区三区成为亚洲经典 | 日韩综合一区二区| 欧美日韩三级一区| 午夜精品福利一区二区蜜股av| 在线视频你懂得一区二区三区| 亚洲免费观看在线观看| 色老汉一区二区三区| 一区二区在线观看视频| 欧美中文字幕一二三区视频| 一片黄亚洲嫩模| 欧美日本乱大交xxxxx| 日韩专区欧美专区| 欧美一区二区三区免费在线看| 蜜臀av性久久久久蜜臀av麻豆 | 欧美天天综合网| 五月婷婷色综合| 日韩免费成人网| 国内成人精品2018免费看| 国产亚洲va综合人人澡精品| 成人成人成人在线视频| 亚洲美女在线国产| 欧美午夜不卡在线观看免费| 奇米色一区二区三区四区| 欧美sm极限捆绑bd| 国产成人av福利| 中文字幕一区二区在线观看| 亚洲私人黄色宅男| 在线观看欧美日本| 日本成人超碰在线观看| 国产欧美日韩一区二区三区在线观看| 成人免费高清视频| 综合久久综合久久| 制服丝袜在线91| 国产乱子轮精品视频| 亚洲日本韩国一区| 5月丁香婷婷综合| 国产成人免费视频网站| 亚洲乱码国产乱码精品精可以看| 欧美日本乱大交xxxxx| 国产精品影视天天线| 日韩毛片精品高清免费| 欧美一区二区三区啪啪| 国产成人精品免费在线| 亚洲一区二区精品视频| 精品日韩99亚洲| 色哟哟精品一区| 久久精品国产77777蜜臀| 亚洲欧洲成人精品av97| 在线电影一区二区三区| 成人性生交大片免费看视频在线| 香蕉成人啪国产精品视频综合网| 久久亚洲综合色一区二区三区| 色综合久久88色综合天天6| 日韩电影一区二区三区| 1区2区3区欧美| 欧美成人在线直播| 色屁屁一区二区| 国产精品一区二区久激情瑜伽 | 成人在线综合网|