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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? swapbuffers.c

?? miniFilter.rar所有框架代碼以及對應(yīng)的PPT資料,可以直接拿來進(jìn)行修改即可完成各種驅(qū)動(dòng),是你開發(fā)微軟新過濾構(gòu)架驅(qū)動(dòng)所必下資料
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
/*++

Copyright (c) 1999 - 2002  Microsoft Corporation

Module Name:

    SwapBuffers.c

Abstract:

    This is a sample filter which demonstrates proper access of data buffer
    and a general guideline of how to swap buffers.
    For now it only swaps buffers for:

    IRP_MJ_READ
    IRP_MJ_WRITE
    IRP_MJ_DIRECTORY_CONTROL

    By default this filter attaches to all volumes it is notified about.  It
    does support having multiple instances on a given volume.

Environment:

    Kernel mode

--*/

#include <fltKernel.h>
#include <dontuse.h>
#include <suppress.h>

#pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER, "Not valid for kernel mode drivers")


PFLT_FILTER gFilterHandle;

/*************************************************************************
    Pool Tags
*************************************************************************/

#define BUFFER_SWAP_TAG     'bdBS'
#define CONTEXT_TAG         'xcBS'
#define NAME_TAG            'mnBS'
#define PRE_2_POST_TAG      'ppBS'

/*************************************************************************
    Local structures
*************************************************************************/

//
//  This is a volume context, one of these are attached to each volume
//  we monitor.  This is used to get a "DOS" name for debug display.
//

typedef struct _VOLUME_CONTEXT {

    //
    //  Holds the name to display
    //

    UNICODE_STRING Name;

    //
    //  Holds the sector size for this volume.
    //

    ULONG SectorSize;

} VOLUME_CONTEXT, *PVOLUME_CONTEXT;

#define MIN_SECTOR_SIZE 0x200


//
//  This is a context structure that is used to pass state from our
//  pre-operation callback to our post-operation callback.
//

typedef struct _PRE_2_POST_CONTEXT {

    //
    //  Pointer to our volume context structure.  We always get the context
    //  in the preOperation path because you can not safely get it at DPC
    //  level.  We then release it in the postOperation path.  It is safe
    //  to release contexts at DPC level.
    //

    PVOLUME_CONTEXT VolCtx;

    //
    //  Since the post-operation parameters always receive the "original"
    //  parameters passed to the operation, we need to pass our new destination
    //  buffer to our post operation routine so we can free it.
    //

    PVOID SwappedBuffer;

} PRE_2_POST_CONTEXT, *PPRE_2_POST_CONTEXT;

//
//  This is a lookAside list used to allocate our pre-2-post structure.
//

NPAGED_LOOKASIDE_LIST Pre2PostContextList;

/*************************************************************************
    Prototypes
*************************************************************************/

NTSTATUS
InstanceSetup (
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in FLT_INSTANCE_SETUP_FLAGS Flags,
    __in DEVICE_TYPE VolumeDeviceType,
    __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
    );

VOID
CleanupVolumeContext(
    __in PFLT_CONTEXT Context,
    __in FLT_CONTEXT_TYPE ContextType
    );

NTSTATUS
InstanceQueryTeardown (
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
    );

NTSTATUS
DriverEntry (
    __in PDRIVER_OBJECT DriverObject,
    __in PUNICODE_STRING RegistryPath
    );

NTSTATUS
FilterUnload (
    __in FLT_FILTER_UNLOAD_FLAGS Flags
    );

FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __deref_out_opt PVOID *CompletionContext
    );

FLT_POSTOP_CALLBACK_STATUS
SwapPostReadBuffers(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in PVOID CompletionContext,
    __in FLT_POST_OPERATION_FLAGS Flags
    );

FLT_POSTOP_CALLBACK_STATUS
SwapPostReadBuffersWhenSafe (
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in PVOID CompletionContext,
    __in FLT_POST_OPERATION_FLAGS Flags
    );

FLT_PREOP_CALLBACK_STATUS
SwapPreDirCtrlBuffers(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __deref_out_opt PVOID *CompletionContext
    );

FLT_POSTOP_CALLBACK_STATUS
SwapPostDirCtrlBuffers(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in PVOID CompletionContext,
    __in FLT_POST_OPERATION_FLAGS Flags
    );

FLT_POSTOP_CALLBACK_STATUS
SwapPostDirCtrlBuffersWhenSafe (
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in PVOID CompletionContext,
    __in FLT_POST_OPERATION_FLAGS Flags
    );

