//Copyright (c) 1998 - 1999 Microsoft Corporation /****************************************************************************** * * NDSPSVR.C * * This module contains code for the NDSPSVR utility. * This utility adds or removes the NDS Preferred Server registry key. * * Copyright Citrix Systems Inc. 1996-1997 * * $Log: $ * *******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #undef SAP_SOCKET #include #include "ndspsvr.h" #include /* * Global Data */ USHORT help_flag = FALSE; // User wants help USHORT fQuery = FALSE; // query USHORT fDisable = FALSE; // disable WCHAR Server[MAX_SERVER_NAME_LENGTH]; TOKMAP ptm[] = { {L"/q", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fQuery}, {L"/query", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fQuery}, {L"/enable", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_SERVER_NAME_LENGTH, Server}, {L"/disable", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fDisable}, {L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &help_flag}, {0, 0, 0, 0, 0} }; /* * Local function prototypes. */ VOID Usage(BOOLEAN bError); BOOL DeleteKey(VOID); BOOL AddKey(VOID); BOOL QueryKey(VOID); /******************************************************************************* * * main * ******************************************************************************/ int __cdecl main(INT argc, CHAR **argv) { WCHAR *CmdLine; WCHAR **argvW; BOOL rc; INT i; /* * We can't use argv[] because its always ANSI, regardless of UNICODE */ CmdLine = GetCommandLineW(); /* * Massage the new command line to look like an argv[] type * because ParseCommandLine() depends on this format */ argvW = (WCHAR **)malloc( sizeof(WCHAR *) * (argc+1) ); if(argvW == NULL) { ErrorPrintf(IDS_ERROR_MALLOC); return(FAILURE); } argvW[0] = wcstok(CmdLine, L" "); for(i=1; i < argc; i++){ argvW[i] = wcstok(0, L" "); OEM2ANSIW(argvW[i], wcslen(argvW[i])); } argvW[argc] = NULL; /* * parse the cmd line without parsing the program name (argc-1, argv+1) */ rc = ParseCommandLine(argc-1, argvW+1, ptm, 0); /* * Check for error from ParseCommandLine */ if ( help_flag || rc ) { if ( !help_flag && !(rc & PARSE_FLAG_NO_PARMS) ) { Usage(TRUE); return(FAILURE); } else { Usage(FALSE); return(SUCCESS); } } /* * Enable or disable */ if ( fDisable ) { rc = DeleteKey(); } else if ( Server[0] ) { rc = AddKey(); } else if ( fQuery ) { if ( rc = QueryKey() ) { if (Server[0]) ErrorPrintf(IDS_NDSPSVR_ENABLED, Server); else ErrorPrintf(IDS_NDSPSVR_DISABLED); } } /* * Query or error ? */ if ( !rc ) { ErrorPrintf(IDS_ACCESS_DENIED); } return(SUCCESS); } /******************************************************************************* * * Usage * * Output the usage message for this utility. * * ENTRY: * bError (input) * TRUE if the 'invalid parameter(s)' message should preceed the usage * message and the output go to stderr; FALSE for no such error * string and output goes to stdout. * * EXIT: * * ******************************************************************************/ void Usage( BOOLEAN bError ) { if ( bError ) { ErrorPrintf(IDS_ERROR_INVALID_PARAMETERS); } ErrorPrintf(IDS_HELP_USAGE1); ErrorPrintf(IDS_HELP_USAGE2); ErrorPrintf(IDS_HELP_USAGE3); ErrorPrintf(IDS_HELP_USAGE4); ErrorPrintf(IDS_HELP_USAGE5); } /* Usage() */ /******************************************************************************* * * QueryKey * * ENTRY: * * EXIT: * * ******************************************************************************/ BOOL QueryKey() { DWORD dwType = REG_SZ; DWORD dwSize = MAX_SERVER_NAME_LENGTH * sizeof(WCHAR); WCHAR szValue[MAX_SERVER_NAME_LENGTH]; HKEY Handle; LONG rc; /* * Open registry */ if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, REG_CONTROL_TSERVER, 0, KEY_READ, &Handle ) != ERROR_SUCCESS ) return FALSE; /* * Read registry value */ rc = RegQueryValueExW( Handle, REG_CITRIX_NWNDSPREFERREDSERVER, NULL, &dwType, (PUCHAR)&szValue, &dwSize ); /* * Close registry and key handle */ RegCloseKey( Handle ); if ( rc == ERROR_SUCCESS ) { wcscpy (Server, szValue); return TRUE; } else if ( rc == ERROR_FILE_NOT_FOUND ) return TRUE; else return FALSE; } /******************************************************************************* * * DeleteKey * * ENTRY: * * EXIT: * * ******************************************************************************/ BOOL DeleteKey() { DWORD dwType = REG_SZ; DWORD dwSize = MAX_SERVER_NAME_LENGTH; WCHAR szValue[MAX_SERVER_NAME_LENGTH]; HKEY Handle; LONG rc; /* * Open registry */ if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, REG_CONTROL_TSERVER, 0, KEY_ALL_ACCESS, &Handle ) != ERROR_SUCCESS ) return FALSE; /* * Delete Preferred Server key */ rc = RegDeleteValueW( Handle, REG_CITRIX_NWNDSPREFERREDSERVER ); /* * Close registry and key handle */ RegCloseKey( Handle ); if ( rc != ERROR_SUCCESS ) return FALSE; else return TRUE; } /******************************************************************************* * * AddKey * * ENTRY: * * EXIT: * * ******************************************************************************/ BOOL AddKey() { HKEY Handle; LONG rc; DWORD dwDummy; DWORD dwSize; /* * Open registry */ if ( RegCreateKeyEx( HKEY_LOCAL_MACHINE, REG_CONTROL_TSERVER, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &Handle, &dwDummy ) != ERROR_SUCCESS ) return FALSE; /* * Write registry value */ dwSize = ( (wcslen(Server)+1) * sizeof(WCHAR) ); rc = RegSetValueExW( Handle, REG_CITRIX_NWNDSPREFERREDSERVER, 0, REG_SZ, (PUCHAR)Server, dwSize ); /* * Close registry and key handle */ RegCloseKey( Handle ); return( rc == ERROR_SUCCESS ); }