forked from Mirrors/wine-wine
mpr: Implement WNetGetResourceInformation functions.
parent
6706a1b3fd
commit
7fb98bfba5
146
dlls/mpr/wnet.c
146
dlls/mpr/wnet.c
|
@ -52,6 +52,7 @@ typedef struct _WNetProvider
|
||||||
PF_NPOpenEnum openEnum;
|
PF_NPOpenEnum openEnum;
|
||||||
PF_NPEnumResource enumResource;
|
PF_NPEnumResource enumResource;
|
||||||
PF_NPCloseEnum closeEnum;
|
PF_NPCloseEnum closeEnum;
|
||||||
|
PF_NPGetResourceInformation getResourceInformation;
|
||||||
} WNetProvider, *PWNetProvider;
|
} WNetProvider, *PWNetProvider;
|
||||||
|
|
||||||
typedef struct _WNetProviderTable
|
typedef struct _WNetProviderTable
|
||||||
|
@ -182,6 +183,10 @@ static void _tryLoadProvider(PCWSTR provider)
|
||||||
provider->closeEnum = (PF_NPCloseEnum)
|
provider->closeEnum = (PF_NPCloseEnum)
|
||||||
GetProcAddress(hLib, "NPCloseEnum");
|
GetProcAddress(hLib, "NPCloseEnum");
|
||||||
TRACE("closeEnum is %p\n", provider->closeEnum);
|
TRACE("closeEnum is %p\n", provider->closeEnum);
|
||||||
|
provider->getResourceInformation = (PF_NPGetResourceInformation)
|
||||||
|
GetProcAddress(hLib, "NPGetResourceInformation");
|
||||||
|
TRACE("getResourceInformation is %p\n",
|
||||||
|
provider->getResourceInformation);
|
||||||
if (!provider->openEnum || !provider->enumResource
|
if (!provider->openEnum || !provider->enumResource
|
||||||
|| !provider->closeEnum)
|
|| !provider->closeEnum)
|
||||||
{
|
{
|
||||||
|
@ -1281,30 +1286,157 @@ DWORD WINAPI WNetCloseEnum( HANDLE hEnum )
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* WNetGetResourceInformationA [MPR.@]
|
* WNetGetResourceInformationA [MPR.@]
|
||||||
|
*
|
||||||
|
* See WNetGetResourceInformationW
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI WNetGetResourceInformationA( LPNETRESOURCEA lpNetResource,
|
DWORD WINAPI WNetGetResourceInformationA( LPNETRESOURCEA lpNetResource,
|
||||||
LPVOID lpBuffer, LPDWORD cbBuffer,
|
LPVOID lpBuffer, LPDWORD cbBuffer,
|
||||||
LPSTR *lplpSystem )
|
LPSTR *lplpSystem )
|
||||||
{
|
{
|
||||||
FIXME( "(%p, %p, %p, %p): stub\n",
|
DWORD ret;
|
||||||
|
|
||||||
|
TRACE( "(%p, %p, %p, %p)\n",
|
||||||
lpNetResource, lpBuffer, cbBuffer, lplpSystem );
|
lpNetResource, lpBuffer, cbBuffer, lplpSystem );
|
||||||
|
|
||||||
SetLastError(WN_NO_NETWORK);
|
if (!providerTable || providerTable->numProviders == 0)
|
||||||
return WN_NO_NETWORK;
|
ret = WN_NO_NETWORK;
|
||||||
|
else if (lpNetResource)
|
||||||
|
{
|
||||||
|
LPNETRESOURCEW lpNetResourceW = NULL;
|
||||||
|
DWORD size = 1024, count = 1;
|
||||||
|
DWORD len;
|
||||||
|
|
||||||
|
lpNetResourceW = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
ret = _thunkNetResourceArrayAToW(lpNetResource, &count, lpNetResourceW, &size);
|
||||||
|
if (ret == WN_MORE_DATA)
|
||||||
|
{
|
||||||
|
lpNetResourceW = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
if (lpNetResourceW)
|
||||||
|
ret = _thunkNetResourceArrayAToW(lpNetResource,
|
||||||
|
&count, lpNetResourceW, &size);
|
||||||
|
else
|
||||||
|
ret = WN_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (ret == WN_SUCCESS)
|
||||||
|
{
|
||||||
|
LPWSTR lpSystemW;
|
||||||
|
LPVOID lpBufferW;
|
||||||
|
size = 1024;
|
||||||
|
lpBufferW = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
if (lpBufferW)
|
||||||
|
{
|
||||||
|
ret = WNetGetResourceInformationW(lpNetResourceW,
|
||||||
|
lpBufferW, &size, &lpSystemW);
|
||||||
|
if (ret == WN_MORE_DATA)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, lpBufferW);
|
||||||
|
lpBufferW = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
if (lpBufferW)
|
||||||
|
ret = WNetGetResourceInformationW(lpNetResourceW,
|
||||||
|
lpBufferW, &size, &lpSystemW);
|
||||||
|
else
|
||||||
|
ret = WN_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (ret == WN_SUCCESS)
|
||||||
|
{
|
||||||
|
ret = _thunkNetResourceArrayWToA(lpBufferW,
|
||||||
|
&count, lpBuffer, cbBuffer);
|
||||||
|
lpNetResourceW = lpBufferW;
|
||||||
|
size = sizeof(NETRESOURCEA);
|
||||||
|
size += WideCharToMultiByte(CP_ACP, 0, lpNetResourceW->lpRemoteName,
|
||||||
|
-1, NULL, 0, NULL, NULL);
|
||||||
|
size += WideCharToMultiByte(CP_ACP, 0, lpNetResourceW->lpProvider,
|
||||||
|
-1, NULL, 0, NULL, NULL);
|
||||||
|
|
||||||
|
len = WideCharToMultiByte(CP_ACP, 0, lpSystemW,
|
||||||
|
-1, NULL, 0, NULL, NULL);
|
||||||
|
if ((len) && ( size + len < *cbBuffer))
|
||||||
|
{
|
||||||
|
*lplpSystem = (char*)lpBuffer + *cbBuffer - len;
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, lpSystemW, -1,
|
||||||
|
*lplpSystem, len, NULL, NULL);
|
||||||
|
ret = WN_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = WN_MORE_DATA;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = WN_OUT_OF_MEMORY;
|
||||||
|
HeapFree(GetProcessHeap(), 0, lpBufferW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = WN_OUT_OF_MEMORY;
|
||||||
|
HeapFree(GetProcessHeap(), 0, lpSystemW);
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, lpNetResourceW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ret = WN_NO_NETWORK;
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
SetLastError(ret);
|
||||||
|
TRACE("Returning %d\n", ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* WNetGetResourceInformationW [MPR.@]
|
* WNetGetResourceInformationW [MPR.@]
|
||||||
|
*
|
||||||
|
* WNetGetResourceInformationW function identifies the network provider
|
||||||
|
* that owns the resource and gets information about the type of the resource.
|
||||||
|
*
|
||||||
|
* PARAMS:
|
||||||
|
* lpNetResource [ I] the pointer to NETRESOURCEW structure, that
|
||||||
|
* defines a network resource.
|
||||||
|
* lpBuffer [ O] the pointer to buffer, containing result. It
|
||||||
|
* contains NETRESOURCEW structure and strings to
|
||||||
|
* which the members of the NETRESOURCEW structure
|
||||||
|
* point.
|
||||||
|
* cbBuffer [I/O] the pointer to DWORD number - size of buffer
|
||||||
|
* in bytes.
|
||||||
|
* lplpSystem [ O] the pointer to string in the output buffer,
|
||||||
|
* containing the part of the resource name without
|
||||||
|
* names of the server and share.
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* NO_ERROR if the function succeeds. System error code if the function fails.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DWORD WINAPI WNetGetResourceInformationW( LPNETRESOURCEW lpNetResource,
|
DWORD WINAPI WNetGetResourceInformationW( LPNETRESOURCEW lpNetResource,
|
||||||
LPVOID lpBuffer, LPDWORD cbBuffer,
|
LPVOID lpBuffer, LPDWORD cbBuffer,
|
||||||
LPWSTR *lplpSystem )
|
LPWSTR *lplpSystem )
|
||||||
{
|
{
|
||||||
FIXME( "(%p, %p, %p, %p): stub\n",
|
DWORD ret = WN_NO_NETWORK;
|
||||||
lpNetResource, lpBuffer, cbBuffer, lplpSystem );
|
DWORD index;
|
||||||
|
|
||||||
SetLastError(WN_NO_NETWORK);
|
TRACE( "(%p, %p, %p, %p): stub\n",
|
||||||
return WN_NO_NETWORK;
|
lpNetResource, lpBuffer, cbBuffer, lplpSystem);
|
||||||
|
|
||||||
|
if (!(lpBuffer))
|
||||||
|
ret = WN_OUT_OF_MEMORY;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* FIXME: For function value of a variable is indifferent, it does
|
||||||
|
* search of all providers in a network.
|
||||||
|
*/
|
||||||
|
for (index = 0; index < providerTable->numProviders; index++)
|
||||||
|
{
|
||||||
|
if(providerTable->table[index].getCaps(WNNC_DIALOG) &
|
||||||
|
WNNC_DLG_GETRESOURCEINFORMATION)
|
||||||
|
{
|
||||||
|
if (providerTable->table[index].getResourceInformation)
|
||||||
|
ret = providerTable->table[index].getResourceInformation(
|
||||||
|
lpNetResource, lpBuffer, cbBuffer, lplpSystem);
|
||||||
|
else
|
||||||
|
ret = WN_NO_NETWORK;
|
||||||
|
if (ret == WN_SUCCESS)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ret)
|
||||||
|
SetLastError(ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
|
|
|
@ -70,6 +70,8 @@ typedef DWORD (APIENTRY *PF_NPOpenEnum)(DWORD dwScope, DWORD dwType, DWORD dwUsa
|
||||||
typedef DWORD (APIENTRY *PF_NPEnumResource)(HANDLE hEnum, LPDWORD lpcCount,
|
typedef DWORD (APIENTRY *PF_NPEnumResource)(HANDLE hEnum, LPDWORD lpcCount,
|
||||||
LPVOID lpBuffer, LPDWORD lpBufferSize);
|
LPVOID lpBuffer, LPDWORD lpBufferSize);
|
||||||
typedef DWORD (APIENTRY *PF_NPCloseEnum)(HANDLE hEnum);
|
typedef DWORD (APIENTRY *PF_NPCloseEnum)(HANDLE hEnum);
|
||||||
|
typedef DWORD (APIENTRY *PF_NPGetResourceInformation)(LPNETRESOURCEW lpNetResource,
|
||||||
|
LPVOID lpBuffer, LPDWORD lpcbBuffer, LPWSTR* lplpSystem);
|
||||||
|
|
||||||
/* connection-related */
|
/* connection-related */
|
||||||
typedef DWORD (APIENTRY *PF_NPAddConnection)(LPNETRESOURCEW lpNetResource,
|
typedef DWORD (APIENTRY *PF_NPAddConnection)(LPNETRESOURCEW lpNetResource,
|
||||||
|
|
Loading…
Reference in New Issue