mirror of
https://github.com/reactos/reactos.git
synced 2024-08-08 12:18:13 +00:00
[MPR]
Import Wine commit: - d070c263adf840cc14dde84eb8e73b04490d1900, Partially implement WNetUseConnectionW(). This reduces diff to Wine, by providing a cleaner implementation of WNetUseConnectionW(). CORE-10032 svn path=/trunk/; revision=70755
This commit is contained in:
parent
f873af4b21
commit
eacfcdff7c
|
@ -156,84 +156,3 @@ Index: wnet.c
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
@@ -1577,12 +1659,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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************
|
|
||||||
|
|
|
@ -1654,77 +1654,76 @@ DWORD WINAPI WNetUseConnectionA( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
|
||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
* WNetUseConnectionW [MPR.@]
|
* WNetUseConnectionW [MPR.@]
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI WNetUseConnectionW( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
|
DWORD WINAPI WNetUseConnectionW( HWND hwndOwner, NETRESOURCEW *resource, LPCWSTR password,
|
||||||
LPCWSTR lpPassword, LPCWSTR lpUserID, DWORD dwFlags,
|
LPCWSTR userid, DWORD flags, LPWSTR accessname, DWORD *buffer_size, DWORD *result )
|
||||||
LPWSTR lpAccessName, LPDWORD lpBufferSize,
|
|
||||||
LPDWORD lpResult )
|
|
||||||
{
|
{
|
||||||
DWORD provider;
|
WNetProvider *provider;
|
||||||
DWORD cap;
|
DWORD index, ret, caps;
|
||||||
char id;
|
|
||||||
DWORD drives;
|
|
||||||
DWORD ret;
|
|
||||||
PF_NPAddConnection3 addConn3;
|
|
||||||
PF_NPAddConnection addConn;
|
|
||||||
|
|
||||||
if (!providerTable || providerTable->numProviders == 0) {
|
TRACE( "(%p, %p, %p, %s, 0x%08X, %p, %p, %p)\n",
|
||||||
SetLastError(WN_NO_NETWORK);
|
hwndOwner, resource, password, debugstr_w(userid), flags,
|
||||||
|
accessname, buffer_size, result );
|
||||||
|
|
||||||
|
if (!providerTable || providerTable->numProviders == 0)
|
||||||
|
return WN_NO_NETWORK;
|
||||||
|
|
||||||
|
if (!resource)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (!resource->lpProvider)
|
||||||
|
{
|
||||||
|
FIXME("Networking provider selection is not implemented.\n");
|
||||||
return WN_NO_NETWORK;
|
return WN_NO_NETWORK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lpNetResource) {
|
if (!resource->lpLocalName && (flags & CONNECT_REDIRECT))
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
{
|
||||||
return ERROR_INVALID_PARAMETER;
|
FIXME("Locale device selection is not implemented.\n");
|
||||||
|
return WN_NO_NETWORK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lpNetResource->lpProvider || !*lpNetResource->lpProvider) {
|
if (flags & CONNECT_INTERACTIVE)
|
||||||
SetLastError(ERROR_BAD_PROVIDER);
|
return ERROR_BAD_NET_NAME;
|
||||||
|
|
||||||
|
index = _findProviderIndexW(resource->lpProvider);
|
||||||
|
if (index == BAD_PROVIDER_INDEX)
|
||||||
return ERROR_BAD_PROVIDER;
|
return ERROR_BAD_PROVIDER;
|
||||||
}
|
|
||||||
|
|
||||||
if (!lpNetResource->lpLocalName || !*lpNetResource->lpLocalName) {
|
provider = &providerTable->table[index];
|
||||||
SetLastError(ERROR_BAD_DEVICE);
|
caps = provider->getCaps(WNNC_CONNECTION);
|
||||||
return ERROR_BAD_DEVICE;
|
if (!(caps & (WNNC_CON_ADDCONNECTION | WNNC_CON_ADDCONNECTION3)))
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
return ERROR_BAD_PROVIDER;
|
||||||
}
|
|
||||||
|
|
||||||
cap = providerTable->table[provider].getCaps(WNNC_CONNECTION);
|
if (accessname && buffer_size && *buffer_size)
|
||||||
if (!(cap & WNNC_CON_ADDCONNECTION) && !(cap & WNNC_CON_ADDCONNECTION3)) {
|
{
|
||||||
SetLastError(ERROR_BAD_PROVIDER);
|
DWORD len;
|
||||||
return ERROR_BAD_PROVIDER;
|
|
||||||
|
if (resource->lpLocalName)
|
||||||
|
len = strlenW(resource->lpLocalName);
|
||||||
|
else
|
||||||
|
len = strlenW(resource->lpRemoteName);
|
||||||
|
|
||||||
|
if (++len > *buffer_size)
|
||||||
|
{
|
||||||
|
*buffer_size = len;
|
||||||
|
return ERROR_MORE_DATA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
accessname = NULL;
|
||||||
|
|
||||||
ret = WN_ACCESS_DENIED;
|
ret = WN_ACCESS_DENIED;
|
||||||
if (cap & WNNC_CON_ADDCONNECTION3) {
|
if ((caps & WNNC_CON_ADDCONNECTION3) && provider->addConnection3)
|
||||||
addConn3 = (PF_NPAddConnection3)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection3");
|
ret = provider->addConnection3(hwndOwner, resource, (LPWSTR)password, (LPWSTR)userid, flags);
|
||||||
if (addConn3) {
|
else if ((caps & WNNC_CON_ADDCONNECTION) && provider->addConnection)
|
||||||
ret = addConn3(hwndOwner, lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID, dwFlags);
|
ret = provider->addConnection(resource, (LPWSTR)password, (LPWSTR)userid);
|
||||||
}
|
|
||||||
}
|
if (ret == WN_SUCCESS && accessname)
|
||||||
else if (cap & WNNC_CON_ADDCONNECTION) {
|
{
|
||||||
addConn = (PF_NPAddConnection)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection");
|
if (resource->lpLocalName)
|
||||||
if (addConn) {
|
strcpyW(accessname, resource->lpLocalName);
|
||||||
ret = addConn(lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID);
|
else
|
||||||
}
|
strcpyW(accessname, resource->lpRemoteName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in a new issue