Index: reactos/dll/shellext/netshell/netshell.cpp =================================================================== --- reactos/dll/shellext/netshell/netshell.cpp (revision 73403) +++ reactos/dll/shellext/netshell/netshell.cpp (working copy) @@ -70,4 +70,37 @@ CoTaskMemFree(pProps); } +BOOL +WINAPI +NcIsValidConnectionName(_In_ PCWSTR pszwName) +{ + if (!pszwName) + return FALSE; + + BOOL nonSpace = FALSE; + while (*pszwName) + { + switch(*(pszwName++)) + { + case L'\\': + case L'/': + case L':': + case L'*': + case L'\t': + case L'?': + case L'<': + case L'>': + case L'|': + case L'\"': + return FALSE; + case L' ': + break; + default: + nonSpace = TRUE; + break; + } + } + return nonSpace; +} + } // extern "C" Index: reactos/dll/shellext/netshell/netshell.spec =================================================================== --- reactos/dll/shellext/netshell/netshell.spec (revision 73403) +++ reactos/dll/shellext/netshell/netshell.spec (working copy) @@ -21,7 +21,7 @@ 20 stub HrRunWizard 21 stub InvokeDunFile 22 stdcall NcFreeNetconProperties(ptr) -23 stub NcIsValidConnectionName +23 stdcall NcIsValidConnectionName(wstr) 24 stub NetSetupAddRasConnection 25 stub NetSetupFinishInstall 26 stub NetSetupInstallSoftware Index: rostests/apitests/CMakeLists.txt =================================================================== --- rostests/apitests/CMakeLists.txt (revision 73403) +++ rostests/apitests/CMakeLists.txt (working copy) @@ -18,6 +18,7 @@ add_subdirectory(localspl) add_subdirectory(msgina) add_subdirectory(msvcrt) +add_subdirectory(netshell) add_subdirectory(ntdll) add_subdirectory(ole32) add_subdirectory(pefile) Index: rostests/apitests/netshell/CMakeLists.txt =================================================================== --- rostests/apitests/netshell/CMakeLists.txt (nonexistent) +++ rostests/apitests/netshell/CMakeLists.txt (working copy) @@ -0,0 +1,5 @@ + +add_executable(netshell_apitest NcIsValidConnectionName.c testlist.c) +set_module_type(netshell_apitest win32cui) +add_importlibs(netshell_apitest msvcrt kernel32) +add_cd_file(TARGET netshell_apitest DESTINATION reactos/bin FOR all) Index: rostests/apitests/netshell/NcIsValidConnectionName.c =================================================================== --- rostests/apitests/netshell/NcIsValidConnectionName.c (nonexistent) +++ rostests/apitests/netshell/NcIsValidConnectionName.c (working copy) @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Jared Smudde + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Documentation: https://msdn.microsoft.com/en-us/library/windows/desktop/aa366197%28v=vs.85%29.aspx */ + +#include + +static BOOL (WINAPI *pNcIsValidConnectionName)(PCWSTR); + +#define CALL_NC(exp, str) \ + do { \ + BOOL ret = pNcIsValidConnectionName((str)); \ + ok(ret == (exp), "Expected %s to be %d, was %d\n", wine_dbgstr_w((str)), (exp), ret); \ + } while (0) + + + +static void test_BadLetters(void) +{ + BOOL ret; + + WCHAR buf[3] = { 0 }; + int i; + + for(i = 1; i <= 0xFFFF; ++i) + { + buf[0] = (WCHAR)i; + buf[1] = buf[2] = L'\0'; + + if (wcspbrk(buf, L"\\/:\t*? <>|\"") != NULL) + { + ret = pNcIsValidConnectionName(buf); + ok(ret == FALSE, "Expected %s (%i) to fail.\n", wine_dbgstr_w(buf), i); + + /* How about two of a kind? */ + buf[1] = (WCHAR)i; + ret = pNcIsValidConnectionName(buf); + ok(ret == FALSE, "Expected %s (%i) to fail.\n", wine_dbgstr_w(buf), i); + + /* And something combined with a space? */ + buf[1] = L' '; + ret = pNcIsValidConnectionName(buf); + ok(ret == FALSE, "Expected %s (%i) to fail.\n", wine_dbgstr_w(buf), i); + } + else + { + ret = pNcIsValidConnectionName(buf); + ok(ret == TRUE, "Expected %s (%i) to succeed.\n", wine_dbgstr_w(buf), i); + buf[1] = (WCHAR)i; + ret = pNcIsValidConnectionName(buf); + ok(ret == TRUE, "Expected %s (%i) to succeed.\n", wine_dbgstr_w(buf), i); + } + + /* And when there are other characters involved, the space is suddenly allowed! */ + buf[1] = L'a'; + + if (wcspbrk(buf, L"\\/:\t*?<>|\"") != NULL) + { + ret = pNcIsValidConnectionName(buf); + ok(ret == FALSE, "Expected %s (%i) to fail.\n", wine_dbgstr_w(buf), i); + } + else + { + ret = pNcIsValidConnectionName(buf); + ok(ret == TRUE, "Expected %s (%i) to succeed.\n", wine_dbgstr_w(buf), i); + } + } +} + +START_TEST(isvalidname) +{ + HMODULE hDll = LoadLibraryA("netshell.dll"); + + pNcIsValidConnectionName = (void*)GetProcAddress(hDll, "NcIsValidConnectionName"); + if (!hDll || !pNcIsValidConnectionName) + { + skip("netshell.dll or export NcIsValidConnectionName not found! Tests will be skipped\n"); + return; + } + + CALL_NC(TRUE, L"Network"); + CALL_NC(FALSE, L"Network?"); + + CALL_NC(FALSE, L"\\"); + CALL_NC(FALSE, L"/"); + CALL_NC(FALSE, L":"); + CALL_NC(FALSE, L"*"); + CALL_NC(FALSE, L"?"); + CALL_NC(FALSE, L"<"); + CALL_NC(FALSE, L">"); + CALL_NC(FALSE, L"|"); + + CALL_NC(FALSE, NULL); + + CALL_NC(TRUE, L"Wireless"); + CALL_NC(FALSE, L"Wireless:1"); + CALL_NC(TRUE, L"Intranet"); + CALL_NC(FALSE, L"Intranet<"); + CALL_NC(TRUE, L"Network Connection"); + + test_BadLetters(); +} Index: rostests/apitests/netshell/testlist.c =================================================================== --- rostests/apitests/netshell/testlist.c (nonexistent) +++ rostests/apitests/netshell/testlist.c (working copy) @@ -0,0 +1,11 @@ +#define STANDALONE +#include "R:\hook\base_hk.h" +#include + +extern void func_isvalidname(void); + +const struct test winetest_testlist[] = +{ + { "NcIsValidConnectionName", func_isvalidname }, + { 0, 0 } +};