|
|
/*++
Copyright (c) 1994-1999 Microsoft Corporation
Module Name :
utcls.cpp
Abstract:
Internet Properties base classes
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
//
// Include Files
//
#include "stdafx.h"
#include "common.h"
#include "idlg.h"
#include "mmc.h"
extern "C" { #include <lm.h>
}
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__; #endif
#define new DEBUG_NEW
#define SZ_REG_KEY_BASE _T("Software\\Microsoft\\%s")
BOOL IsServerLocal( IN LPCTSTR lpszServer ) /*++
Routine Description:
Check to see if the given name refers to the local machine
Arguments:
LPCTSTR lpszServer : Server name
Return Value:
TRUE if the given name refers to the local computer, FALSE otherwise
Note:
Doesn't work if the server is an ip address
--*/ { TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD dwSize = sizeof(szComputerName) / sizeof(TCHAR);
//
// CODEWORK(?): we're not checking for all the ip addresses
// on the local box or full dns names.
//
// Try GetComputerNameEx when we're building with NT5
// settings.
//
return (!_tcsicmp(_T("localhost"), PURE_COMPUTER_NAME(lpszServer)) || !_tcscmp( _T("127.0.0.1"), PURE_COMPUTER_NAME(lpszServer))) || (GetComputerName(szComputerName, &dwSize) && !_tcsicmp(szComputerName, PURE_COMPUTER_NAME(lpszServer))); }
BOOL GetVolumeInformationSystemFlags( IN LPCTSTR lpszPath, OUT DWORD * pdwSystemFlags ) /*++
Routine Description:
Get the system flags for the path in question
Arguments:
LPCTSTR lpszPath : Path DWORD * pdwSystemFlags : Returns system flags
Return Value:
TRUE for success, FALSE for failure.
--*/ { ASSERT_WRITE_PTR(pdwSystemFlags);
TRACEEOLID("Getting system flags for " << lpszPath);
DWORD dwMaxComponentLength; TCHAR szRoot[MAX_PATH + 1]; TCHAR szFileSystem[MAX_PATH + 1];
//
// Generating root path
//
if (IsUNCName(lpszPath)) { //
// Root path of a UNC path is \\foo\bar\ //
ASSERT(lstrlen(lpszPath) < MAX_PATH);
int cSlashes = 0; LPCTSTR lpszSrc = lpszPath; LPTSTR lpszDst = szRoot;
while (cSlashes < 4 && *lpszSrc) { if ((*lpszDst++ = *lpszSrc++) == '\\') { ++cSlashes; } }
if (!*lpszSrc) { *lpszDst++ = '\\'; }
*lpszDst = '\0'; } else { ::wsprintf(szRoot, _T("%c:\\"), *lpszPath); }
TRACEEOLID("Root path is " << szRoot); return ::GetVolumeInformation( szRoot, NULL, 0, NULL, &dwMaxComponentLength, pdwSystemFlags, szFileSystem, STRSIZE(szFileSystem) ); }
LPCTSTR GenerateRegistryKey( OUT CString & strBuffer, IN LPCTSTR lpszSubKey OPTIONAL ) /*++
Routine Description:
Generate a registry key name based on the current app, and a provided subkey (optional)
Arguments:
CString & strBuffer : Buffer to create registry key name into. LPCTSTR lpszSubKey : Subkey name or NULL
Return Value:
Pointer to the registry key value
--*/ { try { //
// Use the app name as the primary registry name
//
CWinApp * pApp = ::AfxGetApp();
if (!pApp) { ASSERT_MSG("No app object -- can't generate registry key name");
return NULL; }
strBuffer.Format(SZ_REG_KEY_BASE, pApp->m_pszAppName);
if (lpszSubKey) { strBuffer += _T("\\"); strBuffer += lpszSubKey; }
TRACEEOLID("Registry key is " << strBuffer); } catch(CMemoryException * e) { TRACEEOLID("!!!exception building regkey"); e->ReportError(); e->Delete(); return NULL; }
return strBuffer; }
//
// CBlob Implementation
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CBlob::CBlob() /*++
Routine Description:
NULL constructor
Arguments:
None
Return Value:
N/A
--*/ : m_pbItem(NULL), m_dwSize(0L) { }
CBlob::CBlob( IN DWORD dwSize, IN PBYTE pbItem, IN BOOL fMakeCopy ) /*++
Routine Description:
Constructor
Arguments:
DWORD dwSize : Size of memory block PBYTE pbItem : Pointer to memory block BOOL fMakeCopy : If TRUE, makes a copy of the memory block. If FALSE, takes ownership of the pointer.
Return Value:
N/A
--*/ : m_pbItem(NULL), m_dwSize(0L) { SetValue(dwSize, pbItem, fMakeCopy); }
CBlob::CBlob( IN const CBlob & blob ) /*++
Routine Description:
Copy constructor
Arguments:
const CBlob & blob : Source blob
Return Value:
N/A
Notes:
This contructor makes a copy of the memory block in question.
--*/ : m_pbItem(NULL), m_dwSize(0L) { SetValue(blob.GetSize(), blob.m_pbItem, TRUE); }
void CBlob::SetValue( IN DWORD dwSize, IN PBYTE pbItem, IN BOOL fMakeCopy OPTIONAL ) /*++
Routine Description:
Assign the value to this binary object. If fMakeCopy is FALSE, the blob will take ownership of the pointer, otherwise a copy will be made.
Arguments:
DWORD dwSize : Size in bytes PBYTE pbItem : Byte streadm BOOL fMakeCopy : If true, make a copy, else assign pointer
Return Value:
None
--*/ { //ASSERT_READ_PTR2(pbItem, dwSize);
if (!IsEmpty()) { TRACEEOLID("Assigning value to non-empty blob. Cleaning up"); CleanUp(); }
if (dwSize > 0L) { //
// Make private copy
//
m_dwSize = dwSize;
if (fMakeCopy) { m_pbItem = (PBYTE)AllocMem(m_dwSize); if (NULL != m_pbItem) { CopyMemory(m_pbItem, pbItem, dwSize); } } else { m_pbItem = pbItem; } } }
void CBlob::CleanUp() /*++
Routine Description:
Delete data pointer, and reset pointer and size.
Arguments:
None
Return Value:
None
--*/ { if (m_pbItem) { FreeMem(m_pbItem); }
m_pbItem = NULL; m_dwSize = 0L; }
CBlob & CBlob::operator =( IN const CBlob & blob ) /*++
Routine Description:
Assign values from another CBlob.
Arguments:
const CBlob & blob : Source blob
Return Value:
Reference to this object
--*/ { //
// Make copy of data
//
SetValue(blob.GetSize(), blob.m_pbItem, TRUE);
return *this; }
BOOL CBlob::operator ==( IN const CBlob & blob ) const /*++
Routine Description: Compare two binary large objects. In order to match, the objects must be the same size, and byte identical.
Arguments:
const CBlob & blob : Blob to compare against.
Return Value:
TRUE if the objects match, FALSE otherwise.
--*/ { if (GetSize() != blob.GetSize()) { return FALSE; }
return memcmp(m_pbItem, blob.m_pbItem, GetSize()) == 0; }
|