mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 16:10:29 +00:00
- 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:
parent
de0f2fe886
commit
3dc568f9b9
14 changed files with 63 additions and 42 deletions
|
@ -284,12 +284,22 @@ KsSynchronousIoControlDevice(
|
||||||
|
|
||||||
/* get object header */
|
/* get object header */
|
||||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
|
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
|
||||||
|
if (!ObjectHeader)
|
||||||
|
{
|
||||||
|
DPRINT("Expected object header\n");
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
/* check if there is fast device io function */
|
/* check if there is fast device io function */
|
||||||
if (ObjectHeader->DispatchTable.FastDeviceIoControl)
|
if (ObjectHeader->DispatchTable.FastDeviceIoControl)
|
||||||
{
|
{
|
||||||
|
IoStatusBlock.Status = STATUS_UNSUCCESSFUL;
|
||||||
|
IoStatusBlock.Information = 0;
|
||||||
|
|
||||||
/* it is send the request */
|
/* it is send the request */
|
||||||
Status = ObjectHeader->DispatchTable.FastDeviceIoControl(FileObject, TRUE, InBuffer, InSize, OutBuffer, OutSize, IoControl, &IoStatusBlock, DeviceObject);
|
Status = ObjectHeader->DispatchTable.FastDeviceIoControl(FileObject, TRUE, InBuffer, InSize, OutBuffer, OutSize, IoControl, &IoStatusBlock, DeviceObject);
|
||||||
/* check if the request was handled */
|
/* check if the request was handled */
|
||||||
|
DPRINT("Handled %u Status %x Length %u\n", Status, IoStatusBlock.Status, IoStatusBlock.Information);
|
||||||
if (Status)
|
if (Status)
|
||||||
{
|
{
|
||||||
/* store bytes returned */
|
/* store bytes returned */
|
||||||
|
|
|
@ -524,11 +524,12 @@ IDmaChannelInitVtbl vt_IDmaChannelInitVtbl =
|
||||||
IDmaChannelInit_fnGetAdapterObject,
|
IDmaChannelInit_fnGetAdapterObject,
|
||||||
IDmaChannelInit_fnCopyTo,
|
IDmaChannelInit_fnCopyTo,
|
||||||
IDmaChannelInit_fnCopyFrom,
|
IDmaChannelInit_fnCopyFrom,
|
||||||
/* IDmaChannelInit methods */
|
/* IDmaChannelSlave methods */
|
||||||
IDmaChannelInit_fnStart,
|
IDmaChannelInit_fnStart,
|
||||||
IDmaChannelInit_fnStop,
|
IDmaChannelInit_fnStop,
|
||||||
IDmaChannelInit_fnReadCounter,
|
IDmaChannelInit_fnReadCounter,
|
||||||
IDmaChannelInit_fnWaitForTC,
|
IDmaChannelInit_fnWaitForTC,
|
||||||
|
/* IDmaChannelInit methods */
|
||||||
IDmaChannelInit_fnInit
|
IDmaChannelInit_fnInit
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -195,7 +195,8 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown)
|
||||||
IN KSPIN_CONNECT *ConnectDetails,
|
IN KSPIN_CONNECT *ConnectDetails,
|
||||||
IN PKSDATAFORMAT DataFormat,
|
IN PKSDATAFORMAT DataFormat,
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN ULONG FrameSize);
|
IN ULONG FrameSize,
|
||||||
|
IN ULONG Alignment);
|
||||||
|
|
||||||
STDMETHOD_(NTSTATUS, AddMapping)(THIS_
|
STDMETHOD_(NTSTATUS, AddMapping)(THIS_
|
||||||
IN PUCHAR Buffer,
|
IN PUCHAR Buffer,
|
||||||
|
|
|
@ -126,23 +126,21 @@ PortClsPnp(
|
||||||
case IRP_MN_QUERY_INTERFACE:
|
case IRP_MN_QUERY_INTERFACE:
|
||||||
DPRINT("IRP_MN_QUERY_INTERFACE\n");
|
DPRINT("IRP_MN_QUERY_INTERFACE\n");
|
||||||
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
|
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
|
||||||
Irp->IoStatus.Status = Status;
|
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
case IRP_MN_QUERY_DEVICE_RELATIONS:
|
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);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_NOT_SUPPORTED;
|
||||||
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
|
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);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
return STATUS_SUCCESS;
|
return Status;
|
||||||
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
|
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
|
||||||
DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
|
DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
|
||||||
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
|
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
|
||||||
Irp->IoStatus.Status = Status;
|
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ typedef struct
|
||||||
|
|
||||||
ULONG OutOfMapping;
|
ULONG OutOfMapping;
|
||||||
ULONG MaxFrameSize;
|
ULONG MaxFrameSize;
|
||||||
|
ULONG Alignment;
|
||||||
|
|
||||||
}IIrpQueueImpl;
|
}IIrpQueueImpl;
|
||||||
|
|
||||||
|
@ -118,13 +119,15 @@ IIrpQueue_fnInit(
|
||||||
IN KSPIN_CONNECT *ConnectDetails,
|
IN KSPIN_CONNECT *ConnectDetails,
|
||||||
IN PKSDATAFORMAT DataFormat,
|
IN PKSDATAFORMAT DataFormat,
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN ULONG FrameSize)
|
IN ULONG FrameSize,
|
||||||
|
IN ULONG Alignment)
|
||||||
{
|
{
|
||||||
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
|
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
|
||||||
|
|
||||||
This->ConnectDetails = ConnectDetails;
|
This->ConnectDetails = ConnectDetails;
|
||||||
This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
|
This->DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat;
|
||||||
This->MaxFrameSize = FrameSize;
|
This->MaxFrameSize = FrameSize;
|
||||||
|
This->Alignment = Alignment;
|
||||||
|
|
||||||
InitializeListHead(&This->ListHead);
|
InitializeListHead(&This->ListHead);
|
||||||
InitializeListHead(&This->FreeHead);
|
InitializeListHead(&This->FreeHead);
|
||||||
|
@ -185,7 +188,7 @@ IIrpQueue_fnAddMapping(
|
||||||
else
|
else
|
||||||
Offset = 0;
|
Offset = 0;
|
||||||
|
|
||||||
Mapping->Buffer = (PVOID)UlongToPtr(PtrToUlong(Header->Data) + Offset);
|
Mapping->Buffer = (PVOID)UlongToPtr((PtrToUlong(Header->Data) + Offset + 3) & ~(0x3));
|
||||||
|
|
||||||
if (This->MaxFrameSize)
|
if (This->MaxFrameSize)
|
||||||
Mapping->BufferSize = min(Header->DataUsed - Offset, This->MaxFrameSize);
|
Mapping->BufferSize = min(Header->DataUsed - Offset, This->MaxFrameSize);
|
||||||
|
|
|
@ -1137,7 +1137,7 @@ IPortPinDMus_fnInit(
|
||||||
This->ServiceGroup->lpVtbl->SupportDelayedService(This->ServiceGroup);
|
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))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("IrpQueue_Init failed with %x\n", Status);
|
DPRINT1("IrpQueue_Init failed with %x\n", Status);
|
||||||
|
|
|
@ -993,7 +993,7 @@ IPortPinWaveCyclic_fnInit(
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
return 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))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
This->IrpQueue->lpVtbl->Release(This->IrpQueue);
|
This->IrpQueue->lpVtbl->Release(This->IrpQueue);
|
||||||
|
@ -1018,8 +1018,8 @@ IPortPinWaveCyclic_fnInit(
|
||||||
&This->Stream,
|
&This->Stream,
|
||||||
NULL,
|
NULL,
|
||||||
NonPagedPool,
|
NonPagedPool,
|
||||||
Capture,
|
|
||||||
ConnectDetails->PinId,
|
ConnectDetails->PinId,
|
||||||
|
Capture,
|
||||||
This->Format,
|
This->Format,
|
||||||
&This->DmaChannel,
|
&This->DmaChannel,
|
||||||
&This->ServiceGroup);
|
&This->ServiceGroup);
|
||||||
|
@ -1062,7 +1062,10 @@ IPortPinWaveCyclic_fnInit(
|
||||||
|
|
||||||
Status = This->Stream->lpVtbl->SetNotificationFreq(This->Stream, 10, &This->FrameSize);
|
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;
|
return STATUS_SUCCESS;
|
||||||
|
|
|
@ -201,8 +201,20 @@ IServiceSink_fnRequestService(
|
||||||
|
|
||||||
ASSERT_IRQL(DISPATCH_LEVEL);
|
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);
|
Status = This->Stream->lpVtbl->GetPosition(This->Stream, &Position);
|
||||||
DPRINT("Position %lu Status %x\n", Position, Status);
|
DPRINT("Position %lu Status %x\n", Position, Status);
|
||||||
|
|
||||||
|
This->Stream->lpVtbl->Service(This->Stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
static IServiceSinkVtbl vt_IServiceSink =
|
static IServiceSinkVtbl vt_IServiceSink =
|
||||||
|
@ -598,10 +610,10 @@ IPortPinWavePci_fnFastWrite(
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
IPortPinWavePciImpl * This = (IPortPinWavePciImpl*)iface;
|
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);
|
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;
|
Packet = (PCONTEXT_WRITE)Buffer;
|
||||||
|
|
||||||
|
|
||||||
|
@ -710,8 +722,8 @@ IPortPinWavePci_fnInit(
|
||||||
NULL,
|
NULL,
|
||||||
NonPagedPool,
|
NonPagedPool,
|
||||||
This->WaveStream,
|
This->WaveStream,
|
||||||
Capture,
|
|
||||||
ConnectDetails->PinId,
|
ConnectDetails->PinId,
|
||||||
|
Capture,
|
||||||
This->Format,
|
This->Format,
|
||||||
&This->DmaChannel,
|
&This->DmaChannel,
|
||||||
&This->ServiceGroup);
|
&This->ServiceGroup);
|
||||||
|
@ -742,7 +754,11 @@ IPortPinWavePci_fnInit(
|
||||||
return Status;
|
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))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("IrpQueue_Init failed with %x\n", Status);
|
DPRINT1("IrpQueue_Init failed with %x\n", Status);
|
||||||
|
|
|
@ -912,7 +912,7 @@ IPortPinWaveRT_fnInit(
|
||||||
goto cleanup;
|
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))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
|
@ -617,6 +617,7 @@ ISubDevice_fnNewIrpTarget(
|
||||||
}
|
}
|
||||||
|
|
||||||
*OutTarget = (IIrpTarget*)Filter;
|
*OutTarget = (IIrpTarget*)Filter;
|
||||||
|
This->Filter = Filter;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -679,6 +679,7 @@ ISubDevice_fnNewIrpTarget(
|
||||||
}
|
}
|
||||||
|
|
||||||
*OutTarget = (IIrpTarget*)Filter;
|
*OutTarget = (IIrpTarget*)Filter;
|
||||||
|
This->Filter = Filter;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -519,6 +519,7 @@ ISubDevice_fnNewIrpTarget(
|
||||||
}
|
}
|
||||||
|
|
||||||
*OutTarget = (IIrpTarget*)Filter;
|
*OutTarget = (IIrpTarget*)Filter;
|
||||||
|
This->Filter = Filter;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,7 @@ IRegistryKey_fnNewSubKey(
|
||||||
|
|
||||||
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
|
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
|
||||||
|
|
||||||
DPRINT("IRegistryKey_fnNewSubKey entered %S\n", SubKeyName);
|
DPRINT("IRegistryKey_fnNewSubKey entered %S\n", SubKeyName->Buffer);
|
||||||
|
|
||||||
if (This->Deleted)
|
if (This->Deleted)
|
||||||
{
|
{
|
||||||
|
@ -381,7 +381,7 @@ PcNewRegistryKey(
|
||||||
|
|
||||||
This->hKey = hHandle;
|
This->hKey = hHandle;
|
||||||
This->lpVtbl = &vt_IRegistryKey;
|
This->lpVtbl = &vt_IRegistryKey;
|
||||||
This->ref = 2;
|
This->ref = 1;
|
||||||
|
|
||||||
*OutRegistryKey = (PREGISTRYKEY)&This->lpVtbl;
|
*OutRegistryKey = (PREGISTRYKEY)&This->lpVtbl;
|
||||||
DPRINT("PcNewRegistryKey result %p\n", *OutRegistryKey);
|
DPRINT("PcNewRegistryKey result %p\n", *OutRegistryKey);
|
||||||
|
|
|
@ -390,23 +390,6 @@ WdmAudControlDeviceState(
|
||||||
return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO));
|
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
|
ULONG
|
||||||
CheckFormatSupport(
|
CheckFormatSupport(
|
||||||
IN PKSDATARANGE_AUDIO DataRangeAudio,
|
IN PKSDATARANGE_AUDIO DataRangeAudio,
|
||||||
|
@ -684,6 +667,7 @@ WdmAudWrite(
|
||||||
{
|
{
|
||||||
/* invalid parameter */
|
/* invalid parameter */
|
||||||
DPRINT1("Error: device type not set\n");
|
DPRINT1("Error: device type not set\n");
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
|
return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -691,6 +675,7 @@ WdmAudWrite(
|
||||||
{
|
{
|
||||||
/* file object parameter */
|
/* file object parameter */
|
||||||
DPRINT1("Error: file object is not attached\n");
|
DPRINT1("Error: file object is not attached\n");
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
|
return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
|
||||||
}
|
}
|
||||||
ClientInfo = (PWDMAUD_CLIENT)IoStack->FileObject->FsContext;
|
ClientInfo = (PWDMAUD_CLIENT)IoStack->FileObject->FsContext;
|
||||||
|
@ -716,6 +701,7 @@ WdmAudWrite(
|
||||||
{
|
{
|
||||||
/* no memory */
|
/* no memory */
|
||||||
ExFreePool(Packet);
|
ExFreePool(Packet);
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
return SetIrpIoStatus(Irp, STATUS_NO_MEMORY, 0);
|
return SetIrpIoStatus(Irp, STATUS_NO_MEMORY, 0);
|
||||||
}
|
}
|
||||||
Packet->Header.Data = Buffer;
|
Packet->Header.Data = Buffer;
|
||||||
|
@ -737,12 +723,12 @@ WdmAudWrite(
|
||||||
DPRINT1("Invalid buffer supplied\n");
|
DPRINT1("Invalid buffer supplied\n");
|
||||||
ExFreePool(Buffer);
|
ExFreePool(Buffer);
|
||||||
ExFreePool(Packet);
|
ExFreePool(Packet);
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
return SetIrpIoStatus(Irp, Status, 0);
|
return SetIrpIoStatus(Irp, Status, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
KsStreamIo(FileObject, NULL, NULL, NULL, NULL, 0, &IoStatusBlock, Packet, sizeof(CONTEXT_WRITE), KSSTREAM_WRITE, KernelMode);
|
KsStreamIo(FileObject, NULL, NULL, NULL, NULL, 0, &IoStatusBlock, Packet, sizeof(CONTEXT_WRITE), KSSTREAM_WRITE, KernelMode);
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
|
|
||||||
return IoStatusBlock.Status;
|
return IoStatusBlock.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue