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

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

?? alloc.c

?? windows ce 3.00 嵌入式操作系統源代碼
?? C
字號:
/*++

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

Module Name:

    alloc.c

Abstract:

    This file handles the creation/destruction of all FSDMGR data
    structures (ie, FSDs, DSKs, VOLs and HDLs).

--*/

#include "fsdmgrp.h"


/*  AllocFSD - Allocate FSD structure and obtain FSD entry points
 *
 *  ENTRY
 *      hFSD == handle to new FSD
 *
 *  EXIT
 *      Pointer to internal FSD structure, or NULL if out of memory or
 *      FSD entry points could not be obtained (use GetLastError if you really
 *      want to know the answer).
 */

PFSD AllocFSD(HANDLE hFSD)
{
    PFSD pFSD;
	DWORD cb;
	WCHAR baseName[MAX_FSD_NAME_SIZE];

    pFSD = dlFSDList.pFSDNext;
    while (pFSD != (PFSD)&dlFSDList) {
        if (CompareFSDs(pFSD->hFSD, hFSD))
            break;
        pFSD = pFSD->dlFSD.pFSDNext;
    }

    if (pFSD != (PFSD)&dlFSDList) {

        // This FSD has already been loaded once, which means we no
        // longer need the current handle reference.

        FreeLibrary(hFSD);
    }
    else {

        // This is a new FSD, so allocate a structure for it and save the handle.

		if (GetProcAddress(hFSD, L"FSD_CreateFileW"))
		{
			/* this guy uses simply FSD_ as a function prefix */
			wcscpy(baseName, L"FSD_");
		}
		else
		{
        DWORD cch, i;
        WCHAR wsTmp[MAX_PATH];

			/* derive the function prefix from the module's name. This is
			 * a tricky step, since the letter case of the module name must
			 * match the function prefix within the DLL.
			 */

            cch = GetModuleFileName(hFSD, wsTmp, ARRAY_SIZE(wsTmp));
            if (cch)
            {
                PWSTR pwsTmp = &wsTmp[cch];
                while (pwsTmp != wsTmp)
                {
                    pwsTmp--;
                    if (*pwsTmp == '\\' || *pwsTmp == '/')
                    {
                		pwsTmp++;
                		break;
            		}
        		}

        		i = 0;
        		while (*pwsTmp && *pwsTmp != '.' && i < ARRAY_SIZE(baseName)-2)
            		baseName[i++] = *pwsTmp++;

        	    baseName[i]   = L'_';
			    baseName[i+1] = 0;
			}
			else
			{
				return NULL;
			}
		}

        cb = (wcslen(baseName) + 1) * sizeof(baseName[0]);

        pFSD = (PFSD)LocalAlloc(LPTR, sizeof(FSD) - (sizeof(pFSD->wsFSD) - cb));

        if (pFSD) {
            INITSIG(pFSD, FSD_SIG);
            InitList((PDLINK)&pFSD->dlDskList);
            AddListItem((PDLINK)&dlFSDList, (PDLINK)&pFSD->dlFSD);
            pFSD->hFSD = hFSD;
			memcpy(pFSD->wsFSD, baseName, cb);
        }
        else
            DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FSDMGR!AllocFSD: out of memory!\n")));
    }

    if (pFSD) {
        if (!pFSD->pfnMountDisk || !pFSD->pfnUnmountDisk) {
            pFSD->pfnMountDisk = (PFNMOUNTDISK)GetFSDProcAddress(pFSD, TEXT("MountDisk"));
            pFSD->pfnUnmountDisk = (PFNMOUNTDISK)GetFSDProcAddress(pFSD, TEXT("UnmountDisk"));
        }
        if (!pFSD->pfnMountDisk || !pFSD->pfnUnmountDisk) {
            DeallocFSD(pFSD);
            pFSD = NULL;
        }
    }

    return pFSD;
}


/*  DeallocFSD - Deallocate FSD structure
 *
 *  ENTRY
 *      pFSD -> FSD
 *
 *  EXIT
 *      TRUE is FSD was successfully deallocated, FALSE if not (eg, if the FSD
 *      structure still has some DSK structures attached to it).
 */

BOOL DeallocFSD(PFSD pFSD)
{
    ASSERT(VALIDSIG(pFSD, FSD_SIG));

    if (IsListEmpty((PDLINK)&pFSD->dlDskList)) {
        FreeLibrary(pFSD->hFSD);
        RemoveListItem((PDLINK)&pFSD->dlFSD);
        LocalFree((HLOCAL)pFSD);
        return TRUE;
    }
    return FALSE;
}


