Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendispatcher.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
1.7.6.1
|