NTSTATUS NTAPI PcHandlePropertyWithTable( IN PIRP Irp, IN ULONG PropertySetCount, IN PKSPROPERTY_SET PropertySet, IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor) { PIO_STACK_LOCATION IoStack; // get current irp stack location IoStack = IoGetCurrentIrpStackLocation(Irp); if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSPROPERTY)) { // certainly an invalid request return STATUS_INVALID_PARAMETER; } // store device descriptor KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (PKSPROPERTY_ITEM)SubDeviceDescriptor; // then try KsPropertyHandler return KsPropertyHandler(Irp, PropertySetCount, PropertySet); }
NTSTATUS NTAPI IKsClock_DispatchDeviceIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION IoStack; UNICODE_STRING GuidString; PKSPROPERTY Property; NTSTATUS Status; DPRINT("IKsClock_DispatchDeviceIoControl\n"); /* get current io stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); /* FIXME support events */ ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY); /* sanity check */ ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSPROPERTY)); /* call property handler */ Status = KsPropertyHandler(Irp, 1, ClockPropertySet); /* get property from input buffer */ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; RtlStringFromGUID(&Property->Set, &GuidString); DPRINT("IKsClock_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information); RtlFreeUnicodeString(&GuidString); Irp->IoStatus.Status = STATUS_SUCCESS; CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; }