|
|
//-------------------------------------------------------------------
//
// File:
//
// Summary;
//
// Notes;
//
// History
//
//-------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <setupapi.h>
#include <syssetup.h>
#include "resource.h"
#include "ctls.h"
#ifdef UNICODE
# define TSTR_FMT "%ls"
#else
# define TSTR_FMT "%s"
#endif
static BOOL TestInteractive( NETSETUPPAGEREQUESTPROC pfnRequestPages );
static BOOL TestBatch( NETSETUPPAGEREQUESTPROC pfnRequestPages );
static BOOL CALLBACK StartPageDlgProc( HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam );
static BOOL CALLBACK FinishPageDlgProc( HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam );
static void SetLargeDialogFont( HWND hdlg, UINT ControlId );
static BOOL LicenseKeysSave();
static BOOL LicenseKeysDelete();
static BOOL LicenseKeysRestore();
static BOOL LicenseKeysVerify( BOOL fShouldBePresent, BOOL fLicensePerServer, DWORD cPerServerLicenses );
static DWORD MyRegDeleteKey( HKEY hKeyParent, LPCTSTR pcszKeyName );
TCHAR g_szWizardTitle[] = TEXT( "License Setup Test" );
TCHAR g_szKeyLicenseService[] = TEXT( "System\\CurrentControlSet\\Services\\LicenseService" ); TCHAR g_szKeyLicenseInfo[] = TEXT( "System\\CurrentControlSet\\Services\\LicenseInfo" ); TCHAR g_szKeyEventLog[] = TEXT( "System\\CurrentControlSet\\Services\\EventLog\\Application\\LicenseService" );
LPTSTR g_apszKeys[] = { g_szKeyLicenseService, g_szKeyLicenseInfo, g_szKeyEventLog, NULL };
TCHAR g_szTempPath[ 1 + MAX_PATH ];
// paths to file in which to save license registry information
TCHAR g_szKeyFileLicenseService[ 1 + MAX_PATH ]; TCHAR g_szKeyFileLicenseInfo[ 1 + MAX_PATH ]; TCHAR g_szKeyFileEventLog[ 1 + MAX_PATH ];
int _cdecl main( int argc, char *argv[ ], char *envp[ ] ) { BOOL fSuccess; HINSTANCE hLicCpa; NETSETUPPAGEREQUESTPROC pfnRequestPages; BOOL fIsInteractive; BOOL fIsUsage; BOOL fIsRestore; LPSTR pszBadArg;
printf( "\nLicense Setup Wizard Page Test for LICCPA.CPL\n\n" );
fIsInteractive = FALSE; fIsUsage = FALSE; fIsRestore = FALSE; pszBadArg = NULL;
if ( 1 == argc ) { printf( "Use \"%s /?\" for a list of command-line options.\n\n", argv[ 0 ] ); } else { int cCurArg; LPSTR * ppszCurArg;
for ( cCurArg = 1, ppszCurArg = argv; ( ( !fIsUsage ) && ( NULL == pszBadArg ) && ( cCurArg < argc ) ); cCurArg++ ) { ++ppszCurArg;
if ( ( ( '-' == (*ppszCurArg)[ 0 ] ) || ( '/' == (*ppszCurArg)[ 0 ] ) ) && ( '\0' != (*ppszCurArg)[ 1 ] ) ) { DWORD cchOption;
cchOption = strlen( &( (*ppszCurArg)[ 1 ] ) );
if ( !_strnicmp( &( (*ppszCurArg)[ 1 ] ), "interactive", min( cchOption, strlen( "interactive" ) ) ) ) { fIsInteractive = TRUE; } else if ( !_strnicmp( &( (*ppszCurArg)[ 1 ] ), "help", min( cchOption, strlen( "help" ) ) ) || !_strnicmp( &( (*ppszCurArg)[ 1 ] ), "?", min( cchOption, strlen( "?" ) ) ) ) { fIsUsage = TRUE; } else if ( !_strnicmp( &( (*ppszCurArg)[ 1 ] ), "restore", min( cchOption, strlen( "restore" ) ) ) ) { fIsRestore = TRUE; } else { pszBadArg = *ppszCurArg; } } else { pszBadArg = *ppszCurArg; } } }
if ( NULL != pszBadArg ) { printf( "The argument \"%s\" is unrecognized.\n" "Use \"%s /?\" for a list of command-line options.\n", pszBadArg, argv[ 0 ] );
fSuccess = FALSE; } else if ( fIsUsage ) { printf( "Options: [ /? | /H | /HELP ] Display option list.\n" " [ /INTERACTIVE ] Test the wizard page interactively.\n" " [ /RESTORE ] Restore licensing registry keys in the\n" " event that a program error kept them from\n" " being restored in a previous run.\n" );
fSuccess = TRUE; } else { DWORD cchTempPath;
fSuccess = FALSE;
cchTempPath = GetTempPath( sizeof( g_szTempPath ) / sizeof( *g_szTempPath ), g_szTempPath );
if ( 0 == cchTempPath ) { printf( "GetTempPath() failed, error %lu.\n", GetLastError() ); } else { lstrcpy( g_szKeyFileLicenseService, g_szTempPath ); lstrcpy( g_szKeyFileLicenseInfo, g_szTempPath ); lstrcpy( g_szKeyFileEventLog, g_szTempPath );
lstrcat( g_szKeyFileLicenseService, TEXT( "jbplskey" ) ); lstrcat( g_szKeyFileLicenseInfo, TEXT( "jbplikey" ) ); lstrcat( g_szKeyFileEventLog, TEXT( "jbpelkey" ) );
if ( fIsRestore ) { fSuccess = LicenseKeysRestore(); } else { BOOL ok;
fSuccess = FALSE;
// init common control library
InitCommonControls();
ok = InitializeBmpClass();
if ( !ok ) { printf( "InitializeBmpClass() Failed!\n" ); } else { hLicCpa = LoadLibrary( TEXT( "LicCpa.Cpl" ) );
if ( NULL == hLicCpa ) { printf( "LoadLibary() Failed!\n" ); } else { pfnRequestPages = (NETSETUPPAGEREQUESTPROC) GetProcAddress( hLicCpa, "LicenseSetupRequestWizardPages" );
if ( NULL == pfnRequestPages ) { printf( "GetProcAddress() Failed!\n" ); } else if ( fIsInteractive ) { fSuccess = TestInteractive( pfnRequestPages ); } else { fSuccess = TestBatch( pfnRequestPages ); }
FreeLibrary( hLicCpa ); } }
if ( fSuccess ) { printf( "\nTest completed successfully.\n" ); } else { printf( "\nTest failed!\n" ); } } } }
return fSuccess ? 0 : -1; }
static BOOL TestInteractive( NETSETUPPAGEREQUESTPROC pfnRequestPages ) { BOOL fSuccess; UINT chpages; INTERNAL_SETUP_DATA SetupData; BOOL ok;
fSuccess = LicenseKeysSave();
if ( fSuccess ) { SetupData.dwSizeOf = sizeof( SetupData ); SetupData.SetupMode = SETUPMODE_CUSTOM; SetupData.ProductType = PRODUCT_SERVER_PRIMARY; SetupData.OperationFlags = 0; // SETUPOPER_NTUPGRADE;
SetupData.WizardTitle = g_szWizardTitle; SetupData.SourcePath = NULL; SetupData.UnattendFile = NULL; SetupData.LegacySourcePath = NULL;
// get number pages the wizard needs
ok = (*pfnRequestPages)( NULL, &chpages, &SetupData );
if ( !ok ) { // request number of pages failure
printf( "Cannot retrieve number of pages!\n" ); } else { HPROPSHEETPAGE * phpage;
// we will add anm intro and a finish page
phpage = new HPROPSHEETPAGE[ chpages + 2 ];
if ( NULL == phpage ) { // memory allocation failue
printf( "Cannot allocate memory!\n" ); } else { ok = (*pfnRequestPages)( &phpage[ 1 ], &chpages, &SetupData );
if ( !ok ) { // request number of pages failure
printf( "Cannot retrieve pages!\n" ); } else { PROPSHEETPAGE psp;
psp.dwSize = sizeof( psp ); psp.dwFlags = PSP_USETITLE; psp.hInstance = GetModuleHandle( NULL ); psp.pszTemplate = MAKEINTRESOURCE( IDD_START_PAGE ); psp.hIcon = NULL; psp.pfnDlgProc = StartPageDlgProc; psp.pszTitle = SetupData.WizardTitle; psp.lParam = 0; psp.pfnCallback = NULL;
phpage[ 0 ] = CreatePropertySheetPage( &psp );
if ( NULL == phpage[ 0 ] ) { printf( "Cannot create start page!\n" ); } else { psp.dwSize = sizeof( psp ); psp.dwFlags = PSP_USETITLE; psp.hInstance = GetModuleHandle( NULL ); psp.pszTemplate = MAKEINTRESOURCE( IDD_FINISH_PAGE ); psp.hIcon = NULL; psp.pfnDlgProc = FinishPageDlgProc; psp.pszTitle = SetupData.WizardTitle; psp.lParam = 0; psp.pfnCallback = NULL;
phpage[ chpages + 1 ] = CreatePropertySheetPage( &psp );
if ( NULL == phpage[ chpages + 1 ] ) { printf( "Cannot create finish page!\n" ); } else { PROPSHEETHEADER psh; int nResult;
// prep frame header
psh.dwSize = sizeof( psh ); psh.dwFlags = PSH_WIZARD; psh.hwndParent = NULL; psh.hInstance = GetModuleHandle( NULL ); psh.hIcon = NULL; psh.pszCaption = NULL; psh.nPages = chpages + 2; psh.nStartPage = 0; psh.phpage = phpage; psh.pfnCallback = NULL;
// raise frame
PropertySheet( &psh );
fSuccess = TRUE; } } }
delete [] phpage; } }
fSuccess = LicenseKeysRestore() && fSuccess; }
return fSuccess; }
static BOOL CALLBACK StartPageDlgProc( HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam ) { static BOOL fIsBatch;
BOOL ok = TRUE; LPNMHDR pnmh;
switch ( msg ) { case WM_INITDIALOG: fIsBatch = ( (LPPROPSHEETPAGE)lParam )->lParam; SetLargeDialogFont( hdlg, IDC_STATICTITLE ); break;
case WM_NOTIFY: pnmh = (LPNMHDR)lParam;
switch (pnmh->code) { // propsheet notification
case PSN_HELP: break;
case PSN_SETACTIVE: // hide Cancel button
EnableWindow( GetDlgItem( GetParent( hdlg ), IDCANCEL ), FALSE); ShowWindow( GetDlgItem( GetParent( hdlg ), IDCANCEL ), SW_HIDE);
PropSheet_SetWizButtons( GetParent( hdlg ), PSWIZB_NEXT );
if ( fIsBatch ) { // batch mode
PostMessage( GetParent( hdlg ), PSM_PRESSBUTTON, (WPARAM)PSBTN_NEXT, 0 ); }
SetWindowLong( hdlg, DWL_MSGRESULT, 0 ); break;
case PSN_KILLACTIVE: SetWindowLong( hdlg, DWL_MSGRESULT, 0 ); break;
case PSN_WIZFINISH: SetWindowLong( hdlg, DWL_MSGRESULT, 0 ); break;
default: ok = TRUE; break; } break;
default: ok = FALSE; }
return ok; }
static BOOL CALLBACK FinishPageDlgProc( HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam ) { static BOOL fIsBatch;
BOOL ok = TRUE; LPNMHDR pnmh;
switch ( msg ) { case WM_INITDIALOG: fIsBatch = ( (LPPROPSHEETPAGE)lParam )->lParam; SetLargeDialogFont( hdlg, IDC_STATICTITLE ); break;
case WM_NOTIFY: pnmh = (LPNMHDR)lParam;
switch (pnmh->code) { // propsheet notification
case PSN_HELP: break;
case PSN_SETACTIVE: // hide Cancel button
EnableWindow( GetDlgItem( GetParent( hdlg ), IDCANCEL ), FALSE); ShowWindow( GetDlgItem( GetParent( hdlg ), IDCANCEL ), SW_HIDE);
PropSheet_SetWizButtons( GetParent( hdlg ), PSWIZB_BACK | PSWIZB_FINISH );
if ( fIsBatch ) { // batch mode
PostMessage( GetParent( hdlg ), PSM_PRESSBUTTON, (WPARAM)PSBTN_FINISH, 0 ); }
SetWindowLong( hdlg, DWL_MSGRESULT, 0 ); break;
case PSN_KILLACTIVE: SetWindowLong( hdlg, DWL_MSGRESULT, 0 ); break;
case PSN_WIZFINISH: SetWindowLong( hdlg, DWL_MSGRESULT, 0 ); break;
default: ok = TRUE; break; } break;
default: ok = FALSE; }
return ok; }
static void SetLargeDialogFont( HWND hdlg, UINT ControlId )
/*++
Routine Description:
Sets the font of a given control in a dialog to a larger point size.
(Lifted from SetupSetLargeDialogFont() in \nt\private\windows\setup\syssetup\wizard.c.)
Arguments:
hwnd - supplies window handle of the dialog containing the control.
ControlId - supplies the id of the control whose font is to be made larger.
Return Value:
None.
--*/
{ //
// We keep one log font around to satisfy the request.
//
static HFONT BigFont = NULL;
HFONT Font; LOGFONT LogFont; WCHAR str[24]; int Height; HDC hdc;
if ( !BigFont ) { Font = (HFONT)SendDlgItemMessage( hdlg, ControlId, WM_GETFONT, 0, 0 );
if ( NULL != Font ) { if ( GetObject( Font, sizeof(LOGFONT), &LogFont ) ) { //
// Use a larger font in boldface. Get the face name and size in points
// from the resources. We use 18 point in the U.S. but in the Far East
// they will want to use a different size since the standard dialog font
// is larger than the one we use in the U.S..
//
LogFont.lfWeight = FW_BOLD;
lstrcpy( LogFont.lfFaceName, TEXT( "MS Serif" ) ); Height = 18;
hdc = GetDC( hdlg );
if ( NULL != hdc ) { // create font
LogFont.lfHeight = 0 - ( GetDeviceCaps( hdc, LOGPIXELSY ) * Height / 72 );
BigFont = CreateFontIndirect( &LogFont );
ReleaseDC( hdlg, hdc ); } } } }
if ( NULL != BigFont ) { // change font of ControlId to BigFont
SendDlgItemMessage( hdlg, ControlId, WM_SETFONT, (WPARAM)BigFont, MAKELPARAM( TRUE, 0 ) ); } }
static BOOL TestBatch( NETSETUPPAGEREQUESTPROC pfnRequestPages ) { BOOL fSuccess;
fSuccess = FALSE;
// save registry keys before we go and overwrite them
fSuccess = LicenseKeysSave();
if ( fSuccess ) { TCHAR szTempFile[ 1 + MAX_PATH ]; DWORD cchTempFile;
cchTempFile = GetTempFileName( g_szTempPath, TEXT( "JBP" ), 0, szTempFile );
if ( 0 == cchTempFile ) { printf( "GetTempFileName() failed, error %lu.\n", GetLastError() ); } else { HANDLE hUnattendFile;
hUnattendFile = CreateFile( szTempFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL );
if ( NULL == hUnattendFile ) { printf( "CreateFile() on \""TSTR_FMT"\" failed, error %lu.\n", szTempFile, GetLastError() ); } else { struct UnattendEntry { LPSTR pszFileContents; BOOL fLicensePerServer; DWORD cPerServerLicenses; };
static UnattendEntry aUnattendEntries[] = { { "[licensefileprintdata]\nautomode=perseat\nautousers=0\n", FALSE, 0 }, { "[licensefileprintdata]\nautomode=perseat\nautousers=100\n", FALSE, 100 }, { "[licensefileprintdata]\nautomode=perserver\nautousers=42\n", TRUE, 42 }, { "[licensefileprintdata]\nautomode=perserver\nautousers=0\n", TRUE, 0 }, { NULL, FALSE, 0 } };
DWORD iEntry;
for ( iEntry=0; fSuccess && ( NULL != aUnattendEntries[ iEntry ].pszFileContents ); iEntry++ ) { // delete current licensing info in registry
fSuccess = LicenseKeysDelete();
if ( fSuccess ) { DWORD cbFilePos;
// erase file
cbFilePos = SetFilePointer( hUnattendFile, 0, NULL, FILE_BEGIN );
if ( 0xFFFFFFFF == cbFilePos ) { printf( "SetFilePointer() failed, error %lu.\n", GetLastError() ); } else { BOOL ok;
ok = SetEndOfFile( hUnattendFile );
if ( !ok ) { printf( "SetEndOfFile() failed, error %lu.\n", GetLastError() ); } else { DWORD cbBytesWritten;
// write new unattend file contents
ok = WriteFile( hUnattendFile, aUnattendEntries[ iEntry ].pszFileContents, lstrlenA( aUnattendEntries[ iEntry ].pszFileContents ), &cbBytesWritten, NULL );
if ( !ok ) { printf( "WriteFile() failed, error %lu.\n", GetLastError() ); } else { // run setup with this unattend file
UINT chpages; INTERNAL_SETUP_DATA SetupData; BOOL ok;
fSuccess = FALSE;
SetupData.dwSizeOf = sizeof( SetupData ); SetupData.SetupMode = SETUPMODE_CUSTOM; SetupData.ProductType = PRODUCT_SERVER_PRIMARY; SetupData.OperationFlags = SETUPOPER_BATCH; SetupData.WizardTitle = g_szWizardTitle; SetupData.SourcePath = NULL; SetupData.UnattendFile = szTempFile; SetupData.LegacySourcePath = NULL;
// get number pages the wizard needs
ok = (*pfnRequestPages)( NULL, &chpages, &SetupData );
if ( !ok ) { // request number of pages failure
printf( "Cannot retrieve number of pages!\n" ); } else { HPROPSHEETPAGE * phpage;
phpage = new HPROPSHEETPAGE[ chpages + 2 ];
if ( NULL == phpage ) { // memory allocation failue
printf( "Cannot allocate memory!\n" ); } else { ok = (*pfnRequestPages)( &phpage[ 1 ], &chpages, &SetupData );
if ( !ok ) { // request number of pages failure
printf( "Cannot retrieve pages!\n" ); } else { PROPSHEETPAGE psp;
psp.dwSize = sizeof( psp ); psp.dwFlags = PSP_USETITLE; psp.hInstance = GetModuleHandle( NULL ); psp.pszTemplate = MAKEINTRESOURCE( IDD_START_PAGE ); psp.hIcon = NULL; psp.pfnDlgProc = StartPageDlgProc; psp.pszTitle = SetupData.WizardTitle; psp.lParam = 1; psp.pfnCallback = NULL;
phpage[ 0 ] = CreatePropertySheetPage( &psp );
if ( NULL == phpage[ 0 ] ) { printf( "Cannot create start page!\n" ); } else { psp.dwSize = sizeof( psp ); psp.dwFlags = PSP_USETITLE; psp.hInstance = GetModuleHandle( NULL ); psp.pszTemplate = MAKEINTRESOURCE( IDD_FINISH_PAGE ); psp.hIcon = NULL; psp.pfnDlgProc = FinishPageDlgProc; psp.pszTitle = SetupData.WizardTitle; psp.lParam = 1; psp.pfnCallback = NULL;
phpage[ chpages + 1 ] = CreatePropertySheetPage( &psp );
if ( NULL == phpage[ chpages + 1 ] ) { printf( "Cannot create finish page!\n" ); } else { PROPSHEETHEADER psh; int nResult;
// prep frame header
psh.dwSize = sizeof( psh ); psh.dwFlags = PSH_WIZARD; psh.hwndParent = NULL; psh.hInstance = GetModuleHandle( NULL ); psh.hIcon = NULL; psh.pszCaption = NULL; psh.nPages = chpages + 2; psh.nStartPage = 0; psh.phpage = phpage; psh.pfnCallback = NULL;
// raise frame
PropertySheet( &psh );
fSuccess = LicenseKeysVerify( TRUE, aUnattendEntries[ iEntry ].fLicensePerServer, aUnattendEntries[ iEntry ].cPerServerLicenses ); } } }
delete [] phpage; } } } } } } }
CloseHandle( hUnattendFile ); } }
fSuccess = LicenseKeysRestore() && fSuccess; }
return fSuccess; }
static BOOL LicenseKeysSave() { DWORD winStatus; HANDLE hToken; TOKEN_PRIVILEGES tp; LUID luid; BOOL ok;
// Enable backup privilege.
ok = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ;
if ( !ok ) { winStatus = GetLastError(); printf( "OpenProcessToken() failed, error %lu.\n", winStatus ); } else { ok = LookupPrivilegeValue( NULL, SE_BACKUP_NAME, &luid );
if ( !ok ) { winStatus = GetLastError(); printf( "LookupPrivilegeValue() failed, error %lu.\n", winStatus ); } else { tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
ok = AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL );
if ( !ok ) { winStatus = GetLastError(); printf( "AdjustTokenPrivileges() failed, error %lu.\n", winStatus ); } else { HKEY hKeyLicenseService; HKEY hKeyLicenseInfo; HKEY hKeyEventLog;
winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, g_szKeyLicenseService, 0, KEY_ALL_ACCESS, &hKeyLicenseService );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \""TSTR_FMT"\" failed, error %lu.\n" " o Was the license service not properly installed?\n" " o Are you running on Workstation instead of Server?\n" " o Was the registry wiped and not restored in a previous run?\n" " (In this case, use the /RESTORE option!)\n", g_szKeyLicenseService, winStatus ); } else { winStatus = RegSaveKey( hKeyLicenseService, g_szKeyFileLicenseService, NULL );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegSaveKey() on \""TSTR_FMT"\" failed, error %lu.\n" " o Does the temp directory \""TSTR_FMT"\" not exist?\n" " o Does the file \""TSTR_FMT"\" already exist?\n", g_szKeyLicenseService, winStatus, g_szTempPath, g_szKeyFileLicenseService ); } else { winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, g_szKeyLicenseInfo, 0, KEY_ALL_ACCESS, &hKeyLicenseInfo );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \""TSTR_FMT"\" failed, error %lu.\n" " o Was the license service not properly installed?\n" " o Are you running on Workstation instead of Server?\n", " o Was the registry wiped and not restored in a previous run?\n" " (In this case, use the /RESTORE option!)\n", g_szKeyLicenseInfo, winStatus );
DeleteFile( g_szKeyFileLicenseService ); } else { winStatus = RegSaveKey( hKeyLicenseInfo, g_szKeyFileLicenseInfo, NULL );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegSaveKey() on \""TSTR_FMT"\" failed, error %lu.\n" " o Does the temp directory \""TSTR_FMT"\" not exist?\n" " o Does the file \""TSTR_FMT"\" already exist?\n", g_szKeyLicenseInfo, winStatus, g_szTempPath, g_szKeyFileLicenseInfo ); } else { winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, g_szKeyEventLog, 0, KEY_ALL_ACCESS, &hKeyEventLog );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \""TSTR_FMT"\" failed, error %lu.\n" " o Was the license service not properly installed?\n" " o Are you running on Workstation instead of Server?\n", " o Was the registry wiped and not restored in a previous run?\n" " (In this case, use the /RESTORE option!)\n", g_szKeyEventLog, winStatus );
DeleteFile( g_szKeyFileLicenseInfo ); } else { winStatus = RegSaveKey( hKeyEventLog, g_szKeyFileEventLog, NULL );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegSaveKey() on \""TSTR_FMT"\" failed, error %lu.\n" " o Does the temp directory \""TSTR_FMT"\" not exist?\n" " o Does the file \""TSTR_FMT"\" already exist?\n", g_szKeyEventLog, winStatus, g_szTempPath, g_szKeyFileEventLog ); }
RegCloseKey( hKeyEventLog ); } }
RegCloseKey( hKeyLicenseInfo ); } }
RegCloseKey( hKeyLicenseService ); }
// Disable backup privilege.
AdjustTokenPrivileges( hToken, TRUE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ); } } }
if ( ERROR_SUCCESS != winStatus ) { printf( "The license info in the registry could not be saved!\n" );
return FALSE; } else { printf( "The license info in the registry has been saved.\n" );
return TRUE; } }
static BOOL LicenseKeysDelete() { DWORD winStatus; DWORD iKey; DWORD iLastBackslash;
SC_HANDLE hSC;
winStatus = ERROR_SUCCESS;
hSC = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if ( NULL == hSC ) { winStatus = GetLastError(); printf( "OpenSCManager() failed, error %lu.\n", winStatus ); } else { SC_HANDLE hLicenseService;
hLicenseService = OpenService( hSC, TEXT( "LicenseService" ), SERVICE_ALL_ACCESS );
if ( NULL == hLicenseService ) { winStatus = GetLastError();
if ( ERROR_SERVICE_DOES_NOT_EXIST == winStatus ) { // license service not configured; no need to stop or delete
winStatus = ERROR_SUCCESS; } else { printf( "OpenService() failed, error %lu.\n", winStatus ); } } else { BOOL ok; SERVICE_STATUS SvcStatus;
// stop license service
ok = ControlService( hLicenseService, SERVICE_CONTROL_STOP, &SvcStatus );
if ( !ok ) { winStatus = GetLastError();
if ( ERROR_SERVICE_NOT_ACTIVE == winStatus ) { // license service not running; no need to stop
winStatus = ERROR_SUCCESS; } else { printf( "ControlService() failed, error %lu.\n", winStatus ); } }
if ( ( ERROR_SUCCESS == winStatus ) && ( SERVICE_STOP_PENDING == SvcStatus.dwCurrentState ) ) { DWORD dwOldCheckPoint;
printf( "License Service is stopping.." );
ok = TRUE;
while ( ok && ( SvcStatus.dwCurrentState == SERVICE_STOP_PENDING ) ) { printf( "." );
dwOldCheckPoint = SvcStatus.dwCheckPoint; Sleep( SvcStatus.dwWaitHint );
ok = QueryServiceStatus( hLicenseService, &SvcStatus );
if ( dwOldCheckPoint >= SvcStatus.dwCheckPoint ) break; }
printf( "\n" );
if ( !ok ) { winStatus = GetLastError(); printf( "ControlService() failed, error %lu.\n", winStatus ); } else if ( SvcStatus.dwCurrentState != SERVICE_STOPPED ) { winStatus = ERROR_SERVICE_REQUEST_TIMEOUT; printf( "License Service failed to stop!\n" ); } else { winStatus = ERROR_SUCCESS; printf( "License Service stopped.\n" ); } }
if ( ERROR_SUCCESS == winStatus ) { // delete service
ok = DeleteService( hLicenseService );
if ( !ok ) { winStatus = GetLastError(); printf( "DeleteService() failed, error %lu.\n", winStatus ); } else { winStatus = ERROR_SUCCESS; printf( "License Service deleted.\n" ); } }
CloseServiceHandle( hLicenseService ); }
CloseServiceHandle( hSC ); }
if ( ERROR_SUCCESS == winStatus ) { // delete keys
for ( iKey=0, winStatus = ERROR_SUCCESS; ( NULL != g_apszKeys[ iKey ] ) && ( ERROR_SUCCESS == winStatus ); iKey++ ) { TCHAR szKeyParent[ 1 + MAX_PATH ]; TCHAR szKey[ 1 + MAX_PATH ]; HKEY hKeyParent;
lstrcpy( szKeyParent, g_apszKeys[ iKey ] );
for ( iLastBackslash = lstrlen( szKeyParent ) - 1; TEXT( '\\' ) != szKeyParent[ iLastBackslash ]; iLastBackslash-- ) { ; }
szKeyParent[ iLastBackslash ] = TEXT( '\0' ); lstrcpy( szKey, &szKeyParent[ iLastBackslash + 1 ] );
winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, szKeyParent, 0, KEY_ALL_ACCESS, &hKeyParent );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \""TSTR_FMT"\" failed, error %lu.\n", szKeyParent, winStatus ); } else { winStatus = MyRegDeleteKey( hKeyParent, szKey );
if ( ERROR_FILE_NOT_FOUND == winStatus ) { winStatus = ERROR_SUCCESS; } else if ( ERROR_SUCCESS != winStatus ) { printf( "MyRegDeleteKey() on \""TSTR_FMT"\" failed, error %lu.\n", g_apszKeys[ iKey ], winStatus ); }
RegCloseKey( hKeyParent ); } } }
if ( ERROR_SUCCESS != winStatus ) { printf( "Could not delete licensing registry keys!\n" );
return FALSE; } else { printf( "Licensing registry keys deleted.\n" );
return TRUE; } }
static BOOL LicenseKeysRestore() { DWORD winStatus; DWORD winStatusRestoreLicenseService; DWORD winStatusRestoreLicenseInfo; DWORD winStatusRestoreEventLog;
HANDLE hToken; TOKEN_PRIVILEGES tp; LUID luid; BOOL ok;
winStatus = ERROR_SUCCESS;
// Enable backup privilege.
ok = OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ;
if ( !ok ) { winStatus = GetLastError(); printf( "OpenProcessToken() failed, error %lu.\n", winStatus ); } else { ok = LookupPrivilegeValue( NULL, SE_RESTORE_NAME, &luid );
if ( !ok ) { winStatus = GetLastError(); printf( "LookupPrivilegeValue() failed, error %lu.\n", winStatus ); } else { tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
ok = AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL );
if ( !ok ) { winStatus = GetLastError(); printf( "AdjustTokenPrivileges() failed, error %lu.\n", winStatus ); } else { HKEY hKeyLicenseService; HKEY hKeyLicenseInfo; HKEY hKeyEventLog; DWORD dwDisposition;
winStatusRestoreLicenseService = RegCreateKeyEx( HKEY_LOCAL_MACHINE, g_szKeyLicenseService, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeyLicenseService, &dwDisposition );
if ( ERROR_SUCCESS != winStatusRestoreLicenseService ) { printf( "RegCreateKeyEx() of \""TSTR_FMT"\" failed, error %lu.\n", g_szKeyLicenseService, winStatusRestoreLicenseService ); } else { winStatusRestoreLicenseService = RegRestoreKey( hKeyLicenseService, g_szKeyFileLicenseService, 0 );
if ( ERROR_SUCCESS != winStatusRestoreLicenseService ) { printf( "RegRestoreKey() of \""TSTR_FMT"\" failed, error %lu.\n", g_szKeyLicenseService, winStatusRestoreLicenseService ); } else { DeleteFile( g_szKeyFileLicenseService ); }
RegCloseKey( hKeyLicenseService ); }
winStatusRestoreLicenseInfo = RegCreateKeyEx( HKEY_LOCAL_MACHINE, g_szKeyLicenseInfo, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeyLicenseInfo, &dwDisposition );
if ( ERROR_SUCCESS != winStatusRestoreLicenseInfo ) { printf( "RegCreateKeyEx() of \""TSTR_FMT"\" failed, error %lu.\n", g_szKeyLicenseInfo, winStatusRestoreLicenseInfo ); } else { winStatusRestoreLicenseInfo = RegRestoreKey( hKeyLicenseInfo, g_szKeyFileLicenseInfo, 0 );
if ( ERROR_SUCCESS != winStatusRestoreLicenseInfo ) { printf( "RegRestoreKey() of \""TSTR_FMT"\" failed, error %lu.\n", g_szKeyLicenseInfo, winStatusRestoreLicenseInfo ); } else { DeleteFile( g_szKeyFileLicenseInfo ); }
RegCloseKey( hKeyLicenseInfo ); }
winStatusRestoreEventLog = RegCreateKeyEx( HKEY_LOCAL_MACHINE, g_szKeyEventLog, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKeyEventLog, &dwDisposition );
if ( ERROR_SUCCESS != winStatusRestoreEventLog ) { printf( "RegCreateKeyEx() of \""TSTR_FMT"\" failed, error %lu.\n", g_szKeyEventLog, winStatusRestoreEventLog ); } else { winStatusRestoreEventLog = RegRestoreKey( hKeyEventLog, g_szKeyFileEventLog, 0 );
if ( ERROR_SUCCESS != winStatusRestoreEventLog ) { printf( "RegRestoreKey() of \""TSTR_FMT"\" failed, error %lu.\n", g_szKeyEventLog, winStatusRestoreEventLog ); } else { DeleteFile( g_szKeyFileEventLog ); }
RegCloseKey( hKeyEventLog ); }
// Disable backup privilege.
AdjustTokenPrivileges( hToken, TRUE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ); } } }
if ( ( ERROR_SUCCESS != winStatus ) || ( ERROR_SUCCESS != winStatusRestoreLicenseService ) || ( ERROR_SUCCESS != winStatusRestoreLicenseInfo ) || ( ERROR_SUCCESS != winStatusRestoreEventLog ) ) { printf( "!! WARNING !! The license info in the registry has not been fully restored!\n" );
return FALSE; } else { printf( "The license info in the registry has been fully restored.\n" );
return TRUE; } }
static DWORD MyRegDeleteKey( HKEY hKeyParent, LPCTSTR pcszKeyName ) { DWORD winStatus; TCHAR szSubKeyToDelete[ 256 ]; HKEY hKey;
// try to delete it outright
winStatus = RegDeleteKey( hKeyParent, pcszKeyName );
if ( ERROR_SUCCESS != winStatus ) { // could not delete it; perhaps the key has children
// that we must delete first?
winStatus = RegOpenKeyEx( hKeyParent, pcszKeyName, 0, KEY_ALL_ACCESS, &hKey );
if ( ERROR_SUCCESS == winStatus ) { do { winStatus = RegEnumKey( hKey, 0, szSubKeyToDelete, sizeof( szSubKeyToDelete ) / sizeof( *szSubKeyToDelete ) );
if ( ERROR_SUCCESS == winStatus ) { // recursively try to delete this subkey
winStatus = MyRegDeleteKey( hKey, szSubKeyToDelete ); } } while ( ERROR_SUCCESS == winStatus );
// we've tried tried to delete all the key's children;
// try deleting the key again
winStatus = RegDeleteKey( hKeyParent, pcszKeyName ); } }
return winStatus; }
static BOOL LicenseKeysVerify( BOOL fShouldBePresent, BOOL fLicensePerServer, DWORD cPerServerLicenses ) //
// Verify service config:
//
// lpServiceName = "LicenseService"
// lpDisplayName = "License Logging Service"
// dwServiceType = SERVICE_WIN32_OWN_PROCESS
// dwStartType = LanManServerInstalled ? SERVICE_AUTO_START : SERVICE_DISABLED
// dwErrorControl = SERVICE_ERROR_NORMAL
// lpBinaryPathName = "%SystemRoot%\\System32\\llssrv.exe"
// lpLoadOrderGroup = NULL
// lpdwTagId = NULL
// lpDependencies = NULL
// lpServiceStartName = NULL
// lpPassword = NULL
//
// Verify registry values:
//
// HKEY_LOCAL_MACHINE
// \System
// \CurrentControlSet
// \Services
// \LicenseInfo
// ErrorControl : REG_DWORD : 1
// Start : REG_DWORD : 3
// Type : REG_DWORD : 4
// \FilePrint
// ConcurrentLimit : REG_DWORD : fLicensePerServer ? cPerServerLicenses : 0
// DisplayName : REG_SZ : "Windows NT Server"
// FamilyDisplayName : REG_SZ : "Windows NT Server"
// Mode : REG_DWORD : fLicensePerServer ? 1 : 0
// FlipAllow : REG_DWORD : fLicensePerServer ? 1 : 0
// \LicenseService
// \FilePrint
// \KSecDD
// \MSAfpSrv
// \SMBServer
// \TCP/IP Print Server
// \Parameters
// UseEnterprise : REG_DWORD : 0
// ReplicationType : REG_DWORD : 0
// ReplicationTime : REG_DWORD : 24 * 60 * 60
// EnterpriseServer : REG_SZ : ""
// \EventLog
// \Application
// \LicenseService
// EventMessageFile : REG_EXPAND_SZ : %SystemRoot%\System32\llsrpc.dll
// TypesSupported : REG_DWORD : 7
//
{ BOOL fSuccess; DWORD winStatus;
// check service config
if ( !fShouldBePresent ) { fSuccess = TRUE; } else { SC_HANDLE hSC;
fSuccess = FALSE;
hSC = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if ( NULL == hSC ) { printf( "OpenSCManager() failed, error %lu.\n", GetLastError() ); } else { SC_HANDLE hLicenseService;
hLicenseService = OpenService( hSC, TEXT( "LicenseService" ), SERVICE_ALL_ACCESS );
if ( NULL == hLicenseService ) { printf( "OpenService() failed, error %lu.\n", GetLastError() ); } else { BOOL ok; BYTE abLicenseServiceConfig[ 4096 ]; LPQUERY_SERVICE_CONFIG pLicenseServiceConfig; DWORD cbLicenseServiceConfigNeeded;
pLicenseServiceConfig = (LPQUERY_SERVICE_CONFIG) abLicenseServiceConfig;
ok = QueryServiceConfig( hLicenseService, pLicenseServiceConfig, sizeof( abLicenseServiceConfig ), &cbLicenseServiceConfigNeeded );
if ( !ok ) { printf( "QueryServiceConfig() failed, error %lu.\n", GetLastError() ); } else if ( ( SERVICE_WIN32_OWN_PROCESS != pLicenseServiceConfig->dwServiceType ) || ( SERVICE_AUTO_START != pLicenseServiceConfig->dwStartType ) || ( SERVICE_ERROR_NORMAL != pLicenseServiceConfig->dwErrorControl ) || lstrcmpi( TEXT( "" ), pLicenseServiceConfig->lpLoadOrderGroup ) || lstrcmpi( TEXT( "" ), pLicenseServiceConfig->lpDependencies ) || lstrcmpi( TEXT( "LocalSystem" ), pLicenseServiceConfig->lpServiceStartName ) //|| lstrcmpi( TEXT( "%SystemRoot%\\System32\\llssrv.exe" ), pLicenseServiceConfig->lpBinaryPathName )
//|| lstrcmp( TEXT( "License Logging Service" ), pLicenseServiceConfig->lpDisplayName )
) { printf( "LicenseService was incorrectly configured!\n" ); } else { fSuccess = TRUE; }
CloseServiceHandle( hLicenseService ); }
CloseServiceHandle( hSC ); } }
if ( fSuccess ) { // check LicenseService\FilePrint
HKEY hKeyFilePrint;
fSuccess = FALSE;
winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT( "System\\CurrentControlSet\\Services\\LicenseService\\FilePrint" ), 0, KEY_ALL_ACCESS, &hKeyFilePrint );
if ( !fShouldBePresent ) { if ( ERROR_SUCCESS == winStatus ) { printf( "\"...\\Services\\LicenseService\\FilePrint\" exists but shouldn't!\n" ); } else { fSuccess = TRUE; } } else if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \"...\\Services\\LicenseService\\FilePrint\" failed, error %lu.\n", winStatus ); } else { static LPTSTR apszFilePrintServices[] = { TEXT( "KSecDD" ), TEXT( "MSAfpSrv" ), TEXT( "SMBServer" ), TEXT( "TCP/IP Print Server" ), NULL };
DWORD iService;
fSuccess = TRUE;
for ( iService=0; fSuccess && ( NULL != apszFilePrintServices[ iService ] ); iService++ ) { HKEY hKeyFilePrintService;
winStatus = RegOpenKeyEx( hKeyFilePrint, apszFilePrintServices[ iService ], 0, KEY_ALL_ACCESS, &hKeyFilePrintService );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \""TSTR_FMT"\" failed, error %lu.\n", apszFilePrintServices[ iService ], winStatus );
fSuccess = FALSE; } else { RegCloseKey( hKeyFilePrintService ); } }
RegCloseKey( hKeyFilePrint ); } }
if ( fSuccess ) { // check LicenseService\Parameters
HKEY hKeyParameters;
fSuccess = FALSE;
winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT( "System\\CurrentControlSet\\Services\\LicenseService\\Parameters" ), 0, KEY_ALL_ACCESS, &hKeyParameters );
if ( !fShouldBePresent ) { if ( ERROR_SUCCESS == winStatus ) { printf( "\"...\\Services\\LicenseService\\Parameters\" exists but shouldn't!\n" ); } else { fSuccess = TRUE; } } else if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \"...\\Services\\LicenseService\\Parameters\" failed, error %lu.\n", winStatus ); } else { // UseEnterprise : REG_DWORD : 0
// ReplicationType : REG_DWORD : 0
// ReplicationTime : REG_DWORD : 24 * 60 * 60
// EnterpriseServer : REG_SZ : ""
DWORD dwType; DWORD dwValue; DWORD cbValue; TCHAR szValue[ 1 + MAX_PATH ];
cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyParameters, TEXT( "UseEnterprise" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"UseEnterprise\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( 0 != dwValue ) ) { printf( "\"UseEnterprise\" has incorrect value!\n" ); } else { cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyParameters, TEXT( "ReplicationType" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"ReplicationType\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( 0 != dwValue ) ) { printf( "\"ReplicationType\" has incorrect value!\n" ); } else { cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyParameters, TEXT( "ReplicationTime" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"ReplicationTime\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( 24L * 60L * 60L != dwValue ) ) { printf( "\"ReplicationTime\" has incorrect value!\n" ); } else { cbValue = sizeof( szValue ); winStatus = RegQueryValueEx( hKeyParameters, TEXT( "EnterpriseServer" ), NULL, &dwType, (LPBYTE) szValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"EnterpriseServer\" failed, error %lu.\n", winStatus ); } else if ( ( REG_SZ != dwType ) || ( TEXT( '\0' ) != szValue[ 0 ] ) ) { printf( "\"EnterpriseServer\" has incorrect value!\n" ); } else { fSuccess = TRUE; } } } }
RegCloseKey( hKeyParameters ); } }
if ( fSuccess ) { // check LicenseInfo
HKEY hKeyLicenseInfo;
fSuccess = FALSE;
winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT( "System\\CurrentControlSet\\Services\\LicenseInfo" ), 0, KEY_ALL_ACCESS, &hKeyLicenseInfo );
if ( !fShouldBePresent ) { if ( ERROR_SUCCESS == winStatus ) { printf( "\"...\\Services\\LicenseInfo\" exists but shouldn't!\n" ); } else { fSuccess = TRUE; } } else if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \"...\\Services\\LicenseInfo\" failed, error %lu.\n", winStatus ); } else { // ErrorControl : REG_DWORD : 1
// Start : REG_DWORD : 3
// Type : REG_DWORD : 4
DWORD dwType; DWORD dwValue; DWORD cbValue;
cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyLicenseInfo, TEXT( "ErrorControl" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"ErrorControl\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( 1 != dwValue ) ) { printf( "\"ErrorControl\" has incorrect value!\n" ); } else { cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyLicenseInfo, TEXT( "Start" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"Start\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( 3 != dwValue ) ) { printf( "\"Start\" has incorrect value!\n" ); } else { cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyLicenseInfo, TEXT( "Type" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"Type\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( 4 != dwValue ) ) { printf( "\"Type\" has incorrect value!\n" ); } else { fSuccess = TRUE; } } }
RegCloseKey( hKeyLicenseInfo ); } }
if ( fSuccess ) { // check LicenseInfo\FilePrint
HKEY hKeyFilePrint;
fSuccess = FALSE;
winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT( "System\\CurrentControlSet\\Services\\LicenseInfo\\FilePrint" ), 0, KEY_ALL_ACCESS, &hKeyFilePrint );
if ( !fShouldBePresent ) { if ( ERROR_SUCCESS == winStatus ) { printf( "\"...\\EventLog\\Application\\LicenseInfo\\FilePrint\" exists but shouldn't!\n" ); } else { fSuccess = TRUE; } } else if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \"...\\Services\\LicenseInfo\\FilePrint\" failed, error %lu.\n", winStatus ); } else { // ConcurrentLimit : REG_DWORD : fLicensePerServer ? cPerServerLicenses : 0
// DisplayName : REG_SZ : "Windows NT Server"
// FamilyDisplayName : REG_SZ : "Windows NT Server"
// Mode : REG_DWORD : fLicensePerServer ? 1 : 0
// FlipAllow : REG_DWORD : fLicensePerServer ? 1 : 0
DWORD dwType; DWORD dwValue; DWORD cbValue; TCHAR szValue[ 1 + MAX_PATH ];
cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyFilePrint, TEXT( "ConcurrentLimit" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"ConcurrentLimit\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( ( fLicensePerServer ? cPerServerLicenses : 0 ) != dwValue ) ) { printf( "\"ConcurrentLimit\" has incorrect value!\n" ); } else { cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyFilePrint, TEXT( "Mode" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"Mode\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( (DWORD) fLicensePerServer != dwValue ) ) { printf( "\"Mode\" has incorrect value!\n" ); } else { cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyFilePrint, TEXT( "FlipAllow" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"FlipAllow\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( (DWORD) fLicensePerServer != dwValue ) ) { printf( "\"FlipAllow\" has incorrect value!\n" ); } else { cbValue = sizeof( szValue ); winStatus = RegQueryValueEx( hKeyFilePrint, TEXT( "DisplayName" ), NULL, &dwType, (LPBYTE) szValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"DisplayName\" failed, error %lu.\n", winStatus ); } else if ( ( REG_SZ != dwType ) || lstrcmp( TEXT( "Windows NT Server" ), szValue ) ) { printf( "\"DisplayName\" has incorrect value!\n" ); } else { cbValue = sizeof( szValue ); winStatus = RegQueryValueEx( hKeyFilePrint, TEXT( "FamilyDisplayName" ), NULL, &dwType, (LPBYTE) szValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"FamilyDisplayName\" failed, error %lu.\n", winStatus ); } else if ( ( REG_SZ != dwType ) || lstrcmp( TEXT( "Windows NT Server" ), szValue ) ) { printf( "\"FamilyDisplayName\" has incorrect value!\n" ); } else { fSuccess = TRUE; } } } } }
RegCloseKey( hKeyFilePrint ); } }
if ( fSuccess ) { // check EventLog
HKEY hKeyEventLog;
fSuccess = FALSE;
winStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT( "System\\CurrentControlSet\\Services\\EventLog\\Application\\LicenseService" ), 0, KEY_ALL_ACCESS, &hKeyEventLog );
if ( !fShouldBePresent ) { if ( ERROR_SUCCESS == winStatus ) { printf( "\"...\\EventLog\\Application\\LicenseService\" exists but shouldn't!\n" ); } else { fSuccess = TRUE; } } else if ( ERROR_SUCCESS != winStatus ) { printf( "RegOpenKeyEx() on \"...\\EventLog\\Application\\LicenseService\" failed, error %lu.\n", winStatus ); } else { // EventMessageFile : REG_EXPAND_SZ : %SystemRoot%\System32\llsrpc.dll
// TypesSupported : REG_DWORD : 7
DWORD dwType; DWORD dwValue; DWORD cbValue; TCHAR szValue[ 1 + MAX_PATH ];
cbValue = sizeof( dwValue ); winStatus = RegQueryValueEx( hKeyEventLog, TEXT( "TypesSupported" ), NULL, &dwType, (LPBYTE) &dwValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"TypesSupported\" failed, error %lu.\n", winStatus ); } else if ( ( REG_DWORD != dwType ) || ( 7 != dwValue ) ) { printf( "\"TypesSupported\" has incorrect value!\n" ); } else { cbValue = sizeof( szValue ); winStatus = RegQueryValueEx( hKeyEventLog, TEXT( "EventMessageFile" ), NULL, &dwType, (LPBYTE) szValue, &cbValue );
if ( ERROR_SUCCESS != winStatus ) { printf( "RegQueryValueEx() on \"EventMessageFile\" failed, error %lu.\n", winStatus ); } else if ( ( REG_SZ != dwType ) || lstrcmpi( TEXT( "%SystemRoot%\\System32\\llsrpc.dll" ), szValue ) ) { printf( "\"EventMessageFile\" has incorrect value!\n" ); } else { fSuccess = TRUE; } }
RegCloseKey( hKeyEventLog ); } }
if ( !fSuccess ) { printf( "Configuration failed!\n" ); } else { printf( "Configuration succeeded.\n" ); }
return fSuccess; }
|