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

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

?? apis.c

?? 可用于嵌入式編程學習
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

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

Module Name:

    apis.c

Abstract:

    This file contains the FSDMGR entry points for all supported file
    system APIs.

--*/

#define KEEP_SYSCALLS           // for kernel.h only
#define NO_DEFINE_KCALL         // for kernel.h only

#include "kernel.h"
#include "fsdmgrp.h"


#define KERNELCALLSTACK(pcstk)  (((DWORD)(pcstk)->retAddr & 0xf0000000) == 0x80000000)


/*  FSDMGR_SystemCanDeadlock - Determine if caller is kernel
 *
 *  ENTRY
 *      pvol -> VOL structure
 *
 *  EXIT
 *      TRUE if caller is kernel, FALSE if not
 *
 *  NOTES
 *      We need this special power-down test before calling FSDMGR_Enter so
 *      that if/when the loader tries to open PCMCIA drivers before we have
 *      received the FSNOTIFY_DEVICES_ON notification, we will fail the
 *      call instead of blocking it.
 */



BOOL FSDMGR_SystemCanDeadlock(PVOL pVol)
{
    // If we're in a "shutdown" state, meaning all calls to FATEnter will
    // block until FSNOTIFY_DEVICES_ON is issued, then we need to make this
    // check in a few key places (ie, where the kernel may call us) in order
    // to prevent a deadlock.

//#if 0
    PTHREAD pth;
    PCALLSTACK pcstk;

    if (!(pVol->dwFlags & VOL_POWERDOWN))
        return FALSE;

    pth = ((PHDATA)((GetCurrentThreadId() & HANDLE_ADDRESS_MASK) + 0x80000000))->pvObj;
    if (pcstk = pth->pcstkTop) {
        if (KERNELCALLSTACK(pcstk) || (pcstk = pcstk->pcstkNext) && KERNELCALLSTACK(pcstk)) {
            SetLastError(ERROR_ACCESS_DENIED);
            return TRUE;
        }
    }
//#endif
    return FALSE;
}


/*  FSDMGR_Enter - Tracks (and potentially blocks) threads entering an FSD
 *
 *  ENTRY
 *      pVol -> VOL structure
 *
 *  EXIT
 *      None
 *
 *  NOTES
 *      It's not strictly necessary to keep track of threads entering
 *      an FSD on a per-volume basis, or to block them on such a basis --
 *      these functions could just as easily perform their task using globals.
 */

 

void FSDMGR_Enter(PVOL pVol)
{
    ASSERT(VALIDSIG(pVol, VOL_SIG));

    if (pVol->dwFlags & VOL_POWERDOWN)
        WaitForSingleObject(pVol->hevPowerUp, INFINITE);

    InterlockedIncrement(&pVol->cThreads);
}


/*  FSDMGR_Exit - Tracks threads leaving an FSD (and can signal when the last one leaves)
 *
 *  ENTRY
 *      pVol -> VOL structure
 *
 *  EXIT
 *      None
 *
 *  NOTES
 *      See FSDMGR_Enter for notes.
 */

void FSDMGR_Exit(PVOL pVol)
{
    ASSERT(VALIDSIG(pVol, VOL_SIG));

    if (InterlockedDecrement(&pVol->cThreads) == 0) {
        if (pVol->dwFlags & VOL_POWERDOWN)
            SetEvent(pVol->hevPowerDown);
    }
}


/*  FSDMGR_CloseVolume - Called when a volume is being deregistered
 *
 *  ENTRY
 *      pVol -> VOL structure
 *
 *  EXIT
 *      Always returns TRUE (that's what OUR stub always does, and it's
 *      expected that that's what FSDs will do too, if they even care to hook
 *      this entry point).
 */

BOOL FSDMGR_CloseVolume(PVOL pVol)
{
    return pVol->pDsk->pFSD->apfnAFS[AFSAPI_CLOSEVOLUME](pVol->dwVolData);
}


/*  FSDMGR_CreateDirectoryW - Create a new subdirectory
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      pwsPathName - pointer to name of new subdirectory
 *      pSecurityAttributes - pointer to security attributes (ignored)
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 */

BOOL FSDMGR_CreateDirectoryW(PVOL pVol, PCWSTR pwsPathName, PSECURITY_ATTRIBUTES pSecurityAttributes)
{
    BOOL f;

    FSDMGR_Enter(pVol);
    f = pVol->pDsk->pFSD->apfnAFS[AFSAPI_CREATEDIRECTORYW](pVol->dwVolData, pwsPathName, pSecurityAttributes);
    FSDMGR_Exit(pVol);
    return f;
}


