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

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

?? init.c

?? 可用于嵌入式編程學習
?? C
字號:
/*++

Copyright (c) 1997-2000 Microsoft Corporation.  All rights reserved.

Module Name:

    init.c

Abstract:

    This file contains the FSDMGR initialization/deinitialization entry
    points that initiate the loading/unloading other installable file
    system drivers (ie, FSDs such as FATFS.DLL).

    DEVICE.EXE still loads v1 and v2 FSDs and communicates with them via
    their FSD_Init and FSD_Deinit exports, but it also supports new FSDs
    indirectly via this new "FSD Manager", named FSDMGR.DLL.

    DEVICE.EXE detects a new FSD by the existence of an FSD_MountDisk export.
    In that case, it loads FSDMGR.DLL (if it hasn't already), and notifies
    FSDMGR_InitEx of (1) the module handle of the new FSD, and (2) the name
    of the new device (eg, "DSK1").

    FSDMGR.DLL interacts with the new FSD (XXX.DLL) through the following
    interfaces, which XXX.DLL must export:

      XXX_MountDisk(PDSK pDsk)

        Mounts the specified disk, returning TRUE if success, FALSE if error.
        The FSD must be able to cope with this call being issued redundantly
        (ie, it must determine from the media itself, not the uniqueness of
        the given DSK pointer, whether or not this disk has already been mounted).
        This is due to the nature of removable media and the fact that media
        may or may not have been removed -- or may have changed slots -- while
        the system was powered off.

        All I/O to the disk must be performed via calls to FSDMGR_ReadDisk and
        FSDMGR_WriteDisk in FSDMGR.DLL.  Similarly, FSDMGR_RegisterVolume should
        be used to register each volume present on the disk with the file system.

        Note that this function must also be exported as "FSD_MountDisk".

      XXX_UnmountDisk(PDSK pDsk)

        Unmounts the specified disk.  Returns TRUE if XXX.DLL successfully
        unmounted the disk, FALSE if not.  A requirement of returning
        TRUE is that all volumes on the disk previously registered with
        FSDMGR_RegisterVolume must first be deregistered with FSDMGR_DeregisterVolume.

        Note that this function must also be exported as "FSD_UnmountDisk".

    These rest of these exports define the functionality of the FSD.  Any
    function not exported is replaced with a stub function in FSDMGR that returns
    failure.

      XXX_CloseVolume
      XXX_CreateDirectoryW
      XXX_RemoveDirectoryW
      XXX_GetFileAttributesW
      XXX_SetFileAttributesW
      XXX_DeleteFileW
      XXX_MoveFileW
      XXX_DeleteAndRenameFileW (formerly known as "PrestoChangoFileName")
      XXX_GetDiskFreeSpaceW (formerly known as "GetDiskFreeSpace")
      XXX_Notify
      XXX_RegisterFileSystemFunction
      XXX_CreateFileW
      XXX_CloseFile
      XXX_ReadFile
      XXX_WriteFile
      XXX_GetFileSize
      XXX_SetFilePointer
      XXX_GetFileInformationByHandle
      XXX_FlushFileBuffers
      XXX_GetFileTime
      XXX_SetFileTime
      XXX_SetEndOfFile
      XXX_DeviceIoControl
      XXX_ReadFileWithSeek
      XXX_WriteFileWithSeek
      XXX_FindFirstFileW
      XXX_FindNextFileW
      XXX_FindClose

    There are also some noteworthy omissions.  We neither look for nor install handlers
    for the following APIs because they were not supported after v1.0:

      XXX_CeRegisterFileSystemNotification

    Similarly, the following APIs were not supported after v2.0:

      XXX_CeOidGetInfo

    And last but not least, XXX_CloseAllFiles is not supported because FSDMGR.DLL can
    enumerate all known handles for a given process and call XXX_CloseFile, eliminating
    the need for a special process termination handler.

--*/

#include "fsdmgrp.h"


/*  Globals
 */

HINSTANCE   hDLL;               // module handle of this DLL
HANDLE      hAFSAPI;
HANDLE      hFileAPI;
HANDLE      hFindAPI;
FSD_DLINK   dlFSDList;          // global FSD list
CRITICAL_SECTION csFSD;         // global CS for this DLL



