//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: util.cxx // //-------------------------------------------------------------------------- #include "precomp.h" #include "shlguid.h" // FileExists function #define _dwGFAFail 0xFFFFFFFF #define _nMaxLines 1000 // Reg functions #define nMAX_REGROOT 7 #define nREGROOT_SZ 24 BOOL DirectoryExists( LPWSTR szDir ) { DWORD dwAttr = GetFileAttributes( szDir ); if( _dwGFAFail == dwAttr ) return FALSE; return (BOOL)( dwAttr & FILE_ATTRIBUTE_DIRECTORY ); } BOOL FileExists( LPWSTR szFile ) { DWORD dwAttr = GetFileAttributes( szFile ); if( _dwGFAFail == dwAttr ) return FALSE; return (BOOL)( !(dwAttr & FILE_ATTRIBUTE_DIRECTORY) ); } VOID StripPath( LPWSTR szFullPath ) { LPWSTR lpc = GetFileName( szFullPath ); if( !lpc ) return; lstrcpy( szFullPath, lpc ); } VOID StripPathW( LPWSTR wszFullPath ) { LPWSTR lpwc = GetFileNameW( wszFullPath ); if( !lpwc || lpwc == wszFullPath ) return; SzCpyW( wszFullPath, lpwc ); } VOID StripFile( LPWSTR szFullPath ) { LPWSTR lpc = GetFileName( szFullPath ); if( !lpc ) return; *lpc = cNIL; } VOID StripExt( LPWSTR szFullPath ) { LPWSTR lpc = GetFileName(szFullPath); if( !lpc ) return; while( *lpc && *lpc != cPERIOD ) { lpc++; } if( *lpc == cPERIOD ) *lpc = cNIL; } LPWSTR GetFileName( LPWSTR lpszFullPath ) { LPWSTR lpszFileName; if( !lpszFullPath) return lpNIL; for (lpszFileName = lpszFullPath; *lpszFullPath; lpszFullPath++) { if (*lpszFullPath == cBACKSLASH) lpszFileName = lpszFullPath + 1; } return lpszFileName; } LPWSTR GetFileNameW( LPWSTR wszFullPath ) { LPWSTR lpwc; if( !wszFullPath || wszFullPath[0] == 0) return lpNIL; lpwc = wszFullPath + CchWsz(wszFullPath) - 1; while( *lpwc != (WCHAR)cBACKSLASH && lpwc != wszFullPath ) lpwc--; if( lpwc == wszFullPath ) return wszFullPath; return ++lpwc; } BOOL bNoTrailingSlash( LPWSTR szPath ) { LPWSTR lpc; WCHAR cLast; for( lpc = szPath; *lpc; cLast = *lpc, lpc++ ) ; return ( cLast != cBACKSLASH ); } BOOL GetUniqueName( LPWSTR szPath, LPWSTR szBase, BOOL fFile ) { INT nTry; LPWSTR lpFileName; WCHAR szFormat[cbMAX_SZ]; if( bNoTrailingSlash(szPath) ) lstrcat( szPath, szBACKSLASH ); lpFileName = szPath + lstrlen(szPath); lstrcpy( lpFileName, szBase ); nTry = 0; while( 0xffffffff != GetFileAttributes(szPath) ) { wcscpy( szFormat, g_DuplicateFileTemplate ); wsprintf( lpFileName, szFormat, ++nTry, szBase ); } return TRUE; } DWORD GetDirectorySize( LPWSTR szFolder ) { BOOL bRet; HANDLE hFind; DWORD dwSize = 0L; WCHAR szBaseDir[MAX_PATH]; WCHAR szSpec[MAX_PATH]; WIN32_FIND_DATA findData; // get base directory ending with backslash lstrcpy( szBaseDir, szFolder ); if( bNoTrailingSlash(szBaseDir) ) lstrcat( szBaseDir, szBACKSLASH ); // form search string lstrcpy( szSpec, szBaseDir ); lstrcat( szSpec, L"*.*" ); hFind = FindFirstFile( szSpec, &findData ); bRet = ( hFind != INVALID_HANDLE_VALUE ); while( bRet ) { WCHAR szObj[cbMAX_SZ]; lstrcpy( szObj, szBaseDir ); lstrcat( szObj, findData.cFileName ); if( findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { // weed out "." and ".." if( *(findData.cFileName) != cPERIOD ) dwSize += GetDirectorySize( szObj ); } else { HANDLE hFile = CreateFile( szObj, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( INVALID_HANDLE_VALUE != hFile ) { //REVIEW: won't work for REALLY large files dwSize += GetFileSize( hFile, NULL ); CloseHandle( hFile ); } } bRet = FindNextFile( hFind, &findData ); } if (hFind != INVALID_HANDLE_VALUE) { FindClose(hFind); } return dwSize; } LPWSTR SzToWsz( LPCSTR lpsz ) { INT nSzLen = lstrlenA(lpsz); LPWSTR lpwsz = (LPWSTR) MemAlloc((nSzLen+1)*sizeof(WCHAR)); if (lpwsz){ MultiByteToWideChar( CP_ACP, 0L, lpsz, nSzLen, lpwsz, nSzLen+1 ); } return lpwsz; } LPSTR WszToSz( LPCWSTR lpwsz ) { int err; int Length; LPSTR lpsz; Length = WideCharToMultiByte(CP_ACP, 0L, lpwsz, -1, 0, 0, NULL, NULL ); lpsz = (LPSTR) MemAlloc(1+Length); if (!lpsz) { return 0; } if ( !WideCharToMultiByte(CP_ACP, 0L, lpwsz, Length, lpsz, 1+Length, NULL, NULL )) { MemFree( lpsz ); return 0; } return lpsz; } INT SzLenW( LPCWSTR lpwsz ) { WCHAR *pwc = (WCHAR *)lpwsz; if( !lpwsz ) return 0; while( *pwc++ != 0 ) ; return (INT)(--pwc - lpwsz); } LPWSTR SzCpyW( LPWSTR lpsz1, LPCWSTR lpsz2 ) { LPWSTR lpwsz = lpsz1; while( *lpsz2 ) *lpsz1++ = *lpsz2++; *lpsz1 = 0; return lpwsz; } INT SzCmpN( LPCSTR lpsz1, LPCSTR lpsz2, INT nLen ) { while( *lpsz1 && *lpsz2 && *lpsz1 == *lpsz2 && --nLen > 0 ) { lpsz1++; lpsz2++; } return ( *lpsz1 - *lpsz2 ); } BOOL IsRoomForFile( __int64 dwFileSize, LPWSTR szPath ) { BOOL fRet; ULARGE_INTEGER MyDiskFreeBytes; ULARGE_INTEGER DiskFreeBytes; ULARGE_INTEGER DiskTotalBytes; fRet = GetDiskFreeSpaceEx( szPath, &MyDiskFreeBytes, &DiskTotalBytes, &DiskFreeBytes ); if( fRet ) { fRet = ( MyDiskFreeBytes.QuadPart >= (ULONGLONG) dwFileSize ); } return fRet; } __int64 _Get100nsIntervalsFrom1601To1970( VOID ) { __int64 ilrg100nsPerSec = 10000000; // 100-ns intervals per second (10^7) __int64 ilrg100nsPerMin = 60*ilrg100nsPerSec; __int64 ilrgDays = 369*365 + 89; // 369 years (89 are leap years). __int64 ilrgMin = ilrgDays*24*60; __int64 ilrgRet; ilrgRet = ilrgMin * ilrg100nsPerMin; return ilrgRet; } BOOL FileTimeToUnixTime( IN LPFILETIME lpFileTime, OUT LPDWORD pdwUnixTime ) { LARGE_INTEGER lrgTime = { lpFileTime->dwLowDateTime, lpFileTime->dwHighDateTime }; __int64 ilrgFileTime = *((__int64*)lpFileTime); __int64 ilrgIntervalsTil1970 = _Get100nsIntervalsFrom1601To1970(); __int64 ilrgIntsSince1970; __int64 ilrgSecSince1970; __int64 ilrg100nsPerSec = 10000000; __int64 ilrgRem; // Get the intervals since 1970 ilrgIntsSince1970 = ilrgFileTime - ilrgIntervalsTil1970; // Convert to seconds since 1970 ilrgSecSince1970 = ilrgIntsSince1970/ilrg100nsPerSec; if (ilrgSecSince1970 >= 0xffffffff) { return FALSE; } *pdwUnixTime = (DWORD)ilrgSecSince1970; return TRUE; } BOOL UnixTimeToFileTime( DWORD dwUnixTime, LPFILETIME lpFileTime ) { __int64 ilrg100nsPerSec = 10000000; // 100-ns intervals/second (10^7) __int64 ilrgIntervalsSince1601; __int64 ilrgIntervalsSince1970; __int64 ilrgIntervalsTil1970 = _Get100nsIntervalsFrom1601To1970(); // Get the intervals since 1970 ilrgIntervalsSince1970 = dwUnixTime * ilrg100nsPerSec; // Get the intervals since 1601 ilrgIntervalsSince1601 = ilrgIntervalsTil1970 + ilrgIntervalsSince1970; *lpFileTime = *((FILETIME*)&ilrgIntervalsSince1601); return TRUE; }