184 lines
3.9 KiB
C++
184 lines
3.9 KiB
C++
//
|
|
// Dll.cpp
|
|
//
|
|
// Dll API functions for FldrClnr.dll
|
|
//
|
|
//
|
|
|
|
#include <windows.h>
|
|
#include <shlwapi.h>
|
|
#include <shfusion.h>
|
|
#include "CleanupWiz.h"
|
|
#include "priv.h"
|
|
|
|
// declare debug needs to be defined in exactly one source file in the project
|
|
#define DECLARE_DEBUG
|
|
#include <debug.h>
|
|
|
|
STDAPI_(int) CleanupDesktop(DWORD, HWND); // defined in fldrclnr.cpp
|
|
|
|
|
|
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)
|
|
{
|
|
// failed to create the mutex
|
|
return 0;
|
|
}
|
|
else if (GetLastError() == ERROR_ALREADY_EXISTS)
|
|
{
|
|
// Mutex created but by someone else
|
|
CloseHandle(hMutex);
|
|
return 0;
|
|
}
|
|
|
|
// we are the first
|
|
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)
|
|
{
|
|
BOOL fShouldRun;
|
|
|
|
if (IsUserAGuest())
|
|
{
|
|
fShouldRun = FALSE;
|
|
}
|
|
else if (CLEANUP_MODE_SILENT != dwCleanMode)
|
|
{
|
|
fShouldRun = !SHRestricted(REST_NODESKTOPCLEANUP);
|
|
}
|
|
else
|
|
{
|
|
DWORD dwData = 0;
|
|
DWORD cb = sizeof(dwData);
|
|
// dwCleanMode is CLEANUP_MODE_SILENT
|
|
if ((ERROR_SUCCESS == SHGetValue(HKEY_LOCAL_MACHINE, REGSTR_OEM_PATH, REGSTR_OEM_OPTIN, NULL, &dwData, &cb)) &&
|
|
(dwData != 0))
|
|
{
|
|
fShouldRun = TRUE;
|
|
}
|
|
else
|
|
{
|
|
CreateDesktopIcons(); // create default icons on the desktop (IE, MSN Explorer, Media Player)
|
|
fShouldRun = FALSE;
|
|
}
|
|
}
|
|
|
|
return fShouldRun;
|
|
}
|
|
|
|
///////////////////////
|
|
//
|
|
// 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 = CLEANUP_MODE_NORMAL;
|
|
|
|
if (0 == StrCmpNIA(pszCmdLine, "all", 3))
|
|
{
|
|
dwCleanMode = CLEANUP_MODE_ALL;
|
|
}
|
|
else if (0 == StrCmpNIA(pszCmdLine, "silent", 6))
|
|
{
|
|
dwCleanMode = CLEANUP_MODE_SILENT;
|
|
}
|
|
|
|
HANDLE hMutex = AnotherCopyRunning();
|
|
|
|
if (hMutex)
|
|
{
|
|
if (ShouldRun(dwCleanMode))
|
|
{
|
|
InitializeCriticalSection(&g_csDll); // 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);
|
|
}
|
|
}
|