|
|
// proxy.cpp
//
#include "stdpch.h"
#pragma hdrstop
#include "host.h" // CHost
#include "output.h" // COutput
#define SECURITY_WIN32
#include "sspi.h"
#include "secext.h"
#include "proxy.h"
#include "tchar.h"
const TCHAR szFileVersion[] = TEXT("FileVersion");
BOOL GetRegEntry(HKEY hKey, LPCWSTR lpValueName, LPBYTE *lpData) { DWORD dwSize = 256; DWORD dwRetVal = 0; DWORD dwType = 0;
if( !lpData ) { return FALSE; }
do { if( *lpData == NULL ) { *lpData = (LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSize); if( !lpData ) { return FALSE; } } else { LPBYTE pTmp; pTmp = (LPBYTE)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,*lpData,dwSize); if( pTmp ) { *lpData = pTmp; } else { return FALSE; } }
dwRetVal = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, (LPBYTE)*lpData, &dwSize); switch(dwRetVal) { case ERROR_SUCCESS: return TRUE; case ERROR_MORE_DATA: break; default: return FALSE; }
} while(TRUE);
return TRUE; }
BOOL EXPORT FindProxy(CHost* pProxy, LPDWORD pdwPort, LPDWORD pdwEnabled) { auto_reg regIe; LONG l; TCHAR szBuffer[256]; DWORD dwType; DWORD dwEnabled; DWORD cbBuffer; UINT cbVer; LPTSTR pszSearch; LPTSTR pszStart; LPVOID lpVerData; DWORD dwVerInfo; VS_FIXEDFILEINFO *lpFFI; HKEY hKeyRoot = NULL; LPTSTR pszIExplore, pszEnd; LPTSTR pszSubKey; auto_reg regApps; LPTSTR pszBuffer = NULL;
// Find what version of IE we have, so we can figure out where they hide the
// proxy info.
// So where o where do iexplore live, eh?
// Try in the millenium place
l = RegOpenKeyEx( HKEY_CLASSES_ROOT, TEXT("Applications\\iexplore.exe\\shell\\open\\command"), 0, KEY_READ, ®Apps);
if (l == ERROR_FILE_NOT_FOUND) { l = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Classes\\Applications\\iexplore.exe\\shell\\open\\command"), 0, KEY_READ, ®Apps); }
if (S_OK != l) goto Error;
if( !GetRegEntry(regApps,L"",(LPBYTE*)&pszBuffer) ) { goto Error; } /*
cbBuffer = sizeof(szBuffer);
l = RegQueryValueEx(regApps, regApps, TEXT(""), NULL, // reserved
&dwType, (LPBYTE)&szBuffer[0], &cbBuffer);
if (S_OK != l) goto Error;
// strip the quotes out
pszIExplore = szBuffer; */ pszIExplore = pszBuffer;
while (*pszIExplore == '\"') { ++pszIExplore; }
pszEnd = pszIExplore;
while (*pszEnd && *pszEnd != '\"') { ++pszEnd; } *pszEnd = '\0';
DWORD dwNoIdea=0; if (dwVerInfo = GetFileVersionInfoSize(pszIExplore, &dwNoIdea)) { lpVerData = _alloca(dwVerInfo);
if (GetFileVersionInfo(pszIExplore, 0, dwVerInfo, lpVerData)) { VerQueryValue(lpVerData, TEXT("\\"), (LPVOID*)&lpFFI, &cbVer);
// For now we will assume that the proxy settings will not change for for later version of
// IE. It might be good to get the location of the proxy using api calls
if (HIWORD(lpFFI->dwFileVersionMS) >= 5) { hKeyRoot = HKEY_CURRENT_USER; pszSubKey = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"); } } }
dwVerInfo = GetLastError();
// HKCU is not dynamic, so close the current one
if (hKeyRoot == HKEY_CURRENT_USER) RegCloseKey(hKeyRoot);
if( !hKeyRoot ) { // We did not get a key, something went wrong, abort
//
goto Error; }
l = RegOpenKeyEx( hKeyRoot, pszSubKey, 0, KEY_READ, ®Ie);
if (S_OK != l) goto Error;
//cbBuffer = sizeof(szBuffer);
//dwType = REG_SZ;
if( !GetRegEntry(regIe,TEXT("ProxyServer"),(LPBYTE*)&pszBuffer) ) { goto Error; } //pszSearch = _tcsstr(pszBuffer, TEXT("http://"));
pszSearch = _tcsstr(pszBuffer, TEXT("://")); if (pszSearch) { pszSearch += 3; //7;
pszStart = pszSearch; } else { pszSearch = _tcsstr(pszBuffer, TEXT("=")); if (pszSearch) { pszSearch += 1; //7;
pszStart = pszSearch; } else { pszSearch = pszBuffer; pszStart = pszBuffer; } } while (*pszSearch && *pszSearch != TEXT(':')) ++pszSearch;
// Grab the port
if (!*pszSearch) { *pdwPort = 80; } else { *pszSearch = TEXT('\0'); #if UNICODE
*pdwPort = wcstol(pszSearch + 1,NULL,10); #else
//*pdwPort = atol(pszSearch + 1);
*pdwPort = strtol(pszSearch + 1,NULL,10); #endif
}
pProxy->SetHost(pszStart); cbBuffer = sizeof (dwEnabled); l = RegQueryValueEx( regIe, TEXT("ProxyEnable"), NULL, // reserved
&dwType, (LPBYTE)&dwEnabled, &cbBuffer);
if (S_OK != l) goto Error;
if (pdwEnabled) *pdwEnabled = dwEnabled;
if (hKeyRoot == HKEY_CURRENT_USER) RegCloseKey(HKEY_CURRENT_USER); // CoRevertToSelf();
if( pszBuffer ) { HeapFree(GetProcessHeap(),0,pszBuffer); } return TRUE; Error: if (hKeyRoot == HKEY_CURRENT_USER) RegCloseKey(HKEY_CURRENT_USER); // CoRevertToSelf();
if( pszBuffer ) { HeapFree(GetProcessHeap(),0,pszBuffer); } return FALSE; }
|