KS源码分析
+ -

KsStreamPointerAdvanceOffsets

2025-03-07 0 0

KsStreamPointerAdvanceOffsets用于前移StreamPointer偏移.

NTSTATUS 
  KsStreamPointerAdvanceOffsets(
    IN PKSSTREAM_POINTER  StreamPointer,
    IN ULONG  InUsed,
    IN ULONG  OutUsed,
    IN BOOLEAN  Eject
    )
{
    //首先,StreapPointer的状态必须为锁定状态
   if (streamPointer->State != KSPSTREAM_POINTER_STATE_LOCKED) {
        return STATUS_DEVICE_NOT_READY;
    }

    //对于输入数据
    if (StreamPointer->OffsetIn.Data && (InUsed || (StreamPointer->OffsetIn.Count == 0)))
    {
        ASSERT(InUsed <= StreamPointer->OffsetIn.Remaining);
        StreamPointer->OffsetIn.Data += InUsed * streamPointer->Stride;
        StreamPointer->OffsetIn.Remaining -= InUsed;
        if (StreamPointer->OffsetIn.Remaining == 0) {
            Eject = TRUE;
        }

        updateIn = TRUE;
    }

    //对于输出数据
    if (StreamPointer->OffsetOut.Data && (OutUsed || (StreamPointer->OffsetOut.Count == 0)))
    {
        ASSERT(OutUsed <= StreamPointer->OffsetOut.Remaining);
        StreamPointer->OffsetOut.Data += OutUsed * streamPointer->Stride; //指针偏移
        StreamPointer->OffsetOut.Remaining -= OutUsed;                    //无效数据量减少
        if (StreamPointer->OffsetOut.Remaining == 0) {
            Eject = TRUE;
        }

        updateOut = TRUE;

    }

    //更新队列总的统计量
    streamPointer->Queue->UpdateByteAvailability(streamPointer, updateIn ? InUsed : 0, updateOut ? OutUsed : 0);

    //Eject表示数据空间是否已经完成,即Remaining=0了,表示该SteamFrame已经完了,需要切换到下一下。
    //不过这个切法虽然代码看的很迷惑,不过方法就是解锁,再上锁
    //这个可参考KsStreamPointerAdvance函数的实现也是这么搞的,只不过他多了一个是否是锁定StreamPoint的功能
    if (Eject) {
        //
        // Advancing a locked stream pointer involves unlocking it and then
        // locking it again.  If there is no frame to advance to, the pointer
        // ends up unlocked and we return an error.
        //
        streamPointer->Queue->UnlockStreamPointer(streamPointer,KSPSTREAM_POINTER_MOTION_ADVANCE);
        if (streamPointer->Queue->LockStreamPointer(streamPointer)) {
            status = STATUS_SUCCESS;
        } else {
            status = STATUS_DEVICE_NOT_READY;
        }
    } else {
        status = STATUS_SUCCESS;
    }
}

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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