- store property item when there are custom specific properties
- Fix bug where the property handle routine received an invalid pointer to the data

svn path=/trunk/; revision=54572
This commit is contained in:
Johannes Anderwald 2011-12-03 16:59:47 +00:00
parent 8ee7ad7bcb
commit 755f485b8e

View file

@ -20,7 +20,8 @@ FindPropertyHandler(
IN ULONG OutputBufferLength, IN ULONG OutputBufferLength,
OUT PVOID OutputBuffer, OUT PVOID OutputBuffer,
OUT PFNKSHANDLER *PropertyHandler, OUT PFNKSHANDLER *PropertyHandler,
OUT PKSPROPERTY_SET * Set) OUT PKSPROPERTY_SET * Set,
OUT PKSPROPERTY_ITEM *PropertyItem)
{ {
ULONG Index, ItemIndex; ULONG Index, ItemIndex;
@ -50,6 +51,7 @@ FindPropertyHandler(
/* store property set */ /* store property set */
*Set = (PKSPROPERTY_SET)&PropertySet[Index]; *Set = (PKSPROPERTY_SET)&PropertySet[Index];
*PropertyItem = (PKSPROPERTY_ITEM)&PropertySet[Index].PropertyItem[ItemIndex];
if (Property->Flags & KSPROPERTY_TYPE_SET) if (Property->Flags & KSPROPERTY_TYPE_SET)
{ {
@ -132,12 +134,14 @@ KspPropertyHandler(
IN ULONG PropertyItemSize OPTIONAL) IN ULONG PropertyItemSize OPTIONAL)
{ {
PKSPROPERTY Property; PKSPROPERTY Property;
PKSPROPERTY_ITEM PropertyItem;
PKSPROPERTY_SET Set; PKSPROPERTY_SET Set;
PIO_STACK_LOCATION IoStack; PIO_STACK_LOCATION IoStack;
NTSTATUS Status; NTSTATUS Status;
PFNKSHANDLER PropertyHandler = NULL; PFNKSHANDLER PropertyHandler = NULL;
ULONG Index, InputBufferLength, OutputBufferLength, TotalSize; ULONG Index, InputBufferLength, OutputBufferLength, TotalSize;
LPGUID Guid; LPGUID Guid;
//UNICODE_STRING GuidBuffer;
/* get current irp stack */ /* get current irp stack */
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
@ -248,19 +252,33 @@ KspPropertyHandler(
Property = (PKSPROPERTY)((ULONG_PTR)Irp->AssociatedIrp.SystemBuffer + OutputBufferLength); Property = (PKSPROPERTY)((ULONG_PTR)Irp->AssociatedIrp.SystemBuffer + OutputBufferLength);
} }
DPRINT("KspPropertyHandler Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM)); //RtlStringFromGUID(&Property->Set, &GuidBuffer);
//DPRINT("KspPropertyHandler Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM));
//DPRINT("PropertyId %lu PropertyFlags %x Guid %S\n", Property->Id, Property->Flags, GuidBuffer.Buffer);
//RtlFreeUnicodeString(&GuidBuffer);
/* sanity check */ /* sanity check */
ASSERT(PropertyItemSize == 0 || PropertyItemSize == sizeof(KSPROPERTY_ITEM)); ASSERT(PropertyItemSize == 0 || PropertyItemSize == sizeof(KSPROPERTY_ITEM));
/* find the property handler */ /* find the property handler */
Status = FindPropertyHandler(&Irp->IoStatus, PropertySet, PropertySetsCount, Property, InputBufferLength, OutputBufferLength, Irp->AssociatedIrp.SystemBuffer, &PropertyHandler, &Set); Status = FindPropertyHandler(&Irp->IoStatus, PropertySet, PropertySetsCount, Property, InputBufferLength, OutputBufferLength, Irp->AssociatedIrp.SystemBuffer, &PropertyHandler, &Set, &PropertyItem);
if (NT_SUCCESS(Status) && PropertyHandler) if (NT_SUCCESS(Status) && PropertyHandler)
{ {
/* call property handler */ /* store set */
KSPROPERTY_SET_IRP_STORAGE(Irp) = Set; KSPROPERTY_SET_IRP_STORAGE(Irp) = Set;
Status = PropertyHandler(Irp, Property, Irp->AssociatedIrp.SystemBuffer);
/* are any custom property item sizes used */
if (PropertyItemSize)
{
/* store custom property item */
KSPROPERTY_ITEM_IRP_STORAGE(Irp) = PropertyItem;
}
/* call property handler */
Status = PropertyHandler(Irp, Property, (OutputBufferLength > 0 ? Irp->AssociatedIrp.SystemBuffer : NULL));
if (Status == STATUS_BUFFER_TOO_SMALL) if (Status == STATUS_BUFFER_TOO_SMALL)
{ {