ReactOS  0.4.15-dev-1177-g6cb3b62
detect.c File Reference
#include "precomp.h"
#include <mment4.h>
#include <mmebuddy_debug.h>
Include dependency graph for detect.c:

Go to the source code of this file.

Functions

MMRESULT EnumerateNt4ServiceSoundDevices (IN LPWSTR ServiceName, IN MMDEVICE_TYPE DeviceType, IN SOUND_DEVICE_DETECTED_PROC SoundDeviceDetectedProc)
 
MMRESULT DetectNt4SoundDevices (IN MMDEVICE_TYPE DeviceType, IN PWSTR BaseDeviceName, IN SOUND_DEVICE_DETECTED_PROC SoundDeviceDetectedProc)
 

Function Documentation

◆ DetectNt4SoundDevices()

MMRESULT DetectNt4SoundDevices ( IN MMDEVICE_TYPE  DeviceType,
IN PWSTR  BaseDeviceName,
IN SOUND_DEVICE_DETECTED_PROC  SoundDeviceDetectedProc 
)

Definition at line 151 of file detect.c.

155 {
156  SIZE_T DeviceNameLength = 0;
158  ULONG Index = 0;
160  BOOLEAN DoSearch = TRUE;
161 
163 
164  DeviceNameLength = wcslen(BaseDeviceName);
165  /* Consider the length of the number */
166  DeviceNameLength += GetDigitCount(Index);
167 
168  DeviceName = AllocateWideString(DeviceNameLength);
169 
170  if ( ! DeviceName )
171  {
172  return MMSYSERR_NOMEM;
173  }
174 
175  while ( DoSearch )
176  {
177  /* Nothing like a nice clean device name */
179  wsprintf(DeviceName, L"%ls%d", BaseDeviceName, Index);
180 
182  TRUE,
184  {
185  /* Notify the callback function */
186  SND_TRACE(L"Found device: %wS\n", DeviceName);
187  SoundDeviceDetectedProc(DeviceType, DeviceName);
188 
190 
191  ++ Index;
192  }
193  else
194  {
195  DoSearch = FALSE;
196  }
197  }
198 
200 
201  return MMSYSERR_NOERROR;
202 }
static VOID FreeMemory(PCREATE_DATA Data)
Definition: create.c:134
#define CloseHandle
Definition: compat.h:487
_Inout_ PUSB_DEVICE_HANDLE DeviceHandle
Definition: hubbusif.h:121
UINT GetDigitCount(IN UINT Number)
Definition: utility.c:68
#define TRUE
Definition: types.h:120
uint16_t * PWSTR
Definition: typedefs.h:56
DeviceType
Definition: mmdrv.h:41
WCHAR DeviceName[]
Definition: adapter.cpp:21
#define VALIDATE_MMSYS_PARAMETER(parameter_condition)
Definition: mmebuddy.h:71
#define ZeroWideString(string)
Definition: mmebuddy.h:36
#define MMSYSERR_NOMEM
Definition: mmsystem.h:103
MMRESULT OpenKernelSoundDeviceByName(IN PWSTR DevicePath, IN BOOLEAN ReadOnly, OUT PHANDLE Handle)
Definition: kernel.c:23
#define FALSE
Definition: types.h:117
#define IsValidSoundDeviceType
Definition: mmebuddy.h:69
#define AllocateWideString(string_length)
Definition: mmebuddy.h:33
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define MMSYSERR_NOERROR
Definition: mmsystem.h:96
static const UCHAR Index[8]
Definition: usbohci.c:18
static const WCHAR L[]
Definition: oid.c:1250
ULONG_PTR SIZE_T
Definition: typedefs.h:80
unsigned int ULONG
Definition: retypes.h:1
#define wsprintf
Definition: winuser.h:5840
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define SND_TRACE(...)

◆ EnumerateNt4ServiceSoundDevices()

MMRESULT EnumerateNt4ServiceSoundDevices ( IN LPWSTR  ServiceName,
IN MMDEVICE_TYPE  DeviceType,
IN SOUND_DEVICE_DETECTED_PROC  SoundDeviceDetectedProc 
)

Definition at line 26 of file detect.c.

