[HDAUDBUS] Forward FDO requests instead of completing them.
[reactos.git] / drivers / wdm / audio / hdaudbus / hdaudbus.cpp
index 9239354..b8eacba 100644 (file)
@@ -7,11 +7,14 @@
 */
 #include "hdaudbus.h"
 
+DRIVER_DISPATCH HDA_Pnp;
+DRIVER_ADD_DEVICE HDA_AddDevice;
+extern "C" DRIVER_INITIALIZE DriverEntry;
 
 PVOID
 AllocateItem(
-    IN POOL_TYPE PoolType,
-    IN SIZE_T NumberOfBytes)
+    _In_ POOL_TYPE PoolType,
+    _In_ SIZE_T NumberOfBytes)
 {
     PVOID Item = ExAllocatePoolWithTag(PoolType, NumberOfBytes, TAG_HDA);
     if (!Item)
@@ -23,7 +26,7 @@ AllocateItem(
 
 VOID
 FreeItem(
-    IN PVOID Item)
+    __drv_freesMem(Mem) PVOID Item)
 {
     ExFreePool(Item);
 }
@@ -83,142 +86,157 @@ HDA_SyncForwardIrp(
 }
 
 NTSTATUS
-NTAPI
-HDA_Pnp(
-    IN PDEVICE_OBJECT DeviceObject,
-    IN PIRP Irp)
+HDA_FdoPnp(
+    _In_ PDEVICE_OBJECT DeviceObject,
+    _Inout_ PIRP Irp)
 {
-    NTSTATUS Status = STATUS_NOT_SUPPORTED;
+    NTSTATUS Status;
     PIO_STACK_LOCATION IoStack;
-    PDEVICE_RELATIONS DeviceRelation;
     PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension;
-    //PHDA_PDO_DEVICE_EXTENSION ChildDeviceExtension;
-
-    FDODeviceExtension = (PHDA_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    //ChildDeviceExtension = (PHDA_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
+    FDODeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
     IoStack = IoGetCurrentIrpStackLocation(Irp);
-    if (FDODeviceExtension->IsFDO)
+
+    switch (IoStack->MinorFunction)
     {
-        if (IoStack->MinorFunction == IRP_MN_START_DEVICE)
-        {
-            Status = HDA_FDOStartDevice(DeviceObject, Irp);
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS)
+    case IRP_MN_START_DEVICE:
+        Status = HDA_FDOStartDevice(DeviceObject, Irp);
+        Irp->IoStatus.Status = Status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return Status;
+    case IRP_MN_QUERY_DEVICE_RELATIONS:
+        /* handle bus device relations */
+        if (IoStack->Parameters.QueryDeviceRelations.Type == BusRelations)
         {
-            /* handle bus device relations */
-            if (IoStack->Parameters.QueryDeviceRelations.Type == BusRelations)
+            Status = HDA_FDOQueryBusRelations(DeviceObject, Irp);
+            Irp->IoStatus.Status = Status;
+            if (!NT_SUCCESS(Status))
             {
-                Status = HDA_FDOQueryBusRelations(DeviceObject, Irp);
+                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+                return Status;
             }
-            else
-            {
-                Status = Irp->IoStatus.Status;
-            }
-        } 
-        else
-        {
-            /* get default status */
-            Status = Irp->IoStatus.Status;
         }
+        break;
     }
-    else
+
+    IoSkipCurrentIrpStackLocation(Irp);
+    return IoCallDriver(FDODeviceExtension->LowerDevice, Irp);
+}
+
+NTSTATUS
+HDA_PdoPnp(
+    _In_ PDEVICE_OBJECT DeviceObject,
+    _Inout_ PIRP Irp)
+{
+    NTSTATUS Status;
+    PIO_STACK_LOCATION IoStack;
+    PDEVICE_RELATIONS DeviceRelation;
+
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    switch (IoStack->MinorFunction)
     {
-        if (IoStack->MinorFunction == IRP_MN_START_DEVICE)
-        {
-            /* no op for pdo */
-            Status = STATUS_SUCCESS;
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_BUS_INFORMATION)
-        {
-            /* query bus information */
-            Status = HDA_PDOQueryBusInformation(Irp);
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_PNP_DEVICE_STATE)
+    case IRP_MN_START_DEVICE:
+        /* no op for pdo */
+        Status = STATUS_SUCCESS;
+        break;
+    case IRP_MN_QUERY_BUS_INFORMATION:
+        /* query bus information */
+        Status = HDA_PDOQueryBusInformation(Irp);
+        break;
+    case IRP_MN_QUERY_PNP_DEVICE_STATE:
+        /* query pnp state */
+        Status = HDA_PDOQueryBusDevicePnpState(Irp);
+        break;
+    case IRP_MN_QUERY_DEVICE_RELATIONS:
+        if (IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation)
         {
-            /* query pnp state */
-            Status = HDA_PDOQueryBusDevicePnpState(Irp);
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS)
-        {
-            if (IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation)
+            /* handle target device relations */
+            ASSERT(IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation);
+            ASSERT(Irp->IoStatus.Information == 0);
+
+            /* allocate device relation */
+            DeviceRelation = (PDEVICE_RELATIONS)AllocateItem(PagedPool, sizeof(DEVICE_RELATIONS));
+            if (DeviceRelation)
+            {
+                DeviceRelation->Count = 1;
+                DeviceRelation->Objects[0] = DeviceObject;
+
+                /* reference self */
+                ObReferenceObject(DeviceObject);
+
+                /* store result */
+                Irp->IoStatus.Information = (ULONG_PTR)DeviceRelation;
+
+                /* done */
+                Status = STATUS_SUCCESS;
+            }
+            else
             {
-                /* handle target device relations */
-                ASSERT(IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation);
-                ASSERT(Irp->IoStatus.Information == 0);
-
-                /* allocate device relation */
-                DeviceRelation = (PDEVICE_RELATIONS)AllocateItem(PagedPool, sizeof(DEVICE_RELATIONS));
-                if (DeviceRelation)
-                {
-                    DeviceRelation->Count = 1;
-                    DeviceRelation->Objects[0] = DeviceObject;
-
-                    /* reference self */
-                    ObReferenceObject(DeviceObject);
-
-                    /* store result */
-                    Irp->IoStatus.Information = (ULONG_PTR)DeviceRelation;
-
-                    /* done */
-                    Status = STATUS_SUCCESS;
-                }
-                else
-                {
-                    /* no memory */
-                    Status = STATUS_INSUFFICIENT_RESOURCES;
-                }
+                /* no memory */
+                Status = STATUS_INSUFFICIENT_RESOURCES;
             }
         }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_CAPABILITIES)
-        {
-            /* query capabilities */
-            Status = HDA_PDOQueryBusDeviceCapabilities(Irp);
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
-        {
-            /* no op */
-            Status = STATUS_SUCCESS;
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCES)
-        {
-            /* no op */
-            Status = STATUS_SUCCESS;
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_ID)
-        {
-            Status = HDA_PDOQueryId(DeviceObject, Irp);
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_TEXT)
-        {
-            Status = HDA_PDOHandleQueryDeviceText(Irp);
-        }
-        else if (IoStack->MinorFunction == IRP_MN_QUERY_INTERFACE)
-        {
-            Status = HDA_PDOHandleQueryInterface(DeviceObject, Irp);
-        }
-        else
-        {
-            /* get default status */
-            Status = Irp->IoStatus.Status;
-        }
+        break;
+    case IRP_MN_QUERY_CAPABILITIES:
+        /* query capabilities */
+        Status = HDA_PDOQueryBusDeviceCapabilities(Irp);
+        break;
+    case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
+        /* no op */
+        Status = STATUS_SUCCESS;
+        break;
+    case IRP_MN_QUERY_RESOURCES:
+        /* no op */
+        Status = STATUS_SUCCESS;
+        break;
+    case IRP_MN_QUERY_ID:
+        Status = HDA_PDOQueryId(DeviceObject, Irp);
+        break;
+    case IRP_MN_QUERY_DEVICE_TEXT:
+        Status = HDA_PDOHandleQueryDeviceText(Irp);
+        break;
+    case IRP_MN_QUERY_INTERFACE:
+        Status = HDA_PDOHandleQueryInterface(DeviceObject, Irp);
+        break;
+    default:
+        /* get default status */
+        Status = Irp->IoStatus.Status;
+        break;
     }
 
     Irp->IoStatus.Status = Status;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-
     return Status;
 }
 
+NTSTATUS
+NTAPI
+HDA_Pnp(
+    _In_ PDEVICE_OBJECT DeviceObject,
+    _Inout_ PIRP Irp)
+{
+    PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension;
+
+    FDODeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
+
+    if (FDODeviceExtension->IsFDO)
+    {
+        return HDA_FdoPnp(DeviceObject, Irp);
+    }
+    else
+    {
+        return HDA_PdoPnp(DeviceObject, Irp);
+    }
+}
 
-//PDRIVER_ADD_DEVICE HDA_AddDevice;
 
 NTSTATUS
 NTAPI
 HDA_AddDevice(
-IN PDRIVER_OBJECT DriverObject,
-IN PDEVICE_OBJECT PhysicalDeviceObject)
+    _In_ PDRIVER_OBJECT DriverObject,
+    _In_ PDEVICE_OBJECT PhysicalDeviceObject)
 {
     PDEVICE_OBJECT DeviceObject;
     PHDA_FDO_DEVICE_EXTENSION DeviceExtension;
@@ -250,8 +268,8 @@ extern "C"
 NTSTATUS
 NTAPI
 DriverEntry(
-    IN PDRIVER_OBJECT DriverObject,
-    IN PUNICODE_STRING RegistryPathName)
+    _In_ PDRIVER_OBJECT DriverObject,
+    _In_ PUNICODE_STRING RegistryPathName)
 {
     DriverObject->DriverExtension->AddDevice = HDA_AddDevice;
     DriverObject->MajorFunction[IRP_MJ_PNP] = HDA_Pnp;
@@ -259,4 +277,4 @@ DriverEntry(
     return STATUS_SUCCESS;
 }
 
-}
\ No newline at end of file
+}