ReactOS  0.4.14-dev-317-g96040ec
pdo.cpp
Go to the documentation of this file.
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 
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  }
27  }
28 
29  return STATUS_SUCCESS;
30 }
31 
34  IN PIRP Irp)
35 {
36  PPNP_BUS_INFORMATION BusInformation;
37 
38  /* allocate bus information */
40 
41  if (!BusInformation)
42  {
43  /* no memory */
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 
61 NTAPI
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;
72 
73  /* get device extension */
75  ASSERT(DeviceExtension->IsFDO == FALSE);
76 
77  /* get current irp stack location */
79 
80  if (IoStack->Parameters.QueryId.IdType == BusQueryInstanceID)
81  {
83  sizeof(DeviceName),
84  L"%02x%02x",
85  DeviceExtension->Codec->Addr,
86  DeviceExtension->AudioGroup->NodeId);
88  Length = wcslen(DeviceName) + 1;
89 
90  /* allocate result buffer*/
92  if (!Device)
94 
96  Length * sizeof(WCHAR),
97  DeviceName);
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*/
115  if (!Device)
117 
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  {
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*/
135  if (!Device)
137 
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
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 
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;
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;
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
200  IN PIRP Irp)
201 {
203  PIO_STACK_LOCATION IoStack;
204 
205  /* get stack location */
207 
208  /* get capabilities */
209  Capabilities = IoStack->Parameters.DeviceCapabilities.Capabilities;
210 
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
228  IN PIRP Irp)
229 {
230  /* set device flags */
232 
233  /* done */
234  return STATUS_SUCCESS;
235 }
236 
NTSTRSAFEAPI RtlStringCbCopyW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
Definition: ntstrsafe.h:174
#define IN
Definition: typedefs.h:38
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
NTSTATUS HDA_PDOQueryBusDevicePnpState(IN PIRP Irp)
Definition: pdo.cpp:227
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
PHDA_CODEC_ENTRY Codec
Definition: hdaudbus.h:90
_In_ PIRP _In_ PDEVICE_OBJECT Device
Definition: fatprocs.h:2020
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
_In_ PIRP Irp
Definition: csq.h:116
PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes)
Definition: misc.c:30
struct HDA_PDO_DEVICE_EXTENSION * PHDA_PDO_DEVICE_EXTENSION
LONG NTSTATUS
Definition: precomp.h:26
DEVICE_CAPABILITIES
Definition: iotypes.h:928
NTSTATUS HDA_PDOQueryBusInformation(IN PIRP Irp)
Definition: pdo.cpp:33
WCHAR DeviceName[]
Definition: adapter.cpp:21
NTSTATUS HDA_PDORemoveDevice(_In_ PDEVICE_OBJECT DeviceObject)
Definition: pdo.cpp:11
#define PNP_DEVICE_DONT_DISPLAY_IN_UI
Definition: iotypes.h:965
USHORT ProductId
Definition: hdaudbus.h:48
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:263
NTSTATUS NTAPI HDA_PDOQueryId(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pdo.cpp:62
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
_Must_inspect_result_ typedef _Out_ PHIDP_CAPS Capabilities
Definition: hidclass.h:103
PVOID DeviceExtension
Definition: env_spec_w32.h:418
smooth NULL
Definition: ftsmooth.c:416
struct _PNP_BUS_INFORMATION * PPNP_BUS_INFORMATION
void DPRINT(...)
Definition: polytest.cpp:61
Definition: bufpool.h:45
UCHAR Revision
Definition: hdaudbus.h:51
UCHAR Minor
Definition: hdaudbus.h:50
NTSTATUS HDA_PDOHandleQueryDeviceText(IN PIRP Irp)
Definition: pdo.cpp:154
NTSTATUS HDA_PDOQueryBusDeviceCapabilities(IN PIRP Irp)
Definition: pdo.cpp:199
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
#define swprintf(buf, format,...)
Definition: sprintf.c:56
#define PNP_DEVICE_NOT_DISABLEABLE
Definition: iotypes.h:969
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static const WCHAR L[]
Definition: oid.c:1250
UCHAR Major
Definition: hdaudbus.h:49
* PDEVICE_CAPABILITIES
Definition: iotypes.h:928
Status
Definition: gdiplustypes.h:24
#define _In_
Definition: no_sal2.h:204
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
USHORT VendorId
Definition: hdaudbus.h:47
UCHAR Addr
Definition: hdaudbus.h:53
PHDA_CODEC_AUDIO_GROUP AudioGroup
Definition: hdaudbus.h:91
#define DPRINT1
Definition: precomp.h:8
PDEVICE_OBJECT ChildPDO
Definition: hdaudbus.h:40
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define ULONG_PTR
Definition: config.h:101
WCHAR * LPWSTR
Definition: xmlstorage.h:184
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:2772
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
return STATUS_SUCCESS
Definition: btrfs.c:2938
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
INTERFACE_TYPE LegacyBusType
Definition: cmtypes.h:363
#define NT_ASSERT
Definition: rtlfuncs.h:3312