windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/lls/ccfapi32/ccfapi.cpp
2020-09-26 16:20:57 +08:00

355 lines
8.9 KiB
C++

/*++
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 <lmerr.h>
#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 );
}