|
|
//============================================================================
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: CnctDlg.cpp
//
// History:
// 05/24/96 Michael Clark Created.
//
// Implements the Router Connection dialog
//============================================================================
//
#include "precompiled.h"
#include "afx.h"
#include "CnctDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
const TCHAR c_szIPCShare[] = TEXT("IPC$");
/////////////////////////////////////////////////////////////////////////////
//
// CConnectAsDlg dialog
//
/////////////////////////////////////////////////////////////////////////////
CConnectAsDlg::CConnectAsDlg(CWnd* pParent /*=NULL*/) : CHelpDialog(CConnectAsDlg::IDD, pParent) { //{{AFX_DATA_INIT(CConnectAsDlg)
m_sUserName = _T(""); m_sPassword = _T(""); m_stTempPassword = m_sPassword; m_sRouterName= _T(""); //}}AFX_DATA_INIT
// SetHelpMap(m_dwHelpMap);
}
void CConnectAsDlg::DoDataExchange(CDataExchange* pDX) { CHelpDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CConnectAsDlg)
DDX_Text(pDX, IDC_EDIT_USERNAME, m_sUserName); DDX_Text(pDX, IDC_EDIT_USER_PASSWORD, m_stTempPassword); DDX_Text(pDX, IDC_EDIT_MACHINENAME, m_sRouterName); DDV_MaxChars( pDX, m_sRouterName, MAX_PATH ); //}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate) { // Copy the data into the new buffer
// ------------------------------------------------------------
m_sPassword = m_stTempPassword;
// Clear out the temp password, by copying 0's
// into its buffer
// ------------------------------------------------------------
int cPassword = m_stTempPassword.GetLength(); ::ZeroMemory(m_stTempPassword.GetBuffer(0), cPassword * sizeof(TCHAR)); m_stTempPassword.ReleaseBuffer(); // Encode the password into the real password buffer
// ------------------------------------------------------------
m_ucSeed = CONNECTAS_ENCRYPT_SEED; RtlEncodeW(&m_ucSeed, m_sPassword.GetBuffer(0)); m_sPassword.ReleaseBuffer(); } }
IMPLEMENT_DYNCREATE(CConnectAsDlg, CHelpDialog)
BEGIN_MESSAGE_MAP(CConnectAsDlg, CHelpDialog) //{{AFX_MSG_MAP(CConnectAsDlg)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CConnectAsDlg::OnInitDialog() { BOOL fReturn; fReturn = CHelpDialog::OnInitDialog();
// Bring this window to the top
BringWindowToTop(); return fReturn; }
/*!--------------------------------------------------------------------------
ConnectAsAdmin Connect to the remote machine as administrator with user-supplied credentials.
Returns S_OK - if a connection was established S_FALSE - if user cancelled out other - error condition Author: KennT ---------------------------------------------------------------------------*/ HRESULT ConnectAsAdmin( IN LPCTSTR szRouterName) { AFX_MANAGE_STATE(AfxGetStaticModuleState())
//
// allow user to specify credentials
//
DWORD dwRes = (DWORD) -1; HRESULT hr = S_OK; CConnectAsDlg caDlg; ::CString stIPCShare; ::CString stRouterName; ::CString stPassword;
stRouterName = szRouterName; //
// set message text in connect as dialog.
//
caDlg.m_sRouterName = szRouterName;
//
// loop till connect succeeds or user cancels
//
while ( TRUE ) {
// We need to ensure that this dialog is brought to
// the top (if it gets lost behind the main window, we
// are really in trouble).
dwRes = caDlg.DoModal();
if ( dwRes == IDCANCEL ) { hr = S_FALSE; break; }
//
// Create remote resource name
//
stIPCShare.Empty(); if ( stRouterName.Left(2) != TEXT( "\\\\" ) ) { stIPCShare = TEXT( "\\\\" ); } stIPCShare += stRouterName; stIPCShare += TEXT( "\\" ); stIPCShare += c_szIPCShare;
NETRESOURCE nr;
nr.dwType = RESOURCETYPE_ANY; nr.lpLocalName = NULL; nr.lpRemoteName = (LPTSTR) (LPCTSTR) stIPCShare; nr.lpProvider = NULL;
//
// connect to \\router\ipc$ to try and establish credentials.
// May not be the best way to establish credentials but is
// the most expendient for now.
//
// Need to unencode the password in the ConnectAsDlg
stPassword = caDlg.m_sPassword;
RtlDecodeW(caDlg.m_ucSeed, stPassword.GetBuffer(0)); stPassword.ReleaseBuffer(); dwRes = WNetAddConnection2( &nr, (LPCTSTR) stPassword, (LPCTSTR) caDlg.m_sUserName, 0 ); ZeroMemory(stPassword.GetBuffer(0), stPassword.GetLength() * sizeof(TCHAR)); stPassword.ReleaseBuffer();
if ( dwRes != NO_ERROR ) { PBYTE pbMsgBuf = NULL; ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwRes, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language
(LPTSTR) &pbMsgBuf, 0, NULL );
AfxMessageBox( (LPCTSTR) pbMsgBuf );
LocalFree( pbMsgBuf ); }
else { //
// connection succeeded
//
hr = S_OK; break; } }
return hr; }
// Some helper functions
DWORD RtlEncodeW(PUCHAR pucSeed, LPWSTR pswzString) { UNICODE_STRING ustring;
ustring.Length = lstrlenW(pswzString) * sizeof(WCHAR); ustring.MaximumLength = ustring.Length; ustring.Buffer = pswzString;
RtlRunEncodeUnicodeString(pucSeed, &ustring); return 0; }
DWORD RtlDecodeW(UCHAR ucSeed, LPWSTR pswzString) { UNICODE_STRING ustring;
ustring.Length = lstrlenW(pswzString) * sizeof(WCHAR); ustring.MaximumLength = ustring.Length; ustring.Buffer = pswzString;
RtlRunDecodeUnicodeString(ucSeed, &ustring); return 0; }
|