325 lines
7.9 KiB
C++
325 lines
7.9 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
//
|
|
// File: cncting.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
// cncting.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "cncting.h"
|
|
#include "rtrutilp.h"
|
|
#include "rtrstr.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
// Windows NT Bugs : 82409
|
|
// Something is sending a WM_USER message through when we click on the
|
|
// edit control. To avoid that conflict, renumber the request complete
|
|
// message.
|
|
#define WM_RTR_REQUEST_COMPLETED (WM_USER+0x0100)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CConnectRequest
|
|
|
|
UINT ConnectThread(LPVOID pParam)
|
|
{
|
|
CConnectData *pData = (CConnectData*)pParam;
|
|
|
|
pData->m_pfnConnect(pData);
|
|
|
|
if (!::IsWindow(pData->m_hwndMsg))
|
|
{
|
|
delete pData;
|
|
}
|
|
else
|
|
{
|
|
::PostMessage(pData->m_hwndMsg, WM_RTR_REQUEST_COMPLETED, (WPARAM)pData, NULL);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void ConnectToMachine(CConnectData* pParam)
|
|
{
|
|
pParam->m_dwr = ValidateUserPermissions(pParam->m_sName,
|
|
&pParam->m_routerVersion,
|
|
&pParam->m_hkMachine);
|
|
|
|
}
|
|
|
|
void ConnectToDomain(CConnectData* pParam)
|
|
{
|
|
DWORD dwTotal;
|
|
PWSTR pszDomain;
|
|
|
|
ASSERT(!pParam->m_sName.IsEmpty());
|
|
// Although the API excepts TCHAR it is exclusively UNICODE
|
|
pszDomain = new WCHAR[pParam->m_sName.GetLength() + 1];
|
|
wcscpy(pszDomain, pParam->m_sName);
|
|
|
|
pParam->m_pSvInfo100 = NULL;
|
|
pParam->m_dwr = (DWORD)::NetServerEnum(NULL, 100,
|
|
(LPBYTE*)&pParam->m_pSvInfo100, 0xffffffff,
|
|
&pParam->m_dwSvInfoRead, &dwTotal, SV_TYPE_DIALIN_SERVER,
|
|
(PTSTR)pszDomain, NULL);
|
|
delete [] pszDomain;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CConnectingDlg dialog
|
|
|
|
CConnectingDlg::CConnectingDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CConnectingDlg::IDD, pParent)
|
|
{
|
|
m_bRouter = TRUE;
|
|
//{{AFX_DATA_INIT(CConnectingDlg)
|
|
m_sName = _T("");
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CConnectingDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CConnectingDlg)
|
|
DDX_Text(pDX, IDC_EDIT_MACHINENAME, m_sName);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CConnectingDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CConnectingDlg)
|
|
//}}AFX_MSG_MAP
|
|
ON_MESSAGE(WM_RTR_REQUEST_COMPLETED, OnRequestComplete)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CConnectingDlg message handlers
|
|
|
|
BOOL CConnectingDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
CConnectData *pData = new CConnectData;
|
|
pData->m_sName = m_sName;
|
|
pData->m_hwndMsg = m_hWnd;
|
|
|
|
if (m_bRouter)
|
|
{
|
|
pData->m_pfnConnect = ConnectToMachine;
|
|
}
|
|
else
|
|
{
|
|
pData->m_pfnConnect = ConnectToDomain;
|
|
}
|
|
|
|
m_pThread = AfxBeginThread((AFX_THREADPROC)ConnectThread, (LPVOID)pData);
|
|
if (!m_pThread) EndDialog(IDCANCEL);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CConnectingDlg::OnRequestComplete(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CConnectData *pData = (CConnectData*)wParam;
|
|
if (!pData) { EndDialog(IDCANCEL); return 0; }
|
|
|
|
m_dwr = pData->m_dwr;
|
|
if (m_dwr != ERROR_SUCCESS)
|
|
{
|
|
EndDialog(m_dwr);
|
|
delete pData;
|
|
return 0L;
|
|
}
|
|
|
|
if (m_bRouter)
|
|
m_hkMachine = pData->m_hkMachine;
|
|
else
|
|
{
|
|
m_pSvInfo100 = pData->m_pSvInfo100;
|
|
m_dwSvInfoRead = pData->m_dwSvInfoRead;
|
|
}
|
|
delete pData;
|
|
|
|
EndDialog(IDOK);
|
|
return 0L;
|
|
}
|
|
|
|
BOOL CConnectingDlg::Connect()
|
|
{
|
|
CConnectData Data;
|
|
Data.m_sName = m_sName;
|
|
Data.m_hwndMsg = m_hWnd;
|
|
|
|
if (m_bRouter)
|
|
{
|
|
Data.m_pfnConnect = ConnectToMachine;
|
|
}
|
|
else
|
|
{
|
|
Data.m_pfnConnect = ConnectToDomain;
|
|
}
|
|
|
|
CWaitCursor wc;
|
|
|
|
Data.m_pfnConnect(&Data);
|
|
|
|
// setup all of the data from the connection
|
|
m_dwr = Data.m_dwr;
|
|
if (m_dwr != ERROR_SUCCESS)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (m_bRouter)
|
|
m_hkMachine = Data.m_hkMachine;
|
|
else
|
|
{
|
|
m_pSvInfo100 = Data.m_pSvInfo100;
|
|
m_dwSvInfoRead = Data.m_dwSvInfoRead;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
ValidateUserPermissions
|
|
Check to see if we can access the places we need to access
|
|
|
|
Returns HRESULT_OK if the user has the proper access.
|
|
Returns E_ACCESSDENIED if the user does not have proper access.
|
|
|
|
Returns error otherwise.
|
|
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
DWORD ValidateUserPermissions(LPCTSTR pszServer,
|
|
RouterVersionInfo *pVersion,
|
|
HKEY *phkeyMachine)
|
|
{
|
|
HKEY hkMachine = NULL;
|
|
RegKey regkey;
|
|
RouterVersionInfo routerVersion;
|
|
HRESULT hr = hrOK;
|
|
DWORD dwErr = ERROR_SUCCESS;
|
|
|
|
dwErr = ValidateMachine(pszServer);
|
|
if (dwErr != ERROR_SUCCESS)
|
|
goto Error;
|
|
|
|
// connect to the machine's registry
|
|
dwErr = ConnectRegistry((LPTSTR) pszServer,
|
|
&hkMachine);
|
|
if(dwErr != ERROR_SUCCESS)
|
|
goto Error;
|
|
|
|
// There are three cases to consider here:
|
|
// (1) NT4 RAS server (no router keys)
|
|
// (2) NT4 RRAS (NT4+Steelhead)
|
|
// (3) NT5
|
|
// ----------------------------------------------------------------
|
|
|
|
|
|
// Get the version information
|
|
// ----------------------------------------------------------------
|
|
hr = QueryRouterVersionInfo(hkMachine, &routerVersion);
|
|
if (!FHrOK(hr))
|
|
{
|
|
dwErr = (hr & 0x0000FFFF);
|
|
goto Error;
|
|
}
|
|
|
|
// Copy the version info over.
|
|
// ----------------------------------------------------------------
|
|
if (pVersion)
|
|
*pVersion = routerVersion;
|
|
else
|
|
pVersion = &routerVersion;
|
|
|
|
// This test is intended for the RAS server case.
|
|
// ----------------------------------------------------------------
|
|
if (routerVersion.dwOsMajorVersion <= 4)
|
|
{
|
|
// If we can't find the router key, we can skip the rest of the
|
|
// tests. We do assume that everything succeeded however.
|
|
// ----------------------------------------------------------------
|
|
dwErr = regkey.Open(hkMachine, c_szRegKeyRouter, KEY_READ);
|
|
if (dwErr == ERROR_FILE_NOT_FOUND)
|
|
{
|
|
// Could not find the router key, however this may
|
|
// be a NT4 RAS server (no Steelhead), so return success
|
|
// --------------------------------------------------------
|
|
goto Done;
|
|
}
|
|
else if (dwErr != ERROR_SUCCESS)
|
|
goto Error;
|
|
|
|
// If we could find the router key, then we can continue with
|
|
// the other registry tests.
|
|
// ------------------------------------------------------------
|
|
regkey.Close();
|
|
}
|
|
|
|
|
|
// open HKLM\Software\Microsoft\Router\CurrentVersion\RouterManagers
|
|
// ----------------------------------------------------------------
|
|
dwErr = regkey.Open(hkMachine, c_szRouterManagersKey, KEY_ALL_ACCESS);
|
|
if(dwErr != ERROR_SUCCESS)
|
|
goto Error;
|
|
regkey.Close();
|
|
|
|
// open c_szSystemCCSServices HKLM\System\\CurrentControlSet\\Services
|
|
// ----------------------------------------------------------------
|
|
{
|
|
RegKey regFolder;
|
|
|
|
dwErr = regFolder.Open(hkMachine, c_szSystemCCSServices, KEY_READ);
|
|
if(dwErr != ERROR_SUCCESS)
|
|
goto Error;
|
|
|
|
// sub keys under Services -- remoteAccess, RW
|
|
dwErr = regkey.Open(regFolder, c_szRemoteAccess, KEY_ALL_ACCESS);
|
|
if(dwErr != ERROR_SUCCESS)
|
|
goto Error;
|
|
regkey.Close();
|
|
|
|
// sub keys under Services -- rasman, RW
|
|
dwErr = regkey.Open(regFolder, c_szSvcRasMan, KEY_ALL_ACCESS);
|
|
if(dwErr != ERROR_SUCCESS)
|
|
goto Error;
|
|
regkey.Close();
|
|
|
|
// sub keys under Services -- TcpIp, RW
|
|
dwErr = regkey.Open(regFolder, c_szTcpip, KEY_ALL_ACCESS);
|
|
if(dwErr != ERROR_SUCCESS)
|
|
goto Error;
|
|
regkey.Close();
|
|
|
|
regFolder.Close();
|
|
}
|
|
|
|
Done:
|
|
if (phkeyMachine)
|
|
{
|
|
*phkeyMachine = hkMachine;
|
|
hkMachine = NULL;
|
|
}
|
|
|
|
Error:
|
|
if(hkMachine != NULL)
|
|
DisconnectRegistry( hkMachine );
|
|
|
|
return dwErr;
|
|
}
|
|
|