xref: /reactos/drivers/wdm/audio/hdaudbus/pdo.cpp (revision 3435c3b5)
1  /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS Kernel Streaming
4  * FILE:            drivers/wdm/audio/hdaudbus/pdo.cpp
5  * PURPOSE:         HDA Driver Entry
6  * PROGRAMMER:      Johannes Anderwald
7  */
8  #include "hdaudbus.h"
9  
10  NTSTATUS
11  HDA_PDORemoveDevice(
12      _In_ PDEVICE_OBJECT DeviceObject)
13  {
14      PHDA_PDO_DEVICE_EXTENSION DeviceExtension;
15  
16      /* get device extension */
17      DeviceExtension = static_cast<PHDA_PDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
18      ASSERT(DeviceExtension->IsFDO == FALSE);
19  
20      if (DeviceExtension->ReportedMissing)
21      {
22          if (DeviceExtension->AudioGroup != NULL)
23          {
24              DeviceExtension->AudioGroup->ChildPDO = NULL;
25          }
26          IoDeleteDevice(DeviceObject);
27      }
28  
29      return STATUS_SUCCESS;
30  }
31  
32  NTSTATUS
33  HDA_PDOQueryBusInformation(
34      IN PIRP Irp)
35  {
36      PPNP_BUS_INFORMATION BusInformation;
37  
38      /* allocate bus information */
39      BusInformation = (PPNP_BUS_INFORMATION)AllocateItem(PagedPool, sizeof(PNP_BUS_INFORMATION));
40  
41      if (!BusInformation)
42      {
43          /* no memory */
44          return STATUS_INSUFFICIENT_RESOURCES;
45      }
46  
47      /* return info */
48      BusInformation->BusNumber = 0;
49      BusInformation->LegacyBusType = PCIBus;
50      RtlMoveMemory(&BusInformation->BusTypeGuid, &GUID_HDAUDIO_BUS_INTERFACE, sizeof(GUID));
51  
52      /* store result */
53      Irp->IoStatus.Information = (ULONG_PTR)BusInformation;
54  
55      /* done */
56      return STATUS_SUCCESS;
57  }
58  
59  
60  NTSTATUS
61  NTAPI
62  HDA_PDOQueryId(
63      IN PDEVICE_OBJECT DeviceObject,
64      IN PIRP Irp)
65  {
66      PIO_STACK_LOCATION IoStack;
67      WCHAR DeviceName[200];
68      PHDA_PDO_DEVICE_EXTENSION DeviceExtension;
69      ULONG Length;
70      LPWSTR Device;
71      NTSTATUS Status;
72  
73      /* get device extension */
74      DeviceExtension = (PHDA_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
75      ASSERT(DeviceExtension->IsFDO == FALSE);
76  
77      /* get current irp stack location */
78      IoStack = IoGetCurrentIrpStackLocation(Irp);
79  
80      if (IoStack->Parameters.QueryId.IdType == BusQueryInstanceID)
81      {
82          Status = RtlStringCbPrintfW(DeviceName,
83                                      sizeof(DeviceName),
84                                      L"%02x%02x",
85                                      DeviceExtension->Codec->Addr,
86                                      DeviceExtension->AudioGroup->NodeId);
87          NT_ASSERT(NT_SUCCESS(Status));
88          Length = wcslen(DeviceName) + 1;
89  
90          /* allocate result buffer*/
91          Device = (LPWSTR)AllocateItem(PagedPool, Length * sizeof(WCHAR));
92          if (!Device)
93              return STATUS_INSUFFICIENT_RESOURCES;
94  
95          Status = RtlStringCbCopyW(Device,
96                                    Length * sizeof(WCHAR),
97                                    DeviceName);
98          NT_ASSERT(NT_SUCCESS(Status));
99  
100          DPRINT1("ID: %S\n", Device);
101          /* store result */
102          Irp->IoStatus.Information = (ULONG_PTR)Device;
103          return STATUS_SUCCESS;
104      }
105      else if (IoStack->Parameters.QueryId.IdType == BusQueryDeviceID ||
106          IoStack->Parameters.QueryId.IdType == BusQueryHardwareIDs)
107      {
108  
109          /* calculate size */
110          swprintf(DeviceName, L"HDAUDIO\\FUNC_%02X&VEN_%04X&DEV_%04X&SUBSYS_%08X", DeviceExtension->AudioGroup->FunctionGroup, DeviceExtension->Codec->VendorId, DeviceExtension->Codec->ProductId, DeviceExtension->Codec->VendorId << 16 | DeviceExtension->Codec->ProductId);
111          Length = wcslen(DeviceName) + 20;
112  
113          /* allocate result buffer*/
114          Device = (LPWSTR)AllocateItem(PagedPool, Length * sizeof(WCHAR));
115          if (!Device)
116              return STATUS_INSUFFICIENT_RESOURCES;
117  
118          wcscpy(Device, DeviceName);
119  
120          DPRINT1("ID: %S\n", Device);
121          /* store result */
122          Irp->IoStatus.Information = (ULONG_PTR)Device;
123          return STATUS_SUCCESS;
124      }
125      else if (IoStack->Parameters.QueryId.IdType == BusQueryCompatibleIDs)
126      {
127          RtlZeroMemory(DeviceName, sizeof(DeviceName));
128          Length = swprintf(DeviceName, L"HDAUDIO\\FUNC_%02X&VEN_%04X&DEV_%04X&REV_%04X", DeviceExtension->AudioGroup->FunctionGroup, DeviceExtension->Codec->VendorId, DeviceExtension->Codec->ProductId, DeviceExtension->Codec->Major << 12 | DeviceExtension->Codec->Minor << 8 | DeviceExtension->Codec->Revision) + 1;
129          Length += swprintf(&DeviceName[Length], L"HDAUDIO\\FUNC_%02X&VEN_%04X&DEV_%04X", DeviceExtension->AudioGroup->FunctionGroup, DeviceExtension->Codec->VendorId, DeviceExtension->Codec->ProductId) + 1;
130          Length += swprintf(&DeviceName[Length], L"HDAUDIO\\FUNC_%02X&VEN_%04X", DeviceExtension->AudioGroup->FunctionGroup, DeviceExtension->Codec->VendorId) + 1;
131          Length += swprintf(&DeviceName[Length], L"HDAUDIO\\FUNC_%02X", DeviceExtension->AudioGroup->FunctionGroup) + 2;
132  
133          /* allocate result buffer*/
134          Device = (LPWSTR)AllocateItem(PagedPool, Length * sizeof(WCHAR));
135          if (!Device)
136              return STATUS_INSUFFICIENT_RESOURCES;
137  
138          RtlCopyMemory(Device, DeviceName, Length * sizeof(WCHAR));
139  
140          DPRINT1("ID: %S\n", Device);
141          /* store result */
142          Irp->IoStatus.Information = (ULONG_PTR)Device;
143          return STATUS_SUCCESS;
144      }
145      else
146      {
147          DPRINT1("QueryID Type %x not implemented\n", IoStack->Parameters.QueryId.IdType);
148          return Irp->IoStatus.Status;
149      }
150      return STATUS_NOT_IMPLEMENTED;
151  }
152  
153  NTSTATUS
154  HDA_PDOHandleQueryDeviceText(
155      IN PIRP Irp)
156  {
157      PIO_STACK_LOCATION IoStack;
158      LPWSTR Buffer;
159      static WCHAR DeviceText[] = L"Audio Device on High Definition Audio Bus";
160  
161      IoStack = IoGetCurrentIrpStackLocation(Irp);
162      if (IoStack->Parameters.QueryDeviceText.DeviceTextType == DeviceTextDescription)
163      {
164          DPRINT("HDA_PdoHandleQueryDeviceText DeviceTextDescription\n");
165  
166          Buffer = (LPWSTR)AllocateItem(PagedPool, sizeof(DeviceText));
167          if (!Buffer)
168          {
169              Irp->IoStatus.Information = 0;
170              return STATUS_INSUFFICIENT_RESOURCES;
171          }
172  
173          wcscpy(Buffer, DeviceText);
174  
175          Irp->IoStatus.Information = (ULONG_PTR)Buffer;
176          return STATUS_SUCCESS;
177      }
178      else
179      {
180          DPRINT("HDA_PdoHandleQueryDeviceText DeviceTextLocationInformation\n");
181  
182          Buffer = (LPWSTR)AllocateItem(PagedPool, sizeof(DeviceText));
183          if (!Buffer)
184          {
185              Irp->IoStatus.Information = 0;
186              return STATUS_INSUFFICIENT_RESOURCES;
187          }
188  
189          wcscpy(Buffer, DeviceText);
190  
191          /* save result */
192          Irp->IoStatus.Information = (ULONG_PTR)Buffer;
193          return STATUS_SUCCESS;
194      }
195  
196  }
197  
198  NTSTATUS
199  HDA_PDOQueryBusDeviceCapabilities(
200      IN PIRP Irp)
201  {
202      PDEVICE_CAPABILITIES Capabilities;
203      PIO_STACK_LOCATION IoStack;
204  
205      /* get stack location */
206      IoStack = IoGetCurrentIrpStackLocation(Irp);
207  
208      /* get capabilities */
209      Capabilities = IoStack->Parameters.DeviceCapabilities.Capabilities;
210  
211      RtlZeroMemory(Capabilities, sizeof(DEVICE_CAPABILITIES));
212  
213      /* setup capabilities */
214      Capabilities->UniqueID = TRUE;
215      Capabilities->SilentInstall = TRUE;
216      Capabilities->SurpriseRemovalOK = TRUE;
217      Capabilities->Address = 0;
218      Capabilities->UINumber = 0;
219      Capabilities->SystemWake = PowerSystemWorking; /* FIXME common device extension */
220      Capabilities->DeviceWake = PowerDeviceD0;
221  
222      /* done */
223      return STATUS_SUCCESS;
224  }
225  
226  NTSTATUS
227  HDA_PDOQueryBusDevicePnpState(
228      IN PIRP Irp)
229  {
230      /* set device flags */
231      Irp->IoStatus.Information = PNP_DEVICE_DONT_DISPLAY_IN_UI | PNP_DEVICE_NOT_DISABLEABLE;
232  
233      /* done */
234      return STATUS_SUCCESS;
235  }
236  
237