/*  AllocDisk - Allocate DSK structure for an FSD
 *
 *  ENTRY
 *      pFSD -> FSD structure
 *      pwsDsk -> disk name
 *      dwFlags == intial disk flags
 *
 *  EXIT
 *      Pointer to internal DSK structure, or NULL if out of memory
 */

PDSK AllocDisk(PFSD pFSD, PCWSTR pwsDsk)
{
    PDSK pDsk;
    DWORD dwFlags = DSK_NONE;
    HANDLE hDsk = INVALID_HANDLE_VALUE;

    if (pFSD == NULL)
        return NULL;

    pDsk = pFSD->dlDskList.pDskNext;
    while (pDsk != (PDSK)&pFSD->dlDskList) {
        if (wcscmp(pDsk->wsDsk, pwsDsk) == 0) {
            hDsk = pDsk->hDsk;
            dwFlags = (pDsk->dwFlags | DSK_REMOUNTED) & ~(DSK_CLOSED);
            break;
        }
        pDsk = pDsk->dlDsk.pDskNext;
    }

    if (hDsk == INVALID_HANDLE_VALUE) {
        hDsk = CreateFileW(pwsDsk,
                           GENERIC_READ | GENERIC_WRITE,
                           0,
                           NULL, OPEN_EXISTING, 0, NULL);

        if (hDsk != INVALID_HANDLE_VALUE)
            dwFlags &= ~DSK_READONLY;
        else if (GetLastError() == ERROR_ACCESS_DENIED) {
            hDsk = CreateFileW(pwsDsk,
                               GENERIC_READ,
                               FILE_SHARE_READ,
                               NULL, OPEN_EXISTING, 0, NULL);
            if (hDsk != INVALID_HANDLE_VALUE)
                dwFlags |= DSK_READONLY;
        }
    }

    if (hDsk == INVALID_HANDLE_VALUE) {
        DEBUGMSGW(ZONE_INIT || ZONE_ERRORS, (DBGTEXTW("FSDMGR!AllocDisk: CreateFile(%s) failed (%d)\n"), pwsDsk, GetLastError()));
        return NULL;
    }

    if (pDsk == (PDSK)&pFSD->dlDskList) {

        // We take a look at the actual length of the disk name and
        // reduce the size of the FSD structure by "sizeof(wsDsk)-cb".

        DWORD cb = (wcslen(pwsDsk) + 1) * sizeof(pwsDsk[0]);

        pDsk = (PDSK)LocalAlloc(LPTR, sizeof(DSK) - (sizeof(pDsk->wsDsk)-cb));

        if (pDsk) {
            INITSIG(pDsk, DSK_SIG);
            InitList((PDLINK)&pDsk->dlVolList);
            AddListItem((PDLINK)&pFSD->dlDskList, (PDLINK)&pDsk->dlDsk);
            pDsk->pFSD = pFSD;
            memcpy(pDsk->wsDsk, pwsDsk, cb);
        }
        else {
            DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FSDMGR!AllocDisk: out of memory!\n")));
            CloseHandle(hDsk);
        }
    }

    if (pDsk) {
        pDsk->hDsk = hDsk;
        pDsk->dwFlags = dwFlags;
    }

    return pDsk;
}


/*  MarkDisk - Mark a DSK structure with one or more flags
 *
 *  ENTRY
 *      pDsk -> DSK structure
 *      dwFlags == one or flags to mark (see DSK_*)
 *
 *  EXIT
 *      None
 */

void MarkDisk(PDSK pDsk, DWORD dwFlags)
{
    ASSERT(VALIDSIG(pDsk, DSK_SIG));

    pDsk->dwFlags |= dwFlags;
    if (pDsk->dwFlags & DSK_CLOSED) {
        CloseHandle(pDsk->hDsk);
        pDsk->hDsk = INVALID_HANDLE_VALUE;
    }
}


/*  UnmarkDisk - Unmark a DSK structure with one or more flags
 *
 *  ENTRY
 *      pDsk -> DSK structure
 *      dwFlags == one or flags to unmark (see DSK_*)
 *
 *  EXIT
 *      None
 */

