1 /*
2 * PROJECT: ReactOS Sound System "MME Buddy" NT4 Library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: lib/drivers/sound/mment4/registry.c
5 *
6 * PURPOSE: Registry operation helper for audio device drivers.
7 *
8 * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
9 */
10
11 #include "precomp.h"
12
13 #include <mmebuddy_debug.h>
14
15 /*
16 Open the parameters key of a sound driver.
17 NT4 only.
18 */
19 MMRESULT
OpenSoundDriverParametersRegKey(IN LPWSTR ServiceName,OUT PHKEY KeyHandle)20 OpenSoundDriverParametersRegKey(
21 IN LPWSTR ServiceName,
22 OUT PHKEY KeyHandle)
23 {
24 SIZE_T KeyLength;
25 PWCHAR ParametersKeyName;
26
27 VALIDATE_MMSYS_PARAMETER( ServiceName );
28 VALIDATE_MMSYS_PARAMETER( KeyHandle );
29
30 /* Work out how long the string will be */
31 KeyLength = wcslen(REG_SERVICES_KEY_NAME_U) + 1
32 + wcslen(ServiceName) + 1
33 + wcslen(REG_PARAMETERS_KEY_NAME_U);
34
35 /* Allocate memory for the string */
36 ParametersKeyName = AllocateWideString(KeyLength);
37
38 if ( ! ParametersKeyName )
39 return MMSYSERR_NOMEM;
40
41 /* Construct the registry path */
42 wsprintf(ParametersKeyName,
43 L"%s\\%s\\%s",
44 REG_SERVICES_KEY_NAME_U,
45 ServiceName,
46 REG_PARAMETERS_KEY_NAME_U);
47
48 SND_TRACE(L"Opening reg key: %wS\n", ParametersKeyName);
49
50 /* Perform the open */
51 if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE,
52 ParametersKeyName,
53 0,
54 KEY_READ,
55 KeyHandle) != ERROR_SUCCESS )
56 {
57 /* Couldn't open the key */
58 SND_ERR(L"Failed to open reg key: %wS\n", ParametersKeyName);
59 FreeMemory(ParametersKeyName);
60 return MMSYSERR_ERROR;
61 }
62
63 FreeMemory(ParametersKeyName);
64
65 return MMSYSERR_NOERROR;
66 }
67
68 /*
69 Open one of the Device sub-keys belonging to the sound driver.
70 NT4 only.
71 */
72 MMRESULT
OpenSoundDeviceRegKey(IN LPWSTR ServiceName,IN DWORD DeviceIndex,OUT PHKEY KeyHandle)73 OpenSoundDeviceRegKey(
74 IN LPWSTR ServiceName,
75 IN DWORD DeviceIndex,
76 OUT PHKEY KeyHandle)
77 {
78 SIZE_T PathLength;
79 PWCHAR RegPath;
80
81 VALIDATE_MMSYS_PARAMETER( ServiceName );
82 VALIDATE_MMSYS_PARAMETER( KeyHandle );
83
84 /*
85 Work out the space required to hold the path:
86
87 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
88 sndblst\
89 Parameters\
90 Device123\
91 */
92 PathLength = wcslen(REG_SERVICES_KEY_NAME_U) + 1
93 + wcslen(ServiceName) + 1
94 + wcslen(REG_PARAMETERS_KEY_NAME_U) + 1
95 + wcslen(REG_DEVICE_KEY_NAME_U)
96 + GetDigitCount(DeviceIndex);
97
98 /* Allocate storage for the string */
99 RegPath = AllocateWideString(PathLength);
100
101 if ( ! RegPath )
102 {
103 return MMSYSERR_NOMEM;
104 }
105
106 /* Write the path */
107 wsprintf(RegPath,
108 L"%ls\\%ls\\%ls\\%ls%d",
109 REG_SERVICES_KEY_NAME_U,
110 ServiceName,
111 REG_PARAMETERS_KEY_NAME_U,
112 REG_DEVICE_KEY_NAME_U,
113 DeviceIndex);
114
115 SND_TRACE(L"Opening reg key: %wS\n", RegPath);
116
117 /* Perform the open */
118 if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE,
119 RegPath,
120 0,
121 KEY_READ,
122 KeyHandle) != ERROR_SUCCESS )
123 {
124 /* Couldn't open the key */
125 SND_ERR(L"Failed to open reg key: %wS\n", RegPath);
126 FreeMemory(RegPath);
127 return MMSYSERR_ERROR;
128 }
129
130 FreeMemory(RegPath);
131
132 return MMSYSERR_NOERROR;
133 }
134