ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

NTSTATUS FindPropertyHandler ( IN PIO_STATUS_BLOCK  IoStatus,
IN const KSPROPERTY_SET *  PropertySet,
IN ULONG  PropertySetCount,
IN PKSPROPERTY  Property,
IN ULONG  InputBufferLength,
IN ULONG  OutputBufferLength,
OUT PVOID  OutputBuffer,
OUT PFNKSHANDLER *  PropertyHandler,
OUT PKSPROPERTY_SET *  Set,
OUT PKSPROPERTY_ITEM *  PropertyItem 
)

Definition at line 14 of file property.c.

Referenced by KspPropertyHandler().

{
    ULONG Index, ItemIndex;

    for(Index = 0; Index < PropertySetCount; Index++)
    {
        ASSERT(PropertySet[Index].Set);

        if (IsEqualGUIDAligned(&Property->Set, PropertySet[Index].Set))
        {
            for(ItemIndex = 0; ItemIndex < PropertySet[Index].PropertiesCount; ItemIndex++)
            {
                if (PropertySet[Index].PropertyItem[ItemIndex].PropertyId == Property->Id)
                {
                    if (PropertySet[Index].PropertyItem[ItemIndex].MinProperty > InputBufferLength)
                    {
                        /* too small input buffer */
                        IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinProperty;
                        return STATUS_INVALID_PARAMETER;
                    }

                    if (PropertySet[Index].PropertyItem[ItemIndex].MinData > OutputBufferLength)
                    {
                        /* too small output buffer */
                        IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData;
                        return STATUS_MORE_ENTRIES;
                    }

                    /* store property set */
                    *Set = (PKSPROPERTY_SET)&PropertySet[Index];
                    *PropertyItem = (PKSPROPERTY_ITEM)&PropertySet[Index].PropertyItem[ItemIndex];

                    if (Property->Flags & KSPROPERTY_TYPE_SET)
                    {
                        /* store property handler */
                        *PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SetPropertyHandler;
                        return STATUS_SUCCESS;
                    }

                    if (Property->Flags & KSPROPERTY_TYPE_GET)
                    {
                        /* store property handler */
                        *PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
                        return STATUS_SUCCESS;
                    }


                    if (Property->Flags & KSPROPERTY_TYPE_BASICSUPPORT)
                    {
                        PULONG Flags;
                        PKSPROPERTY_DESCRIPTION Description;

                        if (sizeof(ULONG) > OutputBufferLength)
                        {
                            /* too small buffer */
                            return STATUS_INVALID_PARAMETER;
                        }

                        /* get output buffer */
                        Flags = (PULONG)OutputBuffer;

                        /* clear flags */
                        *Flags = 0;

                        IoStatus->Information = sizeof(ULONG);

                        if (PropertySet[Index].PropertyItem[ItemIndex].SupportHandler)
                        {
                            /* use support handler from driver */
                            *PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SupportHandler;
                            return STATUS_SUCCESS;
                        }

                        if (PropertySet[Index].PropertyItem[ItemIndex].GetSupported)
                            *Flags |= KSPROPERTY_TYPE_GET;

                        if (PropertySet[Index].PropertyItem[ItemIndex].SetSupported)
                            *Flags |= KSPROPERTY_TYPE_SET;

                        if (OutputBufferLength >= sizeof(KSPROPERTY_DESCRIPTION))
                        {
                            /* get output buffer */
                            Description = (PKSPROPERTY_DESCRIPTION)OutputBuffer;

                            /* store result */
                            Description->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION);
                            Description->PropTypeSet.Set = KSPROPTYPESETID_General;
                            Description->PropTypeSet.Id = 0;
                            Description->PropTypeSet.Flags = 0;
                            Description->MembersListCount = 0;
                            Description->Reserved = 0;

                            IoStatus->Information = sizeof(KSPROPERTY_DESCRIPTION);
                        }
                        return STATUS_SUCCESS;
                    }
                }
            }
        }
    }
    return STATUS_NOT_FOUND;
}

Generated on Mon May 28 2012 05:03:03 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.