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

entry.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/legacy/wdmaud/main.c
00005  * PURPOSE:         System Audio graph builder
00006  * PROGRAMMER:      Andrew Greenwood
00007  *                  Johannes Anderwald
00008  */
00009 #include "wdmaud.h"
00010 
00011 const GUID KSCATEGORY_SYSAUDIO = {0xA7C7A5B1L, 0x5AF3, 0x11D1, {0x9C, 0xED, 0x00, 0xA0, 0x24, 0xBF, 0x04, 0x07}};
00012 const GUID KSCATEGORY_WDMAUD   = {0x3E227E76L, 0x690D, 0x11D2, {0x81, 0x61, 0x00, 0x00, 0xF8, 0x77, 0x5B, 0xF1}};
00013 
00014 NTSTATUS
00015 NTAPI
00016 WdmAudInstallDevice(
00017     IN  PDRIVER_OBJECT  DriverObject)
00018 {
00019     UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\wdmaud");
00020     UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\DosDevices\\wdmaud");
00021     PDEVICE_OBJECT DeviceObject;
00022     NTSTATUS Status;
00023     PWDMAUD_DEVICE_EXTENSION DeviceExtension;
00024 
00025     DPRINT("WdmAudInstallDevice called\n");
00026 
00027     Status = IoCreateDevice(DriverObject,
00028                             sizeof(WDMAUD_DEVICE_EXTENSION),
00029                             &DeviceName,
00030                             FILE_DEVICE_KS,
00031                             0,
00032                             FALSE,
00033                             &DeviceObject);
00034 
00035     if (!NT_SUCCESS(Status))
00036     {
00037         DPRINT1("IoCreateDevice failed with %x\n", Status);
00038         return Status;
00039     }
00040 
00041     /* clear device extension */
00042     DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
00043     RtlZeroMemory(DeviceExtension, sizeof(WDMAUD_DEVICE_EXTENSION));
00044 
00045     /* register device interfaces */
00046     Status = WdmAudRegisterDeviceInterface(DeviceObject, DeviceExtension);
00047     if (!NT_SUCCESS(Status))
00048     {
00049         DPRINT1("WdmRegisterDeviceInterface failed with %x\n", Status);
00050         IoDeleteDevice(DeviceObject);
00051         return Status;
00052     }
00053 
00054     /* initialize sysaudio device list */
00055     InitializeListHead(&DeviceExtension->SysAudioDeviceList);
00056 
00057     /* initialize client context device list */
00058     InitializeListHead(&DeviceExtension->WdmAudClientList);
00059 
00060     /* initialize spinlock */
00061     KeInitializeSpinLock(&DeviceExtension->Lock);
00062 
00063     /* find available sysaudio devices */
00064     Status = WdmAudOpenSysAudioDevices(DeviceObject, DeviceExtension);
00065     if (!NT_SUCCESS(Status))
00066     {
00067         DPRINT1("WdmAudOpenSysAudioDevices failed with %x\n", Status);
00068         IoDeleteSymbolicLink(&SymlinkName);
00069         IoDeleteDevice(DeviceObject);
00070         return Status;
00071     }
00072     /* allocate ks device header */
00073     Status = KsAllocateDeviceHeader(&DeviceExtension->DeviceHeader, 0, NULL);
00074     if (!NT_SUCCESS(Status))
00075     {
00076         DPRINT1("KsAllocateDeviceHeader failed with %x\n", Status);
00077         IoDeleteSymbolicLink(&SymlinkName);
00078         IoDeleteDevice(DeviceObject);
00079         return Status;
00080     }
00081 
00082     Status = WdmAudMixerInitialize(DeviceObject);
00083     DPRINT("WdmAudMixerInitialize Status %x WaveIn %lu WaveOut %lu Mixer %lu\n", Status, WdmAudGetWaveInDeviceCount(), WdmAudGetWaveOutDeviceCount(), WdmAudGetMixerDeviceCount());
00084 
00085     DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
00086     DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
00087 
00088     return STATUS_SUCCESS;
00089 }
00090 
00091 VOID
00092 NTAPI
00093 WdmAudUnload(
00094     IN PDRIVER_OBJECT driver)
00095 {
00096     DPRINT("WdmAudUnload called\n");
00097 }
00098 
00099 NTSTATUS
00100 NTAPI
00101 WdmAudPnp(
00102     IN  PDEVICE_OBJECT DeviceObject,
00103     IN  PIRP Irp)
00104 {
00105     PIO_STACK_LOCATION IrpStack;
00106 
00107     DPRINT("WdmAudPnp called\n");
00108 
00109     IrpStack = IoGetCurrentIrpStackLocation(Irp);
00110 
00111     if (IrpStack->MinorFunction == IRP_MN_QUERY_PNP_DEVICE_STATE)
00112     {
00113         Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
00114         return KsDefaultDispatchPnp(DeviceObject, Irp);
00115     }
00116     return KsDefaultDispatchPnp(DeviceObject, Irp);
00117 }
00118 
00119 
00120 NTSTATUS
00121 NTAPI
00122 WdmAudCreate(
00123     IN  PDEVICE_OBJECT DeviceObject,
00124     IN  PIRP Irp)
00125 {
00126     NTSTATUS Status;
00127     PIO_STACK_LOCATION IoStack;
00128     PWDMAUD_CLIENT pClient;
00129     //PWDMAUD_DEVICE_EXTENSION DeviceExtension;
00130 
00131     /* get device extension */
00132     //DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
00133 
00134 #if KS_IMPLEMENTED
00135     Status = KsReferenceSoftwareBusObject((KSDEVICE_HEADER)DeviceObject->DeviceExtension);
00136     if (!NT_SUCCESS(Status))
00137     {
00138         DPRINT1("KsReferenceSoftwareBusObject failed with %x\n", Status);
00139         return Status;
00140     }
00141 #endif
00142 
00143     Status = WdmAudOpenSysaudio(DeviceObject, &pClient);
00144     if (!NT_SUCCESS(Status))
00145     {
00146         DPRINT1("Failed to open sysaudio!\n");
00147 
00148         /* complete and forget */
00149         Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
00150         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00151         /* done */
00152         return STATUS_UNSUCCESSFUL;
00153     }
00154 
00155     IoStack = IoGetCurrentIrpStackLocation(Irp);
00156     ASSERT(IoStack->FileObject);
00157 
00158     /* store client context in file object */
00159     IoStack->FileObject->FsContext = pClient;
00160     Status = STATUS_SUCCESS;
00161 
00162     Irp->IoStatus.Status = Status;
00163     Irp->IoStatus.Information = 0;
00164     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00165 
00166     return Status;
00167 }
00168 
00169 NTSTATUS
00170 NTAPI
00171 WdmAudClose(
00172     IN  PDEVICE_OBJECT DeviceObject,
00173     IN  PIRP Irp)
00174 {
00175     /* nothing to do complete request */
00176 #if KS_IMPLEMENTED
00177     Status = KsDereferenceSoftwareBusObject(DeviceExtension->DeviceHeader);
00178 
00179     if (NT_SUCCESS(Status))
00180     {
00181         if (DeviceExtension->SysAudioNotification)
00182             Status = IoUnregisterPlugPlayNotification(DeviceExtension->SysAudioNotification);
00183     }
00184 #endif
00185 
00186     Irp->IoStatus.Status = STATUS_SUCCESS;
00187     Irp->IoStatus.Information = 0;
00188     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00189 
00190     /* done */
00191     return STATUS_SUCCESS;
00192 }
00193 
00194 NTSTATUS
00195 NTAPI
00196 WdmAudCleanup(
00197     IN  PDEVICE_OBJECT DeviceObject,
00198     IN  PIRP Irp)
00199 {
00200     PIO_STACK_LOCATION IoStack;
00201     PWDMAUD_CLIENT pClient;
00202     PWDMAUD_DEVICE_EXTENSION DeviceExtension;
00203     ULONG Index;
00204     KIRQL OldIrql;
00205 
00206     /* get device extension */
00207     DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
00208 
00209     /* get current irp stack location */
00210     IoStack = IoGetCurrentIrpStackLocation(Irp);
00211 
00212     /* sanity check */
00213     ASSERT(IoStack->FileObject);
00214 
00215     /* get client context struct */
00216     pClient = (PWDMAUD_CLIENT)IoStack->FileObject->FsContext;
00217 
00218     /* sanity check */
00219     ASSERT(pClient);
00220 
00221     /* acquire client context list lock */
00222     KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql);
00223 
00224     /* remove entry */
00225     RemoveEntryList(&pClient->Entry);
00226 
00227     /* release lock */
00228     KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql);
00229 
00230     /* check if all audio pins have been closed */
00231     for (Index = 0; Index < pClient->NumPins; Index++)
00232     {
00233        DPRINT("Index %u Pin %p Type %x\n", Index, pClient->hPins[Index].Handle, pClient->hPins[Index].Type);
00234        if (pClient->hPins[Index].Handle && pClient->hPins[Index].Type != MIXER_DEVICE_TYPE)
00235        {
00236            /* found an still open audio pin */
00237            ZwClose(pClient->hPins[Index].Handle);
00238        }
00239     }
00240 
00241     /* free pin array */
00242     if (pClient->hPins)
00243         FreeItem(pClient->hPins);
00244 
00245     /* free client context struct */
00246     FreeItem(pClient);
00247 
00248     /* clear old client pointer */
00249     IoStack->FileObject->FsContext = NULL;
00250 
00251     /* complete request */
00252     Irp->IoStatus.Status = STATUS_SUCCESS;
00253     Irp->IoStatus.Information = 0;
00254     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00255 
00256     /* done */
00257     return STATUS_SUCCESS;
00258 }
00259 
00260 NTSTATUS
00261 NTAPI
00262 DriverEntry(
00263     IN PDRIVER_OBJECT Driver,
00264     IN PUNICODE_STRING Registry_path
00265 )
00266 {
00267     DPRINT("Wdmaud.sys loaded\n");
00268 
00269     Driver->DriverUnload = WdmAudUnload;
00270 
00271     Driver->MajorFunction[IRP_MJ_CREATE] = WdmAudCreate;
00272     Driver->MajorFunction[IRP_MJ_CLOSE] = WdmAudClose;
00273     Driver->MajorFunction[IRP_MJ_PNP] = WdmAudPnp;
00274     Driver->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = KsDefaultForwardIrp; 
00275     Driver->MajorFunction[IRP_MJ_CLEANUP] = WdmAudCleanup;
00276     Driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = WdmAudDeviceControl;
00277     Driver->MajorFunction[IRP_MJ_WRITE] = WdmAudReadWrite;
00278     Driver->MajorFunction[IRP_MJ_READ] = WdmAudReadWrite;
00279     Driver->MajorFunction[IRP_MJ_POWER] = KsDefaultDispatchPower;
00280 
00281     return WdmAudInstallDevice(Driver);
00282 }

Generated on Sun May 27 2012 04:24:41 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.