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;
}