ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

dispatcher.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS Kernel Streaming
00004  * FILE:            drivers/wdm/audio/sysaudio/dispatcher.c
00005  * PURPOSE:         System Audio graph builder
00006  * PROGRAMMER:      Johannes Anderwald
00007  */
00008 
00009 #include "sysaudio.h"
00010 
00011 NTSTATUS
00012 NTAPI
00013 Dispatch_fnDeviceIoControl(
00014     PDEVICE_OBJECT DeviceObject,
00015     PIRP Irp)
00016 {
00017     PIO_STACK_LOCATION IoStack;
00018 
00019     IoStack = IoGetCurrentIrpStackLocation(Irp);
00020     if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
00021     {
00022        return SysAudioHandleProperty(DeviceObject, Irp);
00023     }
00024 
00025     /* unsupported request */
00026     Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
00027     Irp->IoStatus.Information = 0;
00028     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00029     return STATUS_UNSUCCESSFUL;
00030 }
00031 
00032 NTSTATUS
00033 NTAPI
00034 Dispatch_fnClose(
00035     PDEVICE_OBJECT DeviceObject,
00036     PIRP Irp)
00037 {
00038     DPRINT("Dispatch_fnClose called DeviceObject %p Irp %p\n", DeviceObject);
00039 
00040     Irp->IoStatus.Status = STATUS_SUCCESS;
00041     Irp->IoStatus.Information = 0;
00042     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00043     return STATUS_SUCCESS;
00044 }
00045 
00046 static KSDISPATCH_TABLE DispatchTable =
00047 {
00048     Dispatch_fnDeviceIoControl,
00049     KsDispatchInvalidDeviceRequest,
00050     KsDispatchInvalidDeviceRequest,
00051     KsDispatchInvalidDeviceRequest,
00052     Dispatch_fnClose,
00053     KsDispatchInvalidDeviceRequest,
00054     KsDispatchInvalidDeviceRequest,
00055     KsDispatchFastIoDeviceControlFailure,
00056     KsDispatchFastReadFailure,
00057     KsDispatchFastWriteFailure,
00058 };
00059 
00060 NTSTATUS
00061 NTAPI
00062 DispatchCreateSysAudio(
00063     IN  PDEVICE_OBJECT DeviceObject,
00064     IN  PIRP Irp)
00065 {
00066     NTSTATUS Status;
00067     KSOBJECT_HEADER ObjectHeader;
00068     PKSOBJECT_CREATE_ITEM CreateItem;
00069 
00070     DPRINT("DispatchCreateSysAudio entered\n");
00071 
00072     /* allocate create item */
00073     CreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
00074     if (!CreateItem)
00075     {
00076         Irp->IoStatus.Information = 0;
00077         Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
00078         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00079         return STATUS_INSUFFICIENT_RESOURCES;
00080     }
00081 
00082     /* zero create struct */
00083     RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
00084 
00085     /* setup create context */
00086     CreateItem->Create = DispatchCreateSysAudioPin;
00087     RtlInitUnicodeString(&CreateItem->ObjectClass, KSSTRING_Pin);
00088 
00089     /* allocate object header */
00090     Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
00091 
00092     DPRINT("KsAllocateObjectHeader result %x\n", Status);
00093     /* complete the irp */
00094     Irp->IoStatus.Information = 0;
00095     Irp->IoStatus.Status = Status;
00096     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00097     return Status;
00098 }
00099 
00100 NTSTATUS
00101 SysAudioAllocateDeviceHeader(
00102     IN SYSAUDIODEVEXT *DeviceExtension)
00103 {
00104     NTSTATUS Status;
00105     PKSOBJECT_CREATE_ITEM CreateItem;
00106 
00107     /* allocate create item */
00108     CreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
00109     if (!CreateItem)
00110         return STATUS_INSUFFICIENT_RESOURCES;
00111 
00112     /* initialize create item struct */
00113     RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
00114     CreateItem->Create = DispatchCreateSysAudio;
00115 
00116     /* FIXME Sysaudio doesnt need a named create item because it installs itself
00117      * via the device interface
00118      */
00119     RtlInitUnicodeString(&CreateItem->ObjectClass, L"GLOBAL");
00120     CreateItem->Flags = KSCREATE_ITEM_WILDCARD;
00121 
00122     Status = KsAllocateDeviceHeader(&DeviceExtension->KsDeviceHeader,
00123                                     1,
00124                                     CreateItem);
00125     return Status;
00126 }
00127 
00128 NTSTATUS
00129 SysAudioOpenKMixer(
00130     IN SYSAUDIODEVEXT *DeviceExtension)
00131 {
00132     NTSTATUS Status;
00133     UNICODE_STRING DeviceInstanceName = RTL_CONSTANT_STRING(L"\\Device\\kmixer\\GLOBAL");
00134     UNICODE_STRING DevicePath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\kmixer");
00135 
00136     Status = ZwLoadDriver(&DevicePath);
00137 
00138     if (NT_SUCCESS(Status))
00139     {
00140         Status = OpenDevice(&DeviceInstanceName, &DeviceExtension->KMixerHandle, &DeviceExtension->KMixerFileObject);
00141         if (!NT_SUCCESS(Status))
00142         {
00143             DeviceExtension->KMixerHandle = NULL;
00144             DeviceExtension->KMixerFileObject = NULL;
00145         }
00146     }
00147 
00148     DPRINT("Status %lx KMixerHandle %p KMixerFileObject %p\n", Status, DeviceExtension->KMixerHandle, DeviceExtension->KMixerFileObject);
00149     return STATUS_SUCCESS;
00150 }

Generated on Thu May 24 2012 04:29:14 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.