mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
[Application]
- Added some codes to avoid loading a dll from current directory. [Library] - Added new functions to avoid loading a dll from current directory. (CSystem::RmSetDllDirectory(), CSystem::RmLoadLibrary())
This commit is contained in:
parent
3aa4673019
commit
3da0aa3f4c
@ -43,6 +43,7 @@ BOOL InitApplication(HINSTANCE hInstance, const WCHAR* WinClass);
|
|||||||
HWND InitInstance(HINSTANCE hInstance, const WCHAR* WinClass, const WCHAR* WinName);
|
HWND InitInstance(HINSTANCE hInstance, const WCHAR* WinClass, const WCHAR* WinName);
|
||||||
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
void Bang(const WCHAR* command);
|
void Bang(const WCHAR* command);
|
||||||
|
HMODULE RmLoadSystemLibrary(LPCWSTR lpLibFileName);
|
||||||
BOOL IsRunning(HANDLE* hMutex);
|
BOOL IsRunning(HANDLE* hMutex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -72,6 +73,14 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd
|
|||||||
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
|
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
|
||||||
// _CrtSetBreakAlloc(5055);
|
// _CrtSetBreakAlloc(5055);
|
||||||
|
|
||||||
|
// Avoid loading a dll from current directory
|
||||||
|
typedef BOOL (WINAPI *FPSETDLLDIRECTORYW)(LPCWSTR lpPathName);
|
||||||
|
FPSETDLLDIRECTORYW SetDllDirectoryW = (FPSETDLLDIRECTORYW)GetProcAddress(GetModuleHandle(L"Kernel32.dll"), "SetDllDirectoryW");
|
||||||
|
if (SetDllDirectoryW)
|
||||||
|
{
|
||||||
|
SetDllDirectoryW(L"");
|
||||||
|
}
|
||||||
|
|
||||||
if (lpCmdLine && lpCmdLine[0] == L'!')
|
if (lpCmdLine && lpCmdLine[0] == L'!')
|
||||||
{
|
{
|
||||||
// It's a !bang
|
// It's a !bang
|
||||||
@ -218,6 +227,29 @@ void Bang(const WCHAR* command)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** RmLoadSystemLibrary
|
||||||
|
**
|
||||||
|
** Loads a system dll from system32 directory.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
HMODULE RmLoadSystemLibrary(LPCWSTR lpLibFileName)
|
||||||
|
{
|
||||||
|
WCHAR buffer[MAX_PATH];
|
||||||
|
std::wstring path;
|
||||||
|
|
||||||
|
if (GetSystemDirectory(buffer, MAX_PATH))
|
||||||
|
{
|
||||||
|
path = buffer;
|
||||||
|
path += L"\\";
|
||||||
|
path += lpLibFileName;
|
||||||
|
|
||||||
|
return LoadLibrary(path.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** IsRunning
|
** IsRunning
|
||||||
**
|
**
|
||||||
@ -239,7 +271,7 @@ BOOL IsRunning(HANDLE* hMutex)
|
|||||||
typedef void (WINAPI *FPMD5FINAL)(MD5_CTX *context);
|
typedef void (WINAPI *FPMD5FINAL)(MD5_CTX *context);
|
||||||
|
|
||||||
// Create MD5 digest from command line
|
// Create MD5 digest from command line
|
||||||
HMODULE hCryptDll = LoadLibrary(L"cryptdll.dll");
|
HMODULE hCryptDll = RmLoadSystemLibrary(L"cryptdll.dll");
|
||||||
if (!hCryptDll) // Unable to check the mutex
|
if (!hCryptDll) // Unable to check the mutex
|
||||||
{
|
{
|
||||||
*hMutex = NULL;
|
*hMutex = NULL;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
#include "Rainmeter.h"
|
#include "Rainmeter.h"
|
||||||
|
#include "System.h"
|
||||||
#include "MeterWindow.h"
|
#include "MeterWindow.h"
|
||||||
#include "Measure.h"
|
#include "Measure.h"
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
@ -360,12 +361,8 @@ void ScanPlugins()
|
|||||||
|
|
||||||
// Try to get the version and author
|
// Try to get the version and author
|
||||||
std::wstring tmpSz = Rainmeter->GetPluginPath() + fileData.cFileName;
|
std::wstring tmpSz = Rainmeter->GetPluginPath() + fileData.cFileName;
|
||||||
UINT oldMode = SetErrorMode(0);
|
DWORD err = 0;
|
||||||
SetErrorMode(oldMode | SEM_FAILCRITICALERRORS); // Prevent the system from displaying message box
|
HMODULE dll = CSystem::RmLoadLibrary(tmpSz.c_str(), &err, true);
|
||||||
SetLastError(ERROR_SUCCESS);
|
|
||||||
HMODULE dll = LoadLibrary(tmpSz.c_str());
|
|
||||||
DWORD err = GetLastError();
|
|
||||||
SetErrorMode(oldMode); // Reset
|
|
||||||
if (dll)
|
if (dll)
|
||||||
{
|
{
|
||||||
GETPLUGINAUTHOR GetAuthorFunc = (GETPLUGINAUTHOR)GetProcAddress(dll, "GetPluginAuthor");
|
GETPLUGINAUTHOR GetAuthorFunc = (GETPLUGINAUTHOR)GetProcAddress(dll, "GetPluginAuthor");
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "Litestep.h"
|
#include "Litestep.h"
|
||||||
#include "Error.h"
|
#include "Error.h"
|
||||||
#include "Rainmeter.h"
|
#include "Rainmeter.h"
|
||||||
|
#include "System.h"
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
#include <crtdbg.h>
|
#include <crtdbg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -67,7 +68,7 @@ void ResetLoggingFlag()
|
|||||||
void InitalizeLitestep()
|
void InitalizeLitestep()
|
||||||
{
|
{
|
||||||
// Use lsapi's methods instead of the stubs
|
// Use lsapi's methods instead of the stubs
|
||||||
HINSTANCE h = LoadLibrary(L"lsapi.dll");
|
HINSTANCE h = CSystem::RmLoadLibrary(L"lsapi.dll");
|
||||||
if (h != NULL)
|
if (h != NULL)
|
||||||
{
|
{
|
||||||
fpAddBangCommand = (FPADDBANGCOMMAND)GetProcAddress(h, "AddBangCommand");
|
fpAddBangCommand = (FPADDBANGCOMMAND)GetProcAddress(h, "AddBangCommand");
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
#include "MeasureCPU.h"
|
#include "MeasureCPU.h"
|
||||||
#include "Rainmeter.h"
|
#include "Rainmeter.h"
|
||||||
|
#include "System.h"
|
||||||
#include "Error.h"
|
#include "Error.h"
|
||||||
|
|
||||||
#define STATUS_SUCCESS 0
|
#define STATUS_SUCCESS 0
|
||||||
@ -148,7 +149,7 @@ bool CMeasureCPU::Update()
|
|||||||
{
|
{
|
||||||
if (!CMeasure::PreUpdate()) return false;
|
if (!CMeasure::PreUpdate()) return false;
|
||||||
|
|
||||||
if (CRainmeter::IsNT() != PLATFORM_9X)
|
if (CSystem::IsNT())
|
||||||
{
|
{
|
||||||
if (m_Processor == 0 && m_GetSystemTimes)
|
if (m_Processor == 0 && m_GetSystemTimes)
|
||||||
{
|
{
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
#include "MeasureNet.h"
|
#include "MeasureNet.h"
|
||||||
#include "Rainmeter.h"
|
#include "Rainmeter.h"
|
||||||
|
#include "System.h"
|
||||||
|
|
||||||
BYTE* CMeasureNet::c_Table = NULL;
|
BYTE* CMeasureNet::c_Table = NULL;
|
||||||
UINT CMeasureNet::c_NumOfTables = 0;
|
UINT CMeasureNet::c_NumOfTables = 0;
|
||||||
@ -662,7 +663,7 @@ void CMeasureNet::InitializeNewApi()
|
|||||||
{
|
{
|
||||||
if (c_IpHlpApiLibrary == NULL)
|
if (c_IpHlpApiLibrary == NULL)
|
||||||
{
|
{
|
||||||
c_IpHlpApiLibrary = LoadLibrary(L"IpHlpApi.dll");
|
c_IpHlpApiLibrary = GetModuleHandle(L"IpHlpApi.dll");
|
||||||
if (c_IpHlpApiLibrary)
|
if (c_IpHlpApiLibrary)
|
||||||
{
|
{
|
||||||
c_GetIfTable2Ex = (FPGETIFTABLE2EX)GetProcAddress(c_IpHlpApiLibrary, "GetIfTable2Ex");
|
c_GetIfTable2Ex = (FPGETIFTABLE2EX)GetProcAddress(c_IpHlpApiLibrary, "GetIfTable2Ex");
|
||||||
@ -675,7 +676,6 @@ void CMeasureNet::InitializeNewApi()
|
|||||||
{
|
{
|
||||||
if (c_IpHlpApiLibrary)
|
if (c_IpHlpApiLibrary)
|
||||||
{
|
{
|
||||||
FreeLibrary(c_IpHlpApiLibrary);
|
|
||||||
c_IpHlpApiLibrary = NULL;
|
c_IpHlpApiLibrary = NULL;
|
||||||
}
|
}
|
||||||
c_GetIfTable2Ex = NULL;
|
c_GetIfTable2Ex = NULL;
|
||||||
@ -701,7 +701,6 @@ void CMeasureNet::FinalizeNewApi()
|
|||||||
{
|
{
|
||||||
c_FreeMibTable(c_Table);
|
c_FreeMibTable(c_Table);
|
||||||
|
|
||||||
FreeLibrary(c_IpHlpApiLibrary);
|
|
||||||
c_IpHlpApiLibrary = NULL;
|
c_IpHlpApiLibrary = NULL;
|
||||||
c_GetIfTable2Ex = NULL;
|
c_GetIfTable2Ex = NULL;
|
||||||
c_FreeMibTable = NULL;
|
c_FreeMibTable = NULL;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
#include "MeasurePlugin.h"
|
#include "MeasurePlugin.h"
|
||||||
#include "Rainmeter.h"
|
#include "Rainmeter.h"
|
||||||
|
#include "System.h"
|
||||||
#include "Error.h"
|
#include "Error.h"
|
||||||
|
|
||||||
extern CRainmeter* Rainmeter;
|
extern CRainmeter* Rainmeter;
|
||||||
@ -71,7 +72,7 @@ bool CMeasurePlugin::Update()
|
|||||||
WCHAR buffer[MAX_PATH];
|
WCHAR buffer[MAX_PATH];
|
||||||
GetCurrentDirectory(MAX_PATH, buffer);
|
GetCurrentDirectory(MAX_PATH, buffer);
|
||||||
|
|
||||||
SetCurrentDirectory(m_MeterWindow->MakePathAbsolute(L"").c_str());
|
SetCurrentDirectory((Rainmeter->GetSkinPath() + m_MeterWindow->GetSkinName()).c_str());
|
||||||
|
|
||||||
if(UpdateFunc)
|
if(UpdateFunc)
|
||||||
{
|
{
|
||||||
@ -120,14 +121,13 @@ void CMeasurePlugin::ReadConfig(CConfigParser& parser, const WCHAR* section)
|
|||||||
}
|
}
|
||||||
m_PluginName = Rainmeter->GetPluginPath() + m_PluginName;
|
m_PluginName = Rainmeter->GetPluginPath() + m_PluginName;
|
||||||
|
|
||||||
SetLastError(ERROR_SUCCESS);
|
DWORD err = 0;
|
||||||
m_Plugin = LoadLibrary(m_PluginName.c_str());
|
m_Plugin = CSystem::RmLoadLibrary(m_PluginName.c_str(), &err);
|
||||||
|
|
||||||
if(m_Plugin == NULL)
|
if(m_Plugin == NULL)
|
||||||
{
|
{
|
||||||
if (CRainmeter::GetDebug())
|
if (CRainmeter::GetDebug())
|
||||||
{
|
{
|
||||||
DWORD err = GetLastError();
|
|
||||||
DebugLog(L"Plugin: Unable to load plugin: \"%s\", ErrorCode=%i", m_PluginName.c_str(), err);
|
DebugLog(L"Plugin: Unable to load plugin: \"%s\", ErrorCode=%i", m_PluginName.c_str(), err);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,14 +137,13 @@ void CMeasurePlugin::ReadConfig(CConfigParser& parser, const WCHAR* section)
|
|||||||
{
|
{
|
||||||
std::wstring pluginName = Rainmeter->GetPath() + m_PluginName.substr(pos + 1);
|
std::wstring pluginName = Rainmeter->GetPath() + m_PluginName.substr(pos + 1);
|
||||||
|
|
||||||
SetLastError(ERROR_SUCCESS);
|
err = 0;
|
||||||
m_Plugin = LoadLibrary(pluginName.c_str());
|
m_Plugin = CSystem::RmLoadLibrary(pluginName.c_str(), &err);
|
||||||
|
|
||||||
if (m_Plugin == NULL)
|
if (m_Plugin == NULL)
|
||||||
{
|
{
|
||||||
if (CRainmeter::GetDebug())
|
if (CRainmeter::GetDebug())
|
||||||
{
|
{
|
||||||
DWORD err = GetLastError();
|
|
||||||
DebugLog(L"Plugin: Unable to load plugin: \"%s\", ErrorCode=%i", pluginName.c_str(), err);
|
DebugLog(L"Plugin: Unable to load plugin: \"%s\", ErrorCode=%i", pluginName.c_str(), err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,7 +175,10 @@ void CMeasurePlugin::ReadConfig(CConfigParser& parser, const WCHAR* section)
|
|||||||
WCHAR buffer[MAX_PATH];
|
WCHAR buffer[MAX_PATH];
|
||||||
GetCurrentDirectory(MAX_PATH, buffer);
|
GetCurrentDirectory(MAX_PATH, buffer);
|
||||||
|
|
||||||
SetCurrentDirectory(m_MeterWindow->MakePathAbsolute(L"").c_str());
|
SetCurrentDirectory((Rainmeter->GetSkinPath() + m_MeterWindow->GetSkinName()).c_str());
|
||||||
|
|
||||||
|
// Remove current directory from DLL search path
|
||||||
|
CSystem::RmSetDllDirectory(L"");
|
||||||
|
|
||||||
double maxValue;
|
double maxValue;
|
||||||
maxValue = InitializeFunc(m_Plugin, parser.GetFilename().c_str(), section, m_ID);
|
maxValue = InitializeFunc(m_Plugin, parser.GetFilename().c_str(), section, m_ID);
|
||||||
|
@ -130,7 +130,7 @@ CMeterWindow::CMeterWindow(std::wstring& path, std::wstring& config, std::wstrin
|
|||||||
m_SkinName = config;
|
m_SkinName = config;
|
||||||
m_SkinIniFile = iniFile;
|
m_SkinIniFile = iniFile;
|
||||||
|
|
||||||
m_User32Library = LoadLibrary(L"user32.dll");
|
m_User32Library = GetModuleHandle(L"user32.dll");
|
||||||
|
|
||||||
m_UpdateCounter = 0;
|
m_UpdateCounter = 0;
|
||||||
m_FontCollection = NULL;
|
m_FontCollection = NULL;
|
||||||
@ -175,8 +175,6 @@ CMeterWindow::~CMeterWindow()
|
|||||||
|
|
||||||
if(m_FontCollection) delete m_FontCollection;
|
if(m_FontCollection) delete m_FontCollection;
|
||||||
|
|
||||||
FreeLibrary(m_User32Library);
|
|
||||||
|
|
||||||
--c_InstanceCount;
|
--c_InstanceCount;
|
||||||
|
|
||||||
if (c_InstanceCount == 0)
|
if (c_InstanceCount == 0)
|
||||||
@ -281,16 +279,20 @@ void CMeterWindow::IgnoreAeroPeek()
|
|||||||
{
|
{
|
||||||
typedef HRESULT (WINAPI * FPDWMSETWINDOWATTRIBUTE)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
|
typedef HRESULT (WINAPI * FPDWMSETWINDOWATTRIBUTE)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
|
||||||
#define DWMWA_EXCLUDED_FROM_PEEK 12
|
#define DWMWA_EXCLUDED_FROM_PEEK 12
|
||||||
HINSTANCE h = LoadLibrary(L"dwmapi.dll");
|
|
||||||
if (h)
|
if (CSystem::GetOSPlatform() >= OSPLATFORM_VISTA)
|
||||||
{
|
{
|
||||||
FPDWMSETWINDOWATTRIBUTE DwmSetWindowAttribute = (FPDWMSETWINDOWATTRIBUTE)GetProcAddress(h, "DwmSetWindowAttribute");
|
HINSTANCE h = CSystem::RmLoadLibrary(L"dwmapi.dll");
|
||||||
if (DwmSetWindowAttribute)
|
if (h)
|
||||||
{
|
{
|
||||||
BOOL bValue = TRUE;
|
FPDWMSETWINDOWATTRIBUTE DwmSetWindowAttribute = (FPDWMSETWINDOWATTRIBUTE)GetProcAddress(h, "DwmSetWindowAttribute");
|
||||||
DwmSetWindowAttribute(m_Window, DWMWA_EXCLUDED_FROM_PEEK, &bValue, sizeof(bValue));
|
if (DwmSetWindowAttribute)
|
||||||
|
{
|
||||||
|
BOOL bValue = TRUE;
|
||||||
|
DwmSetWindowAttribute(m_Window, DWMWA_EXCLUDED_FROM_PEEK, &bValue, sizeof(bValue));
|
||||||
|
}
|
||||||
|
FreeLibrary(h);
|
||||||
}
|
}
|
||||||
FreeLibrary(h);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1662,8 +1664,8 @@ void CMeterWindow::ReadConfig()
|
|||||||
section = m_SkinName.c_str();
|
section = m_SkinName.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable native transparency if not 2K/XP
|
// Disable native transparency if older OS
|
||||||
if(CRainmeter::IsNT() == PLATFORM_9X || CRainmeter::IsNT() == PLATFORM_NT4)
|
if (CSystem::GetOSPlatform() < OSPLATFORM_2K)
|
||||||
{
|
{
|
||||||
m_NativeTransparency = 0;
|
m_NativeTransparency = 0;
|
||||||
}
|
}
|
||||||
@ -4558,7 +4560,7 @@ LRESULT CMeterWindow::OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
/*
|
/*
|
||||||
** MakePathAbsolute
|
** MakePathAbsolute
|
||||||
**
|
**
|
||||||
** Converts the path to absolute bu adding the skin's path to it (unless it already is absolute).
|
** Converts the path to absolute by adding the skin's path to it (unless it already is absolute).
|
||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
std::wstring CMeterWindow::MakePathAbsolute(std::wstring path)
|
std::wstring CMeterWindow::MakePathAbsolute(std::wstring path)
|
||||||
|
@ -1300,11 +1300,12 @@ int CRainmeter::Initialize(HWND Parent, HINSTANCE Instance, LPCSTR szPath)
|
|||||||
tmpName[0] = L'\0';
|
tmpName[0] = L'\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_Path = tmpName;
|
||||||
|
|
||||||
if(!c_DummyLitestep) InitalizeLitestep();
|
if(!c_DummyLitestep) InitalizeLitestep();
|
||||||
|
|
||||||
bool bDefaultIniLocation = false;
|
bool bDefaultIniLocation = false;
|
||||||
|
|
||||||
m_Path = tmpName;
|
|
||||||
if (c_CmdLine.empty())
|
if (c_CmdLine.empty())
|
||||||
{
|
{
|
||||||
m_IniFile = m_Path + L"Rainmeter.ini";
|
m_IniFile = m_Path + L"Rainmeter.ini";
|
||||||
@ -3187,38 +3188,6 @@ void CRainmeter::ResetStats()
|
|||||||
CMeasureNet::ResetStats();
|
CMeasureNet::ResetStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
** IsNT
|
|
||||||
**
|
|
||||||
** Checks which OS you are running
|
|
||||||
**
|
|
||||||
*/
|
|
||||||
PLATFORM CRainmeter::IsNT()
|
|
||||||
{
|
|
||||||
// Check if you are running a real OS
|
|
||||||
|
|
||||||
OSVERSIONINFO osvi;
|
|
||||||
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
|
|
||||||
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
||||||
|
|
||||||
if(!GetVersionEx((OSVERSIONINFO*)&osvi))
|
|
||||||
{
|
|
||||||
// Something's wrong, lets assime Win9x
|
|
||||||
return PLATFORM_9X;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
|
||||||
{
|
|
||||||
// You got NT
|
|
||||||
if(osvi.dwMajorVersion <= 4) return PLATFORM_NT4;
|
|
||||||
if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) return PLATFORM_2K;
|
|
||||||
return PLATFORM_XP;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PLATFORM_9X; // Wintendo alert!
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** ShowContextMenu
|
** ShowContextMenu
|
||||||
**
|
**
|
||||||
|
@ -40,14 +40,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#define RAINMETER_VERSION MAKE_VER(1, 3, 0)
|
#define RAINMETER_VERSION MAKE_VER(1, 3, 0)
|
||||||
|
|
||||||
enum PLATFORM
|
|
||||||
{
|
|
||||||
PLATFORM_9X,
|
|
||||||
PLATFORM_NT4,
|
|
||||||
PLATFORM_2K,
|
|
||||||
PLATFORM_XP
|
|
||||||
};
|
|
||||||
|
|
||||||
void RainmeterRefresh(HWND, const char* arg);
|
void RainmeterRefresh(HWND, const char* arg);
|
||||||
void RainmeterRefreshApp(HWND, const char* arg);
|
void RainmeterRefreshApp(HWND, const char* arg);
|
||||||
void RainmeterRedraw(HWND, const char* arg);
|
void RainmeterRedraw(HWND, const char* arg);
|
||||||
@ -226,7 +218,6 @@ public:
|
|||||||
void ClearDeleteLaterList();
|
void ClearDeleteLaterList();
|
||||||
|
|
||||||
static std::vector<std::wstring> ParseString(LPCTSTR str);
|
static std::vector<std::wstring> ParseString(LPCTSTR str);
|
||||||
static PLATFORM IsNT();
|
|
||||||
static std::wstring ExtractPath(const std::wstring& strFilePath);
|
static std::wstring ExtractPath(const std::wstring& strFilePath);
|
||||||
static void ExpandEnvironmentVariables(std::wstring& strPath);
|
static void ExpandEnvironmentVariables(std::wstring& strPath);
|
||||||
|
|
||||||
|
@ -51,6 +51,10 @@ HWINEVENTHOOK CSystem::c_WinEventHook = NULL;
|
|||||||
bool CSystem::c_DwmCompositionEnabled = false;
|
bool CSystem::c_DwmCompositionEnabled = false;
|
||||||
bool CSystem::c_ShowDesktop = false;
|
bool CSystem::c_ShowDesktop = false;
|
||||||
|
|
||||||
|
OSPLATFORM CSystem::c_Platform = OSPLATFORM_UNKNOWN;
|
||||||
|
|
||||||
|
FPSETDLLDIRECTORYW CSystem::c_SetDllDirectoryW = NULL;
|
||||||
|
|
||||||
extern CRainmeter* Rainmeter;
|
extern CRainmeter* Rainmeter;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -974,6 +978,150 @@ LRESULT CALLBACK CSystem::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||||||
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** GetOSPlatform
|
||||||
|
**
|
||||||
|
** Checks which OS you are running.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
OSPLATFORM CSystem::GetOSPlatform()
|
||||||
|
{
|
||||||
|
if (c_Platform == OSPLATFORM_UNKNOWN)
|
||||||
|
{
|
||||||
|
OSVERSIONINFOEX osvi = {sizeof(OSVERSIONINFOEX)};
|
||||||
|
if (!GetVersionEx((OSVERSIONINFO*)&osvi) || osvi.dwPlatformId != VER_PLATFORM_WIN32_NT)
|
||||||
|
{
|
||||||
|
c_Platform = OSPLATFORM_9X;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (osvi.dwMajorVersion <= 4) // NT4 or older
|
||||||
|
{
|
||||||
|
c_Platform = OSPLATFORM_NT4;
|
||||||
|
}
|
||||||
|
else if (osvi.dwMajorVersion == 5) // 2000 / XP (x64 / Server 2003, R2)
|
||||||
|
{
|
||||||
|
if (osvi.dwMinorVersion == 0)
|
||||||
|
{
|
||||||
|
c_Platform = OSPLATFORM_2K;
|
||||||
|
}
|
||||||
|
else if (osvi.dwMinorVersion == 1 && osvi.wServicePackMajor == 0)
|
||||||
|
{
|
||||||
|
c_Platform = OSPLATFORM_XP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c_Platform = OSPLATFORM_XP_SP1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (osvi.dwMajorVersion == 6) // Vista (Server 2008) / 7 (Server 2008R2)
|
||||||
|
{
|
||||||
|
if (osvi.dwMinorVersion == 0)
|
||||||
|
{
|
||||||
|
c_Platform = OSPLATFORM_VISTA;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c_Platform = OSPLATFORM_7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // newer OS
|
||||||
|
{
|
||||||
|
c_Platform = OSPLATFORM_7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return c_Platform;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** RmSetDllDirectory
|
||||||
|
**
|
||||||
|
** This function is a wrapper function for SetDllDirectory() that is enabled on Windows XP sp1 or newer.
|
||||||
|
**
|
||||||
|
** Adds a directory to the search path used to locate DLLs for the application.
|
||||||
|
**
|
||||||
|
** If lpPathName is an empty string (""), the call removes the current directory from the default DLL search order.
|
||||||
|
** If lpPathName is NULL, the function restores the default search order.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
BOOL CSystem::RmSetDllDirectory(LPCWSTR lpPathName)
|
||||||
|
{
|
||||||
|
if (GetOSPlatform() >= OSPLATFORM_XP_SP1)
|
||||||
|
{
|
||||||
|
if (!c_SetDllDirectoryW)
|
||||||
|
{
|
||||||
|
c_SetDllDirectoryW = (FPSETDLLDIRECTORYW)GetProcAddress(GetModuleHandle(L"Kernel32.dll"), "SetDllDirectoryW");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c_SetDllDirectoryW)
|
||||||
|
{
|
||||||
|
return c_SetDllDirectoryW(lpPathName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** RmLoadLibrary
|
||||||
|
**
|
||||||
|
** This function is a wrapper function for LoadLibrary().
|
||||||
|
**
|
||||||
|
** Avoids loading a DLL from current directory.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
HMODULE CSystem::RmLoadLibrary(LPCWSTR lpLibFileName, DWORD* dwError, bool ignoreErrors)
|
||||||
|
{
|
||||||
|
OSPLATFORM platform = GetOSPlatform();
|
||||||
|
WCHAR buffer[MAX_PATH];
|
||||||
|
|
||||||
|
HMODULE hLib = NULL;
|
||||||
|
DWORD err;
|
||||||
|
UINT oldMode;
|
||||||
|
|
||||||
|
if (ignoreErrors)
|
||||||
|
{
|
||||||
|
oldMode = SetErrorMode(0);
|
||||||
|
SetErrorMode(oldMode | SEM_FAILCRITICALERRORS); // Prevent the system from displaying message box
|
||||||
|
}
|
||||||
|
|
||||||
|
if (platform < OSPLATFORM_XP_SP1)
|
||||||
|
{
|
||||||
|
// Replace current directory to application directory
|
||||||
|
GetCurrentDirectory(MAX_PATH, buffer);
|
||||||
|
SetCurrentDirectory(Rainmeter->GetPath().c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Remove current directory from DLL search path
|
||||||
|
RmSetDllDirectory(L"");
|
||||||
|
}
|
||||||
|
|
||||||
|
SetLastError(ERROR_SUCCESS);
|
||||||
|
hLib = LoadLibrary(lpLibFileName);
|
||||||
|
err = GetLastError();
|
||||||
|
|
||||||
|
if (platform < OSPLATFORM_XP_SP1)
|
||||||
|
{
|
||||||
|
// Reset to old current directory
|
||||||
|
SetCurrentDirectory(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ignoreErrors)
|
||||||
|
{
|
||||||
|
SetErrorMode(oldMode); // Reset
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dwError)
|
||||||
|
{
|
||||||
|
*dwError = err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hLib;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** DwmIsCompositionEnabled
|
** DwmIsCompositionEnabled
|
||||||
**
|
**
|
||||||
@ -985,18 +1133,22 @@ BOOL CSystem::DwmIsCompositionEnabled()
|
|||||||
BOOL fEnabled = FALSE;
|
BOOL fEnabled = FALSE;
|
||||||
|
|
||||||
typedef HRESULT (WINAPI * FPDWMISCOMPOSITIONENABLED)(BOOL* pfEnabled);
|
typedef HRESULT (WINAPI * FPDWMISCOMPOSITIONENABLED)(BOOL* pfEnabled);
|
||||||
HINSTANCE h = LoadLibrary(L"dwmapi.dll");
|
|
||||||
if (h)
|
if (CSystem::GetOSPlatform() >= OSPLATFORM_VISTA)
|
||||||
{
|
{
|
||||||
FPDWMISCOMPOSITIONENABLED DwmIsCompositionEnabled = (FPDWMISCOMPOSITIONENABLED)GetProcAddress(h, "DwmIsCompositionEnabled");
|
HINSTANCE h = RmLoadLibrary(L"dwmapi.dll");
|
||||||
if (DwmIsCompositionEnabled)
|
if (h)
|
||||||
{
|
{
|
||||||
if (DwmIsCompositionEnabled(&fEnabled) != S_OK)
|
FPDWMISCOMPOSITIONENABLED DwmIsCompositionEnabled = (FPDWMISCOMPOSITIONENABLED)GetProcAddress(h, "DwmIsCompositionEnabled");
|
||||||
|
if (DwmIsCompositionEnabled)
|
||||||
{
|
{
|
||||||
fEnabled = FALSE;
|
if (DwmIsCompositionEnabled(&fEnabled) != S_OK)
|
||||||
|
{
|
||||||
|
fEnabled = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
FreeLibrary(h);
|
||||||
}
|
}
|
||||||
FreeLibrary(h);
|
|
||||||
}
|
}
|
||||||
return fEnabled;
|
return fEnabled;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,20 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI *FPSETDLLDIRECTORYW)(LPCWSTR lpPathName);
|
||||||
|
|
||||||
|
enum OSPLATFORM
|
||||||
|
{
|
||||||
|
OSPLATFORM_UNKNOWN = 0,
|
||||||
|
OSPLATFORM_9X,
|
||||||
|
OSPLATFORM_NT4,
|
||||||
|
OSPLATFORM_2K,
|
||||||
|
OSPLATFORM_XP,
|
||||||
|
OSPLATFORM_XP_SP1,
|
||||||
|
OSPLATFORM_VISTA,
|
||||||
|
OSPLATFORM_7
|
||||||
|
};
|
||||||
|
|
||||||
struct MONITOR_INFO
|
struct MONITOR_INFO
|
||||||
{
|
{
|
||||||
bool active;
|
bool active;
|
||||||
@ -64,6 +78,12 @@ public:
|
|||||||
static HWND GetHelperWindow() { return c_HelperWindow; }
|
static HWND GetHelperWindow() { return c_HelperWindow; }
|
||||||
static void PrepareHelperWindow(HWND WorkerW);
|
static void PrepareHelperWindow(HWND WorkerW);
|
||||||
|
|
||||||
|
static bool IsNT() { return (GetOSPlatform() >= OSPLATFORM_NT4); }
|
||||||
|
static OSPLATFORM GetOSPlatform();
|
||||||
|
|
||||||
|
static BOOL RmSetDllDirectory(LPCWSTR lpPathName);
|
||||||
|
static HMODULE RmLoadLibrary(LPCWSTR lpLibFileName, DWORD* dwError = NULL, bool ignoreErrors = false);
|
||||||
|
|
||||||
static bool CopyFiles(const std::wstring& strFrom, const std::wstring& strTo, bool bMove = false);
|
static bool CopyFiles(const std::wstring& strFrom, const std::wstring& strTo, bool bMove = false);
|
||||||
static bool RemoveFile(const std::wstring& file);
|
static bool RemoveFile(const std::wstring& file);
|
||||||
|
|
||||||
@ -94,6 +114,10 @@ private:
|
|||||||
|
|
||||||
static bool c_DwmCompositionEnabled;
|
static bool c_DwmCompositionEnabled;
|
||||||
static bool c_ShowDesktop;
|
static bool c_ShowDesktop;
|
||||||
|
|
||||||
|
static OSPLATFORM c_Platform;
|
||||||
|
|
||||||
|
static FPSETDLLDIRECTORYW c_SetDllDirectoryW;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user