Windows2000/private/ntos/w32/ntcon/client/private.c
2020-09-30 17:12:32 +02:00

699 lines
18 KiB
C

/*++
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
--*/
#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 LPWSTR lpStateSectionName,
IN DWORD dwStateSectionNameLength,
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->VDMBufferSectionNameLength = dwVDMBufferSectionNameLength;
a->VDMBufferSize = VDMBufferSize;
a->StateSectionNameLength = dwStateSectionNameLength;
CaptureBuffer = CsrAllocateCaptureBuffer( 2,
dwStateSectionNameLength+dwVDMBufferSectionNameLength
);
if (CaptureBuffer == NULL) {
SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
CsrCaptureMessageBuffer( CaptureBuffer,
lpStateSectionName,
dwStateSectionNameLength,
(PVOID *) &a->StateSectionName
);
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) {
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)