PHANDLER_ROUTINE* CtrlHandlers;
ULONG NrCtrlHandlers;
ULONG NrAllocatedHandlers;
+BOOL LastCloseNotify = FALSE;
HANDLE InputWaitHandle = INVALID_HANDLE_VALUE;
DPRINT("Ctrl Close Event\n");
break;
+ case CTRL_LAST_CLOSE_EVENT:
+ DPRINT("Ctrl Last Close Event\n");
+ break;
+
case CTRL_LOGOFF_EVENT:
DPRINT("Ctrl Logoff Event\n");
break;
case CTRL_SHUTDOWN_EVENT:
break;
- case 3:
- ExitThread(0);
+ case CTRL_LAST_CLOSE_EVENT:
+ /*
+ * In case the console app hasn't register for last close notification,
+ * just kill this console handler thread. We don't want that such apps
+ * get killed for unexpected reasons. On the contrary apps that registered
+ * can be killed because they expect to be.
+ */
+ if (!LastCloseNotify) ExitThread(0);
break;
case 4:
switch(nCode)
{
case CTRL_CLOSE_EVENT:
+ case CTRL_LAST_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
- case 3:
nExitCode = CodeAndFlag;
break;
}
BOOL bInheritHandle,
DWORD dwOptions)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_DUPLICATEHANDLE DuplicateHandleRequest = &ApiMessage.Data.DuplicateHandleRequest;
(!(dwOptions & DUPLICATE_SAME_ACCESS) &&
(dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE))) )
{
- SetLastError (ERROR_INVALID_PARAMETER);
+ SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
- DuplicateHandleRequest->ConsoleHandle = hConsole;
- DuplicateHandleRequest->Access = dwDesiredAccess;
- DuplicateHandleRequest->Inheritable = bInheritHandle;
- DuplicateHandleRequest->Options = dwOptions;
+ DuplicateHandleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ DuplicateHandleRequest->SourceHandle = hConsole;
+ DuplicateHandleRequest->DesiredAccess = dwDesiredAccess;
+ DuplicateHandleRequest->InheritHandle = bInheritHandle;
+ DuplicateHandleRequest->Options = dwOptions;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepDuplicateHandle),
- sizeof(CONSOLE_DUPLICATEHANDLE));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepDuplicateHandle),
+ sizeof(*DuplicateHandleRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return INVALID_HANDLE_VALUE;
}
- return DuplicateHandleRequest->ConsoleHandle;
+ return DuplicateHandleRequest->TargetHandle;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+GetConsoleHandleInformation(IN HANDLE hHandle,
+ OUT LPDWORD lpdwFlags)
+{
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETHANDLEINFO GetHandleInfoRequest = &ApiMessage.Data.GetHandleInfoRequest;
+
+ GetHandleInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetHandleInfoRequest->Handle = hHandle;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetHandleInformation),
+ sizeof(*GetHandleInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
+
+ *lpdwFlags = GetHandleInfoRequest->Flags;
+
+ return TRUE;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+SetConsoleHandleInformation(IN HANDLE hHandle,
+ IN DWORD dwMask,
+ IN DWORD dwFlags)
+{
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETHANDLEINFO SetHandleInfoRequest = &ApiMessage.Data.SetHandleInfoRequest;
+
+ SetHandleInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetHandleInfoRequest->Handle = hHandle;
+ SetHandleInfoRequest->Mask = dwMask;
+ SetHandleInfoRequest->Flags = dwFlags;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetHandleInformation),
+ sizeof(*SetHandleInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
}
*lpModeFlags = GetDisplayModeRequest->DisplayMode; // ModeFlags
+
return TRUE;
}
*Flags = HardwareStateRequest->Flags;
*State = HardwareStateRequest->State;
+
return TRUE;
}
BOOL bInheritHandle,
DWORD dwShareMode)
{
- NTSTATUS Status = STATUS_SUCCESS;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_OPENCONSOLE OpenConsoleRequest = &ApiMessage.Data.OpenConsoleRequest;
CONSOLE_HANDLE_TYPE HandleType;
- if (wsName && 0 == _wcsicmp(wsName, BaseConInputFileName))
+ if (wsName && (_wcsicmp(wsName, BaseConInputFileName) == 0))
{
HandleType = HANDLE_INPUT;
}
- else if (wsName && 0 == _wcsicmp(wsName, BaseConOutputFileName))
+ else if (wsName && (_wcsicmp(wsName, BaseConOutputFileName) == 0))
{
HandleType = HANDLE_OUTPUT;
}
return INVALID_HANDLE_VALUE;
}
- OpenConsoleRequest->HandleType = HandleType;
- OpenConsoleRequest->Access = dwDesiredAccess;
- OpenConsoleRequest->Inheritable = bInheritHandle;
- OpenConsoleRequest->ShareMode = dwShareMode;
+ OpenConsoleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ OpenConsoleRequest->HandleType = HandleType;
+ OpenConsoleRequest->DesiredAccess = dwDesiredAccess;
+ OpenConsoleRequest->InheritHandle = bInheritHandle;
+ OpenConsoleRequest->ShareMode = dwShareMode;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepOpenConsole),
- sizeof(CONSOLE_OPENCONSOLE));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepOpenConsole),
+ sizeof(*OpenConsoleRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return INVALID_HANDLE_VALUE;
}
- return OpenConsoleRequest->ConsoleHandle;
+ return OpenConsoleRequest->Handle;
}
SetConsoleCursorPosition(HANDLE hConsoleOutput,
COORD dwCursorPosition)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest = &ApiMessage.Data.SetCursorPositionRequest;
- ApiMessage.Data.SetCursorPositionRequest.OutputHandle = hConsoleOutput;
- ApiMessage.Data.SetCursorPositionRequest.Position = dwCursorPosition;
+ SetCursorPositionRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetCursorPositionRequest->OutputHandle = hConsoleOutput;
+ SetCursorPositionRequest->Position = dwCursorPosition;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCursorPosition),
- sizeof(CONSOLE_SETCURSORPOSITION));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCursorPosition),
+ sizeof(*SetCursorPositionRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
GetConsoleMode(HANDLE hConsoleHandle,
LPDWORD lpMode)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &ApiMessage.Data.ConsoleModeRequest;
return FALSE;
}
- ConsoleModeRequest->ConsoleHandle = hConsoleHandle;
+ ConsoleModeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ ConsoleModeRequest->Handle = hConsoleHandle;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetMode),
- sizeof(CONSOLE_GETSETCONSOLEMODE));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetMode),
+ sizeof(*ConsoleModeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- *lpMode = ConsoleModeRequest->ConsoleMode;
+ *lpMode = ConsoleModeRequest->Mode;
+
+ return TRUE;
+}
+
+
+/*--------------------------------------------------------------
+ * SetConsoleMode
+ *
+ * @implemented
+ */
+BOOL
+WINAPI
+SetConsoleMode(HANDLE hConsoleHandle,
+ DWORD dwMode)
+{
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &ApiMessage.Data.ConsoleModeRequest;
+
+ ConsoleModeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ ConsoleModeRequest->Handle = hConsoleHandle;
+ ConsoleModeRequest->Mode = dwMode;
+
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetMode),
+ sizeof(*ConsoleModeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
+ {
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
return TRUE;
}
GetNumberOfConsoleInputEvents(HANDLE hConsoleInput,
LPDWORD lpNumberOfEvents)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_GETNUMINPUTEVENTS GetNumInputEventsRequest = &ApiMessage.Data.GetNumInputEventsRequest;
- GetNumInputEventsRequest->InputHandle = hConsoleInput;
- GetNumInputEventsRequest->NumInputEvents = 0;
+ GetNumInputEventsRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetNumInputEventsRequest->InputHandle = hConsoleInput;
+ GetNumInputEventsRequest->NumberOfEvents = 0;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetNumberOfInputEvents),
- sizeof(CONSOLE_GETNUMINPUTEVENTS));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetNumberOfInputEvents),
+ sizeof(*GetNumInputEventsRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
return FALSE;
}
- *lpNumberOfEvents = GetNumInputEventsRequest->NumInputEvents;
+ *lpNumberOfEvents = GetNumInputEventsRequest->NumberOfEvents;
return TRUE;
}
WINAPI
GetLargestConsoleWindowSize(HANDLE hConsoleOutput)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &ApiMessage.Data.GetLargestWindowSizeRequest;
- GetLargestWindowSizeRequest->OutputHandle = hConsoleOutput;
+ GetLargestWindowSizeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetLargestWindowSizeRequest->OutputHandle = hConsoleOutput;
GetLargestWindowSizeRequest->Size.X = 0;
GetLargestWindowSizeRequest->Size.Y = 0;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetLargestWindowSize),
- sizeof(CONSOLE_GETLARGESTWINDOWSIZE));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetLargestWindowSize),
+ sizeof(*GetLargestWindowSizeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
}
DPRINT1("GetLargestConsoleWindowSize, X = %d, Y = %d\n", GetLargestWindowSizeRequest->Size.X, GetLargestWindowSizeRequest->Size.Y);
GetConsoleCursorInfo(HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &ApiMessage.Data.CursorInfoRequest;
if (!lpConsoleCursorInfo)
{
return FALSE;
}
- ApiMessage.Data.CursorInfoRequest.OutputHandle = hConsoleOutput;
+ CursorInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ CursorInfoRequest->OutputHandle = hConsoleOutput;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCursorInfo),
- sizeof(CONSOLE_GETSETCURSORINFO));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCursorInfo),
+ sizeof(*CursorInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
- *lpConsoleCursorInfo = ApiMessage.Data.CursorInfoRequest.Info;
+ *lpConsoleCursorInfo = CursorInfoRequest->Info;
return TRUE;
}
/*--------------------------------------------------------------
- * GetNumberOfConsoleMouseButtons
- *
- * @unimplemented
- */
-BOOL
-WINAPI
-GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons)
-{
- DPRINT1("GetNumberOfConsoleMouseButtons(0x%p) UNIMPLEMENTED!\n", lpNumberOfMouseButtons);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
-
-
-/*--------------------------------------------------------------
- * SetConsoleMode
+ * SetConsoleCursorInfo
*
* @implemented
*/
BOOL
WINAPI
-SetConsoleMode(HANDLE hConsoleHandle,
- DWORD dwMode)
+SetConsoleCursorInfo(HANDLE hConsoleOutput,
+ CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
- PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &ApiMessage.Data.ConsoleModeRequest;
+ PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &ApiMessage.Data.CursorInfoRequest;
- ConsoleModeRequest->ConsoleHandle = hConsoleHandle;
- ConsoleModeRequest->ConsoleMode = dwMode;
+ CursorInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ CursorInfoRequest->OutputHandle = hConsoleOutput;
+ CursorInfoRequest->Info = *lpConsoleCursorInfo;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetMode),
- sizeof(CONSOLE_GETSETCONSOLEMODE));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCursorInfo),
+ sizeof(*CursorInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
/*--------------------------------------------------------------
- * SetConsoleActiveScreenBuffer
+ * GetNumberOfConsoleMouseButtons
*
- * @implemented
+ * @unimplemented
*/
BOOL
WINAPI
-SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput)
+GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons)
{
- NTSTATUS Status;
- CONSOLE_API_MESSAGE ApiMessage;
-
- ApiMessage.Data.SetScreenBufferRequest.OutputHandle = hConsoleOutput;
-
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetActiveScreenBuffer),
- sizeof(CONSOLE_SETACTIVESCREENBUFFER));
- if (!NT_SUCCESS(Status))
- {
- BaseSetLastNTError(Status);
- return FALSE;
- }
-
- return TRUE;
+ DPRINT1("GetNumberOfConsoleMouseButtons(0x%p) UNIMPLEMENTED!\n", lpNumberOfMouseButtons);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return FALSE;
}
/*--------------------------------------------------------------
- * FlushConsoleInputBuffer
+ * SetConsoleActiveScreenBuffer
*
* @implemented
*/
BOOL
WINAPI
-FlushConsoleInputBuffer(HANDLE hConsoleInput)
+SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest = &ApiMessage.Data.SetScreenBufferRequest;
- ApiMessage.Data.FlushInputBufferRequest.InputHandle = hConsoleInput;
+ SetScreenBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetScreenBufferRequest->OutputHandle = hConsoleOutput;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFlushInputBuffer),
- sizeof(CONSOLE_FLUSHINPUTBUFFER));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetActiveScreenBuffer),
+ sizeof(*SetScreenBufferRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
/*--------------------------------------------------------------
- * SetConsoleScreenBufferSize
+ * FlushConsoleInputBuffer
*
* @implemented
*/
BOOL
WINAPI
-SetConsoleScreenBufferSize(HANDLE hConsoleOutput,
- COORD dwSize)
+FlushConsoleInputBuffer(HANDLE hConsoleInput)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_FLUSHINPUTBUFFER FlushInputBufferRequest = &ApiMessage.Data.FlushInputBufferRequest;
- ApiMessage.Data.SetScreenBufferSizeRequest.OutputHandle = hConsoleOutput;
- ApiMessage.Data.SetScreenBufferSizeRequest.Size = dwSize;
+ FlushInputBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ FlushInputBufferRequest->InputHandle = hConsoleInput;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetScreenBufferSize),
- sizeof(CONSOLE_SETSCREENBUFFERSIZE));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFlushInputBuffer),
+ sizeof(*FlushInputBufferRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
/*--------------------------------------------------------------
- * SetConsoleCursorInfo
+ * SetConsoleScreenBufferSize
*
* @implemented
*/
BOOL
WINAPI
-SetConsoleCursorInfo(HANDLE hConsoleOutput,
- CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
+SetConsoleScreenBufferSize(HANDLE hConsoleOutput,
+ COORD dwSize)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &ApiMessage.Data.SetScreenBufferSizeRequest;
- ApiMessage.Data.CursorInfoRequest.OutputHandle = hConsoleOutput;
- ApiMessage.Data.CursorInfoRequest.Info = *lpConsoleCursorInfo;
+ SetScreenBufferSizeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetScreenBufferSizeRequest->OutputHandle = hConsoleOutput;
+ SetScreenBufferSizeRequest->Size = dwSize;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCursorInfo),
- sizeof(CONSOLE_GETSETCURSORINFO));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetScreenBufferSize),
+ sizeof(*SetScreenBufferSizeRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
BOOL bAbsolute,
CONST SMALL_RECT *lpConsoleWindow)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_SETWINDOWINFO SetWindowInfoRequest = &ApiMessage.Data.SetWindowInfoRequest;
return FALSE;
}
- SetWindowInfoRequest->OutputHandle = hConsoleOutput;
- SetWindowInfoRequest->Absolute = bAbsolute;
- SetWindowInfoRequest->WindowRect = *lpConsoleWindow;
+ SetWindowInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetWindowInfoRequest->OutputHandle = hConsoleOutput;
+ SetWindowInfoRequest->Absolute = bAbsolute;
+ SetWindowInfoRequest->WindowRect = *lpConsoleWindow;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetWindowInfo),
- sizeof(CONSOLE_SETWINDOWINFO));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetWindowInfo),
+ sizeof(*SetWindowInfoRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
SetConsoleTextAttribute(HANDLE hConsoleOutput,
WORD wAttributes)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &ApiMessage.Data.SetTextAttribRequest;
- ApiMessage.Data.SetTextAttribRequest.OutputHandle = hConsoleOutput;
- ApiMessage.Data.SetTextAttribRequest.Attrib = wAttributes;
+ SetTextAttribRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetTextAttribRequest->OutputHandle = hConsoleOutput;
+ SetTextAttribRequest->Attributes = wAttributes;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetTextAttribute),
- sizeof(CONSOLE_SETTEXTATTRIB));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetTextAttribute),
+ sizeof(*SetTextAttribRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
DWORD dwProcessGroupId)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_GENERATECTRLEVENT GenerateCtrlEventRequest = &ApiMessage.Data.GenerateCtrlEventRequest;
if (dwCtrlEvent != CTRL_C_EVENT && dwCtrlEvent != CTRL_BREAK_EVENT)
{
return FALSE;
}
- ApiMessage.Data.GenerateCtrlEventRequest.Event = dwCtrlEvent;
- ApiMessage.Data.GenerateCtrlEventRequest.ProcessGroup = dwProcessGroupId;
+ GenerateCtrlEventRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GenerateCtrlEventRequest->CtrlEvent = dwCtrlEvent;
+ GenerateCtrlEventRequest->ProcessGroupId = dwProcessGroupId;
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGenerateCtrlEvent),
- sizeof(CONSOLE_GENERATECTRLEVENT));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGenerateCtrlEvent),
+ sizeof(*GenerateCtrlEventRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
static DWORD
-IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
+IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD dwNumChars, BOOLEAN bUnicode)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_GETSETCONSOLETITLE TitleRequest = &ApiMessage.Data.TitleRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
- if (nSize == 0) return 0;
+ if (dwNumChars == 0) return 0;
+
+ TitleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ TitleRequest->Length = dwNumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
+ TitleRequest->Unicode = bUnicode;
- TitleRequest->Length = nSize * (bUnicode ? 1 : sizeof(WCHAR));
CaptureBuffer = CsrAllocateCaptureBuffer(1, TitleRequest->Length);
if (CaptureBuffer == NULL)
{
TitleRequest->Length,
(PVOID*)&TitleRequest->Title);
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetTitle),
- sizeof(CONSOLE_GETSETCONSOLETITLE));
- if (!NT_SUCCESS(Status))
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetTitle),
+ sizeof(*TitleRequest));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
CsrFreeCaptureBuffer(CaptureBuffer);
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return 0;
}
- if (bUnicode)
- {
- if (nSize >= sizeof(WCHAR))
- wcscpy((LPWSTR)lpConsoleTitle, TitleRequest->Title);
- }
- else
+ dwNumChars = TitleRequest->Length / (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
+
+ if (dwNumChars > 0)
{
- if (nSize < TitleRequest->Length / sizeof(WCHAR) ||
- !WideCharToMultiByte(CP_ACP, // ANSI code page
- 0, // performance and mapping flags
- TitleRequest->Title, // address of wide-character string
- -1, // number of characters in string
- (LPSTR)lpConsoleTitle, // address of buffer for new string
- nSize, // size of buffer
- NULL, // FAST
- NULL))
- {
- /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
- *(LPSTR)lpConsoleTitle = '\0';
- TitleRequest->Length = 0;
- }
+ memcpy(lpConsoleTitle, TitleRequest->Title, TitleRequest->Length);
+
+ if (bUnicode)
+ ((LPWSTR)lpConsoleTitle)[dwNumChars] = L'\0';
+ else
+ ((LPSTR)lpConsoleTitle)[dwNumChars] = '\0';
}
+
CsrFreeCaptureBuffer(CaptureBuffer);
- return TitleRequest->Length / sizeof(WCHAR);
+ return dwNumChars;
}
}
-/*--------------------------------------------------------------
- * SetConsoleTitleW
- *
- * @implemented
- */
-BOOL
-WINAPI
-SetConsoleTitleW(LPCWSTR lpConsoleTitle)
+static BOOL
+IntSetConsoleTitle(CONST VOID *lpConsoleTitle, DWORD dwNumChars, BOOLEAN bUnicode)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_GETSETCONSOLETITLE TitleRequest = &ApiMessage.Data.TitleRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer;
- TitleRequest->Length = wcslen(lpConsoleTitle) * sizeof(WCHAR);
+ TitleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ TitleRequest->Length = dwNumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
+ TitleRequest->Unicode = bUnicode;
CaptureBuffer = CsrAllocateCaptureBuffer(1, TitleRequest->Length);
if (CaptureBuffer == NULL)
TitleRequest->Length,
(PVOID*)&TitleRequest->Title);
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetTitle),
- sizeof(CONSOLE_GETSETCONSOLETITLE));
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetTitle),
+ sizeof(*TitleRequest));
CsrFreeCaptureBuffer(CaptureBuffer);
- if (!NT_SUCCESS(Status))
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return FALSE;
}
return TRUE;
}
+/*--------------------------------------------------------------
+ * SetConsoleTitleW
+ *
+ * @implemented
+ */
+BOOL
+WINAPI
+SetConsoleTitleW(LPCWSTR lpConsoleTitle)
+{
+ return IntSetConsoleTitle(lpConsoleTitle, wcslen(lpConsoleTitle), TRUE);
+}
+
/*--------------------------------------------------------------
* SetConsoleTitleA
WINAPI
SetConsoleTitleA(LPCSTR lpConsoleTitle)
{
- BOOL Ret;
- ULONG Length = strlen(lpConsoleTitle) + 1;
- LPWSTR WideTitle = HeapAlloc(GetProcessHeap(), 0, Length * sizeof(WCHAR));
-
- if (!WideTitle)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- MultiByteToWideChar(CP_ACP, 0, lpConsoleTitle, -1, WideTitle, Length);
-
- Ret = SetConsoleTitleW(WideTitle);
-
- HeapFree(GetProcessHeap(), 0, WideTitle);
- return Ret;
+ return IntSetConsoleTitle(lpConsoleTitle, strlen(lpConsoleTitle), FALSE);
}
DWORD dwFlags,
LPVOID lpScreenBufferData)
{
- NTSTATUS Status;
CONSOLE_API_MESSAGE ApiMessage;
PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest = &ApiMessage.Data.CreateScreenBufferRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer = NULL;
- PCONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo = /*(PCONSOLE_GRAPHICS_BUFFER_INFO)*/lpScreenBufferData;
+ PCONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo = lpScreenBufferData;
if ( (dwDesiredAccess & ~(GENERIC_READ | GENERIC_WRITE)) ||
(dwShareMode & ~(FILE_SHARE_READ | FILE_SHARE_WRITE)) ||
return INVALID_HANDLE_VALUE;
}
- CreateScreenBufferRequest->ScreenBufferType = dwFlags;
- CreateScreenBufferRequest->Access = dwDesiredAccess;
- CreateScreenBufferRequest->ShareMode = dwShareMode;
- CreateScreenBufferRequest->Inheritable =
+ CreateScreenBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ CreateScreenBufferRequest->DesiredAccess = dwDesiredAccess;
+ CreateScreenBufferRequest->InheritHandle =
(lpSecurityAttributes ? lpSecurityAttributes->bInheritHandle : FALSE);
+ CreateScreenBufferRequest->ShareMode = dwShareMode;
+ CreateScreenBufferRequest->ScreenBufferType = dwFlags;
if (dwFlags == CONSOLE_GRAPHICS_BUFFER)
{
- if (CreateScreenBufferRequest->Inheritable || GraphicsBufferInfo == NULL)
+ if (CreateScreenBufferRequest->InheritHandle || GraphicsBufferInfo == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
if (CaptureBuffer == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
+ return INVALID_HANDLE_VALUE;
}
CsrCaptureMessageBuffer(CaptureBuffer,
(PVOID*)&CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMapInfo);
}
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepCreateScreenBuffer),
- sizeof(CONSOLE_CREATESCREENBUFFER));
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepCreateScreenBuffer),
+ sizeof(*CreateScreenBufferRequest));
- if (CaptureBuffer)
- CsrFreeCaptureBuffer(CaptureBuffer);
+ if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer);
- if (!NT_SUCCESS(Status))
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- BaseSetLastNTError(Status);
+ BaseSetLastNTError(ApiMessage.Status);
return INVALID_HANDLE_VALUE;
}
if (dwFlags == CONSOLE_GRAPHICS_BUFFER && GraphicsBufferInfo)
{
- GraphicsBufferInfo->hMutex = CreateScreenBufferRequest->GraphicsBufferInfo.hMutex ;
- GraphicsBufferInfo->lpBitMap = CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap;
+ GraphicsBufferInfo->hMutex = CreateScreenBufferRequest->hMutex ; // CreateScreenBufferRequest->GraphicsBufferInfo.hMutex ;
+ GraphicsBufferInfo->lpBitMap = CreateScreenBufferRequest->lpBitMap; // CreateScreenBufferRequest->GraphicsBufferInfo.lpBitMap;
}
return CreateScreenBufferRequest->OutputHandle;
}
*lpConsoleSelectionInfo = GetSelectionInfoRequest->Info;
+
return TRUE;
}
}
/*
- * @unimplemented
+ * @implemented
*/
-BOOL
+DWORD
WINAPI
SetLastConsoleEventActive(VOID)
{
- STUB;
- return FALSE;
+ CONSOLE_API_MESSAGE ApiMessage;
+ PCONSOLE_NOTIFYLASTCLOSE NotifyLastCloseRequest = &ApiMessage.Data.NotifyLastCloseRequest;
+
+ /* Set the flag used by the console control dispatcher */
+ LastCloseNotify = TRUE;
+
+ /* Set up the input arguments */
+ NotifyLastCloseRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+
+ /* Call CSRSS; just return the NTSTATUS cast to DWORD */
+ return CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepNotifyLastClose),
+ sizeof(*NotifyLastCloseRequest));
}
/* EOF */