void UnmarkDisk(PDSK pDsk, DWORD dwFlags)
{
    ASSERT(VALIDSIG(pDsk, DSK_SIG));

    pDsk->dwFlags &= ~dwFlags;
}


/*  DeallocDisk - Deallocate DSK structure
 *
 *  ENTRY
 *      pDsk -> DSK structure
 *
 *  EXIT
 *      TRUE is DSK was successfully deallocated, FALSE if not (eg, if the DSK
 *      structure still has some VOL structures attached to it).
 */

BOOL DeallocDisk(PDSK pDsk)
{
    ASSERT(VALIDSIG(pDsk, DSK_SIG));

    if (IsListEmpty((PDLINK)&pDsk->dlVolList)) {
        if (pDsk->hDsk != INVALID_HANDLE_VALUE)
            CloseHandle(pDsk->hDsk);
        RemoveListItem((PDLINK)&pDsk->dlDsk);
        LocalFree((HLOCAL)pDsk);
        return TRUE;
    }
    return FALSE;
}


/*  AllocVolume - Allocate VOL structure for a DSK
 *
 *  ENTRY
 *      pDSK -> DSK structure
 *      dwVolData == FSD-defined volume data
 *
 *  EXIT
 *      Pointer to internal VOL structure, or NULL if out of memory
 */

PVOL AllocVolume(PDSK pDsk, DWORD dwVolData)
{
    PVOL pVol;

    ASSERT(OWNCRITICALSECTION(&csFSD));

    if (pDsk == NULL)
        return NULL;

    pVol = pDsk->dlVolList.pVolNext;
    while (pVol != (PVOL)&pDsk->dlVolList) {
        if (pVol->dwVolData == dwVolData)
            break;
        pVol = pVol->dlVol.pVolNext;
    }

    if (pVol == (PVOL)&pDsk->dlVolList) {

        // This is a new VOL...

        pVol = (PVOL)LocalAlloc(LPTR, sizeof(VOL));

        if (pVol) {
            INITSIG(pVol, VOL_SIG);
            InitList((PDLINK)&pVol->dlHdlList);
            AddListItem((PDLINK)&pDsk->dlVolList, (PDLINK)&pVol->dlVol);
            pVol->pDsk = pDsk;
            pVol->dwVolData = dwVolData;
            pVol->iAFS = INVALID_AFS;
                        pVol->hevPowerUp  = CreateEvent(NULL, TRUE, TRUE, NULL);
            pVol->hevPowerDown = CreateEvent(NULL, FALSE, FALSE, NULL);
        }
        else
            DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FSDMGR!AllocVolume: out of memory!\n")));
    }

    return pVol;
}


/*  DeallocVolume - Deallocate VOL structure
 *
 *  ENTRY
 *      pVol -> VOL structure
 *
 *  EXIT
 *      TRUE is VOL was successfully deallocated, FALSE if not (eg, if the VOL
 *      structure still has some HDL structures attached to it).
 *
 *      Currently, we never fail this function.  If handles are still attached to
 *      the volume, we forcibly close them;  that decision may need to be revisited....
 */

BOOL DeallocVolume(PVOL pVol)
{
    ASSERT(VALIDSIG(pVol, VOL_SIG) && OWNCRITICALSECTION(&csFSD));

    if (pVol->iAFS != INVALID_AFS)
        return FALSE;

    while (TRUE) {
        PHDL pHdl = pVol->dlHdlList.pHdlNext;
        if (pHdl == (PHDL)&pVol->dlHdlList)
            break;
        CloseHandle(pHdl->h);
    }

    if (pVol->hevPowerUp)
        CloseHandle(pVol->hevPowerUp);

    if (pVol->hevPowerDown)
        CloseHandle(pVol->hevPowerDown);

    RemoveListItem((PDLINK)&pVol->dlVol);
    LocalFree((HLOCAL)pVol);

    return TRUE;
}


/*  AllocFSDHandle - Allocate HDL structure for a VOL
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      hProc == originating process handle
 *      dwHldData == value from FSD's call to FSDMGR_CreateXXXXHandle
 *      dwFlags == initial flags for HDL (eg, HDL_FILE or HDL_FIND)
 *
 *  EXIT
 *      An application handle, or INVALID_HANDLE_VALUE if error
 */

