};
+typedef struct
+{
+ PVOID Tag;
+ UCHAR Used;
+}KSSTREAM_TAG, *PKSSTREAM_TAG;
+
typedef struct
{
ULONG StreamHeaderCount;
PKSSTREAM_HEADER CurStreamHeader;
PVOID * Data;
- PVOID * Tags;
+ PKSSTREAM_TAG Tags;
}KSSTREAM_DATA, *PKSSTREAM_DATA;
#define STREAM_DATA_OFFSET (0)
if (m_TagSupportEnabled)
{
// allocate array for storing the pointers of the data */
- StreamData->Tags = (PVOID*)AllocateItem(NonPagedPool, sizeof(PVOID) * StreamData->StreamHeaderCount, TAG_PORTCLASS);
+ StreamData->Tags = (PKSSTREAM_TAG)AllocateItem(NonPagedPool, sizeof(KSSTREAM_TAG) * StreamData->StreamHeaderCount, TAG_PORTCLASS);
if (!StreamData->Data)
{
// out of memory
PKSSTREAM_DATA StreamData;
/* sanity checks */
- PC_ASSERT(Tag != NULL);
PC_ASSERT(PhysicalAddress);
PC_ASSERT(VirtualAddress);
PC_ASSERT(ByteCount);
*VirtualAddress = StreamData->Data[StreamData->StreamHeaderIndex];
// store tag in irp
- StreamData->Tags[StreamData->StreamHeaderIndex] = Tag;
+ StreamData->Tags[StreamData->StreamHeaderIndex].Tag = Tag;
+ StreamData->Tags[StreamData->StreamHeaderIndex].Used = TRUE;
+
+ // increment header index
+ StreamData->StreamHeaderIndex++;
// mapping size
if (m_Descriptor->DataFlow == KSPIN_DATAFLOW_IN)
m_NumDataAvailable -= StreamData->CurStreamHeader->FrameExtent;
}
- if (StreamData->StreamHeaderIndex + 1 == StreamData->StreamHeaderCount)
+ if (StreamData->StreamHeaderIndex == StreamData->StreamHeaderCount)
{
// last mapping
*Flags = 1;
// one more mapping in the irp
*Flags = 0;
- // increment header index
- StreamData->StreamHeaderIndex++;
-
// move to next header
StreamData->CurStreamHeader = (PKSSTREAM_HEADER)((ULONG_PTR)StreamData->CurStreamHeader + StreamData->CurStreamHeader->Size);
}
for(Index = 0; Index < StreamData->StreamHeaderIndex; Index++)
{
// check if it is the same tag
- if (StreamData->Tags[Index] == Tag)
+ if (StreamData->Tags[Index].Tag == Tag && StreamData->Tags[Index].Used == TRUE)
{
// mark mapping as released
- StreamData->Tags[Index] = NULL;
+ StreamData->Tags[Index].Tag = NULL;
+ StreamData->Tags[Index].Used = FALSE;
// done
return STATUS_SUCCESS;
StreamData = (PKSSTREAM_DATA)Irp->Tail.Overlay.DriverContext[STREAM_DATA_OFFSET];
// sanity check
- PC_ASSERT(StreamData->StreamHeaderIndex + 1 == StreamData->StreamHeaderCount);
+ PC_ASSERT(StreamData->StreamHeaderIndex == StreamData->StreamHeaderCount);
// check if the released mapping is one of these
for(Index = 0; Index < StreamData->StreamHeaderCount; Index++)
{
- if (StreamData->Tags[Index] == Tag)
+ if (StreamData->Tags[Index].Tag == Tag &&
+ StreamData->Tags[Index].Used == TRUE)
{
// mark mapping as released
- StreamData->Tags[Index] = NULL;
+ StreamData->Tags[Index].Tag = NULL;
+ StreamData->Tags[Index].Used = FALSE;
// done
break;
// therefore if the current mapping is not the searched one, it must have been already
// released
//
- PC_ASSERT(StreamData->Tags[Index] == NULL);
+ ASSERT(StreamData->Tags[Index].Tag == NULL);
+ ASSERT(StreamData->Tags[Index].Used == FALSE);
}
}