#include "wizard.h" #define REGSTR_PATH_RUNONCE TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce") #if !defined (WIN16) #include static const TCHAR cszICW_StartFileName[] = TEXT("ICWStart.bat"); static const TCHAR cszICW_StartCommand[] = TEXT("@start "); static const TCHAR cszICW_DummyWndName[] = TEXT("\"ICW\" "); static const TCHAR cszICW_ExitCommand[] = TEXT("\r\n@exit"); static TCHAR g_cszAppName[257] = TEXT("inetwiz"); //+---------------------------------------------------------------------------- // // Function SetRunOnce // // Synopsis Before we reboot we have to make sure this // executable is automatically run after startup // // Arguments none // // Returns: DWORD - status // // History: // MKarki modified - for INETWIZ.EXE // //----------------------------------------------------------------------------- DWORD SetRunOnce ( VOID ) { TCHAR szTemp[MAX_PATH + MAX_PATH + 1]; TCHAR szTemp2[MAX_PATH + 1]; DWORD dwRet = ERROR_CANTREAD; HKEY hKey; LPTSTR lpszFilePart; // // get the name of the executable // if (GetModuleFileName(NULL,szTemp2,ARRAYSIZE(szTemp2)) != 0) { NULL_TERM_TCHARS(szTemp2); GetShortPathName (szTemp2, szTemp, ARRAYSIZE(szTemp)); NULL_TERM_TCHARS(szTemp); // // Determine Version of the OS we are runningon // OSVERSIONINFO osvi; ZeroMemory(&osvi,sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (!GetVersionEx(&osvi)) { ZeroMemory(&osvi,sizeof(OSVERSIONINFO)); } if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId) { // // if running on NT than copy the command into a // batch file to be run after reboot // dwRet = SetStartUpCommand (szTemp); } else { // // in case of Win95 we can safely put our path // in the RUNONCE registry key // dwRet = RegCreateKey ( HKEY_LOCAL_MACHINE, REGSTR_PATH_RUNONCE, &hKey ); if (ERROR_SUCCESS == dwRet) { dwRet = RegSetValueEx ( hKey, g_cszAppName, 0L, REG_SZ, (LPBYTE)szTemp, sizeof(szTemp) ); RegCloseKey (hKey); } } } return (dwRet); } // end of SetRunOnce function //+---------------------------------------------------------------------------- // // Function SetStartUpCommand // // Synopsis On an NT machine the RunOnce method is not reliable. Therefore // we will restart the ICW by placing a .BAT file in the common // startup directory. // // Arguments lpCmd - command line used to restart the ICW // // Returns: BOOL - success/failure // // // History 1-10-97 ChrisK Created // 5/2/97 MKarki modified for INETWIZ // //----------------------------------------------------------------------------- BOOL SetStartUpCommand ( LPTSTR lpCmd ) { BOOL bRC = FALSE; HANDLE hFile = INVALID_HANDLE_VALUE ; DWORD dwWLen; // dummy variable used to make WriteFile happy TCHAR szCommandLine[MAX_PATH + 1]; LPITEMIDLIST lpItemDList = NULL; HRESULT hr = ERROR_SUCCESS; BOOL bRetVal = FALSE; IMalloc *pMalloc = NULL; // // build full filename // hr = SHGetSpecialFolderLocation(NULL,CSIDL_COMMON_STARTUP,&lpItemDList); if (ERROR_SUCCESS != hr) goto SetStartUpCommandExit; if (FALSE == SHGetPathFromIDList(lpItemDList, szCommandLine)) goto SetStartUpCommandExit; // // Free up the memory allocated for LPITEMIDLIST // because seems like we are clobberig something later // by not freeing this // hr = SHGetMalloc (&pMalloc); if (SUCCEEDED (hr)) { pMalloc->Free (lpItemDList); pMalloc->Release (); } // // make sure there is a trailing \ character // if ('\\' != szCommandLine[lstrlen(szCommandLine)-1]) lstrcat(szCommandLine,TEXT("\\")); lstrcat(szCommandLine,cszICW_StartFileName); // // Open file // hFile = CreateFile ( szCommandLine, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL ); if (INVALID_HANDLE_VALUE == hFile) goto SetStartUpCommandExit; // // Write the restart commands to the file // bRetVal = WriteFile( hFile, cszICW_StartCommand, lstrlen(cszICW_StartCommand), &dwWLen, NULL ); if (FALSE == bRetVal) goto SetStartUpCommandExit; // // 1/20/96 jmazner Normandy #13287 // Start command considers the first thing it sees // in quotes to be a window title // So, since our path is in quotes, put in a fake window title // bRetVal = WriteFile ( hFile, cszICW_DummyWndName, lstrlen(cszICW_DummyWndName), &dwWLen,NULL ); if (FALSE == bRetVal) goto SetStartUpCommandExit; // // write the path name of the executable now // bRetVal = WriteFile ( hFile, lpCmd, lstrlen(lpCmd), &dwWLen, NULL ); if (FALSE == bRetVal) goto SetStartUpCommandExit; // // write the exit command in the next line // bRetVal = WriteFile ( hFile, cszICW_ExitCommand, lstrlen (cszICW_ExitCommand), &dwWLen, NULL ); if (FALSE == bRetVal) goto SetStartUpCommandExit; bRC = TRUE; SetStartUpCommandExit: // // Close handle and exit // if (INVALID_HANDLE_VALUE != hFile) CloseHandle(hFile); return bRC; } // end of SetStartUpCommand function //+---------------------------------------------------------------------------- // // Function: DeleteStartUpCommand // // Synopsis: After restart the ICW we need to delete the .bat file from // the common startup directory // // Arguements: None // // Returns: None // // History: 1-10-97 ChrisK Created // //----------------------------------------------------------------------------- VOID DeleteStartUpCommand ( VOID ) { TCHAR szStartUpFile[MAX_PATH + 1]; LPITEMIDLIST lpItemDList = NULL; HRESULT hr = ERROR_SUCCESS; IMalloc *pMalloc = NULL; // // Sleep for 10 seconds // // build full filename // hr = SHGetSpecialFolderLocation(NULL,CSIDL_COMMON_STARTUP,&lpItemDList); if (ERROR_SUCCESS != hr) goto DeleteStartUpCommandExit; if (FALSE == SHGetPathFromIDList(lpItemDList, szStartUpFile)) goto DeleteStartUpCommandExit; // // Free up the memory allocated for LPITEMIDLIST // because seems like we are clobberig something later // by not freeing this // hr = SHGetMalloc (&pMalloc); if (SUCCEEDED (hr)) { pMalloc->Free (lpItemDList); pMalloc->Release (); } // // make sure there is a trailing \ character // if ('\\' != szStartUpFile[lstrlen(szStartUpFile)-1]) lstrcat(szStartUpFile,TEXT("\\")); lstrcat(szStartUpFile,cszICW_StartFileName); // // we dont care if the file does not exist // DeleteFile(szStartUpFile); DeleteStartUpCommandExit: return; } // end of DeleteStartUpCommand function #endif // !defined (WIN16) //+---------------------------------------------------------------------------- // // Function: FGetSystemShutdownPrivledge // // Synopsis: For windows NT the process must explicitly ask for permission // to reboot the system. // // Arguements: none // // Return: TRUE - privledges granted // FALSE - DENIED // // History: 8/14/96 ChrisK Created // // Note: BUGBUG for Win95 we are going to have to softlink to these // entry points. Otherwise the app won't even load. // Also, this code was originally lifted out of MSDN July96 // "Shutting down the system" //----------------------------------------------------------------------------- BOOL FGetSystemShutdownPrivledge ( VOID ) { HANDLE hToken = NULL; TOKEN_PRIVILEGES tkp; BOOL bRC = FALSE; if (IsNT()) { // // Get the current process token handle // so we can get shutdown privilege. // if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) goto FGetSystemShutdownPrivledgeExit; // // Get the LUID for shutdown privilege. // ZeroMemory(&tkp,sizeof(tkp)); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; /* one privilege to set */ tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // // Get shutdown privilege for this process. // AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); if (ERROR_SUCCESS == GetLastError()) bRC = TRUE; } else { bRC = TRUE; } FGetSystemShutdownPrivledgeExit: if (hToken) CloseHandle(hToken); return bRC; } //+------------------------------------------------------------------- // // Function: IsNT // // Synopsis: findout If we are running on NT // // Arguements: none // // Return: TRUE - Yes // FALSE - No // //-------------------------------------------------------------------- BOOL IsNT ( VOID ) { OSVERSIONINFO OsVersionInfo; ZeroMemory(&OsVersionInfo, sizeof(OSVERSIONINFO)); OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&OsVersionInfo); return (VER_PLATFORM_WIN32_NT == OsVersionInfo.dwPlatformId); } //end of IsNT function call //+------------------------------------------------------------------- // // Function: IsNT5 // // Synopsis: findout If we are running on NT5 // // Arguements: none // // Return: TRUE - Yes // FALSE - No // //-------------------------------------------------------------------- BOOL IsNT5 ( VOID ) { OSVERSIONINFO OsVersionInfo; ZeroMemory(&OsVersionInfo, sizeof(OSVERSIONINFO)); OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&OsVersionInfo); return ((VER_PLATFORM_WIN32_NT == OsVersionInfo.dwPlatformId) && (OsVersionInfo.dwMajorVersion >= 5)); } //end of IsNT function call