HANDLE AllocFSDHandle(PVOL pVol, HANDLE hProc, DWORD dwHdlData, DWORD dwFlags)
{
    PHDL pHdl;
    HANDLE h = INVALID_HANDLE_VALUE;

    if (pVol == NULL)
        return NULL;

    pHdl = (PHDL)LocalAlloc(LPTR, sizeof(HDL));

    if (pHdl) {
        EnterCriticalSection(&csFSD);

        INITSIG(pHdl, (dwFlags & HDL_FILE)? HFILE_SIG : HSEARCH_SIG);
        AddListItem((PDLINK)&pVol->dlHdlList, (PDLINK)&pHdl->dlHdl);
        pHdl->pVol = pVol;
        pHdl->dwFlags = dwFlags;
        pHdl->dwHdlData = dwHdlData;
        pHdl->h = CreateAPIHandle((dwFlags & HDL_FILE)? hFileAPI : hFindAPI, pHdl);
        if (pHdl->h) {
            h = pHdl->h;
            if (hProc == NULL) {
                if (hProc = GetCurrentProcess()) {
                    BOOL f = SetHandleOwner(h, hProc);
                    DEBUGMSG(ZONE_INIT,(DBGTEXT("FSDMGR!AllocFSDHandle: hProc switched to 0x%08x (%d)\n"), hProc, f));
                }
            }
            pHdl->hProc = hProc;
        }
        else
            DeallocFSDHandle(pHdl);

        LeaveCriticalSection(&csFSD);
    }
    else
        DEBUGMSG(ZONE_INIT || ZONE_ERRORS,(DBGTEXT("FSDMGR!AllocFSDHandle: out of memory!\n")));

    return h;
}


/*  DeallocFSDHandle - Deallocate HDL structure
 *
 *  ENTRY
 *      pHdl -> HDL structure
 *
 *  EXIT
 *      None
 */

