}
- /* HACK */
+ /* Store Fileobject */
IoStack = IoGetNextIrpStackLocation(Irp);
IoStack->FileObject = FileObject;
+ if (IoControl == IOCTL_KS_WRITE_STREAM)
+ {
+ Irp->AssociatedIrp.SystemBuffer = OutBuffer;
+ }
+ else if (IoControl == IOCTL_KS_READ_STREAM)
+ {
+ Irp->AssociatedIrp.SystemBuffer = InBuffer;
+ }
+
IoSetCompletionRoutine(Irp, KspSynchronousIoControlDeviceCompletion, (PVOID)&IoStatusBlock, TRUE, TRUE, TRUE);
Status = IoCallDriver(DeviceObject, Irp);
/* get device header */
DeviceHeader = DeviceExtension->DeviceHeader;
+ ASSERT(IoStack->FileObject);
+
/* get object header */
ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
IN PIRP Irp)
{
PKSSTREAM_HEADER Header;
- //PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PIO_STACK_LOCATION IoStack;
IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
-#if 0
/* get current irp stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
- ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSSTREAM_HEADER));
+ if (!Buffer)
+ {
+ /* probe the stream irp */
+ Status = KsProbeStreamIrp(Irp, KSSTREAM_WRITE | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_ALLOWFORMATCHANGE | KSPROBE_SYSTEMADDRESS, 0);
- /* get stream header */
- Header = (KSSTREAM_HEADER*)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
-#else
- /* HACK get stream header */
- Header = (KSSTREAM_HEADER*)Buffer;
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("KsProbeStreamIrp failed with %x\n", Status);
+ return Status;
+ }
+
+ /* get the stream header */
+ Header = (PKSSTREAM_HEADER)Irp->AssociatedIrp.SystemBuffer;
+ ASSERT(Header);
+ ASSERT(Irp->MdlAddress);
- /* HACK untill stream probing is ready */
+ if (Irp->RequestorMode != KernelMode)
+ {
+ /* use allocated mdl */
+ Header->Data = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
+ }
+ }
+ else
+ {
+ /* HACK */
+ Header = (PKSSTREAM_HEADER)Buffer;
+ }
+
+ /* HACK */
Irp->Tail.Overlay.DriverContext[2] = (PVOID)Header;
-#endif
/* sanity check */
ASSERT(Header);
KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL);
/* done */
- return STATUS_SUCCESS;
+ return Status;
}
NTSTATUS
This->Irp->IoStatus.Information = StreamHeader->FrameExtent;
/* free stream data, no tag as wdmaud.drv does it atm */
- ExFreePool(StreamHeader->Data);
+ //ExFreePool(StreamHeader->Data);
/* free stream header, no tag as wdmaud.drv allocates it atm */
- ExFreePool(StreamHeader);
+ //ExFreePool(StreamHeader);
/* complete the request */
IoCompleteRequest(This->Irp, IO_SOUND_INCREMENT);
Status = This->IrpQueue->lpVtbl->AddMapping(This->IrpQueue, NULL, 0, Irp);
- /* check if pin is in run state */
- if (This->State != KSSTATE_RUN)
- {
- /* HACK set pin into run state if caller forgot it */
- SetStreamState(This, KSSTATE_RUN);
- DPRINT1("Starting stream with %lu mappings Status %x\n", This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue), Status);
- }
-
- return Status;
+ return STATUS_PENDING;
}
/*
OUT PIO_STATUS_BLOCK StatusBlock,
IN PDEVICE_OBJECT DeviceObject)
{
- return FALSE;
+ return KsDispatchFastIoDeviceControlFailure(FileObject, Wait, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, IoControlCode, StatusBlock, DeviceObject);
}
/*
/* now build the irp */
LowerIrp = IoBuildAsynchronousFsdRequest (IRP_MJ_WRITE,
IoGetRelatedDeviceObject(FileObject),
- Packet,
- sizeof(KSSTREAM_HEADER),
+ Packet,
+ sizeof(KSSTREAM_HEADER),
&Offset,
NULL);
return SetIrpIoStatus(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
}
+ /* get next stack location */
+ IoStack = IoGetNextIrpStackLocation(LowerIrp);
+
+ /* attach file object */
+ IoStack->FileObject = FileObject;
+
/* set a completion routine */
IoSetCompletionRoutine(LowerIrp, WdmAudWriteCompletion, (PVOID)Irp, TRUE, TRUE, TRUE);
PDISPATCH_CONTEXT Context;
PIO_STACK_LOCATION IoStack;
PFILE_OBJECT FileObject;
+ PVOID Buffer;
NTSTATUS Status;
ULONG BytesReturned;
return Status;
}
+ Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
+
+ if (!Buffer)
+ {
+ /* insufficient resources */
+ Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
+ /* Complete the irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+
/* call the portcls audio pin */
Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_WRITE_STREAM,
- Irp->UserBuffer,
- IoStack->Parameters.Write.Length,
NULL,
0,
+ Buffer,
+ IoStack->Parameters.Write.Length,
&BytesReturned);
-
/* Release file object */
ObDereferenceObject(FileObject);
PIO_STATUS_BLOCK IoStatus,
PDEVICE_OBJECT DeviceObject)
{
- DPRINT("Pin_fnFastDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
-
-
return FALSE;
}
PIO_STATUS_BLOCK IoStatus,
PDEVICE_OBJECT DeviceObject)
{
- DPRINT("Pin_fnFastRead called DeviceObject %p Irp %p\n", DeviceObject);
-
return FALSE;
}