Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

399 lines
9.7 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // main.cpp
  7. //
  8. // Maintained By:
  9. // Galen Barbee (GalenB) 30-Nov-2001
  10. // Geoffrey Pease (GPease) 12-MAY-2000
  11. //
  12. //////////////////////////////////////////////////////////////////////////////
  13. #include "pch.h"
  14. #include <initguid.h>
  15. #include <guids.h>
  16. DEFINE_MODULE("WizardTest")
  17. #define CCS_LIB L"..\\..\\..\\..\\dll\\obj\\i386\\ClusCfgServer.dll"
  18. // Typedefs
  19. typedef HRESULT (*PDLLREGISTERSERVER)( void );
  20. HINSTANCE g_hInstance = NULL;
  21. LONG g_cObjects = 0;
  22. BOOL g_fCreate = FALSE;
  23. LPCWSTR g_pszCluster = NULL;
  24. LPCWSTR g_pszDomain = NULL;
  25. LPCWSTR g_pszCSUser = NULL;
  26. LPCWSTR g_pszCSPassword = NULL;
  27. LPCWSTR g_pszCSDomain = NULL;
  28. LPCWSTR g_pszNode = NULL;
  29. void * g_GlobalMemoryList = NULL; // Global memory tracking list
  30. //////////////////////////////////////////////////////////////////////////////
  31. // Forward Declarations:
  32. //////////////////////////////////////////////////////////////////////////////
  33. HRESULT
  34. HrRegisterTheDll( void );
  35. HRESULT
  36. HrParseCommandLine(
  37. int argc,
  38. WCHAR * argv[]
  39. );
  40. void
  41. Usage( void );
  42. //////////////////////////////////////////////////////////////////////////////
  43. //++
  44. //
  45. // HRESULT
  46. // HrRegisterTheDll( void )
  47. //
  48. // Description:
  49. // Register the DLL.
  50. //
  51. // Arguments:
  52. // None.
  53. //
  54. // Return Values:
  55. // HRESULT
  56. //
  57. //--
  58. //////////////////////////////////////////////////////////////////////////////
  59. HRESULT
  60. HrRegisterTheDll( void )
  61. {
  62. HRESULT hr;
  63. PDLLREGISTERSERVER pDllRegisterServer;
  64. HMODULE hLib = NULL;
  65. TraceFunc( "" );
  66. // Make sure the DLL is properly registered.
  67. hLib = LoadLibrary( CCS_LIB );
  68. if ( hLib == NULL )
  69. goto Win32Error;
  70. pDllRegisterServer =
  71. reinterpret_cast< PDLLREGISTERSERVER >(
  72. GetProcAddress( hLib, "DllRegisterServer" )
  73. );
  74. if ( pDllRegisterServer == NULL )
  75. goto Win32Error;
  76. hr = THR( pDllRegisterServer() );
  77. if ( FAILED( hr ) )
  78. goto Cleanup;
  79. Cleanup:
  80. if ( hLib != NULL )
  81. {
  82. FreeLibrary( hLib );
  83. }
  84. HRETURN( hr );
  85. Win32Error:
  86. hr = HRESULT_FROM_WIN32( TW32( GetLastError() ) );
  87. goto Cleanup;
  88. } //*** HrRegisterTheDll()
  89. //////////////////////////////////////////////////////////////////////////////
  90. //++
  91. //
  92. // HRESULT
  93. // HrParseCommandLine(
  94. // int argc,
  95. // WCHAR * argv[]
  96. // )
  97. //
  98. // Description:
  99. // Parse the command line.
  100. //
  101. // Arguments:
  102. // None.
  103. //
  104. // Return Values:
  105. // HRESULT
  106. //
  107. //--
  108. //////////////////////////////////////////////////////////////////////////////
  109. HRESULT
  110. HrParseCommandLine(
  111. int argc,
  112. WCHAR * argv[]
  113. )
  114. {
  115. HRESULT hr = NOERROR;
  116. int idx;
  117. WCHAR wch;
  118. WCHAR * pwsz;
  119. WCHAR szMsg[ 2048 ];
  120. int cchMsg = ARRAYSIZE( szMsg );
  121. for ( idx = 1 ; idx < argc ; idx++ )
  122. {
  123. wch = *argv[ idx ];
  124. pwsz = &argv[ idx ][ 1 ];
  125. if ( wch == L'/' || wch == L'-' )
  126. {
  127. if ( ClRtlStrICmp( pwsz, L"Create" ) == 0 )
  128. {
  129. g_fCreate = TRUE;
  130. continue;
  131. }
  132. else if ( ClRtlStrICmp( pwsz, L"Cluster" ) == 0 )
  133. {
  134. g_pszCluster = argv[ idx + 1 ];
  135. idx += 2;
  136. } // if: create switch
  137. else if ( ClRtlStrICmp( pwsz, L"CSUser" ) == 0 )
  138. {
  139. g_pszCSUser = argv[ idx + 1 ];
  140. idx += 2;
  141. }
  142. else if ( ClRtlStrICmp( pwsz, L"CSPassword" ) == 0 )
  143. {
  144. g_pszCSPassword = argv[ idx + 1 ];
  145. idx += 2;
  146. }
  147. else if ( ClRtlStrICmp( pwsz, L"CSDomain" ) == 0 )
  148. {
  149. g_pszCSDomain = argv[ idx + 1 ];
  150. idx += 2;
  151. }
  152. else if ( ClRtlStrICmp( pwsz, L"?" ) == 0 )
  153. {
  154. Usage();
  155. goto Cleanup;
  156. }
  157. } // if: '/' or '-'
  158. else
  159. {
  160. wnsprintf( szMsg, cchMsg, L"Unknown command line option '%ls'.", argv[ idx ] );
  161. szMsg[ ARRAYSIZE( szMsg ) - 1 ] = L'\0';
  162. MessageBox( NULL, szMsg, __MODULE__, MB_OK );
  163. hr = E_INVALIDARG;
  164. goto Cleanup;
  165. } // else: not a switch
  166. } // for: each character in the command line
  167. Cleanup:
  168. return hr;
  169. } //*** HrParseCommandLine()
  170. //////////////////////////////////////////////////////////////////////////////
  171. //++
  172. //
  173. // void
  174. // Usage( void )
  175. //
  176. // Description:
  177. // Show usage information.
  178. //
  179. // Arguments:
  180. // None.
  181. //
  182. // Return Values:
  183. // None.
  184. //
  185. //--
  186. //////////////////////////////////////////////////////////////////////////////
  187. void
  188. Usage( void )
  189. {
  190. WCHAR szMsg[ 2048 ] =
  191. L"WizardTest [/Create ]\n"
  192. L" [/Cluster name]\n"
  193. L" [/CSUser user]\n"
  194. L" [/CSPassword password]\n"
  195. L" [/CSDomain domain]\n";
  196. MessageBoxW( NULL, szMsg, __MODULE__, MB_OK );
  197. } //*** Usage()
  198. //////////////////////////////////////////////////////////////////////////////
  199. //
  200. // int
  201. // _cdecl
  202. // wmain( void )
  203. //
  204. // Description:
  205. // Program entrance.
  206. //
  207. // Arguments:
  208. // argc -- Count of arguments on the command line.
  209. // argv -- Argument string array.
  210. //
  211. // Return Value:
  212. // S_OK (0) - Success.
  213. // other HRESULTs - Error.
  214. //
  215. //////////////////////////////////////////////////////////////////////////////
  216. int
  217. _cdecl
  218. wmain( int argc, WCHAR * argv[] )
  219. {
  220. HRESULT hr;
  221. BOOL fDone;
  222. BOOL fRet;
  223. IClusCfgWizard * pClusCfgWizard = NULL;
  224. BSTR bstrTmp = NULL;
  225. TraceInitializeProcess( NULL );
  226. #if 0
  227. // Register the DLL
  228. hr = THR( HrRegisterTheDll() );
  229. if ( FAILED( hr ) )
  230. goto Cleanup;
  231. #endif
  232. // Parse the command line.
  233. hr = THR( HrParseCommandLine( argc, argv ) );
  234. if ( FAILED( hr ) )
  235. goto Cleanup;
  236. // Start up the wizard
  237. hr = THR( CoInitialize( NULL ) );
  238. if ( FAILED( hr ) )
  239. goto Cleanup;
  240. hr = THR( CoInitializeSecurity(
  241. NULL,
  242. -1,
  243. NULL,
  244. NULL,
  245. RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
  246. RPC_C_IMP_LEVEL_IMPERSONATE,
  247. NULL,
  248. EOAC_NONE,
  249. 0
  250. ) );
  251. if ( FAILED( hr ) )
  252. goto Cleanup;
  253. // Create instance of the wizard
  254. hr = THR( CoCreateInstance( CLSID_ClusCfgWizard,
  255. NULL,
  256. CLSCTX_SERVER,
  257. TypeSafeParams( IClusCfgWizard, &pClusCfgWizard )
  258. ) );
  259. if ( FAILED( hr ) )
  260. goto Cleanup;
  261. // Create empty buffer so SysReAllocString doesn't scream at us.
  262. bstrTmp = TraceSysAllocString( L" " );
  263. if ( bstrTmp == NULL )
  264. goto OutOfMemory;
  265. if ( g_pszCluster != NULL )
  266. {
  267. DebugMsg( "Entering %s for cluster name.", g_pszCluster );
  268. fRet = TraceSysReAllocString( &bstrTmp, g_pszCluster );
  269. if ( !fRet )
  270. goto OutOfMemory;
  271. hr = THR( pClusCfgWizard->put_ClusterName( bstrTmp ) );
  272. if ( FAILED( hr ) )
  273. goto Cleanup;
  274. }
  275. if ( g_pszCSUser != NULL )
  276. {
  277. DebugMsg( "Entering %s for cluster account username.", g_pszCSUser );
  278. fRet = TraceSysReAllocString( &bstrTmp, g_pszCSUser );
  279. if ( !fRet )
  280. goto OutOfMemory;
  281. hr = THR( pClusCfgWizard->put_ServiceAccountUserName( bstrTmp ) );
  282. if ( FAILED( hr ) )
  283. goto Cleanup;
  284. }
  285. if ( g_pszCSPassword != NULL )
  286. {
  287. DebugMsg( "Entering %s for cluster account password.", g_pszCSPassword );
  288. fRet = TraceSysReAllocString( &bstrTmp, g_pszCSPassword );
  289. if ( !fRet )
  290. goto OutOfMemory;
  291. hr = THR( pClusCfgWizard->put_ServiceAccountPassword( bstrTmp ) );
  292. if ( FAILED( hr ) )
  293. goto Cleanup;
  294. }
  295. if ( g_pszCSDomain != NULL )
  296. {
  297. DebugMsg( "Entering %s for cluster account domain.", g_pszCSDomain );
  298. fRet = TraceSysReAllocString( &bstrTmp, g_pszCSDomain );
  299. if ( !fRet )
  300. goto OutOfMemory;
  301. hr = THR( pClusCfgWizard->put_ServiceAccountDomainName( bstrTmp ) );
  302. if ( FAILED( hr ) )
  303. goto Cleanup;
  304. }
  305. if ( g_fCreate )
  306. {
  307. DebugMsg( "Creating cluster..." );
  308. hr = THR( pClusCfgWizard->CreateCluster( NULL, &fDone ) );
  309. if ( FAILED( hr ) )
  310. goto Cleanup;
  311. } // if: creating a new cluster
  312. else
  313. {
  314. DebugMsg( "Add to cluster..." );
  315. hr = THR( pClusCfgWizard->AddClusterNodes( NULL, &fDone ) );
  316. if ( FAILED( hr ) )
  317. goto Cleanup;
  318. }
  319. // check returned indicator
  320. DebugMsg( "Return status: %s", BOOLTOSTRING( fDone ) );
  321. Cleanup:
  322. if ( bstrTmp != NULL )
  323. {
  324. TraceSysFreeString( bstrTmp );
  325. }
  326. if ( pClusCfgWizard != NULL )
  327. {
  328. pClusCfgWizard->Release();
  329. }
  330. CoUninitialize();
  331. TraceTerminateProcess();
  332. ExitProcess( 0 );
  333. OutOfMemory:
  334. hr = THR( E_OUTOFMEMORY );
  335. goto Cleanup;
  336. } //*** main()