From: Pierre Schweitzer Subject: [PATCH] mpr: Implement WNetClearConnections(). Message-Id: Date: Sun, 9 Sep 2018 15:58:42 +0200 Hi, Please find attached a patch implements an undocumented Windows MPR API that is used on logoff to disconnect any network share connection. Implementation based on: https://git.reactos.org/?p=reactos.git;a=blob;f=base/applications/network/net/cmdUse.c;hb=HEAD Successfully tested in: https://jira.reactos.org/browse/CORE-15012 Cheers, -- Pierre Schweitzer System & Network Administrator Senior Kernel Developer ReactOS Deutschland e.V. From 0f1e364417f10c9b557d905608ddb75527d64609 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 9 Sep 2018 15:48:00 +0200 Subject: [PATCH] mpr: Implement WNetClearConnections(). Signed-off-by: Pierre Schweitzer --- dlls/mpr/mpr.spec | 1 + dlls/mpr/wnet.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/dlls/mpr/mpr.spec b/dlls/mpr/mpr.spec index 4df3db311b..2f102abf3e 100644 --- a/dlls/mpr/mpr.spec +++ b/dlls/mpr/mpr.spec @@ -55,6 +55,7 @@ @ stdcall WNetCancelConnection2W(wstr long long) @ stdcall WNetCancelConnectionA(str long) @ stdcall WNetCancelConnectionW(wstr long) +@ stdcall WNetClearConnections(long) @ stdcall WNetCloseEnum(long) @ stdcall WNetConnectionDialog1A(ptr) @ stdcall WNetConnectionDialog1W(ptr) diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c index a2f8a0425d..eb7f122d15 100644 --- a/dlls/mpr/wnet.c +++ b/dlls/mpr/wnet.c @@ -4,7 +4,7 @@ * Copyright 1999 Ulrich Weigand * Copyright 2004 Juan Lang * Copyright 2007 Maarten Lankhorst - * Copyright 2016 Pierre Schweitzer + * Copyright 2016-2018 Pierre Schweitzer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -2407,6 +2407,61 @@ DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel, return err; } +/***************************************************************** + * WNetClearConnections [MPR.@] + */ +DWORD WINAPI WNetClearConnections ( DWORD unknown ) +{ + HANDLE connected; + DWORD ret, size, count; + NETRESOURCEW * resources, * iter; + + ret = WNetOpenEnumW(RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0, NULL, &connected); + if (ret != WN_SUCCESS) + { + if (ret != WN_NO_NETWORK) + { + return ret; + } + + /* Means no provider, then, clearing is OK */ + return WN_SUCCESS; + } + + size = 0x1000; + resources = HeapAlloc(GetProcessHeap(), 0, size); + if (!resources) + { + WNetCloseEnum(connected); + return WN_OUT_OF_MEMORY; + } + + do + { + size = 0x1000; + count = -1; + + memset(resources, 0, size); + ret = WNetEnumResourceW(connected, &count, resources, &size); + if (ret == WN_SUCCESS || ret == WN_MORE_DATA) + { + iter = resources; + for (; count; count--) + { + WNetCancelConnection2W(iter->lpLocalName, 0, TRUE); + + iter++; + } + } + else + break; + } while (ret != WN_NO_MORE_ENTRIES); + + HeapFree(GetProcessHeap(), 0, resources); + WNetCloseEnum(connected); + + return ret; +} /* -- 2.17.1