/****************************************************************************** Copyright (c) Microsoft Corporation Module Name: OpenFiles.cpp Abstract: Enables an administrator to disconnect/query open files ina given system. Author: Akhil Gokhale (akhil.gokhale@wipro.com) 1-Nov-2000 Revision History: Akhil Gokhale (akhil.gokhale@wipro.com) 1-Nov-2000 : Created It. ******************************************************************************/ #include "pch.h" #include "OpenFiles.h" #include "Disconnect.h" #include "Query.h" #include #include "resource.h" #define EXIT_ENV_SUCCESS 1 #define EXIT_ENV_FAILURE 0 #define SUBKEY _T("HARDWARE\\DESCRIPTION\\SYSTEM\\CENTRALPROCESSOR\\0") #define ERROR_RETREIVE_REGISTRY 4 #define TOKEN_BACKSLASH4 _T("\\\\") #define IDENTIFIER_VALUE _T("Identifier") #define SAFEFREE(pVal) \ if(pVal != NULL) \ { \ free(pVal); \ pVal = NULL ;\ } #define X86_MACHINE _T("x86") #define SYSTEM_64_BIT 2 #define SYSTEM_32_BIT 3 BOOL g_bIs32BitEnv = TRUE ; // Fuction protorypes. These functions will be used only in current file. DWORD GetCPUInfo(LPTSTR szComputerName); DWORD CheckSystemType(LPTSTR szServer); DWORD CheckSystemType64(LPTSTR szServer); BOOL ProcessQuery(DWORD argc,LPCTSTR argv[],LONG lMemorySize); BOOL ProcessDisconnect(DWORD argc,LPCTSTR argv[],LONG lMemorySize); BOOL ProcessLocal(DWORD argc,LPCTSTR argv[]); BOOL ProcessOptions( DWORD argc,LPCTSTR argv[],PBOOL pbDisconnect, PBOOL pbQuery,PBOOL pbUsage, PBOOL pbResetFlag, LONG lMemorySize); BOOL ProcessOptions( DWORD argc, LPCTSTR argv[],PBOOL pbQuery,LPTSTR pszServer, LPTSTR pszUserName,LPTSTR pszPassword,LPTSTR pszFormat, PBOOL pbShowNoHeader,PBOOL pbVerbose,PBOOL pbNeedPassword); BOOL ProcessOptions( DWORD argc, LPCTSTR argv[], PBOOL pbDisconnect, LPTSTR pszServer,LPTSTR pszUserName,LPTSTR pszPassword, LPTSTR pszID,LPTSTR pszAccessedby,LPTSTR pszOpenmode, LPTSTR pszOpenFile,PBOOL pbNeedPassword); BOOL ProcessOptions( DWORD argc, LPCTSTR argv[], LPTSTR pszLocalvalue); VOID Usage(); VOID DisconnectUsage(); VOID QueryUsage(); VOID LocalUsage(); /*----------------------------------------------------------------------------- Routine Description: Main routine that calls the disconnect and query options Arguments: [in] argc - Number of command line arguments [in] argv - Array containing command line arguments Returned Value: DWORD - 0 for success exit - 1 for failure exit -----------------------------------------------------------------------------*/ DWORD _cdecl _tmain( DWORD argc, LPCTSTR argv[] ) { BOOL bCleanExit = FALSE; try{ // local variables to this function BOOL bResult = TRUE; BOOL bNeedPassword = FALSE; // variables to hold the values specified at the command prompt BOOL bUsage = FALSE;// -? ( help ) BOOL bDisconnect = FALSE;// -disconnect //query command line options BOOL bQuery = FALSE;// -query BOOL bRestFlag = FALSE; LONG lMemorySize =0; // Memory needed for allocation. DWORD dwRetVal = 0; #ifndef _WIN64 dwRetVal = CheckSystemType( NULL_STRING); if(dwRetVal!=EXIT_SUCCESS ) { return EXIT_FAILURE; } #endif // Followin is a guess to allocate the memory for variables used // in many function. Guess is to allocate memory equals to Lenghth of // maximum command line argumant. for(UINT i = 1;i2)) { szChString = szChString.Mid( 2,szChString.GetLength()) ; } if(lstrcmpi(szChString.Left(1),SINGLE_SLASH)!=0) { lstrcpy(pszServer,(LPCWSTR)szChString); } lstrcpy(pszServerName,pszServer); // Try to connect to remote server. Function checks for local machine // so here no checking is done. if(IsLocalSystem(pszServerName)==TRUE) { if(lstrlen(pszUserName)>0) { DISPLAY_MESSAGE(stdout,GetResString(IDS_LOCAL_SYSTEM)); } } else { if(EstablishConnection( pszServerName, pszUserName, lMemorySize, pszPassword, lMemorySize, bNeedPassword )==FALSE) { // Connection to remote system failed , Show corresponding error // and exit from function. ShowMessage( stderr,GetResString(IDS_ID_SHOW_ERROR) ); if(lstrlen(GetReason())==0) { DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_CREDENTIALS)); } else { DISPLAY_MESSAGE( stderr,GetReason() ); } //Release allocated memory safely SAFEDELETE(pszServerHeadPosition); SAFEDELETE(pszUserName); SAFEDELETE(pszPassword); SAFEDELETE(pszFormat); SAFEDELETE(pszServerNameHeadPosition); return FALSE; } // determine whether this connection needs to disconnected later or not // though the connection is successfull, some conflict might have occured switch( GetLastError() ) { case I_NO_CLOSE_CONNECTION: bCloseConnection = FALSE; break; case E_LOCAL_CREDENTIALS: case ERROR_SESSION_CREDENTIAL_CONFLICT: { // // some error occured ... but can be ignored // connection need not be disconnected bCloseConnection= FALSE; // show the warning message DISPLAY_MESSAGE(stdout,GetResString(IDS_ID_SHOW_WARNING)); DISPLAY_MESSAGE(stdout,GetReason()); break; } default: bCloseConnection = TRUE; } } bResult = DoQuery(pszServer, bShowNoHeader, pszFormat, bVerbose); // Close the network connection which is previously opened by // EstablishConnection if(bCloseConnection==TRUE) { CloseConnection(pszServerName); } SAFEDELETE(pszServerHeadPosition); SAFEDELETE(pszUserName); SAFEDELETE(pszPassword); SAFEDELETE(pszFormat); SAFEDELETE(pszServerNameHeadPosition); return bResult; } /*----------------------------------------------------------------------------- Routine Description: This function will perform Disconnect related tasks. Arguments: [in] argc - Number of command line arguments [in] argv - Array containing command line arguments [in] lMemorySize - Maximum amount of memory to be allocated. [in] pbNeedPassword - To check whether the password is required or not. Returned Value: BOOL --True if it succeeds --False if it fails. -----------------------------------------------------------------------------*/ BOOL ProcessDisconnect(DWORD argc,LPCTSTR argv[],LONG lMemorySize) { BOOL bResult = FALSE; // Variable to store function return value DWORD dwRetVal = 0; BOOL bCloseConnection = FALSE; //Check whether connection to be // closed or not BOOL bNeedPassword = FALSE; // Ask for password or not. CHString szChString; // Temp. variable // options. BOOL bQuery = FALSE; // -query query BOOL bShowNoHeader = FALSE;// -nh (noheader) LPTSTR pszServer = new TCHAR[lMemorySize+1];// -s ( server name) LPTSTR pszUserName = new TCHAR[lMemorySize+1];// -u ( user name) LPTSTR pszPassword = new TCHAR[lMemorySize+1];// -p ( password) LPTSTR pszServerName = new TCHAR[lMemorySize+1];// server name used for // EstablishConnection // Function. LPTSTR pszServerNameHeadPosition = NULL; LPTSTR pszServerHeadPosition = NULL; LPTSTR pszID = new TCHAR[lMemorySize+1];// -I ( id ) LPTSTR pszAccessedby = new TCHAR[lMemorySize+1];//-a(accessedby) LPTSTR pszOpenmode = new TCHAR[lMemorySize+1];// -o ( openmode) LPTSTR pszOpenFile = new TCHAR[lMemorySize+1];// -op( openfile) // Check if memory allocated to all variables properly if((pszServer == NULL)|| (pszUserName == NULL)|| (pszPassword == NULL)|| (pszServerName == NULL)|| (pszID == NULL)|| (pszAccessedby == NULL)|| (pszOpenmode == NULL)|| (pszOpenFile == NULL) ) { // Some variable not having enough memory // Show Error---- SetLastError(ERROR_NOT_ENOUGH_MEMORY); DISPLAY_MESSAGE(stderr,GetResString(IDS_ID_SHOW_ERROR)); //Release allocated memory safely ShowLastError(stderr); SAFEDELETE(pszServer); SAFEDELETE(pszUserName); SAFEDELETE(pszPassword); SAFEDELETE(pszServerName); SAFEDELETE(pszID); SAFEDELETE(pszAccessedby); SAFEDELETE(pszOpenmode); SAFEDELETE(pszOpenFile); return FALSE; } pszServerNameHeadPosition = pszServerName;//store Head position Address // to successfully delete // allocated memory block pszServerHeadPosition = pszServer; // Initialize currently allocated arrays. memset(pszServer,0,(lMemorySize+1)*sizeof(TCHAR)); memset(pszUserName,0,(lMemorySize+1)*sizeof(TCHAR)); memset(pszPassword,0,(lMemorySize+1)*sizeof(TCHAR)); memset(pszServerName,0,(lMemorySize+1)*sizeof(TCHAR)); memset(pszID,0,(lMemorySize)*sizeof(TCHAR)); memset(pszAccessedby,0,(lMemorySize+1)*sizeof(TCHAR)); memset(pszOpenmode,0,(lMemorySize+1)*sizeof(TCHAR)); memset(pszOpenFile,0,(lMemorySize+1)*sizeof(TCHAR)); bResult = ProcessOptions( argc, argv, &bQuery, pszServer, pszUserName, pszPassword, pszID, pszAccessedby, pszOpenmode, pszOpenFile, &bNeedPassword); if ( bResult == FALSE ) { // invalid syntax ShowMessage( stderr,GetReason() ); //Release allocated memory safely SAFEDELETE(pszServerHeadPosition); SAFEDELETE(pszUserName); SAFEDELETE(pszPassword); SAFEDELETE(pszServerNameHeadPosition); SAFEDELETE(pszID); SAFEDELETE(pszAccessedby); SAFEDELETE(pszOpenmode); SAFEDELETE(pszOpenFile); // return from the function return FALSE; } szChString = pszServer; if((lstrcmpi(szChString.Left(2),DOUBLE_SLASH)==0)&&(szChString.GetLength()>2)) { szChString = szChString.Mid( 2,szChString.GetLength()) ; } if(lstrcmpi(szChString.Left(2),SINGLE_SLASH)!=0) { lstrcpy(pszServer,(LPCWSTR)szChString); } lstrcpy(pszServerName,pszServer); if(IsLocalSystem(pszServerName)==TRUE) { #ifndef _WIN64 dwRetVal = CheckSystemType( NULL_STRING); if(dwRetVal!=EXIT_SUCCESS ) { return EXIT_FAILURE; } #else dwRetVal = CheckSystemType64( NULL_STRING); if(dwRetVal!=EXIT_SUCCESS ) { return EXIT_FAILURE; } #endif //Comment 2 if(lstrlen(pszUserName)>0) { DISPLAY_MESSAGE(stdout,GetResString(IDS_LOCAL_SYSTEM)); } } else { if(EstablishConnection( pszServerName, pszUserName, lMemorySize, pszPassword, lMemorySize, bNeedPassword )==FALSE) { // Connection to remote system failed , Show corresponding error // and exit from function. ShowMessage( stderr, GetResString(IDS_ID_SHOW_ERROR) ); if(lstrlen(GetReason())==0) { DISPLAY_MESSAGE(stderr,GetResString(IDS_INVALID_CREDENTIALS)); } else { DISPLAY_MESSAGE( stderr,GetReason() ); } //Release allocated memory safely SAFEDELETE(pszServerHeadPosition); SAFEDELETE(pszUserName); SAFEDELETE(pszPassword); SAFEDELETE(pszServerNameHeadPosition); SAFEDELETE(pszID); SAFEDELETE(pszAccessedby); SAFEDELETE(pszOpenmode); SAFEDELETE(pszOpenFile); return FALSE; } // determine whether this connection needs to disconnected later or not // though the connection is successfull, some conflict might have occured switch( GetLastError() ) { case I_NO_CLOSE_CONNECTION: bCloseConnection = FALSE; break; case E_LOCAL_CREDENTIALS: case ERROR_SESSION_CREDENTIAL_CONFLICT: { // // some error occured ... but can be ignored // connection need not be disconnected bCloseConnection= FALSE; // show the warning message DISPLAY_MESSAGE(stdout,GetResString(IDS_ID_SHOW_WARNING)); DISPLAY_MESSAGE(stdout,GetReason()); break; } default: bCloseConnection = TRUE; } } // Do Disconnect open files..... bResult = DisconnectOpenFile(pszServer, pszID, pszAccessedby, pszOpenmode, pszOpenFile ); // Close the network connection which is previously opened by // EstablishConnection if(bCloseConnection==TRUE) { CloseConnection(pszServerName); } // Free memory which is previously allocated. SAFEDELETE(pszServerHeadPosition); SAFEDELETE(pszUserName); SAFEDELETE(pszPassword); SAFEDELETE(pszServerNameHeadPosition); SAFEDELETE(pszID); SAFEDELETE(pszAccessedby); SAFEDELETE(pszOpenmode); SAFEDELETE(pszOpenFile); return bResult; } /*----------------------------------------------------------------------------- Routine Description: This function takes command line argument and checks for correct syntax and if the syntax is ok, it returns the values in different variables. variables [out] will contain respective values. Arguments: [in] argc - Number of command line arguments [in] argv - Array containing command line arguments [out] pszLocalValue - contains the values for -local option Returned Value: BOOL --True if it succeeds --False if it fails. -----------------------------------------------------------------------------*/ BOOL ProcessOptions( DWORD argc, LPCTSTR argv[], LPTSTR pszLocalValue) { TCMDPARSER cmdOptions[ MAX_LOCAL_OPTIONS ];//Variable to store command line CHString szTempString; TCHAR szTemp[MAX_RES_STRING*2]; szTempString = GetResString(IDS_UTILITY_NAME); wsprintf(szTemp,GetResString(IDS_INVALID_SYNTAX),(LPCWSTR)szTempString); // -local cmdOptions[ OI_O_LOCAL ].dwCount = 1; cmdOptions[ OI_O_LOCAL ].dwActuals = 0; cmdOptions[ OI_O_LOCAL ].dwFlags = CP_MAIN_OPTION|CP_VALUE_OPTIONAL|CP_MODE_VALUES| CP_TYPE_TEXT; cmdOptions[ OI_O_LOCAL ].pValue = pszLocalValue; cmdOptions[ OI_O_LOCAL ].pFunction = NULL; cmdOptions[ OI_O_LOCAL ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_O_LOCAL ].szValues, GetResString(IDS_LOCAL_OPTION) ); lstrcpy( cmdOptions[ OI_O_LOCAL ].szOption, OPTION_LOCAL ); // // do the command line parsing if ( DoParseParam( argc,argv,MAX_LOCAL_OPTIONS,cmdOptions ) == FALSE ) { ShowMessage(stderr,GetResString(IDS_ID_SHOW_ERROR)); return FALSE; // invalid syntax } if(lstrlen(pszLocalValue) == 0) { lstrcpy(pszLocalValue,L"SHOW_STATUS"); // this string does not require localization // as it is storing value other than ON/OFF } return TRUE; } /*----------------------------------------------------------------------------- Routine Description: This function takes command line argument and checks for correct syntax and if the syntax is ok, it returns the values in different variables. variables [out] will contain respective values. Arguments: [in] argc - Number of command line arguments [in] argv - Array containing command line arguments [out] pbDisconnect - Discoonect option string [out] pbQuery - Query option string [out] pbUsage - The usage option [out] pbNeedPassword - To check whether the password is required or not. [in] lMemorySize - Maximum amount of memory to be allocated. Returned Value: BOOL --True if it succeeds --False if it fails. -----------------------------------------------------------------------------*/ BOOL ProcessOptions( DWORD argc, LPCTSTR argv[], PBOOL pbDisconnect, PBOOL pbQuery, PBOOL pbUsage, PBOOL pbResetFlag, LONG lMemorySize) { DWORD dwRetVal = 0; // local variables TCMDPARSER cmdOptions[ MAX_OPTIONS ];//Variable to store command line // options. LPTSTR pszTempServer = new TCHAR[lMemorySize+1]; LPTSTR pszTempUser = new TCHAR[lMemorySize+1]; LPTSTR pszTempPassword = new TCHAR[lMemorySize+1]; TARRAY arrTemp = NULL; CHString szTempString; TCHAR szTemp[MAX_RES_STRING*2]; szTempString = GetResString(IDS_UTILITY_NAME); wsprintf(szTemp,GetResString(IDS_INVALID_SYNTAX),(LPCWSTR)szTempString); // Allocates memory arrTemp = CreateDynamicArray(); BOOL bTemp = FALSE; // Temp. Variable // if((pszTempUser == NULL)|| (pszTempPassword== NULL)|| (pszTempServer == NULL)|| (arrTemp == NULL)) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); DISPLAY_MESSAGE(stderr,GetResString(IDS_ID_SHOW_ERROR)); ShowLastError(stderr); SAFEDELETE(pszTempUser); SAFEDELETE(pszTempPassword); SAFEDELETE(pszTempServer); DestroyDynamicArray(&arrTemp); return FALSE; } // prepare the command options // -disconnect option for help cmdOptions[ OI_DISCONNECT ].dwCount = 1; cmdOptions[ OI_DISCONNECT ].dwActuals = 0; cmdOptions[ OI_DISCONNECT ].dwFlags = 0; cmdOptions[ OI_DISCONNECT ].pValue = pbDisconnect; cmdOptions[ OI_DISCONNECT ].pFunction = NULL; cmdOptions[ OI_DISCONNECT ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_DISCONNECT ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_DISCONNECT ].szOption, OPTION_DISCONNECT ); // -query option for help cmdOptions[ OI_QUERY ].dwCount = 1; cmdOptions[ OI_QUERY ].dwActuals = 0; cmdOptions[ OI_QUERY ].dwFlags = 0; cmdOptions[ OI_QUERY ].pValue = pbQuery; cmdOptions[ OI_QUERY ].pFunction = NULL; cmdOptions[ OI_QUERY ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_QUERY ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_QUERY ].szOption, OPTION_QUERY ); // -? option for help cmdOptions[ OI_USAGE ].dwCount = 1; cmdOptions[ OI_USAGE ].dwActuals = 0; cmdOptions[ OI_USAGE ].dwFlags = CP_USAGE; cmdOptions[ OI_USAGE ].pValue = pbUsage; cmdOptions[ OI_USAGE ].pFunction = NULL; cmdOptions[ OI_USAGE ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_USAGE ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_USAGE ].szOption, OPTION_USAGE ); // -local cmdOptions[ OI_LOCAL ].dwCount = 1; cmdOptions[ OI_LOCAL ].dwActuals = 0; cmdOptions[ OI_LOCAL ].dwFlags = 0; cmdOptions[ OI_LOCAL ].pValue = pbResetFlag; cmdOptions[ OI_LOCAL ].pFunction = NULL; cmdOptions[ OI_LOCAL ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_LOCAL ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_LOCAL ].szOption, OPTION_LOCAL ); // default .. // Although there is no default option for this utility... // At this moment all the switches other than specified above will be // treated as default parameter for Main DoParceParam. // Exact parcing depending on optins (-query or -disconnect) will be done // at that respective places. lstrcpy(cmdOptions[ OI_DEFAULT ].szOption,NULL_STRING); cmdOptions[ OI_DEFAULT ].dwFlags = CP_TYPE_TEXT | CP_MODE_ARRAY|CP_DEFAULT; cmdOptions[ OI_DEFAULT ].dwCount = 0; cmdOptions[ OI_DEFAULT ].dwActuals = 0; cmdOptions[ OI_DEFAULT ].pValue = &arrTemp; lstrcpy(cmdOptions[ OI_DEFAULT ].szValues,NULL_STRING); cmdOptions[ OI_DEFAULT ].pFunction = NULL; cmdOptions[ OI_DEFAULT ].pFunctionData = NULL; // // do the command line parsing if ( DoParseParam( argc,argv,MAX_OPTIONS,cmdOptions ) == FALSE ) { ShowMessage(stderr,GetResString(IDS_ID_SHOW_ERROR)); SAFEDELETE(pszTempUser); SAFEDELETE(pszTempPassword); SAFEDELETE(pszTempServer); DestroyDynamicArray(&arrTemp); return FALSE; // invalid syntax } DestroyDynamicArray(&arrTemp);//Release memory as variable no longer needed arrTemp = NULL; // Check if all of following is true is an error if((*pbUsage==TRUE)&&argc>3) { ShowMessage( stderr, GetResString(IDS_ID_SHOW_ERROR) ); SetReason(szTemp); return FALSE; } // -query ,-disconnect and -local options cannot come together if(((*pbQuery)+(*pbDisconnect)+(*pbResetFlag))>1) { ShowMessage( stderr, GetResString(IDS_ID_SHOW_ERROR) ); SetReason(szTemp); SAFEDELETE(pszTempUser); SAFEDELETE(pszTempPassword); SAFEDELETE(pszTempServer); return FALSE; } else if((argc == 2)&&(*pbUsage == TRUE)) { // if -? alone given its a valid conmmand line SAFEDELETE(pszTempUser); SAFEDELETE(pszTempPassword); SAFEDELETE(pszTempServer); return TRUE; } if((argc>2)&& (*pbQuery==FALSE)&&(*pbDisconnect==FALSE)&&(*pbResetFlag==FALSE)) { // If command line argument is equals or greater than 2 atleast one // of -query OR -local OR -disconnect should be present in it. // (for "-?" previous condition already takes care) // This to prevent from following type of command line argument: // OpnFiles.exe -nh ... Which is a invalid syntax. ShowMessage( stderr, GetResString(IDS_ID_SHOW_ERROR) ); SetReason(szTemp); SAFEDELETE(pszTempUser); SAFEDELETE(pszTempPassword); SAFEDELETE(pszTempServer); return FALSE; } SAFEDELETE(pszTempUser); SAFEDELETE(pszTempPassword); SAFEDELETE(pszTempServer); return TRUE; }//ProcesOptions /*----------------------------------------------------------------------------- Routine Description: This function takes command line argument and checks for correct syntax and if the syntax is ok, it returns the values in different variables. variables [out] will contain respective values. This Functin specifically checks command line parameters requered for QUERY option. Arguments: [in] argc - Number of command line arguments [in] argv - Array containing command line arguments [out] pbQuery - query option string [out] pszServer - remote server name [out] pszUserName - username for the remote system [out] pszPassword - password for the remote system for the username [out] pszFormat - format checking [out] pbShowNoHeader - show header [out] pbVerbose - show verbose Returned Value: BOOL --True if it succeeds --False if it fails. -----------------------------------------------------------------------------*/ BOOL ProcessOptions( DWORD argc, LPCTSTR argv[], PBOOL pbQuery, LPTSTR pszServer, LPTSTR pszUserName, LPTSTR pszPassword, LPTSTR pszFormat, PBOOL pbShowNoHeader, PBOOL pbVerbose, PBOOL pbNeedPassword) { // Check in/out parameters... if((pszServer == NULL)||(pszUserName==NULL)||(pszPassword==NULL)|| (pszFormat == NULL)) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); DISPLAY_MESSAGE(stderr,GetResString(IDS_ID_SHOW_ERROR)); return FALSE; // Memory ERROR } TCMDPARSER cmdOptions[ MAX_QUERY_OPTIONS ];//Variable to store command line CHString szTempString; TCHAR szTemp[MAX_RES_STRING*2]; TCHAR szTypeHelpMsg[MAX_RES_STRING]; DWORD dwRetVal = 0; szTempString = GetResString(IDS_UTILITY_NAME); wsprintf(szTemp,GetResString(IDS_INVALID_SYNTAX),(LPCWSTR)szTempString); wsprintf(szTypeHelpMsg,GetResString(IDS_TYPE_Q_HELP),(LPCWSTR)szTempString); // // prepare the command options // -query option for help cmdOptions[ OI_Q_QUERY ].dwCount = 1; cmdOptions[ OI_Q_QUERY ].dwActuals = 0; cmdOptions[ OI_Q_QUERY ].dwFlags = CP_MAIN_OPTION ; cmdOptions[ OI_Q_QUERY ].pValue = pbQuery; cmdOptions[ OI_Q_QUERY ].pFunction = NULL; cmdOptions[ OI_Q_QUERY ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_Q_QUERY ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_Q_QUERY ].szOption, OPTION_QUERY ); // -s option remote system name cmdOptions[ OI_Q_SERVER_NAME ].dwCount = 1; cmdOptions[ OI_Q_SERVER_NAME ].dwActuals = 0; cmdOptions[ OI_Q_SERVER_NAME ].dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY; cmdOptions[ OI_Q_SERVER_NAME ].pValue = pszServer; cmdOptions[ OI_Q_SERVER_NAME ].pFunction = NULL; cmdOptions[ OI_Q_SERVER_NAME ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_Q_SERVER_NAME ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_Q_SERVER_NAME ].szOption, OPTION_SERVER ); // -u option user name for the specified system cmdOptions[ OI_Q_USER_NAME ].dwCount = 1; cmdOptions[ OI_Q_USER_NAME ].dwActuals = 0; cmdOptions[ OI_Q_USER_NAME ].dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY; cmdOptions[ OI_Q_USER_NAME ].pValue = pszUserName; cmdOptions[ OI_Q_USER_NAME ].pFunction = NULL; cmdOptions[ OI_Q_USER_NAME ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_Q_USER_NAME ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_Q_USER_NAME ].szOption, OPTION_USERNAME ); // -p option password for the given username cmdOptions[ OI_Q_PASSWORD ].dwCount = 1; cmdOptions[ OI_Q_PASSWORD ].dwActuals = 0; cmdOptions[ OI_Q_PASSWORD ].dwFlags = CP_TYPE_TEXT | CP_VALUE_OPTIONAL; cmdOptions[ OI_Q_PASSWORD ].pValue = pszPassword; cmdOptions[ OI_Q_PASSWORD ].pFunction = NULL; cmdOptions[ 3 ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_Q_PASSWORD ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_Q_PASSWORD ].szOption, OPTION_PASSWORD ); // -fo (format) lstrcpy(cmdOptions[ OI_Q_FORMAT ].szOption,OPTION_FORMAT); cmdOptions[ OI_Q_FORMAT ].dwFlags = CP_TYPE_TEXT|CP_VALUE_MANDATORY |CP_MODE_VALUES; cmdOptions[ OI_Q_FORMAT ].dwCount = 1; cmdOptions[ OI_Q_FORMAT ].dwActuals = 0; cmdOptions[ OI_Q_FORMAT ].pValue = pszFormat; lstrcpy(cmdOptions[ OI_Q_FORMAT ].szValues,FORMAT_OPTIONS); cmdOptions[ OI_Q_FORMAT ].pFunction = NULL; cmdOptions[ OI_Q_FORMAT ].pFunctionData = NULL; //-nh (noheader) lstrcpy(cmdOptions[ OI_Q_NO_HEADER ].szOption,OPTION_NOHEADER); cmdOptions[ OI_Q_NO_HEADER ].dwFlags = 0; cmdOptions[ OI_Q_NO_HEADER ].dwCount = 1; cmdOptions[ OI_Q_NO_HEADER ].dwActuals = 0; cmdOptions[ OI_Q_NO_HEADER ].pValue = pbShowNoHeader; lstrcpy(cmdOptions[ OI_Q_NO_HEADER ].szValues,NULL_STRING); cmdOptions[ OI_Q_NO_HEADER ].pFunction = NULL; cmdOptions[ OI_Q_NO_HEADER ].pFunctionData = NULL; //-v verbose lstrcpy(cmdOptions[ OI_Q_VERBOSE ].szOption,OPTION_VERBOSE); cmdOptions[ OI_Q_VERBOSE ].dwFlags = 0; cmdOptions[ OI_Q_VERBOSE ].dwCount = 1; cmdOptions[ OI_Q_VERBOSE ].dwActuals = 0; cmdOptions[ OI_Q_VERBOSE ].pValue = pbVerbose; lstrcpy(cmdOptions[ OI_Q_VERBOSE].szValues,NULL_STRING); cmdOptions[ OI_Q_VERBOSE ].pFunction = NULL; cmdOptions[ OI_Q_VERBOSE ].pFunctionData = NULL; // init the password with '*' if ( pszPassword != NULL ) lstrcpy( pszPassword, _T( "*" ) ); // // do the command line parsing if ( DoParseParam( argc,argv,MAX_QUERY_OPTIONS,cmdOptions ) == FALSE ) { ShowMessage(stderr,GetResString(IDS_ID_SHOW_ERROR)); return FALSE; // invalid syntax } // -n is allowed only with -fo TABLE (which is also default) // and CSV if((*pbShowNoHeader == TRUE) && ((lstrcmpi(pszFormat,GetResString(IDS_LIST))==0))) { lstrcpy(szTemp,GetResString(IDS_HEADER_NOT_ALLOWED)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } // "-p" should not be specified without "-u" if ( cmdOptions[ OI_Q_USER_NAME ].dwActuals == 0 && cmdOptions[ OI_Q_PASSWORD ].dwActuals != 0 ) { // invalid syntax lstrcpy(szTemp,ERROR_PASSWORD_BUT_NOUSERNAME ); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; // indicate failure } if(*pbQuery==FALSE) { ShowMessage( stderr, GetResString(IDS_ID_SHOW_ERROR) ); SetReason(szTemp); return FALSE; } // "-u" should not be specified without "-s" if ( cmdOptions[ OI_Q_SERVER_NAME ].dwActuals == 0 && cmdOptions[ OI_Q_USER_NAME ].dwActuals != 0 ) { // invalid syntax lstrcpy(szTemp,ERROR_USERNAME_BUT_NOMACHINE); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; // indicate failure } szTempString = pszServer; szTempString.TrimRight(); lstrcpy(pszServer,(LPCWSTR)szTempString); // server name with 0 length is invalid. if((cmdOptions[ OI_Q_SERVER_NAME ].dwActuals != 0) && (lstrlen(pszServer)==0)) { lstrcpy(szTemp,GetResString(IDS_SERVER_EMPTY)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } // server name with 0 length is invalid. szTempString = pszUserName; szTempString.TrimRight(); lstrcpy(pszUserName,(LPCWSTR)szTempString); if((cmdOptions[ OI_Q_USER_NAME ].dwActuals != 0) && (lstrlen(pszUserName)==0)) { lstrcpy(szTemp,GetResString(IDS_USERNAME_EMPTY)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } // user given -p option and not given password // so it is needed to prompt for password. if ( cmdOptions[ OI_Q_PASSWORD ].dwActuals != 0 && pszPassword != NULL && lstrcmp( pszPassword, _T( "*" ) ) == 0 ) { // user wants the utility to prompt for the password before trying to connect *pbNeedPassword = TRUE; } else if ( cmdOptions[ OI_Q_PASSWORD ].dwActuals == 0 && ( cmdOptions[ OI_Q_SERVER_NAME ].dwActuals != 0 || cmdOptions[ OI_Q_USER_NAME ].dwActuals != 0 ) ) { // -s, -u is specified without password ... // utility needs to try to connect first and if it fails then prompt for the password *pbNeedPassword = TRUE; if ( pszPassword != NULL ) { lstrcpy( pszPassword, _T( "" ) ); } } return TRUE; } /*----------------------------------------------------------------------------- Routine Description: This function takes command line argument and checks for correct syntax and if the syntax is ok, it returns the values in different variables. variables [out] will contain respective values. This Functin specifically checks command line parameters requered for DISCONNECT option. Arguments: [in] argc - Number of command line arguments [in] argv - Array containing command line arguments [out] pbDisconnect - discoonect option string [out] pszServer - remote server name [out] pszUserName - username for the remote system [out] pszPassword - password for the remote system for the username [out] pszID - Open file ids [out] pszAccessedby - Name of user name who access the file [out] pszOpenmode - accessed mode (read/Write) [out] pszOpenFile - Open file name Returned Value: BOOL --True if it succeeds --False if it fails. -----------------------------------------------------------------------------*/ BOOL ProcessOptions( DWORD argc, LPCTSTR argv[], PBOOL pbDisconnect, LPTSTR pszServer, LPTSTR pszUserName, LPTSTR pszPassword, LPTSTR pszID, LPTSTR pszAccessedby, LPTSTR pszOpenmode, LPTSTR pszOpenFile, PBOOL pbNeedPassword) { // Check in/out parameters... if((pszServer == NULL)||(pszUserName==NULL)||(pszPassword==NULL)|| (pszID == NULL)||(pszAccessedby==NULL)|| (pszAccessedby == NULL)|| (pszOpenmode == NULL)||(pszOpenFile==NULL)) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); DISPLAY_MESSAGE(stderr,GetResString(IDS_ID_SHOW_ERROR)); return FALSE; // Memory ERROR } TCMDPARSER cmdOptions[ MAX_DISCONNECT_OPTIONS ];//Variable to store command line CHString szTempString; TCHAR szTemp[MAX_RES_STRING*2]; TCHAR szTypeHelpMsg[MAX_RES_STRING]; DWORD dwRetVal = 0; szTempString = GetResString(IDS_UTILITY_NAME); wsprintf(szTemp,GetResString(IDS_INVALID_SYNTAX),(LPCWSTR)szTempString); wsprintf(szTypeHelpMsg,GetResString(IDS_TYPE_D_HELP),(LPCWSTR)szTempString); // // prepare the command options // -disconnect option for help cmdOptions[ OI_D_DISCONNECT ].dwCount = 1; cmdOptions[ OI_D_DISCONNECT ].dwActuals = 0; cmdOptions[ OI_D_DISCONNECT ].dwFlags = CP_MAIN_OPTION ; cmdOptions[ OI_D_DISCONNECT ].pValue = pbDisconnect; cmdOptions[ OI_D_DISCONNECT ].pFunction = NULL; cmdOptions[ OI_D_DISCONNECT ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_D_DISCONNECT ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_D_DISCONNECT ].szOption, OPTION_DISCONNECT ); // -s option remote system name cmdOptions[ OI_D_SERVER_NAME ].dwCount = 1; cmdOptions[ OI_D_SERVER_NAME ].dwActuals = 0; cmdOptions[ OI_D_SERVER_NAME ].dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY; cmdOptions[ OI_D_SERVER_NAME ].pValue = pszServer; cmdOptions[ OI_D_SERVER_NAME ].pFunction = NULL; cmdOptions[ OI_D_SERVER_NAME ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_D_SERVER_NAME ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_D_SERVER_NAME ].szOption, OPTION_SERVER ); // -u option user name for the specified system cmdOptions[ OI_D_USER_NAME ].dwCount = 1; cmdOptions[ OI_D_USER_NAME ].dwActuals = 0; cmdOptions[ OI_D_USER_NAME ].dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY; cmdOptions[ OI_D_USER_NAME ].pValue = pszUserName; cmdOptions[ OI_D_USER_NAME ].pFunction = NULL; cmdOptions[ OI_D_USER_NAME ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_D_USER_NAME ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_D_USER_NAME ].szOption, OPTION_USERNAME ); // -p option password for the given username cmdOptions[ OI_D_PASSWORD ].dwCount = 1; cmdOptions[ OI_D_PASSWORD ].dwActuals = 0; cmdOptions[ OI_D_PASSWORD ].dwFlags = CP_TYPE_TEXT | CP_VALUE_OPTIONAL; cmdOptions[ OI_D_PASSWORD ].pValue = pszPassword; cmdOptions[ OI_D_PASSWORD ].pFunction = NULL; cmdOptions[ OI_D_PASSWORD ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_D_PASSWORD ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_D_PASSWORD ].szOption, OPTION_PASSWORD ); // -id Values cmdOptions[ OI_D_ID ].dwCount = 1; cmdOptions[ OI_D_ID ].dwActuals = 0; cmdOptions[ OI_D_ID ].dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY; cmdOptions[ OI_D_ID ].pValue = pszID; cmdOptions[ OI_D_ID ].pFunction = NULL; cmdOptions[ OI_D_ID ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_D_ID ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_D_ID ].szOption, OPTION_ID ); // -a (accessed by) cmdOptions[ OI_D_ACCESSED_BY ].dwCount = 1; cmdOptions[ OI_D_ACCESSED_BY ].dwActuals = 0; cmdOptions[ OI_D_ACCESSED_BY ].dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY;; cmdOptions[ OI_D_ACCESSED_BY ].pValue = pszAccessedby; cmdOptions[ OI_D_ACCESSED_BY].pFunction = NULL; cmdOptions[ OI_D_ACCESSED_BY ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_D_ACCESSED_BY ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_D_ACCESSED_BY ].szOption, OPTION_ACCESSEDBY ); // -o (openmode) cmdOptions[ OI_D_OPEN_MODE ].dwCount = 1; cmdOptions[ OI_D_OPEN_MODE].dwActuals = 0; cmdOptions[ OI_D_OPEN_MODE ].dwFlags = CP_VALUE_MANDATORY | CP_MODE_VALUES| CP_TYPE_TEXT; cmdOptions[ OI_D_OPEN_MODE ].pValue = pszOpenmode; cmdOptions[ OI_D_OPEN_MODE ].pFunction = NULL; cmdOptions[ OI_D_OPEN_MODE ].pFunctionData = NULL; lstrcpy(cmdOptions[ OI_D_OPEN_MODE ].szValues,GetResString(IDS_OPENMODE_OPTION)); lstrcpy(cmdOptions[ OI_D_OPEN_MODE ].szOption, OPTION_OPENMODE ); // -op (openfile) cmdOptions[ OI_D_OPEN_FILE ].dwCount = 1; cmdOptions[ OI_D_OPEN_FILE ].dwActuals = 0; cmdOptions[ OI_D_OPEN_FILE ].dwFlags = CP_TYPE_TEXT | CP_VALUE_MANDATORY;; cmdOptions[ OI_D_OPEN_FILE ].pValue = pszOpenFile; cmdOptions[ OI_D_OPEN_FILE ].pFunction = NULL; cmdOptions[ OI_D_OPEN_FILE ].pFunctionData = NULL; lstrcpy( cmdOptions[ OI_D_OPEN_FILE ].szValues, NULL_STRING ); lstrcpy( cmdOptions[ OI_D_OPEN_FILE ].szOption, OPTION_OPENFILE ); // init the passsword variable with '*' if ( pszPassword != NULL ) lstrcpy( pszPassword, _T( "*" ) ); // // do the command line parsing if ( DoParseParam( argc,argv,MAX_DISCONNECT_OPTIONS ,cmdOptions ) == FALSE ) { ShowMessage(stderr,GetResString(IDS_ID_SHOW_ERROR)); return FALSE; // invalid syntax } if(*pbDisconnect==FALSE) { ShowMessage( stderr, GetResString(IDS_ID_SHOW_ERROR) ); SetReason(szTemp); return FALSE; } // At least one of -id OR -a OR -o is required. if((cmdOptions[ OI_D_ID ].dwActuals==0)&& (cmdOptions[ OI_D_ACCESSED_BY ].dwActuals==0)&& (cmdOptions[ OI_D_OPEN_MODE ].dwActuals==0) ) { lstrcpy(szTemp,GetResString(IDS_NO_ID_ACC_OF)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } // "-u" should not be specified without "-s" if ( cmdOptions[ OI_D_SERVER_NAME ].dwActuals == 0 && cmdOptions[ OI_D_USER_NAME ].dwActuals != 0 ) { // invalid syntax lstrcpy(szTemp,ERROR_USERNAME_BUT_NOMACHINE); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; // indicate failure } // "-p" should not be specified without "-u" if ( cmdOptions[ OI_D_USER_NAME ].dwActuals == 0 && cmdOptions[ OI_D_PASSWORD ].dwActuals != 0 ) { // invalid syntax lstrcpy(szTemp,ERROR_PASSWORD_BUT_NOUSERNAME ); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; // indicate failure } szTempString = pszServer; szTempString.TrimRight(); lstrcpy(pszServer,(LPCWSTR)szTempString); // server name with 0 length is invalid. if((cmdOptions[ OI_D_SERVER_NAME ].dwActuals != 0) && (lstrlen(pszServer)==0)) { lstrcpy(szTemp,GetResString(IDS_SERVER_EMPTY)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } // server name with 0 length is invalid. szTempString = pszUserName; szTempString.TrimRight(); lstrcpy(pszUserName,(LPCWSTR)szTempString); if((cmdOptions[ OI_D_USER_NAME ].dwActuals != 0) && (lstrlen(pszUserName)==0)) { lstrcpy(szTemp,GetResString(IDS_USERNAME_EMPTY)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } // user given -p option and not given password // so it is needed to prompt for password. if ( cmdOptions[ OI_D_PASSWORD ].dwActuals != 0 && pszPassword != NULL && lstrcmp( pszPassword, _T( "*" ) ) == 0 ) { // user wants the utility to prompt for the password before trying to connect *pbNeedPassword = TRUE; } else if ( cmdOptions[ OI_D_PASSWORD ].dwActuals == 0 && ( cmdOptions[ OI_D_SERVER_NAME ].dwActuals != 0 || cmdOptions[ OI_D_USER_NAME ].dwActuals != 0 ) ) { // -s, -u is specified without password ... // utility needs to try to connect first and if it fails then prompt for the password *pbNeedPassword = TRUE; if ( pszPassword != NULL ) { lstrcpy( pszPassword, _T( "" ) ); } } // Check if Accessed by is not given as and empty string // or a string having only spaces.... szTempString = pszAccessedby; szTempString.TrimRight(); lstrcpy(pszAccessedby,(LPCWSTR)szTempString); if((cmdOptions[ OI_D_ACCESSED_BY ].dwActuals != 0) && (lstrlen(pszAccessedby) == 0)) { lstrcpy(szTemp,GetResString(IDS_ACCESSBY_EMPTY)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } // Check if Open File is not given as and empty string // or a string having only spaces.... szTempString = pszOpenFile; szTempString.TrimRight(); lstrcpy(pszOpenFile,(LPCWSTR)szTempString); if((cmdOptions[ OI_D_OPEN_FILE ].dwActuals != 0) && (lstrlen(pszOpenFile) == 0)) { lstrcpy(szTemp,GetResString(IDS_OPEN_FILE_EMPTY)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } // Check if -id option is given and if it is numeric , // also if it is numeric then check its range if((IsNumeric((LPCTSTR)pszID,10,TRUE)==TRUE)&& (cmdOptions[ OI_D_ID ].dwActuals==1)) { if((AsLong((LPCTSTR)pszID,10)>UINT_MAX) || (AsLong((LPCTSTR)pszID,10)<1)) { // Message shown on screen will be... // ERROR: Invlid ID. lstrcpy(szTemp,GetResString(IDS_ERROR_ID)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } } // check user given "*" or any junk string.... if(!((lstrcmp((LPCTSTR)pszID,ASTERIX)==0)|| (IsNumeric((LPCTSTR)pszID,10,TRUE)==TRUE)) &&(lstrlen((LPCTSTR)pszID)!=0)) { // Message shown on screen will be... // ERROR: Invlid ID. lstrcpy(szTemp,GetResString(IDS_ERROR_ID)); lstrcat(szTemp,szTypeHelpMsg); SetReason(szTemp); return FALSE; } return TRUE; } /*----------------------------------------------------------------------------- Routine Description: Displays how to use -disconnect option Arguments: None Returned Value: None -----------------------------------------------------------------------------*/ VOID DisconnectUsage() { // local variables DWORD dw = 0; // start displaying the usage for( dw = IDS_HELP_LINE1; dw <= IDS_HELP_LINE_END; dw++ ) ShowMessage( stdout, GetResString( dw ) ); }//DisconnectUsage /*----------------------------------------------------------------------------- Routine Description: Displays how to use -query option Arguments: None Returned Value: None -----------------------------------------------------------------------------*/ VOID QueryUsage() { // local variables DWORD dw = 0; // start displaying the usage for( dw = IDS_HELP_QUERY1; dw <= IDS_HELP_QUERY_END; dw++ ) ShowMessage( stdout, GetResString( dw ) ); }//query Usage /*----------------------------------------------------------------------------- Routine Description: Displays how to use this Utility Arguments: None Returned Value: None -----------------------------------------------------------------------------*/ VOID Usage() { // local variables DWORD dw = 0; // start displaying the usage for( dw = IDS_HELP_MAIN1; dw <= IDS_HELP_MAIN_END; dw++ ) ShowMessage( stdout, GetResString( dw ) ); }//Usage /*----------------------------------------------------------------------------- Routine Description: Displays how to use -local option Arguments: None Returned Value: None -----------------------------------------------------------------------------*/ VOID LocalUsage() { // local variables DWORD dw = 0; // start displaying the usage for( dw = IDS_HELP_LOCAL1; dw <= IDS_HELP_LOCAL_END; dw++ ) ShowMessage( stdout, GetResString( dw ) ); }//-local /*----------------------------------------------------------------------------- Routine Description: Arguments: Returned Value: None -----------------------------------------------------------------------------*/ DWORD CheckSystemType(LPTSTR szServer) { DWORD dwSystemType = 0 ; #ifndef _WIN64 //display the error message if the target system is a 64 bit system or if error occured in //retreiving the information dwSystemType = GetCPUInfo(szServer); if(dwSystemType == ERROR_RETREIVE_REGISTRY) { DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_SYSTEM_INFO)); return (EXIT_FAILURE); } if(dwSystemType == SYSTEM_64_BIT) { if(lstrlen(szServer)== 0 ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_VERSION_MISMATCH)); } else { DISPLAY_MESSAGE(stderr,GetResString(IDS_REMOTE_NOT_SUPPORTED)); } return (EXIT_FAILURE); } #endif return EXIT_SUCCESS ; } // *************************************************************************** // Name : GetCPUInfo // Routine Description : determines if the computer is 32 bit system or 64 bit // Arguments : // [ in ] szComputerName : System name // Return Type : BOOL // TRUE : if the system is a 32 bit system // FALSE : if the system is a 64 bit system // *************************************************************************** DWORD GetCPUInfo(LPTSTR szComputerName) { HKEY hKey1 = 0; HKEY hRemoteKey = 0; TCHAR szCurrentPath[MAX_STRING_LENGTH + 1] = NULL_STRING; TCHAR szPath[MAX_STRING_LENGTH + 1] = SUBKEY ; DWORD dwValueSize = MAX_STRING_LENGTH + 1; DWORD dwRetCode = ERROR_SUCCESS; DWORD dwError = 0; TCHAR szTmpCompName[MAX_STRING_LENGTH+1] = NULL_STRING; TCHAR szTemp[MAX_RES_STRING+1] = NULL_STRING ; DWORD len = lstrlen(szTemp); TCHAR szVal[MAX_RES_STRING+1] = NULL_STRING ; DWORD dwLength = MAX_STRING_LENGTH ; LPTSTR szReturnValue = NULL ; DWORD dwCode = 0 ; szReturnValue = ( LPTSTR ) malloc( dwLength*sizeof( TCHAR ) ); if(szReturnValue == NULL) { return ERROR_RETREIVE_REGISTRY ; } if(lstrlen(szComputerName)!= 0 ) { lstrcpy(szTmpCompName,TOKEN_BACKSLASH4); lstrcat(szTmpCompName,szComputerName); } else { lstrcpy(szTmpCompName,szComputerName); } // Get Remote computer local machine key dwError = RegConnectRegistry(szTmpCompName,HKEY_LOCAL_MACHINE,&hRemoteKey); if (dwError == ERROR_SUCCESS) { dwError = RegOpenKeyEx(hRemoteKey,szPath,0,KEY_READ,&hKey1); if (dwError == ERROR_SUCCESS) { dwRetCode = RegQueryValueEx(hKey1, IDENTIFIER_VALUE, NULL, NULL,(LPBYTE) szReturnValue, &dwValueSize); if (dwRetCode == ERROR_MORE_DATA) { szReturnValue = ( LPTSTR ) realloc( szReturnValue , dwValueSize * sizeof( TCHAR ) ); dwRetCode = RegQueryValueEx(hKey1, IDENTIFIER_VALUE, NULL, NULL,(LPBYTE) szReturnValue, &dwValueSize); } if(dwRetCode != ERROR_SUCCESS) { RegCloseKey(hKey1); RegCloseKey(hRemoteKey); return ERROR_RETREIVE_REGISTRY ; } } else { RegCloseKey(hRemoteKey); return ERROR_RETREIVE_REGISTRY ; } RegCloseKey(hKey1); } else { RegCloseKey(hRemoteKey); return ERROR_RETREIVE_REGISTRY ; } RegCloseKey(hRemoteKey); lstrcpy(szVal,X86_MACHINE); //check if the specified system contains the words x86 (belongs to the 32 ) // set the flag to true if the specified system is 64 bit . if( !_tcsstr(szReturnValue,szVal)) { dwCode = SYSTEM_64_BIT ; } else { dwCode = SYSTEM_32_BIT ; } SAFEFREE(szReturnValue); return dwCode ; }//GetCPUInfo /*----------------------------------------------------------------------------- Routine Description: Arguments: Returned Value: None -----------------------------------------------------------------------------*/ DWORD CheckSystemType64(LPTSTR szServer) { DWORD dwSystemType = 0 ; #ifdef _WIN64 //display the error message if the target system is a 64 bit system or if error occured in //retreiving the information dwSystemType = GetCPUInfo(szServer); if(dwSystemType == ERROR_RETREIVE_REGISTRY) { DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_SYSTEM_INFO)); return (EXIT_FAILURE); } if(dwSystemType == SYSTEM_32_BIT) { if(lstrlen(szServer)== 0 ) { DISPLAY_MESSAGE(stderr,GetResString(IDS_ERROR_VERSION_MISMATCH1)); } else { DISPLAY_MESSAGE(stderr,GetResString(IDS_REMOTE_NOT_SUPPORTED1)); } return (EXIT_FAILURE); } #endif return EXIT_SUCCESS ; }