132b1fd08SAndrew Rist /************************************************************** 232b1fd08SAndrew Rist * 332b1fd08SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 432b1fd08SAndrew Rist * or more contributor license agreements. See the NOTICE file 532b1fd08SAndrew Rist * distributed with this work for additional information 632b1fd08SAndrew Rist * regarding copyright ownership. The ASF licenses this file 732b1fd08SAndrew Rist * to you under the Apache License, Version 2.0 (the 832b1fd08SAndrew Rist * "License"); you may not use this file except in compliance 932b1fd08SAndrew Rist * with the License. You may obtain a copy of the License at 1032b1fd08SAndrew Rist * 1132b1fd08SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 1232b1fd08SAndrew Rist * 1332b1fd08SAndrew Rist * Unless required by applicable law or agreed to in writing, 1432b1fd08SAndrew Rist * software distributed under the License is distributed on an 1532b1fd08SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1632b1fd08SAndrew Rist * KIND, either express or implied. See the License for the 1732b1fd08SAndrew Rist * specific language governing permissions and limitations 1832b1fd08SAndrew Rist * under the License. 1932b1fd08SAndrew Rist * 2032b1fd08SAndrew Rist *************************************************************/ 2132b1fd08SAndrew Rist 22cdf0e10cSrcweir #define WIN32_LEAN_AND_MEAN 23cdf0e10cSrcweir 24cdf0e10cSrcweir #ifdef _MSC_VER 25cdf0e10cSrcweir #pragma warning(disable:4668 4917) // disable warnings for system headers 26cdf0e10cSrcweir #endif 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <windows.h> 29cdf0e10cSrcweir #include <windowsx.h> 30cdf0e10cSrcweir #include <shellapi.h> 31cdf0e10cSrcweir #include <shlobj.h> 32cdf0e10cSrcweir #include <tchar.h> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <stdio.h> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #define elementsof(buf) (sizeof(buf) / sizeof(buf[0])) 37cdf0e10cSrcweir 38cdf0e10cSrcweir enum PathResult 39cdf0e10cSrcweir { 40cdf0e10cSrcweir PATHRESULT_OK, 41cdf0e10cSrcweir PATHRESULT_API_NOT_SUPPORTED, 42cdf0e10cSrcweir PATHRESULT_EXE_NOT_FOUND 43cdf0e10cSrcweir }; 44cdf0e10cSrcweir 45cdf0e10cSrcweir const int MAXCMDLINELEN = 32768; 46cdf0e10cSrcweir 47cdf0e10cSrcweir static TCHAR g_szSTInstallationPath[MAX_PATH] = TEXT(""); 48cdf0e10cSrcweir static TCHAR g_szOperatingSystem[256] = TEXT(""); 49cdf0e10cSrcweir 50cdf0e10cSrcweir static const TCHAR g_szSTExecutable[256] = TEXT("stclient.exe"); 51cdf0e10cSrcweir 52cdf0e10cSrcweir //*************************************************************************** 53cdf0e10cSrcweir 54cdf0e10cSrcweir LONG RegReadValue( HKEY hBaseKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPVOID lpData, DWORD cbData ) 55cdf0e10cSrcweir { 56cdf0e10cSrcweir HKEY hKey = NULL; 57cdf0e10cSrcweir LONG lResult( 0 ); 58cdf0e10cSrcweir 59cdf0e10cSrcweir lResult = RegOpenKeyEx( hBaseKey, lpSubKey, 0, KEY_QUERY_VALUE, &hKey ); 60cdf0e10cSrcweir 61cdf0e10cSrcweir if ( ERROR_SUCCESS == lResult ) 62cdf0e10cSrcweir { 63cdf0e10cSrcweir lResult = RegQueryValueEx( hKey, lpValueName, NULL, NULL, (LPBYTE)lpData, &cbData ); 64cdf0e10cSrcweir RegCloseKey( hKey ); 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir return lResult; 68cdf0e10cSrcweir } 69cdf0e10cSrcweir 70cdf0e10cSrcweir //*************************************************************************** 71cdf0e10cSrcweir 72cdf0e10cSrcweir static LPTSTR *GetCommandArgs( int *pArgc ) 73cdf0e10cSrcweir { 74cdf0e10cSrcweir #ifdef UNICODE 75cdf0e10cSrcweir return CommandLineToArgvW( GetCommandLineW(), pArgc ); 76cdf0e10cSrcweir #else 77cdf0e10cSrcweir *pArgc = __argc; 78cdf0e10cSrcweir return __argv; 79cdf0e10cSrcweir #endif 80cdf0e10cSrcweir } 81cdf0e10cSrcweir 82cdf0e10cSrcweir //*************************************************************************** 83cdf0e10cSrcweir 84cdf0e10cSrcweir static bool IsSupportedPlatform() 85cdf0e10cSrcweir { 86cdf0e10cSrcweir OSVERSIONINFO aOsVersion; 87cdf0e10cSrcweir 88cdf0e10cSrcweir ZeroMemory( &aOsVersion, sizeof( OSVERSIONINFO )); 89cdf0e10cSrcweir aOsVersion.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); 90cdf0e10cSrcweir 91cdf0e10cSrcweir // Try to determine OS version 92cdf0e10cSrcweir if ( GetVersionEx( &aOsVersion )) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir switch ( aOsVersion.dwPlatformId ) 95cdf0e10cSrcweir { 96cdf0e10cSrcweir case VER_PLATFORM_WIN32_NT: // Windows NT based 97cdf0e10cSrcweir return true; 98cdf0e10cSrcweir 99cdf0e10cSrcweir case VER_PLATFORM_WIN32_WINDOWS: // Windows Me/98/95. 100cdf0e10cSrcweir case VER_PLATFORM_WIN32s: // Win32s 101cdf0e10cSrcweir return false; 102cdf0e10cSrcweir 103cdf0e10cSrcweir default: 104cdf0e10cSrcweir return false; 105cdf0e10cSrcweir } 106cdf0e10cSrcweir } 107cdf0e10cSrcweir 108cdf0e10cSrcweir return false; 109cdf0e10cSrcweir } 110cdf0e10cSrcweir 111cdf0e10cSrcweir //*************************************************************************** 112cdf0e10cSrcweir 113cdf0e10cSrcweir static LPCTSTR GetOperatingSystemString() 114cdf0e10cSrcweir { 115cdf0e10cSrcweir OSVERSIONINFO aOsVersion; 116cdf0e10cSrcweir 117cdf0e10cSrcweir ZeroMemory( &aOsVersion, sizeof( OSVERSIONINFO )); 118cdf0e10cSrcweir aOsVersion.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); 119cdf0e10cSrcweir 120cdf0e10cSrcweir _tcscpy( g_szOperatingSystem, TEXT( "Microsoft Windows" )); 121cdf0e10cSrcweir 122cdf0e10cSrcweir // Try to determine OS version 123cdf0e10cSrcweir if ( GetVersionEx( &aOsVersion )) 124cdf0e10cSrcweir { 125cdf0e10cSrcweir switch ( aOsVersion.dwPlatformId ) 126cdf0e10cSrcweir { 127cdf0e10cSrcweir // Test for the Windows NT product family. 128cdf0e10cSrcweir case VER_PLATFORM_WIN32_NT: 129cdf0e10cSrcweir { 130cdf0e10cSrcweir if ( aOsVersion.dwMajorVersion == 3 ) 131cdf0e10cSrcweir { 132cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( " NT 3." )); 133cdf0e10cSrcweir if ( aOsVersion.dwMinorVersion == 0 ) 134cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( "0" )); 135cdf0e10cSrcweir else if ( aOsVersion.dwMinorVersion == 5 ) 136cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( "5" )); 137cdf0e10cSrcweir else if ( aOsVersion.dwMinorVersion == 51 ) 138cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( "51" )); 139cdf0e10cSrcweir } 140cdf0e10cSrcweir else if ( aOsVersion.dwMajorVersion == 4 ) 141cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( " NT 4.0" )); 142cdf0e10cSrcweir else if ( aOsVersion.dwMajorVersion == 5 ) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir if ( aOsVersion.dwMinorVersion == 0 ) 145cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( " 2000" )); 146cdf0e10cSrcweir else if ( aOsVersion.dwMinorVersion == 1 ) 147cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( " XP" )); 148cdf0e10cSrcweir else if ( aOsVersion.dwMinorVersion == 2 ) 149cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( " Server 2003" )); 150cdf0e10cSrcweir } 151cdf0e10cSrcweir else if ( aOsVersion.dwMajorVersion == 6 ) 152cdf0e10cSrcweir { 153cdf0e10cSrcweir if ( aOsVersion.dwMinorVersion == 0 ) 154cdf0e10cSrcweir _tcscat( g_szOperatingSystem, " Vista" ); 155cdf0e10cSrcweir } 156cdf0e10cSrcweir } 157cdf0e10cSrcweir break; 158cdf0e10cSrcweir 159cdf0e10cSrcweir // Test for the Windows Me/98/95. 160cdf0e10cSrcweir case VER_PLATFORM_WIN32_WINDOWS: 161cdf0e10cSrcweir { 162cdf0e10cSrcweir if ( aOsVersion.dwMinorVersion == 0 ) 163cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( " 95" )); 164cdf0e10cSrcweir else if ( aOsVersion.dwMinorVersion == 10 ) 165cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( " 98" )); 166cdf0e10cSrcweir else if ( aOsVersion.dwMinorVersion == 90 ) 167cdf0e10cSrcweir _tcscat( g_szOperatingSystem, TEXT( " Me" )); 168cdf0e10cSrcweir } 169cdf0e10cSrcweir break; 170cdf0e10cSrcweir } 171cdf0e10cSrcweir } 172cdf0e10cSrcweir 173cdf0e10cSrcweir return g_szOperatingSystem; 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir //*************************************************************************** 177cdf0e10cSrcweir 178cdf0e10cSrcweir static bool FileExists( LPCTSTR lpPathToFile ) 179cdf0e10cSrcweir { 180cdf0e10cSrcweir bool bResult = false; 181cdf0e10cSrcweir HANDLE hFind; 182cdf0e10cSrcweir WIN32_FIND_DATA FindFileData; 183cdf0e10cSrcweir 184cdf0e10cSrcweir hFind = FindFirstFile( lpPathToFile, &FindFileData ); 185cdf0e10cSrcweir 186cdf0e10cSrcweir if ( hFind != INVALID_HANDLE_VALUE ) 187cdf0e10cSrcweir { 188cdf0e10cSrcweir FindClose( hFind ); 189cdf0e10cSrcweir bResult = true; 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir return bResult; 193cdf0e10cSrcweir } 194cdf0e10cSrcweir 195cdf0e10cSrcweir //*************************************************************************** 196cdf0e10cSrcweir 197cdf0e10cSrcweir static bool GetProgramFilesFolder( LPTSTR strPath ) 198cdf0e10cSrcweir { 199cdf0e10cSrcweir bool bRet = false; 200cdf0e10cSrcweir HINSTANCE hLibrary; 201cdf0e10cSrcweir 202cdf0e10cSrcweir if (( hLibrary = LoadLibrary( "shell32.dll" )) != NULL ) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir BOOL (WINAPI *pSHGetSpecialFolderPathA)( HWND, LPSTR, int, BOOL ); 205cdf0e10cSrcweir 206cdf0e10cSrcweir pSHGetSpecialFolderPathA = (BOOL (WINAPI *)(HWND, LPSTR, int, BOOL))GetProcAddress( hLibrary, "SHGetSpecialFolderPathA" ); 207cdf0e10cSrcweir 208cdf0e10cSrcweir if ( pSHGetSpecialFolderPathA ) 209cdf0e10cSrcweir { 210cdf0e10cSrcweir if ( pSHGetSpecialFolderPathA( NULL, strPath, CSIDL_PROGRAM_FILES, TRUE )) 211cdf0e10cSrcweir bRet = true; 212cdf0e10cSrcweir } 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir FreeLibrary( hLibrary ); 216cdf0e10cSrcweir 217cdf0e10cSrcweir return ( bRet ); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir 220cdf0e10cSrcweir //*************************************************************************** 221cdf0e10cSrcweir 222cdf0e10cSrcweir static PathResult RetrieveExecutablePath( LPTSTR szExecutablePath ) 223cdf0e10cSrcweir { 224cdf0e10cSrcweir PathResult eRet = PATHRESULT_API_NOT_SUPPORTED; 225cdf0e10cSrcweir TCHAR szProgramFilesFolder[MAX_PATH]; 226cdf0e10cSrcweir 227cdf0e10cSrcweir if ( GetProgramFilesFolder( szProgramFilesFolder )) 228cdf0e10cSrcweir { 229cdf0e10cSrcweir size_t nLen = _tcslen( szProgramFilesFolder ); 230cdf0e10cSrcweir if ( nLen > 0 ) 231cdf0e10cSrcweir { 232cdf0e10cSrcweir _tcscpy( szExecutablePath, szProgramFilesFolder ); 233cdf0e10cSrcweir if ( szProgramFilesFolder[nLen-1] != '\\' ) 234cdf0e10cSrcweir _tcscat( szExecutablePath, TEXT( "\\" )); 235cdf0e10cSrcweir _tcscat( szExecutablePath, TEXT( "Sun\\servicetag\\" )); 236cdf0e10cSrcweir _tcscat( szExecutablePath, g_szSTExecutable ); 237cdf0e10cSrcweir eRet = FileExists( szExecutablePath ) ? PATHRESULT_OK : PATHRESULT_EXE_NOT_FOUND; 238cdf0e10cSrcweir } 239cdf0e10cSrcweir } 240cdf0e10cSrcweir 241cdf0e10cSrcweir return eRet; 242cdf0e10cSrcweir } 243cdf0e10cSrcweir 244cdf0e10cSrcweir //*************************************************************************** 245cdf0e10cSrcweir 246cdf0e10cSrcweir static void SafeCopy( LPTSTR lpTarget, LPCSTR lpSource, size_t nMaxLen ) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir size_t nLen = _tcslen( lpSource ); 249cdf0e10cSrcweir size_t nCopy = ( nLen < size_t( nMaxLen-1 )) ? nLen : nMaxLen-1; 250cdf0e10cSrcweir _tcsncpy( lpTarget, lpSource, nMaxLen-1 ); 251cdf0e10cSrcweir *(lpTarget+nCopy) = 0; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir 254cdf0e10cSrcweir //*************************************************************************** 255cdf0e10cSrcweir 256cdf0e10cSrcweir int WINAPI _tWinMain( HINSTANCE /*hInstance*/, HINSTANCE, LPTSTR, int ) 257cdf0e10cSrcweir { 258cdf0e10cSrcweir const DWORD ERR_NO_RECORDS_FOUND = 225; 259cdf0e10cSrcweir const DWORD ERR_DUP_RECORD = 226; 260cdf0e10cSrcweir 261cdf0e10cSrcweir DWORD dwExitCode = (DWORD)1; 262cdf0e10cSrcweir 263cdf0e10cSrcweir int nArgs = 0; 264cdf0e10cSrcweir LPTSTR* lpArgs = GetCommandArgs( &nArgs ); 265cdf0e10cSrcweir 266cdf0e10cSrcweir if ( !IsSupportedPlatform() ) 267cdf0e10cSrcweir { 268cdf0e10cSrcweir // Return 0 for a successful run on not supported platforms 269cdf0e10cSrcweir // We don't want that the Office tries to start us forever. 270cdf0e10cSrcweir return 0; 271cdf0e10cSrcweir } 272cdf0e10cSrcweir 273cdf0e10cSrcweir if ( nArgs >= 11 ) 274cdf0e10cSrcweir { 275cdf0e10cSrcweir TCHAR szTargetURN[1024] = {0}; 276cdf0e10cSrcweir TCHAR szProductName[1024] = {0}; 277cdf0e10cSrcweir TCHAR szProductVersion[1024] = {0}; 278cdf0e10cSrcweir TCHAR szParentProductName[1024] = {0}; 279cdf0e10cSrcweir TCHAR szProductSource[1024] = {0}; 280cdf0e10cSrcweir TCHAR szInstanceURN[1024] = {0}; 281cdf0e10cSrcweir 282*be099857Smseidel // -i) INSTANCE_URN="$2"; shift;; 283*be099857Smseidel // -t) TARGET_URN="$2"; shift;; 284*be099857Smseidel // -p) PRODUCT_NAME="$2"; shift;; 285*be099857Smseidel // -e) PRODUCT_VERSION="$2"; shift;; 286*be099857Smseidel // -P) PARENT_PRODUCT_NAME="$2"; shift;; 287*be099857Smseidel // -S) PRODUCT_SOURCE="$2"; shift;; 288cdf0e10cSrcweir // "usage: $0 [-i <instance urn>] -p <product name> -e <product version> -t <urn> -S <source> -P <parent product name>" 289cdf0e10cSrcweir 290cdf0e10cSrcweir int i = 1; 291cdf0e10cSrcweir while ( i < nArgs ) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir LPTSTR lpArg = lpArgs[i]; 294cdf0e10cSrcweir if ( _tcslen( lpArg ) >= 2 ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir if ( lpArg[0] == '-' ) 297cdf0e10cSrcweir { 298cdf0e10cSrcweir switch ( lpArg[1] ) 299cdf0e10cSrcweir { 300cdf0e10cSrcweir case 'i': 301cdf0e10cSrcweir { 302cdf0e10cSrcweir if ( i < nArgs ) 303cdf0e10cSrcweir ++i; 304cdf0e10cSrcweir SafeCopy( szInstanceURN, lpArgs[i], elementsof( szInstanceURN )); 305cdf0e10cSrcweir break; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir 308cdf0e10cSrcweir case 't': 309cdf0e10cSrcweir { 310cdf0e10cSrcweir if ( i < nArgs ) 311cdf0e10cSrcweir ++i; 312cdf0e10cSrcweir SafeCopy( szTargetURN, lpArgs[i], elementsof( szTargetURN )); 313cdf0e10cSrcweir break; 314cdf0e10cSrcweir } 315cdf0e10cSrcweir case 'p': 316cdf0e10cSrcweir { 317cdf0e10cSrcweir if ( i < nArgs ) 318cdf0e10cSrcweir ++i; 319cdf0e10cSrcweir SafeCopy( szProductName, lpArgs[i], elementsof( szProductName )); 320cdf0e10cSrcweir break; 321cdf0e10cSrcweir } 322cdf0e10cSrcweir case 'e': 323cdf0e10cSrcweir { 324cdf0e10cSrcweir if ( i < nArgs ) 325cdf0e10cSrcweir ++i; 326cdf0e10cSrcweir SafeCopy( szProductVersion, lpArgs[i], elementsof( szProductVersion )); 327cdf0e10cSrcweir break; 328cdf0e10cSrcweir } 329cdf0e10cSrcweir case 'P': 330cdf0e10cSrcweir { 331cdf0e10cSrcweir if ( i < nArgs ) 332cdf0e10cSrcweir ++i; 333cdf0e10cSrcweir SafeCopy( szParentProductName, lpArgs[i], elementsof( szParentProductName )); 334cdf0e10cSrcweir break; 335cdf0e10cSrcweir } 336cdf0e10cSrcweir case 'S': 337cdf0e10cSrcweir { 338cdf0e10cSrcweir if ( i < nArgs ) 339cdf0e10cSrcweir ++i; 340cdf0e10cSrcweir SafeCopy( szProductSource, lpArgs[i], elementsof( szProductSource )); 341cdf0e10cSrcweir break; 342cdf0e10cSrcweir } 343cdf0e10cSrcweir 344cdf0e10cSrcweir default: 345cdf0e10cSrcweir break; 346cdf0e10cSrcweir } // switch 347cdf0e10cSrcweir } 348cdf0e10cSrcweir } 349cdf0e10cSrcweir 350cdf0e10cSrcweir ++i; 351cdf0e10cSrcweir } 352cdf0e10cSrcweir 353cdf0e10cSrcweir if ( RetrieveExecutablePath( g_szSTInstallationPath ) == PATHRESULT_OK ) 354cdf0e10cSrcweir { 355cdf0e10cSrcweir BOOL bSuccess = TRUE; 356cdf0e10cSrcweir BOOL bProcessStarted = FALSE; 357cdf0e10cSrcweir 358cdf0e10cSrcweir STARTUPINFO aStartupInfo; 359cdf0e10cSrcweir PROCESS_INFORMATION aProcessInfo; 360cdf0e10cSrcweir LPTSTR lpCommandLine = 0; 361cdf0e10cSrcweir 362cdf0e10cSrcweir ZeroMemory( &aStartupInfo, sizeof( aStartupInfo )); 363cdf0e10cSrcweir aStartupInfo.cb = sizeof( aStartupInfo ); 364cdf0e10cSrcweir ZeroMemory( &aProcessInfo, sizeof( aProcessInfo )); 365cdf0e10cSrcweir 366cdf0e10cSrcweir if ( _tcslen( szInstanceURN ) == 0 ) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir // TEST=`${STCLIENT} -f -t ${TARGET_URN}` 369cdf0e10cSrcweir lpCommandLine = new TCHAR[MAXCMDLINELEN]; 370cdf0e10cSrcweir 371cdf0e10cSrcweir _tcscpy( lpCommandLine, TEXT( "\"" )); 372cdf0e10cSrcweir _tcscat( lpCommandLine, g_szSTInstallationPath ); 373cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 374cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -f" )); 375cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -t ")); 376cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 377cdf0e10cSrcweir _tcscat( lpCommandLine, szTargetURN ); 378cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 379cdf0e10cSrcweir 380cdf0e10cSrcweir bSuccess = CreateProcess( 381cdf0e10cSrcweir NULL, 382cdf0e10cSrcweir lpCommandLine, 383cdf0e10cSrcweir NULL, 384cdf0e10cSrcweir NULL, 385cdf0e10cSrcweir TRUE, 386cdf0e10cSrcweir CREATE_NO_WINDOW, 387cdf0e10cSrcweir NULL, 388cdf0e10cSrcweir NULL, 389cdf0e10cSrcweir &aStartupInfo, 390cdf0e10cSrcweir &aProcessInfo ); 391cdf0e10cSrcweir 392cdf0e10cSrcweir bProcessStarted = TRUE; 393cdf0e10cSrcweir 394cdf0e10cSrcweir // wait until process ends to receive exit code 395cdf0e10cSrcweir WaitForSingleObject( aProcessInfo.hProcess, INFINITE ); 396cdf0e10cSrcweir 397cdf0e10cSrcweir delete []lpCommandLine; 398cdf0e10cSrcweir } 399cdf0e10cSrcweir 400cdf0e10cSrcweir if ( bSuccess ) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir DWORD dwSTClientExitCode( ERR_NO_RECORDS_FOUND ); 403cdf0e10cSrcweir if ( bProcessStarted ) 404cdf0e10cSrcweir { 405cdf0e10cSrcweir GetExitCodeProcess( aProcessInfo.hProcess, &dwSTClientExitCode ); 406cdf0e10cSrcweir dwSTClientExitCode &= 0x000000ff; 407cdf0e10cSrcweir 408cdf0e10cSrcweir CloseHandle( aProcessInfo.hProcess ); 409cdf0e10cSrcweir CloseHandle( aProcessInfo.hThread ); 410cdf0e10cSrcweir } 411cdf0e10cSrcweir 412cdf0e10cSrcweir if ( dwSTClientExitCode == ERR_NO_RECORDS_FOUND ) 413cdf0e10cSrcweir { 414cdf0e10cSrcweir // output=`${STCLIENT} -a [-i "${INSTANCE_URN}"] -p "${PRODUCT_NAME}" -e "${PRODUCT_VERSION}" -t "${TARGET_URN}" -S "${PRODUCT_SOURCE}" -P "${PARENT_PRODUCT_NAME}" -m "Sun Microsystems, Inc." -A ${uname} -z global` 415cdf0e10cSrcweir lpCommandLine = new TCHAR[MAXCMDLINELEN]; 416cdf0e10cSrcweir 417cdf0e10cSrcweir _tcscpy( lpCommandLine, TEXT( "\"" )); 418cdf0e10cSrcweir _tcscat( lpCommandLine, g_szSTInstallationPath ); 419cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 420cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -a" )); 421cdf0e10cSrcweir if ( _tcslen( szInstanceURN ) > 0 ) 422cdf0e10cSrcweir { 423cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -i " )); 424cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 425cdf0e10cSrcweir _tcscat( lpCommandLine, szInstanceURN ); 426cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 427cdf0e10cSrcweir } 428cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -p " )); 429cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 430cdf0e10cSrcweir _tcscat( lpCommandLine, szProductName ); 431cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 432cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -e " )); 433cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 434cdf0e10cSrcweir _tcscat( lpCommandLine, szProductVersion ); 435cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 436cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -t " )); 437cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 438cdf0e10cSrcweir _tcscat( lpCommandLine, szTargetURN ); 439cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 440cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -S " )); 441cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 442cdf0e10cSrcweir _tcscat( lpCommandLine, szProductSource ); 443cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 444cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -P " )); 445cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 446cdf0e10cSrcweir _tcscat( lpCommandLine, szParentProductName ); 447cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 448cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -m \"Sun Microsystems, Inc.\"" )); 449cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -A " )); 450cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 451cdf0e10cSrcweir _tcscat( lpCommandLine, GetOperatingSystemString() ); 452cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( "\"" )); 453cdf0e10cSrcweir _tcscat( lpCommandLine, TEXT( " -z global" )); 454cdf0e10cSrcweir 455cdf0e10cSrcweir ZeroMemory( &aStartupInfo, sizeof( aStartupInfo )); 456cdf0e10cSrcweir aStartupInfo.cb = sizeof(aStartupInfo); 457cdf0e10cSrcweir ZeroMemory( &aProcessInfo, sizeof( aProcessInfo )); 458cdf0e10cSrcweir 459cdf0e10cSrcweir bSuccess = CreateProcess( 460cdf0e10cSrcweir NULL, 461cdf0e10cSrcweir lpCommandLine, 462cdf0e10cSrcweir NULL, 463cdf0e10cSrcweir NULL, 464cdf0e10cSrcweir TRUE, 465cdf0e10cSrcweir CREATE_NO_WINDOW, 466cdf0e10cSrcweir NULL, 467cdf0e10cSrcweir NULL, 468cdf0e10cSrcweir &aStartupInfo, 469cdf0e10cSrcweir &aProcessInfo ); 470cdf0e10cSrcweir 471cdf0e10cSrcweir delete []lpCommandLine; 472cdf0e10cSrcweir 473cdf0e10cSrcweir // wait until process ends to receive exit code 474cdf0e10cSrcweir WaitForSingleObject( aProcessInfo.hProcess, INFINITE ); 475cdf0e10cSrcweir 476cdf0e10cSrcweir dwSTClientExitCode = 0; 477cdf0e10cSrcweir GetExitCodeProcess( aProcessInfo.hProcess, &dwSTClientExitCode ); 478cdf0e10cSrcweir dwSTClientExitCode &= 0x000000ff; 479cdf0e10cSrcweir 480cdf0e10cSrcweir CloseHandle( aProcessInfo.hProcess ); 481cdf0e10cSrcweir CloseHandle( aProcessInfo.hThread ); 482cdf0e10cSrcweir 483cdf0e10cSrcweir if ( !bSuccess ) 484cdf0e10cSrcweir dwExitCode = 1; // couldn't start stclient process 485cdf0e10cSrcweir else 486cdf0e10cSrcweir { 487cdf0e10cSrcweir if ( _tcslen( szInstanceURN ) > 0 ) 488cdf0e10cSrcweir { 489cdf0e10cSrcweir // don't register again if we registered in a previous run 490cdf0e10cSrcweir // or we called stclient successfully. 491cdf0e10cSrcweir if (( dwSTClientExitCode == ERR_DUP_RECORD ) || 492cdf0e10cSrcweir ( dwSTClientExitCode == 0 )) 493cdf0e10cSrcweir dwExitCode = 0; 494cdf0e10cSrcweir else 495cdf0e10cSrcweir dwExitCode = 1; // other errors 496cdf0e10cSrcweir } 497cdf0e10cSrcweir else 498cdf0e10cSrcweir dwExitCode = ( dwSTClientExitCode == 0 ) ? 0 : 1; 499cdf0e10cSrcweir } 500cdf0e10cSrcweir } 501cdf0e10cSrcweir else if ( dwSTClientExitCode == 0 ) 502cdf0e10cSrcweir dwExitCode = 0; // already registered 503cdf0e10cSrcweir else 504cdf0e10cSrcweir dwExitCode = 1; // other errors 505cdf0e10cSrcweir } 506cdf0e10cSrcweir else 507cdf0e10cSrcweir dwExitCode = 1; // couldn't start stclient 508cdf0e10cSrcweir } 509cdf0e10cSrcweir else 510cdf0e10cSrcweir dwExitCode = 1; // no executable found 511cdf0e10cSrcweir } 512cdf0e10cSrcweir else 513cdf0e10cSrcweir dwExitCode = 0; // wrong number of arguments 514cdf0e10cSrcweir 515cdf0e10cSrcweir return dwExitCode; 516cdf0e10cSrcweir } 517