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