You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
4.6 KiB
193 lines
4.6 KiB
//
|
|
// Dll.cpp
|
|
//
|
|
// Dll API functions for FldrClnr.dll
|
|
//
|
|
//
|
|
|
|
#include <windows.h>
|
|
#include <shlwapi.h>
|
|
#include <shfusion.h>
|
|
#include "CleanupWiz.h"
|
|
|
|
// declare debug needs to be defined in exactly one source file in the project
|
|
#define DECLARE_DEBUG
|
|
#include <debug.h>
|
|
|
|
HINSTANCE g_hInst;
|
|
CRITICAL_SECTION g_csDll = {0}; // needed by ENTERCRITICAL in uassist.cpp (UEM code)
|
|
|
|
//
|
|
// Dll functions
|
|
//
|
|
|
|
extern "C" BOOL APIENTRY DllMain(
|
|
HINSTANCE hDll,
|
|
DWORD dwReason,
|
|
LPVOID lpReserved)
|
|
{
|
|
switch (dwReason)
|
|
{
|
|
case ( DLL_PROCESS_ATTACH ) :
|
|
{
|
|
g_hInst = hDll;
|
|
SHFusionInitializeFromModule(hDll);
|
|
break;
|
|
}
|
|
case ( DLL_PROCESS_DETACH ) :
|
|
{
|
|
SHFusionUninitialize();
|
|
break;
|
|
}
|
|
case ( DLL_THREAD_ATTACH ) :
|
|
case ( DLL_THREAD_DETACH ) :
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDAPI DllRegisterServer(void)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDAPI DllUnregisterServer(void)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
|
|
// ensure only one instance is running
|
|
HANDLE AnotherCopyRunning()
|
|
{
|
|
HANDLE hMutex = CreateMutex(NULL, FALSE, TEXT("DesktopCleanupMutex"));
|
|
|
|
if (hMutex && GetLastError() == ERROR_ALREADY_EXISTS)
|
|
{
|
|
// Mutex created but by someone else
|
|
CloseHandle(hMutex);
|
|
hMutex = NULL;
|
|
}
|
|
|
|
return hMutex;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////
|
|
|
|
//
|
|
// This function checks whether we need to run the cleaner
|
|
// We will not run if user is guest, user has forced us not to, or if the requisite
|
|
// number of days have not yet elapsed
|
|
//
|
|
BOOL ShouldRun(DWORD dwCleanMode)
|
|
{
|
|
DWORD cch, dwData;
|
|
|
|
if (IsUserAGuest())
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// if we're in silent mode and NOT in personal mode and the DONT RUN flag is set, we return immediately
|
|
// (the OEM set the "don't run silent mode" flag)
|
|
//
|
|
cch = sizeof(DWORD);
|
|
if ((CLEANUP_MODE_SILENT == dwCleanMode) &&
|
|
(!IsOS(OS_PERSONAL)) &&
|
|
(ERROR_SUCCESS == SHGetValue(HKEY_LOCAL_MACHINE, REGSTR_OEM_PATH, c_szOEM_DISABLE, NULL, &dwData, &cch)) &&
|
|
(dwData != 0))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// if we're in silent mode and the other DONT RUN flag is set, we return immediately
|
|
// (the OEM set the "don't run silent mode" flag)
|
|
//
|
|
cch = sizeof(DWORD);
|
|
if ((CLEANUP_MODE_SILENT == dwCleanMode) &&
|
|
(ERROR_SUCCESS == SHGetValue(HKEY_LOCAL_MACHINE, REGSTR_OEM_PATH, c_szOEM_SEVENDAY_DISABLE, NULL, &dwData, &cch)) &&
|
|
(dwData != 0))
|
|
{
|
|
CreateDesktopIcons(); // create default icons on the desktop (IE, MSN Explorer, Media Player)
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// check if policy prevents us from running
|
|
//
|
|
if ((CLEANUP_MODE_NORMAL == dwCleanMode || CLEANUP_MODE_ALL == dwCleanMode) &&
|
|
(SHRestricted(REST_NODESKTOPCLEANUP)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
///////////////////////
|
|
//
|
|
// Our exports
|
|
//
|
|
///////////////////////
|
|
|
|
|
|
//
|
|
// The rundll32.exe entry point for starting the dekstop cleaner.
|
|
// called via "rundll32.exe fldrclnr.dll,Wizard_RunDLL"
|
|
//
|
|
// can take an optional parameter in the commandline :
|
|
//
|
|
// "all" - show all the items on the desktop in the UI
|
|
// "silent" - silently clean up all the items on the desktop
|
|
//
|
|
|
|
STDAPI_(void) Wizard_RunDLL(HWND hwndStub, HINSTANCE hAppInstance, LPSTR pszCmdLine, int nCmdShow)
|
|
{
|
|
DWORD dwCleanMode;
|
|
|
|
if (0 == StrCmpNIA(pszCmdLine, "all", 3))
|
|
{
|
|
dwCleanMode = CLEANUP_MODE_ALL;
|
|
}
|
|
else if (0 == StrCmpNIA(pszCmdLine, "silent", 6))
|
|
{
|
|
dwCleanMode = CLEANUP_MODE_SILENT;
|
|
}
|
|
else
|
|
{
|
|
dwCleanMode = CLEANUP_MODE_NORMAL;
|
|
}
|
|
|
|
HANDLE hMutex = AnotherCopyRunning();
|
|
|
|
if (hMutex)
|
|
{
|
|
if (ShouldRun(dwCleanMode))
|
|
{
|
|
if (InitializeCriticalSectionAndSpinCount(&g_csDll, 0)) // needed for UEM stuff
|
|
{
|
|
if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED))) // also for UEM stuff.
|
|
{
|
|
CCleanupWiz cfc;
|
|
cfc.Run(dwCleanMode, hwndStub);
|
|
CoUninitialize();
|
|
}
|
|
|
|
DeleteCriticalSection(&g_csDll);
|
|
}
|
|
}
|
|
CloseHandle(hMutex);
|
|
}
|
|
}
|