ReactOS  0.4.13-dev-455-g28ed234
misc.c
Go to the documentation of this file.
1 /*
2  * ReactOS Sound Volume Control
3  * Copyright (C) 2004-2005 Thomas Weidenmueller
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 /*
20  * COPYRIGHT: See COPYING in the top level directory
21  * PROJECT: ReactOS Sound Volume Control
22  * FILE: base/applications/sndvol32/misc.c
23  * PROGRAMMERS: Thomas Weidenmueller <w3seek@reactos.com>
24  */
25 
26 #include "sndvol32.h"
27 
28 #include <winreg.h>
29 
30 static INT
32  IN UINT uID)
33 {
34  HRSRC hrSrc;
35  HGLOBAL hRes;
36  LPWSTR lpName, lpStr;
37 
38  if (hInst == NULL)
39  {
40  return -1;
41  }
42 
43  /* There are always blocks of 16 strings */
44  lpName = (LPWSTR)MAKEINTRESOURCE((uID >> 4) + 1);
45 
46  /* Find the string table block */
47  if ((hrSrc = FindResourceW(hInst,
48  lpName,
49  (LPWSTR)RT_STRING)) &&
50  (hRes = LoadResource(hInst,
51  hrSrc)) &&
52  (lpStr = LockResource(hRes)))
53  {
54  UINT x;
55 
56  /* Find the string we're looking for */
57  uID &= 0xF; /* position in the block, same as % 16 */
58  for (x = 0; x < uID; x++)
59  {
60  lpStr += (*lpStr) + 1;
61  }
62 
63  /* Found the string */
64  return (int)(*lpStr);
65  }
66  return -1;
67 }
68 
69 INT
72  IN UINT uID)
73 {
74  INT ln;
75 
77  uID);
78  if (ln++ > 0)
79  {
80  (*lpTarget) = (LPWSTR)LocalAlloc(LMEM_FIXED,
81  ln * sizeof(WCHAR));
82  if ((*lpTarget) != NULL)
83  {
84  INT Ret = LoadStringW(hInst,
85  uID,
86  *lpTarget,
87  ln);
88  if (!Ret)
89  {
90  LocalFree((HLOCAL)(*lpTarget));
91  }
92  return Ret;
93  }
94  }
95  return 0;
96 }
97 
98 DWORD
100  IN UINT uID,
101  OUT LPWSTR *lpTarget,
102  ...)
103 {
104  DWORD Ret = 0;
106  va_list lArgs;
107 
109  hInstance,
110  uID) > 0)
111  {
112  va_start(lArgs, lpTarget);
113  /* let's use FormatMessage to format it because it has the ability to
114  allocate memory automatically */
116  lpFormat,
117  0,
118  0,
119  (LPWSTR)lpTarget,
120  0,
121  &lArgs);
122  va_end(lArgs);
123 
125  }
126 
127  return Ret;
128 }
129 
130 static const TCHAR AppRegSettings[] = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Volume Control");
131 static const TCHAR AppOptionsKey[] = TEXT("Options");
132 static const TCHAR LineStatesValue[] = TEXT("LineStates");
133 static const TCHAR StyleValue[] = TEXT("Style");
134 
136 
137 BOOL
139 {
142  0,
143  NULL,
146  NULL,
148  NULL) == ERROR_SUCCESS;
149 }
150 
151 VOID
153 {
154  if (hAppSettingsKey != NULL)
155  {
158  }
159 }
160 
161 BOOL
163  IN LPTSTR szLineName,
164  IN PSNDVOL_REG_LINESTATE LineState,
165  IN DWORD cbSize)
166 {
167  HKEY hLineKey;
168  TCHAR szDevRegKey[MAX_PATH];
169  BOOL Ret = FALSE;
170 
171  _stprintf(szDevRegKey,
172  TEXT("%s\\%s"),
173  szDeviceName,
174  szLineName);
175 
177  szDevRegKey,
178  0,
179  NULL,
182  NULL,
183  &hLineKey,
184  NULL) == ERROR_SUCCESS)
185  {
186  /* now update line states */
187  RegSetValueEx(hLineKey, LineStatesValue, 0, REG_BINARY, (const BYTE*)LineState, cbSize);
188  Ret = TRUE;
189 
190  RegCloseKey(hLineKey);
191  }
192 
193  return Ret;
194 }
195 
196 BOOL
198  IN LPTSTR szLineName,
199  IN LPTSTR szControlName,
200  OUT DWORD *Flags)
201 {
202  HKEY hLineKey;
203  DWORD Type;
204  DWORD i, Size = 0;
205  PSNDVOL_REG_LINESTATE LineStates = NULL;
206  TCHAR szDevRegKey[MAX_PATH];
207  BOOL Ret = FALSE;
208 
209  _stprintf(szDevRegKey,
210  TEXT("%s\\%s"),
211  szDeviceName,
212  szLineName);
213 
215  szDevRegKey,
216  0,
217  NULL,
220  NULL,
221  &hLineKey,
222  NULL) == ERROR_SUCCESS)
223  {
224  if (RegQueryValueEx(hLineKey,
226  NULL,
227  &Type,
228  NULL,
229  &Size) != ERROR_SUCCESS ||
230  Type != REG_BINARY ||
231  Size == 0 || (Size % sizeof(SNDVOL_REG_LINESTATE) != 0))
232  {
233  goto ExitClose;
234  }
235 
236  LineStates = HeapAlloc(GetProcessHeap(),
238  Size);
239 
240  if (LineStates != NULL)
241  {
242  if (RegQueryValueEx(hLineKey,
244  NULL,
245  &Type,
246  (LPBYTE)LineStates,
247  &Size) != ERROR_SUCCESS ||
248  Type != REG_BINARY ||
249  Size == 0 || (Size % sizeof(SNDVOL_REG_LINESTATE) != 0))
250  {
251  goto ExitClose;
252  }
253 
254  /* try to find the control */
255  for (i = 0; i < Size / sizeof(SNDVOL_REG_LINESTATE); i++)
256  {
257  if (!_tcscmp(szControlName,
258  LineStates[i].LineName))
259  {
260  *Flags = LineStates[i].Flags;
261  Ret = TRUE;
262  break;
263  }
264  }
265  }
266 
267 ExitClose:
269  0,
270  LineStates);
271  RegCloseKey(hLineKey);
272  }
273 
274  return Ret;
275 }
276 
277 DWORD
279 {
280  HKEY hOptionsKey;
281  DWORD dwStyle = 0, dwSize;
282 
285  0,
286  KEY_READ,
287  &hOptionsKey) == ERROR_SUCCESS)
288  {
289  dwSize = sizeof(DWORD);
290  RegQueryValueEx(hOptionsKey,
291  StyleValue,
292  NULL,
293  NULL,
294  (LPBYTE)&dwStyle,
295  &dwSize);
296 
297  RegCloseKey(hOptionsKey);
298  }
299 
300  return dwStyle;
301 }
#define RegQueryValueEx
Definition: winreg.h:524
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define IN
Definition: typedefs.h:38
BOOL ReadLineConfig(IN LPTSTR szDeviceName, IN LPTSTR szLineName, IN LPTSTR szControlName, OUT DWORD *Flags)
Definition: misc.c:197
HKEY hAppSettingsKey
Definition: misc.c:135
#define TRUE
Definition: types.h:120
Type
Definition: Type.h:6
#define ERROR_SUCCESS
Definition: deptool.c:10
VOID CloseAppConfig(VOID)
Definition: misc.c:152
#define REG_BINARY
Definition: nt_native.h:1496
#define KEY_READ
Definition: nt_native.h:1023
int _tcscmp(const _TCHAR *s1, const _TCHAR *s2)
Definition: tcscmp.h:8
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:402
_In_ LPCSTR lpName
Definition: winbase.h:2729
static const TCHAR StyleValue[]
Definition: misc.c:133
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
static const TCHAR AppRegSettings[]
Definition: misc.c:130
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int32_t INT
Definition: typedefs.h:56
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
CHAR * LPTSTR
Definition: xmlstorage.h:192
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HINSTANCE hInstance
Definition: charmap.c:20
struct _SNDVOL_REG_LINESTATE SNDVOL_REG_LINESTATE
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
#define va_end(ap)
Definition: acmsvcex.h:90
unsigned int BOOL
Definition: ntddk_ex.h:94
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:400
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
static const TCHAR LineStatesValue[]
Definition: misc.c:132
smooth NULL
Definition: ftsmooth.c:416
char * va_list
Definition: acmsvcex.h:78
DWORD LoadAndFormatString(IN HINSTANCE hInstance, IN UINT uID, OUT LPTSTR *lpTarget,...)
Definition: misc.c:86
#define LMEM_FIXED
Definition: winbase.h:349
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define KEY_WRITE
Definition: nt_native.h:1031
BOOL WriteLineConfig(IN LPTSTR szDeviceName, IN LPTSTR szLineName, IN PSNDVOL_REG_LINESTATE LineState, IN DWORD cbSize)
Definition: misc.c:162
static const TCHAR AppOptionsKey[]
Definition: misc.c:131
char TCHAR
Definition: xmlstorage.h:189
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned char BYTE
Definition: mem.h:68
#define RT_STRING
Definition: pedump.c:368
LPCWSTR lpFormat
Definition: trayclock.cpp:32
static const WCHAR szDeviceName[]
Definition: provider.c:53
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
static DWORD
Definition: misc.c:47
#define _stprintf
Definition: utility.h:124
#define RegOpenKeyEx
Definition: winreg.h:520
HINSTANCE hInst
Definition: dxdiag.c:13
#define TEXT(s)
Definition: k32.h:26
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1577
INT AllocAndLoadString(OUT LPWSTR *lpTarget, IN HINSTANCE hInst, IN UINT uID)
Definition: misc.c:50
BOOL InitAppConfig(VOID)
Definition: misc.c:138
#define va_start(ap, A)
Definition: acmsvcex.h:91
unsigned int UINT
Definition: ndis.h:50
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
#define OUT
Definition: typedefs.h:39
static LPWSTR
Definition: misc.c:35
UINT uID
Definition: console.c:30
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1373
DWORD GetStyleValue(VOID)
Definition: misc.c:278
WCHAR * LPWSTR
Definition: xmlstorage.h:184
INT LengthOfStrResource(IN HINSTANCE hInst, IN UINT uID)
Definition: misc.c:23
#define HeapFree(x, y, z)
Definition: compat.h:394
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
#define RegSetValueEx
Definition: winreg.h:533
#define RegCreateKeyEx
Definition: winreg.h:501