30 {
31  HKEY Key;
32  DWORD KeyIndex = 0;
33 
35 
36  /* Device type zero means "all" */
38  DeviceType == 0 );
39 
40  while ( OpenSoundDeviceRegKey(ServiceName, KeyIndex, &Key) == MMSYSERR_NOERROR )
41  {
42  HKEY DevicesKey;
43  DWORD ValueType = REG_NONE, ValueIndex = 0;
44  DWORD MaxNameLength = 0, ValueNameLength = 0;
45  PWSTR DevicePath = NULL, ValueName = NULL;
46  DWORD ValueDataLength = sizeof(DWORD);
48 
49  if ( RegOpenKeyEx(Key,
51  0,
52  KEY_READ,
53  &DevicesKey) == ERROR_SUCCESS )
54  {
55  /* Find out how much memory is needed for the key name */
56  if ( RegQueryInfoKey(DevicesKey,
57  NULL, NULL, NULL, NULL, NULL, NULL, NULL,
58  &MaxNameLength,
59  NULL, NULL, NULL) != ERROR_SUCCESS )
60  {
61  SND_ERR(L"Failed to query registry key information\n");
62  RegCloseKey(DevicesKey);
64 
65  return MMSYSERR_ERROR;
66  }
67 
68  DevicePath = AllocateWideString(MaxNameLength +
69  strlen("\\\\.\\"));
70 
71  /* Check that the memory allocation was successful */
72  if ( ! DevicePath )
73  {
74  /* There's no point in going further */
75  RegCloseKey(DevicesKey);
77 
78  return MMSYSERR_NOMEM;
79  }
80 
81  /* Insert the device path prefix */
82  wsprintf(DevicePath, L"\\\\.\\");
83 
84  /* The offset of the string following this prefix */
85  ValueName = DevicePath + strlen("\\\\.\\");
86 
87  /* Copy this so that it may be overwritten - include NULL */
88  ValueNameLength = MaxNameLength + sizeof(WCHAR);
89 
90  SND_TRACE(L"Interested in devices beginning with %wS\n", DevicePath);
91 
92  while ( RegEnumValue(DevicesKey,
93  ValueIndex,
94  ValueName,
95  &ValueNameLength,
96  NULL,
97  &ValueType,
98  (LPBYTE) &ValueData,
99  &ValueDataLength) == ERROR_SUCCESS )
100  {
101  /* Device types are stored as DWORDs */
102  if ( ( ValueType == REG_DWORD ) &&
103  ( ValueDataLength == sizeof(DWORD) ) )
104  {
105  if ( ( DeviceType == 0 ) ||
106  ( DeviceType == ValueData ) )
107  {
108  SND_TRACE(L"Found device: %wS\n", DevicePath);
109  SoundDeviceDetectedProc(ValueData, DevicePath);
110  }
111  }
112 
113  /* Reset variables for the next iteration */
114  ValueNameLength = MaxNameLength + sizeof(WCHAR);
115  ZeroMemory(ValueName, (MaxNameLength+1)*sizeof(WCHAR));
116  /*ZeroWideString(ValueName);*/
117  ValueDataLength = sizeof(DWORD);
118  ValueData = 0;
120 
121  ++ ValueIndex;
122  }
123 
124  FreeMemory(DevicePath);
125 
126  RegCloseKey(DevicesKey);
127  }
128  else
129  {
130  SND_WARN(L"Unable to open the Devices key!\n");
131  }
132 
133  ++ KeyIndex;
134 
135  RegCloseKey(Key);
136  }
137 
138  return MMSYSERR_NOERROR;
139 }
static VOID FreeMemory(PCREATE_DATA Data)
Definition: create.c:134
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ULONG Key
Definition: fatprocs.h:2706
#define RegQueryInfoKey
Definition: winreg.h:521
#define ERROR_SUCCESS
Definition: deptool.c:10
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define KEY_READ
Definition: nt_native.h:1023
uint16_t * PWSTR
Definition: typedefs.h:56
DeviceType
Definition: mmdrv.h:41
_In_ PCWSTR _In_z_ PCWSTR _In_ ULONG ValueType
Definition: rtlfuncs.h:4154
#define ZeroMemory
Definition: winbase.h:1648
#define DWORD
Definition: nt_native.h:44
#define VALIDATE_MMSYS_PARAMETER(parameter_condition)
Definition: mmebuddy.h:71
_In_ PUNICODE_STRING ValueName
Definition: cmfuncs.h:264
#define MMSYSERR_NOMEM
Definition: mmsystem.h:103
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:53
#define IsValidSoundDeviceType
Definition: mmebuddy.h:69
#define AllocateWideString(string_length)
Definition: mmebuddy.h:33
smooth NULL
Definition: ftsmooth.c:416
MMRESULT OpenSoundDeviceRegKey(IN LPWSTR ServiceName, IN DWORD DeviceIndex, OUT PHKEY KeyHandle)
Definition: registry.c:73
#define MMSYSERR_NOERROR
Definition: mmsystem.h:96
LPTSTR ServiceName
Definition: ServiceMain.c:15
#define MMSYSERR_ERROR
Definition: mmsystem.h:97
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define SND_ERR(...)
_In_ GUID _In_ PVOID ValueData
Definition: hubbusif.h:311
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
#define SND_WARN(...)
#define REG_DEVICES_KEY_NAME_U
Definition: sndnames.h:78
#define RegOpenKeyEx
Definition: winreg.h:520
#define REG_NONE
Definition: nt_native.h:1492
#define wsprintf
Definition: winuser.h:5840
#define REG_DWORD
Definition: sdbapi.c:596
#define RegEnumValue
Definition: winreg.h:511
#define SND_TRACE(...)

Referenced by DriverProc().