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

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

?? fspyctx.c

?? 一個(gè)文件過(guò)濾驅(qū)動(dòng)程序的例子
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
                    //

                    if (FlagOn(RecordList->Flags,RLFL_IS_DIRECTORY)) {

                        //
                        //  We were renaming a directory, decrement the
                        //  AllContexts temporary flag.  We need to always
                        //  do this, even on a failure
                        //

                        ASSERT(devExt->AllContextsTemporary > 0);
                        InterlockedDecrement( &devExt->AllContextsTemporary );
                        ASSERT(!FlagOn(pContext->Flags,CTXFL_DoNotUse));

                    } else {

                        //
                        //  We were renaming a file, delete the given context
                        //  if the operation was successful
                        //

                        ASSERT(FlagOn(pContext->Flags,CTXFL_DoNotUse));

                        if (NT_SUCCESS(Irp->IoStatus.Status)) {

                            SpyDeleteContext( deviceObject, pContext );
                        }
                    }

                    SpyReleaseContext( pContext );
                }
            }
            break;

        default:

            //
            //  Validate this field isn't set for anything else
            //

            ASSERT(RecordList->NewContext == NULL);
            break;
    }

    //
    //  Process the log record
    //

    if (SHOULD_LOG( deviceObject )) {

        pRecordIrp = &RecordList->LogRecord.Record.RecordIrp;

        //
        // Record the information we use for a completion Irp.
        //

        pRecordIrp->ReturnStatus = Irp->IoStatus.Status;
        pRecordIrp->ReturnInformation = Irp->IoStatus.Information;
        KeQuerySystemTime(&pRecordIrp->CompletionTime);

        //
        //  Add RecordList to our gOutputBufferList so that it gets up to
        //  the user
        //

        SpyLog( RecordList );

    } else {

        if (RecordList) {

            //
            //  Context is set with a RECORD_LIST, but we are no longer
            //  logging so free this record.
            //

            SpyFreeRecord( RecordList );
        }
    }
}


VOID
SpySetName (
    IN PRECORD_LIST RecordList,
    IN PDEVICE_OBJECT DeviceObject,
    IN PFILE_OBJECT FileObject,
    IN NAME_LOOKUP_FLAGS LookupFlags,
    IN PSPY_STREAM_CONTEXT Context OPTIONAL
    )
/*++

Routine Description:

    This routine is used to set the file name.  This routine first tries to
    locate a context structure associated with the given stream.  If one is
    found the name is used from it.  If not found the name is looked up, and
    a context structure is created and attached to the given stream.

    In all cases some sort of name will be set.

Arguments:

    RecordList - RecordList to copy name to.
    LookupFlags - holds state flags for the lookup
    Context - optional context parameter.  If not defined one will be looked
        up.

Return Value:

    None.

--*/
{
    PRECORD_IRP pRecordIrp = &RecordList->LogRecord.Record.RecordIrp;
    PFILESPY_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    BOOLEAN releaseContext = FALSE;
    PNAME_CONTROL fileName;
    NTSTATUS status;
    PUNICODE_STRING nameToUse;

    ASSERT(IS_FILESPY_DEVICE_OBJECT( DeviceObject ));

    if (!ARGUMENT_PRESENT(Context) &&
        !FlagOn(LookupFlags,NLFL_NO_LOOKUP)) {

        //
        //  If no FileObject, just return
        //

        if (NULL == FileObject) {

            return;
        }

        //
        //  This will set the return context to NULL if no context
        //  could be created.
        //

        SpyGetContext( DeviceObject,
                       FileObject,
                       LookupFlags,
                       &Context );

        //
        //  Mark that we need to release this context (since we grabbed it)
        //

        releaseContext = TRUE;
    }

    //
    //  If we got a context, use the name from it.  If we didn't, at least
    //  put the device name out there
    //

    if (NULL != Context) {

        SpyCopyFileNameToLogRecord( &RecordList->LogRecord,
                                    &Context->Name );

    } else {

        SPY_LOG_PRINT( SPYDEBUG_TRACE_DETAILED_CONTEXT_OPS,
                       ("FileSpy!SpySetName:            NoCtx                              \"%wZ\"\n",
                        &devExt->NLExtHeader.DeviceName) );

        status = NLAllocateNameControl( &fileName,
                                   &gFileSpyNameBufferLookasideList );

        if (NT_SUCCESS( status )) {

            //
            //  Use the DOS device name if the proper flag is set and a DOS
            //  device name is available.
            //

            if (FlagOn( LookupFlags, NLFL_USE_DOS_DEVICE_NAME ) &&
                devExt->NLExtHeader.DosName.Length != 0) {

                nameToUse = &devExt->NLExtHeader.DosName;

            } else {

                nameToUse = &devExt->NLExtHeader.DeviceName;
            }

            NLCheckAndGrowNameControl( fileName,
                          (USHORT)(nameToUse->Length +
                                   sizeof(L"[-=Context Not Found=-]")) );
            RtlCopyUnicodeString( &fileName->Name,
                                  nameToUse );
            RtlAppendUnicodeToString( &fileName->Name,
                                      L"[-=Context Not Found=-]" );

            SpyCopyFileNameToLogRecord( &RecordList->LogRecord,
                                        &fileName->Name );
            NLFreeNameControl( fileName, &gFileSpyNameBufferLookasideList );
        }
    }

    //
    //  Release the context if we grabbed it in this routine
    //

    if ((NULL != Context) && releaseContext) {

        SpyReleaseContext( Context );
    }
}


