- Store KSPROPERTY_SET in Irp when using KsPropertyHandler

- Fix a bug in KsPinDataIntersection

svn path=/trunk/; revision=43369
This commit is contained in:
Johannes Anderwald 2009-10-11 09:49:10 +00:00
parent 8512a881b0
commit aacb520dac
3 changed files with 26 additions and 23 deletions

View file

@ -291,7 +291,7 @@ KsPinPropertyHandler(
IoStack = IoGetCurrentIrpStackLocation(Irp);
Buffer = Irp->UserBuffer;
DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %x\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id);
DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %u\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id);
switch(Property->Id)
{
@ -584,6 +584,24 @@ KsPinPropertyHandler(
return Status;
}
/*
@unimplemented
*/
KSDDKAPI NTSTATUS NTAPI
KsPinDataIntersectionEx(
IN PIRP Irp,
IN PKSP_PIN Pin,
OUT PVOID Data,
IN ULONG DescriptorsCount,
IN const KSPIN_DESCRIPTOR* Descriptor,
IN ULONG DescriptorSize,
IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
IN PVOID HandlerContext OPTIONAL)
{
UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL;
}
/*
@implemented
*/
@ -627,7 +645,7 @@ KsPinDataIntersection(
}
/* get start item */
Item = (KSMULTIPLE_ITEM*)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
Item = (KSMULTIPLE_ITEM*)(Pin + 1);
/* get first data range */
DataRange = (KSDATARANGE*)(Item + 1);
/* iterate through all data ranges */

View file

@ -81,25 +81,6 @@ KspForwardIrpSynchronous(
return Status;
}
/*
@unimplemented
*/
KSDDKAPI NTSTATUS NTAPI
KsPinDataIntersectionEx(
IN PIRP Irp,
IN PKSP_PIN Pin,
OUT PVOID Data,
IN ULONG DescriptorsCount,
IN const KSPIN_DESCRIPTOR* Descriptor,
IN ULONG DescriptorSize,
IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
IN PVOID HandlerContext OPTIONAL)
{
UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL;
}
NTSTATUS
KspCopyCreateRequest(
IN PIRP Irp,

View file

@ -18,7 +18,8 @@ FindPropertyHandler(
IN ULONG InputBufferLength,
IN ULONG OutputBufferLength,
OUT PVOID OutputBuffer,
OUT PFNKSHANDLER *PropertyHandler)
OUT PFNKSHANDLER *PropertyHandler,
OUT PKSPROPERTY_SET * Set)
{
ULONG Index, ItemIndex;
//PULONG Flags;
@ -93,6 +94,7 @@ FindPropertyHandler(
if (Property->Flags & KSPROPERTY_TYPE_GET)
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
*Set = (PKSPROPERTY_SET)&PropertySet[Index];
return STATUS_SUCCESS;
}
}
@ -111,6 +113,7 @@ KspPropertyHandler(
IN ULONG PropertyItemSize OPTIONAL)
{
PKSPROPERTY Property;
PKSPROPERTY_SET Set;
PIO_STACK_LOCATION IoStack;
NTSTATUS Status;
PFNKSHANDLER PropertyHandler = NULL;
@ -139,11 +142,12 @@ KspPropertyHandler(
ASSERT(PropertyItemSize == 0 || PropertyItemSize == sizeof(KSPROPERTY_ITEM));
/* find the property handler */
Status = FindPropertyHandler(&Irp->IoStatus, PropertySet, PropertySetsCount, Property, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Irp->UserBuffer, &PropertyHandler);
Status = FindPropertyHandler(&Irp->IoStatus, PropertySet, PropertySetsCount, Property, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Irp->UserBuffer, &PropertyHandler, &Set);
if (NT_SUCCESS(Status) && PropertyHandler)
{
/* call property handler */
KSPROPERTY_SET_IRP_STORAGE(Irp) = Set;
Status = PropertyHandler(Irp, Property, Irp->UserBuffer);
if (Status == STATUS_BUFFER_TOO_SMALL)