mirror of
https://github.com/reactos/reactos.git
synced 2024-09-18 00:33:04 +00:00
203 lines
5.1 KiB
C
203 lines
5.1 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS Kernel Streaming
|
|
* FILE: drivers/wdm/audio/filters/kmixer/filter.c
|
|
* PURPOSE: Filter File Context Header header
|
|
* PROGRAMMER: Johannes Anderwald
|
|
*/
|
|
|
|
#include "kmixer.h"
|
|
|
|
#include <swenum.h>
|
|
|
|
#define YDEBUG
|
|
#include <debug.h>
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
Dispatch_fnDeviceIoControl(
|
|
PDEVICE_OBJECT DeviceObject,
|
|
PIRP Irp)
|
|
{
|
|
UNIMPLEMENTED;
|
|
DbgBreakPoint();
|
|
|
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|
Irp->IoStatus.Information = 0;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return STATUS_UNSUCCESSFUL;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
Dispatch_fnClose(
|
|
PDEVICE_OBJECT DeviceObject,
|
|
PIRP Irp)
|
|
{
|
|
UNIMPLEMENTED;
|
|
|
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
Irp->IoStatus.Information = 0;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
static KSDISPATCH_TABLE DispatchTable =
|
|
{
|
|
Dispatch_fnDeviceIoControl,
|
|
KsDispatchInvalidDeviceRequest,
|
|
KsDispatchInvalidDeviceRequest,
|
|
KsDispatchInvalidDeviceRequest,
|
|
Dispatch_fnClose,
|
|
KsDispatchInvalidDeviceRequest,
|
|
KsDispatchInvalidDeviceRequest,
|
|
KsDispatchFastIoDeviceControlFailure,
|
|
KsDispatchFastWriteFailure,
|
|
KsDispatchFastWriteFailure,
|
|
};
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
DispatchCreateKMixPin(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
DPRINT("DispatchCreateKMix entered\n");
|
|
|
|
/* create the pin */
|
|
Status = CreatePin(Irp);
|
|
|
|
/* save result */
|
|
Irp->IoStatus.Status = Status;
|
|
/* complete the request */
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
/* done */
|
|
return Status;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
DispatchCreateKMixAllocator(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp)
|
|
{
|
|
NTSTATUS Status;
|
|
|
|
/* create the allocator */
|
|
Status = KsCreateDefaultAllocator(Irp);
|
|
|
|
/* save result */
|
|
Irp->IoStatus.Status = Status;
|
|
/* complete the request */
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
/* done */
|
|
return Status;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
DispatchCreateKMix(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp)
|
|
{
|
|
NTSTATUS Status;
|
|
KSOBJECT_HEADER ObjectHeader;
|
|
PKSOBJECT_CREATE_ITEM CreateItem;
|
|
PKMIXER_DEVICE_EXT DeviceExtension;
|
|
|
|
DPRINT("DispatchCreateKMix entered\n");
|
|
|
|
/* check if the request was from usermode */
|
|
if (Irp->RequestorMode == UserMode)
|
|
{
|
|
/* deny access from usermode */
|
|
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
|
|
Irp->IoStatus.Information = 0;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return STATUS_INVALID_DEVICE_REQUEST;
|
|
}
|
|
|
|
/* get device extension */
|
|
DeviceExtension = (PKMIXER_DEVICE_EXT)DeviceObject->DeviceExtension;
|
|
|
|
#if 0
|
|
/* reference the software bus object */
|
|
Status = KsReferenceSoftwareBusObject(DeviceExtension->KsDeviceHeader);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
/* failed to reference bus object */
|
|
Irp->IoStatus.Status = Status;
|
|
Irp->IoStatus.Information = 0;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return Status;
|
|
}
|
|
#endif
|
|
|
|
/* allocate create item */
|
|
CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM) * 2);
|
|
if (!CreateItem)
|
|
{
|
|
/* not enough memory */
|
|
Irp->IoStatus.Information = 0;
|
|
Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return STATUS_INSUFFICIENT_RESOURCES;
|
|
}
|
|
|
|
/* zero create struct */
|
|
RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM) * 2);
|
|
|
|
/* initialize pin create item */
|
|
CreateItem[0].Create = DispatchCreateKMixPin;
|
|
RtlInitUnicodeString(&CreateItem[0].ObjectClass, KSSTRING_Pin);
|
|
CreateItem[1].Create = DispatchCreateKMixAllocator;
|
|
RtlInitUnicodeString(&CreateItem[1].ObjectClass, KSSTRING_Allocator);
|
|
|
|
/* allocate object header */
|
|
Status = KsAllocateObjectHeader(&ObjectHeader, 2, CreateItem, Irp, &DispatchTable);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
/* failed to allocate object header */
|
|
ExFreePool(CreateItem);
|
|
KsDereferenceSoftwareBusObject(DeviceExtension->KsDeviceHeader);
|
|
}
|
|
|
|
DPRINT("KsAllocateObjectHeader result %x\n", Status);
|
|
/* complete the irp */
|
|
Irp->IoStatus.Information = 0;
|
|
Irp->IoStatus.Status = Status;
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return Status;
|
|
}
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
KMixAllocateDeviceHeader(
|
|
IN PKMIXER_DEVICE_EXT DeviceExtension)
|
|
{
|
|
NTSTATUS Status;
|
|
PKSOBJECT_CREATE_ITEM CreateItem;
|
|
|
|
/* allocate create item */
|
|
CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM) * 2);
|
|
if (!CreateItem)
|
|
return STATUS_INSUFFICIENT_RESOURCES;
|
|
|
|
/* initialize create item struct */
|
|
RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM) * 2);
|
|
CreateItem[0].Create = DispatchCreateKMix;
|
|
RtlInitUnicodeString(&CreateItem[0].ObjectClass, L"GLOBAL");
|
|
CreateItem[1].Create = DispatchCreateKMix;
|
|
RtlInitUnicodeString(&CreateItem[1].ObjectClass, KSSTRING_Filter);
|
|
|
|
Status = KsAllocateDeviceHeader(&DeviceExtension->KsDeviceHeader,
|
|
2,
|
|
CreateItem);
|
|
return Status;
|
|
}
|
|
|