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

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

?? volume.c

?? FAT文件系統源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
        pstm->s_flags &= ~STF_VISITED;
        pstm = pstm->s_dlOpenStreams.pstmNext;
    }

  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);

        // Try to commit the stream before we unmount it, because we may
        // never be able to remount this stream again, and CommitStream
        // will refuse to commit a stream that's unmounted (and rightly so).

        CommitStream(pstm, TRUE);

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

        if (pfh == pfhEnd) {

            if (pstm->s_refs == 2) {
                if (pstm == pvol->v_pstmFAT) {
                    pstm->s_refs--;
                    pvol->v_pstmFAT = NULL;
                }
                else if (pstm == pvol->v_pstmRoot) {
                    pstm->s_refs--;
                    pvol->v_pstmRoot = NULL;
                }
            }
        }
        else {

            // An open handle exists, but free the volume anyway since 
            // this is most likely due to removing removable media

            // Note that we print # of refs less 1, because one of the
            // refs is temporary (ie, it has been added by this function).

            DEBUGMSG(ZONE_INIT,(DBGTEXT("FATFS!CloseVolume: stream %.11hs still open (%d refs)\r\n"), pstm->s_achOEM, pstm->s_refs-1));

            // Since a stream's current buffer should be neither manipulated
            // nor held after the release of its critical section, and since we
            // own that critical section now, assert that the current buffer
            // is no longer held;  this means that the current buffer pointer
            // serves only as a "cache hint" now, and since we are about to call
            // FreeBufferPool, we need to invalidate that hint now, too.

            ASSERT(!(pstm->s_flags & STF_BUFCURHELD));
            pstm->s_pbufCur = NULL;

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

        pstm->s_flags |= STF_UNMOUNTED;

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

    LeaveCriticalSection(&pvol->v_csStms);

    // Free any other memory associated with the volume.  The only
    // memory remaining (if ANY) should be the VOLUME structure and one
    // or more open streams hanging off it.  Also, before the registered name
    // of the volume goes away, save a copy if the caller wants it (like for
    // error reporting or something....)  We start at "+1" to avoid copying
    // the leading backslash.

    if (pwsVolName) {
        *pwsVolName = '\0';
        if (pvol->v_pwsHostRoot)
            wcscpy(pwsVolName, pvol->v_pwsHostRoot+1);
    }

    if (!(pvol->v_flags & VOLF_FORMATTING) && !(pvol->v_flags & VOLF_SCANNING))
        DeregisterVolume(pvol);

    if (!FreeBufferPool(pvol))
        fSuccess = FALSE;

    BufDeinit (pvol);

    if (pvol->v_pFreeClusterList) {
        HeapFree(hHeap, 0, pvol->v_pFreeClusterList);
    }

#ifdef TFAT
    if (pvol->v_fTfat) {
        // Free diry sector bit array
        if(pvol->v_DirtySectorsInFAT.lpBits)
        {
            HeapFree(hHeap, 0, pvol->v_DirtySectorsInFAT.lpBits);
            pvol->v_DirtySectorsInFAT.lpBits = NULL;
        }

        if(pvol->v_ClusBuf)
        {
            HeapFree(hHeap, 0, pvol->v_ClusBuf);
            pvol->v_ClusBuf = NULL;
        }

        if (pvol->v_pFrozenClusterList)
        {
            VirtualFree (pvol->v_pFrozenClusterList, 0, MEM_RELEASE);
            pvol->v_pFrozenClusterList = NULL;
        }

        if (pvol->v_pFATBuffer)
        {
            HeapFree (hHeap, 0 , pvol->v_pFATBuffer);
            pvol->v_pFATBuffer = NULL;
        }

        if (pvol->v_pBootSec)
        {
            HeapFree (hHeap, 0, pvol->v_pBootSec);
            pvol->v_pBootSec = NULL;
        }
        
    }
#endif    

    if (pvol->v_FATCacheId != INVALID_CACHE_ID)
        FSDMGR_DeleteCache (pvol->v_FATCacheId);
    
    if (pvol->v_DataCacheId != INVALID_CACHE_ID)
        FSDMGR_DeleteCache (pvol->v_DataCacheId);
    
    if (fSuccess) {

        // If we already tried once to close this volume and failed,
        // leave it allocated but frozen until the volume is remounted
        // or recycled, lest we mess up volume bookkeeping in
        // external components.  

        fSuccess =  !(pvol->v_flags & (VOLF_FROZEN | VOLF_RETAIN));

        if (fSuccess) {
#ifdef PATH_CACHING
            DEBUGFREE(DEBUGALLOC_CS);
            DeleteCriticalSection(&pvol->v_csCaches);
#endif
            DEBUGFREE(DEBUGALLOC_CS);
            DeleteCriticalSection(&pvol->v_csStms);
            DEBUGFREE(DEBUGALLOC_CS);
            LeaveCriticalSection(&pvol->v_cs);  // DeleteCriticalSection is picky about this...
            DeleteCriticalSection(&pvol->v_cs);
            DEBUGFREE(sizeof(VOLUME));
            VERIFYTRUE(HeapFree(hHeap, 0, (HLOCAL)pvol));
        }
        else {
            DEBUGMSGW(ZONE_INIT,(DBGTEXTW("FATFS!CloseVolume: retaining volume 0x%08x (%s)\r\n"), pvol, pvol->v_flags & VOLF_FROZEN? TEXTW("previously frozen") : TEXTW("following power cycle")));
            if (!(pvol->v_flags & VOLF_FROZEN)) {
                pvol->v_bMediaDesc = MAX_VOLUMES;
                pvol->v_flags |= VOLF_FROZEN;
            }
        }
    }
    else {
        DEBUGMSG(ZONE_INIT,(DBGTEXT("FATFS!CloseVolume: retaining volume 0x%08x (open files add/or dirty buffers)\r\n"), pvol));
        if (!(pvol->v_flags & VOLF_FROZEN)) {
            pvol->v_bMediaDesc = MAX_VOLUMES;   // overload bMediaDesc as a recycle skip count
            pvol->v_flags |= VOLF_FROZEN;
        }
    }
    DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!CloseVolume returned 0x%x\r\n"), fSuccess));
    return fSuccess;
}


