289 lines
6.1 KiB
C++
289 lines
6.1 KiB
C++
|
// 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;
|
||
|
}
|