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