mirror of
https://github.com/reactos/reactos.git
synced 2024-08-21 02:43:48 +00:00
[MPR]
Time to (re)act! Step 1/2: - Implement WNetUseConnectionA() as a simple forwarder to WNetUseConnectionW(). This function should make it somehow, somewhen to Wine. Feel free to help the process by lighting cierges. - Halplement WNetUseConnectionW() to match a really specific case: it can handle requests from VBoxTray and pass them properly to VBox NP. In its current state, this function isn't to be shared with Wine. Other calls (specifically without local path, nor network provider) aren't handled and will lead to an error. But, in itself, this commit obsoletes rosvboxmgmt by making ReactOS able to autostart (on VBoxTray demand :-)) the VBox shared folders. Furthermore, if you ask for a drive letter to be assigned to your shared folder, it will happen! Now, in order to use VBox shared folders, just configure VBox to assign them a drive letter, install ReactOS, install VBox Guest Additions... Profit! CORE-10032 ROSAPPS-303 svn path=/trunk/; revision=70670
This commit is contained in:
parent
cebd126f81
commit
ef3e0ddadc
|
@ -45,3 +45,195 @@ Index: mpr.spec
|
||||||
22 stdcall @(long) MPR_Alloc
|
22 stdcall @(long) MPR_Alloc
|
||||||
23 stdcall @(ptr long) MPR_ReAlloc
|
23 stdcall @(ptr long) MPR_ReAlloc
|
||||||
24 stdcall @(ptr) MPR_Free
|
24 stdcall @(ptr) MPR_Free
|
||||||
|
Index: wnet.c
|
||||||
|
===================================================================
|
||||||
|
--- wnet.c (révision 70645)
|
||||||
|
+++ wnet.c (copie de travail)
|
||||||
|
@@ -1549,6 +1549,33 @@
|
||||||
|
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.@]
|
||||||
|
*/
|
||||||
|
@@ -1557,12 +1584,67 @@
|
||||||
|
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 = 1;
|
||||||
|
+ 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;
|
||||||
|
+
|
||||||
|
+ 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
@@ -1573,12 +1655,75 @@
|
||||||
|
LPWSTR lpAccessName, LPDWORD lpBufferSize,
|
||||||
|
LPDWORD lpResult )
|
||||||
|
{
|
||||||
|
- FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",
|
||||||
|
- hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,
|
||||||
|
- debugstr_w(lpAccessName), lpBufferSize, lpResult );
|
||||||
|
+ DWORD provider;
|
||||||
|
+ DWORD cap;
|
||||||
|
+ char id;
|
||||||
|
+ DWORD drives;
|
||||||
|
+ DWORD ret;
|
||||||
|
+ PF_NPAddConnection3 addConn3;
|
||||||
|
+ PF_NPAddConnection addConn;
|
||||||
|
|
||||||
|
- SetLastError(WN_NO_NETWORK);
|
||||||
|
- return WN_NO_NETWORK;
|
||||||
|
+ if (!providerTable || providerTable->numProviders == 0) {
|
||||||
|
+ SetLastError(WN_NO_NETWORK);
|
||||||
|
+ return WN_NO_NETWORK;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!lpNetResource) {
|
||||||
|
+ SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
+ return ERROR_INVALID_PARAMETER;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!lpNetResource->lpProvider || !*lpNetResource->lpProvider) {
|
||||||
|
+ SetLastError(ERROR_BAD_PROVIDER);
|
||||||
|
+ return ERROR_BAD_PROVIDER;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!lpNetResource->lpLocalName || !*lpNetResource->lpLocalName) {
|
||||||
|
+ SetLastError(ERROR_BAD_DEVICE);
|
||||||
|
+ return ERROR_BAD_DEVICE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ((!(lpNetResource->lpLocalName[0] >= 'a' && lpNetResource->lpLocalName[0] <= 'z') &&
|
||||||
|
+ !(lpNetResource->lpLocalName[0] >= 'A' && lpNetResource->lpLocalName[0] <= 'Z')) ||
|
||||||
|
+ lpNetResource->lpLocalName[1] != ':' || lpNetResource->lpLocalName[2]) {
|
||||||
|
+ SetLastError(ERROR_BAD_DEVICE);
|
||||||
|
+ return ERROR_BAD_DEVICE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ id = (lpNetResource->lpLocalName[0] >= 'a') ? lpNetResource->lpLocalName[0] - 'a' : lpNetResource->lpLocalName[0] - 'A';
|
||||||
|
+ drives = GetLogicalDrives();
|
||||||
|
+ if (drives & (1 << id)) {
|
||||||
|
+ SetLastError(ERROR_ALREADY_ASSIGNED);
|
||||||
|
+ return ERROR_ALREADY_ASSIGNED;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ provider = _findProviderIndexW(lpNetResource->lpProvider);
|
||||||
|
+ if (provider == BAD_PROVIDER_INDEX) {
|
||||||
|
+ SetLastError(ERROR_BAD_PROVIDER);
|
||||||
|
+ return ERROR_BAD_PROVIDER;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ cap = providerTable->table[provider].getCaps(WNNC_CONNECTION);
|
||||||
|
+ if (!(cap & WNNC_CON_ADDCONNECTION) && !(cap & WNNC_CON_ADDCONNECTION3)) {
|
||||||
|
+ SetLastError(ERROR_BAD_PROVIDER);
|
||||||
|
+ return ERROR_BAD_PROVIDER;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = WN_ACCESS_DENIED;
|
||||||
|
+ if (cap & WNNC_CON_ADDCONNECTION3) {
|
||||||
|
+ addConn3 = (PF_NPAddConnection3)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection3");
|
||||||
|
+ if (addConn3) {
|
||||||
|
+ ret = addConn3(hwndOwner, lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID, dwFlags);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else if (cap & WNNC_CON_ADDCONNECTION) {
|
||||||
|
+ addConn = (PF_NPAddConnection)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection");
|
||||||
|
+ if (addConn) {
|
||||||
|
+ ret = addConn(lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
|
|
@ -1549,6 +1549,33 @@ DWORD WINAPI WNetAddConnection3W( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
|
||||||
dwFlags, NULL, 0, NULL);
|
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.@]
|
* WNetUseConnectionA [MPR.@]
|
||||||
*/
|
*/
|
||||||
|
@ -1557,12 +1584,67 @@ DWORD WINAPI WNetUseConnectionA( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
|
||||||
LPSTR lpAccessName, LPDWORD lpBufferSize,
|
LPSTR lpAccessName, LPDWORD lpBufferSize,
|
||||||
LPDWORD lpResult )
|
LPDWORD lpResult )
|
||||||
{
|
{
|
||||||
FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",
|
NETRESOURCEW resourcesW, *pRes = NULL;
|
||||||
hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags,
|
PWSTR passW, userIDW, accessNameW = NULL;
|
||||||
debugstr_a(lpAccessName), lpBufferSize, lpResult );
|
DWORD ret = WN_MORE_DATA;
|
||||||
|
DWORD bufferSize = 1;
|
||||||
|
int len;
|
||||||
|
|
||||||
SetLastError(WN_NO_NETWORK);
|
if (lpNetResource)
|
||||||
return WN_NO_NETWORK;
|
{
|
||||||
|
convert_netresourcea_to_w(lpNetResource, &resourcesW);
|
||||||
|
pRes = &resourcesW;
|
||||||
|
}
|
||||||
|
|
||||||
|
passW = strdupAtoW(lpPassword);
|
||||||
|
userIDW = strdupAtoW(lpUserID);
|
||||||
|
|
||||||
|
if (lpAccessName && lpBufferSize && *lpBufferSize)
|
||||||
|
{
|
||||||
|
WCHAR probe;
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
|
@ -1573,12 +1655,75 @@ DWORD WINAPI WNetUseConnectionW( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
|
||||||
LPWSTR lpAccessName, LPDWORD lpBufferSize,
|
LPWSTR lpAccessName, LPDWORD lpBufferSize,
|
||||||
LPDWORD lpResult )
|
LPDWORD lpResult )
|
||||||
{
|
{
|
||||||
FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",
|
DWORD provider;
|
||||||
hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,
|
DWORD cap;
|
||||||
debugstr_w(lpAccessName), lpBufferSize, lpResult );
|
char id;
|
||||||
|
DWORD drives;
|
||||||
|
DWORD ret;
|
||||||
|
PF_NPAddConnection3 addConn3;
|
||||||
|
PF_NPAddConnection addConn;
|
||||||
|
|
||||||
SetLastError(WN_NO_NETWORK);
|
if (!providerTable || providerTable->numProviders == 0) {
|
||||||
return WN_NO_NETWORK;
|
SetLastError(WN_NO_NETWORK);
|
||||||
|
return WN_NO_NETWORK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lpNetResource) {
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lpNetResource->lpProvider || !*lpNetResource->lpProvider) {
|
||||||
|
SetLastError(ERROR_BAD_PROVIDER);
|
||||||
|
return ERROR_BAD_PROVIDER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lpNetResource->lpLocalName || !*lpNetResource->lpLocalName) {
|
||||||
|
SetLastError(ERROR_BAD_DEVICE);
|
||||||
|
return ERROR_BAD_DEVICE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!(lpNetResource->lpLocalName[0] >= 'a' && lpNetResource->lpLocalName[0] <= 'z') &&
|
||||||
|
!(lpNetResource->lpLocalName[0] >= 'A' && lpNetResource->lpLocalName[0] <= 'Z')) ||
|
||||||
|
lpNetResource->lpLocalName[1] != ':' || lpNetResource->lpLocalName[2]) {
|
||||||
|
SetLastError(ERROR_BAD_DEVICE);
|
||||||
|
return ERROR_BAD_DEVICE;
|
||||||
|
}
|
||||||
|
|
||||||
|
id = (lpNetResource->lpLocalName[0] >= 'a') ? lpNetResource->lpLocalName[0] - 'a' : lpNetResource->lpLocalName[0] - 'A';
|
||||||
|
drives = GetLogicalDrives();
|
||||||
|
if (drives & (1 << id)) {
|
||||||
|
SetLastError(ERROR_ALREADY_ASSIGNED);
|
||||||
|
return ERROR_ALREADY_ASSIGNED;
|
||||||
|
}
|
||||||
|
|
||||||
|
provider = _findProviderIndexW(lpNetResource->lpProvider);
|
||||||
|
if (provider == BAD_PROVIDER_INDEX) {
|
||||||
|
SetLastError(ERROR_BAD_PROVIDER);
|
||||||
|
return ERROR_BAD_PROVIDER;
|
||||||
|
}
|
||||||
|
|
||||||
|
cap = providerTable->table[provider].getCaps(WNNC_CONNECTION);
|
||||||
|
if (!(cap & WNNC_CON_ADDCONNECTION) && !(cap & WNNC_CON_ADDCONNECTION3)) {
|
||||||
|
SetLastError(ERROR_BAD_PROVIDER);
|
||||||
|
return ERROR_BAD_PROVIDER;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = WN_ACCESS_DENIED;
|
||||||
|
if (cap & WNNC_CON_ADDCONNECTION3) {
|
||||||
|
addConn3 = (PF_NPAddConnection3)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection3");
|
||||||
|
if (addConn3) {
|
||||||
|
ret = addConn3(hwndOwner, lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID, dwFlags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (cap & WNNC_CON_ADDCONNECTION) {
|
||||||
|
addConn = (PF_NPAddConnection)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection");
|
||||||
|
if (addConn) {
|
||||||
|
ret = addConn(lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
|
|
Loading…
Reference in a new issue