From fce002c3b6d10253fe67e1b483f01bfdd67e3758 Mon Sep 17 00:00:00 2001 From: Detlef Riekenberg Date: Tue, 17 Apr 2007 23:20:34 +0200 Subject: [PATCH] localspl: Implement XcvData_AddPort. --- dlls/localspl/Makefile.in | 2 +- dlls/localspl/localmon.c | 58 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/dlls/localspl/Makefile.in b/dlls/localspl/Makefile.in index 06830de7d33..c3691e838be 100644 --- a/dlls/localspl/Makefile.in +++ b/dlls/localspl/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = localspl.dll -IMPORTS = user32 advapi32 kernel32 +IMPORTS = spoolss user32 advapi32 kernel32 C_SRCS = \ localmon.c \ diff --git a/dlls/localspl/localmon.c b/dlls/localspl/localmon.c index 7e13ace8fce..4dd0664bc2e 100644 --- a/dlls/localspl/localmon.c +++ b/dlls/localspl/localmon.c @@ -65,6 +65,7 @@ static struct list xcv_handles = LIST_INIT( xcv_handles ); /* ############################### */ +static const WCHAR cmd_AddPortW[] = {'A','d','d','P','o','r','t',0}; static const WCHAR cmd_DeletePortW[] = {'D','e','l','e','t','e','P','o','r','t',0}; static const WCHAR cmd_ConfigureLPTPortCommandOKW[] = {'C','o','n','f','i','g','u','r','e', 'L','P','T','P','o','r','t', @@ -85,6 +86,7 @@ static const WCHAR cmd_SetDefaultCommConfigW[] = {'S','e','t', 'C','o','m','m','C','o','n','f','i','g',0}; static const WCHAR dllnameuiW[] = {'l','o','c','a','l','u','i','.','d','l','l',0}; +static const WCHAR emptyW[] = {0}; static const WCHAR portname_LPT[] = {'L','P','T',0}; static const WCHAR portname_COM[] = {'C','O','M',0}; @@ -126,6 +128,44 @@ static void dlg_nothingtoconfig(HWND hWnd) } /****************************************************************** + * does_port_exist (internal) + * + * returns TRUE, when the Port already exists + * + */ +static BOOL does_port_exist(LPCWSTR myname) +{ + + LPPORT_INFO_1W pi; + DWORD needed = 0; + DWORD returned; + DWORD id; + + TRACE("(%s)\n", debugstr_w(myname)); + + id = EnumPortsW(NULL, 1, NULL, 0, &needed, &returned); + pi = spl_alloc(needed); + returned = 0; + if (pi) + id = EnumPortsW(NULL, 1, (LPBYTE) pi, needed, &needed, &returned); + + if (id && returned > 0) { + /* we got a number of valid names. */ + for (id = 0; id < returned; id++) + { + if (lstrcmpiW(myname, pi[id].pName) == 0) { + TRACE("(%u) found %s\n", id, debugstr_w(pi[id].pName)); + spl_free(pi); + return TRUE; + } + } + } + + spl_free(pi); + return FALSE; +} + +/****************************************************************** * enumerate the local Ports from the Registry (internal) * * See localmon_EnumPortsW. @@ -459,8 +499,22 @@ DWORD WINAPI localmon_XcvDataPort(HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInput TRACE("(%p, %s, %p, %d, %p, %d, %p)\n", hXcv, debugstr_w(pszDataName), pInputData, cbInputData, pOutputData, cbOutputData, pcbOutputNeeded); - /* Native localspl.dll crashes on w2k and xp, when XcvDataPort is called - with "AddPort" as command. We do not need to implement this */ + if (!lstrcmpW(pszDataName, cmd_AddPortW)) { + TRACE("InputData (%d): %s\n", cbInputData, debugstr_w( (LPWSTR) pInputData)); + res = RegOpenKeyW(HKEY_LOCAL_MACHINE, WinNT_CV_PortsW, &hroot); + if (res == ERROR_SUCCESS) { + if (does_port_exist((LPWSTR) pInputData)) { + RegCloseKey(hroot); + return ERROR_ALREADY_EXISTS; + } + res = RegSetValueExW(hroot, (LPWSTR) pInputData, 0, REG_SZ, (const BYTE *) emptyW, sizeof(emptyW)); + RegCloseKey(hroot); + SetLastError(ERROR_SUCCESS); + return res; + } + return res; + } + if (!lstrcmpW(pszDataName, cmd_ConfigureLPTPortCommandOKW)) { TRACE("InputData (%d): %s\n", cbInputData, debugstr_w( (LPWSTR) pInputData)); -- 2.11.4.GIT