// // Dll.cpp // // Dll API functions for FldrClnr.dll // // #include #include #include #include "CleanupWiz.h" #include "priv.h" // declare debug needs to be defined in exactly one source file in the project #define DECLARE_DEBUG #include 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); } }