/*  FSDMGR_InitEx - Entry point for DEVICE.EXE to initialize new FSD
 *
 *  ENTRY
 *      hFSD == handle to new FSD
 *      pwsDsk -> disk name
 *      pReserved == NULL (reserved for future use)
 *
 *  EXIT
 *      Pointer to internal DSK structure if successful, NULL if error
 *
 *  NOTES
 *      When DEVICE.EXE initializes an old-style FSD directly, it keeps
 *      track of how many devices the FSD claims to be managing.
 *
 *      DEVICE.EXE maintains a similar count for devices passed to FSDMGR,
 *      so for each device, we allocate a DSK structure and make sure we
 *      report a NEW (as opposed to REMOUNTED) DSK only once.
 *
 *      This function assumes it is single-thread in virtue of the fact that
 *      DEVICE.EXE is single-threaded when it calls it.
 */

PDSK FSDMGR_InitEx(HANDLE hFSD, PCWSTR pwsDsk, LPVOID pReserved)
{
    PFSD pFSD;
    PDSK pDsk;

    DEBUGMSGW(ZONE_INIT, (DBGTEXTW("FSDMGR_InitEx: initializing FSD for %s\n"), pwsDsk));

	
//    LoadLibrary(L"FSDMGR.DLL");

    pFSD = AllocFSD(hFSD);
    pDsk = AllocDisk(pFSD, pwsDsk);

    if (pDsk)
        FSDMGR_GetDiskInfo(pDsk, &pDsk->fdi);

    if (pFSD && pDsk && pFSD->pfnMountDisk(pDsk)) {
        ASSERT(VALIDSIG(pFSD, FSD_SIG) && VALIDSIG(pDsk, DSK_SIG));
        UnmarkDisk(pDsk, DSK_UNCERTAIN);
    }
    else {
        if (pDsk) {
            DeallocDisk(pDsk);
            pDsk = NULL;
        }
        if (pFSD) {
            DeallocFSD(pFSD);
            pFSD = NULL;
        }
    }

    // Here's where we indicate to DEVICE.EXE whether or not the disk
    // is being remounted; make sure you don't dereference pDsk past this
    // point.

    if (pDsk && (pDsk->dwFlags & DSK_REMOUNTED))
        (DWORD)pDsk |= DSK_REMOUNTED;

    DEBUGMSG(ZONE_INIT, (DBGTEXT("FSDMGR_InitEx returned 0x%x\n"), pDsk));
    return pDsk;
}


/*  FSDMGR_DeinitEx - Entry point for DEVICE.EXE to deinitialize new FSD
 *
 *  ENTRY
 *      pDsk -> DSK structure, or NULL to deinit all disks that are no
 *      longer present (ie, whose UNCERTAIN bit is still set)
 *
 *  EXIT
 *      TRUE if the specified DSK structure has been freed, FALSE if not;
 *      or, if no DSK structure was specified, we return the number of DSKs
 *      we were able to free.
 *
 *  NOTES
 *      This function assumes it is single-thread in virtue of the fact that
 *      DEVICE.EXE is single-threaded when it calls it.
 */

