262 lines
7.3 KiB
C++
262 lines
7.3 KiB
C++
|
//+----------------------------------------------------------------------------
|
||
|
//
|
||
|
// File: lanawait.cpp
|
||
|
//
|
||
|
// Module: CMDIAL32.DLL
|
||
|
//
|
||
|
// Synopsis: Implementation for the workaround to make CM wait for DUN to
|
||
|
// register its LANA for an internet connection before beginning
|
||
|
// the tunnel portion of a double dial connection.
|
||
|
//
|
||
|
// Copyright (c) 1996-1999 Microsoft Corporation
|
||
|
//
|
||
|
// Author: quintinb Created Header 08/17/99
|
||
|
//
|
||
|
//+----------------------------------------------------------------------------
|
||
|
|
||
|
#include "cmmaster.h"
|
||
|
|
||
|
const TCHAR* const c_pszCmEntryLanaTimeout = TEXT("LanaTimeout");
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: LanaWait
|
||
|
//
|
||
|
// Synopsis: Peform the LANA wait/timeout.
|
||
|
//
|
||
|
// Arguments: pArgs [the ptr to ArgsStruct]
|
||
|
// hwndMainDlg - hwnd of the main dlg
|
||
|
//
|
||
|
// Returns: BOOL TRUE=succes, FALSE=wait not performed.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
BOOL LanaWait(
|
||
|
ArgsStruct *pArgs,
|
||
|
HWND hwndMainDlg
|
||
|
)
|
||
|
{
|
||
|
BOOL fLanaDone = FALSE;
|
||
|
BOOL fLanaAbort = FALSE;
|
||
|
|
||
|
if (IsLanaWaitEnabled())
|
||
|
{
|
||
|
CMTRACE(TEXT("Performing Lana Wait!!"));
|
||
|
|
||
|
WNDCLASSEX WndClass;
|
||
|
HWND hWnd;
|
||
|
|
||
|
ZeroMemory(&WndClass, sizeof(WNDCLASSEX));
|
||
|
|
||
|
WndClass.cbSize = sizeof(WNDCLASSEX);
|
||
|
WndClass.lpfnWndProc = (WNDPROC)LanaWaitWndProc;
|
||
|
WndClass.hInstance = g_hInst;
|
||
|
WndClass.hIcon = LoadIconU(NULL, IDI_APPLICATION);
|
||
|
WndClass.hCursor = LoadCursorU(NULL, IDC_ARROW);
|
||
|
WndClass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
|
||
|
WndClass.lpszClassName = LANAWAIT_CLASSNAME;
|
||
|
|
||
|
MYVERIFY(RegisterClassExU(&WndClass));
|
||
|
|
||
|
if (!(hWnd = CreateWindowExU(0,
|
||
|
LANAWAIT_CLASSNAME,
|
||
|
LANAWAIT_WNDNAME,
|
||
|
WS_OVERLAPPEDWINDOW,
|
||
|
CW_USEDEFAULT,
|
||
|
CW_USEDEFAULT,
|
||
|
CW_USEDEFAULT,
|
||
|
CW_USEDEFAULT,
|
||
|
(HWND)NULL,
|
||
|
NULL,
|
||
|
g_hInst,
|
||
|
(LPVOID)pArgs)))
|
||
|
{
|
||
|
CMTRACE1(TEXT("CreateWindow LANA failed, LE=0x%x"), GetLastError());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
MSG msg;
|
||
|
ZeroMemory(&msg, sizeof(MSG));
|
||
|
|
||
|
while (GetMessageU(&msg, NULL, 0, 0))
|
||
|
{
|
||
|
//
|
||
|
// Since we have no accelerators, no need to call
|
||
|
// TranslateAccelerator here.
|
||
|
//
|
||
|
|
||
|
TranslateMessage(&msg);
|
||
|
DispatchMessageU(&msg);
|
||
|
|
||
|
//
|
||
|
// If we received a msg from the top-level
|
||
|
// window, then the dial is being canceled
|
||
|
//
|
||
|
|
||
|
if (pArgs->uLanaMsgId == msg.message)
|
||
|
{
|
||
|
fLanaAbort = TRUE;
|
||
|
DestroyWindow(hWnd); //break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
UnregisterClassU(LANAWAIT_CLASSNAME, g_hInst);
|
||
|
SetActiveWindow(hwndMainDlg);
|
||
|
|
||
|
//
|
||
|
// once we've run it once, we don't need to run it again
|
||
|
// until after reboot or switch to a different domain.
|
||
|
// it's safe to just run it every time.
|
||
|
//
|
||
|
|
||
|
if (!fLanaAbort)
|
||
|
{
|
||
|
fLanaDone = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CMTRACE(TEXT("Lana Wait is disabled"));
|
||
|
fLanaDone = TRUE;
|
||
|
}
|
||
|
|
||
|
return fLanaDone;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
// Function LanaWaitWndProc
|
||
|
//
|
||
|
// Synopsis Window function for the main app. Waits for device change
|
||
|
// message. This funcion will time out if device change is
|
||
|
// not recieived in LANA_TIMEOUT_DEFAULT secs.
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
LRESULT APIENTRY LanaWaitWndProc(
|
||
|
HWND hWnd,
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
switch (message)
|
||
|
{
|
||
|
case WM_CREATE:
|
||
|
{
|
||
|
UINT uiTimeout = ((ArgsStruct *)((CREATESTRUCT *)lParam)->lpCreateParams)
|
||
|
->piniService->GPPI(c_pszCmSection, c_pszCmEntryLanaTimeout, LANA_TIMEOUT_DEFAULT);
|
||
|
|
||
|
CMTRACE1(TEXT("Lana timeout time = %u ms"), uiTimeout*1000);
|
||
|
//
|
||
|
// set up the timer
|
||
|
//
|
||
|
SetTimer(hWnd, LANA_TIME_ID, uiTimeout*1000, (TIMERPROC)NULL);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
//
|
||
|
// This is the message we are waiting for the LANA is registered
|
||
|
//
|
||
|
case WM_DEVICECHANGE:
|
||
|
{
|
||
|
PDEV_BROADCAST_HDR pDev;
|
||
|
PDEV_BROADCAST_NET pNetDev;
|
||
|
|
||
|
CMTRACE(TEXT("Lana - WM_DEVICECHANGE"));
|
||
|
|
||
|
if (wParam == DBT_DEVICEARRIVAL)
|
||
|
{
|
||
|
pDev = (PDEV_BROADCAST_HDR) lParam;
|
||
|
if (pDev->dbch_devicetype != DBT_DEVTYP_NET)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pNetDev = (PDEV_BROADCAST_NET) pDev;
|
||
|
if (!(pNetDev->dbcn_flags & DBTF_SLOWNET))
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
CMTRACE(TEXT("Got Lana registration!!!"));
|
||
|
//
|
||
|
// Must wait for Broadcast to propigate to all windows.
|
||
|
//
|
||
|
KillTimer(hWnd, LANA_TIME_ID);
|
||
|
|
||
|
CMTRACE1(TEXT("Lana propagate time = %u ms"), LANA_PROPAGATE_TIME_DEFAULT*1000);
|
||
|
|
||
|
SetTimer(hWnd, LANA_TIME_ID, LANA_PROPAGATE_TIME_DEFAULT*1000, (TIMERPROC)NULL);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
|
||
|
// If we get this message we timed out on the device change
|
||
|
|
||
|
case WM_TIMER:
|
||
|
if (wParam == LANA_TIME_ID)
|
||
|
{
|
||
|
CMTRACE(TEXT("Killing LANA window..."));
|
||
|
DestroyWindow(hWnd);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
KillTimer(hWnd, LANA_TIME_ID);
|
||
|
PostQuitMessage(0);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return DefWindowProcU(hWnd, message, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+----------------------------------------------------------------------------
|
||
|
// Function IsLanaWaitEnabled
|
||
|
//
|
||
|
// Synopsis Check to see if the lana wait is enabled. It's enabled if
|
||
|
// reg key value has a non-zero value.
|
||
|
//
|
||
|
// Arguments NONE
|
||
|
//
|
||
|
// Return TRUE - enabled
|
||
|
// FALSE - disabled
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
BOOL IsLanaWaitEnabled()
|
||
|
{
|
||
|
BOOL fLanaWaitEnabled = FALSE;
|
||
|
HKEY hKeyCm;
|
||
|
DWORD dwType;
|
||
|
DWORD dwSize = sizeof(DWORD);
|
||
|
|
||
|
if (RegOpenKeyExU(HKEY_LOCAL_MACHINE,
|
||
|
c_pszRegCmRoot,
|
||
|
0,
|
||
|
KEY_QUERY_VALUE ,
|
||
|
&hKeyCm) == ERROR_SUCCESS)
|
||
|
{
|
||
|
LONG lResult = RegQueryValueExU(hKeyCm, ICM_REG_LANAWAIT, NULL, &dwType, (BYTE*)&fLanaWaitEnabled, &dwSize);
|
||
|
|
||
|
if ((lResult == ERROR_SUCCESS) && (dwType == REG_DWORD) && (dwSize == sizeof(DWORD)) && fLanaWaitEnabled)
|
||
|
{
|
||
|
fLanaWaitEnabled = TRUE;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyCm);
|
||
|
}
|
||
|
|
||
|
return fLanaWaitEnabled;
|
||
|
}
|
||
|
|
||
|
|
||
|
|