|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: winutil.c
//
// Contents: General Utilities to test ginas
//
// Classes:
//
// Functions:
//
// History: 7-14-94 RichardW Created
//
//----------------------------------------------------------------------------
#include "testgina.h"
DWORD DummySCData = sizeof( DWORD ) ;
typedef struct _WindowMapper { DWORD fMapper; HWND hWnd; DLGPROC DlgProc; struct _WindowMapper * pPrev; LPARAM InitialParameter; } WindowMapper, * PWindowMapper; #define MAPPERFLAG_ACTIVE 1
#define MAPPERFLAG_DIALOG 2
#define MAPPERFLAG_SAS 4
#define MAX_WINDOW_MAPPERS 32
WindowMapper Mappers[MAX_WINDOW_MAPPERS]; DWORD cActiveWindow;
void InitWindowMappers() { ZeroMemory(Mappers, sizeof(WindowMapper) * MAX_WINDOW_MAPPERS); cActiveWindow = 0; }
PWindowMapper LocateTopMappedWindow(void) { int i; for (i = 0; i < MAX_WINDOW_MAPPERS ; i++ ) { if (Mappers[i].fMapper & MAPPERFLAG_SAS) { return(&Mappers[i]); } }
return(NULL);
}
PWindowMapper AllocWindowMapper(void) { int i; PWindowMapper pMap;
for (i = 0 ; i < MAX_WINDOW_MAPPERS ; i++ ) { if ((Mappers[i].fMapper & MAPPERFLAG_ACTIVE) == 0) { cActiveWindow ++; pMap = LocateTopMappedWindow(); if (pMap) { FLAG_OFF(pMap->fMapper, MAPPERFLAG_SAS); }
FLAG_ON(Mappers[i].fMapper, MAPPERFLAG_ACTIVE | MAPPERFLAG_SAS); Mappers[i].pPrev = pMap;
return(&Mappers[i]); } } return(NULL); }
PWindowMapper LocateWindowMapper(HWND hWnd) { int i;
for (i = 0; i < MAX_WINDOW_MAPPERS ; i++ ) { if (Mappers[i].hWnd == hWnd) { return(&Mappers[i]); } }
return(NULL); }
void FreeWindowMapper(PWindowMapper pMap) { pMap->hWnd = NULL; pMap->DlgProc = NULL; if (pMap->fMapper & MAPPERFLAG_SAS) { if (pMap->pPrev) { FLAG_ON(pMap->pPrev->fMapper, MAPPERFLAG_SAS); } } pMap->fMapper = 0; pMap->pPrev = NULL; cActiveWindow--; }
#define CALAIS_PATH TEXT("Software\\Microsoft\\Cryptography\\Calais")
BOOL IsSmartCardReaderPresent( VOID ) { HKEY hKey ; int err ;
err = RegOpenKeyEx( HKEY_LOCAL_MACHINE, CALAIS_PATH, 0, KEY_READ, &hKey );
if ( err == 0 ) { RegCloseKey( hKey );
return TRUE ; } else { return FALSE ; }
}
//+---------------------------------------------------------------------------
//
// Function: RootWndProc
//
// Synopsis: This is the base window proc for all testgina windows.
//
// Arguments: [hWnd] --
// [Message] --
// [wParam] --
// [lParam] --
//
// History: 7-18-94 RichardW Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CALLBACK RootDlgProc( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { PWindowMapper pMap; int res; BOOL bRet;
//
// If this is a WM_INITDIALOG message, then the parameter is the mapping,
// which needs to have a hwnd associated with it. Otherwise, do the normal
// preprocessing.
//
if (Message == WM_INITDIALOG) { pMap = (PWindowMapper) lParam; pMap->hWnd = hWnd; lParam = pMap->InitialParameter; } else { pMap = LocateWindowMapper(hWnd); if (!pMap) { return(FALSE); } }
bRet = pMap->DlgProc(hWnd, Message, wParam, lParam); if (!bRet) { if (Message == WM_INITDIALOG) { return(bRet); } if (Message == WLX_WM_SAS) { switch (wParam) { case WLX_SAS_TYPE_CTRL_ALT_DEL: default: res = WLX_DLG_SAS; break;
case WLX_SAS_TYPE_TIMEOUT: res = WLX_DLG_INPUT_TIMEOUT; break; case WLX_SAS_TYPE_SCRNSVR_TIMEOUT: res = WLX_DLG_SCREEN_SAVER_TIMEOUT; break; case WLX_SAS_TYPE_USER_LOGOFF: res = WLX_DLG_USER_LOGOFF; break; } if (res) { EndDialog(hWnd, res); bRet = TRUE; } else { TestGinaError(GINAERR_INVALID_SAS_CODE, TEXT("RootDlgProc")); } } }
return(bRet);
}
PingSAS(DWORD SasType) { PWindowMapper pMap;
if (cActiveWindow) { pMap = LocateTopMappedWindow();
if (!pMap) { TestGinaError(GINAERR_NO_WINDOW_FOR_SAS, TEXT("PingSAS")); }
PostMessage(pMap->hWnd, WLX_WM_SAS, (WPARAM) SasType, 0); }
UpdateGinaState(UPDATE_SAS_RECEIVED);
switch (GinaState) { case Winsta_NoOne_SAS: TestLoggedOutSAS(SasType); break; case Winsta_LoggedOn_SAS: TestLoggedOnSAS(SasType); break; case Winsta_Locked_SAS: TestWkstaLockedSAS(SasType); break; default: TestGinaError(0, TEXT("PingSAS"));
} return(0); }
VOID WINAPI WlxUseCtrlAltDel(HANDLE hWlx) { if (!VerifyHandle(hWlx)) { TestGinaError(GINAERR_INVALID_HANDLE, TEXT("WlxUserCtrlAltDel")); }
fTestGina |= GINA_USE_CAD;
}
VOID WINAPI WlxSetContextPointer( HANDLE hWlx, PVOID pvContext) { if (!VerifyHandle(hWlx)) { TestGinaError(GINAERR_INVALID_HANDLE, TEXT("WlxSetContextPointer")); }
StashContext(pvContext); }
VOID WINAPI WlxSasNotify(HANDLE hWlx, DWORD dwSasType) { if (!VerifyHandle(hWlx)) { TestGinaError(GINAERR_INVALID_HANDLE, TEXT("WlxSasNotify")); }
if (fTestGina & GINA_USE_CAD) { if (dwSasType == WLX_SAS_TYPE_CTRL_ALT_DEL) { TestGinaError(GINAERR_IMPROPER_CAD, TEXT("WlxSasNotify")); } }
PingSAS(dwSasType); }
BOOL WINAPI WlxSetTimeout( HANDLE hWlx, DWORD dwTimeout) { if (!VerifyHandle(hWlx)) { TestGinaError(GINAERR_INVALID_HANDLE, TEXT("WlxSetTimeout")); }
if (dwTimeout < 300) { return(TRUE); } return(FALSE);
}
int WINAPI WlxAssignShellProtection( HANDLE hWlx, HANDLE hToken, HANDLE hProcess, HANDLE hThread) { if (!VerifyHandle(hWlx)) { TestGinaError(GINAERR_INVALID_HANDLE, TEXT("WlxAssignShellProtection")); }
return(0); }
int WINAPI WlxMessageBox( HANDLE hWlx, HWND hWnd, LPWSTR lpsz1, LPWSTR lpsz2, UINT fmb) { if (!VerifyHandle(hWlx)) { TestGinaError(GINAERR_INVALID_HANDLE, TEXT("WlxMessageBox")); } return MessageBoxW(hWnd, lpsz1, lpsz2, fmb); }
int WINAPI WlxDialogBox( HANDLE hWlx, HANDLE hInstance, LPWSTR lpsz1, HWND hWnd, DLGPROC dlgproc) { return(WlxDialogBoxParam(hWlx, hInstance, lpsz1, hWnd, dlgproc, 0)); }
int WINAPI WlxDialogBoxIndirect( HANDLE hWlx, HANDLE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWnd, DLGPROC dlgproc) { return(WlxDialogBoxIndirectParam(hWlx, hInstance, lpTemplate, hWnd, dlgproc, 0)); }
int WINAPI WlxDialogBoxParam( HANDLE hWlx, HANDLE hInstance, LPWSTR lpsz1, HWND hWnd, DLGPROC dlgproc, LPARAM lParam) { PWindowMapper pMap; int res; char buf[256];
if (!VerifyHandle(hWlx)) { TestGinaError(GINAERR_INVALID_HANDLE, TEXT("WlxDialogBoxParam")); }
pMap = AllocWindowMapper();
pMap->InitialParameter = lParam; pMap->DlgProc = dlgproc; pMap->fMapper |= MAPPERFLAG_DIALOG;
res = DialogBoxParam(hInstance, lpsz1, hWnd, RootDlgProc, (LPARAM) pMap); if (res == -1) { if ((DWORD) lpsz1 > 0x00010000) { sprintf( buf, "DialogBoxParam(%#x, %ws, %#x, %#x, %#x) failed, error %d\n", hInstance, lpsz1, hWnd, dlgproc, lParam, GetLastError() ); } else { sprintf( buf, "DialogBoxParam(%#x, %#x, %#x, %#x, %#x) failed, error %d\n", hInstance, lpsz1, hWnd, dlgproc, lParam, GetLastError() );
}
MessageBoxA( hMainWindow, buf, "Dialog Error", MB_ICONSTOP | MB_OK ); }
FreeWindowMapper(pMap);
return(res); }
int WINAPI WlxDialogBoxIndirectParam( HANDLE hWlx, HANDLE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWnd, DLGPROC dlgproc, LPARAM lParam) { if (!VerifyHandle(hWlx)) { TestGinaError(GINAERR_INVALID_HANDLE, TEXT("WlxUserCtrlAltDel")); } return(DialogBoxIndirectParam(hInstance, lpTemplate, hWnd, dlgproc, lParam)); }
int WINAPI WlxSwitchDesktopToUser( HANDLE hWlx) { if ( !VerifyHandle( hWlx ) ) { TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxSwitchDesktopToUser")); }
return( 0 ); }
int WINAPI WlxSwitchDesktopToWinlogon( HANDLE hWlx) { if ( !VerifyHandle( hWlx ) ) { TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxSwitchDesktopToWinlogon")); }
return( 0 ); }
int WINAPI WlxChangePasswordNotify( HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo) { if ( !VerifyHandle( hWlx ) ) { TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxChangePasswordNotify")); }
GlobalMprInfo = *pMprInfo; wcscpy( GlobalProviderName, TEXT("All") );
return( 0 );
}
int WINAPI WlxChangePasswordNotifyEx( HANDLE hWlx, PWLX_MPR_NOTIFY_INFO pMprInfo, DWORD dwChangeInfo, PWSTR ProviderName, PVOID Reserved) { if ( !VerifyHandle( hWlx ) ) { TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxChangePasswordNotifyEx")); }
GlobalMprInfo = *pMprInfo; wcscpy( GlobalProviderName, ProviderName );
return( 0 );
}
BOOL WINAPI WlxSetOption( HANDLE hWlx, DWORD Option, ULONG_PTR Value, ULONG_PTR * OldValue) { ULONG_PTR * Item ; ULONG_PTR Dummy ;
if ( !VerifyHandle( hWlx ) ) { TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxSetOption") ); }
Item = &Dummy ;
switch ( Option ) { case WLX_OPTION_USE_CTRL_ALT_DEL: Dummy = (BOOL) ((fTestGina & GINA_USE_CAD) != 0); fTestGina |= GINA_USE_CAD; break;
case WLX_OPTION_CONTEXT_POINTER: Item = (PDWORD) &pWlxContext ; break;
case WLX_OPTION_USE_SMART_CARD: Dummy = (BOOL) ((fTestGina & GINA_USE_SC) != 0); fTestGina |= GINA_USE_SC ; break;
default: SetLastError( ERROR_INVALID_PARAMETER ); return FALSE ; }
if ( Item ) { if ( OldValue ) { *OldValue = *Item ; }
*Item = Value ; }
return TRUE ; }
BOOL WINAPI WlxGetOption( HANDLE hWlx, DWORD Option, ULONG_PTR * Value) { ULONG_PTR * Item ; ULONG_PTR Dummy ;
if ( !VerifyHandle( hWlx ) ) { TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxSetOption") ); }
Item = &Dummy ;
switch ( Option ) { case WLX_OPTION_USE_CTRL_ALT_DEL: Dummy = (BOOL) ((fTestGina & GINA_USE_CAD) != 0); break;
case WLX_OPTION_CONTEXT_POINTER: Item = (ULONG_PTR *) &pWlxContext ; break;
case WLX_OPTION_USE_SMART_CARD: Dummy = (BOOL) ((fTestGina & GINA_USE_SC) != 0); break;
case WLX_OPTION_SMART_CARD_PRESENT : Dummy = IsSmartCardReaderPresent() ; break;
case WLX_OPTION_SMART_CARD_INFO : Dummy = (ULONG_PTR)& DummySCData ; Item = (ULONG_PTR *) &Dummy ; break;
case WLX_OPTION_DISPATCH_TABLE_SIZE: Dummy = sizeof( WlxDispatchTable ); Item = (ULONG_PTR *) &Dummy ; break;
default: SetLastError( ERROR_INVALID_PARAMETER ); return FALSE ; }
if ( Item ) { if ( Value ) { *Value = *Item ; return TRUE ; }
}
return FALSE ; }
VOID WINAPI WlxWin31Migrate( HANDLE hWlx ) { if ( !VerifyHandle( hWlx ) ) { TestGinaError( GINAERR_INVALID_HANDLE, TEXT("WlxSetOption") ); } }
BOOL WINAPI WlxQueryClientCredentials( PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred ) { return FALSE ; }
BOOL WINAPI WlxQueryICCredentials( PWLX_CLIENT_CREDENTIALS_INFO_V1_0 pCred ) { return FALSE ; }
BOOL WINAPI WlxDisconnect( VOID ) { return FALSE ; }
struct _BitsToMenu { DWORD Bits; DWORD Menu; } MenuBarControl[] = { { GINA_DLL_KNOWN, IDM_DLL_RUN }, { GINA_NEGOTIATE_OK, IDM_WHACK_NEGOTIATE }, { GINA_INITIALIZE_OK, IDM_WHACK_INITIALIZE }, { GINA_DISPLAY_OK, IDM_WHACK_DISPLAY }, { GINA_LOGGEDOUT_OK, IDM_WHACK_LOGGEDOUT }, { GINA_ACTIVATE_OK, IDM_WHACK_STARTSHELL }, { GINA_LOGGEDON_OK, IDM_WHACK_LOGGEDON }, { GINA_DISPLAYLOCK_OK, IDM_WHACK_DISPLAYLOCKED}, { GINA_WKSTALOCK_OK, IDM_WHACK_LOCKED }, { GINA_LOGOFF_OK, IDM_WHACK_LOGOFF }, { GINA_SHUTDOWN_OK, IDM_WHACK_SHUTDOWN }, { GINA_ISLOCKOK_OK, IDM_WHACK_LOCKOK }, { GINA_ISLOGOFFOK_OK, IDM_WHACK_LOGOFFOK }, { GINA_RESTART_OK, IDM_WHACK_RESTARTSHELL }, { GINA_SCREENSAVE_OK, IDM_WHACK_SCREENSAVE },
};
int UpdateMenuBar(void) { HMENU hMenu; int i;
hMenu = GetMenu(hMainWindow);
for (i = 0; i < (sizeof(MenuBarControl) / sizeof(struct _BitsToMenu)) ; i++ ) { if (TEST_FLAG(fTestGina, MenuBarControl[i].Bits)) { EnableMenuItem(hMenu, MenuBarControl[i].Menu, MF_BYCOMMAND | MF_ENABLED); } else { EnableMenuItem(hMenu, MenuBarControl[i].Menu, MF_BYCOMMAND | MF_GRAYED); } }
return(0); }
VOID EnableOptions(BOOL Enable) { HMENU hMenu; HMENU hOptions; UINT uenable;
hMenu = GetMenu( hMainWindow );
hOptions = GetSubMenu( hMenu, 2 );
if (Enable) { uenable = MF_ENABLED | MF_BYCOMMAND; } else { uenable = MF_GRAYED | MF_BYCOMMAND; }
EnableMenuItem( hMenu, (UINT) hOptions, uenable);
DrawMenuBar( hMainWindow ); }
VOID UpdateSasMenu(VOID) { HMENU hMenu; HMENU hOptions; HMENU hSas; DWORD i; DWORD MenuItem;
hMenu = GetMenu( hMainWindow );
hOptions = GetSubMenu( hMenu, 2 );
hSas = GetSubMenu( hOptions, 0 );
//
// Clean out existing ones
//
DeleteMenu( hSas, IDM_SAS_USERDEF1, MF_BYCOMMAND ); DeleteMenu( hSas, IDM_SAS_USERDEF2, MF_BYCOMMAND ); DeleteMenu( hSas, IDM_SAS_USERDEF3, MF_BYCOMMAND ); DeleteMenu( hSas, IDM_SAS_USERDEF4, MF_BYCOMMAND );
//
// Add in current ones:
//
for (i = 0, MenuItem = IDM_SAS_USERDEF1; i < UserSases ; i++, MenuItem++ ) { AppendMenu( hSas, MF_STRING, MenuItem, UserDefSas[i].Name ); }
}
|