/*  QueryVolumeParameters - Query volume parameters
 *
 *  ENTRY
 *      pvol - pointer VOLUME structure
 *      pdevpb - pointer to DOS-style device parameter block
 *      fVolume - TRUE to return volume info, FALSE for device info
 *
 *  EXIT
 *      ERROR_SUCCESS if successful, error code if not
 */

void QueryVolumeParameters(PVOLUME pvol, PDEVPB pdevpb, BOOL fVolume)
{
    // Caller wants a DEVPB.  Give him a close approximation of one.

    memset(pdevpb, 0, sizeof(DEVPB));

#ifdef OLD_CODE
    // In order to allow invalid volumes inside valid partitions
    // to be reformatted, I'm going to leave fVolume alone now. -JTP

    if (pvol->v_flags & VOLF_INVALID)
        fVolume = FALSE;
#endif

    // We'll use this bMediaType field to tell the caller what
    // kind of disk this volume resides on.  Callers that want to
    // reformat volumes need to know that.

    if (pvol->v_pdsk->d_diActive.di_flags & DISK_INFO_FLAG_MBR) {
        pdevpb->DevPrm.OldDevPB.bMediaType = MEDIA_HD;
    }

    pdevpb->DevPrm.OldDevPB.BPB.BPB_BytesPerSector = (WORD)(pvol->v_pdsk->d_diActive.di_bytes_per_sect);

    if (fVolume) {
        pdevpb->DevPrm.OldDevPB.BPB.BPB_SectorsPerCluster   = (BYTE)(1 << (pvol->v_log2cblkClus - pvol->v_log2cblkSec));
        pdevpb->DevPrm.OldDevPB.BPB.BPB_HiddenSectors       = pvol->v_secVolBias;
        pdevpb->DevPrm.OldDevPB.BPB.BPB_ReservedSectors     = (WORD)(pvol->v_secBlkBias - pvol->v_secVolBias);
        if (pvol->v_csecFAT)
            pdevpb->DevPrm.OldDevPB.BPB.BPB_NumberOfFATs    = (BYTE)(pvol->v_secEndAllFATs / pvol->v_csecFAT);
        if (pvol->v_pstmRoot)
            pdevpb->DevPrm.OldDevPB.BPB.BPB_RootEntries     = (WORD)(pvol->v_pstmRoot->s_size / sizeof(DIRENTRY));
        pdevpb->DevPrm.OldDevPB.BPB.BPB_MediaDescriptor     = pvol->v_bMediaDesc;
        pdevpb->DevPrm.OldDevPB.BPB.BPB_SectorsPerFAT       = (WORD)pvol->v_csecFAT;
    }

    pdevpb->DevPrm.OldDevPB.BPB.BPB_SectorsPerTrack = (WORD)pvol->v_pdsk->d_diActive.di_sectors;
    pdevpb->DevPrm.OldDevPB.BPB.BPB_Heads = (WORD)pvol->v_pdsk->d_diActive.di_heads;
    pdevpb->DevPrm.OldDevPB.BPB.BPB_BigTotalSectors = fVolume? pvol->v_csecTotal + pdevpb->DevPrm.OldDevPB.BPB.BPB_ReservedSectors : pvol->v_pdsk->d_diActive.di_total_sectors;
}


