/*++ Copyright (c) 1995 Microsoft Corporation Module Name: ccfapi.cpp Abstract: Implementation of CCcfApiApp, the MFC application object for CCFAPI32.DLL. Author: Jeff Parham (jeffparh) 13-Dec-1995 Revision History: --*/ #include "stdafx.h" #include #include "ccfapi.h" #include "source.h" #include "imagelst.h" #include "remdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CCcfApiApp theApp; // The one and only CCcfApiApp object BEGIN_MESSAGE_MAP(CCcfApiApp, CWinApp) //{{AFX_MSG_MAP(CCcfApiApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP END_MESSAGE_MAP() CCcfApiApp::CCcfApiApp() /*++ Routine Description: Constructor for CCF API application. Arguments: None. Return Values: None. --*/ { AFX_MANAGE_STATE( AfxGetStaticModuleState() ); m_LastError = 0; m_LastLlsError = 0; LPTSTR pszHelpFileName = m_strHelpFileName.GetBuffer( MAX_PATH ); if ( NULL != pszHelpFileName ) { BOOL ok = GetSystemDirectory( pszHelpFileName, MAX_PATH ); m_strHelpFileName.ReleaseBuffer(); if ( ok ) { m_strHelpFileName += TEXT( "\\" ); } m_strHelpFileName += TEXT( "ccfapi.hlp" ); } } void CCcfApiApp::DisplayLastError() /*++ Routine Description: Displays a message corresponding to the last error encountered. Arguments: None. Return Values: None. --*/ { CString strLastError; CString strErrorCaption; strLastError = GetLastErrorString(); AfxMessageBox( strLastError, MB_ICONSTOP | MB_OK ); } CString CCcfApiApp::GetLastErrorString() /*++ Routine Description: Retrieves string for last error. (Routine stolen from winsadmn...). (And that routine stolen from LlsMgr...). Arguments: None. Return Values: CString. --*/ { CString strLastError; DWORD nId = m_LastError; const int cchLastErrorSize = 512; LPTSTR pszLastError; DWORD cchLastError; if (((long)nId == RPC_S_CALL_FAILED) || ((long)nId == RPC_NT_SS_CONTEXT_MISMATCH)) { strLastError.LoadString(IDS_ERROR_DROPPED_LINK); } else if (((long)nId == RPC_S_SERVER_UNAVAILABLE) || ((long)nId == RPC_NT_SERVER_UNAVAILABLE)) { strLastError.LoadString(IDS_ERROR_NO_RPC_SERVER); } else if ((long)nId == STATUS_INVALID_LEVEL) { strLastError.LoadString(IDS_ERROR_DOWNLEVEL_SERVER); } else if (((long)nId == ERROR_ACCESS_DENIED) || ((long)nId == STATUS_ACCESS_DENIED)) { strLastError.LoadString(IDS_ERROR_ACCESS_DENIED); } else if ((long)nId == STATUS_ACCOUNT_EXPIRED) { strLastError.LoadString(IDS_ERROR_CERTIFICATE_EXPIRED); } else { HINSTANCE hinstDll = NULL; if ((nId >= NERR_BASE) && (nId <= MAX_NERR)) { hinstDll = ::LoadLibrary( _T( "netmsg.dll" ) ); } else if (nId >= 0x4000000) { hinstDll = ::LoadLibrary( _T( "ntdll.dll" ) ); } cchLastError = 0; pszLastError = strLastError.GetBuffer( cchLastErrorSize ); if ( NULL != pszLastError ) { DWORD dwFlags = FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK | ( hinstDll ? FORMAT_MESSAGE_FROM_HMODULE : FORMAT_MESSAGE_FROM_SYSTEM ); cchLastError = ::FormatMessage( dwFlags, hinstDll, nId, 0, pszLastError, cchLastErrorSize, NULL ); strLastError.ReleaseBuffer(); } if ( hinstDll ) { ::FreeLibrary( hinstDll ); } if ( 0 == cchLastError ) { strLastError.LoadString( IDS_ERROR_UNSUCCESSFUL ); } } return strLastError; } ////////////////////////////////////////////////////////////////////////////// // CCF API // /////////////// DWORD CCcfApiApp::CertificateEnter( HWND hWndParent, LPCSTR pszServerName, LPCSTR pszProductName, LPCSTR pszVendor, DWORD dwFlags, LPCSTR pszSourceToUse ) /*++ Routine Description: Display a dialog allowing the user to enter a license certificate into the system. Arguments: hWndParent (HWND) HWND to the client's main window, for use as the parent window to any opened dialogs. May be NULL. pszServerName (LPCSTR) Name of the server for which licenses are to be installed. Note that this may not be the same as the server on which licenses are actually installed, as, for example, per seat licenses are always installed on the enterprise server. A NULL value indicates the local server. pszProductName (LPCSTR) Product for which licenses are to be installed. A NULL value indicates that the user should be allowed to choose. pszVendor (LPCSTR) Name of the vendor of the product. This value should be NULL if pszProductName is NULL, and should be non-NULL if pszProductName is non-NULL. dwFlags (DWORD) A bitfield containing one or more of the following: CCF_ENTER_FLAG_PER_SEAT_ONLY Allow the user to enter only per seat licenses. Not valid in combination with CCF_ENTER_FLAG_PER_SERVER_ONLY. CCF_ENTER_FLAG_PER_SERVER_ONLY Allow the user to enter only per server licenses. Not valid in combination with CCF_ENTER_FLAG_PER_SEAT_ONLY. pszSourceToUse (LPCSTR) Name of the secure certificate source to use to install the certificate, e.g., "Paper". A NULL value indicates that the user should be allowed to choose. Return Value: ERROR_SUCCESS (A certificate was successfully entered into the system.) ERROR_CANCELLED (The user cancelled without installing a certificate.) other Win error --*/ { CCertSourceSelectDlg srcDlg( CWnd::FromHandle( hWndParent ) ); LPCSTR pszNetServerName = NULL; CHAR szNetServerName[ 2 + MAX_PATH ] = "\\\\"; // make sure server name, if specified, is in the form \\server if ( NULL != pszServerName ) { if ( ( pszServerName[0] != '\\' ) || ( pszServerName[1] != '\\' ) ) { // is not prefixed with backslashes lstrcpynA( szNetServerName + 2, pszServerName, sizeof( szNetServerName ) - 3 ); pszNetServerName = szNetServerName; } else { // is prefixed with backslashes pszNetServerName = pszServerName; } } return srcDlg.CertificateEnter( hWndParent, pszNetServerName, pszProductName, pszVendor, dwFlags, pszSourceToUse ); } DWORD CCcfApiApp::CertificateRemove( HWND hWndParent, LPCSTR pszServerName, LPCSTR pszProductName, LPCSTR pszVendor, DWORD dwFlags, LPCSTR pszSourceToUse ) /*++ Routine Description: Display a dialog allowing the user to remove one or more license certificates from the system. Arguments: hWndParent (HWND) HWND to the client's main window, for use as the parent window to any opened dialogs. May be NULL. pszServerName (LPCSTR) Name of the server on which licenses are to be removed. A NULL value indicates the local server. pszProductName (LPCSTR) Product for which licenses are to be removed. A NULL value indicates that the user should be allowed to remove licenses from any product. pszVendor (LPCSTR) Name of the vendor of the product. This value should be NULL if pszProductName is NULL, and should be non-NULL if pszProductName is non-NULL. dwFlags (DWORD) Certificate removal options. As of this writing, no flags are supported. pszSourceToUse (LPCSTR) Name of the secure certificate source by which licenses are to be removed, e.g., "Paper". A NULL value indicates that the user should be allowed to remove licenses that were installed with any source. Return Value: ERROR_SUCCESS Win error --*/ { CCertRemoveSelectDlg remDlg( CWnd::FromHandle( hWndParent ) ); LPCSTR pszNetServerName = NULL; CHAR szNetServerName[ 2 + MAX_PATH ] = "\\\\"; // make sure server name, if specified, is in the form \\server if ( NULL != pszServerName ) { if ( ( pszServerName[0] != '\\' ) || ( pszServerName[1] != '\\' ) ) { // is not prefixed with backslashes lstrcpynA( szNetServerName + 2, pszServerName, sizeof( szNetServerName ) - 3 ); pszNetServerName = szNetServerName; } else { // is prefixed with backslashes pszNetServerName = pszServerName; } } return remDlg.CertificateRemove( pszNetServerName, pszProductName, pszVendor, dwFlags, pszSourceToUse ); }