//------------------------------------------------------------------- // // File: // // Summary; // // Notes; // // History // //------------------------------------------------------------------- #include #include #include #include #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; }