|
|
/******************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name: srshutil.cpp
Abstract: This file contains the implementation of common utility functions.
Revision History: Seong Kook Khang (SKKhang) 06/22/00 created
******************************************************************************/
#include "stdwin.h"
#include "rstrcore.h"
#include "resource.h"
/****************************************************************************/
LPWSTR IStrDup( LPCWSTR cszSrc ) { TraceFunctEnter("IStrDup"); int ccLen = 0 ; LPWSTR szNew = NULL ;
if ( cszSrc == NULL || cszSrc[0] == L'\0' ) goto Exit;
ccLen = ::lstrlen( cszSrc ); szNew = new WCHAR[ccLen+2]; if ( szNew == NULL ) { //LOGLOG - Insufficient memory!!!
goto Exit; }
::lstrcpy( szNew, cszSrc );
Exit: TraceFunctLeave(); return( szNew ); }
/****************************************************************************/
DWORD StrCpyAlign4( LPBYTE pbDst, LPCWSTR cszSrc ) { DWORD dwLen = 0 ;
if ( cszSrc != NULL ) dwLen = ::lstrlen( cszSrc ) * sizeof(WCHAR);
if ( cszSrc == NULL || dwLen == 0 ) { *((LPDWORD)pbDst) = 0; } else { dwLen = ( dwLen + sizeof(WCHAR) + 3 ) & ~3; *((LPDWORD)pbDst) = dwLen; ::lstrcpy( (LPWSTR)(pbDst+sizeof(DWORD)), cszSrc ); } return( dwLen+sizeof(DWORD) ); }
/****************************************************************************/
BOOL ReadStrAlign4( HANDLE hFile, LPWSTR szStr ) { TraceFunctEnter("ReadStrAlign4"); BOOL fRet = FALSE; DWORD dwLen; DWORD dwRes;
READFILE_AND_VALIDATE( hFile, &dwLen, sizeof(DWORD), dwRes, Exit );
if ( dwLen > MAX_PATH*sizeof(WCHAR)+sizeof(DWORD) ) { // Broken log file...
goto Exit; }
if ( dwLen > 0 ) { READFILE_AND_VALIDATE( hFile, szStr, dwLen, dwRes, Exit ); } else szStr[0] = L'\0';
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/****************************************************************************/
BOOL SRFormatMessage( LPWSTR szMsg, UINT uFmtId, ... ) { TraceFunctEnter("SRFormatMessage"); BOOL fRet = FALSE; va_list marker; WCHAR szFmt[MAX_STR];
va_start( marker, uFmtId ); ::LoadString( g_hInst, uFmtId, szFmt, MAX_STR ); if ( 0 == ::FormatMessage( FORMAT_MESSAGE_FROM_STRING, szFmt, 0, 0, szMsg, MAX_STR, &marker ) ) { LPCWSTR cszErr = ::GetSysErrStr(); ErrorTrace(0, "::FormatMessage failed - %ls", cszErr); goto Exit; } va_end( marker );
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/****************************************************************************/
BOOL ShowSRErrDlg( UINT uMsgId ) { TraceFunctEnter("ShowSRErrDlg"); BOOL fRet = FALSE; LPCWSTR cszErr; WCHAR szTitle[256]; WCHAR szMsg[1024];
if ( ::LoadString( g_hInst, IDS_SYSTEMRESTORE, szTitle, sizeof(szTitle )/sizeof(WCHAR) ) == 0 ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadString(%u) failed - %ls", IDS_SYSTEMRESTORE, cszErr); goto Exit; } if ( ::LoadString( g_hInst, uMsgId, szMsg, sizeof(szMsg )/sizeof(WCHAR) ) == 0 ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadString(%u) failed - %ls", uMsgId, cszErr); goto Exit; }
::MessageBox( NULL, szMsg, szTitle, MB_OK );
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/****************************************************************************/
BOOL SRGetRegDword( HKEY hKey, LPCWSTR cszSubKey, LPCWSTR cszValue, DWORD *pdwData ) { TraceFunctEnter("SRGetRegDword"); BOOL fRet = FALSE; DWORD dwType; DWORD dwRes; DWORD cbData;
dwType = REG_DWORD; cbData = sizeof(DWORD); dwRes = ::SHGetValue( hKey, cszSubKey, cszValue, &dwType, pdwData, &cbData ); if ( dwRes != ERROR_SUCCESS ) { LPCWSTR cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::SHGetValue failed - %ls", cszErr); goto Exit; }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/****************************************************************************/
BOOL SRSetRegDword( HKEY hKey, LPCWSTR cszSubKey, LPCWSTR cszValue, DWORD dwData ) { TraceFunctEnter("SRSetRegDword"); BOOL fRet = FALSE; DWORD dwRes;
dwRes = ::SHSetValue( hKey, cszSubKey, cszValue, REG_DWORD, &dwData, sizeof(DWORD) ); if ( dwRes != ERROR_SUCCESS ) { LPCWSTR cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::SHSetValue failed - %ls", cszErr); goto Exit; }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/****************************************************************************/
BOOL SRSetRegStr( HKEY hKey, LPCWSTR cszSubKey, LPCWSTR cszValue, LPCWSTR cszData ) { TraceFunctEnter("SRSetRegStr"); BOOL fRet = FALSE; DWORD dwRes;
dwRes = ::SHSetValue( hKey, cszSubKey, cszValue, REG_SZ, cszData, sizeof(WCHAR)*::lstrlen(cszData) ); if ( dwRes != ERROR_SUCCESS ) { LPCWSTR cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::SHSetValue failed - %ls", cszErr); goto Exit; }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/****************************************************************************/ /*
LPWSTR SRGetRegMultiSz( HKEY hkRoot, LPCWSTR cszSubKey, LPCWSTR cszValue, LPDWORD pdwData ) { TraceFunctEnter("SRGetRegMultiSz"); LPCWSTR cszErr; DWORD dwRes; HKEY hKey = NULL; DWORD dwType; DWORD cbData; LPWSTR szBuf = NULL;
dwRes = ::RegOpenKeyEx( hkRoot, cszSubKey, 0, KEY_ALL_ACCESS, &hKey ); if ( dwRes != ERROR_SUCCESS ) { cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::RegOpenKey() failed - %ls", cszErr); goto Exit; }
dwRes = ::RegQueryValueEx( hKey, cszValue, 0, &dwType, NULL, &cbData ); if ( dwRes != ERROR_SUCCESS ) { cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::RegQueryValueEx(len) failed - %ls", cszErr); goto Exit; } if ( dwType != REG_MULTI_SZ ) { ErrorTrace(0, "Type of '%ls' is %u (not REG_MULTI_SZ)...", cszValue, dwType); goto Exit; } if ( cbData == 0 ) { ErrorTrace(0, "Value '%ls' is empty...", cszValue); goto Exit; }
szBuf = new WCHAR[cbData+2]; dwRes = ::RegQueryValueEx( hKey, cszValue, 0, &dwType, (LPBYTE)szBuf, &cbData ); if ( dwRes != ERROR_SUCCESS ) { cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::RegQueryValueEx(data) failed - %ls", cszErr); delete [] szBuf; szBuf = NULL; }
if ( pdwData != NULL ) *pdwData = cbData;
Exit: if ( hKey != NULL ) ::RegCloseKey( hKey ); TraceFunctLeave(); return( szBuf ); } */ /****************************************************************************/ /*
BOOL SRSetRegMultiSz( HKEY hkRoot, LPCWSTR cszSubKey, LPCWSTR cszValue, LPCWSTR cszData, DWORD cbData ) { TraceFunctEnter("SRSetRegMultiSz"); BOOL fRet = FALSE; LPCWSTR cszErr; DWORD dwRes; HKEY hKey = NULL;
dwRes = ::RegOpenKeyEx( hkRoot, cszSubKey, 0, KEY_ALL_ACCESS, &hKey ); if ( dwRes != ERROR_SUCCESS ) { cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::RegOpenKey() failed - %ls", cszErr); goto Exit; }
dwRes = ::RegSetValueEx( hKey, cszValue, 0, REG_MULTI_SZ, (LPBYTE)cszData, cbData ); if ( dwRes != ERROR_SUCCESS ) { cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::RegSetValueEx() failed - %ls", cszErr); goto Exit; }
fRet = TRUE; Exit: if ( hKey != NULL ) ::RegCloseKey( hKey ); TraceFunctLeave(); return( fRet ); } */ /****************************************************************************/
/////////////////////////////////////////////////////////////////////////////
//
// CSRStr class
//
/////////////////////////////////////////////////////////////////////////////
CSRStr::CSRStr() { TraceFunctEnter("CSRStr::CSRStr()");
m_cch = 0; m_str = NULL;
TraceFunctLeave(); }
/****************************************************************************/
CSRStr::CSRStr( LPCWSTR cszSrc ) { TraceFunctEnter("CSRStr::CSRStr(LPCWSTR)");
m_str = NULL; SetStr( cszSrc );
TraceFunctLeave(); }
/****************************************************************************/
CSRStr::~CSRStr() { TraceFunctEnter("CSRStr::~CSRStr");
Empty();
TraceFunctLeave(); }
/****************************************************************************/
int CSRStr::Length() { TraceFunctEnter("CSRStr::Length"); TraceFunctLeave(); return( m_cch ); }
/****************************************************************************/
CSRStr::operator LPCWSTR() { TraceFunctEnter("CSRStr::operator LPCWSTR"); TraceFunctLeave(); return( m_str ); }
/****************************************************************************/
void CSRStr::Empty() { TraceFunctEnter("CSRStr::Empty");
if ( m_str != NULL ) { delete [] m_str; m_str = NULL; m_cch = 0; }
TraceFunctLeave(); }
/****************************************************************************/
BOOL CSRStr::SetStr( LPCWSTR cszSrc, int cch ) { TraceFunctEnter("CSRStr::SetStr(LPCWSTR,int)"); BOOL fRet = FALSE;
Empty();
if ( cszSrc == NULL ) goto Exit;
if ( cch == -1 ) cch = ::lstrlen( cszSrc );
if ( cch > 0 ) { m_str = new WCHAR[cch+2]; if ( m_str == NULL ) { ErrorTrace(TRACE_ID, "Insufficient memory..."); goto Exit; } ::StrCpyN( m_str, cszSrc, cch+1 ); m_str[cch] = L'\0'; m_cch = cch; }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/****************************************************************************/
const CSRStr& CSRStr::operator =( LPCWSTR cszSrc ) { TraceFunctEnter("CSRStr::operator =(LPCWSTR)");
SetStr( cszSrc );
TraceFunctLeave(); return( *this ); }
/////////////////////////////////////////////////////////////////////////////
//
// CSRLockFile class
//
/////////////////////////////////////////////////////////////////////////////
CSRLockFile::CSRLockFile() { TraceFunctEnter("CSRLockFile::CSRLockFile()"); LPCWSTR cszErr; LPWSTR szList; DWORD cbData; LPCWSTR cszPath; DWORD dwAttr; HANDLE hLock; HMODULE hLoad;
szList = ::SRGetRegMultiSz( HKEY_LOCAL_MACHINE, SRREG_PATH_SHELL, SRREG_VAL_LOCKFILELIST, &cbData ); if ( szList != NULL ) { cszPath = szList; while ( *cszPath != L'\0' ) { dwAttr = ::GetFileAttributes( cszPath ); if ( dwAttr != 0xFFFFFFFF ) { if ( ( dwAttr & FILE_ATTRIBUTE_DIRECTORY ) != 0 ) { // Lock Directory...
hLock = ::CreateFile( cszPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); } else { // Lock File...
hLock = ::CreateFile( cszPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL ); } if ( hLock == INVALID_HANDLE_VALUE ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::CreateFile() failed - %ls", cszErr); ErrorTrace(0, " cszPath='%ls'", cszPath); }
m_aryLock.AddItem( hLock ); } else ErrorTrace(0, "Object does not exist - '%ls'", cszPath);
cszPath += ::lstrlen( cszPath ) + 1; } } delete [] szList;
szList = ::SRGetRegMultiSz( HKEY_LOCAL_MACHINE, SRREG_PATH_SHELL, SRREG_VAL_LOADFILELIST, &cbData ); if ( szList != NULL ) { cszPath = szList; while ( *cszPath != L'\0' ) { dwAttr = ::GetFileAttributes( cszPath ); if ( dwAttr != 0xFFFFFFFF ) { hLoad = ::LoadLibrary( cszPath ); if ( hLoad == NULL ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadLibrary() failed - %ls", cszErr); ErrorTrace(0, " cszPath='%ls'", cszPath); }
m_aryLoad.AddItem( hLoad ); } else ErrorTrace(0, "Executable does not exist - '%ls'", cszPath);
cszPath += ::lstrlen( cszPath ) + 1; } } delete [] szList;
TraceFunctLeave(); }
/****************************************************************************/
CSRLockFile::~CSRLockFile() { TraceFunctEnter("CSRLockFile::~CSRLockFile"); LPCWSTR cszErr; int i;
for ( i = m_aryLock.GetUpperBound(); i >= 0; i-- ) if ( m_aryLock[i] != INVALID_HANDLE_VALUE ) if ( !::CloseHandle( m_aryLock[i] ) ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::CloseHandle(m_aryLock[%d]) failed - %ls", i, cszErr); }
for ( i = m_aryLoad.GetUpperBound(); i >= 0; i-- ) if ( m_aryLoad[i] != NULL ) if ( !::FreeLibrary( m_aryLoad[i] ) ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::CloseHandle(m_aryLoad[%d]) failed - %ls", i, cszErr); }
TraceFunctLeave(); }
// end of file
|