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
);
73 /* Use the console input CP for the conversion */
74 // *TargetLength = WideCharToMultiByte(Console->InputCodePage, 0,
75 // Source, SourceLength,
76 // NULL, 0, NULL, NULL);
77 // *Target = ConsoleAllocHeap(0, *TargetLength * sizeof(WCHAR));
78 // if (*Target == NULL) return FALSE;
80 WideCharToMultiByte(Console
->InputCodePage
, 0,
82 /* * */Target
, /* * */TargetLength
,
85 // /* The returned Length was in number of WCHARs, convert it in bytes */
86 // *TargetLength *= sizeof(WCHAR);
94 /* PRIVATE FUNCTIONS **********************************************************/
97 IntFindAliasHeader(PCONSOLE Console
,
102 UNICODE_STRING ExeNameU
;
104 PALIAS_HEADER RootHeader
= Console
->Aliases
;
107 if (ExeName
== NULL
) return NULL
;
111 ExeNameU
.Buffer
= ExeName
;
112 /* Length is in bytes */
113 ExeNameU
.MaximumLength
= ExeLength
;
117 if (!ConvertInputAnsiToUnicode(Console
,
119 &ExeNameU
.Buffer
, &ExeNameU
.MaximumLength
))
124 ExeNameU
.Length
= ExeNameU
.MaximumLength
;
128 Diff
= RtlCompareUnicodeString(&RootHeader
->ExeName
, &ExeNameU
, TRUE
);
131 if (!UnicodeExe
) ConsoleFreeHeap(ExeNameU
.Buffer
);
136 RootHeader
= RootHeader
->Next
;
139 if (!UnicodeExe
) ConsoleFreeHeap(ExeNameU
.Buffer
);
144 IntCreateAliasHeader(PCONSOLE Console
,
149 UNICODE_STRING ExeNameU
;
153 if (ExeName
== NULL
) return NULL
;
157 ExeNameU
.Buffer
= ExeName
;
158 /* Length is in bytes */
159 ExeNameU
.MaximumLength
= ExeLength
;
163 if (!ConvertInputAnsiToUnicode(Console
,
165 &ExeNameU
.Buffer
, &ExeNameU
.MaximumLength
))
170 ExeNameU
.Length
= ExeNameU
.MaximumLength
;
172 Entry
= ConsoleAllocHeap(0, sizeof(ALIAS_HEADER
) + ExeNameU
.Length
);
175 if (!UnicodeExe
) ConsoleFreeHeap(ExeNameU
.Buffer
);
179 Entry
->ExeName
.Buffer
= (PWSTR
)(Entry
+ 1);
180 Entry
->ExeName
.Length
= 0;
181 Entry
->ExeName
.MaximumLength
= ExeNameU
.Length
;
182 RtlCopyUnicodeString(&Entry
->ExeName
, &ExeNameU
);
187 if (!UnicodeExe
) ConsoleFreeHeap(ExeNameU
.Buffer
);
192 IntInsertAliasHeader(PALIAS_HEADER
* RootHeader
,
193 PALIAS_HEADER NewHeader
)
195 PALIAS_HEADER CurrentHeader
;
196 PALIAS_HEADER
*LastLink
= RootHeader
;
199 while ((CurrentHeader
= *LastLink
) != NULL
)
201 Diff
= RtlCompareUnicodeString(&NewHeader
->ExeName
, &CurrentHeader
->ExeName
, TRUE
);
204 LastLink
= &CurrentHeader
->Next
;
207 *LastLink
= NewHeader
;
208 NewHeader
->Next
= CurrentHeader
;
212 IntGetAliasEntry(PCONSOLE Console
,
213 PALIAS_HEADER Header
,
218 UNICODE_STRING SourceU
;
223 if (Header
== NULL
|| Source
== NULL
) return NULL
;
227 SourceU
.Buffer
= Source
;
228 /* Length is in bytes */
229 SourceU
.MaximumLength
= SourceLength
;
233 if (!ConvertInputAnsiToUnicode(Console
,
234 Source
, SourceLength
,
235 &SourceU
.Buffer
, &SourceU
.MaximumLength
))
240 SourceU
.Length
= SourceU
.MaximumLength
;
242 Entry
= Header
->Data
;
245 Diff
= RtlCompareUnicodeString(&Entry
->Source
, &SourceU
, TRUE
);
248 if (!Unicode
) ConsoleFreeHeap(SourceU
.Buffer
);
256 if (!Unicode
) ConsoleFreeHeap(SourceU
.Buffer
);
261 IntCreateAliasEntry(PCONSOLE Console
,
268 UNICODE_STRING SourceU
;
269 UNICODE_STRING TargetU
;
275 SourceU
.Buffer
= Source
;
276 TargetU
.Buffer
= Target
;
277 /* Length is in bytes */
278 SourceU
.MaximumLength
= SourceLength
;
279 TargetU
.MaximumLength
= TargetLength
;
283 if (!ConvertInputAnsiToUnicode(Console
,
284 Source
, SourceLength
,
285 &SourceU
.Buffer
, &SourceU
.MaximumLength
))
290 if (!ConvertInputAnsiToUnicode(Console
,
291 Target
, TargetLength
,
292 &TargetU
.Buffer
, &TargetU
.MaximumLength
))
294 ConsoleFreeHeap(SourceU
.Buffer
);
298 SourceU
.Length
= SourceU
.MaximumLength
;
299 TargetU
.Length
= TargetU
.MaximumLength
;
301 Entry
= ConsoleAllocHeap(0, sizeof(ALIAS_ENTRY
) +
302 SourceU
.Length
+ TargetU
.Length
);
307 ConsoleFreeHeap(TargetU
.Buffer
);
308 ConsoleFreeHeap(SourceU
.Buffer
);
313 Entry
->Source
.Buffer
= (PWSTR
)(Entry
+ 1);
314 Entry
->Source
.Length
= 0;
315 Entry
->Source
.MaximumLength
= SourceU
.Length
;
316 RtlCopyUnicodeString(&Entry
->Source
, &SourceU
);
318 Entry
->Target
.Buffer
= (PWSTR
)((ULONG_PTR
)Entry
->Source
.Buffer
+ Entry
->Source
.MaximumLength
);
319 Entry
->Target
.Length
= 0;
320 Entry
->Target
.MaximumLength
= TargetU
.Length
;
321 RtlCopyUnicodeString(&Entry
->Target
, &TargetU
);
327 ConsoleFreeHeap(TargetU
.Buffer
);
328 ConsoleFreeHeap(SourceU
.Buffer
);
334 IntInsertAliasEntry(PALIAS_HEADER Header
,
335 PALIAS_ENTRY NewEntry
)
337 PALIAS_ENTRY CurrentEntry
;
338 PALIAS_ENTRY
*LastLink
= &Header
->Data
;
341 while ((CurrentEntry
= *LastLink
) != NULL
)
343 Diff
= RtlCompareUnicodeString(&NewEntry
->Source
, &CurrentEntry
->Source
, TRUE
);
346 LastLink
= &CurrentEntry
->Next
;
349 *LastLink
= NewEntry
;
350 NewEntry
->Next
= CurrentEntry
;
354 IntDeleteAliasEntry(PALIAS_HEADER Header
,
357 PALIAS_ENTRY
*LastLink
= &Header
->Data
;
358 PALIAS_ENTRY CurEntry
;
360 while ((CurEntry
= *LastLink
) != NULL
)
362 if (CurEntry
== Entry
)
364 *LastLink
= Entry
->Next
;
365 ConsoleFreeHeap(Entry
);
368 LastLink
= &CurEntry
->Next
;
373 IntGetConsoleAliasesExesLength(PALIAS_HEADER RootHeader
,
380 Length
+= RootHeader
->ExeName
.Length
+ sizeof(WCHAR
); // NULL-termination
381 RootHeader
= RootHeader
->Next
;
385 * Quick and dirty way of getting the number of bytes of the
386 * corresponding ANSI string from the one in UNICODE.
389 Length
/= sizeof(WCHAR
);
395 IntGetAllConsoleAliasesLength(PALIAS_HEADER Header
,
399 PALIAS_ENTRY CurEntry
= Header
->Data
;
403 Length
+= CurEntry
->Source
.Length
;
404 Length
+= CurEntry
->Target
.Length
;
405 Length
+= 2 * sizeof(WCHAR
); // '=' and NULL-termination
406 CurEntry
= CurEntry
->Next
;
410 * Quick and dirty way of getting the number of bytes of the
411 * corresponding ANSI string from the one in UNICODE.
414 Length
/= sizeof(WCHAR
);
420 IntDeleteAllAliases(PCONSOLE Console
)
422 PALIAS_HEADER Header
, NextHeader
;
423 PALIAS_ENTRY Entry
, NextEntry
;
425 for (Header
= Console
->Aliases
; Header
; Header
= NextHeader
)
427 NextHeader
= Header
->Next
;
428 for (Entry
= Header
->Data
; Entry
; Entry
= NextEntry
)
430 NextEntry
= Entry
->Next
;
431 ConsoleFreeHeap(Entry
);
433 ConsoleFreeHeap(Header
);
438 /* PUBLIC SERVER APIS *********************************************************/
440 CSR_API(SrvAddConsoleAlias
)
443 PCONSOLE_ADDGETALIAS ConsoleAliasRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleAliasRequest
;
445 PALIAS_HEADER Header
;
449 DPRINT1("SrvAddConsoleAlias entered ApiMessage %p\n", ApiMessage
);
451 if ( !CsrValidateMessageBuffer(ApiMessage
,
452 (PVOID
*)&ConsoleAliasRequest
->Source
,
453 ConsoleAliasRequest
->SourceLength
,
455 !CsrValidateMessageBuffer(ApiMessage
,
456 (PVOID
*)&ConsoleAliasRequest
->Target
,
457 ConsoleAliasRequest
->TargetLength
,
459 !CsrValidateMessageBuffer(ApiMessage
,
460 (PVOID
*)&ConsoleAliasRequest
->ExeName
,
461 ConsoleAliasRequest
->ExeLength
,
464 return STATUS_INVALID_PARAMETER
;
467 lpTarget
= (ConsoleAliasRequest
->TargetLength
!= 0 ? ConsoleAliasRequest
->Target
: NULL
);
469 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
470 if (!NT_SUCCESS(Status
)) return Status
;
472 Status
= STATUS_SUCCESS
;
474 Header
= IntFindAliasHeader(Console
,
475 ConsoleAliasRequest
->ExeName
,
476 ConsoleAliasRequest
->ExeLength
,
477 ConsoleAliasRequest
->Unicode2
);
478 if (!Header
&& lpTarget
!= NULL
)
480 Header
= IntCreateAliasHeader(Console
,
481 ConsoleAliasRequest
->ExeName
,
482 ConsoleAliasRequest
->ExeLength
,
483 ConsoleAliasRequest
->Unicode2
);
486 Status
= STATUS_NO_MEMORY
;
490 IntInsertAliasHeader(&Console
->Aliases
, Header
);
493 if (lpTarget
== NULL
) // Delete the entry
495 Entry
= IntGetAliasEntry(Console
, Header
,
496 ConsoleAliasRequest
->Source
,
497 ConsoleAliasRequest
->SourceLength
,
498 ConsoleAliasRequest
->Unicode
);
501 Status
= STATUS_UNSUCCESSFUL
;
505 IntDeleteAliasEntry(Header
, Entry
);
507 else // Add the entry
509 Entry
= IntCreateAliasEntry(Console
,
510 ConsoleAliasRequest
->Source
,
511 ConsoleAliasRequest
->SourceLength
,
512 ConsoleAliasRequest
->Target
,
513 ConsoleAliasRequest
->TargetLength
,
514 ConsoleAliasRequest
->Unicode
);
517 Status
= STATUS_NO_MEMORY
;
521 IntInsertAliasEntry(Header
, Entry
);
525 ConSrvReleaseConsole(Console
, TRUE
);
529 CSR_API(SrvGetConsoleAlias
)
532 PCONSOLE_ADDGETALIAS ConsoleAliasRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.ConsoleAliasRequest
;
534 PALIAS_HEADER Header
;
539 DPRINT1("SrvGetConsoleAlias entered ApiMessage %p\n", ApiMessage
);
541 if ( !CsrValidateMessageBuffer(ApiMessage
,
542 (PVOID
*)&ConsoleAliasRequest
->Source
,
543 ConsoleAliasRequest
->SourceLength
,
545 !CsrValidateMessageBuffer(ApiMessage
,
546 (PVOID
*)&ConsoleAliasRequest
->Target
,
547 ConsoleAliasRequest
->TargetLength
,
549 !CsrValidateMessageBuffer(ApiMessage
,
550 (PVOID
*)&ConsoleAliasRequest
->ExeName
,
551 ConsoleAliasRequest
->ExeLength
,
554 return STATUS_INVALID_PARAMETER
;
557 lpTarget
= ConsoleAliasRequest
->Target
;
559 if (ConsoleAliasRequest
->ExeLength
== 0 || lpTarget
== NULL
||
560 ConsoleAliasRequest
->TargetLength
== 0 || ConsoleAliasRequest
->SourceLength
== 0)
562 return STATUS_INVALID_PARAMETER
;
565 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
566 if (!NT_SUCCESS(Status
)) return Status
;
568 Header
= IntFindAliasHeader(Console
,
569 ConsoleAliasRequest
->ExeName
,
570 ConsoleAliasRequest
->ExeLength
,
571 ConsoleAliasRequest
->Unicode2
);
574 Status
= STATUS_UNSUCCESSFUL
;
578 Entry
= IntGetAliasEntry(Console
, Header
,
579 ConsoleAliasRequest
->Source
,
580 ConsoleAliasRequest
->SourceLength
,
581 ConsoleAliasRequest
->Unicode
);
584 Status
= STATUS_UNSUCCESSFUL
;
588 if (ConsoleAliasRequest
->Unicode
)
590 Length
= Entry
->Target
.Length
+ sizeof(WCHAR
);
591 if (Length
> ConsoleAliasRequest
->TargetLength
) // FIXME: Refine computation.
593 Status
= STATUS_BUFFER_TOO_SMALL
;
597 RtlCopyMemory(lpTarget
, Entry
->Target
.Buffer
, Entry
->Target
.Length
);
598 ConsoleAliasRequest
->TargetLength
= Length
;
602 Length
= (Entry
->Target
.Length
+ sizeof(WCHAR
)) / sizeof(WCHAR
);
603 if (Length
> ConsoleAliasRequest
->TargetLength
) // FIXME: Refine computation.
605 Status
= STATUS_BUFFER_TOO_SMALL
;
609 ConvertInputUnicodeToAnsi(Console
,
610 Entry
->Target
.Buffer
, Entry
->Target
.Length
,
611 lpTarget
, Entry
->Target
.Length
/ sizeof(WCHAR
));
612 ConsoleAliasRequest
->TargetLength
= Length
;
616 ConSrvReleaseConsole(Console
, TRUE
);
620 CSR_API(SrvGetConsoleAliases
)
623 PCONSOLE_GETALLALIASES GetAllAliasesRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAllAliasesRequest
;
625 ULONG BytesWritten
= 0;
626 PALIAS_HEADER Header
;
628 DPRINT1("SrvGetConsoleAliases entered ApiMessage %p\n", ApiMessage
);
630 if ( !CsrValidateMessageBuffer(ApiMessage
,
631 (PVOID
)&GetAllAliasesRequest
->ExeName
,
632 GetAllAliasesRequest
->ExeLength
,
634 !CsrValidateMessageBuffer(ApiMessage
,
635 (PVOID
)&GetAllAliasesRequest
->AliasesBuffer
,
636 GetAllAliasesRequest
->AliasesBufferLength
,
639 return STATUS_INVALID_PARAMETER
;
642 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
643 if (!NT_SUCCESS(Status
)) return Status
;
645 Header
= IntFindAliasHeader(Console
,
646 GetAllAliasesRequest
->ExeName
,
647 GetAllAliasesRequest
->ExeLength
,
648 GetAllAliasesRequest
->Unicode2
);
649 if (!Header
) goto Quit
;
651 if (IntGetAllConsoleAliasesLength(Header
, GetAllAliasesRequest
->Unicode
) > GetAllAliasesRequest
->AliasesBufferLength
)
653 Status
= STATUS_BUFFER_OVERFLOW
;
659 LPWSTR TargetBufferW
;
660 UINT TargetBufferLength
= GetAllAliasesRequest
->AliasesBufferLength
;
662 PALIAS_ENTRY CurEntry
= Header
->Data
;
664 UINT SourceLength
, TargetLength
;
666 if (GetAllAliasesRequest
->Unicode
)
668 TargetBufferW
= GetAllAliasesRequest
->AliasesBuffer
;
669 TargetBufferLength
/= sizeof(WCHAR
);
673 TargetBufferA
= GetAllAliasesRequest
->AliasesBuffer
;
678 SourceLength
= CurEntry
->Source
.Length
/ sizeof(WCHAR
);
679 TargetLength
= CurEntry
->Target
.Length
/ sizeof(WCHAR
);
680 if (Offset
+ TargetLength
+ SourceLength
+ 2 > TargetBufferLength
)
682 Status
= STATUS_BUFFER_OVERFLOW
;
686 if (GetAllAliasesRequest
->Unicode
)
688 RtlCopyMemory(&TargetBufferW
[Offset
], CurEntry
->Source
.Buffer
, SourceLength
* sizeof(WCHAR
));
689 Offset
+= SourceLength
;
690 TargetBufferW
[Offset
++] = L
'=';
691 RtlCopyMemory(&TargetBufferW
[Offset
], CurEntry
->Target
.Buffer
, TargetLength
* sizeof(WCHAR
));
692 Offset
+= TargetLength
;
693 TargetBufferW
[Offset
++] = L
'\0';
697 ConvertInputUnicodeToAnsi(Console
,
698 CurEntry
->Source
.Buffer
, SourceLength
* sizeof(WCHAR
),
699 &TargetBufferA
[Offset
], SourceLength
);
700 Offset
+= SourceLength
;
701 TargetBufferA
[Offset
++] = '=';
702 ConvertInputUnicodeToAnsi(Console
,
703 CurEntry
->Target
.Buffer
, TargetLength
* sizeof(WCHAR
),
704 &TargetBufferA
[Offset
], TargetLength
);
705 Offset
+= TargetLength
;
706 TargetBufferA
[Offset
++] = '\0';
709 CurEntry
= CurEntry
->Next
;
712 if (GetAllAliasesRequest
->Unicode
)
713 BytesWritten
= Offset
* sizeof(WCHAR
);
715 BytesWritten
= Offset
;
719 GetAllAliasesRequest
->AliasesBufferLength
= BytesWritten
;
721 ConSrvReleaseConsole(Console
, TRUE
);
725 CSR_API(SrvGetConsoleAliasesLength
)
728 PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAllAliasesLengthRequest
;
730 PALIAS_HEADER Header
;
732 DPRINT1("SrvGetConsoleAliasesLength entered ApiMessage %p\n", ApiMessage
);
734 if (!CsrValidateMessageBuffer(ApiMessage
,
735 (PVOID
)&GetAllAliasesLengthRequest
->ExeName
,
736 GetAllAliasesLengthRequest
->ExeLength
,
739 return STATUS_INVALID_PARAMETER
;
742 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
743 if (!NT_SUCCESS(Status
)) return Status
;
745 Header
= IntFindAliasHeader(Console
,
746 GetAllAliasesLengthRequest
->ExeName
,
747 GetAllAliasesLengthRequest
->ExeLength
,
748 GetAllAliasesLengthRequest
->Unicode2
);
751 GetAllAliasesLengthRequest
->Length
=
752 IntGetAllConsoleAliasesLength(Header
,
753 GetAllAliasesLengthRequest
->Unicode
);
754 Status
= STATUS_SUCCESS
;
758 GetAllAliasesLengthRequest
->Length
= 0;
761 ConSrvReleaseConsole(Console
, TRUE
);
765 CSR_API(SrvGetConsoleAliasExes
)
768 PCONSOLE_GETALIASESEXES GetAliasesExesRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAliasesExesRequest
;
770 UINT BytesWritten
= 0;
772 DPRINT1("SrvGetConsoleAliasExes entered\n");
774 if (!CsrValidateMessageBuffer(ApiMessage
,
775 (PVOID
*)&GetAliasesExesRequest
->ExeNames
,
776 GetAliasesExesRequest
->Length
,
779 return STATUS_INVALID_PARAMETER
;
782 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
783 if (!NT_SUCCESS(Status
)) return Status
;
785 if (IntGetConsoleAliasesExesLength(Console
->Aliases
, GetAliasesExesRequest
->Unicode
) > GetAliasesExesRequest
->Length
)
787 Status
= STATUS_BUFFER_OVERFLOW
;
792 PALIAS_HEADER RootHeader
= Console
->Aliases
;
795 LPWSTR TargetBufferW
;
796 UINT TargetBufferSize
= GetAliasesExesRequest
->Length
;
801 if (GetAliasesExesRequest
->Unicode
)
803 TargetBufferW
= GetAliasesExesRequest
->ExeNames
;
804 TargetBufferSize
/= sizeof(WCHAR
);
808 TargetBufferA
= GetAliasesExesRequest
->ExeNames
;
813 Length
= RootHeader
->ExeName
.Length
/ sizeof(WCHAR
);
814 if (Offset
+ Length
+ 1 > TargetBufferSize
)
816 Status
= STATUS_BUFFER_OVERFLOW
;
820 if (GetAliasesExesRequest
->Unicode
)
822 RtlCopyMemory(&TargetBufferW
[Offset
], RootHeader
->ExeName
.Buffer
, Length
* sizeof(WCHAR
));
824 TargetBufferW
[Offset
++] = L
'\0';
828 ConvertInputUnicodeToAnsi(Console
,
829 RootHeader
->ExeName
.Buffer
, Length
* sizeof(WCHAR
),
830 &TargetBufferA
[Offset
], Length
);
832 TargetBufferA
[Offset
++] = '\0';
835 RootHeader
= RootHeader
->Next
;
838 if (GetAliasesExesRequest
->Unicode
)
839 BytesWritten
= Offset
* sizeof(WCHAR
);
841 BytesWritten
= Offset
;
845 GetAliasesExesRequest
->Length
= BytesWritten
;
847 ConSrvReleaseConsole(Console
, TRUE
);
851 CSR_API(SrvGetConsoleAliasExesLength
)
854 PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest
= &((PCONSOLE_API_MESSAGE
)ApiMessage
)->Data
.GetAliasesExesLengthRequest
;
857 DPRINT1("SrvGetConsoleAliasExesLength entered ApiMessage %p\n", ApiMessage
);
859 Status
= ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process
), &Console
, TRUE
);
860 if (!NT_SUCCESS(Status
)) return Status
;
862 GetAliasesExesLengthRequest
->Length
=
863 IntGetConsoleAliasesExesLength(Console
->Aliases
,
864 GetAliasesExesLengthRequest
->Unicode
);
866 ConSrvReleaseConsole(Console
, TRUE
);