371 lines
9.8 KiB
C++
371 lines
9.8 KiB
C++
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// File: util.cpp
|
||
|
//
|
||
|
// Module: CMPROXY.DLL (TOOL)
|
||
|
//
|
||
|
// Synopsis: Utility functions for IE proxy setting connect action.
|
||
|
//
|
||
|
// Copyright (c) 1999 Microsoft Corporation
|
||
|
//
|
||
|
// Author: quintinb Created 10/27/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
|
||
|
#include "pch.h"
|
||
|
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetBrowserVersion
|
||
|
//
|
||
|
// Synopsis: This function returns the version of IE currently installed by
|
||
|
// using the DllGetVersion function of shdocvw.dll. This is the
|
||
|
// IE team recommended way of determining the current version of
|
||
|
// Internet Explorer.
|
||
|
//
|
||
|
// Arguments: DLLVERSIONINFO* pDllVersionInfo - structure for determining the
|
||
|
// version of shdocvw.dll.
|
||
|
//
|
||
|
// Returns: HRESULT - Standard COM error codes
|
||
|
//
|
||
|
// History: quintinb Created 10/27/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
HRESULT GetBrowserVersion(DLLVERSIONINFO* pDllVersionInfo)
|
||
|
{
|
||
|
HINSTANCE hBrowser;
|
||
|
HRESULT hr = E_FAIL;
|
||
|
|
||
|
//
|
||
|
// Load the DLL
|
||
|
//
|
||
|
|
||
|
hBrowser = LoadLibrary("shdocvw.dll");
|
||
|
|
||
|
if (hBrowser)
|
||
|
{
|
||
|
DLLGETVERSIONPROC pDllGetVersion;
|
||
|
|
||
|
//
|
||
|
// Load the version proc
|
||
|
//
|
||
|
|
||
|
pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hBrowser, "DllGetVersion");
|
||
|
|
||
|
if (pDllGetVersion)
|
||
|
{
|
||
|
ZeroMemory(pDllVersionInfo, sizeof(DLLVERSIONINFO));
|
||
|
pDllVersionInfo->cbSize = sizeof(DLLVERSIONINFO);
|
||
|
hr = (*pDllGetVersion)(pDllVersionInfo);
|
||
|
}
|
||
|
|
||
|
FreeLibrary(hBrowser);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Borrowed from cmdl32.exe
|
||
|
//
|
||
|
|
||
|
#define MAX_CMD_ARGS 15
|
||
|
|
||
|
typedef enum _CMDLN_STATE
|
||
|
{
|
||
|
CS_END_SPACE, // done handling a space
|
||
|
CS_BEGIN_QUOTE, // we've encountered a begin quote
|
||
|
CS_END_QUOTE, // we've encountered a end quote
|
||
|
CS_CHAR, // we're scanning chars
|
||
|
CS_DONE
|
||
|
} CMDLN_STATE;
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetCmArgV
|
||
|
//
|
||
|
// Synopsis: Simulates ArgV using GetCommandLine
|
||
|
//
|
||
|
// Arguments: LPTSTR pszCmdLine - Ptr to a copy of the command line to be processed
|
||
|
//
|
||
|
// Returns: LPTSTR * - Ptr to a ptr array containing the arguments. Caller is
|
||
|
// responsible for releasing memory.
|
||
|
//
|
||
|
// History: nickball Created 4/9/98
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
LPTSTR *GetCmArgV(LPTSTR pszCmdLine)
|
||
|
{
|
||
|
MYDBGASSERT(pszCmdLine);
|
||
|
|
||
|
if (NULL == pszCmdLine || NULL == pszCmdLine[0])
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Allocate Ptr array, up to MAX_CMD_ARGS ptrs
|
||
|
//
|
||
|
|
||
|
LPTSTR *ppCmArgV = (LPTSTR *) CmMalloc(sizeof(LPTSTR) * MAX_CMD_ARGS);
|
||
|
|
||
|
if (NULL == ppCmArgV)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Declare locals
|
||
|
//
|
||
|
|
||
|
LPTSTR pszCurr;
|
||
|
LPTSTR pszNext;
|
||
|
LPTSTR pszToken;
|
||
|
CMDLN_STATE state;
|
||
|
state = CS_CHAR;
|
||
|
int ndx = 0;
|
||
|
|
||
|
//
|
||
|
// Parse out pszCmdLine and store pointers in ppCmArgV
|
||
|
//
|
||
|
|
||
|
pszCurr = pszToken = pszCmdLine;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
switch (*pszCurr)
|
||
|
{
|
||
|
case TEXT(' '):
|
||
|
if (state == CS_CHAR)
|
||
|
{
|
||
|
//
|
||
|
// We found a token
|
||
|
//
|
||
|
|
||
|
pszNext = CharNext(pszCurr);
|
||
|
*pszCurr = TEXT('\0');
|
||
|
|
||
|
ppCmArgV[ndx] = pszToken;
|
||
|
ndx++;
|
||
|
|
||
|
pszCurr = pszToken = pszNext;
|
||
|
state = CS_END_SPACE;
|
||
|
continue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (state == CS_END_SPACE || state == CS_END_QUOTE)
|
||
|
{
|
||
|
pszToken = CharNext(pszToken);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case TEXT('\"'):
|
||
|
if (state == CS_BEGIN_QUOTE)
|
||
|
{
|
||
|
//
|
||
|
// We found a token
|
||
|
//
|
||
|
pszNext = CharNext(pszCurr);
|
||
|
*pszCurr = TEXT('\0');
|
||
|
|
||
|
//
|
||
|
// skip the opening quote
|
||
|
//
|
||
|
pszToken = CharNext(pszToken);
|
||
|
|
||
|
ppCmArgV[ndx] = pszToken;
|
||
|
ndx++;
|
||
|
|
||
|
pszCurr = pszToken = pszNext;
|
||
|
|
||
|
state = CS_END_QUOTE;
|
||
|
continue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
state = CS_BEGIN_QUOTE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case TEXT('\0'):
|
||
|
if (state != CS_END_QUOTE)
|
||
|
{
|
||
|
//
|
||
|
// End of the line, set last token
|
||
|
//
|
||
|
|
||
|
ppCmArgV[ndx] = pszToken;
|
||
|
}
|
||
|
state = CS_DONE;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
if (state == CS_END_SPACE || state == CS_END_QUOTE)
|
||
|
{
|
||
|
state = CS_CHAR;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pszCurr = CharNext(pszCurr);
|
||
|
} while (state != CS_DONE);
|
||
|
|
||
|
return ppCmArgV;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: UseVpnName
|
||
|
//
|
||
|
// Synopsis: This function loads rasapi32.dll and enumerates the active
|
||
|
// RAS connections using RasEnumConnections to see if the given
|
||
|
// connectoid name is found. If it is then it returns TRUE, implying
|
||
|
// that the alternate name passed in should be used instead of the
|
||
|
// regular connectoid name (ie. the tunnel connectoid name exists,
|
||
|
// therefore you are tunneling).
|
||
|
//
|
||
|
// Arguments: LPSTR pszAltName -
|
||
|
//
|
||
|
// Returns: BOOL - return TRUE if the VPN connectoid should be used instead
|
||
|
// of the regular dialup connectoid.
|
||
|
//
|
||
|
// History: quintinb Created 10/28/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
BOOL UseVpnName(LPSTR pszAltName)
|
||
|
{
|
||
|
BOOL bReturn = FALSE;
|
||
|
|
||
|
//
|
||
|
// Load RAS
|
||
|
//
|
||
|
HINSTANCE hRas = LoadLibrary("rasapi32.dll");
|
||
|
|
||
|
if (hRas)
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Load RasEnumConnections
|
||
|
//
|
||
|
typedef DWORD (WINAPI* pfnRasEnumConnectionsSpec)(LPRASCONNA, LPDWORD, LPDWORD);
|
||
|
|
||
|
pfnRasEnumConnectionsSpec pfnRasEnumConnections = NULL;
|
||
|
pfnRasEnumConnections = (pfnRasEnumConnectionsSpec)GetProcAddress(hRas, "RasEnumConnectionsA");
|
||
|
|
||
|
if (pfnRasEnumConnections)
|
||
|
{
|
||
|
LPRASCONN pRasConn = NULL;
|
||
|
DWORD dwSize = 2*sizeof(RASCONN);
|
||
|
DWORD dwNum = 0;
|
||
|
DWORD dwResult = 0;
|
||
|
|
||
|
//
|
||
|
// Get a list of Active Connections
|
||
|
//
|
||
|
do
|
||
|
{
|
||
|
CmFree(pRasConn);
|
||
|
pRasConn = (LPRASCONN)CmMalloc(dwSize);
|
||
|
|
||
|
if (pRasConn)
|
||
|
{
|
||
|
pRasConn[0].dwSize = sizeof(RASCONN);
|
||
|
dwResult = (pfnRasEnumConnections)(pRasConn, &dwSize, &dwNum);
|
||
|
}
|
||
|
|
||
|
} while (ERROR_INSUFFICIENT_BUFFER == dwResult);
|
||
|
|
||
|
//
|
||
|
// Search for the name passed in
|
||
|
//
|
||
|
if (ERROR_SUCCESS == dwResult)
|
||
|
{
|
||
|
for (DWORD dwIndex = 0; dwIndex < dwNum; dwIndex++)
|
||
|
{
|
||
|
if (0 == lstrcmpi(pszAltName, pRasConn[dwIndex].szEntryName))
|
||
|
{
|
||
|
//
|
||
|
// Then the Tunnel Name is active and that should be used for
|
||
|
// the proxy
|
||
|
//
|
||
|
bReturn = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CmFree(pRasConn);
|
||
|
}
|
||
|
|
||
|
FreeLibrary (hRas);
|
||
|
}
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: GetString
|
||
|
//
|
||
|
// Synopsis: Wrapper for GetPrivateProfileString that takes care of allocating
|
||
|
// memory (using CmMalloc) correctly. GetString will max sure to
|
||
|
// allocate enough memory for the string (1MB is used as a sanity
|
||
|
// check, no string should be that large and GetString will stop
|
||
|
// trying to allocate memory at that point). Please note that it is
|
||
|
// the callers responsibility to free the allocated memory.
|
||
|
//
|
||
|
// Arguments: LPCSTR pszSection - Section name
|
||
|
// LPCSTR pszKey - Key name
|
||
|
// LPSTR* ppString - string pointer to fill with the memory
|
||
|
// containing the requested string
|
||
|
// LPCSTR pszFile - File to retrieve info from
|
||
|
//
|
||
|
// Returns: Nothing
|
||
|
//
|
||
|
// History: quintinb Created 10/28/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
void GetString(LPCSTR pszSection, LPCSTR pszKey, LPSTR* ppString, LPCSTR pszFile)
|
||
|
{
|
||
|
DWORD dwTemp;
|
||
|
DWORD dwSize = MAX_PATH;
|
||
|
BOOL bExit = FALSE;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
CmFree(*ppString);
|
||
|
*ppString = (CHAR*)CmMalloc(dwSize);
|
||
|
|
||
|
if (*ppString)
|
||
|
{
|
||
|
dwTemp = GetPrivateProfileString(pszSection, pszKey, "",
|
||
|
*ppString, dwSize, pszFile);
|
||
|
|
||
|
if (((dwSize - 1) == dwTemp) && (1024*1024 > dwSize))
|
||
|
{
|
||
|
//
|
||
|
// Buffer too small, lets try again.
|
||
|
//
|
||
|
dwSize = 2*dwSize;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bExit = TRUE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bExit = TRUE;
|
||
|
}
|
||
|
|
||
|
} while (!bExit);
|
||
|
|
||
|
}
|