xref: /reactos/drivers/wdm/audio/hdaudbus/pdo.cpp (revision 6ec38aa9)
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
HDA_PDORemoveDevice(_In_ PDEVICE_OBJECT DeviceObject)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
HDA_PDOQueryBusInformation(IN PIRP Irp)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
HDA_PDOQueryId(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)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
HDA_PDOHandleQueryDeviceText(IN PIRP Irp)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
HDA_PDOQueryBusDeviceCapabilities(IN PIRP Irp)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
HDA_PDOQueryBusDevicePnpState(IN PIRP Irp)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