- Remove unused WdmAudWriteCompleted

- check for a valid object header in KsSynchronousIoControlDevice
- Apply alignment restrictions to all allocated buffers
- Fix handling IRP_MN_QUERY_INTERFACE, IRP_MN_QUERY_DEVICE_RELATIONS, IRP_MN_FILTER_RESOURCE_REQUIREMENTS
- IMiniportWaveCyclic::NewStream && IMiniportWavePci::NewStream take first the pin id and THEN the parameter capture. Fixes playback for ES1371 (VmWare) driver and many others
- Store IPortFilterWavePci, IPortFilterWaveRT, IPortFilterWaveCyclic in their corresponding port 


svn path=/trunk/; revision=40930
This commit is contained in:
Johannes Anderwald 2009-05-15 15:24:29 +00:00
parent de0f2fe886
commit 3dc568f9b9
14 changed files with 63 additions and 42 deletions

View file

@ -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 */

View file

@ -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
};

View file

@ -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,

View file

@ -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;
}

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -617,6 +617,7 @@ ISubDevice_fnNewIrpTarget(
}
*OutTarget = (IIrpTarget*)Filter;
This->Filter = Filter;
return Status;
}

View file

@ -679,6 +679,7 @@ ISubDevice_fnNewIrpTarget(
}
*OutTarget = (IIrpTarget*)Filter;
This->Filter = Filter;
return Status;
}

View file

@ -519,6 +519,7 @@ ISubDevice_fnNewIrpTarget(
}
*OutTarget = (IIrpTarget*)Filter;
This->Filter = Filter;
return Status;
}

View file

@ -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);

View file

@ -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;
}