|
|
/*-----------------------------------------------------------------------------
autodial.cpp
Main entry point for autodial hook.
Copyright (C) 1996 Microsoft Corporation All rights reserved.
Authors: ChrisK ChrisKauffman
History: 7/22/96 ChrisK Cleaned and formatted
-----------------------------------------------------------------------------*/
#include "pch.hpp"
#include "resource.h"
#include "semaphor.h"
UINT g_cDialAttempts = 0; UINT g_cHangupDelay = 0; TCHAR g_szPassword[PWLEN + 1] = TEXT(""); TCHAR g_szEntryName[RAS_MaxEntryName + 1] = TEXT(""); HINSTANCE g_hInstance = NULL; static LPRASDIALPARAMS lpDialParams = NULL; // 4/2/97 ChrisK Olympus 296
HANDLE g_hRNAZapperThread = INVALID_HANDLE_VALUE;
typedef struct tagIcwDialShare { TCHAR szISPFile[MAX_PATH + 1]; TCHAR szCurrentDUNFile[MAX_PATH + 1]; BYTE fFlags; BYTE bMask; DWORD dwCountryID; WORD wState; GATHEREDINFO gi; DWORD dwPlatform; } ICWDIALSHARE, *PICWDIALSHARE;
static PICWDIALSHARE pDynShare;
LPCTSTR GetISPFile() { return pDynShare->szISPFile; }
void SetCurrentDUNFile(LPCTSTR szDUNFile) { lstrcpyn( pDynShare->szCurrentDUNFile, szDUNFile, SIZEOF_TCHAR_BUFFER(pDynShare->szCurrentDUNFile)); }
DWORD GetPlatform() { return pDynShare->dwPlatform; }
LPCTSTR GIGetAppDir() { return pDynShare->gi.szAppDir; }
/********************************************************************
NAME: LibShareEntry
SYNOPSIS: Initialize or uninitialize shared memory of this DLL
NOTES: The share memory replaces the shared section
*********************************************************************/
BOOL LibShareEntry(BOOL fInit) { static TCHAR szSharedMemName[] = TEXT("ICWDIAL_SHAREMEMORY"); static HANDLE hSharedMem = 0;
BOOL retval = FALSE; if (fInit) { DWORD dwErr = ERROR_SUCCESS; SetLastError(0);
hSharedMem = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(ICWDIALSHARE), szSharedMemName);
dwErr = GetLastError(); switch (dwErr) { case ERROR_ALREADY_EXISTS: case ERROR_SUCCESS: pDynShare = (PICWDIALSHARE) MapViewOfFile( hSharedMem, FILE_MAP_WRITE, 0, 0, 0); if (pDynShare != NULL) { if (dwErr == ERROR_SUCCESS) { pDynShare->szISPFile[0] = (TCHAR) 0; pDynShare->szCurrentDUNFile[0] = (TCHAR) 0; pDynShare->fFlags = 0; pDynShare->bMask = 0; pDynShare->dwCountryID = 0; pDynShare->wState = 0; pDynShare->dwPlatform = 0xffffffff; } else // dwErr == ERROR_ALREADY_EXISTS
{ // NO initialization needed
}
retval = TRUE; } else { TraceMsg(TF_ERROR, TEXT("MapViewOfFile failed: 0x%08lx"), GetLastError()); CloseHandle(hSharedMem); hSharedMem = 0; retval = FALSE; } break; default: TraceMsg(TF_ERROR, TEXT("CreateFileMapping failed: 0x08lx"), dwErr); hSharedMem = 0; retval = FALSE; } } else { if (pDynShare) { UnmapViewOfFile(pDynShare); pDynShare = NULL; }
if (hSharedMem) { CloseHandle(hSharedMem); hSharedMem = NULL; }
retval = TRUE; }
return retval; }
//static const CHAR szBrowserClass1[] = "IExplorer_Frame";
//static const CHAR szBrowserClass2[] = "Internet Explorer_Frame";
//static const CHAR szBrowserClass3[] = "IEFrame";
//
// 8/5/97 jmazner Olympus 11215
// Isignup window caption/title is IDS_APP_TITLE in isign32\strings.inc
// IDS_APP_TITLE should be in synch with IDS_TITLE in icwdial.rc
//
static const TCHAR cszIsignupWndClassName[] = TEXT("Internet Signup\0");
static DWORD AutoDialConnect(HWND hDlg, LPRASDIALPARAMS lpDialParams); static BOOL AutoDialEvent(HWND hDlg, RASCONNSTATE state, LPDWORD lpdwError); static VOID SetDialogTitle(HWND hDlg, LPCTSTR pszConnectoidName); static HWND FindBrowser(void); static UINT RetryMessage(HWND hDlg, DWORD dwError);
#define MAX_RETIES 3
#define irgMaxSzs 5
TCHAR szStrTable[irgMaxSzs][256]; int iSzTable;
/*******************************************************************
NAME: DllEntryPoint
SYNOPSIS: Entry point for DLL.
NOTES: Initializes thunk layer to WIZ16.DLL
********************************************************************/ extern "C" BOOL _stdcall DllEntryPoint(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpReserved) { BOOL retval = TRUE; TraceMsg(TF_GENERAL, "ICWDIAL :DllEntryPoint()\n"); if( fdwReason == DLL_PROCESS_ATTACH ) { //
// ChrisK Olympus 6373 6/13/97
// Disable thread attach calls in order to avoid race condition
// on Win95 golden
//
DisableThreadLibraryCalls(hInstDll); g_hInstance = hInstDll;
retval = LibShareEntry(TRUE); if (0xFFFFFFFF == pDynShare->dwPlatform) { OSVERSIONINFO osver; ZeroMemory(&osver,sizeof(osver)); osver.dwOSVersionInfoSize = sizeof(osver); if (GetVersionEx(&osver)) { pDynShare->dwPlatform = osver.dwPlatformId; } } } else if (fdwReason == DLL_PROCESS_DETACH) { retval = LibShareEntry(FALSE); } else if (fdwReason == DLL_THREAD_DETACH) { //
// ChrisK 6/3/97 296
// Broaden window to close this thread
//
if (INVALID_HANDLE_VALUE != g_hRNAZapperThread) { StopRNAReestablishZapper(g_hRNAZapperThread); }
}
return retval; }
// ############################################################################
HRESULT ReleaseBold(HWND hwnd) { HFONT hfont = NULL;
hfont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0); if (hfont) DeleteObject(hfont); return ERROR_SUCCESS; }
// ############################################################################
HRESULT MakeBold (HWND hwnd, BOOL fSize, LONG lfWeight) { HRESULT hr = ERROR_SUCCESS; HFONT hfont = NULL; HFONT hnewfont = NULL; LOGFONT* plogfont = NULL;
if (!hwnd) goto MakeBoldExit;
hfont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0); if (!hfont) { hr = GetLastError(); goto MakeBoldExit; }
plogfont = (LOGFONT*)GlobalAlloc(GPTR,sizeof(LOGFONT)); if (!plogfont) { hr = GetLastError(); goto MakeBoldExit; }
if (!GetObject(hfont,sizeof(LOGFONT),(LPVOID)plogfont)) { hr = GetLastError(); goto MakeBoldExit; }
if (abs(plogfont->lfHeight) < 24 && fSize) { plogfont->lfHeight = plogfont->lfHeight + (plogfont->lfHeight / 4); }
plogfont->lfWeight = lfWeight;
if (!(hnewfont = CreateFontIndirect(plogfont))) { hr = GetLastError(); goto MakeBoldExit; }
SendMessage(hwnd,WM_SETFONT,(WPARAM)hnewfont,MAKELPARAM(TRUE,0)); MakeBoldExit: if (plogfont) GlobalFree(plogfont); plogfont = NULL;
// if (hfont) DeleteObject(hfont);
// BUG:? Do I need to delete hnewfont at some time?
return hr; }
// ############################################################################
// NAME: GetSz
//
// Load strings from resources
//
// Created 1/28/96, Chris Kauffman
// ############################################################################
PTSTR GetSz(WORD wszID) { PTSTR psz = szStrTable[iSzTable]; iSzTable++; if (iSzTable >= irgMaxSzs) iSzTable = 0; if (!LoadString(g_hInstance, wszID, psz, 256)) { TraceMsg(TF_GENERAL, "Autodial:LoadString failed %d\n", (DWORD) wszID); *psz = 0; } return (psz); }
//+----------------------------------------------------------------------------
//
// Function: IsISignupRunning
//
// Synopsis: Check if ISIGNUP is running
//
// Arguments: none
//
// Returns: TRUE - ISIGNUP is already running
//
// History: 7/24/97 ChrisK fixed part of 8445
//
//-----------------------------------------------------------------------------
BOOL IsISignupRunning() { //
// IE 8445 ChrisK 7/24/97
// As part of fixing IE 8445, the ICW was inappropriately deleting the
// isp signup connectoid because it thought isignup was not running.
//
HANDLE hSemaphore; BOOL bRC = FALSE;
//
// Check the GetLastError value immediately after the CreateSemaphore to
// make sure nothing else changes the error value
//
hSemaphore = CreateSemaphore(NULL, 1, 1, ICW_ELSE_SEMAPHORE); if( ERROR_ALREADY_EXISTS == GetLastError() ) { bRC = TRUE; }
//
// 8/3/97 jmazner Olympus #11206
// Even if the semaphore already exists, we still get back a handle
// reference to it, which means that we need to close that handle
// or else the semaphore will never get destroyed.
//
if( hSemaphore && (hSemaphore != INVALID_HANDLE_VALUE) ) { CloseHandle(hSemaphore); hSemaphore = INVALID_HANDLE_VALUE; }
return bRC; }
TCHAR szDialogBoxClass[] = TEXT("#32770"); // hard coded dialog class name
// check if ICWCONN1 is running
BOOL IsICWCONN1Running() { return (FindWindow(szDialogBoxClass, GetSz(IDS_TITLE)) != NULL); }
// ############################################################################
typedef HRESULT (WINAPI *PFNINETSETAUTODIAL)(BOOL,LPCTSTR);
void RemoveAutodialer() { HINSTANCE hinst = NULL; FARPROC fp = NULL;
hinst = LoadLibrary(TEXT("INETCFG.DLL")); if (hinst) { if(fp = GetProcAddress(hinst,"InetSetAutodial")) { ((PFNINETSETAUTODIAL)fp)(FALSE, TEXT("")); } FreeLibrary(hinst); } }
// ############################################################################
BOOL WINAPI AutoDialHandler( HWND hwndParent, LPCTSTR lpszEntry, DWORD dwFlags, LPDWORD pdwRetCode ) { HRESULT hr; INT cRetry; TCHAR szToDebugOrNot[2]; DWORD dwSize; RNAAPI *pcRNA = NULL; PDIALDLGDATA pDD = NULL; PERRORDLGDATA pDE = NULL;
if(!IsISignupRunning()) {
//
// 7/30/97 ChrisK IE 8445
// In ICW 1.1 icwconn1 is left alive the whole time, so we should not
// care whether or not it is around when we go to dial.
//
//// in some *really* weird circs we can be called while ICWCONN1 is running
//// if so just return failure
//if(IsICWCONN1Running())
//{
// *pdwRetCode = ERROR_CANCELLED;
// return TRUE;
//}
OutputDebugString(TEXT("Someome didn't cleanup ICWDIAL correctly\r\n")); // clean it up now! delete connectoid
pcRNA = new RNAAPI; if (pcRNA) { pcRNA->RasDeleteEntry(NULL, (LPTSTR)lpszEntry); delete pcRNA; pcRNA = NULL; } // remove autodial-hook. No clue who to restore, though
RemoveAutodialer(); // return FALSE so someone else will dial
return FALSE; } #ifdef _DEBUG
// This is how we can break into the debugger when this DLL is called as
// part of the autodialer sequence
//
lstrcpyn(szToDebugOrNot,TEXT("0"),2); dwSize = sizeof(szToDebugOrNot); RegQueryValue(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\MICROSOFT\\ISIGNUP\\DEBUG"),szToDebugOrNot,(PLONG)&dwSize); if (szToDebugOrNot[0] == '1') DebugBreak(); #endif
// Keep track of EntryName for later
//
lstrcpyn(g_szEntryName, lpszEntry, RAS_MaxEntryName); if (lstrlen(pDynShare->szISPFile)==0) { // if ((*pdwRetCode = LoadInitSettingFromRegistry()) != ERROR_SUCCESS)
// return TRUE;
LoadInitSettingFromRegistry(); }
// g_pdevice = (PMYDEVICE)GlobalAlloc(GPTR,sizeof(MYDEVICE));
// if (!g_pdevice)
// {
// *pdwRetCode = ERROR_NOT_ENOUGH_MEMORY;
// return TRUE;
// }
TryDial: cRetry = 0; TryRedial: if (pDD) { GlobalFree(pDD); pDD = NULL; } pDD = (PDIALDLGDATA)GlobalAlloc(GPTR,sizeof(DIALDLGDATA)); if (pDD) { pDD->dwSize = sizeof(DIALDLGDATA); StrDup(&pDD->pszMessage,GetSz(IDS_DIALMESSAGE)); StrDup(&pDD->pszRasEntryName,lpszEntry); pDD->pfnStatusCallback = StatusMessageCallback; pDD->hInst = g_hInstance; } else { MessageBox(NULL,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_MYERROR); }
// Dial ISP
//
hr = DialingDownloadDialog(pDD);
cRetry++;
// Check if we should automatically redial
//
if ((cRetry < MAX_RETIES) && (FShouldRetry(hr))) goto TryRedial;
if (hr != ERROR_USERNEXT) { pDE = (PERRORDLGDATA)GlobalAlloc(GPTR,sizeof(ERRORDLGDATA)); if (!pDE) { MessageBox(NULL,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_MYERROR); } else { pDE->dwSize = sizeof (ERRORDLGDATA); StrDup(&pDE->pszMessage,GetSz(RasErrorToIDS(hr))); StrDup(&pDE->pszRasEntryName,lpszEntry);
pDE->pdwCountryID = &(pDynShare->dwCountryID); pDE->pwStateID = &(pDynShare->wState); pDE->bType = pDynShare->fFlags; pDE->bMask = pDynShare->bMask; StrDup(&pDE->pszHelpFile,AUTODIAL_HELPFILE); pDE->dwHelpID = icw_trb; pDE->hInst = g_hInstance; pDE->hParentHwnd = NULL;
hr = DialingErrorDialog(pDE); if (hr == ERROR_USERNEXT) goto TryDial; else hr = ERROR_USERCANCEL; } }
GlobalFree(pDD); pDD = NULL;
if (hr == ERROR_SUCCESS) *pdwRetCode = ERROR_SUCCESS; else if (hr == ERROR_USERCANCEL) *pdwRetCode = ERROR_CANCELLED;
if (ERROR_SUCCESS != *pdwRetCode) { HWND hwndIsignup = NULL;
//
// 8/5/97 jmazner Olympus 11215
// For ICW 1.1 and IE 4, looking for the browser won't work
// Instead, look for isignup and send it a special quit message.
//
//hwndBrowser = FindBrowser();
hwndIsignup = FindWindow(cszIsignupWndClassName, GetSz(IDS_TITLE)); if (NULL != hwndIsignup) { PostMessage(hwndIsignup, WM_CLOSE, 0, 0); }
} return TRUE; }
// ############################################################################
HRESULT LoadInitSettingFromRegistry() { HRESULT hr = ERROR_SUCCESS; HKEY hKey = NULL; DWORD dwType, dwSize;
hr = RegOpenKey(HKEY_LOCAL_MACHINE,SIGNUPKEY,&hKey); if (hr != ERROR_SUCCESS) { TraceMsg(TF_ERROR, TEXT("Failed RegOpenKey: %s 0x%08lx"), SIGNUPKEY, hr); goto LoadInitSettingFromRegistryExit; }
dwType = REG_BINARY; dwSize = sizeof(pDynShare->gi); ZeroMemory(&(pDynShare->gi),sizeof(pDynShare->gi)); hr = RegQueryValueEx( hKey, GATHERINFOVALUENAME, 0, &dwType, (LPBYTE) &(pDynShare->gi), &dwSize); if (hr != ERROR_SUCCESS) { TraceMsg(TF_ERROR, TEXT("Failed RegQueryValueEx: %s 0x%08lx"), GATHERINFOVALUENAME, hr); goto LoadInitSettingFromRegistryExit; } AutoDialInit( pDynShare->gi.szISPFile, pDynShare->gi.fType, pDynShare->gi.bMask, pDynShare->gi.dwCountry, pDynShare->gi.wState); SetCurrentDirectory(pDynShare->gi.szAppDir);
// Get the name of the DUN file
pDynShare->szCurrentDUNFile[0] = 0; dwSize = SIZEOF_TCHAR_BUFFER(pDynShare->szCurrentDUNFile); ReadSignUpReg( (LPBYTE)pDynShare->szCurrentDUNFile, &dwSize, REG_SZ, DUNFILEVALUENAME); LoadInitSettingFromRegistryExit: if (hKey) RegCloseKey(hKey); return hr; }
// ############################################################################
/******
* * 8/5/97 jmazner Olympus 11215 * This function is no longer required * static HWND FindBrowser(void) { HWND hwnd;
//look for all the microsoft browsers under the sun
if ((hwnd = FindWindow(szBrowserClass1, NULL)) == NULL) { if ((hwnd = FindWindow(szBrowserClass2, NULL)) == NULL) { hwnd = FindWindow(szBrowserClass3, NULL); } }
return hwnd; } ****/
// ############################################################################
HRESULT AutoDialInit(LPTSTR lpszISPFile, BYTE fFlags, BYTE bMask, DWORD dwCountry, WORD wState) { TraceMsg(TF_GENERAL, "AUTODIAL:AutoDialInit()\n"); if (lpszISPFile) lstrcpyn(pDynShare->szISPFile, lpszISPFile, MAX_PATH); pDynShare->fFlags = fFlags; pDynShare->bMask = bMask; pDynShare->dwCountryID = dwCountry; pDynShare->wState = wState;
return ERROR_SUCCESS; }
// ############################################################################
BOOL FShouldRetry(HRESULT hrErr) { BOOL bRC;
if (hrErr == ERROR_LINE_BUSY || hrErr == ERROR_VOICE_ANSWER || hrErr == ERROR_NO_ANSWER || hrErr == ERROR_NO_CARRIER || hrErr == ERROR_AUTHENTICATION_FAILURE || hrErr == ERROR_PPP_TIMEOUT || hrErr == ERROR_REMOTE_DISCONNECTION || hrErr == ERROR_AUTH_INTERNAL || hrErr == ERROR_PROTOCOL_NOT_CONFIGURED || hrErr == ERROR_PPP_NO_PROTOCOLS_CONFIGURED) { bRC = TRUE; } else { bRC = FALSE; }
return bRC; }
|