/*  FSDMGR_RemoveDirectoryW - Destroy an existing subdirectory
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      pwsPathName - pointer to name of existing subdirectory
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 */

BOOL FSDMGR_RemoveDirectoryW(PVOL pVol, PCWSTR pwsPathName)
{
    BOOL f;

    FSDMGR_Enter(pVol);
    f = pVol->pDsk->pFSD->apfnAFS[AFSAPI_REMOVEDIRECTORYW](pVol->dwVolData, pwsPathName);
    FSDMGR_Exit(pVol);
    return f;
}


/*  FSDMGR_GetFileAttributesW - Get file/subdirectory attributes
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      pwsFileName - pointer to name of existing file/subdirectory
 *
 *  EXIT
 *      Attributes of file/subdirectory if it exists, 0xFFFFFFFF if it
 *      does not (call GetLastError for error code).
 */

DWORD FSDMGR_GetFileAttributesW(PVOL pVol, PCWSTR pwsFileName)
{
    DWORD dw;

    FSDMGR_Enter(pVol);
    dw = pVol->pDsk->pFSD->apfnAFS[AFSAPI_GETFILEATTRIBUTESW](pVol->dwVolData, pwsFileName);
    FSDMGR_Exit(pVol);
    return dw;
}


/*  FSDMGR_SetFileAttributesW - Set file/subdirectory attributes
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      pwsFileName - pointer to name of existing file/subdirectory
 *      dwAttributes - new attributes for file/subdirectory
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 */

BOOL FSDMGR_SetFileAttributesW(PVOL pVol, PCWSTR pwsFileName, DWORD dwAttributes)
{
    BOOL f;

    FSDMGR_Enter(pVol);
    f = pVol->pDsk->pFSD->apfnAFS[AFSAPI_SETFILEATTRIBUTESW](pVol->dwVolData, pwsFileName, dwAttributes);
    FSDMGR_Exit(pVol);
    return f;
}


/*  FSDMGR_DeleteFileW - Delete file
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      pwsFileName - pointer to name of existing file
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 *
 *  NOTES
 *      A file marked FILE_ATTRIBUTE_READONLY cannot be deleted.  You have to
 *      remove that attribute first, with SetFileAttributes.
 *
 *      An open file cannot be deleted.  All open handles must be closed first.
 *
 *      A subdirectory cannot be deleted with this call either.  You have to
 *      use RemoveDirectory instead.
 */

BOOL FSDMGR_DeleteFileW(PVOL pVol, PCWSTR pwsFileName)
{
    BOOL f;

    FSDMGR_Enter(pVol);
    f = pVol->pDsk->pFSD->apfnAFS[AFSAPI_DELETEFILEW](pVol->dwVolData, pwsFileName);
    FSDMGR_Exit(pVol);
    return f;
}


/*  FSDMGR_MoveFileW
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      pwsOldFileName - pointer to name of existing file
 *      pwsNewFileName - pointer to new name for file
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 *
 *  NOTES
 *      We call FindFirst once to obtain the source directory stream for the
 *      for the existing file, and if it really exists, we call FindFirst
 *      again to obtain the destination directory stream for the new file,
 *      verifying that the new name does NOT exist.  Then we create the new
 *      name and destroy the old.
 *
 *      When moving a directory, we must make sure that our traversal
 *      of the destination path does not cross the source directory, otherwise
 *      we will end up creating a circular directory chain.
 */

BOOL FSDMGR_MoveFileW(PVOL pVol, PCWSTR pwsOldFileName, PCWSTR pwsNewFileName)
{
    BOOL f;

    FSDMGR_Enter(pVol);
    f = pVol->pDsk->pFSD->apfnAFS[AFSAPI_MOVEFILEW](pVol->dwVolData, pwsOldFileName, pwsNewFileName);
    FSDMGR_Exit(pVol);
    return f;
}


/*  FSDMGR_DeleteAndRenameFileW
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      pwsOldFileName - pointer to name of existing file
 *      pwsNewFileName - pointer to name of file to be renamed to existing file
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 */

BOOL FSDMGR_DeleteAndRenameFileW(PVOL pVol, PCWSTR pwsOldFileName, PCWSTR pwsNewFileName)
{
    BOOL f;

    FSDMGR_Enter(pVol);
    f = pVol->pDsk->pFSD->apfnAFS[AFSAPI_PRESTOCHANGOFILENAME](pVol->dwVolData, pwsOldFileName, pwsNewFileName);
    FSDMGR_Exit(pVol);
    return f;
}