/*  RegisterVolume - Register VOLUME in file system
 *
 *  ENTRY
 *      pvol -> VOLUME
 *
 *  EXIT
 *      TRUE if volume successfully registered, FALSE if not
 */

WCHAR awcFolder[] = TEXTW("Mounted Volume");

BOOL RegisterVolume(PVOLUME pvol)
{
    WCHAR szName[MAX_PATH];
    DWORD dwAvail;
    BOOL fSuccess = FALSE;
    DWORD dwValue;

    wcscpy( szName, L"");
    if (FSDMGR_GetRegistryValue((HDSK)pvol->v_pdsk->d_hdsk, L"MountLabel", &dwValue) && (dwValue == 1)) {
        FSDMGR_GetDiskName( (HDSK)pvol->v_pdsk->d_hdsk, szName);
    } 
    if (wcslen(szName) == 0) {
        if (!FSDMGR_DiskIoControl((HDSK)pvol->v_pdsk->d_hdsk, DISK_IOCTL_GETNAME, NULL, 0, (LPVOID)szName, sizeof(szName), &dwAvail, NULL)) { 
            wcscpy( szName, awcFolder);
        }
    }    
    
    if (pvol->v_hVol = FSDMGR_RegisterVolume((HDSK)pvol->v_pdsk->d_hdsk, szName, (DWORD)pvol)) {
        pvol->v_volID = 1;
        if (!pvol->v_pwsHostRoot) {
            pvol->v_pwsHostRoot = (PWSTR)HeapAlloc(hHeap, 0, MAX_PATH * sizeof(WCHAR));
        }    
        if (pvol->v_pwsHostRoot) {
            FSDMGR_GetVolumeName(pvol->v_hVol, pvol->v_pwsHostRoot, MAX_PATH);
            pvol->v_cwsHostRoot = wcslen(pvol->v_pwsHostRoot);
        } else {
            pvol->v_cwsHostRoot = 0;
        }    
        fSuccess = TRUE;
    }    
    return fSuccess;
}


/*  DeregisterVolume - Deregister VOLUME in file system
 *
 *  ENTRY
 *      pvol -> VOLUME
 *
 *  EXIT
 *      None
 */

void DeregisterVolume(PVOLUME pvol)
{
    if (pvol->v_hVol && (pvol->v_volID != INVALID_AFS)) {
        FSDMGR_DeregisterVolume(pvol->v_hVol);
        pvol->v_hVol = 0;
        pvol->v_volID = INVALID_AFS;
    }    
    if (pvol->v_pwsHostRoot) {
        FSDMGR_AdvertiseInterface( &FATFS_MOUNT_GUID, pvol->v_pwsHostRoot, FALSE);
        HeapFree(hHeap, 0,  pvol->v_pwsHostRoot);
        pvol->v_pwsHostRoot = NULL;
    }
}

