windows-nt/Source/XPSP1/NT/net/rras/cm/cmdial/lanawait.cpp
2020-09-26 16:20:57 +08:00

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;
}