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);
|
||
|
}
|
||
|
}
|