/*  MountVolume - Mount volume on specified disk
 *
 *  ENTRY
 *      pdsk -> DSK structure for disk
 *      pbSector -> BIGFATBOOTSEC structure (from disk)
 *      flVol == initial volume flags (currently, only VOLF_READONLY is copied)
 *
 *  EXIT
 *      Pointer to VOLUME structure, NULL if error (eg, out of memory,
 *      disk error, etc)
 */

PVOLUME MountVolume(PDSK pdsk, PBIGFATBOOTSEC *ppbgbs, DWORD flVol)
{
    PVOLUME pvol;

    ASSERT(OWNCRITICALSECTION(&csFATFS));

    if (pvol = OpenVolume(pdsk, ppbgbs, NULL)) {

        pvol->v_flags &= ~VOLF_READONLY;
        pvol->v_flags |= (flVol & VOLF_READONLY);

        // If this is a remounted volume, refresh as many of its open handles
        // as possible.  We do this even for INVALID volumes, because there
        // may still be VOLUME-based handles, which can always be refreshed.
        // Also, this has to be deferred until after AllocBufferPool, because we
        // can't verify what state the streams are in without buffers to work with.

        RefreshVolume(pvol);

        // We must not be holding the VOLUME's critical section around the FILESYS
        // calls made by RegisterVolume, because those calls take FILESYS' critical
        // section, and if another FILESYS thread issues a power-off notification
        // at the wrong time (whialso holds FILESYS's critical section),
        // our notification function (FAT_Notify) will hang attempting to take
        // the VOLUME's critical section in order to enumerate all the file handles
        // and flush them.

        // Since we're still holding onto csFATFS, and we haven't cleared the
        // volume's UNMOUNTED bit yet, it should be OK to let go of the VOLUME's
        // critical section now.

        LeaveCri

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区免费看 | 欧美高清hd18日本| 精品在线观看免费| 一区二区三区精品久久久| 久久亚洲私人国产精品va媚药| 色香蕉久久蜜桃| 粉嫩绯色av一区二区在线观看| 日韩精品欧美精品| 亚洲欧美日韩一区二区 | 日韩欧美国产麻豆| 日本久久精品电影| 成人午夜视频免费看| 美女在线视频一区| 亚洲成人午夜电影| 日韩伦理免费电影| 国产精品免费aⅴ片在线观看| 日韩一区二区高清| 欧美久久一二三四区| 91成人在线免费观看| 成人av在线网站| 国产精品66部| 精品在线你懂的| 美女视频黄频大全不卡视频在线播放| 国产不卡在线播放| 青青国产91久久久久久 | 日日夜夜精品视频免费| 亚洲精品国产一区二区精华液| 久久久久国产成人精品亚洲午夜| 91精品欧美福利在线观看| 欧美亚洲精品一区| 91高清视频免费看| 日本精品一级二级| 色噜噜狠狠色综合欧洲selulu| 大美女一区二区三区| 国产精品1区2区| 国内成人自拍视频| 国产精品亚洲第一区在线暖暖韩国| 免费观看在线综合色| 美女视频黄a大片欧美| 免费一级欧美片在线观看| 欧美aaa在线| 精品制服美女久久| 国产精品一区久久久久| 国产成人亚洲综合a∨猫咪| 国产成人精品一区二区三区四区| 国产精品一区二区在线观看网站| 国产精品一区免费在线观看| 国产东北露脸精品视频| jiyouzz国产精品久久| 91丨九色丨国产丨porny| 日本高清免费不卡视频| 欧美日本在线一区| 日韩色视频在线观看| 亚洲精品一线二线三线无人区| 久久男人中文字幕资源站| 国产日产欧美一区| 亚洲日本va在线观看| 亚洲国产精品一区二区尤物区| 婷婷成人综合网| 激情六月婷婷久久| 成人国产电影网| 欧美在线免费视屏| 日韩欧美高清一区| 中文字幕乱码日本亚洲一区二区| 亚洲欧美日韩在线| 天天综合色天天| 国产精品羞羞答答xxdd| 99精品国产一区二区三区不卡| 色av一区二区| 欧美大片国产精品| 国产精品久久久久久亚洲伦| 亚洲国产一区二区a毛片| 美国毛片一区二区| 9人人澡人人爽人人精品| 欧美二区三区91| 欧美激情一区二区三区不卡| 亚洲国产日日夜夜| 国产精品99久久久久| 在线视频一区二区三| 日韩精品专区在线影院观看| 国产精品久久久久久久久快鸭| 亚洲国产成人高清精品| 国产精品一区二区果冻传媒| 在线视频一区二区三| 久久麻豆一区二区| 亚洲一区二区视频| 国产不卡在线播放| 欧美电影在哪看比较好| 国产精品无遮挡| 美女脱光内衣内裤视频久久网站| 不卡在线观看av| 日韩欧美一级在线播放| 一区二区三区在线视频观看58| 激情综合色播激情啊| 欧美午夜影院一区| 国产精品免费av| 久久国产日韩欧美精品| 欧美亚洲国产一区二区三区| 久久精品亚洲乱码伦伦中文| 亚洲777理论| 99久久综合色| 国产无人区一区二区三区| 亚洲高清视频在线| 99精品国产99久久久久久白柏| 日韩一二三四区| 亚洲一区二区三区四区的| 国产超碰在线一区| 欧美v亚洲v综合ⅴ国产v| 亚洲成人777| 一本高清dvd不卡在线观看| 久久久亚洲欧洲日产国码αv| 亚洲成人一二三| 日本久久电影网| 国产精品第13页| 国产精品一区二区视频| 欧美大片顶级少妇| 另类中文字幕网| 制服丝袜激情欧洲亚洲| 亚洲电影一级片| 欧美性色黄大片| 一区二区三区四区乱视频| 99re热视频精品| 国产精品久久二区二区| 国产成人aaa| 国产欧美精品国产国产专区| 狠狠色丁香婷婷综合| 日韩欧美电影在线| 蜜桃av一区二区在线观看| 欧美一区二区三区在| 人妖欧美一区二区| 91精品国产91久久久久久一区二区| 亚洲第一主播视频| 欧美日韩一区二区三区在线| 亚洲中国最大av网站| 欧美色手机在线观看| 亚洲成a人v欧美综合天堂下载 | 久久亚洲春色中文字幕久久久| 免费欧美高清视频| 日韩欧美中文一区二区| 久久精品噜噜噜成人av农村| 欧美一二三四在线| 激情综合色丁香一区二区| 26uuu国产电影一区二区| 国产成人精品午夜视频免费| 国产精品久久久久久亚洲伦| 99re热视频这里只精品| 亚洲一区二区三区小说| 欧美日韩电影一区| 免费美女久久99| 国产日产亚洲精品系列| 99久久精品免费看国产 | 国产精品99久久久| 国产精品理论片在线观看| 91同城在线观看| 午夜精品一区二区三区电影天堂| 欧美丰满少妇xxxbbb| 狠狠色丁香婷综合久久| 国产精品午夜春色av| 91福利精品第一导航| 青青青爽久久午夜综合久久午夜 | 国产日韩影视精品| 97久久精品人人做人人爽| 亚洲一线二线三线视频| 欧美一级片在线| 国产+成+人+亚洲欧洲自线| 亚洲精品亚洲人成人网| 777久久久精品| 国产成人一级电影| 亚洲精品久久嫩草网站秘色| 日韩一区二区三区视频| 国产成人午夜视频| 亚洲国产视频直播| 国产亚洲一区二区在线观看| 日本韩国视频一区二区| 精品一区二区免费在线观看| 国产精品美女久久久久久久网站| 欧美亚洲精品一区| 国产成人综合在线播放| 亚洲国产日韩a在线播放性色| 久久伊99综合婷婷久久伊| 日本伦理一区二区| 国产一区二区中文字幕| 亚洲国产色一区| 国产精品无人区| 在线不卡a资源高清| 成人av中文字幕| 久久99国产精品麻豆| 亚洲主播在线观看| 亚洲国产精品ⅴa在线观看| 欧美电影在线免费观看| a在线欧美一区| 久久99久国产精品黄毛片色诱| 椎名由奈av一区二区三区| 欧美精品一区二区高清在线观看| 在线看一区二区| 成人性生交大片免费看中文| 日韩高清欧美激情| 亚洲精品日韩一| 中文字幕一区二区不卡| 精品99一区二区|