mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 16:52:59 +00:00
[CONSRV] Introduce a set of macros CON_API / CON_API_NOCONSOLE for wrapping around the repetitive prologue/epilogue of every console CSR API entrypoint.
All the per-API message structure unpacking and console validation done with ConSrvGetConsole() is now automatically generated using the macros, so that the actual implementation of each API can be done independently of how the console object is obtained. This could also allow reusing these API implementations with a different mechanism for obtaining the console without changing anything in them.
This commit is contained in:
parent
7173a21f4a
commit
9261110760
10 changed files with 504 additions and 729 deletions
|
@ -446,17 +446,13 @@ IntDeleteAllAliases(PCONSRV_CONSOLE Console)
|
||||||
/* PUBLIC SERVER APIS *********************************************************/
|
/* PUBLIC SERVER APIS *********************************************************/
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepAddAlias */
|
/* API_NUMBER: ConsolepAddAlias */
|
||||||
CSR_API(SrvAddConsoleAlias)
|
CON_API(SrvAddConsoleAlias,
|
||||||
|
CONSOLE_ADDGETALIAS, ConsoleAliasRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleAliasRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PALIAS_HEADER Header;
|
PALIAS_HEADER Header;
|
||||||
PALIAS_ENTRY Entry;
|
PALIAS_ENTRY Entry;
|
||||||
PVOID lpTarget;
|
PVOID lpTarget;
|
||||||
|
|
||||||
DPRINT("SrvAddConsoleAlias entered ApiMessage %p\n", ApiMessage);
|
|
||||||
|
|
||||||
if ( !CsrValidateMessageBuffer(ApiMessage,
|
if ( !CsrValidateMessageBuffer(ApiMessage,
|
||||||
(PVOID*)&ConsoleAliasRequest->Source,
|
(PVOID*)&ConsoleAliasRequest->Source,
|
||||||
ConsoleAliasRequest->SourceLength,
|
ConsoleAliasRequest->SourceLength,
|
||||||
|
@ -475,12 +471,6 @@ CSR_API(SrvAddConsoleAlias)
|
||||||
|
|
||||||
lpTarget = (ConsoleAliasRequest->TargetLength != 0 ? ConsoleAliasRequest->Target : NULL);
|
lpTarget = (ConsoleAliasRequest->TargetLength != 0 ? ConsoleAliasRequest->Target : NULL);
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
Header = IntFindAliasHeader(Console,
|
Header = IntFindAliasHeader(Console,
|
||||||
ConsoleAliasRequest->ExeName,
|
ConsoleAliasRequest->ExeName,
|
||||||
ConsoleAliasRequest->ExeLength,
|
ConsoleAliasRequest->ExeLength,
|
||||||
|
@ -492,10 +482,7 @@ CSR_API(SrvAddConsoleAlias)
|
||||||
ConsoleAliasRequest->ExeLength,
|
ConsoleAliasRequest->ExeLength,
|
||||||
ConsoleAliasRequest->Unicode2);
|
ConsoleAliasRequest->Unicode2);
|
||||||
if (!Header)
|
if (!Header)
|
||||||
{
|
return STATUS_NO_MEMORY;
|
||||||
Status = STATUS_NO_MEMORY;
|
|
||||||
goto Quit;
|
|
||||||
}
|
|
||||||
|
|
||||||
IntInsertAliasHeader(&Console->Aliases, Header);
|
IntInsertAliasHeader(&Console->Aliases, Header);
|
||||||
}
|
}
|
||||||
|
@ -507,10 +494,7 @@ CSR_API(SrvAddConsoleAlias)
|
||||||
ConsoleAliasRequest->SourceLength,
|
ConsoleAliasRequest->SourceLength,
|
||||||
ConsoleAliasRequest->Unicode);
|
ConsoleAliasRequest->Unicode);
|
||||||
if (!Entry)
|
if (!Entry)
|
||||||
{
|
return STATUS_UNSUCCESSFUL;
|
||||||
Status = STATUS_UNSUCCESSFUL;
|
|
||||||
goto Quit;
|
|
||||||
}
|
|
||||||
|
|
||||||
IntDeleteAliasEntry(Header, Entry);
|
IntDeleteAliasEntry(Header, Entry);
|
||||||
}
|
}
|
||||||
|
@ -523,32 +507,23 @@ CSR_API(SrvAddConsoleAlias)
|
||||||
ConsoleAliasRequest->TargetLength,
|
ConsoleAliasRequest->TargetLength,
|
||||||
ConsoleAliasRequest->Unicode);
|
ConsoleAliasRequest->Unicode);
|
||||||
if (!Entry)
|
if (!Entry)
|
||||||
{
|
return STATUS_NO_MEMORY;
|
||||||
Status = STATUS_NO_MEMORY;
|
|
||||||
goto Quit;
|
|
||||||
}
|
|
||||||
|
|
||||||
IntInsertAliasEntry(Header, Entry);
|
IntInsertAliasEntry(Header, Entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
Quit:
|
return STATUS_SUCCESS;
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetAlias */
|
/* API_NUMBER: ConsolepGetAlias */
|
||||||
CSR_API(SrvGetConsoleAlias)
|
CON_API(SrvGetConsoleAlias,
|
||||||
|
CONSOLE_ADDGETALIAS, ConsoleAliasRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleAliasRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PALIAS_HEADER Header;
|
PALIAS_HEADER Header;
|
||||||
PALIAS_ENTRY Entry;
|
PALIAS_ENTRY Entry;
|
||||||
UINT Length;
|
UINT Length;
|
||||||
PVOID lpTarget;
|
PVOID lpTarget;
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleAlias entered ApiMessage %p\n", ApiMessage);
|
|
||||||
|
|
||||||
if ( !CsrValidateMessageBuffer(ApiMessage,
|
if ( !CsrValidateMessageBuffer(ApiMessage,
|
||||||
(PVOID*)&ConsoleAliasRequest->Source,
|
(PVOID*)&ConsoleAliasRequest->Source,
|
||||||
ConsoleAliasRequest->SourceLength,
|
ConsoleAliasRequest->SourceLength,
|
||||||
|
@ -573,37 +548,26 @@ CSR_API(SrvGetConsoleAlias)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Header = IntFindAliasHeader(Console,
|
Header = IntFindAliasHeader(Console,
|
||||||
ConsoleAliasRequest->ExeName,
|
ConsoleAliasRequest->ExeName,
|
||||||
ConsoleAliasRequest->ExeLength,
|
ConsoleAliasRequest->ExeLength,
|
||||||
ConsoleAliasRequest->Unicode2);
|
ConsoleAliasRequest->Unicode2);
|
||||||
if (!Header)
|
if (!Header)
|
||||||
{
|
return STATUS_UNSUCCESSFUL;
|
||||||
Status = STATUS_UNSUCCESSFUL;
|
|
||||||
goto Quit;
|
|
||||||
}
|
|
||||||
|
|
||||||
Entry = IntGetAliasEntry(Console, Header,
|
Entry = IntGetAliasEntry(Console, Header,
|
||||||
ConsoleAliasRequest->Source,
|
ConsoleAliasRequest->Source,
|
||||||
ConsoleAliasRequest->SourceLength,
|
ConsoleAliasRequest->SourceLength,
|
||||||
ConsoleAliasRequest->Unicode);
|
ConsoleAliasRequest->Unicode);
|
||||||
if (!Entry)
|
if (!Entry)
|
||||||
{
|
return STATUS_UNSUCCESSFUL;
|
||||||
Status = STATUS_UNSUCCESSFUL;
|
|
||||||
goto Quit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ConsoleAliasRequest->Unicode)
|
if (ConsoleAliasRequest->Unicode)
|
||||||
{
|
{
|
||||||
Length = Entry->Target.Length + sizeof(WCHAR);
|
Length = Entry->Target.Length + sizeof(WCHAR);
|
||||||
if (Length > ConsoleAliasRequest->TargetLength) // FIXME: Refine computation.
|
if (Length > ConsoleAliasRequest->TargetLength) // FIXME: Refine computation.
|
||||||
{
|
{
|
||||||
Status = STATUS_BUFFER_TOO_SMALL;
|
return STATUS_BUFFER_TOO_SMALL;
|
||||||
goto Quit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlCopyMemory(lpTarget, Entry->Target.Buffer, Entry->Target.Length);
|
RtlCopyMemory(lpTarget, Entry->Target.Buffer, Entry->Target.Length);
|
||||||
|
@ -614,8 +578,7 @@ CSR_API(SrvGetConsoleAlias)
|
||||||
Length = (Entry->Target.Length + sizeof(WCHAR)) / sizeof(WCHAR);
|
Length = (Entry->Target.Length + sizeof(WCHAR)) / sizeof(WCHAR);
|
||||||
if (Length > ConsoleAliasRequest->TargetLength) // FIXME: Refine computation.
|
if (Length > ConsoleAliasRequest->TargetLength) // FIXME: Refine computation.
|
||||||
{
|
{
|
||||||
Status = STATUS_BUFFER_TOO_SMALL;
|
return STATUS_BUFFER_TOO_SMALL;
|
||||||
goto Quit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ConvertInputUnicodeToAnsi(Console,
|
ConvertInputUnicodeToAnsi(Console,
|
||||||
|
@ -624,22 +587,17 @@ CSR_API(SrvGetConsoleAlias)
|
||||||
ConsoleAliasRequest->TargetLength = Length;
|
ConsoleAliasRequest->TargetLength = Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
Quit:
|
return STATUS_SUCCESS;
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetAliases */
|
/* API_NUMBER: ConsolepGetAliases */
|
||||||
CSR_API(SrvGetConsoleAliases)
|
CON_API(SrvGetConsoleAliases,
|
||||||
|
CONSOLE_GETALLALIASES, GetAllAliasesRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETALLALIASES GetAllAliasesRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAllAliasesRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
ULONG BytesWritten = 0;
|
ULONG BytesWritten = 0;
|
||||||
PALIAS_HEADER Header;
|
PALIAS_HEADER Header;
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleAliases entered ApiMessage %p\n", ApiMessage);
|
|
||||||
|
|
||||||
if ( !CsrValidateMessageBuffer(ApiMessage,
|
if ( !CsrValidateMessageBuffer(ApiMessage,
|
||||||
(PVOID)&GetAllAliasesRequest->ExeName,
|
(PVOID)&GetAllAliasesRequest->ExeName,
|
||||||
GetAllAliasesRequest->ExeLength,
|
GetAllAliasesRequest->ExeLength,
|
||||||
|
@ -652,15 +610,15 @@ CSR_API(SrvGetConsoleAliases)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Header = IntFindAliasHeader(Console,
|
Header = IntFindAliasHeader(Console,
|
||||||
GetAllAliasesRequest->ExeName,
|
GetAllAliasesRequest->ExeName,
|
||||||
GetAllAliasesRequest->ExeLength,
|
GetAllAliasesRequest->ExeLength,
|
||||||
GetAllAliasesRequest->Unicode2);
|
GetAllAliasesRequest->Unicode2);
|
||||||
if (!Header) goto Quit;
|
if (!Header)
|
||||||
|
{
|
||||||
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
|
goto Quit;
|
||||||
|
}
|
||||||
|
|
||||||
if (IntGetAllConsoleAliasesLength(Header, GetAllAliasesRequest->Unicode) > GetAllAliasesRequest->AliasesBufferLength)
|
if (IntGetAllConsoleAliasesLength(Header, GetAllAliasesRequest->Unicode) > GetAllAliasesRequest->AliasesBufferLength)
|
||||||
{
|
{
|
||||||
|
@ -732,20 +690,16 @@ CSR_API(SrvGetConsoleAliases)
|
||||||
Quit:
|
Quit:
|
||||||
GetAllAliasesRequest->AliasesBufferLength = BytesWritten;
|
GetAllAliasesRequest->AliasesBufferLength = BytesWritten;
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetAliasesLength */
|
/* API_NUMBER: ConsolepGetAliasesLength */
|
||||||
CSR_API(SrvGetConsoleAliasesLength)
|
CON_API(SrvGetConsoleAliasesLength,
|
||||||
|
CONSOLE_GETALLALIASESLENGTH, GetAllAliasesLengthRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAllAliasesLengthRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PALIAS_HEADER Header;
|
PALIAS_HEADER Header;
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleAliasesLength entered ApiMessage %p\n", ApiMessage);
|
|
||||||
|
|
||||||
if (!CsrValidateMessageBuffer(ApiMessage,
|
if (!CsrValidateMessageBuffer(ApiMessage,
|
||||||
(PVOID)&GetAllAliasesLengthRequest->ExeName,
|
(PVOID)&GetAllAliasesLengthRequest->ExeName,
|
||||||
GetAllAliasesLengthRequest->ExeLength,
|
GetAllAliasesLengthRequest->ExeLength,
|
||||||
|
@ -754,10 +708,6 @@ CSR_API(SrvGetConsoleAliasesLength)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Header = IntFindAliasHeader(Console,
|
Header = IntFindAliasHeader(Console,
|
||||||
GetAllAliasesLengthRequest->ExeName,
|
GetAllAliasesLengthRequest->ExeName,
|
||||||
GetAllAliasesLengthRequest->ExeLength,
|
GetAllAliasesLengthRequest->ExeLength,
|
||||||
|
@ -774,20 +724,16 @@ CSR_API(SrvGetConsoleAliasesLength)
|
||||||
GetAllAliasesLengthRequest->Length = 0;
|
GetAllAliasesLengthRequest->Length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetAliasExes */
|
/* API_NUMBER: ConsolepGetAliasExes */
|
||||||
CSR_API(SrvGetConsoleAliasExes)
|
CON_API(SrvGetConsoleAliasExes,
|
||||||
|
CONSOLE_GETALIASESEXES, GetAliasesExesRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETALIASESEXES GetAliasesExesRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAliasesExesRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
UINT BytesWritten = 0;
|
UINT BytesWritten = 0;
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleAliasExes entered\n");
|
|
||||||
|
|
||||||
if (!CsrValidateMessageBuffer(ApiMessage,
|
if (!CsrValidateMessageBuffer(ApiMessage,
|
||||||
(PVOID*)&GetAliasesExesRequest->ExeNames,
|
(PVOID*)&GetAliasesExesRequest->ExeNames,
|
||||||
GetAliasesExesRequest->Length,
|
GetAliasesExesRequest->Length,
|
||||||
|
@ -796,10 +742,6 @@ CSR_API(SrvGetConsoleAliasExes)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
if (IntGetConsoleAliasesExesLength(Console->Aliases, GetAliasesExesRequest->Unicode) > GetAliasesExesRequest->Length)
|
if (IntGetConsoleAliasesExesLength(Console->Aliases, GetAliasesExesRequest->Unicode) > GetAliasesExesRequest->Length)
|
||||||
{
|
{
|
||||||
Status = STATUS_BUFFER_OVERFLOW;
|
Status = STATUS_BUFFER_OVERFLOW;
|
||||||
|
@ -862,29 +804,18 @@ CSR_API(SrvGetConsoleAliasExes)
|
||||||
Quit:
|
Quit:
|
||||||
GetAliasesExesRequest->Length = BytesWritten;
|
GetAliasesExesRequest->Length = BytesWritten;
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetAliasExesLength */
|
/* API_NUMBER: ConsolepGetAliasExesLength */
|
||||||
CSR_API(SrvGetConsoleAliasExesLength)
|
CON_API(SrvGetConsoleAliasExesLength,
|
||||||
|
CONSOLE_GETALIASESEXESLENGTH, GetAliasesExesLengthRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAliasesExesLengthRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleAliasExesLength entered ApiMessage %p\n", ApiMessage);
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
GetAliasesExesLengthRequest->Length =
|
GetAliasesExesLengthRequest->Length =
|
||||||
IntGetConsoleAliasesExesLength(Console->Aliases,
|
IntGetConsoleAliasesExesLength(Console->Aliases,
|
||||||
GetAliasesExesLengthRequest->Unicode);
|
GetAliasesExesLengthRequest->Unicode);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
return STATUS_SUCCESS;
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -8,6 +8,84 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper macros to define the CSR_API_ROUTINE-s defined in CONSRV,
|
||||||
|
* factoring out the common prologue and epilogue code, and including
|
||||||
|
* the necessary local variables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CON_API_NOCONSOLE_IMPL(Name, TYPE, RequestName) \
|
||||||
|
NTSTATUS \
|
||||||
|
Name##Impl( \
|
||||||
|
IN PCONSOLE_PROCESS_DATA ProcessData, \
|
||||||
|
IN OUT PCSR_API_MESSAGE ApiMessage, \
|
||||||
|
IN TYPE* RequestName, /* Request */ \
|
||||||
|
IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL)
|
||||||
|
|
||||||
|
// NTSTATUS NTAPI
|
||||||
|
// Name(
|
||||||
|
// IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||||
|
// IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL)
|
||||||
|
#define CON_API_NOCONSOLE_ENTRY(Name, TYPE, RequestName) \
|
||||||
|
CON_API_NOCONSOLE_IMPL(Name, TYPE, RequestName); \
|
||||||
|
CSR_API(Name) \
|
||||||
|
{ \
|
||||||
|
TYPE* RequestName = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.RequestName; \
|
||||||
|
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); \
|
||||||
|
\
|
||||||
|
return Name##Impl(ProcessData, ApiMessage, RequestName, ReplyCode); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CON_API_NOCONSOLE(Name, TYPE, RequestName) \
|
||||||
|
CON_API_NOCONSOLE_ENTRY(Name, TYPE, RequestName); \
|
||||||
|
CON_API_NOCONSOLE_IMPL(Name, TYPE, RequestName)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define CON_API_IMPL(Name, TYPE, RequestName) \
|
||||||
|
NTSTATUS \
|
||||||
|
Name##Impl( \
|
||||||
|
IN PCONSOLE_PROCESS_DATA ProcessData, \
|
||||||
|
IN PCONSRV_CONSOLE Console, \
|
||||||
|
IN OUT PCSR_API_MESSAGE ApiMessage, \
|
||||||
|
IN TYPE* RequestName, /* Request */ \
|
||||||
|
IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL)
|
||||||
|
|
||||||
|
// NTSTATUS NTAPI
|
||||||
|
// Name(
|
||||||
|
// IN OUT PCSR_API_MESSAGE ApiMessage,
|
||||||
|
// IN OUT PCSR_REPLY_CODE ReplyCode OPTIONAL)
|
||||||
|
#define CON_API_ENTRY(Name, TYPE, RequestName) \
|
||||||
|
CON_API_IMPL(Name, TYPE, RequestName); \
|
||||||
|
CSR_API(Name) \
|
||||||
|
{ \
|
||||||
|
NTSTATUS Status; \
|
||||||
|
TYPE* RequestName = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.RequestName; \
|
||||||
|
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); \
|
||||||
|
PCONSRV_CONSOLE Console; \
|
||||||
|
\
|
||||||
|
Status = ConSrvGetConsole(ProcessData, \
|
||||||
|
/* RequestName->ConsoleHandle, */ \
|
||||||
|
&Console, TRUE); \
|
||||||
|
if (!NT_SUCCESS(Status)) \
|
||||||
|
return Status; \
|
||||||
|
\
|
||||||
|
Status = Name##Impl(ProcessData, Console, \
|
||||||
|
ApiMessage, RequestName, ReplyCode); \
|
||||||
|
\
|
||||||
|
ConSrvReleaseConsole(Console, TRUE); \
|
||||||
|
return Status; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CON_API(Name, TYPE, RequestName) \
|
||||||
|
CON_API_ENTRY(Name, TYPE, RequestName); \
|
||||||
|
CON_API_IMPL(Name, TYPE, RequestName)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* List of CSR_API_ROUTINE-s defined in this module.
|
||||||
|
*/
|
||||||
|
|
||||||
/* alias.c */
|
/* alias.c */
|
||||||
CSR_API(SrvAddConsoleAlias);
|
CSR_API(SrvAddConsoleAlias);
|
||||||
CSR_API(SrvGetConsoleAlias);
|
CSR_API(SrvGetConsoleAlias);
|
||||||
|
@ -104,7 +182,7 @@ CSR_API(SrvSetHandleInformation);
|
||||||
CSR_API(SrvCloseHandle);
|
CSR_API(SrvCloseHandle);
|
||||||
CSR_API(SrvVerifyConsoleIoHandle);
|
CSR_API(SrvVerifyConsoleIoHandle);
|
||||||
|
|
||||||
/* lineinput.c */
|
/* history.c */
|
||||||
CSR_API(SrvGetConsoleCommandHistory);
|
CSR_API(SrvGetConsoleCommandHistory);
|
||||||
CSR_API(SrvGetConsoleCommandHistoryLength);
|
CSR_API(SrvGetConsoleCommandHistoryLength);
|
||||||
CSR_API(SrvExpungeConsoleCommandHistory);
|
CSR_API(SrvExpungeConsoleCommandHistory);
|
||||||
|
|
|
@ -581,11 +581,10 @@ ReadInputBuffer(IN PGET_INPUT_INFO InputInfo,
|
||||||
/* PUBLIC SERVER APIS *********************************************************/
|
/* PUBLIC SERVER APIS *********************************************************/
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepReadConsole */
|
/* API_NUMBER: ConsolepReadConsole */
|
||||||
CSR_API(SrvReadConsole)
|
CON_API(SrvReadConsole,
|
||||||
|
CONSOLE_READCONSOLE, ReadConsoleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_READCONSOLE ReadConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ReadConsoleRequest;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PVOID HandleEntry;
|
PVOID HandleEntry;
|
||||||
PCONSOLE_INPUT_BUFFER InputBuffer;
|
PCONSOLE_INPUT_BUFFER InputBuffer;
|
||||||
GET_INPUT_INFO InputInfo;
|
GET_INPUT_INFO InputInfo;
|
||||||
|
@ -622,8 +621,16 @@ CSR_API(SrvReadConsole)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetInputBufferAndHandleEntry(ProcessData, ReadConsoleRequest->InputHandle, &InputBuffer, &HandleEntry, GENERIC_READ, TRUE);
|
Status = ConSrvGetInputBufferAndHandleEntry(ProcessData,
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
ReadConsoleRequest->InputHandle,
|
||||||
|
&InputBuffer,
|
||||||
|
&HandleEntry,
|
||||||
|
GENERIC_READ,
|
||||||
|
TRUE);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == InputBuffer->Header.Console);
|
||||||
|
|
||||||
InputInfo.CallingThread = CsrGetClientThread();
|
InputInfo.CallingThread = CsrGetClientThread();
|
||||||
InputInfo.HandleEntry = HandleEntry;
|
InputInfo.HandleEntry = HandleEntry;
|
||||||
|
@ -639,11 +646,10 @@ CSR_API(SrvReadConsole)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetConsoleInput */
|
/* API_NUMBER: ConsolepGetConsoleInput */
|
||||||
CSR_API(SrvGetConsoleInput)
|
CON_API(SrvGetConsoleInput,
|
||||||
|
CONSOLE_GETINPUT, GetInputRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETINPUT GetInputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetInputRequest;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PVOID HandleEntry;
|
PVOID HandleEntry;
|
||||||
PCONSOLE_INPUT_BUFFER InputBuffer;
|
PCONSOLE_INPUT_BUFFER InputBuffer;
|
||||||
GET_INPUT_INFO InputInfo;
|
GET_INPUT_INFO InputInfo;
|
||||||
|
@ -651,7 +657,9 @@ CSR_API(SrvGetConsoleInput)
|
||||||
DPRINT("SrvGetConsoleInput\n");
|
DPRINT("SrvGetConsoleInput\n");
|
||||||
|
|
||||||
if (GetInputRequest->Flags & ~(CONSOLE_READ_KEEPEVENT | CONSOLE_READ_CONTINUE))
|
if (GetInputRequest->Flags & ~(CONSOLE_READ_KEEPEVENT | CONSOLE_READ_CONTINUE))
|
||||||
|
{
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For optimization purposes, Windows (and hence ReactOS, too, for
|
* For optimization purposes, Windows (and hence ReactOS, too, for
|
||||||
|
@ -678,8 +686,16 @@ CSR_API(SrvGetConsoleInput)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetInputBufferAndHandleEntry(ProcessData, GetInputRequest->InputHandle, &InputBuffer, &HandleEntry, GENERIC_READ, TRUE);
|
Status = ConSrvGetInputBufferAndHandleEntry(ProcessData,
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
GetInputRequest->InputHandle,
|
||||||
|
&InputBuffer,
|
||||||
|
&HandleEntry,
|
||||||
|
GENERIC_READ,
|
||||||
|
TRUE);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == InputBuffer->Header.Console);
|
||||||
|
|
||||||
InputInfo.CallingThread = CsrGetClientThread();
|
InputInfo.CallingThread = CsrGetClientThread();
|
||||||
InputInfo.HandleEntry = HandleEntry;
|
InputInfo.HandleEntry = HandleEntry;
|
||||||
|
@ -705,17 +721,14 @@ ConDrvWriteConsoleInput(IN PCONSOLE Console,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepWriteConsoleInput */
|
/* API_NUMBER: ConsolepWriteConsoleInput */
|
||||||
CSR_API(SrvWriteConsoleInput)
|
CON_API(SrvWriteConsoleInput,
|
||||||
|
CONSOLE_WRITEINPUT, WriteInputRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_WRITEINPUT WriteInputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteInputRequest;
|
|
||||||
PCONSOLE_INPUT_BUFFER InputBuffer;
|
PCONSOLE_INPUT_BUFFER InputBuffer;
|
||||||
ULONG NumEventsWritten;
|
ULONG NumEventsWritten;
|
||||||
|
|
||||||
PINPUT_RECORD InputRecord;
|
PINPUT_RECORD InputRecord;
|
||||||
|
|
||||||
DPRINT("SrvWriteConsoleInput\n");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For optimization purposes, Windows (and hence ReactOS, too, for
|
* For optimization purposes, Windows (and hence ReactOS, too, for
|
||||||
* compatibility reasons) uses a static buffer if no more than five
|
* compatibility reasons) uses a static buffer if no more than five
|
||||||
|
@ -744,7 +757,7 @@ CSR_API(SrvWriteConsoleInput)
|
||||||
InputRecord = WriteInputRequest->RecordBufPtr;
|
InputRecord = WriteInputRequest->RecordBufPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetInputBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetInputBuffer(ProcessData,
|
||||||
WriteInputRequest->InputHandle,
|
WriteInputRequest->InputHandle,
|
||||||
&InputBuffer, GENERIC_WRITE, TRUE);
|
&InputBuffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -753,26 +766,28 @@ CSR_API(SrvWriteConsoleInput)
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == InputBuffer->Header.Console);
|
||||||
|
|
||||||
/* First translate everything to UNICODE */
|
/* First translate everything to UNICODE */
|
||||||
if (!WriteInputRequest->Unicode)
|
if (!WriteInputRequest->Unicode)
|
||||||
{
|
{
|
||||||
ULONG i;
|
ULONG i;
|
||||||
for (i = 0; i < WriteInputRequest->NumRecords; ++i)
|
for (i = 0; i < WriteInputRequest->NumRecords; ++i)
|
||||||
{
|
{
|
||||||
ConioInputEventToUnicode(InputBuffer->Header.Console, &InputRecord[i]);
|
ConioInputEventToUnicode((PCONSOLE)Console, &InputRecord[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now, add the events */
|
/* Now, add the events */
|
||||||
NumEventsWritten = 0;
|
NumEventsWritten = 0;
|
||||||
Status = ConioAddInputEvents((PCONSRV_CONSOLE)InputBuffer->Header.Console,
|
Status = ConioAddInputEvents(Console,
|
||||||
// InputBuffer,
|
// InputBuffer,
|
||||||
InputRecord,
|
InputRecord,
|
||||||
WriteInputRequest->NumRecords,
|
WriteInputRequest->NumRecords,
|
||||||
&NumEventsWritten,
|
&NumEventsWritten,
|
||||||
WriteInputRequest->AppendToEnd);
|
WriteInputRequest->AppendToEnd);
|
||||||
|
|
||||||
// Status = ConDrvWriteConsoleInput(InputBuffer->Header.Console,
|
// Status = ConDrvWriteConsoleInput((PCONSOLE)Console,
|
||||||
// InputBuffer,
|
// InputBuffer,
|
||||||
// WriteInputRequest->AppendToEnd,
|
// WriteInputRequest->AppendToEnd,
|
||||||
// InputRecord,
|
// InputRecord,
|
||||||
|
@ -789,21 +804,21 @@ NTSTATUS NTAPI
|
||||||
ConDrvFlushConsoleInputBuffer(IN PCONSOLE Console,
|
ConDrvFlushConsoleInputBuffer(IN PCONSOLE Console,
|
||||||
IN PCONSOLE_INPUT_BUFFER InputBuffer);
|
IN PCONSOLE_INPUT_BUFFER InputBuffer);
|
||||||
/* API_NUMBER: ConsolepFlushInputBuffer */
|
/* API_NUMBER: ConsolepFlushInputBuffer */
|
||||||
CSR_API(SrvFlushConsoleInputBuffer)
|
CON_API(SrvFlushConsoleInputBuffer,
|
||||||
|
CONSOLE_FLUSHINPUTBUFFER, FlushInputBufferRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_FLUSHINPUTBUFFER FlushInputBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FlushInputBufferRequest;
|
|
||||||
PCONSOLE_INPUT_BUFFER InputBuffer;
|
PCONSOLE_INPUT_BUFFER InputBuffer;
|
||||||
|
|
||||||
DPRINT("SrvFlushConsoleInputBuffer\n");
|
Status = ConSrvGetInputBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetInputBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
FlushInputBufferRequest->InputHandle,
|
FlushInputBufferRequest->InputHandle,
|
||||||
&InputBuffer, GENERIC_WRITE, TRUE);
|
&InputBuffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvFlushConsoleInputBuffer(InputBuffer->Header.Console,
|
ASSERT((PCONSOLE)Console == InputBuffer->Header.Console);
|
||||||
InputBuffer);
|
|
||||||
|
Status = ConDrvFlushConsoleInputBuffer((PCONSOLE)Console, InputBuffer);
|
||||||
|
|
||||||
ConSrvReleaseInputBuffer(InputBuffer, TRUE);
|
ConSrvReleaseInputBuffer(InputBuffer, TRUE);
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -814,20 +829,21 @@ ConDrvGetConsoleNumberOfInputEvents(IN PCONSOLE Console,
|
||||||
IN PCONSOLE_INPUT_BUFFER InputBuffer,
|
IN PCONSOLE_INPUT_BUFFER InputBuffer,
|
||||||
OUT PULONG NumberOfEvents);
|
OUT PULONG NumberOfEvents);
|
||||||
/* API_NUMBER: ConsolepGetNumberOfInputEvents */
|
/* API_NUMBER: ConsolepGetNumberOfInputEvents */
|
||||||
CSR_API(SrvGetConsoleNumberOfInputEvents)
|
CON_API(SrvGetConsoleNumberOfInputEvents,
|
||||||
|
CONSOLE_GETNUMINPUTEVENTS, GetNumInputEventsRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETNUMINPUTEVENTS GetNumInputEventsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetNumInputEventsRequest;
|
|
||||||
PCONSOLE_INPUT_BUFFER InputBuffer;
|
PCONSOLE_INPUT_BUFFER InputBuffer;
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleNumberOfInputEvents\n");
|
Status = ConSrvGetInputBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetInputBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
GetNumInputEventsRequest->InputHandle,
|
GetNumInputEventsRequest->InputHandle,
|
||||||
&InputBuffer, GENERIC_READ, TRUE);
|
&InputBuffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvGetConsoleNumberOfInputEvents(InputBuffer->Header.Console,
|
ASSERT((PCONSOLE)Console == InputBuffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvGetConsoleNumberOfInputEvents((PCONSOLE)Console,
|
||||||
InputBuffer,
|
InputBuffer,
|
||||||
&GetNumInputEventsRequest->NumberOfEvents);
|
&GetNumInputEventsRequest->NumberOfEvents);
|
||||||
|
|
||||||
|
|
|
@ -31,35 +31,33 @@ ConDrvInvalidateBitMapRect(IN PCONSOLE Console,
|
||||||
IN PCONSOLE_SCREEN_BUFFER Buffer,
|
IN PCONSOLE_SCREEN_BUFFER Buffer,
|
||||||
IN PSMALL_RECT Region);
|
IN PSMALL_RECT Region);
|
||||||
/* API_NUMBER: ConsolepInvalidateBitMapRect */
|
/* API_NUMBER: ConsolepInvalidateBitMapRect */
|
||||||
CSR_API(SrvInvalidateBitMapRect)
|
CON_API(SrvInvalidateBitMapRect,
|
||||||
|
CONSOLE_INVALIDATEDIBITS, InvalidateDIBitsRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_INVALIDATEDIBITS InvalidateDIBitsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.InvalidateDIBitsRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buffer;
|
PCONSOLE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvInvalidateBitMapRect\n");
|
Status = ConSrvGetScreenBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
InvalidateDIBitsRequest->OutputHandle,
|
InvalidateDIBitsRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_READ, TRUE);
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Buffer->Header.Console;
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
/* In text-mode only, draw the VDM buffer if present */
|
/* In text-mode only, draw the VDM buffer if present */
|
||||||
if (GetType(Buffer) == TEXTMODE_BUFFER && Console->VDMBuffer)
|
if (GetType(Buffer) == TEXTMODE_BUFFER && Console->VDMBuffer)
|
||||||
{
|
{
|
||||||
PTEXTMODE_SCREEN_BUFFER TextBuffer = (PTEXTMODE_SCREEN_BUFFER)Buffer;
|
PTEXTMODE_SCREEN_BUFFER TextBuffer = (PTEXTMODE_SCREEN_BUFFER)Buffer;
|
||||||
|
|
||||||
/*Status =*/ ConDrvWriteConsoleOutputVDM(Buffer->Header.Console,
|
/*Status =*/ ConDrvWriteConsoleOutputVDM((PCONSOLE)Console,
|
||||||
TextBuffer,
|
TextBuffer,
|
||||||
Console->VDMBuffer,
|
Console->VDMBuffer,
|
||||||
Console->VDMBufferSize,
|
Console->VDMBufferSize,
|
||||||
&InvalidateDIBitsRequest->Region);
|
&InvalidateDIBitsRequest->Region);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConDrvInvalidateBitMapRect(Buffer->Header.Console,
|
Status = ConDrvInvalidateBitMapRect((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
&InvalidateDIBitsRequest->Region);
|
&InvalidateDIBitsRequest->Region);
|
||||||
|
|
||||||
|
@ -74,29 +72,30 @@ ConDrvSetConsolePalette(IN PCONSOLE Console,
|
||||||
IN HPALETTE PaletteHandle,
|
IN HPALETTE PaletteHandle,
|
||||||
IN UINT PaletteUsage);
|
IN UINT PaletteUsage);
|
||||||
/* API_NUMBER: ConsolepSetPalette */
|
/* API_NUMBER: ConsolepSetPalette */
|
||||||
CSR_API(SrvSetConsolePalette)
|
CON_API(SrvSetConsolePalette,
|
||||||
|
CONSOLE_SETPALETTE, SetPaletteRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETPALETTE SetPaletteRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetPaletteRequest;
|
|
||||||
// PGRAPHICS_SCREEN_BUFFER Buffer;
|
// PGRAPHICS_SCREEN_BUFFER Buffer;
|
||||||
PCONSOLE_SCREEN_BUFFER Buffer;
|
PCONSOLE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvSetConsolePalette\n");
|
|
||||||
|
|
||||||
// NOTE: Tests show that this function is used only for graphics screen buffers
|
// NOTE: Tests show that this function is used only for graphics screen buffers
|
||||||
// and otherwise it returns FALSE + sets last error to invalid handle.
|
// and otherwise it returns FALSE + sets last error to invalid handle.
|
||||||
// I think it's ridiculous, because if you are in text mode, simulating
|
// I think it's ridiculous, because if you are in text mode, simulating
|
||||||
// a change of VGA palette via DAC registers (done by a call to SetConsolePalette)
|
// a change of VGA palette via DAC registers (done by a call to SetConsolePalette)
|
||||||
// cannot be done... So I allow it in ReactOS !
|
// cannot be done... So I allow it in ReactOS !
|
||||||
/*
|
/*
|
||||||
Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetGraphicsBuffer(ProcessData,
|
||||||
SetPaletteRequest->OutputHandle,
|
SetPaletteRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
*/
|
*/
|
||||||
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetScreenBuffer(ProcessData,
|
||||||
SetPaletteRequest->OutputHandle,
|
SetPaletteRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make the palette handle public, so that it can be
|
* Make the palette handle public, so that it can be
|
||||||
|
@ -108,7 +107,7 @@ CSR_API(SrvSetConsolePalette)
|
||||||
&SetPaletteRequest->PaletteHandle,
|
&SetPaletteRequest->PaletteHandle,
|
||||||
sizeof(SetPaletteRequest->PaletteHandle));
|
sizeof(SetPaletteRequest->PaletteHandle));
|
||||||
|
|
||||||
Status = ConDrvSetConsolePalette(Buffer->Header.Console,
|
Status = ConDrvSetConsolePalette((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
SetPaletteRequest->PaletteHandle,
|
SetPaletteRequest->PaletteHandle,
|
||||||
SetPaletteRequest->Usage);
|
SetPaletteRequest->Usage);
|
||||||
|
@ -122,20 +121,21 @@ ConDrvGetConsoleCursorInfo(IN PCONSOLE Console,
|
||||||
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
OUT PCONSOLE_CURSOR_INFO CursorInfo);
|
OUT PCONSOLE_CURSOR_INFO CursorInfo);
|
||||||
/* API_NUMBER: ConsolepGetCursorInfo */
|
/* API_NUMBER: ConsolepGetCursorInfo */
|
||||||
CSR_API(SrvGetConsoleCursorInfo)
|
CON_API(SrvGetConsoleCursorInfo,
|
||||||
|
CONSOLE_GETSETCURSORINFO, CursorInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CursorInfoRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleCursorInfo\n");
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
CursorInfoRequest->OutputHandle,
|
CursorInfoRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_READ, TRUE);
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvGetConsoleCursorInfo(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvGetConsoleCursorInfo((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
&CursorInfoRequest->Info);
|
&CursorInfoRequest->Info);
|
||||||
|
|
||||||
|
@ -148,20 +148,21 @@ ConDrvSetConsoleCursorInfo(IN PCONSOLE Console,
|
||||||
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
IN PCONSOLE_CURSOR_INFO CursorInfo);
|
IN PCONSOLE_CURSOR_INFO CursorInfo);
|
||||||
/* API_NUMBER: ConsolepSetCursorInfo */
|
/* API_NUMBER: ConsolepSetCursorInfo */
|
||||||
CSR_API(SrvSetConsoleCursorInfo)
|
CON_API(SrvSetConsoleCursorInfo,
|
||||||
|
CONSOLE_GETSETCURSORINFO, CursorInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETCURSORINFO CursorInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CursorInfoRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleCursorInfo\n");
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
CursorInfoRequest->OutputHandle,
|
CursorInfoRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvSetConsoleCursorInfo(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvSetConsoleCursorInfo((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
&CursorInfoRequest->Info);
|
&CursorInfoRequest->Info);
|
||||||
|
|
||||||
|
@ -174,20 +175,21 @@ ConDrvSetConsoleCursorPosition(IN PCONSOLE Console,
|
||||||
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
IN PCOORD Position);
|
IN PCOORD Position);
|
||||||
/* API_NUMBER: ConsolepSetCursorPosition */
|
/* API_NUMBER: ConsolepSetCursorPosition */
|
||||||
CSR_API(SrvSetConsoleCursorPosition)
|
CON_API(SrvSetConsoleCursorPosition,
|
||||||
|
CONSOLE_SETCURSORPOSITION, SetCursorPositionRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETCURSORPOSITION SetCursorPositionRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorPositionRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleCursorPosition\n");
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
SetCursorPositionRequest->OutputHandle,
|
SetCursorPositionRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvSetConsoleCursorPosition(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvSetConsoleCursorPosition((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
&SetCursorPositionRequest->Position);
|
&SetCursorPositionRequest->Position);
|
||||||
|
|
||||||
|
@ -196,13 +198,12 @@ CSR_API(SrvSetConsoleCursorPosition)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepCreateScreenBuffer */
|
/* API_NUMBER: ConsolepCreateScreenBuffer */
|
||||||
CSR_API(SrvCreateConsoleScreenBuffer)
|
CON_API(SrvCreateConsoleScreenBuffer,
|
||||||
|
CONSOLE_CREATESCREENBUFFER, CreateScreenBufferRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_INVALID_PARAMETER;
|
NTSTATUS Status;
|
||||||
PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CreateScreenBufferRequest;
|
|
||||||
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(Process);
|
// PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(Process);
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
PVOID ScreenBufferInfo = NULL;
|
PVOID ScreenBufferInfo = NULL;
|
||||||
|
@ -215,11 +216,6 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
GRAPHICS_BUFFER_INFO GraphicsInfo;
|
GRAPHICS_BUFFER_INFO GraphicsInfo;
|
||||||
GraphicsInfo.Info = CreateScreenBufferRequest->GraphicsBufferInfo; // HACK for MSVC
|
GraphicsInfo.Info = CreateScreenBufferRequest->GraphicsBufferInfo; // HACK for MSVC
|
||||||
|
|
||||||
DPRINT("SrvCreateConsoleScreenBuffer\n");
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ProcessData, &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
if (CreateScreenBufferRequest->ScreenBufferType == CONSOLE_TEXTMODE_BUFFER)
|
if (CreateScreenBufferRequest->ScreenBufferType == CONSOLE_TEXTMODE_BUFFER)
|
||||||
{
|
{
|
||||||
ScreenBufferInfo = &TextModeInfo;
|
ScreenBufferInfo = &TextModeInfo;
|
||||||
|
@ -271,8 +267,7 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
CreateScreenBufferRequest->GraphicsBufferInfo.dwBitMapInfoLength,
|
CreateScreenBufferRequest->GraphicsBufferInfo.dwBitMapInfoLength,
|
||||||
sizeof(BYTE)))
|
sizeof(BYTE)))
|
||||||
{
|
{
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
goto Quit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ScreenBufferInfo = &GraphicsInfo;
|
ScreenBufferInfo = &GraphicsInfo;
|
||||||
|
@ -286,13 +281,19 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
/* A graphics screen buffer is never inheritable */
|
/* A graphics screen buffer is never inheritable */
|
||||||
CreateScreenBufferRequest->InheritHandle = FALSE;
|
CreateScreenBufferRequest->InheritHandle = FALSE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT1("Invalid ScreenBuffer type %lu\n", CreateScreenBufferRequest->ScreenBufferType);
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
Status = ConDrvCreateScreenBuffer(&Buff,
|
Status = ConDrvCreateScreenBuffer(&Buff,
|
||||||
(PCONSOLE)Console,
|
(PCONSOLE)Console,
|
||||||
Process->ProcessHandle,
|
Process->ProcessHandle,
|
||||||
CreateScreenBufferRequest->ScreenBufferType,
|
CreateScreenBufferRequest->ScreenBufferType,
|
||||||
ScreenBufferInfo);
|
ScreenBufferInfo);
|
||||||
if (!NT_SUCCESS(Status)) goto Quit;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
/* Insert the new handle inside the process handles table */
|
/* Insert the new handle inside the process handles table */
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
@ -306,7 +307,11 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
|
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status)) goto Quit;
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
ConDrvDeleteScreenBuffer(Buff);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
if (CreateScreenBufferRequest->ScreenBufferType == CONSOLE_GRAPHICS_BUFFER)
|
if (CreateScreenBufferRequest->ScreenBufferType == CONSOLE_GRAPHICS_BUFFER)
|
||||||
{
|
{
|
||||||
|
@ -321,8 +326,6 @@ CSR_API(SrvCreateConsoleScreenBuffer)
|
||||||
CreateScreenBufferRequest->lpBitMap = Buffer->ClientBitMap;
|
CreateScreenBufferRequest->lpBitMap = Buffer->ClientBitMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
Quit:
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,21 +333,21 @@ NTSTATUS NTAPI
|
||||||
ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console,
|
ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console,
|
||||||
IN PCONSOLE_SCREEN_BUFFER Buffer);
|
IN PCONSOLE_SCREEN_BUFFER Buffer);
|
||||||
/* API_NUMBER: ConsolepSetActiveScreenBuffer */
|
/* API_NUMBER: ConsolepSetActiveScreenBuffer */
|
||||||
CSR_API(SrvSetConsoleActiveScreenBuffer)
|
CON_API(SrvSetConsoleActiveScreenBuffer,
|
||||||
|
CONSOLE_SETACTIVESCREENBUFFER, SetScreenBufferRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETACTIVESCREENBUFFER SetScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferRequest;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buffer;
|
PCONSOLE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleActiveScreenBuffer\n");
|
Status = ConSrvGetScreenBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
SetScreenBufferRequest->OutputHandle,
|
SetScreenBufferRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvSetConsoleActiveScreenBuffer(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
Buffer);
|
|
||||||
|
Status = ConDrvSetConsoleActiveScreenBuffer((PCONSOLE)Console, Buffer);
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
ConSrvReleaseScreenBuffer(Buffer, TRUE);
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -493,17 +496,14 @@ ConDrvReadConsoleOutput(IN PCONSOLE Console,
|
||||||
OUT PCHAR_INFO CharInfo/*Buffer*/,
|
OUT PCHAR_INFO CharInfo/*Buffer*/,
|
||||||
IN OUT PSMALL_RECT ReadRegion);
|
IN OUT PSMALL_RECT ReadRegion);
|
||||||
/* API_NUMBER: ConsolepReadConsoleOutput */
|
/* API_NUMBER: ConsolepReadConsoleOutput */
|
||||||
CSR_API(SrvReadConsoleOutput)
|
CON_API(SrvReadConsoleOutput,
|
||||||
|
CONSOLE_READOUTPUT, ReadOutputRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_READOUTPUT ReadOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ReadOutputRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
ULONG NumCells;
|
ULONG NumCells;
|
||||||
PCHAR_INFO CharInfo;
|
PCHAR_INFO CharInfo;
|
||||||
|
|
||||||
DPRINT("SrvReadConsoleOutput\n");
|
|
||||||
|
|
||||||
NumCells = ConioRectWidth(&ReadOutputRequest->ReadRegion) *
|
NumCells = ConioRectWidth(&ReadOutputRequest->ReadRegion) *
|
||||||
ConioRectHeight(&ReadOutputRequest->ReadRegion);
|
ConioRectHeight(&ReadOutputRequest->ReadRegion);
|
||||||
|
|
||||||
|
@ -535,12 +535,15 @@ CSR_API(SrvReadConsoleOutput)
|
||||||
CharInfo = ReadOutputRequest->CharInfo;
|
CharInfo = ReadOutputRequest->CharInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
ReadOutputRequest->OutputHandle,
|
ReadOutputRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_READ, TRUE);
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvReadConsoleOutput(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvReadConsoleOutput((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
ReadOutputRequest->Unicode,
|
ReadOutputRequest->Unicode,
|
||||||
CharInfo,
|
CharInfo,
|
||||||
|
@ -557,25 +560,26 @@ ConDrvWriteConsoleOutput(IN PCONSOLE Console,
|
||||||
IN PCHAR_INFO CharInfo/*Buffer*/,
|
IN PCHAR_INFO CharInfo/*Buffer*/,
|
||||||
IN OUT PSMALL_RECT WriteRegion);
|
IN OUT PSMALL_RECT WriteRegion);
|
||||||
/* API_NUMBER: ConsolepWriteConsoleOutput */
|
/* API_NUMBER: ConsolepWriteConsoleOutput */
|
||||||
CSR_API(SrvWriteConsoleOutput)
|
CON_API(SrvWriteConsoleOutput,
|
||||||
|
CONSOLE_WRITEOUTPUT, WriteOutputRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_WRITEOUTPUT WriteOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteOutputRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
|
||||||
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
||||||
|
// PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(Process);
|
||||||
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
ULONG NumCells;
|
ULONG NumCells;
|
||||||
PCHAR_INFO CharInfo;
|
PCHAR_INFO CharInfo;
|
||||||
|
|
||||||
DPRINT("SrvWriteConsoleOutput\n");
|
|
||||||
|
|
||||||
NumCells = ConioRectWidth(&WriteOutputRequest->WriteRegion) *
|
NumCells = ConioRectWidth(&WriteOutputRequest->WriteRegion) *
|
||||||
ConioRectHeight(&WriteOutputRequest->WriteRegion);
|
ConioRectHeight(&WriteOutputRequest->WriteRegion);
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
WriteOutputRequest->OutputHandle,
|
WriteOutputRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validate the message buffer if we do not use a process' heap buffer
|
* Validate the message buffer if we do not use a process' heap buffer
|
||||||
|
@ -640,7 +644,7 @@ CSR_API(SrvWriteConsoleOutput)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConDrvWriteConsoleOutput(Buffer->Header.Console,
|
Status = ConDrvWriteConsoleOutput((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
WriteOutputRequest->Unicode,
|
WriteOutputRequest->Unicode,
|
||||||
CharInfo,
|
CharInfo,
|
||||||
|
@ -656,10 +660,10 @@ Quit:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepWriteConsole */
|
/* API_NUMBER: ConsolepWriteConsole */
|
||||||
CSR_API(SrvWriteConsole)
|
CON_API(SrvWriteConsole,
|
||||||
|
CONSOLE_WRITECONSOLE, WriteConsoleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_WRITECONSOLE WriteConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleRequest;
|
|
||||||
|
|
||||||
DPRINT("SrvWriteConsole\n");
|
DPRINT("SrvWriteConsole\n");
|
||||||
|
|
||||||
|
@ -706,17 +710,14 @@ ConDrvReadConsoleOutputString(IN PCONSOLE Console,
|
||||||
// OUT PCOORD EndCoord,
|
// OUT PCOORD EndCoord,
|
||||||
OUT PULONG NumCodesRead OPTIONAL);
|
OUT PULONG NumCodesRead OPTIONAL);
|
||||||
/* API_NUMBER: ConsolepReadConsoleOutputString */
|
/* API_NUMBER: ConsolepReadConsoleOutputString */
|
||||||
CSR_API(SrvReadConsoleOutputString)
|
CON_API(SrvReadConsoleOutputString,
|
||||||
|
CONSOLE_READOUTPUTCODE, ReadOutputCodeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ReadOutputCodeRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
ULONG CodeSize;
|
ULONG CodeSize;
|
||||||
|
|
||||||
PVOID pCode;
|
PVOID pCode;
|
||||||
|
|
||||||
DPRINT("SrvReadConsoleOutputString\n");
|
|
||||||
|
|
||||||
switch (ReadOutputCodeRequest->CodeType)
|
switch (ReadOutputCodeRequest->CodeType)
|
||||||
{
|
{
|
||||||
case CODE_ASCII:
|
case CODE_ASCII:
|
||||||
|
@ -763,7 +764,7 @@ CSR_API(SrvReadConsoleOutputString)
|
||||||
pCode = ReadOutputCodeRequest->pCode;
|
pCode = ReadOutputCodeRequest->pCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
ReadOutputCodeRequest->OutputHandle,
|
ReadOutputCodeRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_READ, TRUE);
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -772,7 +773,9 @@ CSR_API(SrvReadConsoleOutputString)
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConDrvReadConsoleOutputString(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvReadConsoleOutputString((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
ReadOutputCodeRequest->CodeType,
|
ReadOutputCodeRequest->CodeType,
|
||||||
pCode,
|
pCode,
|
||||||
|
@ -795,17 +798,14 @@ ConDrvWriteConsoleOutputString(IN PCONSOLE Console,
|
||||||
// OUT PCOORD EndCoord,
|
// OUT PCOORD EndCoord,
|
||||||
OUT PULONG NumCodesWritten OPTIONAL);
|
OUT PULONG NumCodesWritten OPTIONAL);
|
||||||
/* API_NUMBER: ConsolepWriteConsoleOutputString */
|
/* API_NUMBER: ConsolepWriteConsoleOutputString */
|
||||||
CSR_API(SrvWriteConsoleOutputString)
|
CON_API(SrvWriteConsoleOutputString,
|
||||||
|
CONSOLE_WRITEOUTPUTCODE, WriteOutputCodeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteOutputCodeRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
ULONG CodeSize;
|
ULONG CodeSize;
|
||||||
|
|
||||||
PVOID pCode;
|
PVOID pCode;
|
||||||
|
|
||||||
DPRINT("SrvWriteConsoleOutputString\n");
|
|
||||||
|
|
||||||
switch (WriteOutputCodeRequest->CodeType)
|
switch (WriteOutputCodeRequest->CodeType)
|
||||||
{
|
{
|
||||||
case CODE_ASCII:
|
case CODE_ASCII:
|
||||||
|
@ -852,7 +852,7 @@ CSR_API(SrvWriteConsoleOutputString)
|
||||||
pCode = WriteOutputCodeRequest->pCode;
|
pCode = WriteOutputCodeRequest->pCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
WriteOutputCodeRequest->OutputHandle,
|
WriteOutputCodeRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -861,7 +861,9 @@ CSR_API(SrvWriteConsoleOutputString)
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConDrvWriteConsoleOutputString(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvWriteConsoleOutputString((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
WriteOutputCodeRequest->CodeType,
|
WriteOutputCodeRequest->CodeType,
|
||||||
pCode,
|
pCode,
|
||||||
|
@ -883,15 +885,13 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console,
|
||||||
IN PCOORD WriteCoord,
|
IN PCOORD WriteCoord,
|
||||||
OUT PULONG NumCodesWritten OPTIONAL);
|
OUT PULONG NumCodesWritten OPTIONAL);
|
||||||
/* API_NUMBER: ConsolepFillConsoleOutput */
|
/* API_NUMBER: ConsolepFillConsoleOutput */
|
||||||
CSR_API(SrvFillConsoleOutput)
|
CON_API(SrvFillConsoleOutput,
|
||||||
|
CONSOLE_FILLOUTPUTCODE, FillOutputRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_FILLOUTPUTCODE FillOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
CODE_TYPE CodeType = FillOutputRequest->CodeType;
|
CODE_TYPE CodeType = FillOutputRequest->CodeType;
|
||||||
|
|
||||||
DPRINT("SrvFillConsoleOutput\n");
|
|
||||||
|
|
||||||
if ( (CodeType != CODE_ASCII ) &&
|
if ( (CodeType != CODE_ASCII ) &&
|
||||||
(CodeType != CODE_UNICODE ) &&
|
(CodeType != CODE_UNICODE ) &&
|
||||||
(CodeType != CODE_ATTRIBUTE) )
|
(CodeType != CODE_ATTRIBUTE) )
|
||||||
|
@ -899,7 +899,7 @@ CSR_API(SrvFillConsoleOutput)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
FillOutputRequest->OutputHandle,
|
FillOutputRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -908,7 +908,9 @@ CSR_API(SrvFillConsoleOutput)
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConDrvFillConsoleOutput(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvFillConsoleOutput((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
CodeType,
|
CodeType,
|
||||||
FillOutputRequest->Code,
|
FillOutputRequest->Code,
|
||||||
|
@ -930,20 +932,21 @@ ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console,
|
||||||
OUT PCOORD MaximumViewSize,
|
OUT PCOORD MaximumViewSize,
|
||||||
OUT PWORD Attributes);
|
OUT PWORD Attributes);
|
||||||
/* API_NUMBER: ConsolepGetScreenBufferInfo */
|
/* API_NUMBER: ConsolepGetScreenBufferInfo */
|
||||||
CSR_API(SrvGetConsoleScreenBufferInfo)
|
CON_API(SrvGetConsoleScreenBufferInfo,
|
||||||
|
CONSOLE_GETSCREENBUFFERINFO, ScreenBufferInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleScreenBufferInfo\n");
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
ScreenBufferInfoRequest->OutputHandle,
|
ScreenBufferInfoRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_READ, TRUE);
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvGetConsoleScreenBufferInfo(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvGetConsoleScreenBufferInfo((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
&ScreenBufferInfoRequest->ScreenBufferSize,
|
&ScreenBufferInfoRequest->ScreenBufferSize,
|
||||||
&ScreenBufferInfoRequest->CursorPosition,
|
&ScreenBufferInfoRequest->CursorPosition,
|
||||||
|
@ -961,20 +964,21 @@ ConDrvSetConsoleTextAttribute(IN PCONSOLE Console,
|
||||||
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
IN WORD Attributes);
|
IN WORD Attributes);
|
||||||
/* API_NUMBER: ConsolepSetTextAttribute */
|
/* API_NUMBER: ConsolepSetTextAttribute */
|
||||||
CSR_API(SrvSetConsoleTextAttribute)
|
CON_API(SrvSetConsoleTextAttribute,
|
||||||
|
CONSOLE_SETTEXTATTRIB, SetTextAttribRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleTextAttribute\n");
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
SetTextAttribRequest->OutputHandle,
|
SetTextAttribRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvSetConsoleTextAttribute(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvSetConsoleTextAttribute((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
SetTextAttribRequest->Attributes);
|
SetTextAttribRequest->Attributes);
|
||||||
|
|
||||||
|
@ -987,20 +991,21 @@ ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console,
|
||||||
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
IN PTEXTMODE_SCREEN_BUFFER Buffer,
|
||||||
IN PCOORD Size);
|
IN PCOORD Size);
|
||||||
/* API_NUMBER: ConsolepSetScreenBufferSize */
|
/* API_NUMBER: ConsolepSetScreenBufferSize */
|
||||||
CSR_API(SrvSetConsoleScreenBufferSize)
|
CON_API(SrvSetConsoleScreenBufferSize,
|
||||||
|
CONSOLE_SETSCREENBUFFERSIZE, SetScreenBufferSizeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferSizeRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleScreenBufferSize\n");
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
SetScreenBufferSizeRequest->OutputHandle,
|
SetScreenBufferSizeRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvSetConsoleScreenBufferSize(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvSetConsoleScreenBufferSize((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
&SetScreenBufferSizeRequest->Size);
|
&SetScreenBufferSizeRequest->Size);
|
||||||
|
|
||||||
|
@ -1018,20 +1023,21 @@ ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console,
|
||||||
IN PCOORD DestinationOrigin,
|
IN PCOORD DestinationOrigin,
|
||||||
IN CHAR_INFO FillChar);
|
IN CHAR_INFO FillChar);
|
||||||
/* API_NUMBER: ConsolepScrollScreenBuffer */
|
/* API_NUMBER: ConsolepScrollScreenBuffer */
|
||||||
CSR_API(SrvScrollConsoleScreenBuffer)
|
CON_API(SrvScrollConsoleScreenBuffer,
|
||||||
|
CONSOLE_SCROLLSCREENBUFFER, ScrollScreenBufferRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScrollScreenBufferRequest;
|
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
DPRINT("SrvScrollConsoleScreenBuffer\n");
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
ScrollScreenBufferRequest->OutputHandle,
|
ScrollScreenBufferRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_WRITE, TRUE);
|
&Buffer, GENERIC_WRITE, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvScrollConsoleScreenBuffer(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvScrollConsoleScreenBuffer((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
ScrollScreenBufferRequest->Unicode,
|
ScrollScreenBufferRequest->Unicode,
|
||||||
&ScrollScreenBufferRequest->ScrollRectangle,
|
&ScrollScreenBufferRequest->ScrollRectangle,
|
||||||
|
@ -1050,10 +1056,10 @@ ConDrvSetConsoleWindowInfo(IN PCONSOLE Console,
|
||||||
IN BOOLEAN Absolute,
|
IN BOOLEAN Absolute,
|
||||||
IN PSMALL_RECT WindowRect);
|
IN PSMALL_RECT WindowRect);
|
||||||
/* API_NUMBER: ConsolepSetWindowInfo */
|
/* API_NUMBER: ConsolepSetWindowInfo */
|
||||||
CSR_API(SrvSetConsoleWindowInfo)
|
CON_API(SrvSetConsoleWindowInfo,
|
||||||
|
CONSOLE_SETWINDOWINFO, SetWindowInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETWINDOWINFO SetWindowInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetWindowInfoRequest;
|
|
||||||
// PCONSOLE_SCREEN_BUFFER Buffer;
|
// PCONSOLE_SCREEN_BUFFER Buffer;
|
||||||
PTEXTMODE_SCREEN_BUFFER Buffer;
|
PTEXTMODE_SCREEN_BUFFER Buffer;
|
||||||
|
|
||||||
|
@ -1065,12 +1071,15 @@ CSR_API(SrvSetConsoleWindowInfo)
|
||||||
SetWindowInfoRequest->WindowRect.Bottom);
|
SetWindowInfoRequest->WindowRect.Bottom);
|
||||||
|
|
||||||
// ConSrvGetScreenBuffer
|
// ConSrvGetScreenBuffer
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
SetWindowInfoRequest->OutputHandle,
|
SetWindowInfoRequest->OutputHandle,
|
||||||
&Buffer, GENERIC_READ, TRUE);
|
&Buffer, GENERIC_READ, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Status = ConDrvSetConsoleWindowInfo(Buffer->Header.Console,
|
ASSERT((PCONSOLE)Console == Buffer->Header.Console);
|
||||||
|
|
||||||
|
Status = ConDrvSetConsoleWindowInfo((PCONSOLE)Console,
|
||||||
Buffer,
|
Buffer,
|
||||||
SetWindowInfoRequest->Absolute,
|
SetWindowInfoRequest->Absolute,
|
||||||
&SetWindowInfoRequest->WindowRect);
|
&SetWindowInfoRequest->WindowRect);
|
||||||
|
|
|
@ -1060,12 +1060,10 @@ ConSrvSetConsoleProcessFocus(IN PCONSRV_CONSOLE Console,
|
||||||
/* PUBLIC SERVER APIS *********************************************************/
|
/* PUBLIC SERVER APIS *********************************************************/
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepAlloc */
|
/* API_NUMBER: ConsolepAlloc */
|
||||||
CSR_API(SrvAllocConsole)
|
CON_API_NOCONSOLE(SrvAllocConsole,
|
||||||
|
CONSOLE_ALLOCCONSOLE, AllocConsoleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PCONSOLE_ALLOCCONSOLE AllocConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.AllocConsoleRequest;
|
|
||||||
PCSR_PROCESS CsrProcess = CsrGetClientThread()->Process;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess);
|
|
||||||
CONSOLE_INIT_INFO ConsoleInitInfo;
|
CONSOLE_INIT_INFO ConsoleInitInfo;
|
||||||
|
|
||||||
if (ProcessData->ConsoleHandle != NULL)
|
if (ProcessData->ConsoleHandle != NULL)
|
||||||
|
@ -1130,10 +1128,10 @@ CSR_API(SrvAllocConsole)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepAttach */
|
/* API_NUMBER: ConsolepAttach */
|
||||||
CSR_API(SrvAttachConsole)
|
CON_API_NOCONSOLE(SrvAttachConsole,
|
||||||
|
CONSOLE_ATTACHCONSOLE, AttachConsoleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PCONSOLE_ATTACHCONSOLE AttachConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.AttachConsoleRequest;
|
|
||||||
PCSR_PROCESS SourceProcess = NULL; // The parent process.
|
PCSR_PROCESS SourceProcess = NULL; // The parent process.
|
||||||
PCSR_PROCESS TargetProcess = CsrGetClientThread()->Process; // Ourselves.
|
PCSR_PROCESS TargetProcess = CsrGetClientThread()->Process; // Ourselves.
|
||||||
HANDLE ProcessId = ULongToHandle(AttachConsoleRequest->ProcessId);
|
HANDLE ProcessId = ULongToHandle(AttachConsoleRequest->ProcessId);
|
||||||
|
@ -1218,9 +1216,20 @@ Quit:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepFree */
|
/* API_NUMBER: ConsolepFree */
|
||||||
CSR_API(SrvFreeConsole)
|
CON_API_NOCONSOLE(SrvFreeConsole,
|
||||||
|
CONSOLE_FREECONSOLE, FreeConsoleRequest)
|
||||||
{
|
{
|
||||||
return ConSrvRemoveConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process));
|
/*
|
||||||
|
* If this process doesn't have a console handle, bail out immediately.
|
||||||
|
* Also the passed console handle should be the same as the process' one.
|
||||||
|
*/
|
||||||
|
if ((FreeConsoleRequest->ConsoleHandle == NULL) ||
|
||||||
|
(FreeConsoleRequest->ConsoleHandle != ProcessData->ConsoleHandle))
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_HANDLE; // STATUS_ACCESS_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ConSrvRemoveConsole(ProcessData);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
|
@ -1228,24 +1237,23 @@ ConDrvGetConsoleMode(IN PCONSOLE Console,
|
||||||
IN PCONSOLE_IO_OBJECT Object,
|
IN PCONSOLE_IO_OBJECT Object,
|
||||||
OUT PULONG ConsoleMode);
|
OUT PULONG ConsoleMode);
|
||||||
/* API_NUMBER: ConsolepGetMode */
|
/* API_NUMBER: ConsolepGetMode */
|
||||||
CSR_API(SrvGetConsoleMode)
|
CON_API(SrvGetConsoleMode,
|
||||||
|
CONSOLE_GETSETCONSOLEMODE, ConsoleModeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_IO_OBJECT Object;
|
PCONSOLE_IO_OBJECT Object;
|
||||||
|
|
||||||
PULONG ConsoleMode = &ConsoleModeRequest->Mode;
|
PULONG ConsoleMode = &ConsoleModeRequest->Mode;
|
||||||
|
|
||||||
Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetObject(ProcessData,
|
||||||
ConsoleModeRequest->Handle,
|
ConsoleModeRequest->Handle,
|
||||||
&Object, NULL, GENERIC_READ, TRUE, 0);
|
&Object, NULL, GENERIC_READ, TRUE, 0);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Object->Console;
|
ASSERT((PCONSOLE)Console == Object->Console);
|
||||||
|
|
||||||
/* Get the standard console modes */
|
/* Get the standard console modes */
|
||||||
Status = ConDrvGetConsoleMode(Object->Console, Object, ConsoleMode);
|
Status = ConDrvGetConsoleMode((PCONSOLE)Console, Object, ConsoleMode);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -1274,29 +1282,28 @@ ConDrvSetConsoleMode(IN PCONSOLE Console,
|
||||||
IN PCONSOLE_IO_OBJECT Object,
|
IN PCONSOLE_IO_OBJECT Object,
|
||||||
IN ULONG ConsoleMode);
|
IN ULONG ConsoleMode);
|
||||||
/* API_NUMBER: ConsolepSetMode */
|
/* API_NUMBER: ConsolepSetMode */
|
||||||
CSR_API(SrvSetConsoleMode)
|
CON_API(SrvSetConsoleMode,
|
||||||
|
CONSOLE_GETSETCONSOLEMODE, ConsoleModeRequest)
|
||||||
{
|
{
|
||||||
#define CONSOLE_VALID_CONTROL_MODES ( ENABLE_EXTENDED_FLAGS | \
|
#define CONSOLE_VALID_CONTROL_MODES ( ENABLE_EXTENDED_FLAGS | \
|
||||||
ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE )
|
ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE )
|
||||||
// NOTE: Vista+ ENABLE_AUTO_POSITION is also a control mode.
|
// NOTE: Vista+ ENABLE_AUTO_POSITION is also a control mode.
|
||||||
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_IO_OBJECT Object;
|
PCONSOLE_IO_OBJECT Object;
|
||||||
|
|
||||||
ULONG ConsoleMode = ConsoleModeRequest->Mode;
|
ULONG ConsoleMode = ConsoleModeRequest->Mode;
|
||||||
|
|
||||||
Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetObject(ProcessData,
|
||||||
ConsoleModeRequest->Handle,
|
ConsoleModeRequest->Handle,
|
||||||
&Object, NULL, GENERIC_WRITE, TRUE, 0);
|
&Object, NULL, GENERIC_WRITE, TRUE, 0);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Object->Console;
|
ASSERT((PCONSOLE)Console == Object->Console);
|
||||||
|
|
||||||
/* Set the standard console modes (without the CONSRV-specific input modes) */
|
/* Set the standard console modes (without the CONSRV-specific input modes) */
|
||||||
ConsoleMode &= ~CONSOLE_VALID_CONTROL_MODES; // Remove CONSRV-specific input modes.
|
ConsoleMode &= ~CONSOLE_VALID_CONTROL_MODES; // Remove CONSRV-specific input modes.
|
||||||
Status = ConDrvSetConsoleMode(Object->Console, Object, ConsoleMode);
|
Status = ConDrvSetConsoleMode((PCONSOLE)Console, Object, ConsoleMode);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -1331,11 +1338,9 @@ CSR_API(SrvSetConsoleMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetTitle */
|
/* API_NUMBER: ConsolepGetTitle */
|
||||||
CSR_API(SrvGetConsoleTitle)
|
CON_API(SrvGetConsoleTitle,
|
||||||
|
CONSOLE_GETSETCONSOLETITLE, TitleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETSETCONSOLETITLE TitleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.TitleRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
|
|
||||||
if (!CsrValidateMessageBuffer(ApiMessage,
|
if (!CsrValidateMessageBuffer(ApiMessage,
|
||||||
|
@ -1346,13 +1351,6 @@ CSR_API(SrvGetConsoleTitle)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy title of the console to the user title buffer */
|
/* Copy title of the console to the user title buffer */
|
||||||
if (TitleRequest->Unicode)
|
if (TitleRequest->Unicode)
|
||||||
{
|
{
|
||||||
|
@ -1386,17 +1384,13 @@ CSR_API(SrvGetConsoleTitle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
return STATUS_SUCCESS;
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetTitle */
|
/* API_NUMBER: ConsolepSetTitle */
|
||||||
CSR_API(SrvSetConsoleTitle)
|
CON_API(SrvSetConsoleTitle,
|
||||||
|
CONSOLE_GETSETCONSOLETITLE, TitleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETSETCONSOLETITLE TitleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.TitleRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
PWCHAR Buffer;
|
PWCHAR Buffer;
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
|
|
||||||
|
@ -1408,13 +1402,6 @@ CSR_API(SrvSetConsoleTitle)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TitleRequest->Unicode)
|
if (TitleRequest->Unicode)
|
||||||
{
|
{
|
||||||
/* Length is in bytes */
|
/* Length is in bytes */
|
||||||
|
@ -1433,10 +1420,7 @@ CSR_API(SrvSetConsoleTitle)
|
||||||
/* Allocate a new buffer to hold the new title (NULL-terminated) */
|
/* Allocate a new buffer to hold the new title (NULL-terminated) */
|
||||||
Buffer = ConsoleAllocHeap(HEAP_ZERO_MEMORY, Length + sizeof(WCHAR));
|
Buffer = ConsoleAllocHeap(HEAP_ZERO_MEMORY, Length + sizeof(WCHAR));
|
||||||
if (!Buffer)
|
if (!Buffer)
|
||||||
{
|
return STATUS_NO_MEMORY;
|
||||||
Status = STATUS_NO_MEMORY;
|
|
||||||
goto Quit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free the old title */
|
/* Free the old title */
|
||||||
ConsoleFreeUnicodeString(&Console->Title);
|
ConsoleFreeUnicodeString(&Console->Title);
|
||||||
|
@ -1462,11 +1446,8 @@ CSR_API(SrvSetConsoleTitle)
|
||||||
Console->Title.Buffer[Console->Title.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
Console->Title.Buffer[Console->Title.Length / sizeof(WCHAR)] = UNICODE_NULL;
|
||||||
|
|
||||||
TermChangeTitle(Console);
|
TermChangeTitle(Console);
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
Quit:
|
return STATUS_SUCCESS;
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
|
@ -1474,24 +1455,15 @@ ConDrvGetConsoleCP(IN PCONSOLE Console,
|
||||||
OUT PUINT CodePage,
|
OUT PUINT CodePage,
|
||||||
IN BOOLEAN OutputCP);
|
IN BOOLEAN OutputCP);
|
||||||
/* API_NUMBER: ConsolepGetCP */
|
/* API_NUMBER: ConsolepGetCP */
|
||||||
CSR_API(SrvGetConsoleCP)
|
CON_API(SrvGetConsoleCP,
|
||||||
|
CONSOLE_GETINPUTOUTPUTCP, GetConsoleCPRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleCPRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
DPRINT("SrvGetConsoleCP, getting %s Code Page\n",
|
DPRINT("SrvGetConsoleCP, getting %s Code Page\n",
|
||||||
GetConsoleCPRequest->OutputCP ? "Output" : "Input");
|
GetConsoleCPRequest->OutputCP ? "Output" : "Input");
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
|
return ConDrvGetConsoleCP((PCONSOLE)Console,
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
&GetConsoleCPRequest->CodePage,
|
||||||
|
GetConsoleCPRequest->OutputCP);
|
||||||
Status = ConDrvGetConsoleCP((PCONSOLE)Console,
|
|
||||||
&GetConsoleCPRequest->CodePage,
|
|
||||||
GetConsoleCPRequest->OutputCP);
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
|
@ -1499,33 +1471,21 @@ ConDrvSetConsoleCP(IN PCONSOLE Console,
|
||||||
IN UINT CodePage,
|
IN UINT CodePage,
|
||||||
IN BOOLEAN OutputCP);
|
IN BOOLEAN OutputCP);
|
||||||
/* API_NUMBER: ConsolepSetCP */
|
/* API_NUMBER: ConsolepSetCP */
|
||||||
CSR_API(SrvSetConsoleCP)
|
CON_API(SrvSetConsoleCP,
|
||||||
|
CONSOLE_SETINPUTOUTPUTCP, SetConsoleCPRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_INVALID_PARAMETER;
|
|
||||||
PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetConsoleCPRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleCP, setting %s Code Page\n",
|
DPRINT("SrvSetConsoleCP, setting %s Code Page\n",
|
||||||
SetConsoleCPRequest->OutputCP ? "Output" : "Input");
|
SetConsoleCPRequest->OutputCP ? "Output" : "Input");
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
|
return ConDrvSetConsoleCP((PCONSOLE)Console,
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
SetConsoleCPRequest->CodePage,
|
||||||
|
SetConsoleCPRequest->OutputCP);
|
||||||
Status = ConDrvSetConsoleCP((PCONSOLE)Console,
|
|
||||||
SetConsoleCPRequest->CodePage,
|
|
||||||
SetConsoleCPRequest->OutputCP);
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetProcessList */
|
/* API_NUMBER: ConsolepGetProcessList */
|
||||||
CSR_API(SrvGetConsoleProcessList)
|
CON_API(SrvGetConsoleProcessList,
|
||||||
|
CONSOLE_GETPROCESSLIST, GetProcessListRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETPROCESSLIST GetProcessListRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetProcessListRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
if (!CsrValidateMessageBuffer(ApiMessage,
|
if (!CsrValidateMessageBuffer(ApiMessage,
|
||||||
(PVOID)&GetProcessListRequest->ProcessIdsList,
|
(PVOID)&GetProcessListRequest->ProcessIdsList,
|
||||||
GetProcessListRequest->ProcessCount,
|
GetProcessListRequest->ProcessCount,
|
||||||
|
@ -1534,76 +1494,40 @@ CSR_API(SrvGetConsoleProcessList)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
|
return ConSrvGetConsoleProcessList(Console,
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
GetProcessListRequest->ProcessIdsList,
|
||||||
|
GetProcessListRequest->ProcessCount,
|
||||||
Status = ConSrvGetConsoleProcessList(Console,
|
&GetProcessListRequest->ProcessCount);
|
||||||
GetProcessListRequest->ProcessIdsList,
|
|
||||||
GetProcessListRequest->ProcessCount,
|
|
||||||
&GetProcessListRequest->ProcessCount);
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGenerateCtrlEvent */
|
/* API_NUMBER: ConsolepGenerateCtrlEvent */
|
||||||
CSR_API(SrvGenerateConsoleCtrlEvent)
|
CON_API(SrvGenerateConsoleCtrlEvent,
|
||||||
|
CONSOLE_GENERATECTRLEVENT, GenerateCtrlEventRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
return ConSrvConsoleProcessCtrlEvent(Console,
|
||||||
PCONSOLE_GENERATECTRLEVENT GenerateCtrlEventRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GenerateCtrlEventRequest;
|
GenerateCtrlEventRequest->ProcessGroupId,
|
||||||
PCONSRV_CONSOLE Console;
|
GenerateCtrlEventRequest->CtrlEvent);
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Status = ConSrvConsoleProcessCtrlEvent(Console,
|
|
||||||
GenerateCtrlEventRequest->ProcessGroupId,
|
|
||||||
GenerateCtrlEventRequest->CtrlEvent);
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepNotifyLastClose */
|
/* API_NUMBER: ConsolepNotifyLastClose */
|
||||||
CSR_API(SrvConsoleNotifyLastClose)
|
CON_API(SrvConsoleNotifyLastClose,
|
||||||
|
CONSOLE_NOTIFYLASTCLOSE, NotifyLastCloseRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ProcessData, &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Only one process is allowed to be registered for last close notification */
|
/* Only one process is allowed to be registered for last close notification */
|
||||||
if (!Console->NotifyLastClose)
|
if (Console->NotifyLastClose)
|
||||||
{
|
return STATUS_ACCESS_DENIED;
|
||||||
Console->NotifyLastClose = TRUE;
|
|
||||||
Console->NotifiedLastCloseProcess = ProcessData;
|
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Status = STATUS_ACCESS_DENIED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
Console->NotifyLastClose = TRUE;
|
||||||
return Status;
|
Console->NotifiedLastCloseProcess = ProcessData;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetMouseInfo */
|
/* API_NUMBER: ConsolepGetMouseInfo */
|
||||||
CSR_API(SrvGetConsoleMouseInfo)
|
CON_API(SrvGetConsoleMouseInfo,
|
||||||
|
CONSOLE_GETMOUSEINFO, GetMouseInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETMOUSEINFO GetMouseInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetMouseInfoRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Just retrieve the number of buttons of the mouse attached to this console */
|
/* Just retrieve the number of buttons of the mouse attached to this console */
|
||||||
GetMouseInfoRequest->NumButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
|
GetMouseInfoRequest->NumButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1615,22 +1539,15 @@ CSR_API(SrvSetConsoleKeyShortcuts)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetKeyboardLayoutName */
|
/* API_NUMBER: ConsolepGetKeyboardLayoutName */
|
||||||
CSR_API(SrvGetConsoleKeyboardLayoutName)
|
CON_API(SrvGetConsoleKeyboardLayoutName,
|
||||||
|
CONSOLE_GETKBDLAYOUTNAME, GetKbdLayoutNameRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETKBDLAYOUTNAME GetKbdLayoutNameRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetKbdLayoutNameRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
/* Retrieve the keyboard layout name of the system */
|
/* Retrieve the keyboard layout name of the system */
|
||||||
if (GetKbdLayoutNameRequest->Ansi)
|
if (GetKbdLayoutNameRequest->Ansi)
|
||||||
GetKeyboardLayoutNameA((PCHAR)GetKbdLayoutNameRequest->LayoutBuffer);
|
GetKeyboardLayoutNameA((PCHAR)GetKbdLayoutNameRequest->LayoutBuffer);
|
||||||
else
|
else
|
||||||
GetKeyboardLayoutNameW((PWCHAR)GetKbdLayoutNameRequest->LayoutBuffer);
|
GetKeyboardLayoutNameW((PWCHAR)GetKbdLayoutNameRequest->LayoutBuffer);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ typedef struct ConsoleInput_t
|
||||||
#include "include/conio.h"
|
#include "include/conio.h"
|
||||||
#include "include/conio_winsrv.h"
|
#include "include/conio_winsrv.h"
|
||||||
|
|
||||||
|
#include "api.h" // For the CON_API_* macros.
|
||||||
#include "include/console.h"
|
#include "include/console.h"
|
||||||
#include "include/settings.h"
|
#include "include/settings.h"
|
||||||
#include "include/term.h"
|
#include "include/term.h"
|
||||||
|
|
|
@ -53,30 +53,27 @@ SetConsoleHardwareState(PCONSRV_CONSOLE Console, ULONG ConsoleHwState)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetHardwareState */
|
/* API_NUMBER: ConsolepGetHardwareState */
|
||||||
CSR_API(SrvGetConsoleHardwareState)
|
CON_API(SrvGetConsoleHardwareState,
|
||||||
|
CONSOLE_GETSETHWSTATE, HardwareStateRequest)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
HardwareStateRequest->OutputHandle,
|
HardwareStateRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_READ,
|
GENERIC_READ,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
|
||||||
DPRINT1("Failed to get console handle in SrvGetConsoleHardwareState\n");
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
HardwareStateRequest->State = Console->HardwareState;
|
HardwareStateRequest->State = Console->HardwareState;
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
||||||
return Status;
|
return STATUS_SUCCESS;
|
||||||
#else
|
#else
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
@ -84,31 +81,28 @@ CSR_API(SrvGetConsoleHardwareState)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetHardwareState */
|
/* API_NUMBER: ConsolepSetHardwareState */
|
||||||
CSR_API(SrvSetConsoleHardwareState)
|
CON_API(SrvSetConsoleHardwareState,
|
||||||
|
CONSOLE_GETSETHWSTATE, HardwareStateRequest)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
HardwareStateRequest->OutputHandle,
|
HardwareStateRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_WRITE,
|
GENERIC_WRITE,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
|
||||||
DPRINT1("Failed to get console handle in SrvSetConsoleHardwareState\n");
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
|
||||||
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
DPRINT("Setting console hardware state.\n");
|
DPRINT("Setting console hardware state.\n");
|
||||||
Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
|
||||||
Status = SetConsoleHardwareState(Console, HardwareStateRequest->State);
|
Status = SetConsoleHardwareState(Console, HardwareStateRequest->State);
|
||||||
|
|
||||||
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
ConSrvReleaseScreenBuffer(Buff, TRUE);
|
||||||
return Status;
|
return STATUS_SUCCESS;
|
||||||
#else
|
#else
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
@ -116,38 +110,29 @@ CSR_API(SrvSetConsoleHardwareState)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetDisplayMode */
|
/* API_NUMBER: ConsolepGetDisplayMode */
|
||||||
CSR_API(SrvGetConsoleDisplayMode)
|
CON_API(SrvGetConsoleDisplayMode,
|
||||||
|
CONSOLE_GETDISPLAYMODE, GetDisplayModeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetDisplayModeRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
GetDisplayModeRequest->DisplayMode = TermGetDisplayMode(Console);
|
GetDisplayModeRequest->DisplayMode = TermGetDisplayMode(Console);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetDisplayMode */
|
/* API_NUMBER: ConsolepSetDisplayMode */
|
||||||
CSR_API(SrvSetConsoleDisplayMode)
|
CON_API(SrvSetConsoleDisplayMode,
|
||||||
|
CONSOLE_SETDISPLAYMODE, SetDisplayModeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetDisplayModeRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetScreenBuffer(ProcessData,
|
||||||
SetDisplayModeRequest->OutputHandle,
|
SetDisplayModeRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_WRITE,
|
GENERIC_WRITE,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
if (TermSetDisplayMode(Console, SetDisplayModeRequest->DisplayMode))
|
if (TermSetDisplayMode(Console, SetDisplayModeRequest->DisplayMode))
|
||||||
{
|
{
|
||||||
|
@ -164,21 +149,21 @@ CSR_API(SrvSetConsoleDisplayMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetLargestWindowSize */
|
/* API_NUMBER: ConsolepGetLargestWindowSize */
|
||||||
CSR_API(SrvGetLargestConsoleWindowSize)
|
CON_API(SrvGetLargestConsoleWindowSize,
|
||||||
|
CONSOLE_GETLARGESTWINDOWSIZE, GetLargestWindowSizeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetLargestWindowSizeRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
GetLargestWindowSizeRequest->OutputHandle,
|
GetLargestWindowSizeRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_READ,
|
GENERIC_READ,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Retrieve the largest possible console window size, without
|
* Retrieve the largest possible console window size, without
|
||||||
|
@ -192,21 +177,21 @@ CSR_API(SrvGetLargestConsoleWindowSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepShowCursor */
|
/* API_NUMBER: ConsolepShowCursor */
|
||||||
CSR_API(SrvShowConsoleCursor)
|
CON_API(SrvShowConsoleCursor,
|
||||||
|
CONSOLE_SHOWCURSOR, ShowCursorRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SHOWCURSOR ShowCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ShowCursorRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetScreenBuffer(ProcessData,
|
||||||
ShowCursorRequest->OutputHandle,
|
ShowCursorRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_WRITE,
|
GENERIC_WRITE,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
ShowCursorRequest->RefCount = TermShowMouseCursor(Console, ShowCursorRequest->Show);
|
ShowCursorRequest->RefCount = TermShowMouseCursor(Console, ShowCursorRequest->Show);
|
||||||
|
|
||||||
|
@ -215,25 +200,25 @@ CSR_API(SrvShowConsoleCursor)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetCursor */
|
/* API_NUMBER: ConsolepSetCursor */
|
||||||
CSR_API(SrvSetConsoleCursor)
|
CON_API(SrvSetConsoleCursor,
|
||||||
|
CONSOLE_SETCURSOR, SetCursorRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
BOOL Success;
|
BOOL Success;
|
||||||
PCONSOLE_SETCURSOR SetCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
// NOTE: Tests show that this function is used only for graphics screen buffers
|
// NOTE: Tests show that this function is used only for graphics screen buffers
|
||||||
// and otherwise it returns FALSE and sets last error to ERROR_INVALID_HANDLE.
|
// and otherwise it returns FALSE and sets last error to ERROR_INVALID_HANDLE.
|
||||||
// I find that behaviour is ridiculous but ok, let's accept it at the moment...
|
// I find that behaviour is ridiculous but ok, let's accept it at the moment...
|
||||||
Status = ConSrvGetGraphicsBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetGraphicsBuffer(ProcessData,
|
||||||
SetCursorRequest->OutputHandle,
|
SetCursorRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_WRITE,
|
GENERIC_WRITE,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
Success = TermSetMouseCursor(Console, SetCursorRequest->CursorHandle);
|
Success = TermSetMouseCursor(Console, SetCursorRequest->CursorHandle);
|
||||||
|
|
||||||
|
@ -242,21 +227,21 @@ CSR_API(SrvSetConsoleCursor)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepMenuControl */
|
/* API_NUMBER: ConsolepMenuControl */
|
||||||
CSR_API(SrvConsoleMenuControl)
|
CON_API(SrvConsoleMenuControl,
|
||||||
|
CONSOLE_MENUCONTROL, MenuControlRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_MENUCONTROL MenuControlRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.MenuControlRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetScreenBuffer(ProcessData,
|
||||||
MenuControlRequest->OutputHandle,
|
MenuControlRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_WRITE,
|
GENERIC_WRITE,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
MenuControlRequest->MenuHandle = TermMenuControl(Console,
|
MenuControlRequest->MenuHandle = TermMenuControl(Console,
|
||||||
MenuControlRequest->CmdIdLow,
|
MenuControlRequest->CmdIdLow,
|
||||||
|
@ -267,21 +252,11 @@ CSR_API(SrvConsoleMenuControl)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetMenuClose */
|
/* API_NUMBER: ConsolepSetMenuClose */
|
||||||
CSR_API(SrvSetConsoleMenuClose)
|
CON_API(SrvSetConsoleMenuClose,
|
||||||
|
CONSOLE_SETMENUCLOSE, SetMenuCloseRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
return (TermSetMenuClose(Console, SetMenuCloseRequest->Enable)
|
||||||
BOOL Success;
|
? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
|
||||||
PCONSOLE_SETMENUCLOSE SetMenuCloseRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetMenuCloseRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Success = TermSetMenuClose(Console, SetMenuCloseRequest->Enable);
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return (Success ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Used by USERSRV!SrvGetThreadConsoleDesktop() */
|
/* Used by USERSRV!SrvGetThreadConsoleDesktop() */
|
||||||
|
@ -321,97 +296,58 @@ GetThreadConsoleDesktop(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetConsoleWindow */
|
/* API_NUMBER: ConsolepGetConsoleWindow */
|
||||||
CSR_API(SrvGetConsoleWindow)
|
CON_API(SrvGetConsoleWindow,
|
||||||
|
CONSOLE_GETWINDOW, GetWindowRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETWINDOW GetWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetWindowRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
GetWindowRequest->WindowHandle = TermGetConsoleWindowHandle(Console);
|
GetWindowRequest->WindowHandle = TermGetConsoleWindowHandle(Console);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetIcon */
|
/* API_NUMBER: ConsolepSetIcon */
|
||||||
CSR_API(SrvSetConsoleIcon)
|
CON_API(SrvSetConsoleIcon,
|
||||||
|
CONSOLE_SETICON, SetIconRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
return (TermChangeIcon(Console, SetIconRequest->IconHandle)
|
||||||
PCONSOLE_SETICON SetIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetIconRequest;
|
? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Status = (TermChangeIcon(Console, SetIconRequest->IconHandle)
|
|
||||||
? STATUS_SUCCESS
|
|
||||||
: STATUS_UNSUCCESSFUL);
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetSelectionInfo */
|
/* API_NUMBER: ConsolepGetSelectionInfo */
|
||||||
CSR_API(SrvGetConsoleSelectionInfo)
|
CON_API(SrvGetConsoleSelectionInfo,
|
||||||
|
CONSOLE_GETSELECTIONINFO, GetSelectionInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
return (TermGetSelectionInfo(Console, &GetSelectionInfoRequest->Info)
|
||||||
PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetSelectionInfoRequest;
|
? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Status = (TermGetSelectionInfo(Console, &GetSelectionInfoRequest->Info)
|
|
||||||
? STATUS_SUCCESS
|
|
||||||
: STATUS_UNSUCCESSFUL);
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetNumberOfFonts */
|
/* API_NUMBER: ConsolepGetNumberOfFonts */
|
||||||
CSR_API(SrvGetConsoleNumberOfFonts)
|
CON_API(SrvGetConsoleNumberOfFonts,
|
||||||
|
CONSOLE_GETNUMFONTS, GetNumFontsRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETNUMFONTS GetNumFontsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetNumFontsRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
// FIXME!
|
// FIXME!
|
||||||
// TermGetNumberOfFonts(Console, ...);
|
// TermGetNumberOfFonts(Console, ...);
|
||||||
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
||||||
GetNumFontsRequest->NumFonts = 0;
|
GetNumFontsRequest->NumFonts = 0;
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetFontInfo */
|
/* API_NUMBER: ConsolepGetFontInfo */
|
||||||
CSR_API(SrvGetConsoleFontInfo)
|
CON_API(SrvGetConsoleFontInfo,
|
||||||
|
CONSOLE_GETFONTINFO, GetFontInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETFONTINFO GetFontInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetFontInfoRequest;
|
|
||||||
// PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
GetFontInfoRequest->OutputHandle,
|
GetFontInfoRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_READ,
|
GENERIC_READ,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
// FIXME!
|
// FIXME!
|
||||||
// Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
|
||||||
// TermGetFontInfo(Console, ...);
|
// TermGetFontInfo(Console, ...);
|
||||||
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
||||||
GetFontInfoRequest->NumFonts = 0;
|
GetFontInfoRequest->NumFonts = 0;
|
||||||
|
@ -421,22 +357,23 @@ CSR_API(SrvGetConsoleFontInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetFontSize */
|
/* API_NUMBER: ConsolepGetFontSize */
|
||||||
CSR_API(SrvGetConsoleFontSize)
|
CON_API(SrvGetConsoleFontSize,
|
||||||
|
CONSOLE_GETFONTSIZE, GetFontSizeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETFONTSIZE GetFontSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetFontSizeRequest;
|
|
||||||
// PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
GetFontSizeRequest->OutputHandle,
|
GetFontSizeRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_READ,
|
GENERIC_READ,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
// FIXME!
|
// FIXME!
|
||||||
// Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
|
||||||
// TermGetFontSize(Console, ...);
|
// TermGetFontSize(Console, ...);
|
||||||
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
||||||
|
|
||||||
|
@ -445,22 +382,23 @@ CSR_API(SrvGetConsoleFontSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetCurrentFont */
|
/* API_NUMBER: ConsolepGetCurrentFont */
|
||||||
CSR_API(SrvGetConsoleCurrentFont)
|
CON_API(SrvGetConsoleCurrentFont,
|
||||||
|
CONSOLE_GETCURRENTFONT, GetCurrentFontRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETCURRENTFONT GetCurrentFontRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCurrentFontRequest;
|
|
||||||
// PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
GetCurrentFontRequest->OutputHandle,
|
GetCurrentFontRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_READ,
|
GENERIC_READ,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
// FIXME!
|
// FIXME!
|
||||||
// Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
|
||||||
// TermGetCurrentFont(Console, ...);
|
// TermGetCurrentFont(Console, ...);
|
||||||
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
||||||
GetCurrentFontRequest->FontIndex = 0;
|
GetCurrentFontRequest->FontIndex = 0;
|
||||||
|
@ -470,22 +408,23 @@ CSR_API(SrvGetConsoleCurrentFont)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetFont */
|
/* API_NUMBER: ConsolepSetFont */
|
||||||
CSR_API(SrvSetConsoleFont)
|
CON_API(SrvSetConsoleFont,
|
||||||
|
CONSOLE_SETFONT, SetFontRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETFONT SetFontRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetFontRequest;
|
|
||||||
// PCONSRV_CONSOLE Console;
|
|
||||||
PCONSOLE_SCREEN_BUFFER Buff;
|
PCONSOLE_SCREEN_BUFFER Buff;
|
||||||
|
|
||||||
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetTextModeBuffer(ProcessData,
|
||||||
SetFontRequest->OutputHandle,
|
SetFontRequest->OutputHandle,
|
||||||
&Buff,
|
&Buff,
|
||||||
GENERIC_WRITE,
|
GENERIC_WRITE,
|
||||||
TRUE);
|
TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
ASSERT((PCONSOLE)Console == Buff->Header.Console);
|
||||||
|
|
||||||
// FIXME!
|
// FIXME!
|
||||||
// Console = (PCONSRV_CONSOLE)Buff->Header.Console;
|
|
||||||
// TermSetFont(Console, ...);
|
// TermSetFont(Console, ...);
|
||||||
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
DPRINT1("%s not yet implemented\n", __FUNCTION__);
|
||||||
|
|
||||||
|
|
|
@ -810,7 +810,8 @@ ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData)
|
||||||
/* PUBLIC SERVER APIS *********************************************************/
|
/* PUBLIC SERVER APIS *********************************************************/
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepOpenConsole */
|
/* API_NUMBER: ConsolepOpenConsole */
|
||||||
CSR_API(SrvOpenConsole)
|
CON_API(SrvOpenConsole,
|
||||||
|
CONSOLE_OPENCONSOLE, OpenConsoleRequest)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* This API opens a handle to either the input buffer or to
|
* This API opens a handle to either the input buffer or to
|
||||||
|
@ -818,23 +819,12 @@ CSR_API(SrvOpenConsole)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_OPENCONSOLE OpenConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.OpenConsoleRequest;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
DWORD DesiredAccess = OpenConsoleRequest->DesiredAccess;
|
DWORD DesiredAccess = OpenConsoleRequest->DesiredAccess;
|
||||||
DWORD ShareMode = OpenConsoleRequest->ShareMode;
|
DWORD ShareMode = OpenConsoleRequest->ShareMode;
|
||||||
PCONSOLE_IO_OBJECT Object;
|
PCONSOLE_IO_OBJECT Object;
|
||||||
|
|
||||||
OpenConsoleRequest->Handle = INVALID_HANDLE_VALUE;
|
OpenConsoleRequest->Handle = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ProcessData, &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -869,18 +859,14 @@ CSR_API(SrvOpenConsole)
|
||||||
|
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepDuplicateHandle */
|
/* API_NUMBER: ConsolepDuplicateHandle */
|
||||||
CSR_API(SrvDuplicateHandle)
|
CON_API(SrvDuplicateHandle,
|
||||||
|
CONSOLE_DUPLICATEHANDLE, DuplicateHandleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_DUPLICATEHANDLE DuplicateHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.DuplicateHandleRequest;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
HANDLE SourceHandle = DuplicateHandleRequest->SourceHandle;
|
HANDLE SourceHandle = DuplicateHandleRequest->SourceHandle;
|
||||||
ULONG Index = HandleToULong(SourceHandle) >> 2;
|
ULONG Index = HandleToULong(SourceHandle) >> 2;
|
||||||
PCONSOLE_IO_HANDLE Entry;
|
PCONSOLE_IO_HANDLE Entry;
|
||||||
|
@ -888,13 +874,6 @@ CSR_API(SrvDuplicateHandle)
|
||||||
|
|
||||||
DuplicateHandleRequest->TargetHandle = INVALID_HANDLE_VALUE;
|
DuplicateHandleRequest->TargetHandle = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ProcessData, &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
// ASSERT( (ProcessData->HandleTable == NULL && ProcessData->HandleTableSize == 0) ||
|
// ASSERT( (ProcessData->HandleTable == NULL && ProcessData->HandleTableSize == 0) ||
|
||||||
|
@ -943,29 +922,18 @@ CSR_API(SrvDuplicateHandle)
|
||||||
Quit:
|
Quit:
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetHandleInformation */
|
/* API_NUMBER: ConsolepGetHandleInformation */
|
||||||
CSR_API(SrvGetHandleInformation)
|
CON_API(SrvGetHandleInformation,
|
||||||
|
CONSOLE_GETHANDLEINFO, GetHandleInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETHANDLEINFO GetHandleInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetHandleInfoRequest;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
HANDLE Handle = GetHandleInfoRequest->Handle;
|
HANDLE Handle = GetHandleInfoRequest->Handle;
|
||||||
ULONG Index = HandleToULong(Handle) >> 2;
|
ULONG Index = HandleToULong(Handle) >> 2;
|
||||||
PCONSOLE_IO_HANDLE Entry;
|
PCONSOLE_IO_HANDLE Entry;
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ProcessData, &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
ASSERT(ProcessData->HandleTable);
|
ASSERT(ProcessData->HandleTable);
|
||||||
|
@ -992,29 +960,18 @@ CSR_API(SrvGetHandleInformation)
|
||||||
Quit:
|
Quit:
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetHandleInformation */
|
/* API_NUMBER: ConsolepSetHandleInformation */
|
||||||
CSR_API(SrvSetHandleInformation)
|
CON_API(SrvSetHandleInformation,
|
||||||
|
CONSOLE_SETHANDLEINFO, SetHandleInfoRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_SETHANDLEINFO SetHandleInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHandleInfoRequest;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
HANDLE Handle = SetHandleInfoRequest->Handle;
|
HANDLE Handle = SetHandleInfoRequest->Handle;
|
||||||
ULONG Index = HandleToULong(Handle) >> 2;
|
ULONG Index = HandleToULong(Handle) >> 2;
|
||||||
PCONSOLE_IO_HANDLE Entry;
|
PCONSOLE_IO_HANDLE Entry;
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ProcessData, &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
ASSERT(ProcessData->HandleTable);
|
ASSERT(ProcessData->HandleTable);
|
||||||
|
@ -1043,51 +1000,25 @@ CSR_API(SrvSetHandleInformation)
|
||||||
Quit:
|
Quit:
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepCloseHandle */
|
/* API_NUMBER: ConsolepCloseHandle */
|
||||||
CSR_API(SrvCloseHandle)
|
CON_API(SrvCloseHandle,
|
||||||
|
CONSOLE_CLOSEHANDLE, CloseHandleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
return ConSrvRemoveObject(ProcessData, CloseHandleRequest->Handle);
|
||||||
PCONSOLE_CLOSEHANDLE CloseHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CloseHandleRequest;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ProcessData, &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = ConSrvRemoveObject(ProcessData, CloseHandleRequest->Handle);
|
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepVerifyIoHandle */
|
/* API_NUMBER: ConsolepVerifyIoHandle */
|
||||||
CSR_API(SrvVerifyConsoleIoHandle)
|
CON_API(SrvVerifyConsoleIoHandle,
|
||||||
|
CONSOLE_VERIFYHANDLE, VerifyHandleRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_VERIFYHANDLE VerifyHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.VerifyHandleRequest;
|
|
||||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
HANDLE IoHandle = VerifyHandleRequest->Handle;
|
HANDLE IoHandle = VerifyHandleRequest->Handle;
|
||||||
ULONG Index = HandleToULong(IoHandle) >> 2;
|
ULONG Index = HandleToULong(IoHandle) >> 2;
|
||||||
|
|
||||||
VerifyHandleRequest->IsValid = FALSE;
|
VerifyHandleRequest->IsValid = FALSE;
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ProcessData, &Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
// ASSERT( (ProcessData->HandleTable == NULL && ProcessData->HandleTableSize == 0) ||
|
// ASSERT( (ProcessData->HandleTable == NULL && ProcessData->HandleTableSize == 0) ||
|
||||||
|
@ -1106,7 +1037,6 @@ CSR_API(SrvVerifyConsoleIoHandle)
|
||||||
|
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -423,16 +423,13 @@ HistoryReshapeAllBuffers(
|
||||||
/* PUBLIC SERVER APIS *********************************************************/
|
/* PUBLIC SERVER APIS *********************************************************/
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetCommandHistory */
|
/* API_NUMBER: ConsolepGetCommandHistory */
|
||||||
CSR_API(SrvGetConsoleCommandHistory)
|
CON_API(SrvGetConsoleCommandHistory,
|
||||||
|
CONSOLE_GETCOMMANDHISTORY, GetCommandHistoryRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PCONSOLE_GETCOMMANDHISTORY GetCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
ULONG BytesWritten = 0;
|
ULONG BytesWritten = 0;
|
||||||
PHISTORY_BUFFER Hist;
|
PHISTORY_BUFFER Hist;
|
||||||
|
|
||||||
DPRINT1("SrvGetConsoleCommandHistory entered\n");
|
|
||||||
|
|
||||||
if ( !CsrValidateMessageBuffer(ApiMessage,
|
if ( !CsrValidateMessageBuffer(ApiMessage,
|
||||||
(PVOID*)&GetCommandHistoryRequest->History,
|
(PVOID*)&GetCommandHistoryRequest->History,
|
||||||
GetCommandHistoryRequest->HistoryLength,
|
GetCommandHistoryRequest->HistoryLength,
|
||||||
|
@ -445,10 +442,6 @@ CSR_API(SrvGetConsoleCommandHistory)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Hist = HistoryFindBuffer(Console,
|
Hist = HistoryFindBuffer(Console,
|
||||||
GetCommandHistoryRequest->ExeName,
|
GetCommandHistoryRequest->ExeName,
|
||||||
GetCommandHistoryRequest->ExeLength,
|
GetCommandHistoryRequest->ExeLength,
|
||||||
|
@ -508,16 +501,13 @@ CSR_API(SrvGetConsoleCommandHistory)
|
||||||
// GetCommandHistoryRequest->HistoryLength = TargetBuffer - (PBYTE)GetCommandHistoryRequest->History;
|
// GetCommandHistoryRequest->HistoryLength = TargetBuffer - (PBYTE)GetCommandHistoryRequest->History;
|
||||||
GetCommandHistoryRequest->HistoryLength = BytesWritten;
|
GetCommandHistoryRequest->HistoryLength = BytesWritten;
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetCommandHistoryLength */
|
/* API_NUMBER: ConsolepGetCommandHistoryLength */
|
||||||
CSR_API(SrvGetConsoleCommandHistoryLength)
|
CON_API(SrvGetConsoleCommandHistoryLength,
|
||||||
|
CONSOLE_GETCOMMANDHISTORYLENGTH, GetCommandHistoryLengthRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_GETCOMMANDHISTORYLENGTH GetCommandHistoryLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryLengthRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PHISTORY_BUFFER Hist;
|
PHISTORY_BUFFER Hist;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
|
|
||||||
|
@ -529,10 +519,6 @@ CSR_API(SrvGetConsoleCommandHistoryLength)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Hist = HistoryFindBuffer(Console,
|
Hist = HistoryFindBuffer(Console,
|
||||||
GetCommandHistoryLengthRequest->ExeName,
|
GetCommandHistoryLengthRequest->ExeName,
|
||||||
GetCommandHistoryLengthRequest->ExeLength,
|
GetCommandHistoryLengthRequest->ExeLength,
|
||||||
|
@ -552,16 +538,13 @@ CSR_API(SrvGetConsoleCommandHistoryLength)
|
||||||
|
|
||||||
GetCommandHistoryLengthRequest->HistoryLength = Length;
|
GetCommandHistoryLengthRequest->HistoryLength = Length;
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
return STATUS_SUCCESS;
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepExpungeCommandHistory */
|
/* API_NUMBER: ConsolepExpungeCommandHistory */
|
||||||
CSR_API(SrvExpungeConsoleCommandHistory)
|
CON_API(SrvExpungeConsoleCommandHistory,
|
||||||
|
CONSOLE_EXPUNGECOMMANDHISTORY, ExpungeCommandHistoryRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_EXPUNGECOMMANDHISTORY ExpungeCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ExpungeCommandHistoryRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PHISTORY_BUFFER Hist;
|
PHISTORY_BUFFER Hist;
|
||||||
|
|
||||||
if (!CsrValidateMessageBuffer(ApiMessage,
|
if (!CsrValidateMessageBuffer(ApiMessage,
|
||||||
|
@ -572,26 +555,20 @@ CSR_API(SrvExpungeConsoleCommandHistory)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Hist = HistoryFindBuffer(Console,
|
Hist = HistoryFindBuffer(Console,
|
||||||
ExpungeCommandHistoryRequest->ExeName,
|
ExpungeCommandHistoryRequest->ExeName,
|
||||||
ExpungeCommandHistoryRequest->ExeLength,
|
ExpungeCommandHistoryRequest->ExeLength,
|
||||||
ExpungeCommandHistoryRequest->Unicode2);
|
ExpungeCommandHistoryRequest->Unicode2);
|
||||||
HistoryDeleteBuffer(Hist);
|
HistoryDeleteBuffer(Hist);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
return STATUS_SUCCESS;
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetNumberOfCommands */
|
/* API_NUMBER: ConsolepSetNumberOfCommands */
|
||||||
CSR_API(SrvSetConsoleNumberOfCommands)
|
CON_API(SrvSetConsoleNumberOfCommands,
|
||||||
|
CONSOLE_SETHISTORYNUMBERCOMMANDS, SetHistoryNumberCommandsRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PCONSOLE_SETHISTORYNUMBERCOMMANDS SetHistoryNumberCommandsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryNumberCommandsRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
PHISTORY_BUFFER Hist;
|
PHISTORY_BUFFER Hist;
|
||||||
|
|
||||||
if (!CsrValidateMessageBuffer(ApiMessage,
|
if (!CsrValidateMessageBuffer(ApiMessage,
|
||||||
|
@ -602,10 +579,6 @@ CSR_API(SrvSetConsoleNumberOfCommands)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Hist = HistoryFindBuffer(Console,
|
Hist = HistoryFindBuffer(Console,
|
||||||
SetHistoryNumberCommandsRequest->ExeName,
|
SetHistoryNumberCommandsRequest->ExeName,
|
||||||
SetHistoryNumberCommandsRequest->ExeLength,
|
SetHistoryNumberCommandsRequest->ExeLength,
|
||||||
|
@ -615,21 +588,21 @@ CSR_API(SrvSetConsoleNumberOfCommands)
|
||||||
Status = HistoryResizeBuffer(Hist, SetHistoryNumberCommandsRequest->NumCommands);
|
Status = HistoryResizeBuffer(Hist, SetHistoryNumberCommandsRequest->NumCommands);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepGetHistory */
|
/* API_NUMBER: ConsolepGetHistory */
|
||||||
CSR_API(SrvGetConsoleHistory)
|
CON_API_NOCONSOLE(SrvGetConsoleHistory,
|
||||||
|
CONSOLE_GETSETHISTORYINFO, HistoryInfoRequest)
|
||||||
{
|
{
|
||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
|
#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETHISTORYINFO HistoryInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HistoryInfoRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
PCONSRV_CONSOLE Console;
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetConsole(ProcessData,
|
||||||
&Console, TRUE);
|
&Console, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
HistoryInfoRequest->HistoryBufferSize = Console->HistoryBufferSize;
|
HistoryInfoRequest->HistoryBufferSize = Console->HistoryBufferSize;
|
||||||
HistoryInfoRequest->NumberOfHistoryBuffers = Console->MaxNumberOfHistoryBuffers;
|
HistoryInfoRequest->NumberOfHistoryBuffers = Console->MaxNumberOfHistoryBuffers;
|
||||||
|
@ -644,16 +617,17 @@ CSR_API(SrvGetConsoleHistory)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetHistory */
|
/* API_NUMBER: ConsolepSetHistory */
|
||||||
CSR_API(SrvSetConsoleHistory)
|
CON_API_NOCONSOLE(SrvSetConsoleHistory,
|
||||||
|
CONSOLE_GETSETHISTORYINFO, HistoryInfoRequest)
|
||||||
{
|
{
|
||||||
#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
|
#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_GETSETHISTORYINFO HistoryInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HistoryInfoRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
PCONSRV_CONSOLE Console;
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
Status = ConSrvGetConsole(ProcessData,
|
||||||
&Console, TRUE);
|
&Console, TRUE);
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
HistoryReshapeAllBuffers(Console,
|
HistoryReshapeAllBuffers(Console,
|
||||||
HistoryInfoRequest->HistoryBufferSize,
|
HistoryInfoRequest->HistoryBufferSize,
|
||||||
|
@ -669,22 +643,13 @@ CSR_API(SrvSetConsoleHistory)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepSetCommandHistoryMode */
|
/* API_NUMBER: ConsolepSetCommandHistoryMode */
|
||||||
CSR_API(SrvSetConsoleCommandHistoryMode)
|
CON_API(SrvSetConsoleCommandHistoryMode,
|
||||||
|
CONSOLE_SETHISTORYMODE, SetHistoryModeRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
|
||||||
PCONSOLE_SETHISTORYMODE SetHistoryModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryModeRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
DPRINT("SrvSetConsoleCommandHistoryMode(Mode = %d) is not yet implemented\n",
|
DPRINT("SrvSetConsoleCommandHistoryMode(Mode = %d) is not yet implemented\n",
|
||||||
SetHistoryModeRequest->Mode);
|
SetHistoryModeRequest->Mode);
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status)) return Status;
|
|
||||||
|
|
||||||
Console->InsertMode = !!(SetHistoryModeRequest->Mode & CONSOLE_OVERSTRIKE);
|
Console->InsertMode = !!(SetHistoryModeRequest->Mode & CONSOLE_OVERSTRIKE);
|
||||||
|
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,22 +20,13 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepRegisterVDM */
|
/* API_NUMBER: ConsolepRegisterVDM */
|
||||||
CSR_API(SrvRegisterConsoleVDM)
|
CON_API(SrvRegisterConsoleVDM,
|
||||||
|
CONSOLE_REGISTERVDM, RegisterVDMRequest)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PCONSOLE_REGISTERVDM RegisterVDMRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.RegisterVDMRequest;
|
|
||||||
PCONSRV_CONSOLE Console;
|
|
||||||
|
|
||||||
DPRINT1("SrvRegisterConsoleVDM(%d)\n", RegisterVDMRequest->RegisterFlags);
|
DPRINT1("SrvRegisterConsoleVDM(%d)\n", RegisterVDMRequest->RegisterFlags);
|
||||||
|
|
||||||
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
|
||||||
&Console, TRUE);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
DPRINT1("Can't get console, status %lx\n", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RegisterVDMRequest->RegisterFlags != 0)
|
if (RegisterVDMRequest->RegisterFlags != 0)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER SectionSize;
|
LARGE_INTEGER SectionSize;
|
||||||
|
@ -69,7 +60,7 @@ CSR_API(SrvRegisterConsoleVDM)
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("Error: Impossible to create a shared section, Status = 0x%08lx\n", Status);
|
DPRINT1("Error: Impossible to create a shared section, Status = 0x%08lx\n", Status);
|
||||||
goto Quit;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -91,7 +82,7 @@ CSR_API(SrvRegisterConsoleVDM)
|
||||||
{
|
{
|
||||||
DPRINT1("Error: Impossible to map the shared section, Status = 0x%08lx\n", Status);
|
DPRINT1("Error: Impossible to map the shared section, Status = 0x%08lx\n", Status);
|
||||||
NtClose(Console->VDMBufferSection);
|
NtClose(Console->VDMBufferSection);
|
||||||
goto Quit;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -115,14 +106,14 @@ CSR_API(SrvRegisterConsoleVDM)
|
||||||
DPRINT1("Error: Impossible to map the shared section, Status = 0x%08lx\n", Status);
|
DPRINT1("Error: Impossible to map the shared section, Status = 0x%08lx\n", Status);
|
||||||
NtUnmapViewOfSection(NtCurrentProcess(), Console->VDMBuffer);
|
NtUnmapViewOfSection(NtCurrentProcess(), Console->VDMBuffer);
|
||||||
NtClose(Console->VDMBufferSection);
|
NtClose(Console->VDMBufferSection);
|
||||||
goto Quit;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Duplicate the event handles.
|
// TODO: Duplicate the event handles.
|
||||||
|
|
||||||
RegisterVDMRequest->VDMBuffer = Console->ClientVDMBuffer;
|
RegisterVDMRequest->VDMBuffer = Console->ClientVDMBuffer;
|
||||||
|
|
||||||
Status = STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -143,11 +134,9 @@ CSR_API(SrvRegisterConsoleVDM)
|
||||||
Console->VDMBuffer = Console->ClientVDMBuffer = NULL;
|
Console->VDMBuffer = Console->ClientVDMBuffer = NULL;
|
||||||
|
|
||||||
Console->VDMBufferSize.X = Console->VDMBufferSize.Y = 0;
|
Console->VDMBufferSize.X = Console->VDMBufferSize.Y = 0;
|
||||||
}
|
|
||||||
|
|
||||||
Quit:
|
return STATUS_SUCCESS;
|
||||||
ConSrvReleaseConsole(Console, TRUE);
|
}
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API_NUMBER: ConsolepVDMOperation */
|
/* API_NUMBER: ConsolepVDMOperation */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue