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

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

?? fspyctx.c

?? 一個文件過濾驅動程序的例子
?? C
?? 第 1 頁 / 共 4 頁
字號:
    OUT PSPY_STREAM_CONTEXT *pRetContext
    )
/*++

Routine Description:

    Allocate and initialize a context structure including retrieving the name.

Arguments:

    DeviceObject - Device to operate on

    FileObject - The stream the context is being created for

    LookupFlags - Flag telling how to do this create

    pRetContext - Receives the created context

Return Value:

    Status of the operation

--*/
{
    PFILESPY_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    PSPY_STREAM_CONTEXT ctx;
    ULONG contextSize;
    PNAME_CONTROL fileName = NULL;
    BOOLEAN cacheName;
    NTSTATUS status;

    PAGED_CODE();
    ASSERT(IS_FILESPY_DEVICE_OBJECT(DeviceObject));

    //
    //  Setup locals
    //

    *pRetContext = NULL;

    //
    //  Get the filename string
    //

    status = NLAllocateNameControl( &fileName, &gFileSpyNameBufferLookasideList );

    if (!NT_SUCCESS( status )) {

        return status;
    }

    status = NLGetFullPathName( FileObject,
                                fileName,
                                &devExt->NLExtHeader,
                                LookupFlags | NLFL_USE_DOS_DEVICE_NAME,
                                &gFileSpyNameBufferLookasideList,
                                &cacheName );

    if (!NT_SUCCESS( status )) {

        NLFreeNameControl( fileName, &gFileSpyNameBufferLookasideList );
        return status;
    }

    //
    //  Allocate the context structure with space for the name
    //  added to the end.
    //

    contextSize = sizeof(SPY_STREAM_CONTEXT);

    contextSize += fileName->Name.Length;

    ctx = ExAllocatePoolWithTag( NonPagedPool,
                                 contextSize,
                                 FILESPY_CONTEXT_TAG );

    if (!ctx) {

        return STATUS_INSUFFICIENT_RESOURCES;
    }

    //
    //  Init the context structure
    //

    RtlZeroMemory( ctx, sizeof(SPY_STREAM_CONTEXT) );
    ctx->UseCount = 1;

    //
    //  Insert the file name
    //

    RtlInitEmptyUnicodeString( &ctx->Name,
                               (PWCHAR)(ctx + 1),
                               (USHORT)(contextSize -
                                        sizeof(SPY_STREAM_CONTEXT)) );

    RtlCopyUnicodeString( &ctx->Name, &fileName->Name );

    //
    //  If they don't want to keep this context, mark it temporary
    //

    if (!cacheName) {

        SetFlag(ctx->Flags, CTXFL_Temporary);
        INC_STATS(TotalContextTemporary);
    }

    //
    //  Return the object context
    //

    INC_STATS(TotalContextCreated);
    *pRetContext = ctx;

    //
    //  Cleanup the local NameControl structure
    //

    NLFreeNameControl( fileName, &gFileSpyNameBufferLookasideList );

    return STATUS_SUCCESS;
}


NTSTATUS
SpyGetContext (
    IN PDEVICE_OBJECT DeviceObject,
    IN PFILE_OBJECT FileObject,
    IN NAME_LOOKUP_FLAGS LookupFlags,
    OUT PSPY_STREAM_CONTEXT *pRetContext
    )
/*++

Routine Description:

    This will see if a given context already exists.  If not it will create
    one and return it.  Note:  the return context pointer is NULL on a
    failure.

    This will also see if all contexts are to be temporary (global flag in
    the extension).  If so, a temporary context is always created.  It also
    sees if the found context is marked temporary (because it is being
    renamed).  If so, a temporary context is also created and returned.

Arguments:

    DeviceObject - Device to operate on

    FileObject - The stream the context is being looked up/created for

    LookupFlags - State flags incase a context is created

    pRetContext - Receives the found/created context

Return Value:

    Status of the operation

--*/
{
    PFILESPY_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    PSPY_STREAM_CONTEXT pContext;
    PFSRTL_PER_STREAM_CONTEXT ctxCtrl;
    NTSTATUS status;
    BOOLEAN makeTemporary = FALSE;

    ASSERT(IS_FILESPY_DEVICE_OBJECT(DeviceObject));

    //
    //  Bump total search count
    //

    INC_STATS(TotalContextSearches);

    //
    //  See if the all-contexts-temporary state is on.  If not then do
    //  the normal search.
    //

    if (devExt->AllContextsTemporary != 0) {

        //
        //  Mark that we want this context to be temporary
        //

        makeTemporary = TRUE;

    } else {

        //
        //                      NOT-TEMPORARY
        //  Try and locate the context structure.  We acquire the list lock
        //  so that we can guarantee that the context will not go away between
        //  the time when we find it and can increment the use count
        //

        SpyAcquireContextLockShared( devExt );

        ctxCtrl = FsRtlLookupPerStreamContext( FsRtlGetPerStreamContextPointer(FileObject),
                                               devExt,
                                               NULL );

        if (NULL != ctxCtrl) {

            //
            //  A context was attached to the given stream
            //

            pContext = CONTAINING_RECORD( ctxCtrl,
                                          SPY_STREAM_CONTEXT,
                                          ContextCtrl );

            ASSERT(pContext->Stream == FsRtlGetPerStreamContextPointer(FileObject));
            ASSERT(FlagOn(pContext->Flags,CTXFL_InExtensionList));
            ASSERT(!FlagOn(pContext->Flags,CTXFL_Temporary));
            ASSERT(pContext->UseCount > 0);

            //
            //  See if this is marked that we should not use it (happens when a
            //  file is being renamed).
            //

            if (FlagOn(pContext->Flags,CTXFL_DoNotUse)) {

                //
                //  We should not use this context, unlock and set flag so we
                //  will create a temporary context.
                //

                SpyReleaseContextLock( devExt );
                makeTemporary = TRUE;

            } else {

                //
                //  We want this context so bump the use count and release
                //  the lock
                //

                InterlockedIncrement( &pContext->UseCount );

                SpyReleaseContextLock( devExt );
                INC_STATS(TotalContextFound);

                SPY_LOG_PRINT( SPYDEBUG_TRACE_CONTEXT_OPS,
                               ("FileSpy!SpyGetContext:         Found:      (%p) Fl=%02x Use=%d \"%wZ\"\n",
                                pContext,
                                pContext->Flags,
                                pContext->UseCount,
                                &pContext->Name) );

                //
                //  Return the found context
                //

                *pRetContext = pContext;
                return STATUS_SUCCESS;
            }

        } else {

            //
            //  We didn't find a context, release the lock
            //

            SpyReleaseContextLock( devExt );
        }
    }

    //
    //  For whatever reason, we did not find a context.
    //  See if contexts are supported for this particular file.  Note that
    //  NTFS does not presently support contexts on paging files.
    //

    if (!FsRtlSupportsPerStreamContexts(FileObject)) {

        INC_STATS(TotalContextsNotSupported);
        *pRetContext = NULL;
        return STATUS_NOT_SUPPORTED;
    }

    //
    //  If we get here we need to create a context, do it
    //

    status = SpyCreateContext( DeviceObject,
                               FileObject,
                               LookupFlags,
                               &pContext );

    if (!NT_SUCCESS( status )) {

        *pRetContext = NULL;
        return status;
    }

    //
    //  Mark context temporary (if requested)
    //

    if (makeTemporary) {

        SetFlag(pContext->Flags,CTXFL_Temporary);

        INC_STATS(TotalContextTemporary);

        SPY_LOG_PRINT( SPYDEBUG_TRACE_CONTEXT_OPS,
                       ("FileSpy!SpyGetContext:         RenAllTmp:  (%p) Fl=%02x Use=%d \"%wZ\"\n",
                        pContext,
                        pContext->Flags,
                        pContext->UseCount,
                        &pContext->Name) );

    } else {

        //
        //  Insert the context into the linked list.  Note that the
        //  link routine will see if this entry has already been added to
        //  the list (could happen while we were building it).  If so it
        //  will release the one we created and use the one it found in
        //  the list.  It will return the new entry (if it was changed).
        //  The link routine properly handles temporary contexts.
        //

        SpyLinkContext( DeviceObject,
                        FileObject,
                        &pContext );
    }

    SPY_LOG_PRINT( SPYDEBUG_TRACE_CONTEXT_OPS,
                   ("FileSpy!SrGetContext:          Created%s (%p) Fl=%02x Use=%d \"%wZ\"\n",
                    (FlagOn(pContext->Flags,CTXFL_Temporary) ? "Tmp:" : ":   "),
                    pContext,
                    pContext->Flags,
                    pContext->UseCount,
                    &pContext->Name) );

    //
    //  Return the context
    //

    ASSERT(pContext->UseCount > 0);

    *pRetContext = pContext;
    return STATUS_SUCCESS;
}


PSPY_STREAM_CONTEXT
SpyFindExistingContext (
    IN PDEVICE_OBJECT DeviceObject,
    IN PFILE_OBJECT FileObject
    )
/*++

Routine Description:

    See if a context for the given stream already exists.  If so it will
    bump the reference count and return the context.  If not, NULL
    is returned.

Arguments:

    DeviceObject - Device to operate on

    FileObject - The stream the context is being looked up for

Return Value:

    Returns the found context


--*/
{
    PFILESPY_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    PSPY_STREAM_CONTEXT pContext;
    PFSRTL_PER_STREAM_CONTEXT ctxCtrl;

    PAGED_CODE();
    ASSERT(IS_FILESPY_DEVICE_OBJECT(DeviceObject));

    //
    //  Try and locate the context structure.  We acquire the list lock
    //  so that we can guarantee that the context will not go away between
    //  the time when we find it and can increment the use count
    //

    INC_STATS(TotalContextSearches);

    SpyAcquireContextLockShared( devExt );

    ctxCtrl = FsRtlLookupPerStreamContext( FsRtlGetPerStreamContextPointer(FileObject),
                                           devExt,
                                           NULL );

    if (NULL != ctxCtrl) {

        //
        //  We found the entry, increment use count
        //

        pContext = CONTAINING_RECORD(ctxCtrl,SPY_STREAM_CONTEXT,ContextCtrl);

        ASSERT(pContext->Stream == FsRtlGetPerStreamContextPointer(FileObject));
        ASSERT(pContext->UseCount > 0);

        InterlockedIncrement( &pContext->UseCount );

        //
        //  Release the list lock
        //

        SpyReleaseContextLock( devExt );
        INC_STATS(TotalContextFound);

        SPY_LOG_PRINT( SPYDEBUG_TRACE_CONTEXT_OPS,
                       ("FileSpy!SpyFindExistingContext:Found:      (%p) Fl=%02x Use=%d \"%wZ\"\n",
                        pContext,
                        pContext->Flags,
                        pContext->UseCount,
                        &pContext->Name) );

    } else {

        //
        //  Release the list lock while we create the new context.
        //

        SpyReleaseContextLock( devExt );

        pContext = NULL;
    }

    return pContext;
}


VOID
SpyReleaseContext (
    IN PSPY_STREAM_CONTEXT pContext
    )
/*++

Routine Description:

    Decrement the use count for the given context.  If it goes to zero, free it

Arguments:

    pContext - The context to operate on

Return Value:

    None.

--*/
{
    PAGED_CODE();

    SPY_LOG_PRINT( SPYDEBUG_TRACE_DETAILED_CONTEXT_OPS,
                   ("FileSpy!SpyReleaseContext:     Release     (%p) Fl=%02x Use=%d \"%wZ\"\n",
                    pContext,
                    pContext->Flags,
                    pContext->UseCount,
                    &pContext->Name) );

    //
    //  Decrement USE count, free context if zero
    //

    ASSERT(pContext->UseCount > 0);

    if (InterlockedDecrement( &pContext->UseCount ) <= 0) {

        ASSERT(!FlagOn(pContext->Flags,CTXFL_InExtensionList));

        //
        //  Free the memory
        //

        SPY_LOG_PRINT( SPYDEBUG_TRACE_CONTEXT_OPS,
                       ("FileSpy!SpyReleaseContext:     Freeing     (%p) Fl=%02x Use=%d \"%wZ\"\n",
                         pContext,
                         pContext->Flags,
                         pContext->UseCount,
                         &pContext->Name) );

        INC_STATS(TotalContextDeferredFrees);
        SpyFreeContext( pContext );
    }
}

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
北条麻妃国产九九精品视频| 94-欧美-setu| 国产精品午夜在线| 欧美亚洲国产一卡| 国产精品综合av一区二区国产馆| 日韩理论片中文av| 精品国产乱码91久久久久久网站| 97精品电影院| 国产一区二区精品久久| 亚洲成人av一区二区| 国产精品理伦片| 精品国产凹凸成av人网站| 91视频一区二区| 国产一区二区三区在线观看免费视频| 亚洲一区二区美女| 中文字幕亚洲欧美在线不卡| 欧美videos大乳护士334| 欧美在线三级电影| 91同城在线观看| 国产99精品国产| 久久国产福利国产秒拍| 亚洲一区二区三区四区的| 欧美激情自拍偷拍| www国产精品av| 精品国免费一区二区三区| 欧美日韩国产首页| 欧洲精品在线观看| 一本色道久久综合精品竹菊| 成人免费毛片aaaaa**| 精品影院一区二区久久久| 天堂影院一区二区| 五月激情六月综合| 亚洲一区二区三区小说| 亚洲免费观看在线视频| 中文久久乱码一区二区| 中文文精品字幕一区二区| 欧美精品一区视频| 欧美大尺度电影在线| 欧美一级在线免费| 欧美一级xxx| 91精品国产综合久久婷婷香蕉 | 97精品国产97久久久久久久久久久久| 国产一区二区三区最好精华液| 蜜桃久久久久久| 日本aⅴ精品一区二区三区| 日韩不卡一区二区三区 | 蜜桃在线一区二区三区| 日本大胆欧美人术艺术动态 | 国产美女视频91| 国产主播一区二区三区| 国产福利一区二区| 高清国产一区二区三区| 成人午夜视频网站| 不卡一区二区三区四区| www.久久久久久久久| 91麻豆国产福利精品| 欧美三级日韩三级国产三级| 欧美欧美欧美欧美| 精品国产亚洲在线| 国产午夜精品福利| 亚洲色图视频网站| 亚洲成人av一区| 看国产成人h片视频| 国产真实乱偷精品视频免| 成人网在线免费视频| 91丨九色丨黑人外教| 91福利国产成人精品照片| 欧美日韩精品一区二区三区四区 | 亚洲欧美在线视频| 亚洲超碰97人人做人人爱| 麻豆精品在线看| 国产成人av资源| 色久优优欧美色久优优| 欧美久久一二三四区| 精品国产伦一区二区三区观看体验 | 日本欧美一区二区| 国产成人免费av在线| 日本道色综合久久| 日韩一区二区在线看| 中文字幕乱码一区二区免费| 免费成人深夜小野草| 国产精品羞羞答答xxdd| 91黄色免费看| 久久综合久久综合亚洲| 综合欧美亚洲日本| 久久精品国产亚洲一区二区三区| 成人h版在线观看| 欧美日韩成人综合| 国产精品精品国产色婷婷| 五月婷婷激情综合网| 国产69精品一区二区亚洲孕妇| 欧美性大战久久久久久久| 精品国内二区三区| 亚洲六月丁香色婷婷综合久久| 久久99国产精品成人| 色狠狠一区二区三区香蕉| 久久久久久亚洲综合影院红桃| 一区二区三区在线观看视频| 老色鬼精品视频在线观看播放| 99精品视频一区| 久久亚洲欧美国产精品乐播| 亚洲成人1区2区| www.色精品| 欧美一区二区日韩| 亚洲香肠在线观看| 成人毛片老司机大片| 制服丝袜亚洲网站| 亚洲美女淫视频| 国产盗摄一区二区三区| 欧美一级免费大片| 亚洲视频综合在线| 国产成人av影院| 日韩三区在线观看| 亚洲mv在线观看| 色综合久久中文字幕综合网| 国产免费观看久久| 黄色精品一二区| 91精品国产91热久久久做人人| 亚洲品质自拍视频网站| 成人综合在线观看| 久久久久久久久岛国免费| 日本中文字幕一区二区有限公司| 在线观看日韩精品| 亚洲精品免费在线观看| www.日韩大片| 国产精品久久久一区麻豆最新章节| 激情图区综合网| 欧美一区二区精品久久911| 亚洲国产一区在线观看| 91麻豆精东视频| 亚洲精品国产无天堂网2021| www.日韩在线| 最新国产の精品合集bt伙计| 成人黄色免费短视频| 久久精品亚洲国产奇米99| 国产一区二区精品久久91| 久久久久久**毛片大全| 国产在线一区观看| 国产亚洲美州欧州综合国| 国产精品资源在线| 国产日韩av一区二区| 国产激情精品久久久第一区二区| ww亚洲ww在线观看国产| 精品影院一区二区久久久| 精品欧美乱码久久久久久| 精品写真视频在线观看 | 久久青草国产手机看片福利盒子| 蜜臀av一区二区在线观看| 日韩美女一区二区三区| 国产麻豆午夜三级精品| 国产日韩精品一区二区三区| 波多野结衣亚洲一区| 亚洲欧洲精品一区二区精品久久久| a亚洲天堂av| 亚洲专区一二三| 91精品国产综合久久久久| 久久99热狠狠色一区二区| 久久久高清一区二区三区| 成人丝袜18视频在线观看| 美女免费视频一区二区| 久久亚洲春色中文字幕久久久| 国产**成人网毛片九色| 亚洲黄色免费网站| 日韩一区二区在线看片| 国产传媒欧美日韩成人| 1024精品合集| 欧美丰满少妇xxxbbb| 国产麻豆视频一区| 成人免费小视频| 欧美剧情片在线观看| 国产乱人伦精品一区二区在线观看 | 久久久综合网站| 91亚洲国产成人精品一区二区三| 亚洲一区二区av在线| 欧美不卡激情三级在线观看| 不卡一区二区在线| 日韩国产精品久久久久久亚洲| 亚洲精品在线观| 不卡大黄网站免费看| 午夜精品在线视频一区| 国产亚洲成av人在线观看导航 | 成人一区二区三区在线观看| 亚洲精品成人少妇| 日韩精品一区二区三区中文精品| 成人一级片网址| 视频一区二区不卡| 1区2区3区国产精品| 91精品国产综合久久久久久| 成人免费视频播放| 五月天婷婷综合| 国产精品国产三级国产普通话三级 | 精品一区二区三区免费视频| 中文字幕五月欧美| 日韩免费观看高清完整版| www.久久久久久久久| 久久9热精品视频| 一区二区日韩av| 国产欧美视频在线观看| 3atv一区二区三区| 色悠悠亚洲一区二区|