VOID
SpyNameDeleteAllNames (
    VOID
    )
/*++

Routine Description:

    This routine will walk through all attaches volumes and delete all
    contexts in each volume.

Arguments:

    None

Return Value:

    None

--*/
{
    PLIST_ENTRY link;
    PFILESPY_DEVICE_EXTENSION devExt;

    ExAcquireFastMutex( &gSpyDeviceExtensionListLock );

    for (link = gSpyDeviceExtensionList.Flink;
         link != &gSpyDeviceExtensionList;
         link = link->Flink)
    {

        devExt = CONTAINING_RECORD(link, FILESPY_DEVICE_EXTENSION, NextFileSpyDeviceLink);

        SpyDeleteAllContexts( devExt->NLExtHeader.ThisDeviceObject );
    }

    ExReleaseFastMutex( &gSpyDeviceExtensionListLock );
}


///////////////////////////////////////////////////////////////////////////
//
//                      Context support routines
//
///////////////////////////////////////////////////////////////////////////

VOID
SpyInitDeviceNamingEnvironment (
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    Initializes context information for a given device

Arguments:

    DeviceObject - Device to init

Return Value:

    None.

--*/
{
    PFILESPY_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;

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

    InitializeListHead( &devExt->CtxList );
    ExInitializeResourceLite( &devExt->CtxLock );

    SetFlag( devExt->Flags, ContextsInitialized );
}


VOID
SpyCleanupDeviceNamingEnvironment (
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    Cleans up the context information for a given device

Arguments:

    DeviceObject - Device to cleanup

Return Value:

    None.

--*/
{
    PFILESPY_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;

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

    //
    //  Cleanup if initialized
    //

    if (FlagOn(devExt->Flags,ContextsInitialized)) {

        //
        //  Delete all existing contexts
        //

        SpyDeleteAllContexts( DeviceObject );
        ASSERT(IsListEmpty( &devExt->CtxList ));

        //
        //  Release resource
        //

        ExDeleteResourceLite( &devExt->CtxLock );

        //
        //  Flag not initialized
        //

        ClearFlag( devExt->Flags, ContextsInitialized );
    }
}


VOID
SpyDeleteAllContexts (
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    This will free all existing contexts for the given device

Arguments:

    DeviceObject - Device to operate on

Return Value:

    None.

--*/
{
    PFILESPY_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    PLIST_ENTRY link;
    PSPY_STREAM_CONTEXT pContext;
    PFSRTL_PER_STREAM_CONTEXT ctxCtrl;
    LIST_ENTRY localHead;
    ULONG deleteNowCount = 0;
    ULONG deleteDeferredCount = 0;
    ULONG deleteInCallbackCount = 0;

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

    INC_STATS(TotalContextDeleteAlls);

    InitializeListHead( &localHead );

    try {

        //
        //  Acquire list lock
        //

        SpyAcquireContextLockExclusive( devExt );

        //
        //  Walk the list of contexts and release each one
        //

        while (!IsListEmpty( &devExt->CtxList )) {

            //
            //  Unlink from top of list
            //

            link = RemoveHeadList( &devExt->CtxList );
            pContext = CONTAINING_RECORD( link, SPY_STREAM_CONTEXT, ExtensionLink );

            //
            //  Mark that we are unlinked from the list.  We need to do this
            //  because of the race condition between this routine and the
            //  deleteCallback from the FS.
            //

            ASSERT(FlagOn(pContext->Flags,CTXFL_InExtensionList));
            RtlInterlockedClearBitsDiscardReturn(&pContext->Flags,CTXFL_InExtensionList);

            //
            //  Try and remove ourselves from the File Systems context control
            //  structure.  Note that the file system could be trying to tear
            //  down their context control right now.  If they are then we
            //  will get a NULL back from this call.  This is OK because it
            //  just means that they are going to free the memory, not us.
            //  NOTE:  This will be safe because we are holding the ContextLock
            //         exclusively.  If this were happening then they would be
            //         blocked in the callback routine on this lock which
            //         means the file system has not freed the memory for
            //         this yet.
            //

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

                ctxCtrl = FsRtlRemovePerStreamContext( pContext->Stream,
                                                       devExt,
                                                       NULL );

                //
                //  Always clear the flag wether we found it in the list or
                //  not.  We can have the flag set and not be in the list if
                //  after we acquired the context list lock we context swapped
                //  and the file system is right now in SpyDeleteContextCallback
                //  waiting on the list lock.
                //

                RtlInterlockedClearBitsDiscardReturn(&pContext->Flags,CTXFL_InStreamList);

                //
                //  Handle wether we were still attached to the file or not.
                //

                if (NULL != ctxCtrl) {

                    ASSERT(pContext == CONTAINING_RECORD(ctxCtrl,SPY_STREAM_CONTEXT,ContextCtrl));

                    //
                    //  To save time we don't do the free now (with the lock
                    //  held).  We link into a local list and then free it
                    //  later (in this routine).  We can do this because it
                    //  is no longer on any list.
                    //

                    InsertHeadList( &localHead, &pContext->ExtensionLink );

                } else {

                    //
                    //  The context is in the process of being freed by the file
                    //  system.  Don't do anything with it here, it will be
                    //  freed in the callback.
                    //

                    INC_STATS(TotalContextsNotFoundInStreamList);
                    INC_LOCAL_STATS(deleteInCallbackCount);
                }
            }
        }
    } finally {

        SpyReleaseContextLock( devExt );
    }

    //
    //  We have removed everything from the list and released the list lock.
    //  Go through and figure out what entries we can free and then do it.
    //

    while (!IsListEmpty( &localHead )) {

        //
        //  Get next entry of the list and get our context back
        //

        link = RemoveHeadList( &localHead );
        pContext = CONTAINING_RECORD( link, SPY_STREAM_CONTEXT, ExtensionLink );

        //
        //  Decrement the USE count and see if we can free it now
        //

        ASSERT(pContext->UseCount > 0);

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

            //
            //  No one is using it, free it now
            //

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本色道**综合亚洲精品蜜桃冫| 99免费精品在线| 国产网站一区二区| 欧美日韩一级二级三级| 国产精品自拍一区| 亚洲大片精品永久免费| 欧美国产乱子伦| 日韩欧美中文字幕制服| 一本大道久久a久久精二百| 精品一区二区三区日韩| 一区二区三区日本| 国产精品每日更新在线播放网址| 欧美一级电影网站| 欧美日韩一区国产| 91丨九色丨国产丨porny| 狠狠色丁香婷婷综合| 99久久精品99国产精品 | 中文字幕一区二区三区在线不卡 | www.色精品| 国产精品一区二区91| 日本人妖一区二区| 亚洲国产精品人人做人人爽| 中文字幕亚洲成人| 久久久99久久| 精品999久久久| 日韩一区二区三区高清免费看看 | 欧美一级日韩免费不卡| 欧美午夜精品久久久久久孕妇| 成人一区二区三区视频在线观看| 久久精品国产一区二区| 美女在线一区二区| 日本不卡123| 午夜精品久久久久久久99水蜜桃| 亚洲精品乱码久久久久久| 国产精品久久久久久久久搜平片 | 欧美精品色一区二区三区| 色婷婷久久久久swag精品| 91在线一区二区三区| 成人av电影观看| 99久久er热在这里只有精品66| 国产999精品久久久久久绿帽| 国产成人一级电影| 成人午夜免费视频| 成人免费看黄yyy456| 99久久99久久免费精品蜜臀| 色呦呦日韩精品| 精品污污网站免费看| 欧美日韩国产美| 91麻豆精品国产91久久久更新时间| 欧美日韩大陆在线| 日韩精品一区二区在线| 精品成人一区二区| 日本一区二区视频在线观看| 亚洲欧美自拍偷拍| 亚洲在线成人精品| 亚洲成人av资源| 美女网站在线免费欧美精品| 久久99精品国产.久久久久| 国产露脸91国语对白| 成人av免费观看| 精品视频色一区| 精品久久久网站| 国产精品免费视频网站| 亚洲乱码国产乱码精品精可以看| 午夜视频一区二区三区| 捆绑调教一区二区三区| 国产在线看一区| av电影在线观看完整版一区二区| 在线观看视频91| 欧美α欧美αv大片| 欧美激情一区二区三区四区| 亚洲一区二区三区影院| 九色综合国产一区二区三区| 成人av在线播放网站| 欧美日韩精品一区二区三区| 精品国产一区二区精华| 1024亚洲合集| 日韩va欧美va亚洲va久久| 国产91富婆露脸刺激对白| 在线观看日韩电影| 精品国产一区二区精华| 18涩涩午夜精品.www| 全部av―极品视觉盛宴亚洲| 成人综合在线观看| 欧美另类一区二区三区| 国产精品免费av| 男人的j进女人的j一区| av在线不卡免费看| 精品裸体舞一区二区三区| 日韩毛片高清在线播放| 国精产品一区一区三区mba桃花| 91理论电影在线观看| 亚洲精品一区二区三区蜜桃下载 | 欧美精品丝袜中出| 国产精品久久久久永久免费观看| 视频一区二区三区入口| 成人性生交大片免费看中文 | 欧美精品一区二区精品网| 亚洲三级电影网站| 国产一区二区导航在线播放| 日本电影亚洲天堂一区| 国产拍欧美日韩视频二区| 欧美a级一区二区| 91丝袜美腿高跟国产极品老师 | 国产精品久久久久四虎| 久久精品免费看| 欧美色男人天堂| 亚洲人成网站在线| 成人一区二区三区| 久久人人超碰精品| 久久国产精品99久久人人澡| 欧美色图在线观看| 中文字幕一区二区三区在线观看 | 99麻豆久久久国产精品免费| 日韩精品一区在线| 日韩1区2区3区| 欧美日韩三级一区二区| 亚洲精品午夜久久久| eeuss影院一区二区三区| 26uuu亚洲综合色| 久久99精品国产.久久久久 | 亚洲三级理论片| 成人av网站在线| 中文一区在线播放| 国产一区二区在线看| 精品久久久久久久久久久久久久久 | 亚洲国产精品二十页| 国产美女久久久久| 精品日韩一区二区三区免费视频| 天天亚洲美女在线视频| 欧美日本在线播放| 午夜久久久久久| 制服丝袜中文字幕亚洲| 日韩国产精品久久久久久亚洲| 欧美三区免费完整视频在线观看| 亚洲精品国久久99热| 日本电影亚洲天堂一区| 亚洲综合色成人| 欧美日韩五月天| 亚洲成在线观看| 欧美乱妇一区二区三区不卡视频 | 国产超碰在线一区| 国产欧美一区二区三区沐欲| 国产成人自拍网| 成人欧美一区二区三区白人| 波多野结衣精品在线| 亚洲精品五月天| 欧美日韩国产综合久久| 蜜臀久久久99精品久久久久久| 日韩精品一区二区三区在线| 精品一区二区三区视频在线观看| 久久久亚洲欧洲日产国码αv| 国产**成人网毛片九色 | 国产乱色国产精品免费视频| 久久丝袜美腿综合| www.亚洲国产| 午夜影视日本亚洲欧洲精品| 日韩亚洲欧美综合| 国产一区二区日韩精品| 综合久久久久久久| 欧美视频在线播放| 日日夜夜精品视频免费| 精品国产一区二区三区久久久蜜月| 国产精品1区二区.| 亚洲精品欧美在线| 4438x亚洲最大成人网| 国产成人av电影免费在线观看| 中文字幕一区二区三区在线观看 | 国产精品久久久久aaaa| 在线精品视频小说1| 日本中文一区二区三区| 国产欧美日韩亚州综合| 欧美天天综合网| 国产真实精品久久二三区| 亚洲三级久久久| 欧美成人video| av动漫一区二区| 免费久久99精品国产| 国产精品欧美久久久久一区二区| 欧美亚洲自拍偷拍| 国产一区二区三区久久久 | 国产传媒欧美日韩成人| 亚洲制服欧美中文字幕中文字幕| 精品国产123| 在线精品视频免费播放| 国产精品69毛片高清亚洲| 亚洲一区二区三区美女| 日本一区二区免费在线观看视频 | 精品久久国产老人久久综合| 97精品视频在线观看自产线路二| 美女网站色91| 亚洲综合精品久久| 久久久亚洲高清| 555www色欧美视频| 91网上在线视频| 成人激情电影免费在线观看| 欧美a一区二区| 午夜欧美大尺度福利影院在线看 | 国产三级久久久| 91精品国产高清一区二区三区|