void DeallocFSDHandle(PHDL pHdl)
{
    EnterCriticalSection(&csFSD);

    ASSERT(VALIDSIG(pHdl, (pHdl->dwFlags & HDL_FILE)? HFILE_SIG : HSEARCH_SIG));

    RemoveListItem((PDLINK)&pHdl->dlHdl);
    LeaveCriticalSection(&csFSD);

    LocalFree((HLOCAL)pHdl);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品家庭影院| 精品处破学生在线二十三| 精品国精品国产| 一区二区三区四区不卡在线| 麻豆精品在线观看| 色国产综合视频| 国产日韩精品一区二区三区在线| 亚洲成av人片在线观看无码| 波多野结衣精品在线| 精品久久久久99| 亚洲福利一区二区| 99精品1区2区| 国产性色一区二区| 蜜桃久久av一区| 欧美三级电影在线看| 亚洲视频1区2区| 国产99一区视频免费| 日韩精品一区二区在线观看| 亚洲电影在线免费观看| 99久久99久久精品免费看蜜桃| 精品国产成人在线影院| 天堂影院一区二区| 欧洲一区在线电影| 亚洲色图制服丝袜| 不卡av在线免费观看| 国产亚洲成年网址在线观看| 久久99热99| 日韩免费成人网| 日本欧洲一区二区| 欧美日韩精品一区二区在线播放 | 国产v日产∨综合v精品视频| 日韩区在线观看| 日本三级亚洲精品| 亚洲影院理伦片| 91亚洲男人天堂| 日韩美女视频一区| 97se狠狠狠综合亚洲狠狠| 国产精品二区一区二区aⅴ污介绍| 国产大片一区二区| 久久综合狠狠综合久久综合88 | 亚洲欧美在线观看| 成人丝袜视频网| 国产亚洲精品福利| 国产99一区视频免费| 欧美国产精品久久| 国产精品18久久久久久vr| 久久综合一区二区| 国产乱对白刺激视频不卡| 精品国产区一区| 国产精品综合二区| 国产人成亚洲第一网站在线播放| 国产精品夜夜嗨| 国产日产欧美一区| www.亚洲激情.com| 成人欧美一区二区三区视频网页| 97久久精品人人爽人人爽蜜臀| 17c精品麻豆一区二区免费| av在线这里只有精品| 亚洲精品欧美在线| 欧美揉bbbbb揉bbbbb| 日韩激情中文字幕| 日韩亚洲欧美一区二区三区| 精品一区二区免费看| 久久久精品免费网站| 成人精品国产免费网站| 综合av第一页| 欧美偷拍一区二区| 喷白浆一区二区| 青青草国产精品97视觉盛宴| 欧美精品一区二区在线播放| 国产成人av网站| 亚洲欧美一区二区三区孕妇| 欧美色倩网站大全免费| 美女国产一区二区三区| 久久久99精品免费观看不卡| 成人性生交大片免费看中文网站 | 欧美日韩国产色站一区二区三区| 日韩精品免费视频人成| 精品国产不卡一区二区三区| 成人性视频免费网站| 樱桃国产成人精品视频| 日韩一区二区三区免费观看| 国产精品一二二区| 亚洲激情中文1区| 91麻豆精品国产91久久久资源速度| 久久精品国产澳门| 国产精品欧美极品| 在线欧美小视频| 久久精品99国产精品日本| 中文字幕第一区二区| 欧美日韩在线播放三区| 国产综合成人久久大片91| 亚洲天堂精品视频| 69久久夜色精品国产69蝌蚪网| 国产在线播放一区三区四| 亚洲欧美中日韩| 日韩手机在线导航| 成人国产精品免费网站| 偷窥国产亚洲免费视频| 国产日韩欧美在线一区| 欧美日韩在线电影| 国产成人精品免费网站| 调教+趴+乳夹+国产+精品| 国产欧美精品一区| 欧美精品18+| 成人在线视频首页| 日韩成人午夜电影| 亚洲天堂2016| 久久综合狠狠综合久久综合88| 在线影视一区二区三区| 国产美女在线精品| 午夜精品免费在线观看| 中文字幕乱码日本亚洲一区二区| 欧美美女喷水视频| 99久久久免费精品国产一区二区| 美女视频一区在线观看| 亚洲乱码国产乱码精品精小说| 欧美刺激午夜性久久久久久久| 色婷婷久久久亚洲一区二区三区| 精品中文字幕一区二区小辣椒| 一区二区国产视频| 欧美国产精品专区| 精品免费视频.| 欧美三区在线视频| 99视频国产精品| 国产麻豆精品视频| 日本不卡123| 一二三四社区欧美黄| 中文一区一区三区高中清不卡| 亚洲国产精品久久不卡毛片| 18欧美亚洲精品| 国产欧美日韩另类一区| 欧美大胆一级视频| 欧美高清www午色夜在线视频| 97精品久久久午夜一区二区三区| 韩国精品免费视频| 日本不卡视频一二三区| 亚洲第四色夜色| 亚洲免费观看高清| 中文字幕一区在线观看视频| 久久网这里都是精品| 日韩色视频在线观看| 精品视频1区2区3区| 在线看国产一区| 91日韩精品一区| 99免费精品在线| 成人免费视频app| 国产精品白丝jk黑袜喷水| 精品一区二区国语对白| 久久精品国产99| 美女mm1313爽爽久久久蜜臀| 天堂在线亚洲视频| 婷婷久久综合九色国产成人| 一区二区三区不卡视频在线观看 | 欧美精品v国产精品v日韩精品| 色哟哟一区二区在线观看| 91在线精品秘密一区二区| 不卡的av网站| 99re免费视频精品全部| 91视频你懂的| 色综合咪咪久久| 色欧美乱欧美15图片| 日本道在线观看一区二区| 91久久国产最好的精华液| 在线观看www91| 欧美日韩午夜在线| 欧美另类z0zxhd电影| 在线成人免费视频| 欧美一区二视频| 精品欧美久久久| 久久久久久久久岛国免费| 久久久久久综合| 日本一区二区视频在线| 国产精品久久久久久久久动漫 | 精品国产一区a| 久久久精品黄色| 国产精品动漫网站| 亚洲精品国产第一综合99久久| 一区二区成人在线视频| 亚洲bt欧美bt精品| 免费成人结看片| 国产精品一区二区在线看| 懂色av一区二区三区蜜臀| 93久久精品日日躁夜夜躁欧美| 色视频一区二区| 欧美无砖砖区免费| 欧美岛国在线观看| 亚洲国产精品激情在线观看| 亚洲日本护士毛茸茸| 亚洲mv在线观看| 精品在线免费视频| 福利一区福利二区| 欧洲在线/亚洲| 欧美不卡视频一区| 欧美激情综合在线| 一区二区三区四区乱视频| 日本午夜精品一区二区三区电影| 国模套图日韩精品一区二区| av在线播放一区二区三区| 欧美日韩在线免费视频|