|
|
//+-------------------------------------------------------------------------
//
// 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_
|