diff --git a/reactos/dll/win32/kernel32/misc/console.c b/reactos/dll/win32/kernel32/misc/console.c
index 09838a099a9..3104e28ccc4 100644
--- a/reactos/dll/win32/kernel32/misc/console.c
+++ b/reactos/dll/win32/kernel32/misc/console.c
@@ -217,7 +217,7 @@ AddConsoleAliasW (LPCWSTR lpSource,
Request->Data.AddConsoleAlias.TargetLength = TargetLength;
- CsrRequest = MAKE_CSR_API(ADD_CONSOLE_ALIAS, CSR_NATIVE);
+ CsrRequest = MAKE_CSR_API(ADD_CONSOLE_ALIAS, CSR_CONSOLE);
Status = CsrClientCallServer(Request,
NULL,
CsrRequest,
@@ -342,7 +342,7 @@ GetConsoleAliasW (LPWSTR lpSource,
DPRINT("GetConsoleAliasW entered lpSource %S lpExeName %S\n", lpSource, lpExeName);
- CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIAS, CSR_NATIVE);
+ CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIAS, CSR_CONSOLE);
ExeLength = wcslen(lpExeName) + 1;
SourceLength = wcslen(lpSource) + 1;
@@ -458,7 +458,7 @@ GetConsoleAliasExesW (LPWSTR lpExeNameBuffer,
return 0;
}
- CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES, CSR_NATIVE);
+ CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES, CSR_CONSOLE);
CsrAllocateMessagePointer(CaptureBuffer,
ExeNameBufferLength,
(PVOID*)&Request.Data.GetConsoleAliasesExes.ExeNames);
@@ -519,7 +519,7 @@ GetConsoleAliasExesLengthW (VOID)
DPRINT("GetConsoleAliasExesLengthW entered\n");
- CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CSR_NATIVE);
+ CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CSR_CONSOLE);
Request.Data.GetConsoleAliasesExesLength.Length = 0;
@@ -575,7 +575,7 @@ GetConsoleAliasesW (LPWSTR AliasBuffer,
if (!dwLength || dwLength > AliasBufferLength)
return 0;
- CsrRequest = MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES, CSR_NATIVE);
+ CsrRequest = MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES, CSR_CONSOLE);
Request.Data.GetAllConsoleAlias.AliasBuffer = AliasBuffer;
Request.Data.GetAllConsoleAlias.AliasBufferLength = AliasBufferLength;
Request.Data.GetAllConsoleAlias.lpExeName = ExeName;
@@ -639,7 +639,7 @@ GetConsoleAliasesLengthW (LPWSTR lpExeName)
DPRINT("GetConsoleAliasesLengthW entered\n");
- CsrRequest = MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CSR_NATIVE);
+ CsrRequest = MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CSR_CONSOLE);
Request.Data.GetAllConsoleAliasesLength.lpExeName = lpExeName;
Request.Data.GetAllConsoleAliasesLength.Length = 0;
diff --git a/reactos/subsystems/win32/csrss/csrss.rbuild b/reactos/subsystems/win32/csrss/csrss.rbuild
index 26c1426f32e..09eff8ba0bb 100644
--- a/reactos/subsystems/win32/csrss/csrss.rbuild
+++ b/reactos/subsystems/win32/csrss/csrss.rbuild
@@ -17,7 +17,6 @@
process.c
user.c
wapi.c
- alias.c
csrss.h
csrss.c
diff --git a/reactos/subsystems/win32/csrss/include/api.h b/reactos/subsystems/win32/csrss/include/api.h
index 0769c5ff47c..7ec1d22d176 100644
--- a/reactos/subsystems/win32/csrss/include/api.h
+++ b/reactos/subsystems/win32/csrss/include/api.h
@@ -156,13 +156,6 @@ CSR_API(CsrSetShutdownParameters);
CSR_API(CsrSetLogonNotifyWindow);
CSR_API(CsrRegisterLogonProcess);
-CSR_API(CsrAddConsoleAlias);
-CSR_API(CsrGetConsoleAlias);
-CSR_API(CsrGetAllConsoleAliases);
-CSR_API(CsrGetAllConsoleAliasesLength);
-CSR_API(CsrGetConsoleAliasesExes);
-CSR_API(CsrGetConsoleAliasesExesLength);
-
#endif /* ndef API_H_INCLUDED */
diff --git a/reactos/subsystems/win32/csrss/include/conio.h b/reactos/subsystems/win32/csrss/include/conio.h
index 4ab4acdc1fe..48b8b92eaa0 100644
--- a/reactos/subsystems/win32/csrss/include/conio.h
+++ b/reactos/subsystems/win32/csrss/include/conio.h
@@ -83,8 +83,10 @@ typedef struct tagCSRSS_CONSOLE
UINT OutputCodePage;
PCSRSS_CONSOLE_VTBL Vtbl;
LIST_ENTRY ProcessList;
+ struct tagALIAS_HEADER *Aliases;
} CSRSS_CONSOLE;
+NTSTATUS FASTCALL ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console);
VOID STDCALL ConioDeleteConsole(Object_t *Object);
VOID STDCALL ConioDeleteScreenBuffer(Object_t *Buffer);
void STDCALL ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode);
@@ -162,6 +164,16 @@ CSR_API(CsrGetProcessList);
Win32CsrUnlockObject((Object_t *) Buff)
#define ConioChangeIcon(Console, hWindowIcon) (Console)->Vtbl->ChangeIcon(Console, hWindowIcon)
+/* alias.c */
+VOID IntDeleteAllAliases(struct tagALIAS_HEADER *RootHeader);
+CSR_API(CsrAddConsoleAlias);
+CSR_API(CsrGetConsoleAlias);
+CSR_API(CsrGetAllConsoleAliases);
+CSR_API(CsrGetAllConsoleAliasesLength);
+CSR_API(CsrGetConsoleAliasesExes);
+CSR_API(CsrGetConsoleAliasesExesLength);
+
+
#endif /* CONIO_H_INCLUDED */
/* EOF */
diff --git a/reactos/subsystems/win32/csrss/init.c b/reactos/subsystems/win32/csrss/init.c
index 12169ec55aa..354499e86ed 100644
--- a/reactos/subsystems/win32/csrss/init.c
+++ b/reactos/subsystems/win32/csrss/init.c
@@ -294,12 +294,6 @@ CSRSS_API_DEFINITION NativeDefinitions[] =
CSRSS_DEFINE_API(VERIFY_HANDLE, CsrVerifyHandle),
CSRSS_DEFINE_API(DUPLICATE_HANDLE, CsrDuplicateHandle),
CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE, CsrGetInputWaitHandle),
- CSRSS_DEFINE_API(ADD_CONSOLE_ALIAS, CsrAddConsoleAlias),
- CSRSS_DEFINE_API(GET_CONSOLE_ALIAS, CsrGetConsoleAlias),
- CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES, CsrGetAllConsoleAliases),
- CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CsrGetAllConsoleAliasesLength),
- CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES, CsrGetConsoleAliasesExes),
- CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CsrGetConsoleAliasesExesLength),
{ 0, 0, NULL }
};
diff --git a/reactos/subsystems/win32/csrss/api/alias.c b/reactos/subsystems/win32/csrss/win32csr/alias.c
similarity index 80%
rename from reactos/subsystems/win32/csrss/api/alias.c
rename to reactos/subsystems/win32/csrss/win32csr/alias.c
index 06be74715ae..a653c34eb8d 100644
--- a/reactos/subsystems/win32/csrss/api/alias.c
+++ b/reactos/subsystems/win32/csrss/win32csr/alias.c
@@ -11,7 +11,7 @@
/* INCLUDES ******************************************************************/
-#include
+#include "w32csr.h"
#define NDEBUG
#include
@@ -32,8 +32,6 @@ typedef struct tagALIAS_HEADER
}ALIAS_HEADER, *PALIAS_HEADER;
-static PALIAS_HEADER RootHeader = NULL;
-
/* Ensure that a buffer is contained within the process's shared memory section. */
static BOOL
ValidateBuffer(PCSRSS_PROCESS_DATA ProcessData, PVOID Buffer, ULONG Size)
@@ -73,7 +71,7 @@ IntCreateAliasHeader(LPCWSTR lpExeName)
PALIAS_HEADER Entry;
UINT dwLength = wcslen(lpExeName) + 1;
- Entry = RtlAllocateHeap(CsrssApiHeap, 0, sizeof(ALIAS_HEADER) + sizeof(WCHAR) * dwLength);
+ Entry = RtlAllocateHeap(Win32CsrApiHeap, 0, sizeof(ALIAS_HEADER) + sizeof(WCHAR) * dwLength);
if (!Entry)
return Entry;
@@ -187,7 +185,7 @@ IntCreateAliasEntry(LPCWSTR lpSource, LPCWSTR lpTarget)
dwSource = wcslen(lpSource) + 1;
dwTarget = wcslen(lpTarget) + 1;
- Entry = RtlAllocateHeap(CsrssApiHeap, 0, sizeof(ALIAS_ENTRY) + sizeof(WCHAR) * (dwSource + dwTarget));
+ Entry = RtlAllocateHeap(Win32CsrApiHeap, 0, sizeof(ALIAS_ENTRY) + sizeof(WCHAR) * (dwSource + dwTarget));
if (!Entry)
return Entry;
@@ -297,7 +295,7 @@ IntDeleteAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY Entry)
if (Header->Data == Entry)
{
Header->Data = Entry->Next;
- RtlFreeHeap(CsrssApiHeap, 0, Entry);
+ RtlFreeHeap(Win32CsrApiHeap, 0, Entry);
return;
}
LastEntry = Header->Data;
@@ -308,16 +306,33 @@ IntDeleteAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY Entry)
if (CurEntry == Entry)
{
LastEntry->Next = Entry->Next;
- RtlFreeHeap(CsrssApiHeap, 0, Entry);
+ RtlFreeHeap(Win32CsrApiHeap, 0, Entry);
return;
}
LastEntry = CurEntry;
CurEntry = CurEntry->Next;
}
}
+VOID
+IntDeleteAllAliases(PALIAS_HEADER RootHeader)
+{
+ PALIAS_HEADER Header, NextHeader;
+ PALIAS_ENTRY Entry, NextEntry;
+ for (Header = RootHeader; Header; Header = NextHeader)
+ {
+ NextHeader = Header->Next;
+ for (Entry = Header->Data; Entry; Entry = NextEntry)
+ {
+ NextEntry = Entry->Next;
+ RtlFreeHeap(Win32CsrApiHeap, 0, Entry);
+ }
+ RtlFreeHeap(Win32CsrApiHeap, 0, Header);
+ }
+}
CSR_API(CsrAddConsoleAlias)
{
+ PCSRSS_CONSOLE Console;
PALIAS_HEADER Header;
PALIAS_ENTRY Entry;
WCHAR * lpExeName;
@@ -341,16 +356,23 @@ CSR_API(CsrAddConsoleAlias)
return Request->Status;
}
- Header = IntFindAliasHeader(RootHeader, lpExeName);
+ Request->Status = ConioConsoleFromProcessData(ProcessData, &Console);
+ if (!NT_SUCCESS(Request->Status))
+ {
+ return Request->Status;
+ }
+
+ Header = IntFindAliasHeader(Console->Aliases, lpExeName);
if (!Header && lpTarget != NULL)
{
Header = IntCreateAliasHeader(lpExeName);
if (!Header)
{
Request->Status = STATUS_INSUFFICIENT_RESOURCES;
+ ConioUnlockConsole(Console);
return Request->Status;
}
- IntInsertAliasHeader(&RootHeader, Header);
+ IntInsertAliasHeader(&Console->Aliases, Header);
}
if (lpTarget == NULL) // delete the entry
@@ -365,6 +387,7 @@ CSR_API(CsrAddConsoleAlias)
{
Request->Status = STATUS_INVALID_PARAMETER;
}
+ ConioUnlockConsole(Console);
return Request->Status;
}
@@ -373,16 +396,19 @@ CSR_API(CsrAddConsoleAlias)
if (!Entry)
{
Request->Status = STATUS_INSUFFICIENT_RESOURCES;
+ ConioUnlockConsole(Console);
return Request->Status;
}
IntInsertAliasEntry(Header, Entry);
Request->Status = STATUS_SUCCESS;
+ ConioUnlockConsole(Console);
return Request->Status;
}
CSR_API(CsrGetConsoleAlias)
{
+ PCSRSS_CONSOLE Console;
PALIAS_HEADER Header;
PALIAS_ENTRY Entry;
UINT Length;
@@ -405,10 +431,17 @@ CSR_API(CsrGetConsoleAlias)
return Request->Status;
}
- Header = IntFindAliasHeader(RootHeader, lpExeName);
+ Request->Status = ConioConsoleFromProcessData(ProcessData, &Console);
+ if (!NT_SUCCESS(Request->Status))
+ {
+ return Request->Status;
+ }
+
+ Header = IntFindAliasHeader(Console->Aliases, lpExeName);
if (!Header)
{
Request->Status = STATUS_INVALID_PARAMETER;
+ ConioUnlockConsole(Console);
return Request->Status;
}
@@ -416,6 +449,7 @@ CSR_API(CsrGetConsoleAlias)
if (!Entry)
{
Request->Status = STATUS_INVALID_PARAMETER;
+ ConioUnlockConsole(Console);
return Request->Status;
}
@@ -423,23 +457,27 @@ CSR_API(CsrGetConsoleAlias)
if (Length > Request->Data.GetConsoleAlias.TargetBufferLength)
{
Request->Status = STATUS_BUFFER_TOO_SMALL;
+ ConioUnlockConsole(Console);
return Request->Status;
}
if (!ValidateBuffer(ProcessData, lpTarget, Request->Data.GetConsoleAlias.TargetBufferLength))
{
Request->Status = STATUS_ACCESS_VIOLATION;
+ ConioUnlockConsole(Console);
return Request->Status;
}
wcscpy(lpTarget, Entry->lpTarget);
Request->Data.GetConsoleAlias.BytesWritten = Length;
Request->Status = STATUS_SUCCESS;
+ ConioUnlockConsole(Console);
return Request->Status;
}
CSR_API(CsrGetAllConsoleAliases)
{
+ PCSRSS_CONSOLE Console;
ULONG BytesWritten;
PALIAS_HEADER Header;
@@ -449,16 +487,24 @@ CSR_API(CsrGetAllConsoleAliases)
return Request->Status;
}
- Header = IntFindAliasHeader(RootHeader, Request->Data.GetAllConsoleAlias.lpExeName);
+ Request->Status = ConioConsoleFromProcessData(ProcessData, &Console);
+ if (!NT_SUCCESS(Request->Status))
+ {
+ return Request->Status;
+ }
+
+ Header = IntFindAliasHeader(Console->Aliases, Request->Data.GetAllConsoleAlias.lpExeName);
if (!Header)
{
Request->Status = STATUS_INVALID_PARAMETER;
+ ConioUnlockConsole(Console);
return Request->Status;
}
if (IntGetAllConsoleAliasesLength(Header) > Request->Data.GetAllConsoleAlias.AliasBufferLength)
{
Request->Status = STATUS_BUFFER_OVERFLOW;
+ ConioUnlockConsole(Console);
return Request->Status;
}
@@ -467,6 +513,7 @@ CSR_API(CsrGetAllConsoleAliases)
Request->Data.GetAllConsoleAlias.AliasBufferLength))
{
Request->Status = STATUS_ACCESS_VIOLATION;
+ ConioUnlockConsole(Console);
return Request->Status;
}
@@ -476,11 +523,13 @@ CSR_API(CsrGetAllConsoleAliases)
Request->Data.GetAllConsoleAlias.BytesWritten = BytesWritten;
Request->Status = STATUS_SUCCESS;
+ ConioUnlockConsole(Console);
return Request->Status;
}
CSR_API(CsrGetAllConsoleAliasesLength)
{
+ PCSRSS_CONSOLE Console;
PALIAS_HEADER Header;
UINT Length;
@@ -490,38 +539,55 @@ CSR_API(CsrGetAllConsoleAliasesLength)
return Request->Status;
}
- Header = IntFindAliasHeader(RootHeader, Request->Data.GetAllConsoleAliasesLength.lpExeName);
+ Request->Status = ConioConsoleFromProcessData(ProcessData, &Console);
+ if (!NT_SUCCESS(Request->Status))
+ {
+ return Request->Status;
+ }
+
+ Header = IntFindAliasHeader(Console->Aliases, Request->Data.GetAllConsoleAliasesLength.lpExeName);
if (!Header)
{
Request->Status = STATUS_INVALID_PARAMETER;
+ ConioUnlockConsole(Console);
return Request->Status;
}
Length = IntGetAllConsoleAliasesLength(Header);
Request->Data.GetAllConsoleAliasesLength.Length = Length;
Request->Status = STATUS_SUCCESS;
+ ConioUnlockConsole(Console);
return Request->Status;
}
CSR_API(CsrGetConsoleAliasesExes)
{
+ PCSRSS_CONSOLE Console;
UINT BytesWritten;
UINT ExesLength;
DPRINT("CsrGetConsoleAliasesExes entered\n");
- ExesLength = IntGetConsoleAliasesExesLength(RootHeader);
+ Request->Status = ConioConsoleFromProcessData(ProcessData, &Console);
+ if (!NT_SUCCESS(Request->Status))
+ {
+ return Request->Status;
+ }
+
+ ExesLength = IntGetConsoleAliasesExesLength(Console->Aliases);
if (ExesLength > Request->Data.GetConsoleAliasesExes.Length)
{
Request->Status = STATUS_BUFFER_OVERFLOW;
+ ConioUnlockConsole(Console);
return Request->Status;
}
if (Request->Data.GetConsoleAliasesExes.ExeNames == NULL)
{
Request->Status = STATUS_INVALID_PARAMETER;
+ ConioUnlockConsole(Console);
return Request->Status;
}
@@ -530,23 +596,30 @@ CSR_API(CsrGetConsoleAliasesExes)
Request->Data.GetConsoleAliasesExes.Length))
{
Request->Status = STATUS_ACCESS_VIOLATION;
+ ConioUnlockConsole(Console);
return Request->Status;
}
- BytesWritten = IntGetConsoleAliasesExes(RootHeader,
+ BytesWritten = IntGetConsoleAliasesExes(Console->Aliases,
Request->Data.GetConsoleAliasesExes.ExeNames,
Request->Data.GetConsoleAliasesExes.Length);
Request->Data.GetConsoleAliasesExes.BytesWritten = BytesWritten;
Request->Status = STATUS_SUCCESS;
+ ConioUnlockConsole(Console);
return Request->Status;
}
CSR_API(CsrGetConsoleAliasesExesLength)
{
+ PCSRSS_CONSOLE Console;
DPRINT("CsrGetConsoleAliasesExesLength entered\n");
- Request->Status = STATUS_SUCCESS;
- Request->Data.GetConsoleAliasesExesLength.Length = IntGetConsoleAliasesExesLength(RootHeader);
+ Request->Status = ConioConsoleFromProcessData(ProcessData, &Console);
+ if (NT_SUCCESS(Request->Status))
+ {
+ Request->Data.GetConsoleAliasesExesLength.Length = IntGetConsoleAliasesExesLength(Console->Aliases);
+ ConioUnlockConsole(Console);
+ }
return Request->Status;
}
diff --git a/reactos/subsystems/win32/csrss/win32csr/conio.c b/reactos/subsystems/win32/csrss/win32csr/conio.c
index 65343121f34..0db7c91f5d5 100644
--- a/reactos/subsystems/win32/csrss/win32csr/conio.c
+++ b/reactos/subsystems/win32/csrss/win32csr/conio.c
@@ -36,7 +36,7 @@
/* FUNCTIONS *****************************************************************/
-static NTSTATUS FASTCALL
+NTSTATUS FASTCALL
ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console)
{
PCSRSS_CONSOLE ProcessConsole = ProcessData->Console;
@@ -961,6 +961,7 @@ ConioDeleteConsole(Object_t *Object)
CloseHandle(Console->ActiveEvent);
DeleteCriticalSection(&Console->Header.Lock);
RtlFreeUnicodeString(&Console->Title);
+ IntDeleteAllAliases(Console->Aliases);
HeapFree(Win32CsrApiHeap, 0, Console);
}
diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c
index c753f643fab..0b73d2df16c 100644
--- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c
+++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c
@@ -68,6 +68,12 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage),
CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage),
CSRSS_DEFINE_API(GET_PROCESS_LIST, CsrGetProcessList),
+ CSRSS_DEFINE_API(ADD_CONSOLE_ALIAS, CsrAddConsoleAlias),
+ CSRSS_DEFINE_API(GET_CONSOLE_ALIAS, CsrGetConsoleAlias),
+ CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES, CsrGetAllConsoleAliases),
+ CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CsrGetAllConsoleAliasesLength),
+ CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES, CsrGetConsoleAliasesExes),
+ CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CsrGetConsoleAliasesExesLength),
{ 0, 0, NULL }
};
diff --git a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild
index 12c255efa21..6a24d5d651e 100644
--- a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild
+++ b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild
@@ -17,6 +17,7 @@
psapi
msvcrt
w32csr.h
+ alias.c
conio.c
desktopbg.c
dllmain.c