int FSDMGR_DeinitEx(PDSK pDsk)
{
    PFSD pFSD;
    int cDisks = 0;

    DEBUGMSGW(ZONE_INIT, (DBGTEXTW("FSDMGR_DeinitEx(0x%x): deinit'ing FSD for %s\n"), pDsk, pDsk? ((PDSK)((DWORD)pDsk & ~0x1))->wsDsk : TEXTW("all disks")));

    // We intercept the FSNOTIFY_POWER_ON notification that all volumes
    // receive and mark their respective DSK structures as UNCERTAIN.
    //
    // Afterward, FSDMGR_DeinitEx will start getting called for every disk
    // in the system, which we will simply ignore for UNCERTAIN disks (EXCEPT
    // to close their handle, because that puppy's dead as far as DEVICE.EXE
    // is concerned).
    //
    // Then we will start getting FSDMGR_InitEx calls for disks still present;
    // those should turn into XXX_MountDisk calls and the corresponding
    // UNCERTAIN bits cleared.  Then, finally, when we get FSNOTIFY_DEVICES_ON,
    // we need to locate disks still marked UNCERTAIN and call XXX_UnmountDisk.

    if (pDsk == NULL) {

        // We get this call *after* FSNOTIFY_DEVICES_ON; ie, it's the last major
        // event we get after the system has been reinitialized.  So let's walk all
        // the disk structures and call XXX_UnmountDisk for any disk still marked
        // UNCERTAIN.  Of course, the FSD is free to decline (eg, if there's still
        // open files in volumes on the disk).

loop1:  pFSD = dlFSDList.pFSDNext;
        while (pFSD != (PFSD)&dlFSDList) {
            ASSERT(VALIDSIG(pFSD, FSD_SIG));

loop2:      pDsk = pFSD->dlDskList.pDskNext;
            while (pDsk != (PDSK)&pFSD->dlDskList) {
                ASSERT(VALIDSIG(pDsk, DSK_SIG));

                if (pDsk->dwFlags & DSK_UNCERTAIN) {
                    if (pFSD->pfnUnmountDisk(pDsk)) {
                        if (DeallocDisk(pDsk))
                            cDisks++;
                        goto loop2;
                    }
                }
                pDsk = pDsk->dlDsk.pDskNext;
            }

            // We call DeallocFSD just in case all the disks attached
            // to the FSD were freed;  if they weren't, nothing changes.

            if (DeallocFSD(pFSD))
                goto loop1;
            pFSD = pFSD->dlFSD.pFSDNext;
        }
        DEBUGONLY(pDsk = NULL); // just for the benefit of my DEBUGMSG below
    }
    else {
        (DWORD)pDsk &= ~DSK_REMOUNTED;
        ASSERT(VALIDSIG(pDsk, DSK_SIG));

        // At the point where DEVICE.EXE issues this notification (inside
        // DeregisterDevice), our disk handle has already been close.  Note
        // that even if it hadn't been, there's no guarantee the driver would
        // be in any condition to respond, since we could be coming back up
        // from a powered-down state *or* the device may have been removed.
        // So it's perfectly reasonable to unconditionally mark the disk closed.

        MarkDisk(pDsk, DSK_CLOSED);

        if (!(pDsk->dwFlags & DSK_UNCERTAIN)) {

            pFSD = pDsk->pFSD;
            ASSERT(VALIDSIG(pFSD, FSD_SIG));

            if (pFSD->pfnUnmountDisk(pDsk)) {

                // Note that, despite XXX_UnmountDisk's apparent success,
                // DeallocDisk still won't deallocate the disk if it still has
                // volumes attached.

                if (DeallocDisk(pDsk))
                    cDisks++;

                // Similarly, DeallocFSD won't actually deallocate the FSD if it
                // still has disks attached.

                DeallocFSD(pFSD);
            }
        }
    }

    DEBUGMSG(ZONE_INIT, (DBGTEXT("FSDMGR_DeinitEx(0x%x) returned %d\n"), pDsk, cDisks));
    return cDisks;
}


/*  FSDMGR_Attach - DLL_PROCESS_ATTACH handler
 *
 *  ENTRY
 *      None
 *
 *  EXIT
 *      TRUE if successful, FALSE if not.  Most failures can probably
 *      be attributed to insufficient memory.
 *
 *  NOTES
 *      This is assumed to be protected by a critical section.  Since it's
 *      currently called only by FSDMGR_Main, we are protected by the loader's
 *      critical section.
 */

BOOL FSDMGR_Attach()
{
    DEBUGREGISTER(hDLL);

    InitList((PDLINK)&dlFSDList);
    InitializeCriticalSection(&csFSD);

    hAFSAPI = CreateAPISet("PFSD", ARRAY_SIZE(apfnAFSAPIs), apfnAFSAPIs, asigAFSAPIs);
    hFileAPI = CreateAPISet("HFSD", ARRAY_SIZE(apfnFileAPIs), apfnFileAPIs, asigFileAPIs);
    RegisterAPISet(hFileAPI, HT_FILE | REGISTER_APISET_TYPE);
    hFindAPI = CreateAPISet("FFSD", ARRAY_SIZE(apfnFindAPIs), apfnFindAPIs, asigFindAPIs);
    RegisterAPISet(hFindAPI, HT_FIND | REGISTER_APISET_TYPE);

    return hAFSAPI && hFileAPI && hFindAPI;
}