/*  FSDMGR_GetFreeDiskSpaceW
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      pwsPathName -> volume name (eg, "\Storage Card")
 *      pSectorsPerCluster -> DWORD to receive sectors/cluster
 *      pBytesPerSector -> DWORD to receive bytes/sector
 *      pFreeClusters -> DWORD to receive available clusters on volume
 *      pClusters -> DWORD to receive total clusters on volume
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 */

BOOL FSDMGR_GetDiskFreeSpaceW(PVOL pVol, PCWSTR pwsPathName, PDWORD pSectorsPerCluster, PDWORD pBytesPerSector, PDWORD pFreeClusters, PDWORD pClusters)
{
    BOOL f;

    FSDMGR_Enter(pVol);
    f = pVol->pDsk->pFSD->apfnAFS[AFSAPI_GETDISKFREESPACE](pVol->dwVolData, pwsPathName, pSectorsPerCluster, pBytesPerSector, pFreeClusters, pClusters);
    FSDMGR_Exit(pVol);
    return f;
}


/*  FSDMGR_CloseAllFiles (no FSD equivalent)
 *
 *  ENTRY
 *      pVol -> VOL structure
 *      hProc == handle of terminating process
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 */

BOOL FSDMGR_CloseAllFiles(PVOL pVol, HANDLE hProc)
{
    PHDL pHdl;

    FSDMGR_Enter(pVol);
loop1:
    pHdl = pVol->dlHdlList.pHdlNext;
    while (pHdl != (PHDL)&pVol->dlHdlList) {
        if (pHdl->hProc == hProc) {
            SetHandleOwner(pHdl->h, GetCurrentProcess());
            if (CloseHandle(pHdl->h))
                goto loop1;     // handle was freed, state of our list has changed
        }
        pHdl = pHdl->dlHdl.pHdlNext;
    }
    FSDMGR_Exit(pVol);
    return TRUE;
}


/*  FSDMGR_CommitAllFiles (no FSD equivalent)
 *
 *  ENTRY
 *      pVol -> VOL structure
 *
 *  EXIT
 *      TRUE if successful, FALSE if not (call GetLastError for error code)
 */

