//+---------------------------------------------------------------------------- // // 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); }