FLT_PREOP_CALLBACK_STATUS
SwapPreWriteBuffers(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __deref_out_opt PVOID *CompletionContext
    );

FLT_POSTOP_CALLBACK_STATUS
SwapPostWriteBuffers(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in PVOID CompletionContext,
    __in FLT_POST_OPERATION_FLAGS Flags
    );

VOID
ReadDriverParameters (
    __in PUNICODE_STRING RegistryPath
    );

//
//  Assign text sections for each routine.
//

#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, InstanceSetup)
#pragma alloc_text(PAGE, CleanupVolumeContext)
#pragma alloc_text(PAGE, InstanceQueryTeardown)
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(INIT, ReadDriverParameters)
#pragma alloc_text(PAGE, FilterUnload)
#endif

//
//  Operation we currently care about.
//

CONST FLT_OPERATION_REGISTRATION Callbacks[] = {
    { IRP_MJ_READ,
      0,
      SwapPreReadBuffers,
      SwapPostReadBuffers },

    { IRP_MJ_WRITE,
      0,
      SwapPreWriteBuffers,
      SwapPostWriteBuffers },

    { IRP_MJ_DIRECTORY_CONTROL,
      0,
      SwapPreDirCtrlBuffers,
      SwapPostDirCtrlBuffers },

    { IRP_MJ_OPERATION_END }
};

//
//  Context definitions we currently care about.  Note that the system will
//  create a lookAside list for the volume context because an explicit size
//  of the context is specified.
//

CONST FLT_CONTEXT_REGISTRATION ContextNotifications[] = {

     { FLT_VOLUME_CONTEXT,
       0,
       CleanupVolumeContext,
       sizeof(VOLUME_CONTEXT),
       CONTEXT_TAG },

     { FLT_CONTEXT_END }
};

//
//  This defines what we want to filter with FltMgr
//

CONST FLT_REGISTRATION FilterRegistration = {

    sizeof( FLT_REGISTRATION ),         //  Size
    FLT_REGISTRATION_VERSION,           //  Version
    0,                                  //  Flags

    ContextNotifications,               //  Context
    Callbacks,                          //  Operation callbacks

    FilterUnload,                       //  MiniFilterUnload

    InstanceSetup,                      //  InstanceSetup
    InstanceQueryTeardown,              //  InstanceQueryTeardown
    NULL,                               //  InstanceTeardownStart
    NULL,                               //  InstanceTeardownComplete

    NULL,                               //  GenerateFileName
    NULL,                               //  GenerateDestinationFileName
    NULL                                //  NormalizeNameComponent

};

/*************************************************************************
    Debug tracing information
*************************************************************************/

//
//  Definitions to display log messages.  The registry DWORD entry:
//  "hklm\system\CurrentControlSet\Services\Swapbuffers\DebugFlags" defines
//  the default state of these logging flags
//

#define LOGFL_ERRORS    0x00000001  // if set, display error messages
#define LOGFL_READ      0x00000002  // if set, display READ operation info
#define LOGFL_WRITE     0x00000004  // if set, display WRITE operation info
#define LOGFL_DIRCTRL   0x00000008  // if set, display DIRCTRL operation info
#define LOGFL_VOLCTX    0x00000010  // if set, display VOLCTX operation info

ULONG LoggingFlags = 0;             // all disabled by default

#define LOG_PRINT( _logFlag, _string )                              \
    (FlagOn(LoggingFlags,(_logFlag)) ?                              \
        DbgPrint _string  :                                         \
        ((void)0))

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
//                      Routines
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////


NTSTATUS
InstanceSetup (
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __in FLT_INSTANCE_SETUP_FLAGS Flags,
    __in DEVICE_TYPE VolumeDeviceType,
    __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
    )
