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

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

?? apis.c

?? See Hanoi.cpp for the implementation of this cla
?? 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一区二区三区免费野_久草精品视频
亚洲不卡一区二区三区| 国产三级精品在线| 日韩一区精品字幕| 日韩三级视频在线看| 美女一区二区视频| 久久久久久免费毛片精品| 国产精品影音先锋| 亚洲人一二三区| 欧美日韩午夜在线视频| 久草在线在线精品观看| 国产精品久久一卡二卡| 91丝袜美女网| 日本不卡一二三区黄网| 欧美国产精品一区二区三区| 91网站在线播放| 视频一区免费在线观看| 久久精品欧美一区二区三区麻豆 | 国产精品国产三级国产专播品爱网| 暴力调教一区二区三区| 亚洲综合成人网| 日韩视频一区二区三区在线播放| 粉嫩绯色av一区二区在线观看 | 欧美高清视频一二三区 | 中文字幕欧美三区| 欧美日韩一区二区三区不卡| 黄色精品一二区| 亚洲精品视频在线看| 日韩欧美区一区二| 91视频.com| 精品一区二区三区免费| 亚洲乱码日产精品bd| 精品成人免费观看| 欧美在线观看一区| 国产+成+人+亚洲欧洲自线| 亚洲一区二区中文在线| 国产日韩欧美精品综合| 7799精品视频| 97久久精品人人澡人人爽| 蜜臀av亚洲一区中文字幕| 中文字幕一区二区三区在线观看 | 调教+趴+乳夹+国产+精品| 国产精品午夜电影| 91精品视频网| 91天堂素人约啪| 国产高清亚洲一区| 伦理电影国产精品| 亚洲成av人片一区二区梦乃| 国产精品久久二区二区| 26uuu精品一区二区| 717成人午夜免费福利电影| 色天天综合久久久久综合片| 国产99精品国产| 国产在线精品免费| 美女诱惑一区二区| 午夜免费久久看| 一区二区三区高清不卡| 国产精品丝袜久久久久久app| 欧美va亚洲va香蕉在线| 欧美日韩国产高清一区二区三区 | 国产欧美日韩卡一| 精品久久久久一区| 777午夜精品免费视频| 欧美无砖专区一中文字| 色综合天天综合色综合av| youjizz国产精品| 国产91色综合久久免费分享| 激情综合亚洲精品| 六月婷婷色综合| 久久av中文字幕片| 裸体歌舞表演一区二区| 久久精品国产亚洲aⅴ| 免费成人在线播放| 久久国产欧美日韩精品| 久久精品国产免费| 国产综合成人久久大片91| 经典一区二区三区| 国产九色精品成人porny | 国产精品美女视频| 中文字幕一区二区在线观看| 亚洲视频在线一区二区| 亚洲欧美欧美一区二区三区| 一区二区三区欧美亚洲| 亚洲国产一区二区视频| 日韩 欧美一区二区三区| 热久久久久久久| 狠狠色丁香久久婷婷综| 国产精品99久久久久久宅男| 成人黄色一级视频| 日本韩国精品在线| 在线不卡欧美精品一区二区三区| 欧美一级生活片| 久久精品一区二区| 中文字幕一区二区三区视频| 亚洲一区二区中文在线| 蜜乳av一区二区| 国产精品自拍三区| 一本久道中文字幕精品亚洲嫩| 精品污污网站免费看| 日韩一区二区精品| 中文字幕免费观看一区| 亚洲一级不卡视频| 美女视频黄 久久| 成人黄色在线看| 欧美巨大另类极品videosbest| 精品国产一区二区三区久久久蜜月| 中文字幕精品—区二区四季| 亚洲亚洲人成综合网络| 九色porny丨国产精品| 国产成人小视频| 欧美午夜精品理论片a级按摩| 精品少妇一区二区三区在线播放| 亚洲国产激情av| 丝袜美腿亚洲一区| 岛国精品在线观看| 欧美日韩国产美| 久久婷婷久久一区二区三区| 亚洲乱码中文字幕| 国产资源精品在线观看| 色www精品视频在线观看| 精品国产污污免费网站入口| 亚洲日本一区二区| 黄色日韩三级电影| 欧美色图天堂网| 国产精品全国免费观看高清 | 精品一区二区免费在线观看| 色综合色综合色综合| 久久婷婷国产综合国色天香| 亚洲国产成人91porn| 夫妻av一区二区| 欧美一区二区三区视频免费| 亚洲三级在线免费| 国产不卡免费视频| 日韩一卡二卡三卡四卡| 亚洲靠逼com| 国产成人免费视频| 日韩欧美中文字幕公布| 亚洲激情五月婷婷| 成人免费视频网站在线观看| 欧美大片顶级少妇| 视频一区在线播放| 日本高清不卡aⅴ免费网站| 国产欧美综合在线| 国内精品伊人久久久久av影院 | 91精品办公室少妇高潮对白| 久久久99精品久久| 美女被吸乳得到大胸91| 在线91免费看| 亚洲午夜久久久久中文字幕久| 99久久精品免费| 国产清纯白嫩初高生在线观看91| 九色综合狠狠综合久久| 日韩免费一区二区| 日本系列欧美系列| 91麻豆精品国产91久久久资源速度 | 丰满岳乱妇一区二区三区| 精品久久久久香蕉网| 久久精品国产一区二区三| 91精品国产欧美一区二区| 亚洲第一成人在线| 欧美日韩一区二区三区在线看| 一区二区三区中文免费| 色香色香欲天天天影视综合网| 日韩码欧中文字| 色综合一个色综合亚洲| 亚洲精品自拍动漫在线| 欧美专区亚洲专区| 亚洲一区二区av电影| 欧亚洲嫩模精品一区三区| 一区二区三区四区av| 欧美午夜不卡视频| 日韩av电影免费观看高清完整版| 7777精品伊人久久久大香线蕉的 | 欧美日韩成人激情| 日韩精品亚洲专区| 欧美tickling网站挠脚心| 国产一区二区三区电影在线观看 | 欧美精品乱人伦久久久久久| 亚洲gay无套男同| 欧美一二三四区在线| 美女脱光内衣内裤视频久久影院| 精品国产成人系列| 国产99精品国产| 亚洲精品一二三| 在线成人高清不卡| 国产一区二区在线看| 国产精品久久久久aaaa| 色天天综合色天天久久| 日本午夜一区二区| 久久久午夜电影| 色综合天天天天做夜夜夜夜做| 亚洲午夜av在线| 日韩欧美一级在线播放| 国产91在线|亚洲| 亚洲午夜久久久久久久久电影院| 5月丁香婷婷综合| 粉嫩av一区二区三区| 亚洲一区二区三区四区中文字幕| 日韩欧美高清在线| 成人不卡免费av| 日日夜夜精品视频天天综合网|