diff --git a/reactos/drivers/ksfilter/ks/misc.c b/reactos/drivers/ksfilter/ks/misc.c index 98ad7ff4002..c40226662f2 100644 --- a/reactos/drivers/ksfilter/ks/misc.c +++ b/reactos/drivers/ksfilter/ks/misc.c @@ -284,12 +284,22 @@ KsSynchronousIoControlDevice( /* get object header */ ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; + if (!ObjectHeader) + { + DPRINT("Expected object header\n"); + return STATUS_UNSUCCESSFUL; + } + /* check if there is fast device io function */ if (ObjectHeader->DispatchTable.FastDeviceIoControl) { + IoStatusBlock.Status = STATUS_UNSUCCESSFUL; + IoStatusBlock.Information = 0; + /* it is send the request */ Status = ObjectHeader->DispatchTable.FastDeviceIoControl(FileObject, TRUE, InBuffer, InSize, OutBuffer, OutSize, IoControl, &IoStatusBlock, DeviceObject); /* check if the request was handled */ + DPRINT("Handled %u Status %x Length %u\n", Status, IoStatusBlock.Status, IoStatusBlock.Information); if (Status) { /* store bytes returned */ diff --git a/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c b/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c index 73977b82cd4..70d4408069e 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c @@ -524,11 +524,12 @@ IDmaChannelInitVtbl vt_IDmaChannelInitVtbl = IDmaChannelInit_fnGetAdapterObject, IDmaChannelInit_fnCopyTo, IDmaChannelInit_fnCopyFrom, - /* IDmaChannelInit methods */ + /* IDmaChannelSlave methods */ IDmaChannelInit_fnStart, IDmaChannelInit_fnStop, IDmaChannelInit_fnReadCounter, IDmaChannelInit_fnWaitForTC, + /* IDmaChannelInit methods */ IDmaChannelInit_fnInit }; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h index 001546575a9..a0f44eae209 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h @@ -195,7 +195,8 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown) IN KSPIN_CONNECT *ConnectDetails, IN PKSDATAFORMAT DataFormat, IN PDEVICE_OBJECT DeviceObject, - IN ULONG FrameSize); + IN ULONG FrameSize, + IN ULONG Alignment); STDMETHOD_(NTSTATUS, AddMapping)(THIS_ IN PUCHAR Buffer, diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irp.c b/reactos/drivers/wdm/audio/backpln/portcls/irp.c index affa2895d62..3a6cb53790e 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irp.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/irp.c @@ -126,23 +126,21 @@ PortClsPnp( case IRP_MN_QUERY_INTERFACE: DPRINT("IRP_MN_QUERY_INTERFACE\n"); Status = PcForwardIrpSynchronous(DeviceObject, Irp); - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; case IRP_MN_QUERY_DEVICE_RELATIONS: - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n"); + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_UNSUCCESSFUL; + return STATUS_NOT_SUPPORTED; case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - Irp->IoStatus.Status = STATUS_SUCCESS; + DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); + Status = Irp->IoStatus.Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_SUCCESS; + return Status; case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); Status = PcForwardIrpSynchronous(DeviceObject, Irp); - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c index 663d10a6278..0c3f10619f7 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c @@ -39,6 +39,7 @@ typedef struct ULONG OutOfMapping; ULONG MaxFrameSize; + ULONG Alignment; }IIrpQueueImpl; @@ -118,13 +119,15 @@ IIrpQueue_fnInit( IN KSPIN_CONNECT *ConnectDetails, IN PKSDATAFORMAT DataFormat, IN PDEVICE_OBJECT DeviceObject, - IN ULONG FrameSize) + IN ULONG FrameSize, + IN ULONG Alignment) { IIrpQueueImpl * This = (IIrpQueueImpl*)iface; This->ConnectDetails = ConnectDetails; This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat; This->MaxFrameSize = FrameSize; + This->Alignment = Alignment; InitializeListHead(&This->ListHead); InitializeListHead(&This->FreeHead); @@ -185,7 +188,7 @@ IIrpQueue_fnAddMapping( else Offset = 0; - Mapping->Buffer = (PVOID)UlongToPtr(PtrToUlong(Header->Data) + Offset); + Mapping->Buffer = (PVOID)UlongToPtr((PtrToUlong(Header->Data) + Offset + 3) & ~(0x3)); if (This->MaxFrameSize) Mapping->BufferSize = min(Header->DataUsed - Offset, This->MaxFrameSize); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c index 7e5f8d42ce0..f9dbb686d1d 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.c @@ -1137,7 +1137,7 @@ IPortPinDMus_fnInit( This->ServiceGroup->lpVtbl->SupportDelayedService(This->ServiceGroup); } - Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, This->Format, DeviceObject, 0); + Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, This->Format, DeviceObject, 0, 0); if (!NT_SUCCESS(Status)) { DPRINT1("IrpQueue_Init failed with %x\n", Status); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c index 45975796c13..36b7802d6b2 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c @@ -993,7 +993,7 @@ IPortPinWaveCyclic_fnInit( if (!NT_SUCCESS(Status)) return Status; - Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, DataFormat, DeviceObject, 0); + Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, DataFormat, DeviceObject, 0, 0); if (!NT_SUCCESS(Status)) { This->IrpQueue->lpVtbl->Release(This->IrpQueue); @@ -1018,8 +1018,8 @@ IPortPinWaveCyclic_fnInit( &This->Stream, NULL, NonPagedPool, - Capture, ConnectDetails->PinId, + Capture, This->Format, &This->DmaChannel, &This->ServiceGroup); @@ -1062,7 +1062,10 @@ IPortPinWaveCyclic_fnInit( Status = This->Stream->lpVtbl->SetNotificationFreq(This->Stream, 10, &This->FrameSize); - This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format); + //This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format); + DPRINT1("Setting state to acquire %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_ACQUIRE)); + DPRINT1("Setting state to run %x\n", This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_PAUSE)); + This->State = KSSTATE_PAUSE; return STATUS_SUCCESS; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c index 9d813df9565..4a0c849af76 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c @@ -201,8 +201,20 @@ IServiceSink_fnRequestService( ASSERT_IRQL(DISPATCH_LEVEL); + if (This->IrpQueue->lpVtbl->HasLastMappingFailed(This->IrpQueue)) + { + This->IrpQueue->lpVtbl->PrintQueueStatus(This->IrpQueue); + if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue) == 0) + { + DPRINT("Stopping stream...\n"); + SetStreamState(This, KSSTATE_STOP); + } + } + Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position); DPRINT("Position %lu Status %x\n", Position, Status); + + This->Stream->lpVtbl->Service(This->Stream); } static IServiceSinkVtbl vt_IServiceSink = @@ -598,10 +610,10 @@ IPortPinWavePci_fnFastWrite( PIRP Irp; IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface; - InterlockedIncrement((PLONG)&This->TotalPackets); - DPRINT("IPortPinWavePci_fnFastWrite entered Total %u Pre %u Post %u\n", This->TotalPackets, This->PreCompleted, This->PostCompleted); + InterlockedIncrement((PLONG)&This->TotalPackets); + Packet = (PCONTEXT_WRITE)Buffer; @@ -710,8 +722,8 @@ IPortPinWavePci_fnInit( NULL, NonPagedPool, This->WaveStream, - Capture, ConnectDetails->PinId, + Capture, This->Format, &This->DmaChannel, &This->ServiceGroup); @@ -742,7 +754,11 @@ IPortPinWavePci_fnInit( return Status; } - Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, This->Format, DeviceObject, AllocatorFraming.FrameSize); + DPRINT("OptionFlags %x RequirementsFlag %x PoolType %x Frames %lu FrameSize %lu FileAlignment %lu\n", + AllocatorFraming.OptionsFlags, AllocatorFraming.RequirementsFlags, AllocatorFraming.PoolType, AllocatorFraming.Frames, AllocatorFraming.FrameSize, AllocatorFraming.FileAlignment); + + + Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, This->Format, DeviceObject, AllocatorFraming.FrameSize, AllocatorFraming.FileAlignment); if (!NT_SUCCESS(Status)) { DPRINT1("IrpQueue_Init failed with %x\n", Status); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c index e9263766609..e878ca47f3a 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c @@ -912,7 +912,7 @@ IPortPinWaveRT_fnInit( goto cleanup; } - Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, DataFormat, DeviceObject, 0); + Status = This->IrpQueue->lpVtbl->Init(This->IrpQueue, ConnectDetails, DataFormat, DeviceObject, 0, 0); if (!NT_SUCCESS(Status)) { goto cleanup; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c index c2005238fcf..169890761f0 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c @@ -617,6 +617,7 @@ ISubDevice_fnNewIrpTarget( } *OutTarget = (IIrpTarget*)Filter; + This->Filter = Filter; return Status; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c index d1686d67454..f041e275ec0 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c @@ -679,6 +679,7 @@ ISubDevice_fnNewIrpTarget( } *OutTarget = (IIrpTarget*)Filter; + This->Filter = Filter; return Status; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c index ff7216c482d..37e851388c3 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c @@ -519,6 +519,7 @@ ISubDevice_fnNewIrpTarget( } *OutTarget = (IIrpTarget*)Filter; + This->Filter = Filter; return Status; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/registry.c b/reactos/drivers/wdm/audio/backpln/portcls/registry.c index 5891c3f7742..7f33acd5ff9 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/registry.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/registry.c @@ -159,7 +159,7 @@ IRegistryKey_fnNewSubKey( ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); - DPRINT("IRegistryKey_fnNewSubKey entered %S\n", SubKeyName); + DPRINT("IRegistryKey_fnNewSubKey entered %S\n", SubKeyName->Buffer); if (This->Deleted) { @@ -381,7 +381,7 @@ PcNewRegistryKey( This->hKey = hHandle; This->lpVtbl = &vt_IRegistryKey; - This->ref = 2; + This->ref = 1; *OutRegistryKey = (PREGISTRYKEY)&This->lpVtbl; DPRINT("PcNewRegistryKey result %p\n", *OutRegistryKey); diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c index 4bfceadce74..78fd6d4953b 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c @@ -390,23 +390,6 @@ WdmAudControlDeviceState( return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); } -NTSTATUS -NTAPI -WdmAudWriteCompleted( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PVOID Ctx) -{ - PWRITE_CONTEXT Context = (PWRITE_CONTEXT)Ctx; - - Context->Irp->IoStatus.Information = Context->Length; - Context->Irp->IoStatus.Status = Irp->IoStatus.Status; - IoCompleteRequest(Context->Irp, IO_SOUND_INCREMENT); - - ExFreePool(Context); - return STATUS_SUCCESS; -} - ULONG CheckFormatSupport( IN PKSDATARANGE_AUDIO DataRangeAudio, @@ -684,6 +667,7 @@ WdmAudWrite( { /* invalid parameter */ DPRINT1("Error: device type not set\n"); + ObDereferenceObject(FileObject); return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); } @@ -691,6 +675,7 @@ WdmAudWrite( { /* file object parameter */ DPRINT1("Error: file object is not attached\n"); + ObDereferenceObject(FileObject); return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); } ClientInfo = (PWDMAUD_CLIENT)IoStack->FileObject->FsContext; @@ -716,6 +701,7 @@ WdmAudWrite( { /* no memory */ ExFreePool(Packet); + ObDereferenceObject(FileObject); return SetIrpIoStatus(Irp, STATUS_NO_MEMORY, 0); } Packet->Header.Data = Buffer; @@ -737,12 +723,12 @@ WdmAudWrite( DPRINT1("Invalid buffer supplied\n"); ExFreePool(Buffer); ExFreePool(Packet); + ObDereferenceObject(FileObject); return SetIrpIoStatus(Irp, Status, 0); } KsStreamIo(FileObject, NULL, NULL, NULL, NULL, 0, &IoStatusBlock, Packet, sizeof(CONTEXT_WRITE), KSSTREAM_WRITE, KernelMode); - - + ObDereferenceObject(FileObject); return IoStatusBlock.Status; }