return STATUS_BUFFER_TOO_SMALL;
}
-/*
- if (!Win32CsrValidateBuffer(CsrGetClientThread()->Process, lpTarget,
- ConsoleAlias->TargetLength, 1))
- {
- ConioUnlockConsole(Console);
- return STATUS_ACCESS_VIOLATION;
- }
-*/
-
wcscpy(lpTarget, Entry->lpTarget);
ConsoleAlias->TargetLength = Length;
ConioUnlockConsole(Console);
return STATUS_BUFFER_OVERFLOW;
}
-/*
- if (!Win32CsrValidateBuffer(CsrGetClientThread()->Process,
- GetAllConsoleAliases->AliasesBuffer,
- GetAllConsoleAliases->AliasesBufferLength,
- 1))
- {
- ConioUnlockConsole(Console);
- return STATUS_ACCESS_VIOLATION;
- }
-*/
-
BytesWritten = IntGetAllConsoleAliases(Header,
GetAllConsoleAliases->AliasesBuffer,
GetAllConsoleAliases->AliasesBufferLength);
return STATUS_INVALID_PARAMETER;
}
-/*
- if (!Win32CsrValidateBuffer(CsrGetClientThread()->Process,
- GetConsoleAliasesExes->ExeNames,
- GetConsoleAliasesExes->Length,
- 1))
- {
- ConioUnlockConsole(Console);
- return STATUS_ACCESS_VIOLATION;
- }
-*/
-
BytesWritten = IntGetConsoleAliasesExes(Console->Aliases,
GetConsoleAliasesExes->ExeNames,
GetConsoleAliasesExes->Length);
for (i = 0; i < Length; i++)
{
- if (Console->UnpauseEvent)
- {
-/** FIXME: Added in 47359 for pausing
- Status = NtDuplicateObject(NtCurrentProcess(),
- Console->UnpauseEvent,
- Process->ProcessHandle,
- &WriteConsoleRequest->UnpauseEvent,
- SYNCHRONIZE, 0, 0);
- ConioUnlockScreenBuffer(Buff);
- return (NT_SUCCESS(Status) ? STATUS_PENDING : Status);
-**/
-
- /* Wait on the console unpause event till it becomes signaled */
- WaitForSingleObject(Console->UnpauseEvent, INFINITE);
- }
-
if (Buff->Mode & ENABLE_PROCESSED_OUTPUT)
{
/* --- LF --- */
return Size;
}
+static NTSTATUS
+DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage,
+ IN PCSR_THREAD ClientThread,
+ IN BOOL CreateWaitBlock OPTIONAL);
+
+// Wait function CSR_WAIT_FUNCTION
+static BOOLEAN
+WriteConsoleThread(IN PLIST_ENTRY WaitList,
+ IN PCSR_THREAD WaitThread,
+ IN PCSR_API_MESSAGE WaitApiMessage,
+ IN PVOID WaitContext,
+ IN PVOID WaitArgument1,
+ IN PVOID WaitArgument2,
+ IN ULONG WaitFlags)
+{
+ NTSTATUS Status;
+
+ Status = DoWriteConsole(WaitApiMessage,
+ WaitThread,
+ FALSE);
+
+ if (Status != STATUS_PENDING)
+ {
+ WaitApiMessage->Status = Status;
+ }
+
+ return (Status == STATUS_PENDING ? FALSE : TRUE);
+}
+
+static NTSTATUS
+DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage,
+ IN PCSR_THREAD ClientThread,
+ IN BOOL CreateWaitBlock OPTIONAL)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PCSRSS_WRITE_CONSOLE WriteConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleRequest;
+ PCSRSS_CONSOLE Console;
+ PCSRSS_SCREEN_BUFFER Buff;
+ PCHAR Buffer;
+ DWORD Written = 0;
+ ULONG Length;
+
+ Status = ConioLockScreenBuffer(ConsoleGetPerProcessData(ClientThread->Process), WriteConsoleRequest->ConsoleHandle, &Buff, GENERIC_WRITE);
+ if (!NT_SUCCESS(Status)) return Status;
+
+ Console = Buff->Header.Console;
+
+ // if (Console->PauseFlags & (PAUSED_FROM_KEYBOARD | PAUSED_FROM_SCROLLBAR | PAUSED_FROM_SELECTION))
+ if (Console->PauseFlags && Console->UnpauseEvent != NULL)
+ {
+ if (CreateWaitBlock)
+ {
+ if (!CsrCreateWait(&Console->WriteWaitQueue,
+ WriteConsoleThread,
+ ClientThread,
+ ApiMessage,
+ NULL,
+ NULL))
+ {
+ ConioUnlockScreenBuffer(Buff);
+ return STATUS_NO_MEMORY;
+ }
+ }
+
+ /* Wait until we un-pause the console */
+ ConioUnlockScreenBuffer(Buff);
+ return STATUS_PENDING;
+ }
+
+ if(WriteConsoleRequest->Unicode)
+ {
+ Length = WideCharToMultiByte(Console->OutputCodePage, 0,
+ (PWCHAR)WriteConsoleRequest->Buffer,
+ WriteConsoleRequest->NrCharactersToWrite,
+ NULL, 0, NULL, NULL);
+ Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length);
+ if (Buffer)
+ {
+ WideCharToMultiByte(Console->OutputCodePage, 0,
+ (PWCHAR)WriteConsoleRequest->Buffer,
+ WriteConsoleRequest->NrCharactersToWrite,
+ Buffer, Length, NULL, NULL);
+ }
+ else
+ {
+ Status = STATUS_NO_MEMORY;
+ }
+ }
+ else
+ {
+ Buffer = (PCHAR)WriteConsoleRequest->Buffer;
+ }
+
+ if (Buffer)
+ {
+ if (NT_SUCCESS(Status))
+ {
+ Status = ConioWriteConsole(Console, Buff, Buffer,
+ WriteConsoleRequest->NrCharactersToWrite, TRUE);
+ if (NT_SUCCESS(Status))
+ {
+ Written = WriteConsoleRequest->NrCharactersToWrite;
+ }
+ }
+ if (WriteConsoleRequest->Unicode)
+ {
+ RtlFreeHeap(GetProcessHeap(), 0, Buffer);
+ }
+ }
+
+ WriteConsoleRequest->NrCharactersWritten = Written;
+
+ ConioUnlockScreenBuffer(Buff);
+ return Status;
+}
+
/* PUBLIC APIS ****************************************************************/
Status = ConioLockScreenBuffer(ProcessData, ReadConsoleOutputRequest->ConsoleHandle, &Buff, GENERIC_READ);
if (!NT_SUCCESS(Status)) return Status;
-/*
- if (!Win32CsrValidateBuffer(ProcessData->Process, CharInfo,
- BufferSize.X * BufferSize.Y, sizeof(CHAR_INFO)))
- {
- ConioUnlockScreenBuffer(Buff);
- return STATUS_ACCESS_VIOLATION;
- }
-*/
-
/* FIXME: Is this correct? */
CodePage = ProcessData->Console->OutputCodePage;
{
NTSTATUS Status;
PCSRSS_WRITE_CONSOLE WriteConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleRequest;
- PCHAR Buffer;
- PCSRSS_SCREEN_BUFFER Buff;
- // PCSR_PROCESS Process = CsrGetClientThread()->Process;
- PCSRSS_CONSOLE Console;
- DWORD Written = 0;
- ULONG Length;
- // ULONG CharSize = (WriteConsoleRequest->Unicode ? sizeof(WCHAR) : sizeof(CHAR));
DPRINT("SrvWriteConsole\n");
return STATUS_INVALID_PARAMETER;
}
- Status = ConioLockScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), WriteConsoleRequest->ConsoleHandle, &Buff, GENERIC_WRITE);
- if (!NT_SUCCESS(Status)) return Status;
-
- Console = Buff->Header.Console;
+ Status = DoWriteConsole(ApiMessage,
+ CsrGetClientThread(),
+ TRUE);
-/** FIXME: Added in 47359 for pausing
- if (Console->UnpauseEvent)
- {
- Status = NtDuplicateObject(NtCurrentProcess(),
- Console->UnpauseEvent,
- Process->ProcessHandle,
- &WriteConsoleRequest->UnpauseEvent,
- SYNCHRONIZE, 0, 0);
- ConioUnlockScreenBuffer(Buff);
- return (NT_SUCCESS(Status) ? STATUS_PENDING : Status);
- }
-**/
-
- if(WriteConsoleRequest->Unicode)
- {
- Length = WideCharToMultiByte(Console->OutputCodePage, 0,
- (PWCHAR)WriteConsoleRequest->Buffer,
- WriteConsoleRequest->NrCharactersToWrite,
- NULL, 0, NULL, NULL);
- Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length);
- if (Buffer)
- {
- WideCharToMultiByte(Console->OutputCodePage, 0,
- (PWCHAR)WriteConsoleRequest->Buffer,
- WriteConsoleRequest->NrCharactersToWrite,
- Buffer, Length, NULL, NULL);
- }
- else
- {
- Status = STATUS_NO_MEMORY;
- }
- }
- else
- {
- Buffer = (PCHAR)WriteConsoleRequest->Buffer;
- }
-
- if (Buffer)
- {
- if (NT_SUCCESS(Status))
- {
- Status = ConioWriteConsole(Console, Buff, Buffer,
- WriteConsoleRequest->NrCharactersToWrite, TRUE);
- if (NT_SUCCESS(Status))
- {
- Written = WriteConsoleRequest->NrCharactersToWrite;
- }
- }
- if (WriteConsoleRequest->Unicode)
- {
- RtlFreeHeap(GetProcessHeap(), 0, Buffer);
- }
- }
-
- ConioUnlockScreenBuffer(Buff);
-
- WriteConsoleRequest->NrCharactersWritten = Written;
+ if (Status == STATUS_PENDING)
+ *ReplyCode = CsrReplyPending;
return Status;
}
Console = Buff->Header.Console;
-/*
- if (!Win32CsrValidateBuffer(ProcessData->Process, CharInfo,
- BufferSize.X * BufferSize.Y, sizeof(CHAR_INFO)))
- {
- ConioUnlockScreenBuffer(Buff);
- return STATUS_ACCESS_VIOLATION;
- }
-*/
-
WriteRegion = WriteConsoleOutputRequest->WriteRegion;
SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&WriteRegion));
InitializeListHead(&Console->BufferList);
Console->ActiveBuffer = NULL;
InitializeListHead(&Console->ReadWaitQueue);
+ InitializeListHead(&Console->WriteWaitQueue);
InitializeListHead(&Console->InputEvents);
InitializeListHead(&Console->HistoryBuffers);
Console->CodePage = GetOEMCP();
DPRINT("ConioDeleteConsole\n");
/* TODO: Dereference all the waits in Console->ReadWaitQueue */
+ /* TODO: Dereference all the waits in Console->WriteWaitQueue */
/* Drain input event queue */
while (Console->InputEvents.Flink != &Console->InputEvents)
ConioUnpause(PCSRSS_CONSOLE Console, UINT Flags)
{
Console->PauseFlags &= ~Flags;
+
+ // if ((Console->PauseFlags & (PAUSED_FROM_KEYBOARD | PAUSED_FROM_SCROLLBAR | PAUSED_FROM_SELECTION)) == 0)
if (Console->PauseFlags == 0 && Console->UnpauseEvent)
{
SetEvent(Console->UnpauseEvent);
CloseHandle(Console->UnpauseEvent);
Console->UnpauseEvent = NULL;
+
+ CsrNotifyWait(&Console->WriteWaitQueue,
+ WaitAll,
+ NULL,
+ NULL);
}
}
{
return STATUS_INVALID_PARAMETER;
}
-/*
- if (!Win32CsrValidateBuffer(Process, TitleRequest->Title,
- TitleRequest->Length, 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-*/
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if(NT_SUCCESS(Status))
{
return STATUS_INVALID_PARAMETER;
}
-/*
- if (!Win32CsrValidateBuffer(Process, TitleRequest->Title,
- TitleRequest->Length, 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-*/
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (!NT_SUCCESS(Status))
Buffer = GetProcessListRequest->pProcessIds;
-/*
- if (!Win32CsrValidateBuffer(ProcessData, Buffer, GetProcessListRequest->nMaxIds, sizeof(DWORD)))
- return STATUS_ACCESS_VIOLATION;
-*/
-
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
if (!NT_SUCCESS(Status)) return Status;
{
return STATUS_INVALID_PARAMETER;
}
-/*
- if (!Win32CsrValidateBuffer(ProcessData->Process,
- GetCommandHistoryLength->ExeName.Buffer,
- GetCommandHistoryLength->ExeName.Length, 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-*/
Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (NT_SUCCESS(Status))
{
return STATUS_INVALID_PARAMETER;
}
-/*
- if (!Win32CsrValidateBuffer(ProcessData->Process, Buffer, BufferSize, 1) ||
- !Win32CsrValidateBuffer(ProcessData->Process,
- GetCommandHistory->ExeName.Buffer,
- GetCommandHistory->ExeName.Length, 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-*/
Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (NT_SUCCESS(Status))
{
return STATUS_INVALID_PARAMETER;
}
-/*
- if (!Win32CsrValidateBuffer(ProcessData->Process,
- ExpungeCommandHistory->ExeName.Buffer,
- ExpungeCommandHistory->ExeName.Length, 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-*/
Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (NT_SUCCESS(Status))
{
return STATUS_INVALID_PARAMETER;
}
-/*
- if (!Win32CsrValidateBuffer(ProcessData->Process,
- SetHistoryNumberCommands->ExeName.Buffer,
- SetHistoryNumberCommands->ExeName.Length, 1))
- {
- return STATUS_ACCESS_VIOLATION;
- }
-*/
Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (NT_SUCCESS(Status))