Home | Info | Community | Development | myReactOS | Contact Us
[protected]
Definition at line 122 of file pin_wavert.cpp.
{ PKSPROPERTY Property; NTSTATUS Status; UNICODE_STRING GuidString; PIO_STACK_LOCATION IoStack; IoStack = IoGetCurrentIrpStackLocation(Irp); DPRINT("IPortPinWave_HandleKsProperty entered\n"); if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSPROPERTY)) { Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INVALID_PARAMETER; } Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; if (IsEqualGUIDAligned(Property->Set, KSPROPSETID_Connection)) { if (Property->Id == KSPROPERTY_CONNECTION_STATE) { PKSSTATE State = (PKSSTATE)Irp->UserBuffer; if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSSTATE)) { Irp->IoStatus.Information = sizeof(KSSTATE); Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_BUFFER_TOO_SMALL; } if (Property->Flags & KSPROPERTY_TYPE_SET) { Status = STATUS_UNSUCCESSFUL; Irp->IoStatus.Information = 0; if (m_Stream) { Status = m_Stream->SetState(*State); DPRINT("Setting state %u %x\n", *State, Status); if (NT_SUCCESS(Status)) { m_State = *State; } } Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } else if (Property->Flags & KSPROPERTY_TYPE_GET) { *State = m_State; Irp->IoStatus.Information = sizeof(KSSTATE); Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } } else if (Property->Id == KSPROPERTY_CONNECTION_DATAFORMAT) { PKSDATAFORMAT DataFormat = (PKSDATAFORMAT)Irp->UserBuffer; if (Property->Flags & KSPROPERTY_TYPE_SET) { PKSDATAFORMAT NewDataFormat; if (!RtlCompareMemory(DataFormat, m_Format, DataFormat->FormatSize)) { Irp->IoStatus.Information = DataFormat->FormatSize; Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NewDataFormat = (PKSDATAFORMAT)AllocateItem(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS); if (!NewDataFormat) { Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_NO_MEMORY; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NO_MEMORY; } RtlMoveMemory(NewDataFormat, DataFormat, DataFormat->FormatSize); if (m_Stream) { #if 0 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); ASSERT(NewDataFormat->FormatSize == sizeof(KSDATAFORMAT_WAVEFORMATEX)); ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.MajorFormat, &KSDATAFORMAT_TYPE_AUDIO)); ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)); ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.Specifier, &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)); ASSERT(m_State == KSSTATE_STOP); #endif DPRINT("NewDataFormat: Channels %u Bits %u Samples %u\n", ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nChannels, ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.wBitsPerSample, ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nSamplesPerSec); Status = m_Stream->SetFormat(NewDataFormat); if (NT_SUCCESS(Status)) { if (m_Format) FreeItem(m_Format, TAG_PORTCLASS); m_Format = NewDataFormat; Irp->IoStatus.Information = DataFormat->FormatSize; Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } } DPRINT("Failed to set format\n"); Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; } else if (Property->Flags & KSPROPERTY_TYPE_GET) { if (!m_Format) { DPRINT("No format\n"); Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; } if (m_Format->FormatSize > IoStack->Parameters.DeviceIoControl.OutputBufferLength) { Irp->IoStatus.Information = m_Format->FormatSize; Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_BUFFER_TOO_SMALL; } RtlMoveMemory(DataFormat, m_Format, m_Format->FormatSize); Irp->IoStatus.Information = DataFormat->FormatSize; Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } } } RtlStringFromGUID(Property->Set, &GuidString); DPRINT("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); RtlFreeUnicodeString(&GuidString); Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NOT_IMPLEMENTED; }