2 * LICENSE: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/alias.c
5 * PURPOSE: Alias support functions
6 * PROGRAMMERS: Christoph Wittich
10 /* INCLUDES *******************************************************************/
17 /* TYPES **********************************************************************/
19 typedef struct _ALIAS_ENTRY
21 UNICODE_STRING Source
;
22 UNICODE_STRING Target
;
23 struct _ALIAS_ENTRY
* Next
;
24 } ALIAS_ENTRY
, *PALIAS_ENTRY
;
26 typedef struct _ALIAS_HEADER
28 UNICODE_STRING ExeName
;
30 struct _ALIAS_HEADER
* Next
;
31 } ALIAS_HEADER
, *PALIAS_HEADER
;
37 ConvertInputAnsiToUnicode(PCONSOLE Console
,
44 ASSERT(Source
&& Target
&& TargetLength
);
46 /* Use the console input CP for the conversion */
47 *TargetLength
= MultiByteToWideChar(Console
->InputCodePage
, 0,
50 *Target
= ConsoleAllocHeap(0, *TargetLength
* sizeof(WCHAR
));
51 if (*Target
== NULL
) return FALSE
;
53 MultiByteToWideChar(Console
->InputCodePage
, 0,
55 *Target
, *TargetLength
);
57 /* The returned Length was in number of WCHARs, convert it in bytes */
58 *TargetLength
*= sizeof(WCHAR
);
64 ConvertInputUnicodeToAnsi(PCONSOLE Console
,
69 /*P*/USHORT TargetLength
)
71 ASSERT(Source
&& Target
&& TargetLength
);
75 * "The lpMultiByteStr and lpWideCharStr pointers must not be the same.
76 * If they are the same, the function fails, and GetLastError returns
77 * ERROR_INVALID_PARAMETER."
79 ASSERT((ULONG_PTR
)Source
!= (ULONG_PTR
)Target
);
81 /* Use the console input CP for the conversion */
82 // *TargetLength = WideCharToMultiByte(Console->InputCodePage, 0,
83 // Source, SourceLength,
84 // NULL, 0, NULL, NULL);
85 // *Target = ConsoleAllocHeap(0, *TargetLength * sizeof(WCHAR));
86 // if (*Target == NULL) return FALSE;
88 WideCharToMultiByte(Console
->InputCodePage
, 0,
90 /* * */Target
, /* * */TargetLength
,
93 // /* The returned Length was in number of WCHARs, convert it in bytes */
94 // *TargetLength *= sizeof(WCHAR);
102 /* PRIVATE FUNCTIONS **********************************************************/
105 IntFindAliasHeader(PCONSOLE Console
,
110 UNICODE_STRING ExeNameU
;
112 PALIAS_HEADER RootHeader
= Console
->Aliases
;
115 if (ExeName
== NULL
) return NULL
;
119 ExeNameU
.Buffer
= ExeName
;
120 /* Length is in bytes */
121 ExeNameU
.MaximumLength
= ExeLength
;
125 if (!ConvertInputAnsiToUnicode(Console
,
127 &ExeNameU
.Buffer
, &ExeNameU
.MaximumLength
))
132 ExeNameU
.Length
= ExeNameU
.MaximumLength
;
136 Diff
= RtlCompareUnicodeString(&RootHeader
->ExeName
, &ExeNameU
, TRUE
);
139 if (!UnicodeExe
) ConsoleFreeHeap(ExeNameU
.Buffer
);
144 RootHeader
= RootHeader
->Next
;
147 if (!UnicodeExe
) ConsoleFreeHeap(ExeNameU
.Buffer
);
152 IntCreateAliasHeader(PCONSOLE Console
,
157 UNICODE_STRING ExeNameU
;
161 if (ExeName
== NULL
) return NULL
;
165 ExeNameU
.Buffer
= ExeName
;
166 /* Length is in bytes */
167 ExeNameU
.MaximumLength
= ExeLength
;
171 if (!ConvertInputAnsiToUnicode(Console
,
173 &ExeNameU
.Buffer
, &ExeNameU
.MaximumLength
))
178 ExeNameU
.Length
= ExeNameU
.MaximumLength
;
180 Entry
= ConsoleAllocHeap(0, sizeof(ALIAS_HEADER
) + ExeNameU
.Length
);
183 if (!UnicodeExe
) ConsoleFreeHeap(ExeNameU
.Buffer
);
187 Entry
->ExeName
.Buffer
= (PWSTR
)(Entry
+ 1);
188 Entry
->ExeName
.Length
= 0;
189 Entry
->ExeName
.MaximumLength
= ExeNameU
.Length
;
190 RtlCopyUnicodeString(&Entry
->ExeName
, &ExeNameU
);
195 if (!UnicodeExe
) ConsoleFreeHeap(ExeNameU
.Buffer
);
200 IntInsertAliasHeader(PALIAS_HEADER
* RootHeader
,
201 PALIAS_HEADER NewHeader
)
203 PALIAS_HEADER CurrentHeader
;
204 PALIAS_HEADER
*LastLink
= RootHeader
;
207 while ((CurrentHeader
= *LastLink
) != NULL
)
209 Diff
= RtlCompareUnicodeString(&NewHeader
->ExeName
, &CurrentHeader
->ExeName
, TRUE
);
212 LastLink
= &CurrentHeader
->Next
;
215 *LastLink
= NewHeader
;
216 NewHeader
->Next
= CurrentHeader
;
220 IntGetAliasEntry(PCONSOLE Console
,
221 PALIAS_HEADER Header
,
226 UNICODE_STRING SourceU
;
231 if (Header
== NULL
|| Source
== NULL
) return NULL
;
235 SourceU
.Buffer
= Source
;
236 /* Length is in bytes */
237 SourceU
.MaximumLength
= SourceLength
;
241 if (!ConvertInputAnsiToUnicode(Console
,
242 Source
, SourceLength
,
243 &SourceU
.Buffer
, &SourceU
.MaximumLength
))
248 SourceU
.Length
= SourceU
.MaximumLength
;
250 Entry
= Header
->Data
;
253 Diff
= RtlCompareUnicodeString(&Entry
->Source
, &SourceU
, TRUE
);
256 if (!Unicode
) ConsoleFreeHeap(SourceU
.Buffer
);
264 if (!Unicode
) ConsoleFreeHeap(SourceU
.Buffer
);
269 IntCreateAliasEntry(PCONSOLE Console
,
276 UNICODE_STRING SourceU
;
277 UNICODE_STRING TargetU
;
283 SourceU
.Buffer
= Source
;
284 TargetU
.Buffer
= Target
;
285 /* Length is in bytes */
286 SourceU
.MaximumLength
= SourceLength
;
287 TargetU
.MaximumLength
= TargetLength
;
291 if (!ConvertInputAnsiToUnicode(Console
,
292 Source
, SourceLength
,
293 &SourceU
.Buffer
, &SourceU
.MaximumLength
))
298 if (!ConvertInputAnsiToUnicode(Console
,
299 Target
, TargetLength
,
300 &TargetU
.Buffer
, &TargetU
.MaximumLength
))
302 ConsoleFreeHeap(SourceU
.Buffer
);
306 SourceU
.Length
= SourceU
.MaximumLength
;
307 TargetU
.Length
= TargetU
.MaximumLength
;
309 Entry
= ConsoleAllocHeap(0, sizeof(ALIAS_ENTRY
) +
310 SourceU
.Length
+ TargetU
.Length
);
315 ConsoleFreeHeap(TargetU
.Buffer
);
316 ConsoleFreeHeap(SourceU
.Buffer
);
321 Entry
->Source
.Buffer
= (PWSTR
)(Entry
+ 1);
322 Entry
->Source
.Length
= 0;
323 Entry
->Source
.MaximumLength
= SourceU
.Length
;
324 RtlCopyUnicodeString(&Entry
->Source
, &SourceU
);
326 Entry
->Target
.Buffer
= (PWSTR
)((ULONG_PTR
)Entry
->Source
.Buffer
+ Entry
->Source
.MaximumLength
);
327 Entry
->Target
.Length
= 0;
328 Entry
->Target
.MaximumLength
= TargetU
.Length
;
329 RtlCopyUnicodeString(&Entry
->Target
, &TargetU
);
335 ConsoleFreeHeap(TargetU
.Buffer
);
336 ConsoleFreeHeap(SourceU
.Buffer
);
342 IntInsertAliasEntry(PALIAS_HEADER Header
,
343 PALIAS_ENTRY NewEntry
)
345 PALIAS_ENTRY CurrentEntry
;
346 PALIAS_ENTRY
*LastLink
= &Header
->Data
;
349 while ((CurrentEntry
= *LastLink
) != NULL
)
351 Diff
= RtlCompareUnicodeString(&NewEntry
->Source
, &CurrentEntry
->Source
, TRUE
);
354 LastLink
= &CurrentEntry
->Next
;
357 *LastLink
= NewEntry
;
358 NewEntry
->Next
= CurrentEntry
;
362 IntDeleteAliasEntry(PALIAS_HEADER Header
,
365 PALIAS_ENTRY
*LastLink
= &Header
->Data
;
366 PALIAS_ENTRY CurEntry
;
368 while ((CurEntry
= *LastLink
) != NULL
)
370 if (CurEntry
== Entry
)
372 *LastLink
= Entry
->Next
;
373 ConsoleFreeHeap(Entry
);
376 LastLink
= &CurEntry
->Next
;
381 IntGetConsoleAliasesExesLength(PALIAS_HEADER RootHeader
,
388 Length
+= RootHeader
->ExeName
.Length
+ sizeof(WCHAR
); // NULL-termination
389 RootHeader
= RootHeader
->Next
;
393 * Quick and dirty way of getting the number of bytes of the
394 * corresponding ANSI string from the one in UNICODE.
397 Length
/= sizeof(WCHAR
);
403 IntGetAllConsoleAliasesLength(PALIAS_HEADER Header
,
407 PALIAS_ENTRY CurEntry
= Header
->Data
;
411 Length
+= CurEntry
->Source
.Length
;
412 Length
+= CurEntry
->Target
.Length
;
413 Length
+= 2 * sizeof(WCHAR
); // '=' and NULL-termination
414 CurEntry
= CurEntry
->Next
;
418 * Quick and dirty way of getting the number of bytes of the
419 * corresponding ANSI string from the one in UNICODE.
422 Length
/= sizeof(WCHAR
);
428 IntDeleteAllAliases(PCONSOLE Console
)
430 PALIAS_HEADER Header
, NextHeader
;
431 PALIAS_ENTRY Entry
, NextEntry
;
433 for (Header
= Console
->Aliases
; Header
; Header
= NextHeader
)
435 NextHeader
= Header
->Next
;
436 for (Entry
= Header
->Data
; Entry
; Entry
= NextEntry
)
438 NextEntry
= Entry
->Next
;
439 ConsoleFreeHeap(Entry
);
441 ConsoleFreeHeap(Header
);
446 /* PUBLIC SERVER APIS *********************************************************/
448 CSR_API(SrvAddConsoleAlias
)
451 PCONSOLE_ADDGETALIAS ConsoleAliasRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleAliasRequest
;
453 PALIAS_HEADER Header
;
457 DPRINT1("SrvAddConsoleAlias entered ApiMessage %p\n", ApiMessage
);
459 if ( !CsrValidateMessageBuffer(ApiMessage
,
460 (PVOID
*)&ConsoleAliasRequest
->Source
,
461 ConsoleAliasRequest
->SourceLength
,
463 !CsrValidateMessageBuffer(ApiMessage
,
464 (PVOID
*)&ConsoleAliasRequest
->Target
,
465 ConsoleAliasRequest
->TargetLength
,
467 !CsrValidateMessageBuffer(ApiMessage
,
468 (PVOID
*)&ConsoleAliasRequest
->ExeName
,
469 ConsoleAliasRequest
->ExeLength
,
472 return STATUS_INVALID_PARAMETER
;
475 lpTarget
= (ConsoleAliasRequest
->TargetLength
!= 0 ? ConsoleAliasRequest
->Target
: NULL
);
477 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
478 if (!NT_SUCCESS(Status
)) return Status
;
480 Status
= STATUS_SUCCESS
;
482 Header
= IntFindAliasHeader(Console
,
483 ConsoleAliasRequest
->ExeName
,
484 ConsoleAliasRequest
->ExeLength
,
485 ConsoleAliasRequest
->Unicode2
);
486 if (!Header
&& lpTarget
!= NULL
)
488 Header
= IntCreateAliasHeader(Console
,
489 ConsoleAliasRequest
->ExeName
,
490 ConsoleAliasRequest
->ExeLength
,
491 ConsoleAliasRequest
->Unicode2
);
494 Status
= STATUS_NO_MEMORY
;
498 IntInsertAliasHeader(&Console
->Aliases
, Header
);
501 if (lpTarget
== NULL
) // Delete the entry
503 Entry
= IntGetAliasEntry(Console
, Header
,
504 ConsoleAliasRequest
->Source
,
505 ConsoleAliasRequest
->SourceLength
,
506 ConsoleAliasRequest
->Unicode
);
509 Status
= STATUS_UNSUCCESSFUL
;
513 IntDeleteAliasEntry(Header
, Entry
);
515 else // Add the entry
517 Entry
= IntCreateAliasEntry(Console
,
518 ConsoleAliasRequest
->Source
,
519 ConsoleAliasRequest
->SourceLength
,
520 ConsoleAliasRequest
->Target
,
521 ConsoleAliasRequest
->TargetLength
,
522 ConsoleAliasRequest
->Unicode
);
525 Status
= STATUS_NO_MEMORY
;
529 IntInsertAliasEntry(Header
, Entry
);
533 ConSrvReleaseConsole(Console
, TRUE
);
537 CSR_API(SrvGetConsoleAlias
)
540 PCONSOLE_ADDGETALIAS ConsoleAliasRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleAliasRequest
;
542 PALIAS_HEADER Header
;
547 DPRINT1("SrvGetConsoleAlias entered ApiMessage %p\n", ApiMessage
);
549 if ( !CsrValidateMessageBuffer(ApiMessage
,
550 (PVOID
*)&ConsoleAliasRequest
->Source
,
551 ConsoleAliasRequest
->SourceLength
,
553 !CsrValidateMessageBuffer(ApiMessage
,
554 (PVOID
*)&ConsoleAliasRequest
->Target
,
555 ConsoleAliasRequest
->TargetLength
,
557 !CsrValidateMessageBuffer(ApiMessage
,
558 (PVOID
*)&ConsoleAliasRequest
->ExeName
,
559 ConsoleAliasRequest
->ExeLength
,
562 return STATUS_INVALID_PARAMETER
;
565 lpTarget
= ConsoleAliasRequest
->Target
;
567 if (ConsoleAliasRequest
->ExeLength
== 0 || lpTarget
== NULL
||
568 ConsoleAliasRequest
->TargetLength
== 0 || ConsoleAliasRequest
->SourceLength
== 0)
570 return STATUS_INVALID_PARAMETER
;
573 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
574 if (!NT_SUCCESS(Status
)) return Status
;
576 Header
= IntFindAliasHeader(Console
,
577 ConsoleAliasRequest
->ExeName
,
578 ConsoleAliasRequest
->ExeLength
,
579 ConsoleAliasRequest
->Unicode2
);
582 Status
= STATUS_UNSUCCESSFUL
;
586 Entry
= IntGetAliasEntry(Console
, Header
,
587 ConsoleAliasRequest
->Source
,
588 ConsoleAliasRequest
->SourceLength
,
589 ConsoleAliasRequest
->Unicode
);
592 Status
= STATUS_UNSUCCESSFUL
;
596 if (ConsoleAliasRequest
->Unicode
)
598 Length
= Entry
->Target
.Length
+ sizeof(WCHAR
);
599 if (Length
> ConsoleAliasRequest
->TargetLength
) // FIXME: Refine computation.
601 Status
= STATUS_BUFFER_TOO_SMALL
;
605 RtlCopyMemory(lpTarget
, Entry
->Target
.Buffer
, Entry
->Target
.Length
);
606 ConsoleAliasRequest
->TargetLength
= Length
;
610 Length
= (Entry
->Target
.Length
+ sizeof(WCHAR
)) / sizeof(WCHAR
);
611 if (Length
> ConsoleAliasRequest
->TargetLength
) // FIXME: Refine computation.
613 Status
= STATUS_BUFFER_TOO_SMALL
;
617 ConvertInputUnicodeToAnsi(Console
,
618 Entry
->Target
.Buffer
, Entry
->Target
.Length
,
619 lpTarget
, Entry
->Target
.Length
/ sizeof(WCHAR
));
620 ConsoleAliasRequest
->TargetLength
= Length
;
624 ConSrvReleaseConsole(Console
, TRUE
);
628 CSR_API(SrvGetConsoleAliases
)
631 PCONSOLE_GETALLALIASES GetAllAliasesRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAllAliasesRequest
;
633 ULONG BytesWritten
= 0;
634 PALIAS_HEADER Header
;
636 DPRINT1("SrvGetConsoleAliases entered ApiMessage %p\n", ApiMessage
);
638 if ( !CsrValidateMessageBuffer(ApiMessage
,
639 (PVOID
)&GetAllAliasesRequest
->ExeName
,
640 GetAllAliasesRequest
->ExeLength
,
642 !CsrValidateMessageBuffer(ApiMessage
,
643 (PVOID
)&GetAllAliasesRequest
->AliasesBuffer
,
644 GetAllAliasesRequest
->AliasesBufferLength
,
647 return STATUS_INVALID_PARAMETER
;
650 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
651 if (!NT_SUCCESS(Status
)) return Status
;
653 Header
= IntFindAliasHeader(Console
,
654 GetAllAliasesRequest
->ExeName
,
655 GetAllAliasesRequest
->ExeLength
,
656 GetAllAliasesRequest
->Unicode2
);
657 if (!Header
) goto Quit
;
659 if (IntGetAllConsoleAliasesLength(Header
, GetAllAliasesRequest
->Unicode
) > GetAllAliasesRequest
->AliasesBufferLength
)
661 Status
= STATUS_BUFFER_OVERFLOW
;
667 LPWSTR TargetBufferW
;
668 UINT TargetBufferLength
= GetAllAliasesRequest
->AliasesBufferLength
;
670 PALIAS_ENTRY CurEntry
= Header
->Data
;
672 UINT SourceLength
, TargetLength
;
674 if (GetAllAliasesRequest
->Unicode
)
676 TargetBufferW
= GetAllAliasesRequest
->AliasesBuffer
;
677 TargetBufferLength
/= sizeof(WCHAR
);
681 TargetBufferA
= GetAllAliasesRequest
->AliasesBuffer
;
686 SourceLength
= CurEntry
->Source
.Length
/ sizeof(WCHAR
);
687 TargetLength
= CurEntry
->Target
.Length
/ sizeof(WCHAR
);
688 if (Offset
+ TargetLength
+ SourceLength
+ 2 > TargetBufferLength
)
690 Status
= STATUS_BUFFER_OVERFLOW
;
694 if (GetAllAliasesRequest
->Unicode
)
696 RtlCopyMemory(&TargetBufferW
[Offset
], CurEntry
->Source
.Buffer
, SourceLength
* sizeof(WCHAR
));
697 Offset
+= SourceLength
;
698 TargetBufferW
[Offset
++] = L
'=';
699 RtlCopyMemory(&TargetBufferW
[Offset
], CurEntry
->Target
.Buffer
, TargetLength
* sizeof(WCHAR
));
700 Offset
+= TargetLength
;
701 TargetBufferW
[Offset
++] = L
'\0';
705 ConvertInputUnicodeToAnsi(Console
,
706 CurEntry
->Source
.Buffer
, SourceLength
* sizeof(WCHAR
),
707 &TargetBufferA
[Offset
], SourceLength
);
708 Offset
+= SourceLength
;
709 TargetBufferA
[Offset
++] = '=';
710 ConvertInputUnicodeToAnsi(Console
,
711 CurEntry
->Target
.Buffer
, TargetLength
* sizeof(WCHAR
),
712 &TargetBufferA
[Offset
], TargetLength
);
713 Offset
+= TargetLength
;
714 TargetBufferA
[Offset
++] = '\0';
717 CurEntry
= CurEntry
->Next
;
720 if (GetAllAliasesRequest
->Unicode
)
721 BytesWritten
= Offset
* sizeof(WCHAR
);
723 BytesWritten
= Offset
;
727 GetAllAliasesRequest
->AliasesBufferLength
= BytesWritten
;
729 ConSrvReleaseConsole(Console
, TRUE
);
733 CSR_API(SrvGetConsoleAliasesLength
)
736 PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAllAliasesLengthRequest
;
738 PALIAS_HEADER Header
;
740 DPRINT1("SrvGetConsoleAliasesLength entered ApiMessage %p\n", ApiMessage
);
742 if (!CsrValidateMessageBuffer(ApiMessage
,
743 (PVOID
)&GetAllAliasesLengthRequest
->ExeName
,
744 GetAllAliasesLengthRequest
->ExeLength
,
747 return STATUS_INVALID_PARAMETER
;
750 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
751 if (!NT_SUCCESS(Status
)) return Status
;
753 Header
= IntFindAliasHeader(Console
,
754 GetAllAliasesLengthRequest
->ExeName
,
755 GetAllAliasesLengthRequest
->ExeLength
,
756 GetAllAliasesLengthRequest
->Unicode2
);
759 GetAllAliasesLengthRequest
->Length
=
760 IntGetAllConsoleAliasesLength(Header
,
761 GetAllAliasesLengthRequest
->Unicode
);
762 Status
= STATUS_SUCCESS
;
766 GetAllAliasesLengthRequest
->Length
= 0;
769 ConSrvReleaseConsole(Console
, TRUE
);
773 CSR_API(SrvGetConsoleAliasExes
)
776 PCONSOLE_GETALIASESEXES GetAliasesExesRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAliasesExesRequest
;
778 UINT BytesWritten
= 0;
780 DPRINT1("SrvGetConsoleAliasExes entered\n");
782 if (!CsrValidateMessageBuffer(ApiMessage
,
783 (PVOID
*)&GetAliasesExesRequest
->ExeNames
,
784 GetAliasesExesRequest
->Length
,
787 return STATUS_INVALID_PARAMETER
;
790 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
791 if (!NT_SUCCESS(Status
)) return Status
;
793 if (IntGetConsoleAliasesExesLength(Console
->Aliases
, GetAliasesExesRequest
->Unicode
) > GetAliasesExesRequest
->Length
)
795 Status
= STATUS_BUFFER_OVERFLOW
;
800 PALIAS_HEADER RootHeader
= Console
->Aliases
;
803 LPWSTR TargetBufferW
;
804 UINT TargetBufferSize
= GetAliasesExesRequest
->Length
;
809 if (GetAliasesExesRequest
->Unicode
)
811 TargetBufferW
= GetAliasesExesRequest
->ExeNames
;
812 TargetBufferSize
/= sizeof(WCHAR
);
816 TargetBufferA
= GetAliasesExesRequest
->ExeNames
;
821 Length
= RootHeader
->ExeName
.Length
/ sizeof(WCHAR
);
822 if (Offset
+ Length
+ 1 > TargetBufferSize
)
824 Status
= STATUS_BUFFER_OVERFLOW
;
828 if (GetAliasesExesRequest
->Unicode
)
830 RtlCopyMemory(&TargetBufferW
[Offset
], RootHeader
->ExeName
.Buffer
, Length
* sizeof(WCHAR
));
832 TargetBufferW
[Offset
++] = L
'\0';
836 ConvertInputUnicodeToAnsi(Console
,
837 RootHeader
->ExeName
.Buffer
, Length
* sizeof(WCHAR
),
838 &TargetBufferA
[Offset
], Length
);
840 TargetBufferA
[Offset
++] = '\0';
843 RootHeader
= RootHeader
->Next
;
846 if (GetAliasesExesRequest
->Unicode
)
847 BytesWritten
= Offset
* sizeof(WCHAR
);
849 BytesWritten
= Offset
;
853 GetAliasesExesRequest
->Length
= BytesWritten
;
855 ConSrvReleaseConsole(Console
, TRUE
);
859 CSR_API(SrvGetConsoleAliasExesLength
)
862 PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAliasesExesLengthRequest
;
865 DPRINT1("SrvGetConsoleAliasExesLength entered ApiMessage %p\n", ApiMessage
);
867 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
868 if (!NT_SUCCESS(Status
)) return Status
;
870 GetAliasesExesLengthRequest
->Length
=
871 IntGetConsoleAliasesExesLength(Console
->Aliases
,
872 GetAliasesExesLengthRequest
->Unicode
);
874 ConSrvReleaseConsole(Console
, TRUE
);