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

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

?? api.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:

    api.c

Abstract:

    This file contains the file system API sets for the FAT file system.

Revision History:

--*/

#include "fatfs.h"
#include <storemgr.h>

#ifdef UNDER_CE
#ifdef DEBUG
DBGPARAM dpCurSettings = {
        TEXTW("FATFS"), {
            TEXTW("Init"),              // 0x0001
            TEXTW("Errors"),            // 0x0002
            TEXTW("Shell Msgs"),        // 0x0004
            TEXTW("TFAT"),                  // 0x0008
            TEXTW("Memory"),            // 0x0010
            TEXTW("APIs"),              // 0x0020
            TEXTW("Messages"),          // 0x0040
            TEXTW("Streams"),           // 0x0080
            TEXTW("Buffers"),           // 0x0100
            TEXTW("Clusters"),          // 0x0200
            TEXTW("FAT I/O"),           // 0x0400
            TEXTW("Disk I/O"),          // 0x0800
            TEXTW("Log I/O"),           // 0x1000
            TEXTW("Read Verify"),       // 0x2000
            TEXTW("Write Verify"),      // 0x4000
            TEXTW("Prompts"),           // 0x8000
        },
        ZONEMASK_DEFAULT
};
#endif
#endif


CONST WCHAR awcFATFS[] = TEXTW("SYSTEM\\StorageManager\\FATFS");
CONST WCHAR awcCompVolID[] = TEXTW("CompVolID");
CONST WCHAR awcFlags[] = TEXTW("Flags");                // NOTE: "Flags" supercedes "UpdateAccess", but
CONST WCHAR awcCodePage[] = TEXTW("CodePage");
CONST WCHAR awcUpdateAccess[] = TEXTW("UpdateAccess");  // UpdateAccess was supported on v1.0, so we'll keep both -JTP
CONST WCHAR awcPathCacheEntries[] = TEXTW("PathCacheEntries");  
CONST WCHAR awcFormatTfat[] = TEXTW("FormatTfat");  
CONST WCHAR awcSecureWipe[] = TEXTW("SecureWipe");  
#ifdef DEBUG
CONST WCHAR awcDebugZones[] = TEXTW("DebugZones");
#endif


/*  Globals
 */

int         cLoads;             // count of DLL_PROCESS_ATTACH's
#ifdef SHELL_MESSAGE_NOTIFICATION
HWND        hwndShellNotify;    // from FAT_RegisterFileSystemNotification
#endif
#ifdef SHELL_CALLBACK_NOTIFICATION
SHELLFILECHANGEFUNC_t pfnShell; // from FAT_RegisterFileSystemFunction
#endif


HINSTANCE   hFATFS;


DSK_DLINK   dlDisks;            // keeps track of every open FAT device
DWORD       cFATThreads;
HANDLE      hevStartup;
HANDLE      hevShutdown;
CRITICAL_SECTION csFATFS;
HANDLE      hHeap;

#ifdef DEBUG
int         cbAlloc;            // total bytes allocated
CRITICAL_SECTION csAlloc;
DWORD       csecWrite = 0, creqWrite = 0;
#endif

/*  FAT_CloseAllFiles
 *
 *  Walk the open stream list, and for each open stream, walk the open
 *  handle list, and for each open handle, close it.  Each CloseFileHandle
 *  becomes CloseHandle, which becomes FAT_CloseFile, which issues a
 *  CloseStream for the associated stream, and if that's the stream's last
 *  reference, CloseStream frees it.
 *
 *  ENTRY
 *      pvol - pointer to VOLUME
 *      hProc - handle of terminating process;
 *              or NULL to close all file handles;
 *              or INVALID_HANDLE_VALUE to *commit* all file handles
 *
 *  EXIT
 *      TRUE if successful, FALSE if not.
 */

BOOL FAT_CloseAllFiles(PVOLUME pvol, HANDLE hProc)
{
    PFHANDLE pfh, pfhEnd;
    PDSTREAM pstm, pstmEnd;

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

    // We can't hold the volume's stream list critical section indefinitely (like
    // while attempting to enter an arbitrary stream's critical section), so we
    // have to let it go after selecting a stream to visit.  So each stream has a
    // VISITED bit that helps us remember which streams we have/have not visited.

    // To protect the integrity of the VISITED bits, all functions that
    // manipulate them must take the volume's critical section, too.

    EnterCriticalSection(&pvol->v_cs);

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

        // If all we're doing is committing, then we don't need to visit volume-based streams
        // (just file-based streams).

        if (hProc == INVALID_HANDLE_VALUE && (pstm->s_flags & STF_VOLUME))
            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's "stream list" critical section held.

  restart_streams_on_volume:
    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 ensure 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);

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

        while (pfh != pfhEnd) {

            if (pfh->fh_hProc == hProc || hProc == NULL || hProc == INVALID_HANDLE_VALUE) {

                DEBUGMSGW(ZONE_ERRORS,(DBGTEXTW("FATFS!FAT_CloseAllFiles: file %.11hs still open by 0x%08x\r\n"), pstm->s_achOEM, pfh->fh_hProc));

                if (hProc != INVALID_HANDLE_VALUE) {
                    DEBUGMSGW(ZONE_ERRORS,(DBGTEXTW("FATFS!FAT_CloseAllFiles: closing file now (0x%08x -> 0x%08x)\r\n"), pfh, pfh->fh_h));
                    SetHandleOwner(pfh->fh_h, GetCurrentProcess());
                    VERIFYTRUE(CloseFileHandle(pfh));
                    goto restart_files_on_stream;
                }
                else {
                    DEBUGMSGW(ZONE_ERRORS,(DBGTEXTW("FATFS!FAT_CloseAllFiles: committing file now (0x%08x -> 0x%08x)\r\n"), pfh, pfh->fh_h));
                    FAT_FlushFileBuffers(pfh);
                }
            }
            pfh = pfh->fh_dlOpenHandles.pfhNext;
        }

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

    LeaveCriticalSection(&pvol->v_csStms);
    LeaveCriticalSection(&pvol->v_cs);

    DEBUGMSG(ZONE_APIS,(DBGTEXT("FATFS!FAT_CloseAllFiles returned TRUE\r\n")));
    return TRUE;
}


