mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[MSPORTS] Implement the 'Filter Resource Method' setting for parallel ports
This commit is contained in:
parent
1f85e4fe9f
commit
133611fed8
1 changed files with 230 additions and 5 deletions
|
@ -8,17 +8,222 @@
|
||||||
|
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
|
||||||
|
typedef struct _PORT_DATA
|
||||||
|
{
|
||||||
|
HDEVINFO DeviceInfoSet;
|
||||||
|
PSP_DEVINFO_DATA DeviceInfoData;
|
||||||
|
|
||||||
|
WCHAR szPortName[16];
|
||||||
|
DWORD dwFilterResourceMethod;
|
||||||
|
} PORT_DATA, *PPORT_DATA;
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
ReadPortSettings(
|
||||||
|
PPORT_DATA pPortData)
|
||||||
|
{
|
||||||
|
DWORD dwSize;
|
||||||
|
HKEY hKey;
|
||||||
|
LONG lError;
|
||||||
|
|
||||||
|
TRACE("ReadPortSettings(%p)\n", pPortData);
|
||||||
|
|
||||||
|
pPortData->dwFilterResourceMethod = 1; /* Never use an interrupt */
|
||||||
|
|
||||||
|
hKey = SetupDiOpenDevRegKey(pPortData->DeviceInfoSet,
|
||||||
|
pPortData->DeviceInfoData,
|
||||||
|
DICS_FLAG_GLOBAL,
|
||||||
|
0,
|
||||||
|
DIREG_DEV,
|
||||||
|
KEY_READ);
|
||||||
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
ERR("SetupDiOpenDevRegKey() failed\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dwSize = sizeof(pPortData->szPortName);
|
||||||
|
lError = RegQueryValueExW(hKey,
|
||||||
|
L"PortName",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(PBYTE)pPortData->szPortName,
|
||||||
|
&dwSize);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
ERR("RegQueryValueExW failed (Error %lu)\n", lError);
|
||||||
|
}
|
||||||
|
|
||||||
|
dwSize = sizeof(pPortData->dwFilterResourceMethod);
|
||||||
|
lError = RegQueryValueExW(hKey,
|
||||||
|
L"FilterResourceMethod",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(PBYTE)&pPortData->dwFilterResourceMethod,
|
||||||
|
&dwSize);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
ERR("RegQueryValueExW failed (Error %lu)\n", lError);
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
WritePortSettings(
|
||||||
|
HWND hwnd,
|
||||||
|
PPORT_DATA pPortData)
|
||||||
|
{
|
||||||
|
DWORD dwFilterResourceMethod;
|
||||||
|
HKEY hKey;
|
||||||
|
LONG lError;
|
||||||
|
|
||||||
|
TRACE("WritePortSettings(%p)\n", pPortData);
|
||||||
|
|
||||||
|
dwFilterResourceMethod = 1;
|
||||||
|
if (Button_GetCheck(GetDlgItem(hwnd, IDC_TRY_INTERRUPT)) == BST_CHECKED)
|
||||||
|
dwFilterResourceMethod = 0;
|
||||||
|
else if (Button_GetCheck(GetDlgItem(hwnd, IDC_NEVER_INTERRUPT)) == BST_CHECKED)
|
||||||
|
dwFilterResourceMethod = 1;
|
||||||
|
else if (Button_GetCheck(GetDlgItem(hwnd, IDC_ANY_INTERRUPT)) == BST_CHECKED)
|
||||||
|
dwFilterResourceMethod = 2;
|
||||||
|
|
||||||
|
if (dwFilterResourceMethod != pPortData->dwFilterResourceMethod)
|
||||||
|
{
|
||||||
|
hKey = SetupDiOpenDevRegKey(pPortData->DeviceInfoSet,
|
||||||
|
pPortData->DeviceInfoData,
|
||||||
|
DICS_FLAG_GLOBAL,
|
||||||
|
0,
|
||||||
|
DIREG_DEV,
|
||||||
|
KEY_WRITE);
|
||||||
|
if (hKey == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
ERR("SetupDiOpenDevRegKey() failed\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lError = RegSetValueExW(hKey,
|
||||||
|
L"FilterResourceMethod",
|
||||||
|
0,
|
||||||
|
REG_DWORD,
|
||||||
|
(PBYTE)&dwFilterResourceMethod,
|
||||||
|
sizeof(dwFilterResourceMethod));
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
ERR("RegSetValueExW failed (Error %lu)\n", lError);
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
|
||||||
|
pPortData->dwFilterResourceMethod = dwFilterResourceMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
BOOL
|
BOOL
|
||||||
OnInitDialog(HWND hwnd,
|
OnInitDialog(HWND hwnd,
|
||||||
WPARAM wParam,
|
WPARAM wParam,
|
||||||
LPARAM lParam)
|
LPARAM lParam)
|
||||||
{
|
{
|
||||||
TRACE("Port_OnInit()\n");
|
PPORT_DATA pPortData;
|
||||||
|
HWND hwndControl;
|
||||||
|
WCHAR szBuffer[256];
|
||||||
|
UINT i;
|
||||||
|
|
||||||
|
TRACE("OnInitDialog()\n");
|
||||||
|
|
||||||
|
pPortData = (PPORT_DATA)((LPPROPSHEETPAGEW)lParam)->lParam;
|
||||||
|
if (pPortData == NULL)
|
||||||
|
{
|
||||||
|
ERR("pPortData is NULL\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR)pPortData);
|
||||||
|
|
||||||
|
/* Read and parse the port settings */
|
||||||
|
ReadPortSettings(pPortData);
|
||||||
|
|
||||||
|
/* Set the 'Filter Resource Method' radiobuttons */
|
||||||
|
hwndControl = GetDlgItem(hwnd,
|
||||||
|
IDC_TRY_INTERRUPT + pPortData->dwFilterResourceMethod);
|
||||||
|
if (hwndControl)
|
||||||
|
Button_SetCheck(hwndControl, BST_CHECKED);
|
||||||
|
|
||||||
|
/* Disable the 'Enable legacy PNP detection' checkbox */
|
||||||
|
hwndControl = GetDlgItem(hwnd, IDC_PARALLEL_LEGACY);
|
||||||
|
EnableWindow(hwndControl, FALSE);
|
||||||
|
|
||||||
|
/* Fill the 'LPT Port Number' combobox */
|
||||||
|
hwndControl = GetDlgItem(hwnd, IDC_PARALLEL_NAME);
|
||||||
|
if (hwndControl)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
swprintf(szBuffer, L"LPT%lu", i + 1);
|
||||||
|
ComboBox_AddString(hwndControl, szBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable it */
|
||||||
|
EnableWindow(hwndControl, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
OnNotify(
|
||||||
|
HWND hwnd,
|
||||||
|
WPARAM wParam,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
PPORT_DATA pPortData;
|
||||||
|
|
||||||
|
TRACE("OnNotify()\n");
|
||||||
|
|
||||||
|
pPortData = (PPORT_DATA)GetWindowLongPtr(hwnd, DWLP_USER);
|
||||||
|
if (pPortData == NULL)
|
||||||
|
{
|
||||||
|
ERR("pPortData is NULL\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
|
||||||
|
{
|
||||||
|
TRACE("PSN_APPLY!\n");
|
||||||
|
WritePortSettings(hwnd, pPortData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
OnDestroy(
|
||||||
|
HWND hwnd)
|
||||||
|
{
|
||||||
|
PPORT_DATA pPortData;
|
||||||
|
|
||||||
|
TRACE("OnDestroy()\n");
|
||||||
|
|
||||||
|
pPortData = (PPORT_DATA)GetWindowLongPtr(hwnd, DWLP_USER);
|
||||||
|
if (pPortData == NULL)
|
||||||
|
{
|
||||||
|
ERR("pPortData is NULL\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, pPortData);
|
||||||
|
SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR)NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
INT_PTR
|
INT_PTR
|
||||||
CALLBACK
|
CALLBACK
|
||||||
|
@ -32,8 +237,15 @@ ParallelSettingsDlgProc(HWND hwnd,
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
case WM_INITDIALOG:
|
case WM_INITDIALOG:
|
||||||
SendDlgItemMessage(hwnd, IDC_NEVER_INTERRUPT, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
|
|
||||||
return OnInitDialog(hwnd, wParam, lParam);
|
return OnInitDialog(hwnd, wParam, lParam);
|
||||||
|
|
||||||
|
case WM_NOTIFY:
|
||||||
|
OnNotify(hwnd, wParam, lParam);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
OnDestroy(hwnd);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -48,10 +260,23 @@ ParallelPortPropPageProvider(PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest,
|
||||||
{
|
{
|
||||||
PROPSHEETPAGEW PropSheetPage;
|
PROPSHEETPAGEW PropSheetPage;
|
||||||
HPROPSHEETPAGE hPropSheetPage;
|
HPROPSHEETPAGE hPropSheetPage;
|
||||||
|
PPORT_DATA pPortData;
|
||||||
|
|
||||||
TRACE("ParallelPortPropPageProvider(%p %p %lx)\n",
|
TRACE("ParallelPortPropPageProvider(%p %p %lx)\n",
|
||||||
lpPropSheetPageRequest, lpfnAddPropSheetPageProc, lParam);
|
lpPropSheetPageRequest, lpfnAddPropSheetPageProc, lParam);
|
||||||
|
|
||||||
|
pPortData = HeapAlloc(GetProcessHeap(),
|
||||||
|
HEAP_ZERO_MEMORY,
|
||||||
|
sizeof(PORT_DATA));
|
||||||
|
if (pPortData == NULL)
|
||||||
|
{
|
||||||
|
ERR("Port data allocation failed!\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pPortData->DeviceInfoSet = lpPropSheetPageRequest->DeviceInfoSet;
|
||||||
|
pPortData->DeviceInfoData = lpPropSheetPageRequest->DeviceInfoData;
|
||||||
|
|
||||||
if (lpPropSheetPageRequest->PageRequested == SPPSR_ENUM_ADV_DEVICE_PROPERTIES)
|
if (lpPropSheetPageRequest->PageRequested == SPPSR_ENUM_ADV_DEVICE_PROPERTIES)
|
||||||
{
|
{
|
||||||
TRACE("SPPSR_ENUM_ADV_DEVICE_PROPERTIES\n");
|
TRACE("SPPSR_ENUM_ADV_DEVICE_PROPERTIES\n");
|
||||||
|
@ -61,19 +286,19 @@ ParallelPortPropPageProvider(PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest,
|
||||||
PropSheetPage.hInstance = hInstance;
|
PropSheetPage.hInstance = hInstance;
|
||||||
PropSheetPage.pszTemplate = MAKEINTRESOURCE(IDD_PARALLELSETTINGS);
|
PropSheetPage.pszTemplate = MAKEINTRESOURCE(IDD_PARALLELSETTINGS);
|
||||||
PropSheetPage.pfnDlgProc = ParallelSettingsDlgProc;
|
PropSheetPage.pfnDlgProc = ParallelSettingsDlgProc;
|
||||||
PropSheetPage.lParam = 0;
|
PropSheetPage.lParam = (LPARAM)pPortData;
|
||||||
PropSheetPage.pfnCallback = NULL;
|
PropSheetPage.pfnCallback = NULL;
|
||||||
|
|
||||||
hPropSheetPage = CreatePropertySheetPageW(&PropSheetPage);
|
hPropSheetPage = CreatePropertySheetPageW(&PropSheetPage);
|
||||||
if (hPropSheetPage == NULL)
|
if (hPropSheetPage == NULL)
|
||||||
{
|
{
|
||||||
TRACE("CreatePropertySheetPageW() failed!\n");
|
ERR("CreatePropertySheetPageW() failed!\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(*lpfnAddPropSheetPageProc)(hPropSheetPage, lParam))
|
if (!(*lpfnAddPropSheetPageProc)(hPropSheetPage, lParam))
|
||||||
{
|
{
|
||||||
TRACE("lpfnAddPropSheetPageProc() failed!\n");
|
ERR("lpfnAddPropSheetPageProc() failed!\n");
|
||||||
DestroyPropertySheetPage(hPropSheetPage);
|
DestroyPropertySheetPage(hPropSheetPage);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue