From: Pierre Schweitzer Subject: [PATCH 3/3] mpr: Implement WNetUseConnectionA(). (try 7) Message-Id: <56B51AC8.6050608@reactos.org> Date: Fri, 5 Feb 2016 22:57:28 +0100 In light of the recent committed MPR tests for WNetUseConnectionA(), please find attached the fixed implementation of WNetUseConnectionA(). -- Pierre Schweitzer System & Network Administrator Senior Kernel Developer ReactOS Deutschland e.V. From 15281d580f5d67016289894f7fa2e45b4b856122 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 16 Jan 2016 09:58:59 +0100 Subject: [PATCH 3/3] mpr: Implement WNetUseConnectionA(). Signed-off-by: Pierre Schweitzer --- dlls/mpr/wnet.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 5 deletions(-) diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c index 2b53f2a..f582c53 100644 --- a/dlls/mpr/wnet.c +++ b/dlls/mpr/wnet.c @@ -1553,6 +1553,33 @@ DWORD WINAPI WNetAddConnection3W( HWND hwndOwner, LPNETRESOURCEW lpNetResource, dwFlags, NULL, 0, NULL); } +/* Convert an ANSI string to wide */ +static LPWSTR strdupAtoW( LPCSTR str ) +{ + LPWSTR ret; + INT len; + + if (!str) return NULL; + len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 ); + ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + if (ret) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len ); + return ret; +} + +/* Convert ANSI NETRESOURCE struct to wide structure */ +static VOID convert_netresourcea_to_w( LPNETRESOURCEA lpNetResourceA, + LPNETRESOURCEW lpNetResourceW ) +{ + lpNetResourceW->dwScope = lpNetResourceA->dwScope; + lpNetResourceW->dwType = lpNetResourceA->dwType; + lpNetResourceW->dwDisplayType = lpNetResourceA->dwDisplayType; + lpNetResourceW->dwUsage = lpNetResourceA->dwUsage; + lpNetResourceW->lpLocalName = strdupAtoW(lpNetResourceA->lpLocalName); + lpNetResourceW->lpRemoteName = strdupAtoW(lpNetResourceA->lpRemoteName); + lpNetResourceW->lpComment = strdupAtoW(lpNetResourceA->lpComment); + lpNetResourceW->lpProvider = strdupAtoW(lpNetResourceA->lpProvider); +} + /***************************************************************** * WNetUseConnectionA [MPR.@] */ @@ -1561,12 +1588,68 @@ DWORD WINAPI WNetUseConnectionA( HWND hwndOwner, LPNETRESOURCEA lpNetResource, LPSTR lpAccessName, LPDWORD lpBufferSize, LPDWORD lpResult ) { - FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n", - hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags, - debugstr_a(lpAccessName), lpBufferSize, lpResult ); + NETRESOURCEW resourcesW, *pRes = NULL; + PWSTR passW, userIDW, accessNameW = NULL; + DWORD ret = WN_MORE_DATA; + DWORD bufferSize = 0; + int len; - SetLastError(WN_NO_NETWORK); - return WN_NO_NETWORK; + if (lpNetResource) + { + convert_netresourcea_to_w(lpNetResource, &resourcesW); + pRes = &resourcesW; + } + + passW = strdupAtoW(lpPassword); + userIDW = strdupAtoW(lpUserID); + + if (lpAccessName && lpBufferSize && *lpBufferSize) + { + WCHAR probe; + + bufferSize = 1; + ret = WNetUseConnectionW(hwndOwner, pRes, passW, userIDW, dwFlags, + &probe, &bufferSize, lpResult); + if (ret == WN_MORE_DATA) + accessNameW = HeapAlloc(GetProcessHeap(), 0, bufferSize * sizeof(WCHAR)); + } + + if (ret == WN_MORE_DATA) + { + ret = WNetUseConnectionW(hwndOwner, pRes, passW, userIDW, dwFlags, + accessNameW, &bufferSize, lpResult); + if (ret == WN_SUCCESS) + { + if (lpAccessName && lpBufferSize && *lpBufferSize && accessNameW) + { + len = WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, NULL, 0, NULL, NULL); + if (len) + { + if (len <= *lpBufferSize) + WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, lpAccessName, len, NULL, NULL); + else + { + WNetCancelConnectionW(accessNameW, TRUE); + *lpBufferSize = len; + ret = WN_MORE_DATA; + } + } + } + } + } + + if (lpNetResource) + { + HeapFree(GetProcessHeap(), 0, resourcesW.lpLocalName); + HeapFree(GetProcessHeap(), 0, resourcesW.lpRemoteName); + HeapFree(GetProcessHeap(), 0, resourcesW.lpComment); + HeapFree(GetProcessHeap(), 0, resourcesW.lpProvider); + } + HeapFree(GetProcessHeap(), 0, passW); + HeapFree(GetProcessHeap(), 0, userIDW); + HeapFree(GetProcessHeap(), 0, accessNameW); + + return ret; } /***************************************************************** -- 1.9.1 0 *H 010  `He0 *H  040 0  *H 0}1 0 UIL10U  StartCom Ltd.1+0)U "Secure Digital Certificate Signing1)0'U StartCom Certification Authority0 071024210255Z 171024210255Z01 0 UIL10U  StartCom Ltd.1+0)U "Secure Digital Certificate Signing1806U/StartCom Class 2 Primary Intermediate Client CA0"0  *H 0 (E,3* U]"gFSݤ>}m w鞆FA7~ |-ql"/Q?Vp`G&viĜ73 {B'87ds Nfz1%TII|2o/mD \t :08VGqǴ3Rp}JTzF;&X}rD Q 600U00U0UUo1ʹk1㬻0U#0N @[i04hCA0f+Z0X0'+0http://ocsp.startssl.com/ca0-+0!http://www.startssl.com/sfsca.crt0[UT0R0'%#!http://www.startssl.com/sfsca.crl0'%#!http://crl.startssl.com/sfsca.crl0U y0w0u +70f0.+"http://www.startssl.com/policy.pdf04+(http://www.startssl.com/intermediate.pdf0  *H :' ӴiiL\};JBG Ƚ1Fa gR~9P1 Rvg}ȜsWr<];sY/Msߟq'ɽNpʧ`&pPz/ў-Eׁ1KeET5ꥊ@v錈{8@t e=ރt92Ow[%[kd+YO!_uyGYqE\pCbM~ @3xnM+RH?o'V=INjWbᑶYOuZk*9Jz)w󫦒jNnZqwZV=t+΄BMkd"ܧfVSąmzLu8¾ņVcoiQ^7|#Bl@ /D;+@8 ~brA+}TLVŜ 2J(Hn}Rt]fiZ U ]+nŚܓqEF$^fsȕP)*6\q)90a0IY 0  *H  01 0 UIL10U  StartCom Ltd.1+0)U "Secure Digital Certificate Signing1806U/StartCom Class 2 Primary Intermediate Client CA0 141124162727Z 161124202226Z0~1 0 UFR10UHaute-Normandie10U Montivilliers10UPierre Schweitzer1!0 *H  pierre@reactos.org0"0  *H 0 Ik9 Pd `V<%v͗9lyu.=\H~6I~䄅#dZ>4oME\'܎D_eQMUkb/}c T;*z?f aڀ8K,`]:E5˩ "` `=F7wnpZHāڒN[(Tk8b:I7+K00 U00 U0U%0++0UfL,U%Zm0U#0Uo1ʹk1㬻0U0pierre@reactos.org0LU C0?0; +70*0.+"http://www.startssl.com/policy.pdf0+00' StartCom Certification Authority0This certificate was issued according to the Class 2 Validation requirements of the StartCom CA policy, reliance only for the intended purpose in compliance of the relying party obligations.06U/0-0+)'%http://crl.startssl.com/crtu2-crl.crl0+009+0-http://ocsp.startssl.com/sub/class2/client/ca0B+06http://aia.startssl.com/certs/sub.class2.client.ca.crt0#U0http://www.startssl.com/0  *H  &ܚɮI]YugIcG3M\@8JVu=qؖ\ ё, a<]r{JKC'뢀pኡ֗ז'!Ewa2*jH=g_~#WRFjsEgo`\0R_ 2䑌LM1Zz־~r&S`ب+xY(5` Pš[810001 0 UIL10U  StartCom Ltd.1+0)U "Secure Digital Certificate Signing1806U/StartCom Class 2 Primary Intermediate Client CAY 0  `He0 *H  1  *H 0 *H  1 160205215728Z0/ *H  1" ,_Mڷf] O1͊#@0l *H  1_0]0  `He*0  `He0 *H 0*H 0 *H @0+0 *H (0  *H ^V$̏םAc ;fB.4!p+T jz4$w|FQqe내m/"_lD͆,t3r.!IMbtS؁?6'xnܝ>&da@p2}ǂ*C`yϻ[M;:M`c/0PfQ_#Wsmx肆SC'en7,*0 C5 T