2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: dll/win32/kernel32/client/console/alias.c
5 * PURPOSE: Win32 Console Client Alias support functions
6 * PROGRAMMERS: David Welch (welch@cwcom.net) (welch@mcmail.com)
7 * Christoph von Wittich (christoph_vw@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
11 /* INCLUDES *******************************************************************/
19 /* FUNCTIONS ******************************************************************/
22 IntAddConsoleAlias(LPCVOID Source
,
23 DWORD SourceBufferLength
,
25 DWORD TargetBufferLength
,
29 CONSOLE_API_MESSAGE ApiMessage
;
30 PCONSOLE_ADDGETALIAS ConsoleAliasRequest
= &ApiMessage
.Data
.ConsoleAliasRequest
;
31 PCSR_CAPTURE_BUFFER CaptureBuffer
;
32 ULONG CapturedStrings
;
34 DWORD dwNumChars
= (lpExeName
? (bUnicode
? wcslen(lpExeName
) : strlen(lpExeName
)) : 0);
36 if (lpExeName
== NULL
|| dwNumChars
== 0)
38 SetLastError(ERROR_INVALID_PARAMETER
);
42 ConsoleAliasRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
44 /* Determine the needed sizes */
45 ConsoleAliasRequest
->SourceLength
= SourceBufferLength
;
46 ConsoleAliasRequest
->ExeLength
= dwNumChars
* (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
47 ConsoleAliasRequest
->Unicode
=
48 ConsoleAliasRequest
->Unicode2
= bUnicode
;
52 if (Target
) /* The target can be optional */
54 ConsoleAliasRequest
->TargetLength
= TargetBufferLength
;
59 ConsoleAliasRequest
->TargetLength
= 0;
62 /* Allocate a Capture Buffer */
63 CaptureBuffer
= CsrAllocateCaptureBuffer(CapturedStrings
,
64 ConsoleAliasRequest
->SourceLength
+
65 ConsoleAliasRequest
->ExeLength
+
66 ConsoleAliasRequest
->TargetLength
);
67 if (CaptureBuffer
== NULL
)
69 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
70 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
74 /* Capture the strings */
75 CsrCaptureMessageBuffer(CaptureBuffer
,
77 ConsoleAliasRequest
->SourceLength
,
78 (PVOID
*)&ConsoleAliasRequest
->Source
);
80 CsrCaptureMessageBuffer(CaptureBuffer
,
82 ConsoleAliasRequest
->ExeLength
,
83 (PVOID
*)&ConsoleAliasRequest
->ExeName
);
85 if (Target
) /* The target can be optional */
87 CsrCaptureMessageBuffer(CaptureBuffer
,
89 ConsoleAliasRequest
->TargetLength
,
90 (PVOID
*)&ConsoleAliasRequest
->Target
);
94 ConsoleAliasRequest
->Target
= NULL
;
97 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
99 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepAddAlias
),
100 sizeof(*ConsoleAliasRequest
));
102 CsrFreeCaptureBuffer(CaptureBuffer
);
104 if (!NT_SUCCESS(ApiMessage
.Status
))
106 BaseSetLastNTError(ApiMessage
.Status
);
119 AddConsoleAliasW(LPCWSTR lpSource
,
123 DWORD SourceBufferLength
, TargetBufferLength
;
124 SourceBufferLength
= wcslen(lpSource
) * sizeof(WCHAR
);
125 TargetBufferLength
= (lpTarget
? wcslen(lpTarget
) * sizeof(WCHAR
) : 0);
127 DPRINT1("AddConsoleAliasW entered with lpSource '%S' lpTarget '%S' lpExeName '%S'\n",
128 lpSource
, lpTarget
, lpExeName
);
130 return IntAddConsoleAlias(lpSource
,
144 AddConsoleAliasA(LPCSTR lpSource
,
148 DWORD SourceBufferLength
, TargetBufferLength
;
149 SourceBufferLength
= strlen(lpSource
) * sizeof(CHAR
);
150 TargetBufferLength
= (lpTarget
? strlen(lpTarget
) * sizeof(CHAR
) : 0);
152 DPRINT1("AddConsoleAliasA entered with lpSource '%s' lpTarget '%s' lpExeName '%s'\n",
153 lpSource
, lpTarget
, lpExeName
);
155 return IntAddConsoleAlias(lpSource
,
165 IntGetConsoleAlias(LPVOID Source
,
166 DWORD SourceBufferLength
,
168 DWORD TargetBufferLength
,
172 CONSOLE_API_MESSAGE ApiMessage
;
173 PCONSOLE_ADDGETALIAS ConsoleAliasRequest
= &ApiMessage
.Data
.ConsoleAliasRequest
;
174 PCSR_CAPTURE_BUFFER CaptureBuffer
;
176 DWORD dwNumChars
= (lpExeName
? (bUnicode
? wcslen(lpExeName
) : strlen(lpExeName
)) : 0);
178 if (Source
== NULL
|| Target
== NULL
)
180 SetLastError(ERROR_INVALID_PARAMETER
);
184 if (lpExeName
== NULL
|| dwNumChars
== 0)
186 SetLastError(ERROR_INVALID_PARAMETER
);
190 ConsoleAliasRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
192 /* Determine the needed sizes */
193 ConsoleAliasRequest
->SourceLength
= SourceBufferLength
;
194 ConsoleAliasRequest
->ExeLength
= dwNumChars
* (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
195 ConsoleAliasRequest
->Unicode
=
196 ConsoleAliasRequest
->Unicode2
= bUnicode
;
198 ConsoleAliasRequest
->TargetLength
= TargetBufferLength
;
200 /* Allocate a Capture Buffer */
201 CaptureBuffer
= CsrAllocateCaptureBuffer(3, ConsoleAliasRequest
->SourceLength
+
202 ConsoleAliasRequest
->ExeLength
+
203 ConsoleAliasRequest
->TargetLength
);
206 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
207 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
211 /* Capture the strings */
212 CsrCaptureMessageBuffer(CaptureBuffer
,
214 ConsoleAliasRequest
->SourceLength
,
215 (PVOID
*)&ConsoleAliasRequest
->Source
);
217 CsrCaptureMessageBuffer(CaptureBuffer
,
219 ConsoleAliasRequest
->ExeLength
,
220 (PVOID
*)&ConsoleAliasRequest
->ExeName
);
222 /* Allocate space for the target buffer */
223 CsrAllocateMessagePointer(CaptureBuffer
,
224 ConsoleAliasRequest
->TargetLength
,
225 (PVOID
*)&ConsoleAliasRequest
->Target
);
227 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
229 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetAlias
),
230 sizeof(*ConsoleAliasRequest
));
231 if (!NT_SUCCESS(ApiMessage
.Status
))
233 CsrFreeCaptureBuffer(CaptureBuffer
);
234 BaseSetLastNTError(ApiMessage
.Status
);
236 if (ApiMessage
.Status
== STATUS_BUFFER_TOO_SMALL
)
237 return ConsoleAliasRequest
->TargetLength
;
242 /* Copy the returned target string into the user buffer */
244 ConsoleAliasRequest
->Target
,
245 ConsoleAliasRequest
->TargetLength
);
247 /* Release the capture buffer and exit */
248 CsrFreeCaptureBuffer(CaptureBuffer
);
250 return ConsoleAliasRequest
->TargetLength
;
259 GetConsoleAliasW(LPWSTR lpSource
,
260 LPWSTR lpTargetBuffer
,
261 DWORD TargetBufferLength
,
264 DPRINT1("GetConsoleAliasW entered with lpSource '%S' lpExeName '%S'\n",
265 lpSource
, lpExeName
);
267 return IntGetConsoleAlias(lpSource
,
268 wcslen(lpSource
) * sizeof(WCHAR
),
281 GetConsoleAliasA(LPSTR lpSource
,
282 LPSTR lpTargetBuffer
,
283 DWORD TargetBufferLength
,
286 DPRINT1("GetConsoleAliasA entered with lpSource '%s' lpExeName '%s'\n",
287 lpSource
, lpExeName
);
289 return IntGetConsoleAlias(lpSource
,
290 strlen(lpSource
) * sizeof(CHAR
),
299 IntGetConsoleAliases(LPVOID AliasBuffer
,
300 DWORD AliasBufferLength
,
304 CONSOLE_API_MESSAGE ApiMessage
;
305 PCONSOLE_GETALLALIASES GetAllAliasesRequest
= &ApiMessage
.Data
.GetAllAliasesRequest
;
306 PCSR_CAPTURE_BUFFER CaptureBuffer
;
308 DWORD dwNumChars
= (lpExeName
? (bUnicode
? wcslen(lpExeName
) : strlen(lpExeName
)) : 0);
310 if (lpExeName
== NULL
|| dwNumChars
== 0)
312 SetLastError(ERROR_INVALID_PARAMETER
);
316 GetAllAliasesRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
318 /* Determine the needed sizes */
319 GetAllAliasesRequest
->ExeLength
= dwNumChars
* (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
320 GetAllAliasesRequest
->Unicode
=
321 GetAllAliasesRequest
->Unicode2
= bUnicode
;
323 GetAllAliasesRequest
->AliasesBufferLength
= AliasBufferLength
;
325 /* Allocate a Capture Buffer */
326 CaptureBuffer
= CsrAllocateCaptureBuffer(2, GetAllAliasesRequest
->ExeLength
+
327 GetAllAliasesRequest
->AliasesBufferLength
);
330 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
331 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
335 /* Capture the exe name and allocate space for the aliases buffer */
336 CsrCaptureMessageBuffer(CaptureBuffer
,
338 GetAllAliasesRequest
->ExeLength
,
339 (PVOID
*)&GetAllAliasesRequest
->ExeName
);
341 CsrAllocateMessagePointer(CaptureBuffer
,
342 GetAllAliasesRequest
->AliasesBufferLength
,
343 (PVOID
*)&GetAllAliasesRequest
->AliasesBuffer
);
345 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
347 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetAliases
),
348 sizeof(*GetAllAliasesRequest
));
349 if (!NT_SUCCESS(ApiMessage
.Status
))
351 CsrFreeCaptureBuffer(CaptureBuffer
);
352 BaseSetLastNTError(ApiMessage
.Status
);
356 /* Copy the returned aliases string into the user buffer */
358 GetAllAliasesRequest
->AliasesBuffer
,
359 GetAllAliasesRequest
->AliasesBufferLength
);
361 /* Release the capture buffer and exit */
362 CsrFreeCaptureBuffer(CaptureBuffer
);
364 return GetAllAliasesRequest
->AliasesBufferLength
;
373 GetConsoleAliasesW(LPWSTR AliasBuffer
,
374 DWORD AliasBufferLength
,
377 DPRINT1("GetConsoleAliasesW entered with lpExeName '%S'\n",
380 return IntGetConsoleAliases(AliasBuffer
,
392 GetConsoleAliasesA(LPSTR AliasBuffer
,
393 DWORD AliasBufferLength
,
396 DPRINT1("GetConsoleAliasesA entered with lpExeName '%s'\n",
399 return IntGetConsoleAliases(AliasBuffer
,
407 IntGetConsoleAliasesLength(LPVOID lpExeName
, BOOLEAN bUnicode
)
409 CONSOLE_API_MESSAGE ApiMessage
;
410 PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest
= &ApiMessage
.Data
.GetAllAliasesLengthRequest
;
411 PCSR_CAPTURE_BUFFER CaptureBuffer
;
413 DWORD dwNumChars
= (lpExeName
? (bUnicode
? wcslen(lpExeName
) : strlen(lpExeName
)) : 0);
415 if (lpExeName
== NULL
|| dwNumChars
== 0)
417 SetLastError(ERROR_INVALID_PARAMETER
);
421 GetAllAliasesLengthRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
422 GetAllAliasesLengthRequest
->ExeLength
= dwNumChars
* (bUnicode
? sizeof(WCHAR
) : sizeof(CHAR
));
423 GetAllAliasesLengthRequest
->Unicode
=
424 GetAllAliasesLengthRequest
->Unicode2
= bUnicode
;
426 CaptureBuffer
= CsrAllocateCaptureBuffer(1, GetAllAliasesLengthRequest
->ExeLength
);
429 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
430 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
434 CsrCaptureMessageBuffer(CaptureBuffer
,
436 GetAllAliasesLengthRequest
->ExeLength
,
437 (PVOID
)&GetAllAliasesLengthRequest
->ExeName
);
439 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
441 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetAliasesLength
),
442 sizeof(*GetAllAliasesLengthRequest
));
444 CsrFreeCaptureBuffer(CaptureBuffer
);
446 if (!NT_SUCCESS(ApiMessage
.Status
))
448 BaseSetLastNTError(ApiMessage
.Status
);
452 return GetAllAliasesLengthRequest
->Length
;
461 GetConsoleAliasesLengthW(LPWSTR lpExeName
)
463 return IntGetConsoleAliasesLength(lpExeName
, TRUE
);
472 GetConsoleAliasesLengthA(LPSTR lpExeName
)
474 return IntGetConsoleAliasesLength(lpExeName
, FALSE
);
479 IntGetConsoleAliasExes(PVOID lpExeNameBuffer
,
480 DWORD ExeNameBufferLength
,
483 CONSOLE_API_MESSAGE ApiMessage
;
484 PCONSOLE_GETALIASESEXES GetAliasesExesRequest
= &ApiMessage
.Data
.GetAliasesExesRequest
;
485 PCSR_CAPTURE_BUFFER CaptureBuffer
;
487 GetAliasesExesRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
488 GetAliasesExesRequest
->Length
= ExeNameBufferLength
;
489 GetAliasesExesRequest
->Unicode
= bUnicode
;
491 CaptureBuffer
= CsrAllocateCaptureBuffer(1, ExeNameBufferLength
);
494 DPRINT1("CsrAllocateCaptureBuffer failed!\n");
495 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
499 CsrAllocateMessagePointer(CaptureBuffer
,
501 (PVOID
*)&GetAliasesExesRequest
->ExeNames
);
503 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
505 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetAliasExes
),
506 sizeof(*GetAliasesExesRequest
));
507 if (!NT_SUCCESS(ApiMessage
.Status
))
509 CsrFreeCaptureBuffer(CaptureBuffer
);
510 BaseSetLastNTError(ApiMessage
.Status
);
514 memcpy(lpExeNameBuffer
,
515 GetAliasesExesRequest
->ExeNames
,
516 GetAliasesExesRequest
->Length
);
518 CsrFreeCaptureBuffer(CaptureBuffer
);
520 return GetAliasesExesRequest
->Length
;
528 GetConsoleAliasExesW(LPWSTR lpExeNameBuffer
,
529 DWORD ExeNameBufferLength
)
531 DPRINT1("GetConsoleAliasExesW called\n");
532 return IntGetConsoleAliasExes(lpExeNameBuffer
, ExeNameBufferLength
, TRUE
);
541 GetConsoleAliasExesA(LPSTR lpExeNameBuffer
,
542 DWORD ExeNameBufferLength
)
544 DPRINT1("GetConsoleAliasExesA called\n");
545 return IntGetConsoleAliasExes(lpExeNameBuffer
, ExeNameBufferLength
, FALSE
);
550 IntGetConsoleAliasExesLength(BOOLEAN bUnicode
)
552 CONSOLE_API_MESSAGE ApiMessage
;
553 PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest
= &ApiMessage
.Data
.GetAliasesExesLengthRequest
;
555 GetAliasesExesLengthRequest
->ConsoleHandle
= NtCurrentPeb()->ProcessParameters
->ConsoleHandle
;
556 GetAliasesExesLengthRequest
->Unicode
= bUnicode
;
558 CsrClientCallServer((PCSR_API_MESSAGE
)&ApiMessage
,
560 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX
, ConsolepGetAliasExesLength
),
561 sizeof(*GetAliasesExesLengthRequest
));
562 if (!NT_SUCCESS(ApiMessage
.Status
))
564 BaseSetLastNTError(ApiMessage
.Status
);
568 return GetAliasesExesLengthRequest
->Length
;
577 GetConsoleAliasExesLengthW(VOID
)
579 DPRINT1("GetConsoleAliasExesLengthW called\n");
580 return IntGetConsoleAliasExesLength(TRUE
);
589 GetConsoleAliasExesLengthA(VOID
)
591 DPRINT1("GetConsoleAliasExesLengthA called\n");
592 return IntGetConsoleAliasExesLength(FALSE
);