/*  FSDMGR_Detach - DLL_PROCESS_DETACH handler
 *
 *  ENTRY
 *      None
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (currently, always successful)
 *
 *  NOTES
 *      This is assumed to be protected by a critical section.  Since it's
 *      currently called only by FSDMGR_Main, we are protected by the loader's
 *      critical section.
 */

BOOL FSDMGR_Detach(void)
{
    CloseHandle(hFindAPI);
    CloseHandle(hFileAPI);
    CloseHandle(hAFSAPI);
    DeleteCriticalSection(&csFSD);
    return TRUE;
}


/*  FSDMGR_Main - FSDMGR.DLL initialization entry point
 *
 *  ENTRY
 *      DllInstance == DLL module handle
 *      Reason == DLL_* initialization message
 *      pReserved == NULL (reserved for future use)
 *
 *  EXIT
 *      TRUE if successful, FALSE if not.  Most failures can probably
 *      be attributed to insufficient memory.
 */

BOOL WINAPI FSDMGR_Main(HINSTANCE DllInstance, INT Reason, LPVOID pReserved)
{
    switch(Reason) {

    case DLL_PROCESS_ATTACH:
        DEBUGMSG(ZONE_INIT, (DBGTEXT("FSDMGR_Main: DLL_PROCESS_ATTACH\n")));
        hDLL = DllInstance;
        return FSDMGR_Attach();

    case DLL_PROCESS_DETACH:
        DEBUGMSG(ZONE_INIT, (DBGTEXT("FSDMGR_Main: DLL_PROCESS_DETACH\n")));
        return FSDMGR_Detach();

    default:
      //DEBUGMSG(ZONE_INIT, (DBGTEXT("FSDMGR_Main: Reason #%d ignored\n"), Reason));
        break;
    }
    return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美伊人久久久久久久久影院 | 91在线视频网址| 水蜜桃久久夜色精品一区的特点| 成人免费小视频| 国产日产精品1区| 亚洲国产高清在线观看视频| 久久精品欧美日韩| 国产亚洲美州欧州综合国| 精品国精品自拍自在线| 欧美不卡一区二区三区四区| 欧美一级黄色片| 精品久久久久一区二区国产| 2欧美一区二区三区在线观看视频| 精品少妇一区二区三区视频免付费| 欧美一区二区成人| 欧美xfplay| 国产精品网站一区| 亚洲专区一二三| 亚洲成人动漫av| 免费看精品久久片| 国产91露脸合集magnet| 一本久久综合亚洲鲁鲁五月天| 91国偷自产一区二区三区观看| 91高清视频免费看| 亚洲精品一区二区三区在线观看| 日本一区二区三区免费乱视频 | zzijzzij亚洲日本少妇熟睡| 91美女片黄在线观看| 欧美精品日韩精品| 久久精品亚洲精品国产欧美kt∨ | 色婷婷精品久久二区二区蜜臀av| 在线视频国内自拍亚洲视频| 91.xcao| 国产亚洲一区二区三区四区| 国产精品久久久久影院色老大| 亚洲国产视频网站| 国产999精品久久久久久绿帽| 久久99精品一区二区三区三区| 国产激情精品久久久第一区二区| 91丝袜美女网| 欧美精品一区视频| 亚洲小少妇裸体bbw| 国产一区二区免费视频| 欧美丝袜丝nylons| 中文字幕精品一区| 日韩综合在线视频| 93久久精品日日躁夜夜躁欧美| 日韩精品一区二区三区三区免费 | 91福利资源站| 久久香蕉国产线看观看99| 亚洲欧美日韩久久精品| 激情综合色丁香一区二区| 91啦中文在线观看| 国产视频一区二区三区在线观看 | 日本不卡一区二区| 成人自拍视频在线观看| 91精品国产综合久久久久久久久久| 中文字幕av一区二区三区| 日韩av在线发布| 欧美色综合网站| 亚洲精品国产一区二区精华液| 国产一区在线视频| 日韩一区二区精品| 亚洲成人资源在线| 欧美日韩免费观看一区二区三区| 国产精品久久777777| 国产乱一区二区| 日韩欧美中文字幕一区| 亚洲成av人片在线| 欧美日韩综合一区| 亚洲午夜免费视频| 欧美在线免费播放| 一片黄亚洲嫩模| 一道本成人在线| 亚洲色图丝袜美腿| 91老师国产黑色丝袜在线| 国产精品不卡一区| 97久久久精品综合88久久| 国产无遮挡一区二区三区毛片日本| 免费成人结看片| 91精品欧美综合在线观看最新| 日韩avvvv在线播放| 91精品蜜臀在线一区尤物| 日韩激情视频在线观看| 欧美美女网站色| 蜜桃视频一区二区三区| 日韩女优电影在线观看| 另类小说图片综合网| 精品国产99国产精品| 国产乱码精品一品二品| 欧美激情一区二区三区在线| 成人精品高清在线| 亚洲综合无码一区二区| 欧美亚洲国产怡红院影院| 亚洲一区在线免费观看| 91麻豆精品国产91久久久久| 久久精品噜噜噜成人88aⅴ| 26uuu国产在线精品一区二区| 国产乱人伦精品一区二区在线观看| 亚洲国产精品精华液ab| aaa亚洲精品一二三区| 午夜视频在线观看一区二区三区| 欧美一区二区三区男人的天堂| 国产一区二区三区综合| 中文一区二区在线观看| 欧美主播一区二区三区美女| 日韩中文字幕亚洲一区二区va在线| 日韩视频123| 成人免费高清在线| 日韩电影一区二区三区四区| 国产午夜精品一区二区| 欧美美女喷水视频| 国产一区二区三区香蕉| 亚洲色图在线播放| 精品国产污网站| 一本大道综合伊人精品热热| 美女任你摸久久| 国产精品成人网| 欧美久久高跟鞋激| 成人国产精品免费观看视频| 亚洲丰满少妇videoshd| 中文字幕av一区二区三区| 欧美精品视频www在线观看| 国产99久久久国产精品免费看| 日本最新不卡在线| 一区二区免费视频| 久久精品水蜜桃av综合天堂| 91视视频在线直接观看在线看网页在线看 | 欧美精品乱码久久久久久| 国产中文字幕精品| 亚洲成av人片在线观看| 亚洲欧洲成人自拍| 精品国产sm最大网站| 555夜色666亚洲国产免| 91浏览器入口在线观看| 国产自产高清不卡| 日产精品久久久久久久性色| 亚洲精品成人精品456| 国产精品理论在线观看| 日韩精品一区二区三区四区| 欧美午夜电影网| 91福利视频网站| 91首页免费视频| 成人av资源在线| 国产在线看一区| 激情小说欧美图片| 激情欧美日韩一区二区| 青青草成人在线观看| 亚洲成人精品一区二区| 五月天激情综合| 午夜日韩在线电影| 亚洲6080在线| 婷婷夜色潮精品综合在线| 亚洲成年人影院| 三级不卡在线观看| 丝袜美腿亚洲一区二区图片| 夜夜精品浪潮av一区二区三区| 亚洲欧美自拍偷拍色图| 综合电影一区二区三区| 国产精品第五页| 最新国产精品久久精品| 亚洲日本va午夜在线影院| 一区二区三区视频在线观看| 自拍偷在线精品自拍偷无码专区| 中国色在线观看另类| 成人欧美一区二区三区视频网页| 中文字幕亚洲不卡| 亚洲欧美偷拍另类a∨色屁股| 亚洲欧洲无码一区二区三区| 一区二区三区在线观看欧美| 亚洲国产成人精品视频| 青青草91视频| 精品系列免费在线观看| 不卡视频免费播放| 欧美揉bbbbb揉bbbbb| 日韩一级在线观看| 久久久99免费| 亚洲免费观看高清完整版在线| 亚洲一区二区三区影院| 美女一区二区久久| 国产精品一区二区不卡| 色欧美88888久久久久久影院| 欧美丰满美乳xxx高潮www| 欧美成人在线直播| 国产精品久久久久久久久图文区 | 青青青爽久久午夜综合久久午夜| 男人操女人的视频在线观看欧美| 精品无人码麻豆乱码1区2区 | 日日夜夜精品视频天天综合网| 久久99精品久久久久久| 北条麻妃国产九九精品视频| 欧美日韩精品欧美日韩精品 | 自拍偷拍国产亚洲| 日本欧美加勒比视频| 丁香五精品蜜臀久久久久99网站| 一本大道av伊人久久综合| 日韩欧美黄色影院| 亚洲美腿欧美偷拍| 国产成人av福利| 欧美日本国产视频|