mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 13:34:53 +00:00
[KS]
- 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:
parent
8ee7ad7bcb
commit
755f485b8e
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue