windows-nt/Source/XPSP1/NT/com/ole32/dcomss/olescm/net.cxx
2020-09-26 16:20:57 +08:00

236 lines
5.6 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996.
//
// File: net.cxx
//
// Contents:
// Net helper functions.
//
// History:
//--------------------------------------------------------------------------
#include "act.hxx"
#if 1 // #ifndef _CHICAGO_
DWORD APIENTRY ScmWNetGetUniversalName(
LPCWSTR lpLocalPath,
DWORD dwInfoLevel,
LPVOID lpBuffer,
LPDWORD lpBufferSize
)
{
static GET_UNIVERSAL_NAME_FUNC pfnWNetGetUniversalName = 0;
HINSTANCE hLib;
if ( pfnWNetGetUniversalName == 0 )
{
hLib = LoadLibraryT( TEXT("mpr.dll") );
if ( ! hLib )
return GetLastError();
pfnWNetGetUniversalName =
(GET_UNIVERSAL_NAME_FUNC) GetProcAddress( hLib, "WNetGetUniversalNameW" );
if ( pfnWNetGetUniversalName == 0 )
return GetLastError();
}
return (*pfnWNetGetUniversalName)( lpLocalPath, dwInfoLevel, lpBuffer, lpBufferSize );
}
NET_API_STATUS NET_API_FUNCTION ScmNetShareGetInfo(
LPTSTR servername,
LPTSTR netname,
DWORD level,
LPBYTE *bufptr
)
{
static NET_SHARE_GET_INFO_FUNC pfnNetShareGetInfo = 0;
HINSTANCE hLib;
if ( pfnNetShareGetInfo == 0 )
{
hLib = LoadLibraryT( TEXT("netapi32.dll") );
if ( ! hLib )
return GetLastError();
pfnNetShareGetInfo =
(NET_SHARE_GET_INFO_FUNC) GetProcAddress( hLib, "NetShareGetInfo" );
if ( pfnNetShareGetInfo == 0 )
return GetLastError();
}
return (*pfnNetShareGetInfo)( servername, netname, level, bufptr );
}
HRESULT ScmGetUniversalName(
LPCWSTR lpLocalPath, // original path
LPWSTR lpBuffer, // buffer for UNC path
LPDWORD lpBufferSize // size of buffer in WCHARs
)
{
// The local path is assumed to be absolute -- either UNC or drive-based
if (lpLocalPath[0] == L'\\' && lpLocalPath[1] == L'\\') // UNC path
{
DWORD dwLocal = lstrlenW(lpLocalPath);
if (*lpBufferSize - dwLocal > 0)
{
lstrcpyW(lpBuffer,lpLocalPath);
return NO_ERROR;
}
else
{
*lpBufferSize = dwLocal + 1;
return ERROR_MORE_DATA;
}
}
else if (lpLocalPath[1] == L':' && lpLocalPath[2] == L'\\') // drive-based path
{
WCHAR drive[3];
drive[0] = lpLocalPath[0];
drive[1] = L':';
drive[2] = 0;
WCHAR remConnection[MAX_PATH+1];
WCHAR *pszPath = remConnection;
DWORD dwSize = (MAX_PATH+1) * sizeof(WCHAR);
DWORD Status = OleWNetGetConnection(drive, pszPath, &dwSize);
if (Status != NO_ERROR)
{
return CO_E_BAD_PATH;
}
lpLocalPath += 2;
DWORD dwNetLength = lstrlenW(pszPath);
DWORD dwFullLength = dwNetLength + lstrlenW(lpLocalPath);
if (*lpBufferSize - dwFullLength > 0)
{
lstrcpyW(lpBuffer,pszPath);
lpBuffer += dwNetLength;
lstrcpyW(lpBuffer,lpLocalPath);
return NO_ERROR;
}
else
{
*lpBufferSize = dwFullLength + 1;
return ERROR_MORE_DATA;
}
}
else
{
return CO_E_BAD_PATH;
}
}
#else // _CHICAGO_
// From objex, which doesn't have shared source code for NT & win9x.
RPC_STATUS
IP_BuildAddressVector(
OUT NETWORK_ADDRESS_VECTOR **ppAddressVector
)
/*++
Routine Description:
Builds a vector of IP addresses supported by this machine.
Arguments:
ppAddressVector - A place to store the vector.
Return Value:
RPC_S_OK
RPC_S_OUT_OF_MEMORY
RPC_S_OUT_OF_RESOURCES
--*/
{
// Figure out all of our IP addresses
CHAR hostname[IP_MAXIMUM_PRETTY_NAME];
PHOSTENT phostent;
UINT i;
if (gethostname(hostname, IP_MAXIMUM_PRETTY_NAME) != 0)
{
return(RPC_S_OUT_OF_RESOURCES);
}
if ( (phostent = gethostbyname(hostname)) == 0)
{
return(RPC_S_OUT_OF_RESOURCES);
}
// Count ip addresses
UINT cAddrs = 0;
while(phostent->h_addr_list[cAddrs])
cAddrs++;
NETWORK_ADDRESS_VECTOR *pVector;
pVector = (NETWORK_ADDRESS_VECTOR *)
PrivMemAlloc( sizeof(NETWORK_ADDRESS_VECTOR)
+ (cAddrs * sizeof(WCHAR *))
+ (cAddrs * IP_MAXIMUM_RAW_NAME * sizeof(WCHAR)) );
if (pVector == NULL)
{
return(RPC_S_OUT_OF_MEMORY);
}
pVector->Count = 0;
pVector->NetworkAddresses = (WCHAR **) &pVector[1];
pVector->NetworkAddresses[0] = (WCHAR *)&pVector->NetworkAddresses[cAddrs];
char * pszAddress;
int Status;
for ( i = 0; (i < cAddrs) && (phostent->h_addr_list[i]); i++ )
{
pszAddress = inet_ntoa(*(struct in_addr *)phostent->h_addr_list[i]);
Status = MultiByteToWideChar(
CP_ACP,
0,
pszAddress,
-1,
pVector->NetworkAddresses[i],
IP_MAXIMUM_RAW_NAME
);
if ( 0 == Status )
{
PrivMemFree(pVector);
return(RPC_S_OUT_OF_RESOURCES);
}
pVector->Count++;
if (i != cAddrs - 1)
{
// Setup for next address, if any
pVector->NetworkAddresses[i+1] = pVector->NetworkAddresses[i];
pVector->NetworkAddresses[i+1] += lstrlenW(pVector->NetworkAddresses[i]) + 1;
}
}
*ppAddressVector = pVector;
return(RPC_S_OK);
}
#endif // _CHICAGO_