/*++ Copyright (c) 2001 Microsoft Corporation Abstract: Environment independed system functions implementation for Win32, Author: Souren Aghajanyan (sourenag) 24-Sep-2001 Revision History: --*/ #include "pch.h" #include "sysfunc.h" #include "functions.h" #include "windows.h" MY_OPENMUTEX g_OpenMutex = NULL; MY_CREATEMUTEX g_CreateMutex = NULL; MY_RELEASEMUTEX g_ReleaseMutex = NULL; MY_WAITFORSINGLEOBJECT g_WaitForSingleObject = NULL; MY_CLOSEHANDLE g_CloseHandle = NULL; MY_OPENSHAREDMEMORY g_OpenSharedMemory = NULL; MY_CREATESHAREDMEMORY g_CreateSharedMemory = NULL; MY_MAPSHAREDMEMORY g_MapSharedMemory = NULL; MY_UNMAPSHAREDMEMORY g_UnMapSharedMemory = NULL; MY_CREATESHAREDFILE g_CreateSharedFile = NULL; MY_SETFILEPOINTER g_SetFilePointer = NULL; MY_WRITEFILE g_WriteFile = NULL; MY_GETPROCESSORNUMBER g_GetProcessorsNumber = NULL; VOID ReleaseMutexWin32(HANDLE hObject) { ReleaseMutex(hObject); } DWORD WaitForSingleObjectWin32(HANDLE hObject, DWORD dwTimeout) { return WaitForSingleObject(hObject, dwTimeout); } VOID CloseHandleWin32(HANDLE hObject) { CloseHandle(hObject); } PVOID MapSharedMemoryWin32(HANDLE hObject) { return MapViewOfFile(hObject, FILE_MAP_ALL_ACCESS, 0, 0, 0); } BOOL UnMapSharedMemoryWin32(PVOID pSharedMemory) { return UnmapViewOfFile(pSharedMemory); } BOOL SetFilePointerWin32(HANDLE hObject, UINT uiOffset, DWORD dwMoveMethod) { return SetFilePointer(hObject, uiOffset, NULL, dwMoveMethod); } BOOL WriteFileWin32(HANDLE hObject, PVOID pBuffer, UINT uiNumberOfBytesToWrite, DWORD * pdwNumberOfBytesWritten) { return WriteFile(hObject, pBuffer, uiNumberOfBytesToWrite, pdwNumberOfBytesWritten, NULL); } // // Ansi version // HANDLE OpenMutexWin32A(PCWSTR pObjectName) { ASSERT(pObjectName); CBuffer buffer;buffer.Allocate(wcslen(pObjectName) + 2); PSTR pBuffer = (PSTR)buffer.GetBuffer(); sprintf(pBuffer, "%S", pObjectName); return OpenMutexA(MUTEX_ALL_ACCESS, FALSE, pBuffer); } HANDLE CreateMutexWin32A(PCWSTR pObjectName, BOOL bInitialOwnership) { ASSERT(pObjectName); CBuffer buffer;buffer.Allocate(wcslen(pObjectName) + 2); PSTR pBuffer = (PSTR)buffer.GetBuffer(); sprintf(pBuffer, "%S", pObjectName); return CreateMutexA(NULL, bInitialOwnership, pBuffer); } HANDLE OpenSharedMemoryWin32A(PCWSTR pObjectName) { ASSERT(pObjectName); CBuffer buffer;buffer.Allocate(wcslen(pObjectName) + 2); PSTR pBuffer = (PSTR)buffer.GetBuffer(); sprintf(pBuffer, "%S", pObjectName); return OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, pBuffer); } HANDLE CreateSharedMemoryWin32A(UINT uiInitialSizeOfMapView, PCWSTR pObjectName) { ASSERT(pObjectName); CBuffer buffer;buffer.Allocate(wcslen(pObjectName) + 2); PSTR pBuffer = (PSTR)buffer.GetBuffer(); sprintf(pBuffer, "%S", pObjectName); return CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, uiInitialSizeOfMapView, pBuffer); } HANDLE CreateSharedFileWin32A( IN PCWSTR pFilePath, IN DWORD dwShareMode, IN DWORD dwCreationDisposition, IN DWORD dwFlagsAndAttributes ) { ASSERT(pFilePath); CBuffer buffer;buffer.Allocate(wcslen(pFilePath) + 2); PSTR pAnsiFilePath = (PSTR)buffer.GetBuffer(); sprintf(pAnsiFilePath, "%S", pFilePath); return CreateFileA(pAnsiFilePath, GENERIC_WRITE | GENERIC_READ, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); } // // Unicode version // HANDLE OpenMutexWin32W(PCWSTR pObjectName) { ASSERT(pObjectName); return OpenMutexW(MUTEX_ALL_ACCESS, FALSE, pObjectName); } HANDLE CreateMutexWin32W(PCWSTR pObjectName, BOOL bInitialOwnership) { ASSERT(pObjectName); return CreateMutexW(NULL, bInitialOwnership, pObjectName); } HANDLE OpenSharedMemoryWin32W(PCWSTR pObjectName) { ASSERT(pObjectName); return OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, pObjectName); } HANDLE CreateSharedMemoryWin32W(UINT uiInitialSizeOfMapView, PCWSTR pObjectName) { ASSERT(pObjectName); return CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, uiInitialSizeOfMapView, pObjectName); } HANDLE CreateSharedFileWin32W( IN PCWSTR pFilePath, IN DWORD dwShareMode, IN DWORD dwCreationDisposition, IN DWORD dwFlagsAndAttributes ) { ASSERT(pFilePath); return CreateFileW(pFilePath, GENERIC_WRITE | GENERIC_READ, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); } BOOL IsSystemNT( VOID ) { static BOOL bSystemIsNT = FALSE; static BOOL bFirstTime = TRUE; if(bFirstTime){ bFirstTime = FALSE; bSystemIsNT = (GetVersion() < 0x80000000); } return bSystemIsNT; } UINT GetProcessorsNumberWin32( VOID ) { SYSTEM_INFO systemInfo; GetSystemInfo(&systemInfo); return systemInfo.dwNumberOfProcessors; } BOOL InitSystemFunctions() { if(IsSystemNT()){ g_OpenMutex = OpenMutexWin32W; g_CreateMutex = CreateMutexWin32W; g_OpenSharedMemory = OpenSharedMemoryWin32W; g_CreateSharedMemory = CreateSharedMemoryWin32W; g_CreateSharedFile = CreateSharedFileWin32W; } else{ g_OpenMutex = OpenMutexWin32A; g_CreateMutex = CreateMutexWin32A; g_OpenSharedMemory = OpenSharedMemoryWin32A; g_CreateSharedMemory = CreateSharedMemoryWin32A; g_CreateSharedFile = CreateSharedFileWin32A; } g_ReleaseMutex = ReleaseMutexWin32; g_WaitForSingleObject = WaitForSingleObjectWin32; g_CloseHandle = CloseHandleWin32; g_MapSharedMemory = MapSharedMemoryWin32; g_UnMapSharedMemory = UnMapSharedMemoryWin32; g_SetFilePointer = SetFilePointerWin32; g_WriteFile = WriteFileWin32; g_GetProcessorsNumber = GetProcessorsNumberWin32; return TRUE; } BOOL bInit = InitSystemFunctions();