Author: janderwald Date: Mon Sep 28 12:30:34 2009 New Revision: 43200
URL: http://svn.reactos.org/svn/reactos?rev=43200&view=rev Log: - Handle variable sized PCPIN_DESCRIPTORs
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/p... ============================================================================== --- trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp [iso-8859-1] Mon Sep 28 12:30:34 2009 @@ -160,6 +160,7 @@ ULONG Index, SubIndex; PKSDATARANGE DataRange; NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES; + PPCPIN_DESCRIPTOR SrcDescriptor;
Descriptor = (PSUBDEVICE_DESCRIPTOR)AllocateItem(NonPagedPool, sizeof(SUBDEVICE_DESCRIPTOR), TAG_PORTCLASS); if (!Descriptor) @@ -234,7 +235,7 @@
if (FilterDescription->PinCount) { - Descriptor->Factory.KsPinDescriptor = (PKSPIN_DESCRIPTOR)AllocateItem(NonPagedPool, FilterDescription->PinSize * FilterDescription->PinCount, TAG_PORTCLASS); + Descriptor->Factory.KsPinDescriptor = (PKSPIN_DESCRIPTOR)AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) * FilterDescription->PinCount, TAG_PORTCLASS); if (!Descriptor->Factory.KsPinDescriptor) goto cleanup;
@@ -243,40 +244,44 @@ goto cleanup;
Descriptor->Factory.PinDescriptorCount = FilterDescription->PinCount; - Descriptor->Factory.PinDescriptorSize = FilterDescription->PinSize; + Descriptor->Factory.PinDescriptorSize = sizeof(KSPIN_DESCRIPTOR); + + SrcDescriptor = (PPCPIN_DESCRIPTOR)FilterDescription->Pins; + DPRINT("Size %u Expected %u Ex Size %u\n", FilterDescription->PinSize, sizeof(KSPIN_DESCRIPTOR), sizeof(KSPIN_DESCRIPTOR_EX));
// copy pin factories for(Index = 0; Index < FilterDescription->PinCount; Index++) { - RtlMoveMemory(&Descriptor->Factory.KsPinDescriptor[Index], &FilterDescription->Pins[Index].KsPinDescriptor, FilterDescription->PinSize); - - if (FilterDescription->Pins[Index].KsPinDescriptor.DataRangesCount) + RtlMoveMemory(&Descriptor->Factory.KsPinDescriptor[Index], &SrcDescriptor->KsPinDescriptor, sizeof(KSPIN_DESCRIPTOR)); + + if (SrcDescriptor->KsPinDescriptor.DataRangesCount) { - Descriptor->Factory.KsPinDescriptor[Index].DataRanges = (const PKSDATARANGE*)AllocateItem(NonPagedPool, FilterDescription->Pins[Index].KsPinDescriptor.DataRangesCount * sizeof(PKSDATARANGE), TAG_PORTCLASS); + Descriptor->Factory.KsPinDescriptor[Index].DataRanges = (const PKSDATARANGE*)AllocateItem(NonPagedPool, SrcDescriptor->KsPinDescriptor.DataRangesCount * sizeof(PKSDATARANGE), TAG_PORTCLASS); if(!Descriptor->Factory.KsPinDescriptor[Index].DataRanges) goto cleanup;
for (SubIndex = 0; SubIndex < FilterDescription->Pins[Index].KsPinDescriptor.DataRangesCount; SubIndex++) { - DataRange = (PKSDATARANGE)AllocateItem(NonPagedPool, FilterDescription->Pins[Index].KsPinDescriptor.DataRanges[SubIndex]->FormatSize, TAG_PORTCLASS); + DataRange = (PKSDATARANGE)AllocateItem(NonPagedPool, SrcDescriptor->KsPinDescriptor.DataRanges[SubIndex]->FormatSize, TAG_PORTCLASS); if (!DataRange) goto cleanup;
RtlMoveMemory(DataRange, - FilterDescription->Pins[Index].KsPinDescriptor.DataRanges[SubIndex], - FilterDescription->Pins[Index].KsPinDescriptor.DataRanges[SubIndex]->FormatSize); + SrcDescriptor->KsPinDescriptor.DataRanges[SubIndex], + SrcDescriptor->KsPinDescriptor.DataRanges[SubIndex]->FormatSize);
((PKSDATAFORMAT*)Descriptor->Factory.KsPinDescriptor[Index].DataRanges)[SubIndex] = DataRange;
}
- Descriptor->Factory.KsPinDescriptor[Index].DataRangesCount = FilterDescription->Pins[Index].KsPinDescriptor.DataRangesCount; + Descriptor->Factory.KsPinDescriptor[Index].DataRangesCount = SrcDescriptor->KsPinDescriptor.DataRangesCount; }
Descriptor->Factory.Instances[Index].CurrentPinInstanceCount = 0; Descriptor->Factory.Instances[Index].MaxFilterInstanceCount = FilterDescription->Pins[Index].MaxFilterInstanceCount; Descriptor->Factory.Instances[Index].MaxGlobalInstanceCount = FilterDescription->Pins[Index].MaxGlobalInstanceCount; Descriptor->Factory.Instances[Index].MinFilterInstanceCount = FilterDescription->Pins[Index].MinFilterInstanceCount; + SrcDescriptor = (PPCPIN_DESCRIPTOR)((ULONG_PTR)SrcDescriptor + FilterDescription->PinSize); } } Descriptor->DeviceDescriptor = FilterDescription;