BOOL FSDMGR_CommitAllFiles(PVOL pVol)
{
    PHDL pHdl;

    // There ain't no steenkin' FSDMGR_Enter/FSDMGR_Exit calls in this function
    // because it's called during FSNOTIFY_POWER_OFF and we don't want to hang ourselves.

    pHdl = pVol->dlHdlList.pHdlNext;
    while (pHdl != (PHDL)&pVol->dlHdlList) {
        pHdl->pVol->pDsk->pFSD->apfnFile[FILEAPI_FLUSHFILEBUFFERS](pHdl->dwHdlData);
        pHdl = pHdl->dlHdl.pHdlNext;
    }
    return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品一区二区三区香蕉| 成人免费视频播放| 欧美高清www午色夜在线视频| 亚洲综合区在线| 欧美乱妇15p| 日韩高清一级片| 日韩精品专区在线影院重磅| 国产一区二区三区在线观看免费 | 久久婷婷久久一区二区三区| 亚洲三级在线播放| 欧洲一区在线观看| 午夜国产不卡在线观看视频| 欧美一级淫片007| 国产iv一区二区三区| 亚洲色图.com| 欧美日韩专区在线| 久久国产婷婷国产香蕉| 欧美高清在线一区二区| 欧美日韩中字一区| 国产乱码精品一品二品| 亚洲精品国产第一综合99久久 | 青娱乐精品在线视频| 久久无码av三级| 日本精品一区二区三区高清| 日韩和欧美一区二区三区| 久久精品视频在线看| 日本福利一区二区| 韩国视频一区二区| 亚洲国产精品一区二区久久恐怖片| 日韩片之四级片| 97久久人人超碰| 免费成人在线网站| 亚洲伦在线观看| 欧美精品一区二区三区很污很色的| 一本一道波多野结衣一区二区| 另类小说欧美激情| 亚洲精品久久久久久国产精华液| 3d成人动漫网站| 91社区在线播放| 精品影视av免费| 午夜精品影院在线观看| 中文字幕乱码日本亚洲一区二区| 欧美日韩国产123区| va亚洲va日韩不卡在线观看| 激情六月婷婷综合| 欧美日韩国产a| 天天av天天翘天天综合网| 国产精品午夜在线| 久久在线观看免费| 日韩欧美综合在线| 欧美日韩不卡一区| 在线观看日韩一区| 成人福利视频网站| 国产精品1024| 久久精品国产精品亚洲综合| 亚洲bt欧美bt精品| 亚洲与欧洲av电影| 亚洲欧美另类在线| 亚洲欧美一区二区在线观看| 国产区在线观看成人精品| 精品理论电影在线| 日韩女优av电影| 91精品欧美久久久久久动漫| 欧美日韩亚洲综合| 欧美写真视频网站| 91福利视频在线| 色乱码一区二区三区88| 97久久人人超碰| 91小宝寻花一区二区三区| 成人av网在线| 成人国产亚洲欧美成人综合网 | 在线电影一区二区三区| 欧美系列在线观看| 欧美卡1卡2卡| 欧美一区二区美女| 日韩一区二区三区精品视频| 欧美一区二区三区四区久久| 在线不卡一区二区| 欧美久久久久中文字幕| 7799精品视频| 日韩欧美一级精品久久| 精品理论电影在线观看| 精品国产一区二区三区久久影院| 欧美tickle裸体挠脚心vk| 精品国产凹凸成av人导航| 久久久精品国产免大香伊| 久久久99精品久久| 自拍视频在线观看一区二区| 亚洲精品中文字幕乱码三区| 一区二区三区四区高清精品免费观看| 一区二区三区在线视频免费| 视频一区二区国产| 狠狠久久亚洲欧美| 成人福利视频在线看| 欧美少妇性性性| 精品国产一区二区亚洲人成毛片 | 久久久久久久久久电影| 国产女人aaa级久久久级 | 久久久国产一区二区三区四区小说| 这里是久久伊人| 天堂精品中文字幕在线| 天天影视色香欲综合网老头| 精品一区二区成人精品| a级精品国产片在线观看| 欧美色大人视频| 久久午夜免费电影| 亚洲美女少妇撒尿| 美女久久久精品| 国产成人av一区二区三区在线| 色综合久久99| 日韩精品一区二区三区四区| 亚洲国产精品av| 亚洲 欧美综合在线网络| 国产精品资源网站| 欧美在线观看一区| 久久久久久日产精品| 亚洲午夜羞羞片| 国产成人在线视频网址| 欧美另类高清zo欧美| 欧美韩国日本综合| 日韩精品亚洲专区| www.爱久久.com| 欧美精品一区男女天堂| 一区二区免费看| 国产精品亚洲一区二区三区妖精| 91福利视频在线| 欧美国产精品中文字幕| 免费观看成人av| 欧美最猛性xxxxx直播| 国产欧美日韩视频在线观看| 香蕉加勒比综合久久| 99这里都是精品| 久久久久久久久免费| 热久久一区二区| 91精品1区2区| 国产精品美女久久久久aⅴ国产馆| 秋霞国产午夜精品免费视频| 在线一区二区三区做爰视频网站| 久久一二三国产| 麻豆成人91精品二区三区| 欧美偷拍一区二区| 亚洲日本va午夜在线影院| 国产精品一区二区三区网站| 日韩视频一区二区| 亚洲图片一区二区| 日本福利一区二区| 亚洲欧美激情小说另类| 成人av资源站| 亚洲国产精品二十页| 国产乱码一区二区三区| 精品少妇一区二区三区视频免付费| 亚洲国产欧美在线| 欧美中文字幕一区| 亚洲激情六月丁香| 91猫先生在线| 亚洲日本在线a| 9色porny自拍视频一区二区| 国产精品久久久久影院老司| 国产69精品一区二区亚洲孕妇| 久久婷婷成人综合色| 韩国欧美国产一区| 久久综合九色欧美综合狠狠| 麻豆精品在线看| 亚洲精品一区在线观看| 国内成人精品2018免费看| 欧美精品一区二区三区很污很色的| 久久国产综合精品| 国产性天天综合网| 成人动漫在线一区| 亚洲私人黄色宅男| 欧美性大战久久| 午夜av区久久| 欧美一区二区三区白人| 激情成人午夜视频| 国产偷国产偷亚洲高清人白洁| 国产**成人网毛片九色 | 日本一区二区综合亚洲| 成人一区二区三区| 亚洲天堂成人在线观看| 欧美网站一区二区| 麻豆专区一区二区三区四区五区| 日韩午夜激情电影| 国产精品资源站在线| 中文字幕视频一区| 欧美少妇xxx| 麻豆91在线观看| 中文字幕精品一区二区三区精品| 97se亚洲国产综合自在线不卡 | 日本视频在线一区| 精品国产乱码91久久久久久网站| 国产麻豆精品一区二区| 日韩理论电影院| 欧美高清dvd| 国产电影一区在线| 亚洲一区二区三区中文字幕| 日韩午夜在线观看| 99视频一区二区| 偷窥国产亚洲免费视频| 国产人成亚洲第一网站在线播放| 91啦中文在线观看|