/*  FAT_Notify - Power off/device on notification handler
 *
 *  ENTRY
 *      pvol - pointer to VOLUME (NULL if none)
 *      dwFlags - notification flags (see FSNOTIFY_*)
 *
 *  EXIT
 *      None
 *
 *  NOTES
 *      On FSNOTIFY_POWER_OFF notification, we want to make sure that all
 *      threads currently in FATFS that could, however briefly, put the
 *      disk into an inconsistent state, complete before we return from the
 *      power-off notification.  This is accomplished by key FATFS APIs
 *      calling FATEnter and FATExit on entry and exit, so that we can (1)
 *      prevent new threads from entering, and (2) wake ourselves up when all
 *      old threads have left.
 *
 *      On FSNOTIFY_POWER_ON notification, we simply set the volume's RETAIN
 *      flag, so that the next (imminent) FSD_Deinit will not cause the
 *      PC Card folder to be deregistered.  After the FSNOTIFY_DEVICES_ON
 *      notification, DEVICE.EXE will call FSD_Deinit *again* with a special
 *      value (NULL) requesting us to completely close any volumes we no longer
 *      need to retain.
 *
 *      On FSNOTIFY_DEVICES_ON notification, we simply clear our shutdown
 *      bit and allow any threads blocked in FATEnter to proceed.  All driver(s)
 *      should once again be completely functional at that time.
 */

void FAT_Notify(PVOLUME pvol, DWORD dwFlags)
{
}


