Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

542 lines
16 KiB

/*++
Copyright (c) 1985 - 1999, Microsoft Corporation
Module Name:
server.h
Abstract:
This module contains the internal structures and definitions used
by the console server.
Author:
Therese Stowell (thereses) 12-Nov-1990
Revision History:
--*/
#ifndef _SERVER_H_
#define _SERVER_H_
//
// This message is used to notify the input thread that a console window should
// go away.
//
typedef struct _CONSOLE_SHARE_ACCESS {
ULONG OpenCount;
ULONG Readers;
ULONG Writers;
ULONG SharedRead;
ULONG SharedWrite;
} CONSOLE_SHARE_ACCESS, *PCONSOLE_SHARE_ACCESS;
#include "input.h"
#include "output.h"
#if defined(FE_IME)
#include "conime.h"
#include "convarea.h"
#endif
typedef struct _CONSOLE_PROCESS_HANDLE {
LIST_ENTRY ListLink;
HANDLE ProcessHandle;
PCSR_PROCESS Process;
ULONG TerminateCount;
LPTHREAD_START_ROUTINE CtrlRoutine;
LPTHREAD_START_ROUTINE PropRoutine;
} CONSOLE_PROCESS_HANDLE, *PCONSOLE_PROCESS_HANDLE;
typedef struct _INPUT_THREAD_INFO {
HANDLE ThreadHandle;
DWORD ThreadId;
HDESK Desktop;
HWINSTA WindowStation;
ULONG WindowCount;
#if defined(FE_IME)
HWND hWndConsoleIME;
#endif
} INPUT_THREAD_INFO, *PINPUT_THREAD_INFO;
typedef struct _INPUT_THREAD_INIT_INFO {
HANDLE ThreadHandle;
HANDLE InitCompleteEventHandle;
HDESK DesktopHandle;
HWINSTA WinstaHandle;
NTSTATUS InitStatus;
} INPUT_THREAD_INIT_INFO, *PINPUT_THREAD_INIT_INFO;
typedef struct _CONSOLE_MSG {
LIST_ENTRY ListLink;
UINT Message;
WPARAM wParam;
LPARAM lParam;
} CONSOLE_MSG, *PCONSOLE_MSG;
typedef struct _CONSOLE_THREAD_MSG {
CONSOLE_MSG;
DWORD dwThreadId;
} CONSOLE_THREAD_MSG, *PCONSOLE_THREAD_MSG;
// Flags flags
#define CONSOLE_IS_ICONIC 0x00000001
#define CONSOLE_OUTPUT_SUSPENDED 0x00000002
#define CONSOLE_HAS_FOCUS 0x00000004
#define CONSOLE_IGNORE_NEXT_MOUSE_INPUT 0x00000008
#define CONSOLE_SELECTING 0x00000010
#define CONSOLE_SCROLLING 0x00000020
#define CONSOLE_DISABLE_CLOSE 0x00000040
#define CONSOLE_NOTIFY_LAST_CLOSE 0x00000080
#define CONSOLE_NO_WINDOW 0x00000100
#define CONSOLE_VDM_REGISTERED 0x00000200
#define CONSOLE_UPDATING_SCROLL_BARS 0x00000400
#define CONSOLE_QUICK_EDIT_MODE 0x00000800
#define CONSOLE_TERMINATING 0x00001000
#define CONSOLE_CONNECTED_TO_EMULATOR 0x00002000
#define CONSOLE_FULLSCREEN_NOPAINT 0x00004000
#define CONSOLE_SHUTTING_DOWN 0x00008000
#define CONSOLE_AUTO_POSITION 0x00010000
#define CONSOLE_IGNORE_NEXT_KEYUP 0x00020000
#define CONSOLE_WOW_REGISTERED 0x00040000
#define CONSOLE_USE_PRIVATE_FLAGS 0x00080000
#define CONSOLE_HISTORY_NODUP 0x00100000
#define CONSOLE_SCROLLBAR_TRACKING 0x00200000
#define CONSOLE_IN_DESTRUCTION 0x00400000
#define CONSOLE_SETTING_WINDOW_SIZE 0x00800000
#define CONSOLE_DEFAULT_BUFFER_SIZE 0x01000000
#define CONSOLE_VDM_HIDDEN_WINDOW 0x02000000
#if defined(FE_SB)
#define CONSOLE_OS2_REGISTERED 0x20000000
#define CONSOLE_OS2_OEM_FORMAT 0x40000000
#if defined(FE_IME)
#define CONSOLE_JUST_VDM_UNREGISTERED 0x80000000
#endif // FE_IME
#endif
#define CONSOLE_SUSPENDED (CONSOLE_OUTPUT_SUSPENDED)
#if DBG
typedef struct _CONSOLE_REF_NODE
{
struct _CONSOLE_REF_NODE *pNext;
PVOID pStackTrace[8];
BOOL bRef;
} CONSOLE_REF_NODE, *PCONSOLE_REF_NODE;
#endif
typedef struct _CONSOLE_INFORMATION {
CRITICAL_SECTION ConsoleLock; // serialize input and output using this
ULONG RefCount;
ULONG WaitCount;
INPUT_INFORMATION InputBuffer;
PSCREEN_INFORMATION CurrentScreenBuffer;
PSCREEN_INFORMATION ScreenBuffers; // singly linked list
HWINSTA hWinSta; // server handle to windowstation
HDESK hDesk; // server handle to desktop
HWND hWnd;
HKL hklActive; // keyboard layout for this console window
HDC hDC; // server side hDC
HMENU hMenu; // handle to system menu
HMENU hHeirMenu; // handle to menu we append to system menu
HPALETTE hSysPalette;
RECT WindowRect;
DWORD ResizeFlags;
LIST_ENTRY OutputQueue;
HANDLE InitEvents[NUMBER_OF_INITIALIZATION_EVENTS];
HANDLE ClientThreadHandle;
LIST_ENTRY ProcessHandleList;
LIST_ENTRY CommandHistoryList;
LIST_ENTRY ExeAliasList;
SHORT NumCommandHistories;
SHORT MaxCommandHistories;
SHORT CommandHistorySize;
USHORT OriginalTitleLength;
USHORT TitleLength;
LPWSTR OriginalTitle;
LPWSTR Title;
DWORD dwHotKey;
HICON hIcon;
HICON hSmIcon;
INT iIconId;
WORD LastAttributes;
BYTE ReserveKeys; // keys reserved by app (i.e. ctrl-esc)
DWORD Flags;
// if a wait has been satisfied, the pointer to the wait queue is stored
// here.
PLIST_ENTRY WaitQueue;
// the following fields are used for selection
DWORD SelectionFlags;
SMALL_RECT SelectionRect;
COORD SelectionAnchor;
COORD TextCursorPosition; // current position on screen (in screen buffer coords).
ULONG TextCursorSize;
BOOLEAN TextCursorVisible; // whether cursor is visible (set by user)
BOOLEAN InsertMode; // used by command line editing
// following fields are used when window is created
WORD wShowWindow;
int dwWindowOriginX;
int dwWindowOriginY;
WORD FullScreenFlags;
WORD PopupCount;
// following fields are used for the VDM
HANDLE VDMStartHardwareEvent;
HANDLE VDMEndHardwareEvent;
HANDLE VDMErrorHardwareEvent;
HANDLE VDMProcessHandle;
HANDLE VDMProcessId;
HANDLE VDMBufferSectionHandle;
PCHAR_INFO VDMBuffer;
PCHAR_INFO VDMBufferClient;
COORD VDMBufferSize;
HANDLE StateSectionHandle; // used for get/sethardwarestate
PVOID StateBuffer;
PVOID StateBufferClient;
DWORD StateLength;
// the following fields are used for ansi-unicode translation
UINT CP;
UINT OutputCP;
//
// these two fields are used while getting the icon from the
// program manager via DDE.
//
HWND hWndProgMan;
BOOL bIconInit;
HANDLE ConsoleHandle;
ULONG CtrlFlags; // indicates outstanding ctrl requests
ULONG LimitingProcessId;
HANDLE TerminationEvent;
SHORT VerticalClientToWindow;
SHORT HorizontalClientToWindow;
COLORREF ColorTable[ 16 ];
HANDLE hProcessLastNotifyClose; // process handle of last-close-notify
HANDLE ProcessIdLastNotifyClose; // process unique id of last-close-notify
HWND hWndProperties;
PINPUT_THREAD_INFO InputThreadInfo; // console thread info
LIST_ENTRY MessageQueue;
#if defined(FE_SB)
CPINFO CPInfo;
CPINFO OutputCPInfo;
DWORD ReadConInpNumBytesUnicode;
DWORD ReadConInpNumBytesTemp;
DWORD WriteConOutNumBytesUnicode;
DWORD WriteConOutNumBytesTemp;
PVOID lpCookedReadData; // Same as PCOOKED_READ_DATA
PVOID EudcInformation; // Same as PEUDC_INFORMATION
PVOID FontCacheInformation; // Same as PFONT_CACHE_INFORMATION
#if defined(FE_IME)
CONSOLE_IME_INFORMATION ConsoleIme;
#endif // FE_IME
HDC FonthDC; // Double colored DBCS hDC
HBITMAP hBitmap;
#if defined(i386)
SMALL_RECT Os2SavedWindowRect;
#endif
BOOLEAN fVDMVideoMode; // FALSE : VGA Format
// TRUE : Common LVB Format
BOOLEAN fIsDBCSCP;
BOOLEAN fIsDBCSOutputCP;
#endif
/*
* Instrumentation for Windows Bug 499641.
*/
#if DBG
PVOID ConnectStack[16];
PVOID DisconnectStack[16];
PCONSOLE_REF_NODE pRefNodes;
#endif
HANDLE UnlockConsoleOwningThread;
DWORD UnlockConsoleSkipCount;
} CONSOLE_INFORMATION, *PCONSOLE_INFORMATION;
//
// CtrlFlags definitions
//
#define CONSOLE_CTRL_C_FLAG 1
#define CONSOLE_CTRL_BREAK_FLAG 2
#define CONSOLE_CTRL_CLOSE_FLAG 4
#define CONSOLE_FORCE_SHUTDOWN_FLAG 8
#define CONSOLE_CTRL_LOGOFF_FLAG 16
#define CONSOLE_CTRL_SHUTDOWN_FLAG 32
#define ADD_SCROLL_BARS_X 0x1
#define REMOVE_SCROLL_BARS_X 0x2
#define ADD_SCROLL_BARS_Y 0x4
#define REMOVE_SCROLL_BARS_Y 0x8
#define RESIZE_SCROLL_BARS 0x10
#define SCROLL_BAR_CHANGE (ADD_SCROLL_BARS_X | REMOVE_SCROLL_BARS_X | ADD_SCROLL_BARS_Y | REMOVE_SCROLL_BARS_Y | RESIZE_SCROLL_BARS)
#define BORDER_CHANGE 0x20
#define SCREEN_BUFFER_CHANGE 0x40
#define CONSOLE_INITIAL_IO_HANDLES 3
#define CONSOLE_IO_HANDLE_INCREMENT 3
#define CONSOLE_FREE_HANDLE 0
//#define CONSOLE_INPUT_HANDLE 1
//#define CONSOLE_OUTPUT_HANDLE 2
#define CONSOLE_GRAPHICS_OUTPUT_HANDLE 4
#define CONSOLE_INHERITABLE 8
#define CONSOLE_ANY_HANDLE ((ULONG)(-1))
//
// input handle flags
//
#define HANDLE_CLOSING 1
#define HANDLE_INPUT_PENDING 2
#define HANDLE_MULTI_LINE_INPUT 4
typedef struct _HANDLE_DATA {
ULONG HandleType;
ACCESS_MASK Access;
ULONG ShareAccess;
union {
PSCREEN_INFORMATION ScreenBuffer;
PINPUT_INFORMATION InputBuffer;
} Buffer;
PINPUT_READ_HANDLE_DATA InputReadData; // used only by input reads
} HANDLE_DATA, *PHANDLE_DATA;
typedef struct _CONSOLE_PER_PROCESS_DATA {
HANDLE ConsoleHandle;
HANDLE_DATA HandleTable[CONSOLE_INITIAL_IO_HANDLES];
ULONG HandleTableSize;
PHANDLE_DATA HandleTablePtr;
BOOLEAN ConsoleApp;
BOOLEAN RootProcess;
DWORD ParentProcessId;
#if defined(FE_IME)
HDESK hDesk;
HWINSTA hWinSta;
#endif
} CONSOLE_PER_PROCESS_DATA, *PCONSOLE_PER_PROCESS_DATA;
#define CONSOLE_INITIAL_CONSOLES 10
#define CONSOLE_CONSOLE_HANDLE_INCREMENT 5
#define CONSOLE_HANDLE_ALLOCATED 1
#define INDEX_TO_HANDLE(INDEX) ((HANDLE)(((ULONG_PTR)INDEX << 2) | CONSOLE_HANDLE_SIGNATURE))
#define HANDLE_TO_INDEX(CONHANDLE) ((HANDLE)((ULONG_PTR)CONHANDLE >> 2))
#define INPUT_MODES (ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT)
#define OUTPUT_MODES (ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT)
#define PRIVATE_MODES (ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE | ENABLE_PRIVATE_FLAGS)
#define CURSOR_PERCENTAGE_TO_TOP_SCAN_LINE(FONTSIZE,PERCENTAGE) ((FONTSIZE) - ((FONTSIZE) * (PERCENTAGE) / 100))
#define ConsoleLocked(CONSOLEPTR) (((CONSOLEPTR)->ConsoleLock.OwningThread) == NtCurrentTeb()->ClientId.UniqueThread)
#define CONSOLE_STATUS_WAIT ((NTSTATUS)0xC0030001L)
#define CONSOLE_STATUS_READ_COMPLETE ((NTSTATUS)0xC0030002L)
#define CONSOLE_STATUS_WAIT_NO_BLOCK ((NTSTATUS)0xC0030003L)
#define CM_CREATE_CONSOLE_WINDOW (WM_USER+0)
#define CM_DESTROY_WINDOW (WM_USER+1)
#define CM_SET_WINDOW_SIZE (WM_USER+2)
#define CM_BEEP (WM_USER+3)
#define CM_UPDATE_SCROLL_BARS (WM_USER+4)
#define CM_UPDATE_TITLE (WM_USER+5)
//
// CM_MODE_TRANSITION is hard-coded to WM_USER+6 in kernel\winmgr.c
//
#define CM_MODE_TRANSITION (WM_USER+6)
#define CM_CONSOLE_SHUTDOWN (WM_USER+7)
#define CM_HIDE_WINDOW (WM_USER+8)
#if defined(FE_IME)
#define CM_CONIME_CREATE (WM_USER+9)
#define CM_SET_CONSOLEIME_WINDOW (WM_USER+10)
#define CM_WAIT_CONIME_PROCESS (WM_USER+11)
#define CM_SET_IME_CODEPAGE (WM_USER+12)
#define CM_SET_NLSMODE (WM_USER+13)
#define CM_GET_NLSMODE (WM_USER+14)
#define CM_CONIME_KL_ACTIVATE (WM_USER+15)
#endif
#define CM_CONSOLE_MSG (WM_USER+16)
#define CM_CONSOLE_INPUT_THREAD_MSG (WM_USER+17)
#define CONSOLE_CLIENTTHREADHANDLE(pcsrthread) ((pcsrthread)->ThreadHandle)
#define CONSOLE_CLIENTPROCESSHANDLE() \
((CSR_SERVER_QUERYCLIENTTHREAD())->Process->ProcessHandle)
#define CONSOLE_CLIENTPROCESSID() \
((CSR_SERVER_QUERYCLIENTTHREAD())->Process->ClientId.UniqueProcess)
#define CONSOLE_FROMPROCESSPROCESSHANDLE(pcsrprocess) \
((pcsrprocess)->ProcessHandle)
#define CONSOLE_FROMPROCESSPERPROCESSDATA(pcsrprocess) \
((pcsrprocess)->ServerDllPerProcessData[CONSRV_SERVERDLL_INDEX])
#define CONSOLE_FROMTHREADPERPROCESSDATA(pcsrthread) \
CONSOLE_FROMPROCESSPERPROCESSDATA((pcsrthread)->Process)
#define CONSOLE_PERPROCESSDATA() \
CONSOLE_FROMTHREADPERPROCESSDATA(CSR_SERVER_QUERYCLIENTTHREAD())
#define CONSOLE_GETCONSOLEAPP() (((PCONSOLE_PER_PROCESS_DATA)CONSOLE_PERPROCESSDATA())->ConsoleApp)
#define CONSOLE_GETCONSOLEAPPFROMPROCESSDATA(PROCESSDATA) ((PROCESSDATA)->ConsoleApp)
#define CONSOLE_SETCONSOLEAPP(VALUE) (((PCONSOLE_PER_PROCESS_DATA)CONSOLE_PERPROCESSDATA())->ConsoleApp = VALUE)
#define CONSOLE_SETCONSOLEAPPFROMPROCESSDATA(PROCESSDATA,VALUE) ((PROCESSDATA)->ConsoleApp = VALUE)
#define CONSOLE_GETCONSOLEHANDLE() (((PCONSOLE_PER_PROCESS_DATA)CONSOLE_PERPROCESSDATA())->ConsoleHandle)
#define CONSOLE_SETCONSOLEHANDLE(VALUE) (((PCONSOLE_PER_PROCESS_DATA)CONSOLE_PERPROCESSDATA())->ConsoleHandle = VALUE)
#define CONSOLE_GETCONSOLEHANDLEFROMPROCESSDATA(PROCESSDATA) ((PROCESSDATA)->ConsoleHandle)
#define CONSOLE_SETCONSOLEHANDLEFROMPROCESSDATA(PROCESSDATA,VALUE) ((PROCESSDATA)->ConsoleHandle = VALUE)
#endif
//
// registry information structure
//
typedef struct _CONSOLE_REGISTRY_INFO {
COORD ScreenBufferSize;
COORD WindowSize;
COORD WindowOrigin;
COORD FontSize;
UINT FontFamily;
UINT FontWeight;
WCHAR FaceName[LF_FACESIZE];
UINT CursorSize;
BOOL FullScreen;
BOOL QuickEdit;
BOOL InsertMode;
BOOL AutoPosition;
CHAR_INFO ScreenFill;
CHAR_INFO PopupFill;
UINT HistoryBufferSize;
UINT NumberOfHistoryBuffers;
BOOL HistoryNoDup;
COLORREF ColorTable[ 16 ];
LONGLONG LastWriteTime;
#if defined(FE_SB) // scotthsu
DWORD CodePage;
#endif
} CONSOLE_REGISTRY_INFO, *PCONSOLE_REGISTRY_INFO;
//
// window class
//
#define CONSOLE_WINDOW_CLASS (L"ConsoleWindowClass")
#define CONSOLE_MAX_APP_SHORTCUTS 1
//
// this structure is used to store relevant information from the
// console for ctrl processing so we can do it without holding the
// console lock.
//
typedef struct _CONSOLE_PROCESS_TERMINATION_RECORD {
HANDLE ProcessHandle;
ULONG TerminateCount;
BOOL bDebugee;
LPTHREAD_START_ROUTINE CtrlRoutine;
} CONSOLE_PROCESS_TERMINATION_RECORD, *PCONSOLE_PROCESS_TERMINATION_RECORD;
//
// this value is used to determine the size of stack buffers for
// strings. it should be long enough to contain the width of a
// normal screen buffer.
//
#define STACK_BUFFER_SIZE 132
//
// link information
//
#define LINK_PROP_MAIN_SIG 0x00000001
#define LINK_PROP_NT_CONSOLE_SIG 0x00000002
#if 0 // no one currently uses this...
typedef struct {
WCHAR pszLinkName[ MAX_PATH ];
WCHAR pszName[ MAX_PATH ];
WCHAR pszRelPath[ MAX_PATH ];
WCHAR pszWorkingDir[ MAX_PATH ];
WCHAR pszArgs[ MAX_PATH ];
WCHAR pszIconLocation[ MAX_PATH ];
int iIcon;
int iShowCmd;
int wHotKey;
} LNKPROPMAIN, * LPLNKPROPMAIN;
#endif
#ifndef _USERKDX_ /* debugging extensions */
typedef struct {
WCHAR pszName[ MAX_PATH ];
WCHAR pszIconLocation[ MAX_PATH ];
UINT uIcon;
UINT uShowCmd;
UINT uHotKey;
NT_CONSOLE_PROPS console_props;
#ifdef FE_SB
NT_FE_CONSOLE_PROPS fe_console_props;
#endif
} LNKPROPNTCONSOLE, *LPLNKPROPNTCONSOLE;
#endif
#ifndef _USERKDX_ /* debugging extensions */
typedef struct {
LPWSTR pszCurFile; // current file from IPersistFile
LPWSTR pszRelSource; // overrides pszCurFile in relative tracking
LPWSTR pszName; // title on short volumes
LPWSTR pszRelPath;
LPWSTR pszWorkingDir;
LPWSTR pszArgs;
LPWSTR pszIconLocation;
LPSTR pExtraData; // extra data to preserve for future compatibility
SHELL_LINK_DATA sld;
} CShellLink;
#endif