ReactOS  0.4.13-dev-551-gf37fb1f
parallel.c
Go to the documentation of this file.
1 /*
2  * PROJECT: Ports installer library
3  * LICENSE: GPL - See COPYING in the top level directory
4  * FILE: dll\win32\msports\parallel.c
5  * PURPOSE: Parallel Port property functions
6  * COPYRIGHT: Copyright 2013 Eric Kohl
7  */
8 
9 #include "precomp.h"
10 
11 
12 typedef struct _PORT_DATA
13 {
16 
21 
23 
24 
25 static
26 VOID
28  PDWORD pPortMap)
29 {
30  WCHAR szDeviceName[64];
31  WCHAR szDosDeviceName[64];
32  DWORD dwIndex, dwType, dwPortNumber;
33  DWORD dwDeviceNameSize, dwDosDeviceNameSize;
34  PWSTR ptr;
35  HKEY hKey;
36  DWORD dwError;
37 
38  *pPortMap = 0;
39 
41  L"Hardware\\DeviceMap\\PARALLEL PORTS",
42  0,
43  KEY_READ,
44  &hKey);
45  if (dwError == ERROR_SUCCESS)
46  {
47  for (dwIndex = 0; ; dwIndex++)
48  {
49  dwDeviceNameSize = ARRAYSIZE(szDeviceName);
50  dwDosDeviceNameSize = sizeof(szDosDeviceName);
51  dwError = RegEnumValueW(hKey,
52  dwIndex,
54  &dwDeviceNameSize,
55  NULL,
56  &dwType,
57  (LPBYTE)szDosDeviceName,
58  &dwDosDeviceNameSize);
59  if (dwError != ERROR_SUCCESS)
60  break;
61 
62  if (dwType == REG_SZ)
63  {
64  TRACE("%S --> %S\n", szDeviceName, szDosDeviceName);
65  if (_wcsnicmp(szDosDeviceName, L"\\DosDevices\\LPT", wcslen(L"\\DosDevices\\LPT")) == 0)
66  {
67  ptr = szDosDeviceName + wcslen(L"\\DosDevices\\LPT");
68  if (wcschr(ptr, L'.') == NULL)
69  {
70  TRACE("Device number %S\n", ptr);
71  dwPortNumber = wcstoul(ptr, NULL, 10);
72  if (dwPortNumber != 0)
73  {
74  *pPortMap |=(1 << dwPortNumber);
75  }
76  }
77  }
78  }
79  }
80 
81  RegCloseKey(hKey);
82  }
83 
84  TRACE("Done\n");
85 }
86 
87 
88 static
89 VOID
91  PPORT_DATA pPortData)
92 {
93  DWORD dwSize;
94  HKEY hKey;
95  DWORD dwError;
96 
97  TRACE("ReadPortSettings(%p)\n", pPortData);
98 
99  pPortData->dwFilterResourceMethod = 1; /* Never use an interrupt */
100  pPortData->dwLegacy = 0; /* Disabled */
101  pPortData->dwPortNumber = 0; /* Unknown */
102 
103  hKey = SetupDiOpenDevRegKey(pPortData->DeviceInfoSet,
104  pPortData->DeviceInfoData,
106  0,
107  DIREG_DEV,
108  KEY_READ);
109  if (hKey != INVALID_HANDLE_VALUE)
110  {
111  dwSize = sizeof(pPortData->szPortName);
112  dwError = RegQueryValueExW(hKey,
113  L"PortName",
114  NULL,
115  NULL,
116  (PBYTE)pPortData->szPortName,
117  &dwSize);
118  if (dwError != ERROR_SUCCESS)
119  {
120  ERR("RegQueryValueExW failed (Error %lu)\n", dwError);
121  }
122 
123  dwSize = sizeof(pPortData->dwFilterResourceMethod);
124  dwError = RegQueryValueExW(hKey,
125  L"FilterResourceMethod",
126  NULL,
127  NULL,
128  (PBYTE)&pPortData->dwFilterResourceMethod,
129  &dwSize);
130  if (dwError != ERROR_SUCCESS)
131  {
132  ERR("RegQueryValueExW failed (Error %lu)\n", dwError);
133  }
134 
135  RegCloseKey(hKey);
136  }
137 
139  L"SYSTEM\\CurrentControlSet\\Services\\Parport\\Parameters",
140  0,
141  KEY_READ,
142  &hKey);
143  if (dwError == ERROR_SUCCESS)
144  {
145  dwSize = sizeof(pPortData->dwLegacy);
146  dwError = RegQueryValueExW(hKey,
147  L"ParEnableLegacyZip",
148  NULL,
149  NULL,
150  (PBYTE)&pPortData->dwLegacy,
151  &dwSize);
152  if (dwError != ERROR_SUCCESS)
153  {
154  ERR("RegQueryValueExW failed (Error %lu)\n", dwError);
155  }
156 
157  RegCloseKey(hKey);
158  }
159 }
160 
161 
162 static
163 DWORD
165  _In_ PPORT_DATA pPortData,
166  _In_ DWORD dwNewPortNumber)
167 {
168  WCHAR szDeviceDescription[256];
169  WCHAR szFriendlyName[256];
170  WCHAR szNewPortName[16];
171  HKEY hDeviceKey = INVALID_HANDLE_VALUE;
172  DWORD dwError;
173 
174  /* We are done if old and new port number are the same */
175  if (pPortData->dwPortNumber == dwNewPortNumber)
176  return ERROR_SUCCESS;
177 
178  /* Build the new port name */
179  swprintf(szNewPortName, L"LPT%lu", dwNewPortNumber);
180 
181  /* Open the devices hardware key */
182  hDeviceKey = SetupDiOpenDevRegKey(pPortData->DeviceInfoSet,
183  pPortData->DeviceInfoData,
185  0,
186  DIREG_DEV,
187  KEY_READ | KEY_WRITE);
188  if (hDeviceKey == INVALID_HANDLE_VALUE)
189  {
190  return GetLastError();
191  }
192 
193  /* Set the new 'PortName' value */
194  dwError = RegSetValueExW(hDeviceKey,
195  L"PortName",
196  0,
197  REG_SZ,
198  (LPBYTE)szNewPortName,
199  (wcslen(szNewPortName) + 1) * sizeof(WCHAR));
200  if (dwError != ERROR_SUCCESS)
201  goto done;
202 
203  /* Save the new port name and number */
204  wcscpy(pPortData->szPortName, szNewPortName);
205  pPortData->dwPortNumber = dwNewPortNumber;
206 
207  /* Get the device description... */
208  if (SetupDiGetDeviceRegistryProperty(pPortData->DeviceInfoSet,
209  pPortData->DeviceInfoData,
211  NULL,
212  (PBYTE)szDeviceDescription,
213  sizeof(szDeviceDescription),
214  NULL))
215  {
216  /* ... and use it to build a new friendly name */
217  swprintf(szFriendlyName,
218  L"%s (%s)",
219  szDeviceDescription,
220  szNewPortName);
221  }
222  else
223  {
224  /* ... or build a generic friendly name */
225  swprintf(szFriendlyName,
226  L"Parallel Port (%s)",
227  szNewPortName);
228  }
229 
230  /* Set the friendly name for the device */
231  SetupDiSetDeviceRegistryProperty(pPortData->DeviceInfoSet,
232  pPortData->DeviceInfoData,
234  (PBYTE)szFriendlyName,
235  (wcslen(szFriendlyName) + 1) * sizeof(WCHAR));
236 
237 done:
238  if (hDeviceKey != INVALID_HANDLE_VALUE)
239  RegCloseKey(hDeviceKey);
240 
241  return dwError;
242 }
243 
244 
245 static
246 VOID
248  HWND hwnd,
249  PPORT_DATA pPortData)
250 {
251  DWORD dwDisposition;
252  DWORD dwFilterResourceMethod;
253  DWORD dwLegacy;
254  DWORD dwPortNumber;
255  DWORD dwPortMap;
256  HKEY hKey;
257  DWORD dwError;
258 
259  TRACE("WritePortSettings(%p)\n", pPortData);
260 
261  dwFilterResourceMethod = 1;
263  dwFilterResourceMethod = 0;
265  dwFilterResourceMethod = 1;
267  dwFilterResourceMethod = 2;
268 
269  if (dwFilterResourceMethod != pPortData->dwFilterResourceMethod)
270  {
271  hKey = SetupDiOpenDevRegKey(pPortData->DeviceInfoSet,
272  pPortData->DeviceInfoData,
274  0,
275  DIREG_DEV,
276  KEY_WRITE);
277  if (hKey != INVALID_HANDLE_VALUE)
278  {
279  dwError = RegSetValueExW(hKey,
280  L"FilterResourceMethod",
281  0,
282  REG_DWORD,
283  (PBYTE)&dwFilterResourceMethod,
284  sizeof(dwFilterResourceMethod));
285  if (dwError != ERROR_SUCCESS)
286  {
287  ERR("RegSetValueExW failed (Error %lu)\n", dwError);
288  }
289 
290  RegCloseKey(hKey);
291  pPortData->dwFilterResourceMethod = dwFilterResourceMethod;
292  }
293  }
294 
295  dwLegacy = 0;
297  dwLegacy = 1;
298 
299  if (dwLegacy != pPortData->dwLegacy)
300  {
302  L"SYSTEM\\CurrentControlSet\\Services\\Parport\\Parameters",
303  0,
304  NULL,
306  KEY_WRITE,
307  NULL,
308  &hKey,
309  &dwDisposition);
310  if (dwError == ERROR_SUCCESS)
311  {
312  dwError = RegSetValueExW(hKey,
313  L"ParEnableLegacyZip",
314  0,
315  REG_DWORD,
316  (LPBYTE)&dwLegacy,
317  sizeof(dwLegacy));
318  RegCloseKey(hKey);
319 
320  if (dwError == ERROR_SUCCESS)
321  {
322  FIXME("Notify the driver!\n");
323 
324  pPortData->dwLegacy = dwLegacy;
325  }
326  }
327  }
328 
330  if (dwPortNumber != LB_ERR)
331  {
332  dwPortNumber++;
333  if (dwPortNumber != pPortData->dwPortNumber)
334  {
335  GetUsedPorts(&dwPortMap);
336 
337  if (dwPortMap & 1 << dwPortNumber)
338  {
339  ERR("Port LPT%lu is already in use!\n", dwPortNumber);
340  return;
341  }
342 
343  ChangePortNumber(pPortData,
344  dwPortNumber);
345  }
346  }
347 }
348 
349 
350 static
351 BOOL
353  WPARAM wParam,
354  LPARAM lParam)
355 {
356  WCHAR szBuffer[256];
357  WCHAR szPortInUse[64];
358  PPORT_DATA pPortData;
359  HWND hwndControl;
360  DWORD dwPortMap;
361  UINT i;
362 
363  TRACE("OnInitDialog()\n");
364 
365  pPortData = (PPORT_DATA)((LPPROPSHEETPAGEW)lParam)->lParam;
366  if (pPortData == NULL)
367  {
368  ERR("pPortData is NULL\n");
369  return FALSE;
370  }
371 
372  SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR)pPortData);
373 
374  /* Read and parse the port settings */
375  ReadPortSettings(pPortData);
376 
377  /* Set the 'Filter Resource Method' radiobuttons */
378  hwndControl = GetDlgItem(hwnd,
379  IDC_TRY_INTERRUPT + pPortData->dwFilterResourceMethod);
380  if (hwndControl)
381  Button_SetCheck(hwndControl, BST_CHECKED);
382 
383  /* Disable the 'Enable legacy PNP detection' checkbox */
384  hwndControl = GetDlgItem(hwnd, IDC_PARALLEL_LEGACY);
385  if (hwndControl)
386  {
388  pPortData->dwLegacy ? BST_CHECKED : BST_UNCHECKED);
389  }
390 
391  LoadStringW(hInstance, IDS_PORT_IN_USE, szPortInUse, ARRAYSIZE(szPortInUse));
392 
393  /* Fill the 'LPT Port Number' combobox */
394  hwndControl = GetDlgItem(hwnd, IDC_PARALLEL_NAME);
395  if (hwndControl)
396  {
397  GetUsedPorts(&dwPortMap);
398 
399  for (i = 1; i < 4; i++)
400  {
401  swprintf(szBuffer, L"LPT%lu", i);
402 
403  if ((dwPortMap & (1 << i)) && (pPortData->dwPortNumber != i))
404  wcscat(szBuffer, szPortInUse);
405 
406  ComboBox_AddString(hwndControl, szBuffer);
407 
408  if (_wcsicmp(pPortData->szPortName, szBuffer) == 0)
409  pPortData->dwPortNumber = i;
410  }
411 
412  if (pPortData->dwPortNumber != 0)
413  {
414  ComboBox_SetCurSel(hwndControl, pPortData->dwPortNumber - 1);
415  }
416  }
417 
418  return TRUE;
419 }
420 
421 
422 static
423 VOID
425  HWND hwnd,
426  WPARAM wParam,
427  LPARAM lParam)
428 {
429  PPORT_DATA pPortData;
430 
431  TRACE("OnNotify()\n");
432 
433  pPortData = (PPORT_DATA)GetWindowLongPtr(hwnd, DWLP_USER);
434  if (pPortData == NULL)
435  {
436  ERR("pPortData is NULL\n");
437  return;
438  }
439 
440  if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
441  {
442  TRACE("PSN_APPLY!\n");
443  WritePortSettings(hwnd, pPortData);
444  }
445 }
446 
447 
448 static
449 VOID
451  HWND hwnd)
452 {
453  PPORT_DATA pPortData;
454 
455  TRACE("OnDestroy()\n");
456 
457  pPortData = (PPORT_DATA)GetWindowLongPtr(hwnd, DWLP_USER);
458  if (pPortData == NULL)
459  {
460  ERR("pPortData is NULL\n");
461  return;
462  }
463 
464  HeapFree(GetProcessHeap(), 0, pPortData);
466 }
467 
468 
469 static
470 INT_PTR
471 CALLBACK
473  UINT uMsg,
474  WPARAM wParam,
475  LPARAM lParam)
476 {
477  TRACE("ParallelSettingsDlgProc()\n");
478 
479  switch (uMsg)
480  {
481  case WM_INITDIALOG:
482  return OnInitDialog(hwnd, wParam, lParam);
483 
484  case WM_NOTIFY:
486  break;
487 
488  case WM_DESTROY:
489  OnDestroy(hwnd);
490  break;
491  }
492 
493  return FALSE;
494 }
495 
496 
497 BOOL
498 WINAPI
500  LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc,
501  LPARAM lParam)
502 {
504  HPROPSHEETPAGE hPropSheetPage;
505  PPORT_DATA pPortData;
506 
507  TRACE("ParallelPortPropPageProvider(%p %p %lx)\n",
508  lpPropSheetPageRequest, lpfnAddPropSheetPageProc, lParam);
509 
510  pPortData = HeapAlloc(GetProcessHeap(),
512  sizeof(PORT_DATA));
513  if (pPortData == NULL)
514  {
515  ERR("Port data allocation failed!\n");
516  return FALSE;
517  }
518 
519  pPortData->DeviceInfoSet = lpPropSheetPageRequest->DeviceInfoSet;
520  pPortData->DeviceInfoData = lpPropSheetPageRequest->DeviceInfoData;
521 
522  if (lpPropSheetPageRequest->PageRequested == SPPSR_ENUM_ADV_DEVICE_PROPERTIES)
523  {
524  TRACE("SPPSR_ENUM_ADV_DEVICE_PROPERTIES\n");
525 
526  PropSheetPage.dwSize = sizeof(PROPSHEETPAGEW);
527  PropSheetPage.dwFlags = 0;
528  PropSheetPage.hInstance = hInstance;
531  PropSheetPage.lParam = (LPARAM)pPortData;
532  PropSheetPage.pfnCallback = NULL;
533 
534  hPropSheetPage = CreatePropertySheetPageW(&PropSheetPage);
535  if (hPropSheetPage == NULL)
536  {
537  ERR("CreatePropertySheetPageW() failed!\n");
538  return FALSE;
539  }
540 
541  if (!(*lpfnAddPropSheetPageProc)(hPropSheetPage, lParam))
542  {
543  ERR("lpfnAddPropSheetPageProc() failed!\n");
544  DestroyPropertySheetPage(hPropSheetPage);
545  return FALSE;
546  }
547  }
548 
549  TRACE("Done!\n");
550 
551  return TRUE;
552 }
553 
554 /* EOF */
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define TRUE
Definition: types.h:120
#define ComboBox_AddString(hwndCtl, lpsz)
Definition: windowsx.h:16
#define ERROR_SUCCESS
Definition: deptool.c:10
static BOOL OnInitDialog(HWND hwnd, WPARAM wParam, LPARAM lParam)
Definition: parallel.c:352
#define KEY_READ
Definition: nt_native.h:1023
static VOID OnDestroy(HWND hwnd)
Definition: parallel.c:450
BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
Definition: propsheet.c:3135
uint16_t * PWSTR
Definition: typedefs.h:54
#define IDS_PORT_IN_USE
Definition: resource.h:23
#define CALLBACK
Definition: compat.h:27
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
WCHAR szPortName[16]
Definition: parallel.c:17
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ComboBox_GetCurSel(hwndCtl)
Definition: windowsx.h:24
BOOL(CALLBACK * LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM)
Definition: prsht.h:309
#define SetupDiGetDeviceRegistryProperty
Definition: setupapi.h:2598
UINT_PTR WPARAM
Definition: windef.h:207
#define PSN_APPLY
Definition: prsht.h:117
_Check_return_ unsigned long __cdecl wcstoul(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
int32_t INT_PTR
Definition: typedefs.h:62
struct _PORT_DATA * PPORT_DATA
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define SetWindowLongPtr
Definition: treelist.c:70
WPARAM wParam
Definition: combotst.c:138
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1091
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
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
PSP_DEVINFO_DATA DeviceInfoData
Definition: setupapi.h:1099
#define LB_ERR
Definition: winuser.h:2386
unsigned int BOOL
Definition: ntddk_ex.h:94
struct _PORT_DATA PORT_DATA
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
#define FIXME(fmt,...)
Definition: debug.h:110
static PVOID ptr
Definition: dispmode.c:27
#define IDC_PARALLEL_NAME
Definition: resource.h:17
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2853
struct _PROPSHEETPAGEW PROPSHEETPAGEW
smooth NULL
Definition: ftsmooth.c:416
DWORD dwPortNumber
Definition: parallel.c:18
LONG_PTR LPARAM
Definition: windef.h:208
#define WM_DESTROY
Definition: winuser.h:1591
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
Definition: propsheet.c:3066
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define KEY_WRITE
Definition: nt_native.h:1031
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4895
BOOL WINAPI ParallelPortPropPageProvider(PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest, LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc, LPARAM lParam)
Definition: parallel.c:499
#define TRACE(s)
Definition: solgame.cpp:4
static VOID GetUsedPorts(PDWORD pPortMap)
Definition: parallel.c:27
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define DIREG_DEV
Definition: setupapi.h:181
#define swprintf(buf, format,...)
Definition: sprintf.c:56
#define WINAPI
Definition: msvc.h:8
#define IDC_TRY_INTERRUPT
Definition: resource.h:13
#define Button_GetCheck(hwndCtl)
Definition: windowsx.h:6
#define SPDRP_FRIENDLYNAME
Definition: setupapi.h:514
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetupDiSetDeviceRegistryProperty
Definition: setupapi.h:2615
_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
#define DWLP_USER
Definition: winuser.h:866
static INT_PTR CALLBACK ParallelSettingsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: parallel.c:472
HKEY WINAPI SetupDiOpenDevRegKey(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Scope, DWORD HwProfile, DWORD KeyType, REGSAM samDesired)
Definition: devinst.c:5919
#define SPDRP_DEVICEDESC
Definition: setupapi.h:502
static const WCHAR szDeviceName[]
Definition: provider.c:53
#define BST_UNCHECKED
Definition: winuser.h:199
#define SPPSR_ENUM_ADV_DEVICE_PROPERTIES
Definition: setupapi.h:610
#define ComboBox_SetCurSel(hwndCtl, index)
Definition: windowsx.h:41
#define ERR(fmt,...)
Definition: debug.h:109
#define _In_
Definition: no_sal2.h:204
#define DICS_FLAG_GLOBAL
Definition: setupapi.h:113
static VOID WritePortSettings(HWND hwnd, PPORT_DATA pPortData)
Definition: parallel.c:247
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
unsigned int UINT
Definition: ndis.h:50
#define IDC_PARALLEL_LEGACY
Definition: resource.h:16
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
HDEVINFO DeviceInfoSet
Definition: parallel.c:14
DWORD * PDWORD
Definition: pedump.c:68
#define BST_CHECKED
Definition: winuser.h:197
#define IDC_NEVER_INTERRUPT
Definition: resource.h:14
PSP_DEVINFO_DATA DeviceInfoData
Definition: parallel.c:15
#define Button_SetCheck(hwndCtl, check)
Definition: windowsx.h:10
static VOID ReadPortSettings(PPORT_DATA pPortData)
Definition: parallel.c:90
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
#define IDC_ANY_INTERRUPT
Definition: resource.h:15
#define GetWindowLongPtr
Definition: treelist.c:73
DWORD dwFilterResourceMethod
Definition: parallel.c:19
static VOID OnNotify(HWND hwnd, WPARAM wParam, LPARAM lParam)
Definition: parallel.c:424
#define REG_DWORD
Definition: sdbapi.c:596
BYTE * PBYTE
Definition: pedump.c:66
#define WM_INITDIALOG
Definition: winuser.h:1715
LPARAM lParam
Definition: combotst.c:139
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:394
#define IDD_PARALLELSETTINGS
Definition: resource.h:12
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
DWORD dwLegacy
Definition: parallel.c:20
#define WM_NOTIFY
Definition: richedit.h:61
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
static DWORD ChangePortNumber(_In_ PPORT_DATA pPortData, _In_ DWORD dwNewPortNumber)
Definition: parallel.c:164
#define REG_SZ
Definition: layer.c:22