From cf7b88e22fb56b5eb4e53e8571b7a649ba537d62 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 20 Feb 2016 15:56:49 +0000 Subject: [PATCH] [NP_ENUM] Add a test application that allows checking that currently network places enumeration is broken in ReactOS svn path=/trunk/; revision=70759 --- rostests/tests/np_enum/CMakeLists.txt | 4 ++ rostests/tests/np_enum/np_enum.c | 76 +++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 rostests/tests/np_enum/CMakeLists.txt create mode 100644 rostests/tests/np_enum/np_enum.c diff --git a/rostests/tests/np_enum/CMakeLists.txt b/rostests/tests/np_enum/CMakeLists.txt new file mode 100644 index 00000000000..8f4d4a8e8cf --- /dev/null +++ b/rostests/tests/np_enum/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(np_enum np_enum.c) +set_module_type(np_enum win32cui UNICODE) +add_importlibs(np_enum msvcrt kernel32 mpr) +add_cd_file(TARGET np_enum DESTINATION reactos/bin FOR all) diff --git a/rostests/tests/np_enum/np_enum.c b/rostests/tests/np_enum/np_enum.c new file mode 100644 index 00000000000..ffc7a687ea0 --- /dev/null +++ b/rostests/tests/np_enum/np_enum.c @@ -0,0 +1,76 @@ +#include +#include + +DWORD debug_shift = 0; + +#define INC_SHIFT ++debug_shift; +#define DEC_SHIFT --debug_shift; +#define PRT_SHIFT do { DWORD cur = 0; for (; cur < debug_shift; ++cur) printf("\t"); } while (0); + +void np_enum(NETRESOURCEW * resource) +{ + DWORD ret; + HANDLE handle; + DWORD size = 0x1000; + NETRESOURCEW * out; + BOOL check = FALSE; + + if (resource && resource->lpRemoteName) + check = TRUE; + + ret = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, resource, &handle); + if (ret != WN_SUCCESS) + return; + + out = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + if (!out) + { + WNetCloseEnum(handle); + return; + } + + INC_SHIFT + + if (check) + { + printf("Called with lpRemoteName not null, current value: %S\n", resource->lpRemoteName); + } + + do + { + DWORD count = -1; + + ret = WNetEnumResource(handle, &count, out, &size); + if (ret == WN_SUCCESS || ret == WN_MORE_DATA) + { + NETRESOURCEW * current; + + current = out; + for (; count; count--) + { + PRT_SHIFT; + printf("lpRemoteName: %S\n", current->lpRemoteName); + + if ((current->dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER) + { + PRT_SHIFT; + printf("Found provider: %S\n", current->lpProvider); + np_enum(current); + } + + current++; + } + } + } while (ret != WN_NO_MORE_ENTRIES); + DEC_SHIFT; + + HeapFree(GetProcessHeap(), 0, out); + WNetCloseEnum(handle); +} + +int wmain(int argc, const WCHAR *argv[]) +{ + np_enum(NULL); + + return 0; +} -- 2.17.1