2 * LICENSE: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
5 * PURPOSE: Alias support functions
6 * PROGRAMMERS: Christoph Wittich
10 /* INCLUDES *******************************************************************/
17 /* TYPES **********************************************************************/
19 typedef struct _ALIAS_ENTRY
21 struct _ALIAS_ENTRY
* Next
;
22 UNICODE_STRING Source
;
23 UNICODE_STRING Target
;
24 } ALIAS_ENTRY
, *PALIAS_ENTRY
;
26 typedef struct _ALIAS_HEADER
28 struct _ALIAS_HEADER
* Next
;
29 UNICODE_STRING ExeName
;
31 } ALIAS_HEADER
, *PALIAS_HEADER
;
37 ConvertInputAnsiToUnicode(PCONSRV_CONSOLE 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(PCONSRV_CONSOLE 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(PCONSRV_CONSOLE 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(PCONSRV_CONSOLE 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(PCONSRV_CONSOLE 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(PCONSRV_CONSOLE 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(PCONSRV_CONSOLE 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
;
452 PCONSRV_CONSOLE Console
;
453 PALIAS_HEADER Header
;
457 DPRINT("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
),
479 if (!NT_SUCCESS(Status
)) return Status
;
481 Status
= STATUS_SUCCESS
;
483 Header
= IntFindAliasHeader(Console
,
484 ConsoleAliasRequest
->ExeName
,
485 ConsoleAliasRequest
->ExeLength
,
486 ConsoleAliasRequest
->Unicode2
);
487 if (!Header
&& lpTarget
!= NULL
)
489 Header
= IntCreateAliasHeader(Console
,
490 ConsoleAliasRequest
->ExeName
,
491 ConsoleAliasRequest
->ExeLength
,
492 ConsoleAliasRequest
->Unicode2
);
495 Status
= STATUS_NO_MEMORY
;
499 IntInsertAliasHeader(&Console
->Aliases
, Header
);
502 if (lpTarget
== NULL
) // Delete the entry
504 Entry
= IntGetAliasEntry(Console
, Header
,
505 ConsoleAliasRequest
->Source
,
506 ConsoleAliasRequest
->SourceLength
,
507 ConsoleAliasRequest
->Unicode
);
510 Status
= STATUS_UNSUCCESSFUL
;
514 IntDeleteAliasEntry(Header
, Entry
);
516 else // Add the entry
518 Entry
= IntCreateAliasEntry(Console
,
519 ConsoleAliasRequest
->Source
,
520 ConsoleAliasRequest
->SourceLength
,
521 ConsoleAliasRequest
->Target
,
522 ConsoleAliasRequest
->TargetLength
,
523 ConsoleAliasRequest
->Unicode
);
526 Status
= STATUS_NO_MEMORY
;
530 IntInsertAliasEntry(Header
, Entry
);
534 ConSrvReleaseConsole(Console
, TRUE
);
538 CSR_API(SrvGetConsoleAlias
)
541 PCONSOLE_ADDGETALIAS ConsoleAliasRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleAliasRequest
;
542 PCONSRV_CONSOLE Console
;
543 PALIAS_HEADER Header
;
548 DPRINT("SrvGetConsoleAlias entered ApiMessage %p\n", ApiMessage
);
550 if ( !CsrValidateMessageBuffer(ApiMessage
,
551 (PVOID
*)&ConsoleAliasRequest
->Source
,
552 ConsoleAliasRequest
->SourceLength
,
554 !CsrValidateMessageBuffer(ApiMessage
,
555 (PVOID
*)&ConsoleAliasRequest
->Target
,
556 ConsoleAliasRequest
->TargetLength
,
558 !CsrValidateMessageBuffer(ApiMessage
,
559 (PVOID
*)&ConsoleAliasRequest
->ExeName
,
560 ConsoleAliasRequest
->ExeLength
,
563 return STATUS_INVALID_PARAMETER
;
566 lpTarget
= ConsoleAliasRequest
->Target
;
568 if (ConsoleAliasRequest
->ExeLength
== 0 || lpTarget
== NULL
||
569 ConsoleAliasRequest
->TargetLength
== 0 || ConsoleAliasRequest
->SourceLength
== 0)
571 return STATUS_INVALID_PARAMETER
;
574 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
576 if (!NT_SUCCESS(Status
)) return Status
;
578 Header
= IntFindAliasHeader(Console
,
579 ConsoleAliasRequest
->ExeName
,
580 ConsoleAliasRequest
->ExeLength
,
581 ConsoleAliasRequest
->Unicode2
);
584 Status
= STATUS_UNSUCCESSFUL
;
588 Entry
= IntGetAliasEntry(Console
, Header
,
589 ConsoleAliasRequest
->Source
,
590 ConsoleAliasRequest
->SourceLength
,
591 ConsoleAliasRequest
->Unicode
);
594 Status
= STATUS_UNSUCCESSFUL
;
598 if (ConsoleAliasRequest
->Unicode
)
600 Length
= Entry
->Target
.Length
+ sizeof(WCHAR
);
601 if (Length
> ConsoleAliasRequest
->TargetLength
) // FIXME: Refine computation.
603 Status
= STATUS_BUFFER_TOO_SMALL
;
607 RtlCopyMemory(lpTarget
, Entry
->Target
.Buffer
, Entry
->Target
.Length
);
608 ConsoleAliasRequest
->TargetLength
= Length
;
612 Length
= (Entry
->Target
.Length
+ sizeof(WCHAR
)) / sizeof(WCHAR
);
613 if (Length
> ConsoleAliasRequest
->TargetLength
) // FIXME: Refine computation.
615 Status
= STATUS_BUFFER_TOO_SMALL
;
619 ConvertInputUnicodeToAnsi(Console
,
620 Entry
->Target
.Buffer
, Entry
->Target
.Length
,
621 lpTarget
, Entry
->Target
.Length
/ sizeof(WCHAR
));
622 ConsoleAliasRequest
->TargetLength
= Length
;
626 ConSrvReleaseConsole(Console
, TRUE
);
630 CSR_API(SrvGetConsoleAliases
)
633 PCONSOLE_GETALLALIASES GetAllAliasesRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAllAliasesRequest
;
634 PCONSRV_CONSOLE Console
;
635 ULONG BytesWritten
= 0;
636 PALIAS_HEADER Header
;
638 DPRINT("SrvGetConsoleAliases entered ApiMessage %p\n", ApiMessage
);
640 if ( !CsrValidateMessageBuffer(ApiMessage
,
641 (PVOID
)&GetAllAliasesRequest
->ExeName
,
642 GetAllAliasesRequest
->ExeLength
,
644 !CsrValidateMessageBuffer(ApiMessage
,
645 (PVOID
)&GetAllAliasesRequest
->AliasesBuffer
,
646 GetAllAliasesRequest
->AliasesBufferLength
,
649 return STATUS_INVALID_PARAMETER
;
652 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
654 if (!NT_SUCCESS(Status
)) return Status
;
656 Header
= IntFindAliasHeader(Console
,
657 GetAllAliasesRequest
->ExeName
,
658 GetAllAliasesRequest
->ExeLength
,
659 GetAllAliasesRequest
->Unicode2
);
660 if (!Header
) goto Quit
;
662 if (IntGetAllConsoleAliasesLength(Header
, GetAllAliasesRequest
->Unicode
) > GetAllAliasesRequest
->AliasesBufferLength
)
664 Status
= STATUS_BUFFER_OVERFLOW
;
670 LPWSTR TargetBufferW
;
671 UINT TargetBufferLength
= GetAllAliasesRequest
->AliasesBufferLength
;
673 PALIAS_ENTRY CurEntry
= Header
->Data
;
675 UINT SourceLength
, TargetLength
;
677 if (GetAllAliasesRequest
->Unicode
)
679 TargetBufferW
= GetAllAliasesRequest
->AliasesBuffer
;
680 TargetBufferLength
/= sizeof(WCHAR
);
684 TargetBufferA
= GetAllAliasesRequest
->AliasesBuffer
;
689 SourceLength
= CurEntry
->Source
.Length
/ sizeof(WCHAR
);
690 TargetLength
= CurEntry
->Target
.Length
/ sizeof(WCHAR
);
691 if (Offset
+ TargetLength
+ SourceLength
+ 2 > TargetBufferLength
)
693 Status
= STATUS_BUFFER_OVERFLOW
;
697 if (GetAllAliasesRequest
->Unicode
)
699 RtlCopyMemory(&TargetBufferW
[Offset
], CurEntry
->Source
.Buffer
, SourceLength
* sizeof(WCHAR
));
700 Offset
+= SourceLength
;
701 TargetBufferW
[Offset
++] = L
'=';
702 RtlCopyMemory(&TargetBufferW
[Offset
], CurEntry
->Target
.Buffer
, TargetLength
* sizeof(WCHAR
));
703 Offset
+= TargetLength
;
704 TargetBufferW
[Offset
++] = L
'\0';
708 ConvertInputUnicodeToAnsi(Console
,
709 CurEntry
->Source
.Buffer
, SourceLength
* sizeof(WCHAR
),
710 &TargetBufferA
[Offset
], SourceLength
);
711 Offset
+= SourceLength
;
712 TargetBufferA
[Offset
++] = '=';
713 ConvertInputUnicodeToAnsi(Console
,
714 CurEntry
->Target
.Buffer
, TargetLength
* sizeof(WCHAR
),
715 &TargetBufferA
[Offset
], TargetLength
);
716 Offset
+= TargetLength
;
717 TargetBufferA
[Offset
++] = '\0';
720 CurEntry
= CurEntry
->Next
;
723 if (GetAllAliasesRequest
->Unicode
)
724 BytesWritten
= Offset
* sizeof(WCHAR
);
726 BytesWritten
= Offset
;
730 GetAllAliasesRequest
->AliasesBufferLength
= BytesWritten
;
732 ConSrvReleaseConsole(Console
, TRUE
);
736 CSR_API(SrvGetConsoleAliasesLength
)
739 PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAllAliasesLengthRequest
;
740 PCONSRV_CONSOLE Console
;
741 PALIAS_HEADER Header
;
743 DPRINT("SrvGetConsoleAliasesLength entered ApiMessage %p\n", ApiMessage
);
745 if (!CsrValidateMessageBuffer(ApiMessage
,
746 (PVOID
)&GetAllAliasesLengthRequest
->ExeName
,
747 GetAllAliasesLengthRequest
->ExeLength
,
750 return STATUS_INVALID_PARAMETER
;
753 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
755 if (!NT_SUCCESS(Status
)) return Status
;
757 Header
= IntFindAliasHeader(Console
,
758 GetAllAliasesLengthRequest
->ExeName
,
759 GetAllAliasesLengthRequest
->ExeLength
,
760 GetAllAliasesLengthRequest
->Unicode2
);
763 GetAllAliasesLengthRequest
->Length
=
764 IntGetAllConsoleAliasesLength(Header
,
765 GetAllAliasesLengthRequest
->Unicode
);
766 Status
= STATUS_SUCCESS
;
770 GetAllAliasesLengthRequest
->Length
= 0;
773 ConSrvReleaseConsole(Console
, TRUE
);
777 CSR_API(SrvGetConsoleAliasExes
)
780 PCONSOLE_GETALIASESEXES GetAliasesExesRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAliasesExesRequest
;
781 PCONSRV_CONSOLE Console
;
782 UINT BytesWritten
= 0;
784 DPRINT("SrvGetConsoleAliasExes entered\n");
786 if (!CsrValidateMessageBuffer(ApiMessage
,
787 (PVOID
*)&GetAliasesExesRequest
->ExeNames
,
788 GetAliasesExesRequest
->Length
,
791 return STATUS_INVALID_PARAMETER
;
794 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
796 if (!NT_SUCCESS(Status
)) return Status
;
798 if (IntGetConsoleAliasesExesLength(Console
->Aliases
, GetAliasesExesRequest
->Unicode
) > GetAliasesExesRequest
->Length
)
800 Status
= STATUS_BUFFER_OVERFLOW
;
805 PALIAS_HEADER RootHeader
= Console
->Aliases
;
808 LPWSTR TargetBufferW
;
809 UINT TargetBufferSize
= GetAliasesExesRequest
->Length
;
814 if (GetAliasesExesRequest
->Unicode
)
816 TargetBufferW
= GetAliasesExesRequest
->ExeNames
;
817 TargetBufferSize
/= sizeof(WCHAR
);
821 TargetBufferA
= GetAliasesExesRequest
->ExeNames
;
826 Length
= RootHeader
->ExeName
.Length
/ sizeof(WCHAR
);
827 if (Offset
+ Length
+ 1 > TargetBufferSize
)
829 Status
= STATUS_BUFFER_OVERFLOW
;
833 if (GetAliasesExesRequest
->Unicode
)
835 RtlCopyMemory(&TargetBufferW
[Offset
], RootHeader
->ExeName
.Buffer
, Length
* sizeof(WCHAR
));
837 TargetBufferW
[Offset
++] = L
'\0';
841 ConvertInputUnicodeToAnsi(Console
,
842 RootHeader
->ExeName
.Buffer
, Length
* sizeof(WCHAR
),
843 &TargetBufferA
[Offset
], Length
);
845 TargetBufferA
[Offset
++] = '\0';
848 RootHeader
= RootHeader
->Next
;
851 if (GetAliasesExesRequest
->Unicode
)
852 BytesWritten
= Offset
* sizeof(WCHAR
);
854 BytesWritten
= Offset
;
858 GetAliasesExesRequest
->Length
= BytesWritten
;
860 ConSrvReleaseConsole(Console
, TRUE
);
864 CSR_API(SrvGetConsoleAliasExesLength
)
867 PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAliasesExesLengthRequest
;
868 PCONSRV_CONSOLE Console
;
870 DPRINT("SrvGetConsoleAliasExesLength entered ApiMessage %p\n", ApiMessage
);
872 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
),
874 if (!NT_SUCCESS(Status
)) return Status
;
876 GetAliasesExesLengthRequest
->Length
=
877 IntGetConsoleAliasesExesLength(Console
->Aliases
,
878 GetAliasesExesLengthRequest
->Unicode
);
880 ConSrvReleaseConsole(Console
, TRUE
);