windows-nt/Source/XPSP1/NT/multimedia/directx/applicationmanager/appmansetup/runonce.cpp
2020-09-26 16:20:57 +08:00

292 lines
8 KiB
C++

#include <windows.h>
#include <stdio.h>
#include <stdarg.h>
#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;
}