#include #include #include #include "RunOnce.h" #include "Global.h" #include "RegistryKey.h" BOOL g_fRunOnceInitialized = FALSE; TCHAR g_strRunOnceFilename[MAX_PATH]; ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// BOOL InitializeRunOnce(const BOOL fCleanStart) { CRegistryKey oRegistryKey; TCHAR strSystemPath[MAX_PATH]; DWORD dwKeyDisposition; // // Only run this if g_fRunOnceInitialized is FALSE // if (!g_fRunOnceInitialized) { // // Where will we find the setup program // if (GetSystemDirectory(strSystemPath, MAX_PATH)) { wsprintf(g_strRunOnceFilename, TEXT("%s\\WAMSetup.exe"), strSystemPath); if (fCleanStart) { // // Now we need to delete any old WAMSetup registry key if it exists // if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup"))) { oRegistryKey.DeleteKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup")); } // // Ok, let's create the root registry key used to store setup information // if (S_OK == oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup"), 0, KEY_ALL_ACCESS, &dwKeyDisposition)) { if (S_OK == oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup\\WithRegistration"), 0, KEY_ALL_ACCESS, &dwKeyDisposition)) { if (S_OK == oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup\\WithoutRegistration"), 0, KEY_ALL_ACCESS, &dwKeyDisposition)) { g_fRunOnceInitialized = TRUE; } } } // // Close the Registry Key // oRegistryKey.CloseKey(); } else { g_fRunOnceInitialized = TRUE; } } } return g_fRunOnceInitialized; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// BOOL FinalizeRunOnce(const BOOL fComplete) { BOOL fSuccess = FALSE; CRegistryKey oRegistryKey; DWORD dwBytesToWrite, dwKeyDisposition; TCHAR strRunOnceCmdLine[MAX_PATH]; if (g_fRunOnceInitialized) { if (fComplete) { // // Create/Open the registry key // if (S_OK == oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"), 0, KEY_ALL_ACCESS, &dwKeyDisposition)) { // // What will be the run once command // wsprintf(strRunOnceCmdLine, TEXT("%s /Cleanup"), g_strRunOnceFilename); #ifdef _UNICODE dwBytesToWrite = (StrLen(strRunOnceCmdLine) + 1) * 2; #else dwBytesToWrite = StrLen(strRunOnceCmdLine) + 1; #endif // _UNICODE if (S_OK == oRegistryKey.SetValue(TEXT("WAMSetup"), REG_SZ, (LPBYTE) strRunOnceCmdLine, dwBytesToWrite)) { fSuccess = TRUE; } // // Close the registry key // oRegistryKey.CloseKey(); } } else { if (FileExists(g_strRunOnceFilename)) { // // Make sure we can delete g_strRunOnceFilename on Reboot // SetFileAttributes(g_strRunOnceFilename, FILE_ATTRIBUTE_NORMAL); // // Create/Open the registry key // if (S_OK == oRegistryKey.CreateKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"), 0, KEY_ALL_ACCESS, &dwKeyDisposition)) { // // What will be the run once command do // if (OS_VERSION_WIN9X & g_dwOSVersion) { wsprintf(strRunOnceCmdLine, TEXT("command /C del ""%s"""), g_strRunOnceFilename); } else { wsprintf(strRunOnceCmdLine, TEXT("cmd /C del /F ""%s"""), g_strRunOnceFilename); } #ifdef _UNICODE dwBytesToWrite = (StrLen(strRunOnceCmdLine) + 1) * 2; #else dwBytesToWrite = StrLen(strRunOnceCmdLine) + 1; #endif // _UNICODE if (S_OK == oRegistryKey.SetValue(TEXT("WAMSetup"), REG_SZ, (LPBYTE) strRunOnceCmdLine, dwBytesToWrite)) { fSuccess = TRUE; } // // Close the registry key // oRegistryKey.CloseKey(); } } // // Delete the WAMSetup registry key // if (S_OK == oRegistryKey.CheckForExistingKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup"))) { oRegistryKey.DeleteKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup")); } fSuccess = TRUE; } // // Flag g_fRunOnceInitialized // g_fRunOnceInitialized = FALSE; } return fSuccess; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// BOOL SetRunOnceCleanupFile(LPCTSTR strSourceFilename, LPCTSTR strDestinationFilename, const BOOL fRegister) { BOOL fSuccess = FALSE; CRegistryKey oRegistryKey; TCHAR strRegistryKey[MAX_PATH]; if (g_fRunOnceInitialized) { // // What is the target registry key // if (fRegister) { wsprintf(strRegistryKey, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup\\WithRegistration")); } else { wsprintf(strRegistryKey, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup\\WithoutRegistration")); } if (S_OK == oRegistryKey.OpenKey(HKEY_LOCAL_MACHINE, strRegistryKey, KEY_ALL_ACCESS)) { // // Add a value to the registry. Because it is a REG_SZ value, we do not have to pass in // a dwDataLen parameter. // if (S_OK == oRegistryKey.SetValue(strSourceFilename, REG_SZ, (LPBYTE) strDestinationFilename, 0)) { fSuccess = TRUE; } // // Close the registry key // oRegistryKey.CloseKey(); } } return fSuccess; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// BOOL GetRunOnceCleanupFile(LPTSTR strSourceFilename, const DWORD dwSourceFilenameLen, LPTSTR strDestinationFilename, const DWORD dwDestinationFilenameLen, const BOOL fRegister) { BOOL fSuccess = FALSE; CRegistryKey oRegistryKey; DWORD dwSourceLen, dwDestinationLen, dwType; TCHAR strRegistryKey[MAX_PATH]; if (g_fRunOnceInitialized) { // // What is the target registry key // if (fRegister) { wsprintf(strRegistryKey, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup\\WithRegistration")); } else { wsprintf(strRegistryKey, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WAMSetup\\WithoutRegistration")); } if (S_OK == oRegistryKey.OpenKey(HKEY_LOCAL_MACHINE, strRegistryKey, KEY_ALL_ACCESS)) { // // Enumerate the first value in the registry key. Once this is done, delete it automatically // dwSourceLen = dwSourceFilenameLen; dwDestinationLen = dwDestinationFilenameLen; if (S_OK == oRegistryKey.EnumValues(0, strSourceFilename, &dwSourceLen, &dwType, (LPBYTE) strDestinationFilename, &dwDestinationLen)) { if (S_OK == oRegistryKey.DeleteValue(strSourceFilename)) { fSuccess = TRUE; } } // // Close the registry key // oRegistryKey.CloseKey(); } } return fSuccess; }