296 lines
7.4 KiB
C++
296 lines
7.4 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corporation, 1995 - 1999 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
FILE HISTORY:
|
|
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <memory.h>
|
|
#include <ctype.h>
|
|
#include "tfschar.h"
|
|
#include "tregkey.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
|
|
#if _WIN32_WINNT < 0x0500
|
|
|
|
//
|
|
// CODEWORK This was taken from winbase.h. MFC requires _WIN32_WINNT=0x4000 whereas
|
|
// winbase.h only includes this for _WIN32_WINNT=0x5000. JonN 1/14/99
|
|
//
|
|
extern "C" {
|
|
typedef enum _COMPUTER_NAME_FORMAT {
|
|
ComputerNameNetBIOS,
|
|
ComputerNameDnsHostname,
|
|
ComputerNameDnsDomain,
|
|
ComputerNameDnsFullyQualified,
|
|
ComputerNamePhysicalNetBIOS,
|
|
ComputerNamePhysicalDnsHostname,
|
|
ComputerNamePhysicalDnsDomain,
|
|
ComputerNamePhysicalDnsFullyQualified,
|
|
ComputerNameMax
|
|
} COMPUTER_NAME_FORMAT ;
|
|
WINBASEAPI
|
|
BOOL
|
|
WINAPI
|
|
GetComputerNameExA (
|
|
IN COMPUTER_NAME_FORMAT NameType,
|
|
OUT LPSTR lpBuffer,
|
|
IN OUT LPDWORD nSize
|
|
);
|
|
WINBASEAPI
|
|
BOOL
|
|
WINAPI
|
|
GetComputerNameExW (
|
|
IN COMPUTER_NAME_FORMAT NameType,
|
|
OUT LPWSTR lpBuffer,
|
|
IN OUT LPDWORD nSize
|
|
);
|
|
#ifdef UNICODE
|
|
#define GetComputerNameEx GetComputerNameExW
|
|
#else
|
|
#define GetComputerNameEx GetComputerNameExA
|
|
#endif // !UNICODE
|
|
} // extern "C"
|
|
#endif
|
|
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
IsLocalMachine
|
|
Returns TRUE if the machine name passed in is the local machine,
|
|
or if pszMachineName is NULL.
|
|
|
|
This compares the NetBIOS name and the DNS (fully-qualified) name.
|
|
|
|
Returns FALSE otherwise.
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
BOOL IsLocalMachine(LPCTSTR pszMachineName)
|
|
{
|
|
static TCHAR s_szLocalMachineName[MAX_PATH*2+1] = _T("");
|
|
static TCHAR s_szDnsLocalMachineName[MAX_PATH*2+1] = _T("");
|
|
|
|
if ((pszMachineName == NULL) || (*pszMachineName == 0))
|
|
return TRUE;
|
|
|
|
// Bypass the beginning slashes
|
|
if ((pszMachineName[0] == _T('\\')) && (pszMachineName[1] == _T('\\')))
|
|
pszMachineName += 2;
|
|
|
|
// Check again (for degenerate case of "\\")
|
|
if (*pszMachineName == 0)
|
|
return TRUE;
|
|
|
|
if (s_szLocalMachineName[0] == 0)
|
|
{
|
|
DWORD dwSize = MAX_PATH*2;
|
|
GetComputerName(s_szLocalMachineName, &dwSize);
|
|
s_szLocalMachineName[MAX_PATH*2] = 0;
|
|
}
|
|
|
|
if (s_szDnsLocalMachineName[0] == 0)
|
|
{
|
|
DWORD dwSize = MAX_PATH*2;
|
|
GetComputerNameEx(ComputerNameDnsFullyQualified,
|
|
s_szDnsLocalMachineName,
|
|
&dwSize);
|
|
s_szDnsLocalMachineName[MAX_PATH*2] = 0;
|
|
}
|
|
|
|
return (StriCmp(pszMachineName, s_szLocalMachineName) == 0) ||
|
|
(StriCmp(pszMachineName, s_szDnsLocalMachineName) == 0);
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
FUseTaskpadsByDefault
|
|
See comments in header file.
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
BOOL FUseTaskpadsByDefault(LPCTSTR pszMachineName)
|
|
{
|
|
static DWORD s_dwStopTheInsanity = 42;
|
|
RegKey regkeyMMC;
|
|
DWORD dwErr;
|
|
|
|
if (s_dwStopTheInsanity == 42)
|
|
{
|
|
// Set the default to TRUE (i.e. do not use taskpads by default)
|
|
// ------------------------------------------------------------
|
|
s_dwStopTheInsanity = 1;
|
|
|
|
dwErr = regkeyMMC.Open(HKEY_LOCAL_MACHINE,
|
|
_T("Software\\Microsoft\\MMC"),
|
|
KEY_READ, pszMachineName);
|
|
if (dwErr == ERROR_SUCCESS)
|
|
{
|
|
dwErr = regkeyMMC.QueryValue(_T("TFSCore_StopTheInsanity"), s_dwStopTheInsanity);
|
|
if (dwErr != ERROR_SUCCESS)
|
|
s_dwStopTheInsanity = 1;
|
|
}
|
|
}
|
|
|
|
return !s_dwStopTheInsanity;
|
|
}
|
|
|
|
|
|
UINT CalculateStringWidth(HWND hWndParent, LPCTSTR pszString)
|
|
{
|
|
// Create a dummy list control, set this text width and use
|
|
// that to determine the width of the string as used by MMC.
|
|
|
|
// Create a dummy list control (that will be attached to the window)
|
|
|
|
CListCtrl listctrl;
|
|
CRect rect(0,0,0,0);
|
|
UINT nSize;
|
|
HWND hWnd;
|
|
|
|
CString s_szHiddenWndClass = AfxRegisterWndClass(
|
|
0x0, //UINT nClassStyle,
|
|
NULL, //HCURSOR hCursor,
|
|
NULL, //HBRUSH hbrBackground,
|
|
NULL //HICON hIcon
|
|
);
|
|
|
|
hWnd = ::CreateWindowEx(
|
|
0x0, //DWORD dwExStyle,
|
|
s_szHiddenWndClass, //LPCTSTR lpszClassName,
|
|
NULL, //LPCTSTR lpszWindowName,
|
|
0x0, //DWORD dwStyle,
|
|
0, //int x,
|
|
0, //int y,
|
|
0, //int nWidth,
|
|
0, //int nHeight,
|
|
NULL, //HWND hwndParent,
|
|
NULL, //HMENU nIDorHMenu,
|
|
AfxGetInstanceHandle(),
|
|
NULL //LPVOID lpParam = NULL
|
|
);
|
|
|
|
|
|
listctrl.Create(0, rect, CWnd::FromHandle(hWnd), 0);
|
|
|
|
nSize = listctrl.GetStringWidth(pszString);
|
|
|
|
// Now destroy the window that we created
|
|
listctrl.DestroyWindow();
|
|
|
|
SendMessage(hWnd, WM_CLOSE, 0, 0);
|
|
|
|
return nSize;
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
SearchChildNodesForGuid
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
HRESULT SearchChildNodesForGuid(ITFSNode *pParent, const GUID *pGuid, ITFSNode **ppChild)
|
|
{
|
|
HRESULT hr = hrFalse;
|
|
SPITFSNodeEnum spNodeEnum;
|
|
SPITFSNode spNode;
|
|
|
|
// Enumerate through all of the child nodes and return the
|
|
// first node that matches the GUID.
|
|
|
|
CORg( pParent->GetEnum(&spNodeEnum) );
|
|
|
|
while ( spNodeEnum->Next(1, &spNode, NULL) == hrOK )
|
|
{
|
|
if (*(spNode->GetNodeType()) == *pGuid)
|
|
break;
|
|
|
|
spNode.Release();
|
|
}
|
|
|
|
if (spNode)
|
|
{
|
|
if (ppChild)
|
|
*ppChild = spNode.Transfer();
|
|
hr = hrOK;
|
|
}
|
|
|
|
|
|
Error:
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
CheckIPAddressAndMask
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
UINT CheckIPAddressAndMask(DWORD ipAddress, DWORD ipMask, DWORD dwFlags)
|
|
{
|
|
if (dwFlags & IPADDRESS_TEST_NONCONTIGUOUS_MASK)
|
|
{
|
|
DWORD dwNewMask;
|
|
|
|
// Hmm... how to do this?
|
|
dwNewMask = 0;
|
|
for (int i = 0; i < sizeof(ipMask)*8; i++)
|
|
{
|
|
dwNewMask |= 1 << i;
|
|
|
|
if (dwNewMask & ipMask)
|
|
{
|
|
dwNewMask &= ~(1 << i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// At this point dwNewMask is 000..0111
|
|
// ~dwNewMask is 111..1000
|
|
// ~ipMask is 001..0111 (if noncontiguous)
|
|
// ~dwNewMask & ~ipMask is 001..0000
|
|
// So if this is non-zero then the mask is noncontiguous
|
|
if (~dwNewMask & ~ipMask)
|
|
{
|
|
return IDS_COMMON_ERR_IPADDRESS_NONCONTIGUOUS_MASK;
|
|
}
|
|
}
|
|
|
|
if (dwFlags & IPADDRESS_TEST_TOO_SPECIFIC)
|
|
{
|
|
if (ipAddress != (ipAddress & ipMask))
|
|
return IDS_COMMON_ERR_IPADDRESS_TOO_SPECIFIC;
|
|
}
|
|
|
|
if (dwFlags & IPADDRESS_TEST_NORMAL_RANGE)
|
|
{
|
|
if ((ipAddress < MAKEIPADDRESS(1,0,0,0)) ||
|
|
(ipAddress >= MAKEIPADDRESS(224,0,0,0)))
|
|
return IDS_COMMON_ERR_IPADDRESS_NORMAL_RANGE;
|
|
}
|
|
|
|
if (dwFlags & IPADDRESS_TEST_NOT_127)
|
|
{
|
|
if ((ipAddress & 0xFF000000) == MAKEIPADDRESS(127,0,0,0))
|
|
return IDS_COMMON_ERR_IPADDRESS_127;
|
|
}
|
|
|
|
if (dwFlags & IPADDRESS_TEST_ADDR_NOT_EQ_MASK)
|
|
{
|
|
if (ipAddress == ipMask)
|
|
return IDS_COMMON_ERR_IPADDRESS_NOT_EQ_MASK;
|
|
}
|
|
|
|
return 0;
|
|
}
|