/* Get current stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
- /* The dispatch context is stored in the FsContext2 member */
- Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
+ /* The dispatch context is stored in the FsContext member */
+ Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
/* Sanity check */
ASSERT(Context);
return Status;
}
-NTSTATUS
-NTAPI
-Pin_fnRead(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- PDISPATCH_CONTEXT Context;
- PIO_STACK_LOCATION IoStack;
- ULONG BytesReturned;
- PFILE_OBJECT FileObject;
- NTSTATUS Status;
-
- /* Get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- /* The dispatch context is stored in the FsContext2 member */
- Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
-
- /* Sanity check */
- ASSERT(Context);
-
- /* acquire real pin file object */
- Status = ObReferenceObjectByHandle(Context->Handle, GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
- if (!NT_SUCCESS(Status))
- {
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = Status;
- /* Complete the irp */
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return Status;
- }
-
- /* Re-dispatch the request to the real target pin */
- Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_READ_STREAM,
- MmGetMdlVirtualAddress(Irp->MdlAddress),
- IoStack->Parameters.Read.Length,
- NULL,
- 0,
- &BytesReturned);
- /* release file object */
- ObDereferenceObject(FileObject);
-
- if (Context->hMixerPin)
- {
- // FIXME
- // call kmixer to convert stream
- UNIMPLEMENTED
- }
-
- /* Save status and information */
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
- /* Complete the irp */
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- /* Done */
- return Status;
-}
NTSTATUS
NTAPI
PIO_STACK_LOCATION IoStack;
PFILE_OBJECT FileObject;
NTSTATUS Status;
- ULONG BytesReturned;
+ ULONG Length;
/* Get current stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
- /* The dispatch context is stored in the FsContext2 member */
- Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
+ Length = IoStack->Parameters.Write.Length;
+
+ /* The dispatch context is stored in the FsContext member */
+ Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
/* Sanity check */
ASSERT(Context);
Status = ObReferenceObjectByHandle(Context->Handle, GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
if (!NT_SUCCESS(Status))
{
+ DPRINT1("failed\n");
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = Status;
/* Complete the irp */
return Status;
}
- /* call the portcls audio pin */
- Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_WRITE_STREAM,
- Irp->UserBuffer,
- IoStack->Parameters.Write.Length,
- NULL,
- 0,
- &BytesReturned);
-
-
- /* Release file object */
- ObDereferenceObject(FileObject);
-
- /* Save status and information */
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = BytesReturned;
- /* Complete the irp */
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- /* Done */
- return Status;
-}
-
-NTSTATUS
-NTAPI
-Pin_fnFlush(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- PDISPATCH_CONTEXT Context;
- PIO_STACK_LOCATION IoStack;
- PDEVICE_OBJECT PinDeviceObject;
- PIRP PinIrp;
- PFILE_OBJECT FileObject;
- IO_STATUS_BLOCK IoStatus;
- KEVENT Event;
- NTSTATUS Status = STATUS_UNSUCCESSFUL;
-
- /* Get current stack location */
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- /* The dispatch context is stored in the FsContext2 member */
- Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
-
- /* Sanity check */
- ASSERT(Context);
-
-
- /* acquire real pin file object */
- Status = ObReferenceObjectByHandle(Context->Handle, GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
- if (!NT_SUCCESS(Status))
- {
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = Status;
- /* Complete the irp */
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return Status;
- }
-
- /* Get Pin's device object */
- PinDeviceObject = IoGetRelatedDeviceObject(FileObject);
-
- /* release file object */
- ObDereferenceObject(FileObject);
-
- /* Initialize notification event */
- KeInitializeEvent(&Event, NotificationEvent, FALSE);
-
- /* build target irp */
- PinIrp = IoBuildSynchronousFsdRequest(IRP_MJ_FLUSH_BUFFERS, PinDeviceObject, NULL, 0, NULL, &Event, &IoStatus);
- if (PinIrp)
- {
-
- /* Get the next stack location */
- IoStack = IoGetNextIrpStackLocation(PinIrp);
- /* The file object must be present in the irp as it contains the KSOBJECT_HEADER */
- IoStack->FileObject = FileObject;
+ /* skip current irp location */
+ IoSkipCurrentIrpStackLocation(Irp);
- /* call the driver */
- Status = IoCallDriver(PinDeviceObject, PinIrp);
- /* Has request already completed ? */
- if (Status == STATUS_PENDING)
- {
- /* Wait untill the request has completed */
- KeWaitForSingleObject(&Event, UserRequest, KernelMode, FALSE, NULL);
- /* Update status */
- Status = IoStatus.Status;
- }
- }
+ /* get next stack location */
+ IoStack = IoGetNextIrpStackLocation(Irp);
+ /* store file object of next device object */
+ IoStack->FileObject = FileObject;
+ IoStack->MajorFunction = IRP_MJ_DEVICE_CONTROL;
+ IoStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_KS_WRITE_STREAM; //FIXME
+ IoStack->Parameters.DeviceIoControl.OutputBufferLength = Length;
- /* store status */
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
- /* Complete the irp */
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- /* Done */
- return Status;
+ /* now call the driver */
+ return IoCallDriver(IoGetRelatedDeviceObject(FileObject), Irp);
}
NTSTATUS
/* Get current stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
- /* The dispatch context is stored in the FsContext2 member */
- Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
+ /* The dispatch context is stored in the FsContext member */
+ Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
if (Context->Handle)
{
return STATUS_SUCCESS;
}
-NTSTATUS
-NTAPI
-Pin_fnQuerySecurity(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
- DPRINT("Pin_fnQuerySecurity called DeviceObject %p Irp %p\n", DeviceObject);
-
- Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_UNSUCCESSFUL;
-}
-
-NTSTATUS
-NTAPI
-Pin_fnSetSecurity(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp)
-{
-
- DPRINT("Pin_fnSetSecurity called DeviceObject %p Irp %p\n", DeviceObject);
-
- Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_UNSUCCESSFUL;
-}
-
-BOOLEAN
-NTAPI
-Pin_fnFastDeviceIoControl(
- PFILE_OBJECT FileObject,
- BOOLEAN Wait,
- PVOID InputBuffer,
- ULONG InputBufferLength,
- PVOID OutputBuffer,
- ULONG OutputBufferLength,
- ULONG IoControlCode,
- PIO_STATUS_BLOCK IoStatus,
- PDEVICE_OBJECT DeviceObject)
-{
- DPRINT("Pin_fnFastDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
-
-
- return FALSE;
-}
-
-
-BOOLEAN
-NTAPI
-Pin_fnFastRead(
- PFILE_OBJECT FileObject,
- PLARGE_INTEGER FileOffset,
- ULONG Length,
- BOOLEAN Wait,
- ULONG LockKey,
- PVOID Buffer,
- PIO_STATUS_BLOCK IoStatus,
- PDEVICE_OBJECT DeviceObject)
-{
- DPRINT("Pin_fnFastRead called DeviceObject %p Irp %p\n", DeviceObject);
-
- return FALSE;
-
-}
-
BOOLEAN
NTAPI
Pin_fnFastWrite(
DPRINT("Pin_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
- Context = (PDISPATCH_CONTEXT)FileObject->FsContext2;
+ Context = (PDISPATCH_CONTEXT)FileObject->FsContext;
if (Context->hMixerPin)
{
static KSDISPATCH_TABLE PinTable =
{
Pin_fnDeviceIoControl,
- Pin_fnRead,
+ KsDispatchInvalidDeviceRequest,
Pin_fnWrite,
- Pin_fnFlush,
+ KsDispatchInvalidDeviceRequest,
Pin_fnClose,
- Pin_fnQuerySecurity,
- Pin_fnSetSecurity,
- Pin_fnFastDeviceIoControl,
- Pin_fnFastRead,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchFastIoDeviceControlFailure,
+ KsDispatchFastReadFailure,
Pin_fnFastWrite,
};
IN PIRP Irp)
{
NTSTATUS Status = STATUS_SUCCESS;
- KSOBJECT_HEADER ObjectHeader;
PIO_STACK_LOCATION IoStack;
PKSAUDIO_DEVICE_ENTRY DeviceEntry;
PKSPIN_CONNECT Connect = NULL;
/* sanity checks */
ASSERT(IoStack->FileObject);
ASSERT(IoStack->FileObject->RelatedFileObject);
- ASSERT(IoStack->FileObject->RelatedFileObject->FsContext2);
+ ASSERT(IoStack->FileObject->RelatedFileObject->FsContext);
/* get current attached virtual device */
- DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)IoStack->FileObject->RelatedFileObject->FsContext2;
+ DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)IoStack->FileObject->RelatedFileObject->FsContext;
/* now validate pin connect request */
Status = KsValidateConnectRequest(Irp, DeviceEntry->PinDescriptorsCount, DeviceEntry->PinDescriptors, &Connect);
RtlZeroMemory(DispatchContext, sizeof(DISPATCH_CONTEXT));
/* allocate object header */
- Status = KsAllocateObjectHeader(&ObjectHeader, 0, NULL, Irp, &PinTable);
+ Status = KsAllocateObjectHeader(&DispatchContext->ObjectHeader, 0, NULL, Irp, &PinTable);
if (!NT_SUCCESS(Status))
{
/* failed */
if (!NT_SUCCESS(Status))
{
/* failed */
- KsFreeObjectHeader(ObjectHeader);
+ KsFreeObjectHeader(DispatchContext->ObjectHeader);
ExFreePool(DispatchContext);
}
else
{
/* store dispatch context */
- IoStack->FileObject->FsContext2 = (PVOID)DispatchContext;
+ IoStack->FileObject->FsContext = (PVOID)DispatchContext;
}