mirror of
https://github.com/Open-Shell/Open-Shell-Menu.git
synced 2026-06-14 03:16:38 +10:00
* Rebrand to Open-Shell * Slight installer branding improvement
This commit is contained in:
@@ -0,0 +1,283 @@
|
||||
// Classic Shell (c) 2009-2017, Ivo Beltchev
|
||||
// Open-Shell (c) 2017-2018, The Open-Shell Team
|
||||
// Confidential information of Ivo Beltchev. Not for disclosure or distribution without prior written consent from the author
|
||||
|
||||
// dllmain.cpp : Implementation of DllMain.
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "resource.h"
|
||||
#include "..\Lib\resource.h"
|
||||
#include "dllmain.h"
|
||||
#include "ShareOverlay.h"
|
||||
#include "SettingsUI.h"
|
||||
#include "Settings.h"
|
||||
#include "Translations.h"
|
||||
#include "ResourceHelper.h"
|
||||
#include "FNVHash.h"
|
||||
#include <uxtheme.h>
|
||||
#include <dwmapi.h>
|
||||
|
||||
#pragma comment(linker, \
|
||||
"\"/manifestdependency:type='Win32' "\
|
||||
"name='Microsoft.Windows.Common-Controls' "\
|
||||
"version='6.0.0.0' "\
|
||||
"processorArchitecture='*' "\
|
||||
"publicKeyToken='6595b64144ccf1df' "\
|
||||
"language='*'\"")
|
||||
|
||||
CClassicExplorerModule _AtlModule;
|
||||
bool g_bLogLevel;
|
||||
|
||||
void InitClassicCopyProcess( void );
|
||||
void InitClassicCopyThread( void );
|
||||
void FreeClassicCopyThread( void );
|
||||
|
||||
bool g_bHookCopyThreads;
|
||||
bool g_bExplorerExe;
|
||||
LPCWSTR g_LoadedSettingsAtom;
|
||||
|
||||
static int g_LoadDialogs[]=
|
||||
{
|
||||
IDD_SETTINGS,0x04000000,
|
||||
IDD_SETTINGSTREE,0x04000000,
|
||||
IDD_BROWSEFORICON,0x04000000,
|
||||
IDD_LANGUAGE,0x04000000,
|
||||
IDD_CUSTOMTOOLBAR,0x04000000,
|
||||
IDD_CUSTOMTREE,0x04000000,
|
||||
IDD_PROGRESS,0x04000004,
|
||||
0
|
||||
};
|
||||
|
||||
const wchar_t *GetDocRelativePath( void )
|
||||
{
|
||||
return DOC_PATH;
|
||||
}
|
||||
|
||||
struct FindChild
|
||||
{
|
||||
const wchar_t *className;
|
||||
HWND hWnd;
|
||||
};
|
||||
|
||||
static BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam )
|
||||
{
|
||||
FindChild &find=*(FindChild*)lParam;
|
||||
wchar_t name[256];
|
||||
GetClassName(hwnd,name,_countof(name));
|
||||
if (_wcsicmp(name,find.className)!=0) return TRUE;
|
||||
find.hWnd=hwnd;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
HWND FindChildWindow( HWND hwnd, const wchar_t *className )
|
||||
{
|
||||
FindChild find={className};
|
||||
EnumChildWindows(hwnd,EnumChildProc,(LPARAM)&find);
|
||||
return find.hWnd;
|
||||
}
|
||||
|
||||
static DWORD g_TlsIndex;
|
||||
|
||||
TlsData *GetTlsData( void )
|
||||
{
|
||||
void *pData=TlsGetValue(g_TlsIndex);
|
||||
if (!pData)
|
||||
{
|
||||
pData=(void*)LocalAlloc(LPTR,sizeof(TlsData));
|
||||
memset(pData,0,sizeof(TlsData));
|
||||
TlsSetValue(g_TlsIndex,pData);
|
||||
}
|
||||
return (TlsData*)pData;
|
||||
}
|
||||
|
||||
static HANDLE g_DllInitThread;
|
||||
|
||||
static DWORD CALLBACK DllInitThread( void* )
|
||||
{
|
||||
{
|
||||
g_bLogLevel=false;
|
||||
CRegKey regKey;
|
||||
if (regKey.Open(HKEY_CURRENT_USER,L"Software\\OpenShell\\ClassicExplorer\\Settings",KEY_READ|KEY_WOW64_64KEY)==ERROR_SUCCESS)
|
||||
{
|
||||
DWORD log;
|
||||
if (regKey.QueryDWORDValue(L"LogLevel",log)==ERROR_SUCCESS)
|
||||
g_bLogLevel=log!=0;
|
||||
}
|
||||
}
|
||||
InitSettings();
|
||||
|
||||
wchar_t path[_MAX_PATH];
|
||||
GetModuleFileName(g_Instance,path,_countof(path));
|
||||
*PathFindFileName(path)=0;
|
||||
wchar_t fname[_MAX_PATH];
|
||||
Sprintf(fname,_countof(fname),L"%s" INI_PATH L"ExplorerL10N.ini",path);
|
||||
CString language=GetSettingString(L"Language");
|
||||
ParseTranslations(fname,language);
|
||||
|
||||
HINSTANCE resInstance=LoadTranslationDll(language);
|
||||
|
||||
LoadTranslationResources(resInstance,g_LoadDialogs);
|
||||
|
||||
if (resInstance)
|
||||
FreeLibrary(resInstance);
|
||||
|
||||
if (GetSettingBool(L"ShareOverlay") && (g_bExplorerExe || !GetSettingBool(L"ShareExplorer")))
|
||||
CShareOverlay::InitOverlay(GetSettingString(L"ShareOverlayIcon"),GetSettingBool(L"ShareOverlayHidden"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void WaitDllInitThread( void )
|
||||
{
|
||||
ATLASSERT(g_DllInitThread);
|
||||
WaitForSingleObject(g_DllInitThread,INFINITE);
|
||||
}
|
||||
|
||||
// DLL Entry Point
|
||||
extern "C" BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved )
|
||||
{
|
||||
if (dwReason==DLL_PROCESS_ATTACH)
|
||||
{
|
||||
g_Instance=hInstance;
|
||||
g_TlsIndex=TlsAlloc();
|
||||
if (g_TlsIndex==TLS_OUT_OF_INDEXES)
|
||||
return FALSE; // TLS failure
|
||||
|
||||
CRegKey regSettings, regSettingsUser, regPolicy, regPolicyUser;
|
||||
bool bUpgrade=OpenSettingsKeys(COMPONENT_EXPLORER,regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
|
||||
enum
|
||||
{
|
||||
SETTING_SHARE_OVERLAY,
|
||||
SETTING_SHARE_EXPLORER,
|
||||
SETTING_FILE_EXPLORER,
|
||||
SETTING_REPLACE_FILE,
|
||||
SETTING_REPLACE_FOLDER,
|
||||
SETTING_MORE,
|
||||
SETTING_WHITE_LIST,
|
||||
SETTING_BLACK_LIST,
|
||||
};
|
||||
|
||||
CSetting settings[]={
|
||||
{L"ShareOverlay",CSetting::TYPE_BOOL,0,0,0},
|
||||
{L"ShareExplorer",CSetting::TYPE_BOOL,0,0,1},
|
||||
{L"FileExplorer",CSetting::TYPE_BOOL,0,0,1},
|
||||
{L"ReplaceFileUI",CSetting::TYPE_BOOL,0,0,1},
|
||||
{L"ReplaceFolderUI",CSetting::TYPE_BOOL,0,0,1},
|
||||
{L"EnableMore",CSetting::TYPE_BOOL,0,0,0},
|
||||
{L"ProcessWhiteList",CSetting::TYPE_STRING,0,0,L""},
|
||||
{L"ProcessBlackList",CSetting::TYPE_STRING,0,0,L""},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
wchar_t path[_MAX_PATH];
|
||||
GetModuleFileName(NULL,path,_countof(path));
|
||||
const wchar_t *exe=PathFindFileName(path);
|
||||
g_bExplorerExe=(_wcsicmp(exe,L"explorer.exe")==0 || _wcsicmp(exe,L"verclsid.exe")==0);
|
||||
bool bReplaceUI=false;
|
||||
if (GetWinVersion()<=WIN_VER_WIN7)
|
||||
{
|
||||
settings[SETTING_REPLACE_FILE].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
settings[SETTING_REPLACE_FOLDER].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
settings[SETTING_MORE].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
bReplaceUI=(GetSettingBool(settings[SETTING_REPLACE_FILE]) || GetSettingBool(settings[SETTING_REPLACE_FOLDER]) || GetSettingBool(settings[SETTING_MORE]));
|
||||
}
|
||||
|
||||
settings[SETTING_FILE_EXPLORER].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
if (_wcsicmp(exe,L"regsvr32.exe")!=0 && _wcsicmp(exe,L"msiexec.exe")!=0 && _wcsicmp(exe,L"ClassicExplorerSettings.exe")!=0 && !g_bExplorerExe)
|
||||
{
|
||||
// some arbitrary app
|
||||
settings[SETTING_SHARE_OVERLAY].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
settings[SETTING_SHARE_EXPLORER].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
if ((!GetSettingBool(settings[SETTING_SHARE_OVERLAY]) || GetSettingBool(settings[SETTING_SHARE_EXPLORER])) && (!bReplaceUI || GetSettingBool(settings[SETTING_FILE_EXPLORER])))
|
||||
return FALSE;
|
||||
|
||||
settings[SETTING_WHITE_LIST].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
CString whiteList=GetSettingString(settings[SETTING_WHITE_LIST]);
|
||||
if (!whiteList.IsEmpty())
|
||||
{
|
||||
// check for whitelisted process names
|
||||
const wchar_t *str=whiteList;
|
||||
bool bFound=false;
|
||||
while (*str)
|
||||
{
|
||||
wchar_t token[_MAX_PATH];
|
||||
str=GetToken(str,token,_countof(token),L",;");
|
||||
wchar_t *start=token;
|
||||
while (*start==' ')
|
||||
start++;
|
||||
wchar_t *end=start+Strlen(start);
|
||||
while (end>start && end[-1]==' ')
|
||||
end--;
|
||||
*end=0;
|
||||
if (_wcsicmp(exe,start)==0)
|
||||
{
|
||||
bFound=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!bFound)
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
settings[SETTING_BLACK_LIST].LoadValue(regSettings,regSettingsUser,regPolicy,regPolicyUser);
|
||||
// check for blacklisted process names
|
||||
CString blackList=GetSettingString(settings[SETTING_BLACK_LIST]);
|
||||
const wchar_t *str=blackList;
|
||||
while (*str)
|
||||
{
|
||||
wchar_t token[_MAX_PATH];
|
||||
str=GetToken(str,token,_countof(token),L",;");
|
||||
wchar_t *start=token;
|
||||
while (*start==' ')
|
||||
start++;
|
||||
wchar_t *end=start+Strlen(start);
|
||||
while (end>start && end[-1]==' ')
|
||||
end--;
|
||||
*end=0;
|
||||
if (_wcsicmp(exe,start)==0)
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_LoadedSettingsAtom=(LPCWSTR)GlobalAddAtom(L"ClassicExplorer.LoadedSettings");
|
||||
|
||||
g_bHookCopyThreads=(bReplaceUI && (g_bExplorerExe || !GetSettingBool(settings[SETTING_FILE_EXPLORER])));
|
||||
if (g_bHookCopyThreads)
|
||||
{
|
||||
InitClassicCopyProcess();
|
||||
InitClassicCopyThread();
|
||||
}
|
||||
|
||||
g_DllInitThread=CreateThread(NULL,0,DllInitThread,NULL,0,NULL);
|
||||
}
|
||||
|
||||
if (dwReason==DLL_THREAD_ATTACH)
|
||||
{
|
||||
if (g_bHookCopyThreads)
|
||||
InitClassicCopyThread();
|
||||
}
|
||||
|
||||
if (dwReason==DLL_THREAD_DETACH)
|
||||
{
|
||||
void *pData=TlsGetValue(g_TlsIndex);
|
||||
if (pData)
|
||||
LocalFree((HLOCAL)pData);
|
||||
TlsSetValue(g_TlsIndex,NULL);
|
||||
if (g_bHookCopyThreads)
|
||||
FreeClassicCopyThread();
|
||||
}
|
||||
|
||||
if (dwReason==DLL_PROCESS_DETACH)
|
||||
{
|
||||
void *pData=TlsGetValue(g_TlsIndex);
|
||||
if (pData)
|
||||
LocalFree((HLOCAL)pData);
|
||||
TlsSetValue(g_TlsIndex,NULL);
|
||||
TlsFree(g_TlsIndex);
|
||||
GlobalDeleteAtom((ATOM)(uintptr_t)g_LoadedSettingsAtom);
|
||||
}
|
||||
|
||||
return _AtlModule.DllMain(dwReason, lpReserved);
|
||||
}
|
||||
Reference in New Issue
Block a user