KS相机驱动
+ -

KsPinGetFirstCloneStreamPointer

2025-03-06 12 0

KsPinGetFirstCloneStreamPointer用于获取第一个克隆的streampointer。

PKSSTREAM_POINTER
NTAPI
KsPinGetFirstCloneStreamPointer(
    IN PKSPIN Pin
    )
    {
        PKSPPROCESSPIPESECTION pipeSection =
        CONTAINING_RECORD(Pin,KSPIN_EXT,Public)->ProcessPin->PipeSection;

    PKSPSTREAM_POINTER result;

    if (pipeSection && pipeSection->Queue) {
        result = pipeSection->Queue->GetFirstClone();
    } else {
        result = NULL;
    }

    return result ? &result->Public : NULL;
}

GetFirstClone函数如下:

STDMETHODIMP_(PKSPSTREAM_POINTER)
CKsQueue::
GetFirstClone(
    void
    )
{
    KIRQL oldIrql;
    KeAcquireSpinLock(&m_FrameQueue.SpinLock,&oldIrql);

    PKSPSTREAM_POINTER streamPointer;
    //不为空
    if (m_StreamPointers.Flink != &m_StreamPointers){
        //取第一个
        streamPointer =   CONTAINING_RECORD(m_StreamPointers.Flink,KSPSTREAM_POINTER,ListEntry);
    } else {
        streamPointer = NULL;
    }

    //
    // Don't return internal pointers on iteration.  This might want
    // to be a flag.
    //
    while (streamPointer && streamPointer->Type == KSPSTREAM_POINTER_TYPE_INTERNAL)
        streamPointer = GetNextClone (streamPointer);

    KeReleaseSpinLock(&m_FrameQueue.SpinLock,oldIrql);

    return streamPointer;
}

GetNextClone是获取下一个。因为是从头部开始的。

CKsQueue::
GetNextClone(
    IN PKSPSTREAM_POINTER StreamPointer
    )
{
    KIRQL oldIrql;
    KeAcquireSpinLock(&m_FrameQueue.SpinLock,&oldIrql);

    //
    // Don't return internally held stream pointers on iteration.  This
    // may want to be a flag.
    //
    PKSPSTREAM_POINTER streamPointer = StreamPointer;
    do {
        if (streamPointer->ListEntry.Flink != &m_StreamPointers) {
            streamPointer = 
                CONTAINING_RECORD(
                    streamPointer->ListEntry.Flink,
                    KSPSTREAM_POINTER,
                    ListEntry);
        } else {
            streamPointer = NULL;
        }
    } while (streamPointer &&
        streamPointer->Type == KSPSTREAM_POINTER_TYPE_INTERNAL);

    KeReleaseSpinLock(&m_FrameQueue.SpinLock,oldIrql);

    return streamPointer;
}

0 篇笔记 写笔记

KsPinGetFirstCloneStreamPointer
KsPinGetFirstCloneStreamPointer用于获取第一个克隆的streampointer。PKSSTREAM_POINTERNTAPIKsPinGetFirstCloneStreamPointer( IN PKSPIN Pin ) { ......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!