/*++

Routine Description:

    This routine is called whenever a new instance is created on a volume.

    By default we want to attach to all volumes.  This routine will try and
    get a "DOS" name for the given volume.  If it can't, it will try and
    get the "NT" name for the volume (which is what happens on network
    volumes).  If a name is retrieved a volume context will be created with
    that name.

Arguments:

    FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing
        opaque handles to this filter, instance and its associated volume.

    Flags - Flags describing the reason for this attach request.

Return Value:

    STATUS_SUCCESS - attach
    STATUS_FLT_DO_NOT_ATTACH - do not attach

--*/
{
    PDEVICE_OBJECT devObj = NULL;
    PVOLUME_CONTEXT ctx = NULL;
    NTSTATUS status;
    ULONG retLen;
    PUNICODE_STRING workingName;
    USHORT size;
    UCHAR volPropBuffer[sizeof(FLT_VOLUME_PROPERTIES)+512];
    PFLT_VOLUME_PROPERTIES volProp = (PFLT_VOLUME_PROPERTIES)volPropBuffer;

    PAGED_CODE();

    UNREFERENCED_PARAMETER( Flags );
    UNREFERENCED_PARAMETER( VolumeDeviceType );
    UNREFERENCED_PARAMETER( VolumeFilesystemType );

    try {

        //
        //  Allocate a volume context structure.
        //

        status = FltAllocateContext( FltObjects->Filter,
                                     FLT_VOLUME_CONTEXT,
                                     sizeof(VOLUME_CONTEXT),
                                     NonPagedPool,
                                     &ctx );

        if (!NT_SUCCESS(status)) {

            //
            //  We could not allocate a context, quit now
            //

            leave;
        }

        //
        //  Always get the volume properties, so I can get a sector size
        //

        status = FltGetVolumeProperties( FltObjects->Volume,
                                         volProp,
                                         sizeof(volPropBuffer),
                                         &retLen );

        if (!NT_SUCCESS(status)) {

            leave;
        }

        //
        //  Save the sector size in the context for later use.  Note that
        //  we will pick a minimum sector size if a sector size is not
        //  specified.
        //

        ASSERT((volProp->SectorSize == 0) || (volProp->SectorSize >= MIN_SECTOR_SIZE));

        ctx->SectorSize = max(volProp->SectorSize,MIN_SECTOR_SIZE);

        //
        //  Init the buffer field (which may be allocated later).
        //

        ctx->Name.Buffer = NULL;

        //
        //  Get the storage device object we want a name for.
        //

        status = FltGetDiskDeviceObject( FltObjects->Volume, &devObj );

        if (NT_SUCCESS(status)) {

            //
            //  Try and get the DOS name.  If it succeeds we will have
            //  an allocated name buffer.  If not, it will be NULL
            //

            status = RtlVolumeDeviceToDosName( devObj, &ctx->Name );
        }

        //
        //  If we could not get a DOS name, get the NT name.
        //

        if (!NT_SUCCESS(status)) {

            ASSERT(ctx->Name.Buffer == NULL);

            //
            //  Figure out which name to use from the properties

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷久久久综合中文字幕| 国产一区二区视频在线| 91视频观看免费| 中文字幕亚洲在| 91在线观看美女| 亚洲一区二区视频在线观看| 欧美日韩二区三区| 日本中文字幕一区| 久久午夜免费电影| 波多野结衣在线一区| 亚洲精品国产高清久久伦理二区| 在线精品视频小说1| 麻豆精品新av中文字幕| 久久精品人人做人人爽97| 成人爱爱电影网址| 亚洲综合在线免费观看| 欧美大胆人体bbbb| 成人高清视频免费观看| 亚洲一区二区三区四区五区黄 | 99久久免费精品高清特色大片| 中文字幕av不卡| 欧美在线观看视频一区二区| 免费高清成人在线| 欧美国产亚洲另类动漫| 91福利在线导航| 国产一区在线精品| 亚洲黄色免费网站| 精品国产乱码久久久久久牛牛| 成人免费观看视频| 视频在线在亚洲| 国产精品污www在线观看| 欧美欧美欧美欧美| 高清在线成人网| 天堂成人免费av电影一区| 国产精品久久三区| 欧美成人猛片aaaaaaa| 日本电影亚洲天堂一区| 国产一区二区三区免费看| 亚洲一卡二卡三卡四卡无卡久久| 亚洲国产美女搞黄色| 欧美tickle裸体挠脚心vk| 91捆绑美女网站| 国产精品一品视频| 奇米综合一区二区三区精品视频| 国产精品的网站| 久久久国产综合精品女国产盗摄| 欧美午夜片在线看| www.日韩在线| 国产一区二区看久久| 日韩经典中文字幕一区| 亚洲美女屁股眼交3| 国产精品婷婷午夜在线观看| 在线不卡中文字幕| 色婷婷亚洲精品| eeuss国产一区二区三区| 久久99精品国产.久久久久久 | 亚洲成年人网站在线观看| 国产日产欧美一区二区视频| 日韩一区二区免费在线电影| 欧美亚洲综合久久| 91性感美女视频| 国产福利一区二区三区视频| 麻豆91在线看| 奇米色一区二区| 亚洲3atv精品一区二区三区| 玉米视频成人免费看| 国产精品久久久久一区| 欧美国产一区二区| 中文字幕欧美国产| 欧美国产在线观看| 国产欧美视频在线观看| 日本一区二区不卡视频| 久久久久久久久久久久久久久99| 欧美电影免费提供在线观看| 精品少妇一区二区三区视频免付费| 欧美日韩另类国产亚洲欧美一级| 在线观看国产日韩| 91久久精品一区二区三| 欧美亚洲高清一区| 欧美日韩国产电影| 欧美一级欧美三级在线观看| 日韩欧美电影在线| www激情久久| 中文在线一区二区 | 99精品久久久久久| 99精品一区二区三区| 91麻豆免费看| 欧美性猛交一区二区三区精品| 欧美日韩激情在线| 日韩女优毛片在线| 精品少妇一区二区三区视频免付费 | 国内不卡的二区三区中文字幕| 免费国产亚洲视频| 韩国女主播成人在线| 国产精品资源在线看| 成人国产精品免费观看| 在线欧美一区二区| 91精品蜜臀在线一区尤物| 日韩一区二区三区观看| 国产清纯在线一区二区www| 国产精品国产三级国产普通话蜜臀 | 婷婷综合久久一区二区三区| 水野朝阳av一区二区三区| 黄一区二区三区| gogogo免费视频观看亚洲一| 在线视频欧美精品| 欧美变态tickling挠脚心| 国产精品五月天| 亚洲一区二区影院| 国产麻豆精品在线| 91成人在线观看喷潮| 欧美大黄免费观看| 亚洲免费观看高清完整版在线观看 | 高清不卡在线观看| 在线免费观看日本欧美| 精品成人在线观看| 亚洲品质自拍视频网站| 麻豆成人久久精品二区三区红| 不卡的av中国片| 欧美一区二区在线免费播放| 日本一区二区三区四区| 亚洲一区二区视频在线观看| 国产一区二区不卡| 欧美日韩精品一区二区在线播放| 久久夜色精品国产欧美乱极品| 日韩一区在线免费观看| 久久er99热精品一区二区| 91在线国产福利| 日韩美女视频一区二区在线观看| 国产精品久久久久aaaa樱花| 另类人妖一区二区av| 欧洲亚洲国产日韩| 欧美国产国产综合| 久草在线在线精品观看| 在线免费观看成人短视频| 日本一区二区不卡视频| 激情五月激情综合网| 欧美日韩精品一区二区天天拍小说 | 日韩午夜av一区| 亚洲精品中文字幕在线观看| 国产麻豆视频精品| 欧美大白屁股肥臀xxxxxx| 亚洲一区二区三区免费视频| 成人毛片在线观看| 欧美xxxxx裸体时装秀| 午夜视频久久久久久| 色综合夜色一区| 国产精品女主播在线观看| 极品美女销魂一区二区三区免费 | 99精品偷自拍| 欧美国产激情一区二区三区蜜月| 久久精工是国产品牌吗| 欧美精品一二三区| 亚洲专区一二三| 色综合久久久久综合体桃花网| 国产精品丝袜久久久久久app| 激情亚洲综合在线| 日韩精品一区二区三区四区视频 | 亚洲精品欧美二区三区中文字幕| 国产福利电影一区二区三区| 精品国产伦一区二区三区观看体验 | 日韩欧美国产三级| 热久久久久久久| 91精品国产一区二区三区| 天堂一区二区在线免费观看| 欧美视频第二页| 亚洲午夜久久久久久久久电影院| 欧洲av在线精品| 亚洲国产日韩一区二区| 欧美日韩国产另类不卡| 婷婷夜色潮精品综合在线| 欧美日韩精品高清| 日本中文字幕不卡| 欧美电视剧免费观看| 久久99深爱久久99精品| 精品国产污网站| 国产精品一区二区久激情瑜伽| 国产日韩欧美不卡在线| av电影在线观看一区| 亚洲综合无码一区二区| 欧美精品视频www在线观看| 日韩影院精彩在线| 欧美电影免费观看高清完整版在| 国产一区二区三区综合| 国产精品乱码妇女bbbb| 在线亚洲一区二区| 秋霞午夜av一区二区三区 | 国产网红主播福利一区二区| 国产成人在线观看| 亚洲欧美日韩中文字幕一区二区三区| 91捆绑美女网站| 青娱乐精品视频| 国产欧美一区二区精品仙草咪| 99热这里都是精品| 午夜伦欧美伦电影理论片| 久久夜色精品一区| 在线亚洲精品福利网址导航| 男人操女人的视频在线观看欧美| 国产亚洲综合在线| 欧美视频在线观看一区|