Reactos
at master 613 lines 18 kB view raw
1/* 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) 9 */ 10 11/* INCLUDES *******************************************************************/ 12 13#include <k32.h> 14 15#define NDEBUG 16#include <debug.h> 17 18 19/* FUNCTIONS ******************************************************************/ 20 21static BOOL 22IntAddConsoleAlias(LPCVOID Source, 23 USHORT SourceBufferLength, 24 LPCVOID Target, 25 USHORT TargetBufferLength, 26 LPCVOID ExeName, 27 BOOLEAN bUnicode) 28{ 29 CONSOLE_API_MESSAGE ApiMessage; 30 PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &ApiMessage.Data.ConsoleAliasRequest; 31 PCSR_CAPTURE_BUFFER CaptureBuffer; 32 ULONG CapturedStrings; 33 34 USHORT NumChars = (USHORT)(ExeName ? (bUnicode ? wcslen(ExeName) : strlen(ExeName)) : 0); 35 36 if (ExeName == NULL || NumChars == 0) 37 { 38 SetLastError(ERROR_INVALID_PARAMETER); 39 return FALSE; 40 } 41 42 ConsoleAliasRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; 43 44 /* Determine the needed sizes */ 45 ConsoleAliasRequest->SourceLength = SourceBufferLength; 46 ConsoleAliasRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); 47 ConsoleAliasRequest->Unicode = 48 ConsoleAliasRequest->Unicode2 = bUnicode; 49 50 CapturedStrings = 2; 51 52 if (Target) /* The target can be optional */ 53 { 54 ConsoleAliasRequest->TargetLength = TargetBufferLength; 55 CapturedStrings++; 56 } 57 else 58 { 59 ConsoleAliasRequest->TargetLength = 0; 60 } 61 62 /* Allocate a Capture Buffer */ 63 CaptureBuffer = CsrAllocateCaptureBuffer(CapturedStrings, 64 ConsoleAliasRequest->SourceLength + 65 ConsoleAliasRequest->ExeLength + 66 ConsoleAliasRequest->TargetLength); 67 if (CaptureBuffer == NULL) 68 { 69 DPRINT1("CsrAllocateCaptureBuffer failed!\n"); 70 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 71 return FALSE; 72 } 73 74 /* Capture the strings */ 75 CsrCaptureMessageBuffer(CaptureBuffer, 76 (PVOID)Source, 77 ConsoleAliasRequest->SourceLength, 78 (PVOID*)&ConsoleAliasRequest->Source); 79 80 CsrCaptureMessageBuffer(CaptureBuffer, 81 (PVOID)ExeName, 82 ConsoleAliasRequest->ExeLength, 83 (PVOID*)&ConsoleAliasRequest->ExeName); 84 85 if (Target) /* The target can be optional */ 86 { 87 CsrCaptureMessageBuffer(CaptureBuffer, 88 (PVOID)Target, 89 ConsoleAliasRequest->TargetLength, 90 (PVOID*)&ConsoleAliasRequest->Target); 91 } 92 else 93 { 94 ConsoleAliasRequest->Target = NULL; 95 } 96 97 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, 98 CaptureBuffer, 99 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepAddAlias), 100 sizeof(*ConsoleAliasRequest)); 101 102 CsrFreeCaptureBuffer(CaptureBuffer); 103 104 if (!NT_SUCCESS(ApiMessage.Status)) 105 { 106 BaseSetLastNTError(ApiMessage.Status); 107 return FALSE; 108 } 109 110 return TRUE; 111} 112 113 114/* 115 * @implemented 116 */ 117BOOL 118WINAPI 119DECLSPEC_HOTPATCH 120AddConsoleAliasW( 121 _In_ LPCWSTR Source, 122 _In_ LPCWSTR Target, 123 _In_ LPCWSTR ExeName) 124{ 125 USHORT SourceBufferLength = (USHORT)wcslen(Source) * sizeof(WCHAR); 126 USHORT TargetBufferLength = (USHORT)(Target ? wcslen(Target) * sizeof(WCHAR) : 0); 127 128 DPRINT("AddConsoleAliasW entered with Source '%S' Target '%S' ExeName '%S'\n", 129 Source, Target, ExeName); 130 131 return IntAddConsoleAlias(Source, 132 SourceBufferLength, 133 Target, 134 TargetBufferLength, 135 ExeName, 136 TRUE); 137} 138 139 140/* 141 * @implemented 142 */ 143BOOL 144WINAPI 145DECLSPEC_HOTPATCH 146AddConsoleAliasA( 147 _In_ LPCSTR Source, 148 _In_ LPCSTR Target, 149 _In_ LPCSTR ExeName) 150{ 151 USHORT SourceBufferLength = (USHORT)strlen(Source) * sizeof(CHAR); 152 USHORT TargetBufferLength = (USHORT)(Target ? strlen(Target) * sizeof(CHAR) : 0); 153 154 DPRINT("AddConsoleAliasA entered with Source '%s' Target '%s' ExeName '%s'\n", 155 Source, Target, ExeName); 156 157 return IntAddConsoleAlias(Source, 158 SourceBufferLength, 159 Target, 160 TargetBufferLength, 161 ExeName, 162 FALSE); 163} 164 165 166static DWORD 167IntGetConsoleAlias(LPCVOID Source, 168 USHORT SourceBufferLength, 169 LPVOID Target, 170 USHORT TargetBufferLength, 171 LPCVOID ExeName, 172 BOOLEAN bUnicode) 173{ 174 CONSOLE_API_MESSAGE ApiMessage; 175 PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &ApiMessage.Data.ConsoleAliasRequest; 176 PCSR_CAPTURE_BUFFER CaptureBuffer; 177 178 USHORT NumChars = (USHORT)(ExeName ? (bUnicode ? wcslen(ExeName) : strlen(ExeName)) : 0); 179 180 if (Source == NULL || Target == NULL) 181 { 182 SetLastError(ERROR_INVALID_PARAMETER); 183 return 0; 184 } 185 186 if (ExeName == NULL || NumChars == 0) 187 { 188 SetLastError(ERROR_INVALID_PARAMETER); 189 return 0; 190 } 191 192 ConsoleAliasRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; 193 194 /* Determine the needed sizes */ 195 ConsoleAliasRequest->SourceLength = SourceBufferLength; 196 ConsoleAliasRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); 197 ConsoleAliasRequest->Unicode = 198 ConsoleAliasRequest->Unicode2 = bUnicode; 199 200 ConsoleAliasRequest->TargetLength = TargetBufferLength; 201 202 /* Allocate a Capture Buffer */ 203 CaptureBuffer = CsrAllocateCaptureBuffer(3, ConsoleAliasRequest->SourceLength + 204 ConsoleAliasRequest->ExeLength + 205 ConsoleAliasRequest->TargetLength); 206 if (!CaptureBuffer) 207 { 208 DPRINT1("CsrAllocateCaptureBuffer failed!\n"); 209 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 210 return 0; 211 } 212 213 /* Capture the strings */ 214 CsrCaptureMessageBuffer(CaptureBuffer, 215 (PVOID)Source, 216 ConsoleAliasRequest->SourceLength, 217 (PVOID*)&ConsoleAliasRequest->Source); 218 219 CsrCaptureMessageBuffer(CaptureBuffer, 220 (PVOID)ExeName, 221 ConsoleAliasRequest->ExeLength, 222 (PVOID*)&ConsoleAliasRequest->ExeName); 223 224 /* Allocate space for the target buffer */ 225 CsrAllocateMessagePointer(CaptureBuffer, 226 ConsoleAliasRequest->TargetLength, 227 (PVOID*)&ConsoleAliasRequest->Target); 228 229 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, 230 CaptureBuffer, 231 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAlias), 232 sizeof(*ConsoleAliasRequest)); 233 if (!NT_SUCCESS(ApiMessage.Status)) 234 { 235 CsrFreeCaptureBuffer(CaptureBuffer); 236 BaseSetLastNTError(ApiMessage.Status); 237 238 if (ApiMessage.Status == STATUS_BUFFER_TOO_SMALL) 239 return ConsoleAliasRequest->TargetLength; 240 else 241 return 0; 242 } 243 244 /* Copy the returned target string into the user buffer */ 245 RtlCopyMemory(Target, 246 ConsoleAliasRequest->Target, 247 ConsoleAliasRequest->TargetLength); 248 249 /* Release the capture buffer and exit */ 250 CsrFreeCaptureBuffer(CaptureBuffer); 251 252 return ConsoleAliasRequest->TargetLength; 253} 254 255 256/* 257 * @implemented 258 */ 259DWORD 260WINAPI 261DECLSPEC_HOTPATCH 262GetConsoleAliasW( 263 _In_ LPCWSTR Source, 264 _Out_writes_(TargetBufferLength) LPWSTR TargetBuffer, 265 _In_ DWORD TargetBufferLength, 266 _In_ LPCWSTR ExeName) 267{ 268 DPRINT("GetConsoleAliasW entered with Source '%S' ExeName '%S'\n", 269 Source, ExeName); 270 271 return IntGetConsoleAlias(Source, 272 (USHORT)wcslen(Source) * sizeof(WCHAR), 273 TargetBuffer, 274 TargetBufferLength, 275 ExeName, 276 TRUE); 277} 278 279 280/* 281 * @implemented 282 */ 283DWORD 284WINAPI 285DECLSPEC_HOTPATCH 286GetConsoleAliasA( 287 _In_ LPCSTR Source, 288 _Out_writes_(TargetBufferLength) LPSTR TargetBuffer, 289 _In_ DWORD TargetBufferLength, 290 _In_ LPCSTR ExeName) 291{ 292 DPRINT("GetConsoleAliasA entered with Source '%s' ExeName '%s'\n", 293 Source, ExeName); 294 295 return IntGetConsoleAlias(Source, 296 (USHORT)strlen(Source) * sizeof(CHAR), 297 TargetBuffer, 298 TargetBufferLength, 299 ExeName, 300 FALSE); 301} 302 303 304static DWORD 305IntGetConsoleAliases(LPVOID AliasBuffer, 306 DWORD AliasBufferLength, 307 LPCVOID ExeName, 308 BOOLEAN bUnicode) 309{ 310 CONSOLE_API_MESSAGE ApiMessage; 311 PCONSOLE_GETALLALIASES GetAllAliasesRequest = &ApiMessage.Data.GetAllAliasesRequest; 312 PCSR_CAPTURE_BUFFER CaptureBuffer; 313 314 USHORT NumChars = (USHORT)(ExeName ? (bUnicode ? wcslen(ExeName) : strlen(ExeName)) : 0); 315 316 if (ExeName == NULL || NumChars == 0) 317 { 318 SetLastError(ERROR_INVALID_PARAMETER); 319 return 0; 320 } 321 322 GetAllAliasesRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; 323 324 /* Determine the needed sizes */ 325 GetAllAliasesRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); 326 GetAllAliasesRequest->Unicode = 327 GetAllAliasesRequest->Unicode2 = bUnicode; 328 329 GetAllAliasesRequest->AliasesBufferLength = AliasBufferLength; 330 331 /* Allocate a Capture Buffer */ 332 CaptureBuffer = CsrAllocateCaptureBuffer(2, GetAllAliasesRequest->ExeLength + 333 GetAllAliasesRequest->AliasesBufferLength); 334 if (!CaptureBuffer) 335 { 336 DPRINT1("CsrAllocateCaptureBuffer failed!\n"); 337 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 338 return 0; 339 } 340 341 /* Capture the exe name and allocate space for the aliases buffer */ 342 CsrCaptureMessageBuffer(CaptureBuffer, 343 (PVOID)ExeName, 344 GetAllAliasesRequest->ExeLength, 345 (PVOID*)&GetAllAliasesRequest->ExeName); 346 347 CsrAllocateMessagePointer(CaptureBuffer, 348 GetAllAliasesRequest->AliasesBufferLength, 349 (PVOID*)&GetAllAliasesRequest->AliasesBuffer); 350 351 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, 352 CaptureBuffer, 353 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliases), 354 sizeof(*GetAllAliasesRequest)); 355 if (!NT_SUCCESS(ApiMessage.Status)) 356 { 357 CsrFreeCaptureBuffer(CaptureBuffer); 358 BaseSetLastNTError(ApiMessage.Status); 359 return 0; 360 } 361 362 /* Copy the returned aliases string into the user buffer */ 363 RtlCopyMemory(AliasBuffer, 364 GetAllAliasesRequest->AliasesBuffer, 365 GetAllAliasesRequest->AliasesBufferLength); 366 367 /* Release the capture buffer and exit */ 368 CsrFreeCaptureBuffer(CaptureBuffer); 369 370 return GetAllAliasesRequest->AliasesBufferLength; 371} 372 373 374/* 375 * @implemented 376 */ 377DWORD 378WINAPI 379DECLSPEC_HOTPATCH 380GetConsoleAliasesW( 381 _Out_writes_(AliasBufferLength) LPWSTR AliasBuffer, 382 _In_ DWORD AliasBufferLength, 383 _In_ LPCWSTR ExeName) 384{ 385 DPRINT("GetConsoleAliasesW entered with ExeName '%S'\n", 386 ExeName); 387 388 return IntGetConsoleAliases(AliasBuffer, 389 AliasBufferLength, 390 ExeName, 391 TRUE); 392} 393 394 395/* 396 * @implemented 397 */ 398DWORD 399WINAPI 400DECLSPEC_HOTPATCH 401GetConsoleAliasesA( 402 _Out_writes_(AliasBufferLength) LPSTR AliasBuffer, 403 _In_ DWORD AliasBufferLength, 404 _In_ LPCSTR ExeName) 405{ 406 DPRINT("GetConsoleAliasesA entered with ExeName '%s'\n", 407 ExeName); 408 409 return IntGetConsoleAliases(AliasBuffer, 410 AliasBufferLength, 411 ExeName, 412 FALSE); 413} 414 415 416static DWORD 417IntGetConsoleAliasesLength(LPCVOID ExeName, BOOLEAN bUnicode) 418{ 419 CONSOLE_API_MESSAGE ApiMessage; 420 PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest = &ApiMessage.Data.GetAllAliasesLengthRequest; 421 PCSR_CAPTURE_BUFFER CaptureBuffer; 422 423 USHORT NumChars = (USHORT)(ExeName ? (bUnicode ? wcslen(ExeName) : strlen(ExeName)) : 0); 424 425 if (ExeName == NULL || NumChars == 0) 426 { 427 SetLastError(ERROR_INVALID_PARAMETER); 428 return 0; 429 } 430 431 GetAllAliasesLengthRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; 432 GetAllAliasesLengthRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); 433 GetAllAliasesLengthRequest->Unicode = 434 GetAllAliasesLengthRequest->Unicode2 = bUnicode; 435 436 CaptureBuffer = CsrAllocateCaptureBuffer(1, GetAllAliasesLengthRequest->ExeLength); 437 if (!CaptureBuffer) 438 { 439 DPRINT1("CsrAllocateCaptureBuffer failed!\n"); 440 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 441 return 0; 442 } 443 444 CsrCaptureMessageBuffer(CaptureBuffer, 445 (PVOID)ExeName, 446 GetAllAliasesLengthRequest->ExeLength, 447 (PVOID)&GetAllAliasesLengthRequest->ExeName); 448 449 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, 450 CaptureBuffer, 451 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasesLength), 452 sizeof(*GetAllAliasesLengthRequest)); 453 454 CsrFreeCaptureBuffer(CaptureBuffer); 455 456 if (!NT_SUCCESS(ApiMessage.Status)) 457 { 458 BaseSetLastNTError(ApiMessage.Status); 459 return 0; 460 } 461 462 return GetAllAliasesLengthRequest->Length; 463} 464 465 466/* 467 * @implemented 468 */ 469DWORD 470WINAPI 471DECLSPEC_HOTPATCH 472GetConsoleAliasesLengthW( 473 _In_ LPCWSTR ExeName) 474{ 475 return IntGetConsoleAliasesLength(ExeName, TRUE); 476} 477 478 479/* 480 * @implemented 481 */ 482DWORD 483WINAPI 484DECLSPEC_HOTPATCH 485GetConsoleAliasesLengthA( 486 _In_ LPCSTR ExeName) 487{ 488 return IntGetConsoleAliasesLength(ExeName, FALSE); 489} 490 491 492static DWORD 493IntGetConsoleAliasExes(PVOID lpExeNameBuffer, 494 DWORD ExeNameBufferLength, 495 BOOLEAN bUnicode) 496{ 497 CONSOLE_API_MESSAGE ApiMessage; 498 PCONSOLE_GETALIASESEXES GetAliasesExesRequest = &ApiMessage.Data.GetAliasesExesRequest; 499 PCSR_CAPTURE_BUFFER CaptureBuffer; 500 501 GetAliasesExesRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; 502 GetAliasesExesRequest->Length = ExeNameBufferLength; 503 GetAliasesExesRequest->Unicode = bUnicode; 504 505 CaptureBuffer = CsrAllocateCaptureBuffer(1, ExeNameBufferLength); 506 if (!CaptureBuffer) 507 { 508 DPRINT1("CsrAllocateCaptureBuffer failed!\n"); 509 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 510 return 0; 511 } 512 513 CsrAllocateMessagePointer(CaptureBuffer, 514 ExeNameBufferLength, 515 (PVOID*)&GetAliasesExesRequest->ExeNames); 516 517 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, 518 CaptureBuffer, 519 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasExes), 520 sizeof(*GetAliasesExesRequest)); 521 if (!NT_SUCCESS(ApiMessage.Status)) 522 { 523 CsrFreeCaptureBuffer(CaptureBuffer); 524 BaseSetLastNTError(ApiMessage.Status); 525 return 0; 526 } 527 528 RtlCopyMemory(lpExeNameBuffer, 529 GetAliasesExesRequest->ExeNames, 530 GetAliasesExesRequest->Length); 531 532 CsrFreeCaptureBuffer(CaptureBuffer); 533 534 return GetAliasesExesRequest->Length; 535} 536 537/* 538 * @implemented 539 */ 540DWORD 541WINAPI 542DECLSPEC_HOTPATCH 543GetConsoleAliasExesW(LPWSTR lpExeNameBuffer, 544 DWORD ExeNameBufferLength) 545{ 546 DPRINT("GetConsoleAliasExesW called\n"); 547 return IntGetConsoleAliasExes(lpExeNameBuffer, ExeNameBufferLength, TRUE); 548} 549 550 551/* 552 * @implemented 553 */ 554DWORD 555WINAPI 556DECLSPEC_HOTPATCH 557GetConsoleAliasExesA(LPSTR lpExeNameBuffer, 558 DWORD ExeNameBufferLength) 559{ 560 DPRINT("GetConsoleAliasExesA called\n"); 561 return IntGetConsoleAliasExes(lpExeNameBuffer, ExeNameBufferLength, FALSE); 562} 563 564 565static DWORD 566IntGetConsoleAliasExesLength(BOOLEAN bUnicode) 567{ 568 CONSOLE_API_MESSAGE ApiMessage; 569 PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest = &ApiMessage.Data.GetAliasesExesLengthRequest; 570 571 GetAliasesExesLengthRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; 572 GetAliasesExesLengthRequest->Unicode = bUnicode; 573 574 CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, 575 NULL, 576 CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasExesLength), 577 sizeof(*GetAliasesExesLengthRequest)); 578 if (!NT_SUCCESS(ApiMessage.Status)) 579 { 580 BaseSetLastNTError(ApiMessage.Status); 581 return 0; 582 } 583 584 return GetAliasesExesLengthRequest->Length; 585} 586 587 588/* 589 * @implemented 590 */ 591DWORD 592WINAPI 593DECLSPEC_HOTPATCH 594GetConsoleAliasExesLengthW(VOID) 595{ 596 DPRINT("GetConsoleAliasExesLengthW called\n"); 597 return IntGetConsoleAliasExesLength(TRUE); 598} 599 600 601/* 602 * @implemented 603 */ 604DWORD 605WINAPI 606DECLSPEC_HOTPATCH 607GetConsoleAliasExesLengthA(VOID) 608{ 609 DPRINT("GetConsoleAliasExesLengthA called\n"); 610 return IntGetConsoleAliasExesLength(FALSE); 611} 612 613/* EOF */