/*  FATEnter - Gates threads entering FATFS
 *
 *  ENTRY
 *      pvol - pointer to VOLUME
 *      idLog - one of the LOGID_* equates
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (SetLastError is already set)
 *
 *
 *  QUALIFICATIONS
 *      This is currently called only on every FATFS API entry point that
 *      could possibly generate I/O (with the exception of commit/close).  If
 *      a thread slips into GetFileTime, for example, who cares?  This could be
 *      restricted even further, and called only on entry points that could
 *      possibly generate WRITES, but since we ALSO want to ensure that shutdowns
 *      are timely (as well as safe), preventing as much I/O as possible seems
 *      worthwhile.
 *

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲制服丝袜av| 国产欧美日韩亚州综合| av亚洲精华国产精华精| 国产一区在线看| 久久99久久精品| 久草中文综合在线| 精品亚洲porn| 国产精品1区二区.| 成人激情av网| 色综合久久六月婷婷中文字幕| 99久久精品国产麻豆演员表| 成人激情校园春色| 99re这里只有精品6| 欧美视频中文一区二区三区在线观看| 91久久国产综合久久| 欧美性欧美巨大黑白大战| 欧美日韩成人一区| 日韩视频一区二区三区| 久久综合国产精品| 亚洲欧洲av色图| 亚洲午夜精品一区二区三区他趣| 午夜精品久久久久久| 蜜桃视频一区二区三区在线观看| 国产一区二区三区视频在线播放| 成人午夜私人影院| 欧美揉bbbbb揉bbbbb| 欧美成人精品1314www| 国产精品热久久久久夜色精品三区 | 亚洲男帅同性gay1069| 亚洲国产一区二区a毛片| 青娱乐精品在线视频| 国产成人在线视频网址| 日本道在线观看一区二区| 欧美日韩电影一区| 亚洲国产精品激情在线观看| 亚洲伊人色欲综合网| 国产麻豆精品theporn| 色综合视频在线观看| 日韩一区二区视频在线观看| 国产精品三级视频| 日韩经典中文字幕一区| 国产精一区二区三区| 欧美午夜理伦三级在线观看| 久久亚洲精品小早川怜子| 亚洲综合色视频| 国产精品自在在线| 91麻豆精品国产91久久久使用方法| 久久精品一区蜜桃臀影院| 亚洲小少妇裸体bbw| 粉嫩av一区二区三区| 日韩一区国产二区欧美三区| 中文字幕字幕中文在线中不卡视频| 日韩精品成人一区二区三区| 色综合天天综合给合国产| 精品人伦一区二区色婷婷| 亚洲综合999| av在线一区二区三区| 久久综合精品国产一区二区三区| 亚洲高清视频的网址| www.色精品| 国产三级欧美三级| 久久9热精品视频| 777奇米成人网| 亚洲国产精品久久艾草纯爱| 不卡视频在线看| 久久精品视频在线看| 黑人巨大精品欧美一区| 国产精品欧美精品| 看片网站欧美日韩| 91精品国产福利在线观看| 亚洲一区二区三区自拍| 色域天天综合网| 亚洲视频在线观看一区| 北岛玲一区二区三区四区| 国产人妖乱国产精品人妖| 久久国产成人午夜av影院| 欧美一级二级三级乱码| 日本怡春院一区二区| 欧美性一区二区| 香蕉乱码成人久久天堂爱免费| 91九色最新地址| 亚洲成va人在线观看| 欧美日韩免费视频| 日韩精品亚洲一区| 欧美大胆人体bbbb| 国内精品第一页| 国产欧美视频在线观看| 成人sese在线| 一区二区成人在线| 欧美日韩一区二区三区四区| 日韩国产欧美在线观看| 日韩欧美在线网站| 国产麻豆日韩欧美久久| 国产精品毛片大码女人| 91免费观看视频| 亚洲第一在线综合网站| 日韩欧美一区二区久久婷婷| 国产一区二区免费在线| 亚洲视频在线观看三级| 欧美日韩视频在线观看一区二区三区| 日韩国产精品大片| 久久精品亚洲国产奇米99| 99久久精品一区二区| 亚洲综合免费观看高清完整版在线| 在线观看国产91| 色婷婷综合久久久久中文一区二区 | 日韩一级在线观看| 国产乱码精品一区二区三区av| 国产精品国产三级国产a | 日韩欧美亚洲国产另类| 风间由美性色一区二区三区| 亚洲在线视频免费观看| 26uuuu精品一区二区| 91女厕偷拍女厕偷拍高清| 日产精品久久久久久久性色| 国产精品久久久久久妇女6080| 欧美日韩黄视频| 成人精品电影在线观看| 石原莉奈一区二区三区在线观看| 亚洲国产高清aⅴ视频| 欧美日韩中文一区| 成人av电影在线| 裸体一区二区三区| 国产精品456| 午夜视频久久久久久| 日本一区二区三区高清不卡| 欧美精品日韩精品| 91亚洲精品久久久蜜桃网站| 国模套图日韩精品一区二区| 亚洲国产一区二区三区| 成人免费小视频| 久久精品亚洲国产奇米99| 91精品国产福利在线观看| 日本丶国产丶欧美色综合| 成人午夜视频在线| 国产一二精品视频| 奇米一区二区三区av| 亚洲狠狠爱一区二区三区| 亚洲欧美一区二区久久| 国产婷婷精品av在线| 精品国产99国产精品| 欧美一级黄色录像| 欧美三级日韩三级| 日本高清不卡aⅴ免费网站| 成人精品亚洲人成在线| 国产在线一区二区| 精品一区二区三区免费| 日一区二区三区| 亚洲成人1区2区| 亚洲一区在线观看网站| 狠狠色丁香九九婷婷综合五月| 青青草一区二区三区| 日本视频中文字幕一区二区三区| 亚洲国产日韩在线一区模特 | 91福利视频网站| 色又黄又爽网站www久久| jiyouzz国产精品久久| 东方欧美亚洲色图在线| 成人综合婷婷国产精品久久蜜臀| 精品一区二区三区视频在线观看| 狠狠色狠狠色综合系列| 国产精一区二区三区| 高清av一区二区| 91视频免费观看| 在线观看一区日韩| 欧美丝袜丝nylons| 91精品国产综合久久精品麻豆| 欧美美女bb生活片| 精品精品欲导航| 欧美激情在线看| 樱桃国产成人精品视频| 婷婷丁香久久五月婷婷| 久久精品国产一区二区| 国产aⅴ综合色| 91色porny| 91精品国产手机| 久久人人爽人人爽| 亚洲精品成人少妇| 日本亚洲最大的色成网站www| 精品一区二区在线免费观看| 成人午夜视频网站| 欧美视频你懂的| 精品1区2区在线观看| 日韩不卡一区二区三区| 韩国女主播成人在线| 97se亚洲国产综合自在线| 欧美日韩aaaaaa| 久久综合九色综合97婷婷女人| 亚洲日韩欧美一区二区在线| 日韩电影在线一区二区三区| 国产精品77777| 欧美久久免费观看| 中文字幕av在线一区二区三区| 亚洲一区在线看| 成人免费黄色大片| 欧美一区日韩一区| 亚洲久草在线视频| 国产一区二区成人久久免费影院 | 欧美精品三级在线观看| 国产女主播一区|