|
|
//--------------------------------------------------------------------------
// Utility.cpp
//--------------------------------------------------------------------------
#include "pch.hxx"
#include "dllmain.h"
#include "utility.h"
#include "database.h"
#include "wrapwide.h"
//--------------------------------------------------------------------------
// CreateSystemHandleName
//--------------------------------------------------------------------------
HRESULT CreateSystemHandleName(LPCWSTR pwszBase, LPCWSTR pwszSpecific, LPWSTR *ppwszName) { // Locals
HRESULT hr=S_OK; DWORD cchName; LPWSTR pszT;
// Trace
TraceCall("CreateSystemHandleName");
// Invalid Args
Assert(pwszBase && pwszSpecific && ppwszName);
// Init
*ppwszName = NULL;
// Compute Length
cchName = lstrlenW(pwszBase) + lstrlenW(pwszSpecific) + 15;
// Allocate
IF_NULLEXIT(*ppwszName = AllocateStringW(cchName));
// Setup Arguments
wsprintfWrapW(*ppwszName, cchName, L"%s%s", pwszBase, pwszSpecific);
// Remove backslashes from this string
for (pszT = (*ppwszName); *pszT != L'\0'; pszT++) { // Replace Back Slashes
if (*pszT == L'\\') { // With _
*pszT = L'_'; } }
// Lower Case
CharLowerBuffWrapW(*ppwszName, lstrlenW(*ppwszName));
exit: // Done
return hr; }
// --------------------------------------------------------------------------------
// DBGetFullPath
// --------------------------------------------------------------------------------
HRESULT DBGetFullPath(LPCWSTR pszFilePath, LPWSTR *ppszFullPath, LPDWORD pcchFilePath) { // Locals
HRESULT hr=S_OK; DWORD cchAllocate; LPWSTR pszFilePart;
// Trace
TraceCall("DBGetFullPath");
// Set cchFullPath
cchAllocate = max(lstrlenW(pszFilePath), MAX_PATH + MAX_PATH);
// Allocate ppszFullPath
IF_NULLEXIT(*ppszFullPath = AllocateStringW(cchAllocate));
// GetFullPathName
*pcchFilePath = GetFullPathNameWrapW(pszFilePath, cchAllocate, (*ppszFullPath), &pszFilePart);
// Failure
if (*pcchFilePath && *pcchFilePath >= cchAllocate) { // Re-allocate
IF_NULLEXIT(*ppszFullPath = AllocateStringW(*pcchFilePath));
// Expand the Path
*pcchFilePath = GetFullPathNameWrapW(pszFilePath, *pcchFilePath, (*ppszFullPath), &pszFilePart); }
// cch is 0
if (0 == *pcchFilePath) { hr = TraceResult(E_FAIL); goto exit; }
// Validate
Assert((*ppszFullPath)[(*pcchFilePath)] == L'\0');
exit: // Done
return(hr); }
// --------------------------------------------------------------------------------
// CompareTableIndexes
// --------------------------------------------------------------------------------
HRESULT CompareTableIndexes(LPCTABLEINDEX pIndex1, LPCTABLEINDEX pIndex2) { // Locals
DWORD i;
// Trace
TraceCall("CompareTableIndexes");
// Different Number of Keys
if (pIndex1->cKeys != pIndex2->cKeys) return(S_FALSE);
// Loop through the keys
for (i=0; i<pIndex1->cKeys; i++) { // Different Column
if (pIndex1->rgKey[i].iColumn != pIndex2->rgKey[i].iColumn) return(S_FALSE);
// Different Compare Flags
if (pIndex1->rgKey[i].bCompare != pIndex2->rgKey[i].bCompare) return(S_FALSE);
// Different Compare Bits
if (pIndex1->rgKey[i].dwBits != pIndex2->rgKey[i].dwBits) return(S_FALSE); }
// Equal
return(S_OK); }
//--------------------------------------------------------------------------
// DBOpenFile
//--------------------------------------------------------------------------
HRESULT DBOpenFile(LPCWSTR pszFile, BOOL fNoCreate, BOOL fExclusive, BOOL *pfNew, HANDLE *phFile) { // Locals
HRESULT hr=S_OK; HANDLE hFile; DWORD dwShare; DWORD dwCreate;
// Trace
TraceCall("DBOpenFile");
// Invalid Args
Assert(pszFile && phFile); // Initialize
*phFile = NULL; *pfNew = FALSE;
// Set Share Falgs
dwShare = fExclusive ? 0 : FILE_SHARE_READ | FILE_SHARE_WRITE;
// If not fNoCreate, then OPEN_ALWAYS
dwCreate = fNoCreate ? OPEN_EXISTING : OPEN_ALWAYS;
// Do the CreateFile
hFile = CreateFileWrapW(pszFile, GENERIC_READ | GENERIC_WRITE, dwShare, NULL, dwCreate, FILE_FLAG_RANDOM_ACCESS | FILE_ATTRIBUTE_NORMAL, NULL);
// Failure
if (INVALID_HANDLE_VALUE == hFile) { // Return a Good Error
if (ERROR_SHARING_VIOLATION == GetLastError()) { // Set hr
hr = TraceResult(DB_E_ACCESSDENIED); }
// Otherwise, generic Error
else { // Create File
hr = TraceResult(DB_E_CREATEFILE); }
// Done
goto exit; }
// If Not no create
if (FALSE == fNoCreate) { // Return pfNew ?
*pfNew = (ERROR_ALREADY_EXISTS == GetLastError()) ? FALSE : TRUE; }
// Return the hFile
*phFile = hFile;
exit: // Done
return(hr); }
//--------------------------------------------------------------------------
// DBMapViewOfFile
//--------------------------------------------------------------------------
HRESULT DBMapViewOfFile(HANDLE hMapping, DWORD cbFile, LPFILEADDRESS pfaView, LPDWORD pcbView, LPVOID *ppvView) { // Locals
FILEADDRESS faBase = (*pfaView); DWORD cbSize = (*pcbView);
// cbBoundary
DWORD cbBoundary = (faBase % g_SystemInfo.dwAllocationGranularity);
// Decrement faBase
faBase -= cbBoundary;
// Increment cbSize
cbSize += cbBoundary;
// Fixup cbSize
if (faBase + cbSize > cbFile) { // Map to the end of the file
cbSize = (cbFile - faBase); }
// Map a view of the entire file
*ppvView = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, faBase, cbSize);
// Failure
if (NULL == *ppvView) return(TraceResult(DB_E_MAPVIEWOFFILE));
// Return Actual Sizes
*pfaView = faBase; *pcbView = cbSize;
// Success
return(S_OK); }
//--------------------------------------------------------------------------
// DBOpenFileMapping
//--------------------------------------------------------------------------
HRESULT DBOpenFileMapping(HANDLE hFile, LPCWSTR pwszName, DWORD cbSize, BOOL *pfNew, HANDLE *phMemoryMap, LPVOID *ppvView) { // Locals
HRESULT hr=S_OK; HANDLE hMemoryMap=NULL; LPVOID pvView=NULL;
// Tracing
TraceCall("OpenFileMapping");
// Invalid Arg
Assert(hFile != NULL && phMemoryMap && pfNew);
// Initialize
*phMemoryMap = NULL; *pfNew = FALSE; if (ppvView) *ppvView = NULL;
// Open or create the file mapping
hMemoryMap = OpenFileMappingWrapW(FILE_MAP_ALL_ACCESS, FALSE, pwszName);
// If that failed, then lets create the file mapping
if (NULL == hMemoryMap) { // Create the file mapping
hMemoryMap = CreateFileMappingWrapW(hFile, NULL, PAGE_READWRITE, 0, cbSize, pwszName);
// Failure
if (NULL == hMemoryMap) { hr = TraceResult(DB_E_CREATEFILEMAPPING); goto exit; }
// Set a State
*pfNew = TRUE; }
// Map the View
if (ppvView) { // Map a view of the entire file
pvView = MapViewOfFile(hMemoryMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// Failure
if (NULL == pvView) { hr = TraceResult(DB_E_MAPVIEWOFFILE); goto exit; }
// Return It
*ppvView = pvView;
// Don't Free It
pvView = NULL; }
// Set Return Values
*phMemoryMap = hMemoryMap;
// Don't Free
hMemoryMap = NULL;
exit: // Cleanup
if (pvView) UnmapViewOfFile(pvView); if (hMemoryMap) CloseHandle(hMemoryMap);
// Done
return hr; }
//--------------------------------------------------------------------------
// RegisterWindowClass
//--------------------------------------------------------------------------
HRESULT RegisterWindowClass(LPCSTR pszClass, WNDPROC pfnWndProc) { // Locals
HRESULT hr=S_OK; WNDCLASS WindowClass;
// Tracing
TraceCall("RegisterWindowClass");
// Register the Window Class
if (0 != GetClassInfo(g_hInst, pszClass, &WindowClass)) goto exit;
// Zero the object
ZeroMemory(&WindowClass, sizeof(WNDCLASS));
// Initialize the Window Class
WindowClass.lpfnWndProc = pfnWndProc; WindowClass.hInstance = g_hInst; WindowClass.lpszClassName = pszClass;
// Register the Class
if (0 == RegisterClass(&WindowClass)) { hr = TraceResult(E_FAIL); goto exit; }
exit: // Done
return hr; }
//--------------------------------------------------------------------------
// CreateNotifyWindow
//--------------------------------------------------------------------------
HRESULT CreateNotifyWindow(LPCSTR pszClass, LPVOID pvParam, HWND *phwndNotify) { // Locals
HRESULT hr=S_OK; HWND hwnd;
// Tracing
TraceCall("CreateNotifyWindow");
// Invalid ARg
Assert(pszClass && phwndNotify);
// Initialize
*phwndNotify = NULL;
// Create the Window
hwnd = CreateWindowEx(WS_EX_TOPMOST, pszClass, pszClass, WS_POPUP, 0, 0, 0, 0, NULL, NULL, g_hInst, (LPVOID)pvParam);
// Failure
if (NULL == hwnd) { hr = TraceResult(E_FAIL); goto exit; }
// Set Return
*phwndNotify = hwnd;
exit: // Done
return hr; }
//--------------------------------------------------------------------------
// DBGetFileSize
//--------------------------------------------------------------------------
HRESULT DBGetFileSize(HANDLE hFile, LPDWORD pcbSize) { // Trace
TraceCall("GetFileSize");
// Invalid Arg
Assert(pcbSize);
// Get the Size
*pcbSize = ::GetFileSize(hFile, NULL); if (0xFFFFFFFF == *pcbSize) return TraceResult(DB_E_GETFILESIZE);
// Done
return S_OK; }
// --------------------------------------------------------------------------------
// GetAvailableDiskSpace
// --------------------------------------------------------------------------------
HRESULT GetAvailableDiskSpace(LPCWSTR pszFilePath, DWORDLONG *pdwlFree) { // Locals
HRESULT hr=S_OK; WCHAR wszDrive[5]; DWORD dwSectorsPerCluster; DWORD dwBytesPerSector; DWORD dwNumberOfFreeClusters; DWORD dwTotalNumberOfClusters;
// Trace
TraceCall("GetAvailableDiskSpace");
// Invalid Args
Assert(pszFilePath && pszFilePath[1] == L':' && pdwlFree);
// Split the path
wszDrive[0] = *pszFilePath; wszDrive[1] = L':'; wszDrive[2] = L'\\'; wszDrive[3] = L'\0'; // Get free disk space - if it fails, lets pray we have enought disk space
if (!GetDiskFreeSpaceWrapW(wszDrive, &dwSectorsPerCluster, &dwBytesPerSector, &dwNumberOfFreeClusters, &dwTotalNumberOfClusters)) { hr = TraceResult(E_FAIL); goto exit; }
// Return Amount of Free Disk Space
*pdwlFree = (dwNumberOfFreeClusters * (dwSectorsPerCluster * dwBytesPerSector));
exit: // Done
return hr; }
|