|
|
/*++
Copyright (c) 1985 - 1999, Microsoft Corporation
Module Name:
private.c
Abstract:
This file implements private APIs for Hardware Desktop Support.
Author:
Therese Stowell (thereses) 12-13-1991
Revision History:
Notes:
--*/
#include "precomp.h"
#pragma hdrstop
#pragma hdrstop
#if !defined(BUILD_WOW64)
typedef HANDLE (*PCONVPALFUNC)(HANDLE); PCONVPALFUNC pfnGdiConvertPalette;
#endif //!defined(BUILD_WOW64)
#if !defined(BUILD_WOW6432)
BOOL WINAPI SetConsoleCursor( IN HANDLE hConsoleOutput, IN HCURSOR hCursor )
/*++
Description:
Sets the mouse pointer for the specified screen buffer.
Parameters:
hConsoleOutput - Supplies a console output handle.
hCursor - win32 cursor handle, should be NULL to set the default cursor.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_SETCURSOR_MSG a = &m.u.SetConsoleCursor;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->OutputHandle = hConsoleOutput; a->CursorHandle = hCursor; CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepSetCursor ), sizeof( *a ) ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { return TRUE; }
}
int WINAPI ShowConsoleCursor( IN HANDLE hConsoleOutput, IN BOOL bShow )
/*++
Description:
Sets the mouse pointer visibility counter. If the counter is less than zero, the mouse pointer is not shown.
Parameters:
hOutput - Supplies a console output handle.
bShow - if TRUE, the display count is to be increased. if FALSE, decreased.
Return value:
The return value specifies the new display count.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_SHOWCURSOR_MSG a = &m.u.ShowConsoleCursor;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->OutputHandle = hConsoleOutput; a->bShow = bShow; CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepShowCursor ), sizeof( *a ) ); return a->DisplayCount;
}
HMENU APIENTRY ConsoleMenuControl( IN HANDLE hConsoleOutput, IN UINT dwCommandIdLow, IN UINT dwCommandIdHigh )
/*++
Description:
Sets the command id range for the current screen buffer and returns the menu handle.
Parameters:
hConsoleOutput - Supplies a console output handle.
dwCommandIdLow - Specifies the lowest command id to store in the input buffer.
dwCommandIdHigh - Specifies the highest command id to store in the input buffer.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_MENUCONTROL_MSG a = &m.u.ConsoleMenuControl;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->OutputHandle = hConsoleOutput; a->CommandIdLow =dwCommandIdLow; a->CommandIdHigh = dwCommandIdHigh; CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepMenuControl ), sizeof( *a ) ); return a->hMenu;
}
BOOL APIENTRY SetConsolePaletteInternal( IN HANDLE hConsoleOutput, IN HPALETTE hPalette, IN UINT dwUsage ) {
CONSOLE_API_MSG m; PCONSOLE_SETPALETTE_MSG a = &m.u.SetConsolePalette; NTSTATUS Status;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->OutputHandle = hConsoleOutput; a->hPalette = hPalette; a->dwUsage = dwUsage; CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepSetPalette ), sizeof( *a ) ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { return TRUE; }
}
BOOL APIENTRY SetConsoleDisplayMode( IN HANDLE hConsoleOutput, IN DWORD dwFlags, OUT PCOORD lpNewScreenBufferDimensions )
/*++
Description:
This routine sets the console display mode for an output buffer. This API is only supported on x86 machines. Frame buffer consoles are always windowed.
Parameters:
hConsoleOutput - Supplies a console output handle.
dwFlags - Specifies the display mode. Options are:
CONSOLE_FULLSCREEN_MODE - data is displayed fullscreen
CONSOLE_WINDOWED_MODE - data is displayed in a window
lpNewScreenBufferDimensions - On output, contains the new dimensions of the screen buffer. The dimensions are in rows and columns for textmode screen buffers. Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_SETDISPLAYMODE_MSG a = &m.u.SetConsoleDisplayMode; NTSTATUS Status;
#if !defined(_X86_)
return FALSE; #else
Status = NtCreateEvent(&(a->hEvent), EVENT_ALL_ACCESS, NULL, SynchronizationEvent, (BOOLEAN)FALSE ); if (!NT_SUCCESS(Status)) { SET_LAST_NT_ERROR(Status); return FALSE; }
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->OutputHandle = hConsoleOutput; a->dwFlags = dwFlags;
CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepSetDisplayMode ), sizeof( *a ) ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); NtClose(a->hEvent); return FALSE;
} else { Status = NtWaitForSingleObject(a->hEvent, FALSE, NULL); NtClose(a->hEvent);
if (Status != 0) { SET_LAST_NT_ERROR(Status); return FALSE; } try { *lpNewScreenBufferDimensions = a->ScreenBufferDimensions; } except( EXCEPTION_EXECUTE_HANDLER ) { SET_LAST_ERROR(ERROR_INVALID_ACCESS); return FALSE; } return TRUE; }
#endif
}
BOOL APIENTRY RegisterConsoleVDM( IN DWORD dwRegisterFlags, IN HANDLE hStartHardwareEvent, IN HANDLE hEndHardwareEvent, IN HANDLE hErrorHardwareEvent, IN DWORD Reserved, OUT LPDWORD lpStateLength, OUT PVOID *lpState, IN LPWSTR lpVDMBufferSectionName, IN DWORD dwVDMBufferSectionNameLength, IN COORD VDMBufferSize OPTIONAL, OUT PVOID *lpVDMBuffer )
/*++
Description:
This routine registers the VDM with the console.
Parameters:
hStartHardwareEvent - the event the VDM waits on to be notified of gaining/losing control of the hardware.
hEndHardwareEvent - the event the VDM sets when it is done saving/restoring the hardware.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{ CONSOLE_API_MSG m; PCONSOLE_REGISTERVDM_MSG a = &m.u.RegisterConsoleVDM; PCSR_CAPTURE_HEADER CaptureBuffer;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->RegisterFlags = dwRegisterFlags; if (dwRegisterFlags) { a->StartEvent = hStartHardwareEvent; a->EndEvent = hEndHardwareEvent; a->ErrorEvent = hErrorHardwareEvent; a->VDMBufferSectionNameLength = dwVDMBufferSectionNameLength; a->VDMBufferSize = VDMBufferSize; CaptureBuffer = CsrAllocateCaptureBuffer( 1, dwVDMBufferSectionNameLength ); if (CaptureBuffer == NULL) { SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } CsrCaptureMessageBuffer( CaptureBuffer, lpVDMBufferSectionName, dwVDMBufferSectionNameLength, (PVOID *) &a->VDMBufferSectionName ); } else { CaptureBuffer = NULL; } CsrClientCallServer( (PCSR_API_MSG)&m, CaptureBuffer, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepRegisterVDM ), sizeof( *a ) ); if (CaptureBuffer != NULL) { CsrFreeCaptureBuffer( CaptureBuffer ); } if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { if (dwRegisterFlags) { try { *lpStateLength = a->StateLength; *lpState = a->StateBuffer; *lpVDMBuffer = a->VDMBuffer; } except (EXCEPTION_EXECUTE_HANDLER) { SET_LAST_ERROR(ERROR_INVALID_ACCESS); return FALSE; } } return TRUE; } }
BOOL APIENTRY GetConsoleHardwareState( IN HANDLE hConsoleOutput, OUT PCOORD lpResolution, OUT PCOORD lpFontSize )
/*++
Description:
This routine returns the video resolution and font.
Parameters:
hConsoleOutput - Supplies a console output handle.
lpResolution - Pointer to structure to store screen resolution in. Resolution is returned in pixels.
lpFontSize - Pointer to structure to store font size in. Font size is returned in pixels.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_GETHARDWARESTATE_MSG a = &m.u.GetConsoleHardwareState;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->OutputHandle = hConsoleOutput; CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepGetHardwareState ), sizeof( *a ) ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { try { *lpResolution = a->Resolution; *lpFontSize = a->FontSize; } except( EXCEPTION_EXECUTE_HANDLER ) { SET_LAST_ERROR(ERROR_INVALID_ACCESS); return FALSE; } return TRUE; }
}
BOOL APIENTRY SetConsoleHardwareState( IN HANDLE hConsoleOutput, IN COORD dwResolution, IN COORD dwFontSize )
/*++
Description:
This routine set the video resolution and font.
Parameters:
hConsoleOutput - Supplies a console output handle.
dwResolution - Contains screen resolution to set. Resolution is returned in pixels.
dwFontSize - Contains font size to set. Font size is returned in pixels.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_SETHARDWARESTATE_MSG a = &m.u.SetConsoleHardwareState;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->OutputHandle = hConsoleOutput; a->Resolution = dwResolution; a->FontSize = dwFontSize; CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepSetHardwareState ), sizeof( *a ) ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { return TRUE; }
}
BOOL APIENTRY GetConsoleDisplayMode( OUT LPDWORD lpModeFlags )
/*++
Description:
This routine returns the display mode of the console.
Parameters:
lpModeFlags - pointer to store display mode in.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_GETDISPLAYMODE_MSG a = &m.u.GetConsoleDisplayMode;
a->ConsoleHandle = GET_CONSOLE_HANDLE; CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepGetDisplayMode ), sizeof( *a ) ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { try { *lpModeFlags = a->ModeFlags; } except( EXCEPTION_EXECUTE_HANDLER ) { SET_LAST_ERROR(ERROR_INVALID_ACCESS); return FALSE; } return TRUE; }
}
BOOL APIENTRY SetConsoleKeyShortcuts( IN BOOL bSet, IN BYTE bReserveKeys, IN LPAPPKEY lpAppKeys, IN DWORD dwNumAppKeys )
/*++
Description:
Only one set of key shortcuts is valid per console. Calling SetConsoleKeyShortcuts(set) overwrites any previous settings. SetConsoleKeyShortcuts(!set) removes any shortcuts.
Parameters:
bSet - if TRUE, set shortcuts. else remove shortcuts.
bReserveKeys - byte containing reserve key info.
lpAppKeys - pointer to application-defined shortcut keys. can be null.
dwNumAppKeys - number of app keys contained in lpAppKeys.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_SETKEYSHORTCUTS_MSG a = &m.u.SetConsoleKeyShortcuts; PCSR_CAPTURE_HEADER CaptureBuffer;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->Set = bSet; a->ReserveKeys = bReserveKeys; if (lpAppKeys == NULL || dwNumAppKeys == 0) { a->NumAppKeys = 0; CaptureBuffer = NULL; } else { a->NumAppKeys = dwNumAppKeys; CaptureBuffer = CsrAllocateCaptureBuffer( 1, dwNumAppKeys * sizeof(APPKEY) ); if (CaptureBuffer == NULL) { SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } CsrCaptureMessageBuffer( CaptureBuffer, lpAppKeys, dwNumAppKeys * sizeof(APPKEY), (PVOID *) &a->AppKeys ); }
CsrClientCallServer( (PCSR_API_MSG)&m, CaptureBuffer, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepSetKeyShortcuts ), sizeof( *a ) ); if (CaptureBuffer) CsrFreeCaptureBuffer( CaptureBuffer ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { return TRUE; }
}
BOOL APIENTRY SetConsoleMenuClose( IN BOOL bEnable )
/*++
Description:
This routine returns the display mode of the console.
Parameters:
bEnable - if TRUE, close is enabled in the system menu.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
CONSOLE_API_MSG m; PCONSOLE_SETMENUCLOSE_MSG a = &m.u.SetConsoleMenuClose;
a->ConsoleHandle = GET_CONSOLE_HANDLE; a->Enable = bEnable; CsrClientCallServer( (PCSR_API_MSG)&m, NULL, CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepSetMenuClose ), sizeof( *a ) ); if (!NT_SUCCESS( m.ReturnValue)) { SET_LAST_NT_ERROR(m.ReturnValue); return FALSE; } else { return TRUE; }
}
#endif //!defined(BUILD_WOW6432)
#if !defined(BUILD_WOW64)
BOOL SetConsolePalette( IN HANDLE hConsoleOutput, IN HPALETTE hPalette, IN UINT dwUsage )
/*++
Description:
Sets the palette for the console screen buffer.
Parameters:
hOutput - Supplies a console output handle.
hPalette - Supplies a handle to the palette to set.
dwUsage - Specifies use of the system palette.
SYSPAL_NOSTATIC - System palette contains no static colors except black and white.
SYSPAL_STATIC - System palette contains static colors which will not change when an application realizes its logical palette.
Return value:
TRUE - The operation was successful.
FALSE/NULL - The operation failed. Extended error status is available using GetLastError.
--*/
{
HANDLE hmodGdi; UNICODE_STRING ModuleNameString; NTSTATUS Status;
if ( !pfnGdiConvertPalette ) { RtlInitUnicodeString( &ModuleNameString, L"gdi32" ); Status = LdrLoadDll( UNICODE_NULL, NULL, &ModuleNameString, &hmodGdi ); if ( !NT_SUCCESS(Status) ) { SET_LAST_NT_ERROR(Status); return FALSE; } pfnGdiConvertPalette = (PCONVPALFUNC)GetProcAddress(hmodGdi, "GdiConvertPalette"); if (pfnGdiConvertPalette == NULL) { SET_LAST_NT_ERROR(STATUS_PROCEDURE_NOT_FOUND); return FALSE; }
}
hPalette = (*pfnGdiConvertPalette)(hPalette);
return SetConsolePaletteInternal(hConsoleOutput, hPalette, dwUsage); }
BOOL APIENTRY WriteConsoleInputVDMA( HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsWritten ) { return WriteConsoleInputInternal(hConsoleInput,lpBuffer,nLength,lpNumberOfEventsWritten,FALSE,FALSE); }
BOOL APIENTRY WriteConsoleInputVDMW( HANDLE hConsoleInput, PINPUT_RECORD lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsWritten ) { return WriteConsoleInputInternal(hConsoleInput,lpBuffer,nLength,lpNumberOfEventsWritten,TRUE,FALSE); }
#endif //!defined(BUILD_WOW6432)
|