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