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
12 typedef struct _PORT_DATA
14 HDEVINFO DeviceInfoSet
;
15 PSP_DEVINFO_DATA DeviceInfoData
;
19 DWORD dwFilterResourceMethod
;
22 } PORT_DATA
, *PPORT_DATA
;
30 WCHAR szDeviceName
[64];
31 WCHAR szDosDeviceName
[64];
32 DWORD dwIndex
, dwType
, dwPortNumber
;
33 DWORD dwDeviceNameSize
, dwDosDeviceNameSize
;
40 dwError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
41 L
"Hardware\\DeviceMap\\PARALLEL PORTS",
45 if (dwError
== ERROR_SUCCESS
)
47 for (dwIndex
= 0; ; dwIndex
++)
49 dwDeviceNameSize
= ARRAYSIZE(szDeviceName
);
50 dwDosDeviceNameSize
= sizeof(szDosDeviceName
);
51 dwError
= RegEnumValueW(hKey
,
57 (LPBYTE
)szDosDeviceName
,
58 &dwDosDeviceNameSize
);
59 if (dwError
!= ERROR_SUCCESS
)
64 TRACE("%S --> %S\n", szDeviceName
, szDosDeviceName
);
65 if (_wcsnicmp(szDosDeviceName
, L
"\\DosDevices\\LPT", wcslen(L
"\\DosDevices\\LPT")) == 0)
67 ptr
= szDosDeviceName
+ wcslen(L
"\\DosDevices\\LPT");
68 if (wcschr(ptr
, L
'.') == NULL
)
70 TRACE("Device number %S\n", ptr
);
71 dwPortNumber
= wcstoul(ptr
, NULL
, 10);
72 if (dwPortNumber
!= 0)
74 *pPortMap
|=(1 << dwPortNumber
);
97 TRACE("ReadPortSettings(%p)\n", pPortData
);
99 pPortData
->dwFilterResourceMethod
= 1; /* Never use an interrupt */
100 pPortData
->dwLegacy
= 0; /* Disabled */
101 pPortData
->dwPortNumber
= 0; /* Unknown */
103 hKey
= SetupDiOpenDevRegKey(pPortData
->DeviceInfoSet
,
104 pPortData
->DeviceInfoData
,
109 if (hKey
!= INVALID_HANDLE_VALUE
)
111 dwSize
= sizeof(pPortData
->szPortName
);
112 dwError
= RegQueryValueExW(hKey
,
116 (PBYTE
)pPortData
->szPortName
,
118 if (dwError
!= ERROR_SUCCESS
)
120 ERR("RegQueryValueExW failed (Error %lu)\n", dwError
);
123 dwSize
= sizeof(pPortData
->dwFilterResourceMethod
);
124 dwError
= RegQueryValueExW(hKey
,
125 L
"FilterResourceMethod",
128 (PBYTE
)&pPortData
->dwFilterResourceMethod
,
130 if (dwError
!= ERROR_SUCCESS
)
132 ERR("RegQueryValueExW failed (Error %lu)\n", dwError
);
138 dwError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
139 L
"SYSTEM\\CurrentControlSet\\Services\\Parport\\Parameters",
143 if (dwError
== ERROR_SUCCESS
)
145 dwSize
= sizeof(pPortData
->dwLegacy
);
146 dwError
= RegQueryValueExW(hKey
,
147 L
"ParEnableLegacyZip",
150 (PBYTE
)&pPortData
->dwLegacy
,
152 if (dwError
!= ERROR_SUCCESS
)
154 ERR("RegQueryValueExW failed (Error %lu)\n", dwError
);
166 PPORT_DATA pPortData
)
169 DWORD dwFilterResourceMethod
;
175 TRACE("WritePortSettings(%p)\n", pPortData
);
177 dwFilterResourceMethod
= 1;
178 if (Button_GetCheck(GetDlgItem(hwnd
, IDC_TRY_INTERRUPT
)) == BST_CHECKED
)
179 dwFilterResourceMethod
= 0;
180 else if (Button_GetCheck(GetDlgItem(hwnd
, IDC_NEVER_INTERRUPT
)) == BST_CHECKED
)
181 dwFilterResourceMethod
= 1;
182 else if (Button_GetCheck(GetDlgItem(hwnd
, IDC_ANY_INTERRUPT
)) == BST_CHECKED
)
183 dwFilterResourceMethod
= 2;
185 if (dwFilterResourceMethod
!= pPortData
->dwFilterResourceMethod
)
187 hKey
= SetupDiOpenDevRegKey(pPortData
->DeviceInfoSet
,
188 pPortData
->DeviceInfoData
,
193 if (hKey
!= INVALID_HANDLE_VALUE
)
195 dwError
= RegSetValueExW(hKey
,
196 L
"FilterResourceMethod",
199 (PBYTE
)&dwFilterResourceMethod
,
200 sizeof(dwFilterResourceMethod
));
201 if (dwError
!= ERROR_SUCCESS
)
203 ERR("RegSetValueExW failed (Error %lu)\n", dwError
);
207 pPortData
->dwFilterResourceMethod
= dwFilterResourceMethod
;
212 if (Button_GetCheck(GetDlgItem(hwnd
, IDC_PARALLEL_LEGACY
)) == BST_CHECKED
)
215 if (dwLegacy
!= pPortData
->dwLegacy
)
217 dwError
= RegCreateKeyExW(HKEY_LOCAL_MACHINE
,
218 L
"SYSTEM\\CurrentControlSet\\Services\\Parport\\Parameters",
221 REG_OPTION_NON_VOLATILE
,
226 if (dwError
== ERROR_SUCCESS
)
228 dwError
= RegSetValueExW(hKey
,
229 L
"ParEnableLegacyZip",
236 if (dwError
== ERROR_SUCCESS
)
238 FIXME("Notify the driver!\n");
240 pPortData
->dwLegacy
= dwLegacy
;
245 dwPortNumber
= ComboBox_GetCurSel(GetDlgItem(hwnd
, IDC_PARALLEL_NAME
));
246 if (dwPortNumber
!= LB_ERR
)
249 if (dwPortNumber
!= pPortData
->dwPortNumber
)
251 FIXME("Port name changed! LPT%lu --> LPT%lu", pPortData
->dwPortNumber
, dwPortNumber
);
254 // pPortData->dwPortNumber = dwPortNumber;
262 OnInitDialog(HWND hwnd
,
267 WCHAR szPortInUse
[64];
268 PPORT_DATA pPortData
;
273 TRACE("OnInitDialog()\n");
275 pPortData
= (PPORT_DATA
)((LPPROPSHEETPAGEW
)lParam
)->lParam
;
276 if (pPortData
== NULL
)
278 ERR("pPortData is NULL\n");
282 SetWindowLongPtr(hwnd
, DWLP_USER
, (LONG_PTR
)pPortData
);
284 /* Read and parse the port settings */
285 ReadPortSettings(pPortData
);
287 /* Set the 'Filter Resource Method' radiobuttons */
288 hwndControl
= GetDlgItem(hwnd
,
289 IDC_TRY_INTERRUPT
+ pPortData
->dwFilterResourceMethod
);
291 Button_SetCheck(hwndControl
, BST_CHECKED
);
293 /* Disable the 'Enable legacy PNP detection' checkbox */
294 hwndControl
= GetDlgItem(hwnd
, IDC_PARALLEL_LEGACY
);
297 Button_SetCheck(GetDlgItem(hwnd
, IDC_PARALLEL_LEGACY
),
298 pPortData
->dwLegacy
? BST_CHECKED
: BST_UNCHECKED
);
301 LoadStringW(hInstance
, IDS_PORT_IN_USE
, szPortInUse
, ARRAYSIZE(szPortInUse
));
303 /* Fill the 'LPT Port Number' combobox */
304 hwndControl
= GetDlgItem(hwnd
, IDC_PARALLEL_NAME
);
307 GetUsedPorts(&dwPortMap
);
309 for (i
= 1; i
< 4; i
++)
311 swprintf(szBuffer
, L
"LPT%lu", i
);
313 if ((dwPortMap
& (1 << i
)) && (pPortData
->dwPortNumber
!= i
))
314 wcscat(szBuffer
, szPortInUse
);
316 ComboBox_AddString(hwndControl
, szBuffer
);
318 if (_wcsicmp(pPortData
->szPortName
, szBuffer
) == 0)
319 pPortData
->dwPortNumber
= i
;
322 if (pPortData
->dwPortNumber
!= 0)
324 ComboBox_SetCurSel(hwndControl
, pPortData
->dwPortNumber
- 1);
339 PPORT_DATA pPortData
;
341 TRACE("OnNotify()\n");
343 pPortData
= (PPORT_DATA
)GetWindowLongPtr(hwnd
, DWLP_USER
);
344 if (pPortData
== NULL
)
346 ERR("pPortData is NULL\n");
350 if (((LPNMHDR
)lParam
)->code
== (UINT
)PSN_APPLY
)
352 TRACE("PSN_APPLY!\n");
353 WritePortSettings(hwnd
, pPortData
);
363 PPORT_DATA pPortData
;
365 TRACE("OnDestroy()\n");
367 pPortData
= (PPORT_DATA
)GetWindowLongPtr(hwnd
, DWLP_USER
);
368 if (pPortData
== NULL
)
370 ERR("pPortData is NULL\n");
374 HeapFree(GetProcessHeap(), 0, pPortData
);
375 SetWindowLongPtr(hwnd
, DWLP_USER
, (LONG_PTR
)NULL
);
382 ParallelSettingsDlgProc(HWND hwnd
,
387 TRACE("ParallelSettingsDlgProc()\n");
392 return OnInitDialog(hwnd
, wParam
, lParam
);
395 OnNotify(hwnd
, wParam
, lParam
);
409 ParallelPortPropPageProvider(PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
410 LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
413 PROPSHEETPAGEW PropSheetPage
;
414 HPROPSHEETPAGE hPropSheetPage
;
415 PPORT_DATA pPortData
;
417 TRACE("ParallelPortPropPageProvider(%p %p %lx)\n",
418 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
420 pPortData
= HeapAlloc(GetProcessHeap(),
423 if (pPortData
== NULL
)
425 ERR("Port data allocation failed!\n");
429 pPortData
->DeviceInfoSet
= lpPropSheetPageRequest
->DeviceInfoSet
;
430 pPortData
->DeviceInfoData
= lpPropSheetPageRequest
->DeviceInfoData
;
432 if (lpPropSheetPageRequest
->PageRequested
== SPPSR_ENUM_ADV_DEVICE_PROPERTIES
)
434 TRACE("SPPSR_ENUM_ADV_DEVICE_PROPERTIES\n");
436 PropSheetPage
.dwSize
= sizeof(PROPSHEETPAGEW
);
437 PropSheetPage
.dwFlags
= 0;
438 PropSheetPage
.hInstance
= hInstance
;
439 PropSheetPage
.pszTemplate
= MAKEINTRESOURCE(IDD_PARALLELSETTINGS
);
440 PropSheetPage
.pfnDlgProc
= ParallelSettingsDlgProc
;
441 PropSheetPage
.lParam
= (LPARAM
)pPortData
;
442 PropSheetPage
.pfnCallback
= NULL
;
444 hPropSheetPage
= CreatePropertySheetPageW(&PropSheetPage
);
445 if (hPropSheetPage
== NULL
)
447 ERR("CreatePropertySheetPageW() failed!\n");
451 if (!(*lpfnAddPropSheetPageProc
)(hPropSheetPage
, lParam
))
453 ERR("lpfnAddPropSheetPageProc() failed!\n");
454 DestroyPropertySheetPage(hPropSheetPage
);