Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: dll/win32/kernel32/client/console/alias.c * PURPOSE: Win32 Console Client Alias support functions * PROGRAMMERS: David Welch (welch@cwcom.net) (welch@mcmail.com) * Christoph von Wittich (christoph_vw@reactos.org) * Johannes Anderwald (johannes.anderwald@reactos.org) */
/* INCLUDES *******************************************************************/
#include <k32.h>
#define NDEBUG#include <debug.h>
/* FUNCTIONS ******************************************************************/
static BOOLIntAddConsoleAlias(LPCVOID Source, USHORT SourceBufferLength, LPCVOID Target, USHORT TargetBufferLength, LPCVOID ExeName, BOOLEAN bUnicode){ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &ApiMessage.Data.ConsoleAliasRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; ULONG CapturedStrings;
USHORT NumChars = (USHORT)(ExeName ? (bUnicode ? wcslen(ExeName) : strlen(ExeName)) : 0);
if (ExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; }
ConsoleAliasRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
/* Determine the needed sizes */ ConsoleAliasRequest->SourceLength = SourceBufferLength; ConsoleAliasRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); ConsoleAliasRequest->Unicode = ConsoleAliasRequest->Unicode2 = bUnicode;
CapturedStrings = 2;
if (Target) /* The target can be optional */ { ConsoleAliasRequest->TargetLength = TargetBufferLength; CapturedStrings++; } else { ConsoleAliasRequest->TargetLength = 0; }
/* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(CapturedStrings, ConsoleAliasRequest->SourceLength + ConsoleAliasRequest->ExeLength + ConsoleAliasRequest->TargetLength); if (CaptureBuffer == NULL) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; }
/* Capture the strings */ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)Source, ConsoleAliasRequest->SourceLength, (PVOID*)&ConsoleAliasRequest->Source);
CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)ExeName, ConsoleAliasRequest->ExeLength, (PVOID*)&ConsoleAliasRequest->ExeName);
if (Target) /* The target can be optional */ { CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)Target, ConsoleAliasRequest->TargetLength, (PVOID*)&ConsoleAliasRequest->Target); } else { ConsoleAliasRequest->Target = NULL; }
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepAddAlias), sizeof(*ConsoleAliasRequest));
CsrFreeCaptureBuffer(CaptureBuffer);
if (!NT_SUCCESS(ApiMessage.Status)) { BaseSetLastNTError(ApiMessage.Status); return FALSE; }
return TRUE;}
/* * @implemented */BOOLWINAPIDECLSPEC_HOTPATCHAddConsoleAliasW( _In_ LPCWSTR Source, _In_ LPCWSTR Target, _In_ LPCWSTR ExeName){ USHORT SourceBufferLength = (USHORT)wcslen(Source) * sizeof(WCHAR); USHORT TargetBufferLength = (USHORT)(Target ? wcslen(Target) * sizeof(WCHAR) : 0);
DPRINT("AddConsoleAliasW entered with Source '%S' Target '%S' ExeName '%S'\n", Source, Target, ExeName);
return IntAddConsoleAlias(Source, SourceBufferLength, Target, TargetBufferLength, ExeName, TRUE);}
/* * @implemented */BOOLWINAPIDECLSPEC_HOTPATCHAddConsoleAliasA( _In_ LPCSTR Source, _In_ LPCSTR Target, _In_ LPCSTR ExeName){ USHORT SourceBufferLength = (USHORT)strlen(Source) * sizeof(CHAR); USHORT TargetBufferLength = (USHORT)(Target ? strlen(Target) * sizeof(CHAR) : 0);
DPRINT("AddConsoleAliasA entered with Source '%s' Target '%s' ExeName '%s'\n", Source, Target, ExeName);
return IntAddConsoleAlias(Source, SourceBufferLength, Target, TargetBufferLength, ExeName, FALSE);}
static DWORDIntGetConsoleAlias(LPCVOID Source, USHORT SourceBufferLength, LPVOID Target, USHORT TargetBufferLength, LPCVOID ExeName, BOOLEAN bUnicode){ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &ApiMessage.Data.ConsoleAliasRequest; PCSR_CAPTURE_BUFFER CaptureBuffer;
USHORT NumChars = (USHORT)(ExeName ? (bUnicode ? wcslen(ExeName) : strlen(ExeName)) : 0);
if (Source == NULL || Target == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return 0; }
if (ExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return 0; }
ConsoleAliasRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
/* Determine the needed sizes */ ConsoleAliasRequest->SourceLength = SourceBufferLength; ConsoleAliasRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); ConsoleAliasRequest->Unicode = ConsoleAliasRequest->Unicode2 = bUnicode;
ConsoleAliasRequest->TargetLength = TargetBufferLength;
/* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(3, ConsoleAliasRequest->SourceLength + ConsoleAliasRequest->ExeLength + ConsoleAliasRequest->TargetLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; }
/* Capture the strings */ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)Source, ConsoleAliasRequest->SourceLength, (PVOID*)&ConsoleAliasRequest->Source);
CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)ExeName, ConsoleAliasRequest->ExeLength, (PVOID*)&ConsoleAliasRequest->ExeName);
/* Allocate space for the target buffer */ CsrAllocateMessagePointer(CaptureBuffer, ConsoleAliasRequest->TargetLength, (PVOID*)&ConsoleAliasRequest->Target);
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAlias), sizeof(*ConsoleAliasRequest)); if (!NT_SUCCESS(ApiMessage.Status)) { CsrFreeCaptureBuffer(CaptureBuffer); BaseSetLastNTError(ApiMessage.Status);
if (ApiMessage.Status == STATUS_BUFFER_TOO_SMALL) return ConsoleAliasRequest->TargetLength; else return 0; }
/* Copy the returned target string into the user buffer */ RtlCopyMemory(Target, ConsoleAliasRequest->Target, ConsoleAliasRequest->TargetLength);
/* Release the capture buffer and exit */ CsrFreeCaptureBuffer(CaptureBuffer);
return ConsoleAliasRequest->TargetLength;}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasW( _In_ LPCWSTR Source, _Out_writes_(TargetBufferLength) LPWSTR TargetBuffer, _In_ DWORD TargetBufferLength, _In_ LPCWSTR ExeName){ DPRINT("GetConsoleAliasW entered with Source '%S' ExeName '%S'\n", Source, ExeName);
return IntGetConsoleAlias(Source, (USHORT)wcslen(Source) * sizeof(WCHAR), TargetBuffer, TargetBufferLength, ExeName, TRUE);}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasA( _In_ LPCSTR Source, _Out_writes_(TargetBufferLength) LPSTR TargetBuffer, _In_ DWORD TargetBufferLength, _In_ LPCSTR ExeName){ DPRINT("GetConsoleAliasA entered with Source '%s' ExeName '%s'\n", Source, ExeName);
return IntGetConsoleAlias(Source, (USHORT)strlen(Source) * sizeof(CHAR), TargetBuffer, TargetBufferLength, ExeName, FALSE);}
static DWORDIntGetConsoleAliases(LPVOID AliasBuffer, DWORD AliasBufferLength, LPCVOID ExeName, BOOLEAN bUnicode){ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALLALIASES GetAllAliasesRequest = &ApiMessage.Data.GetAllAliasesRequest; PCSR_CAPTURE_BUFFER CaptureBuffer;
USHORT NumChars = (USHORT)(ExeName ? (bUnicode ? wcslen(ExeName) : strlen(ExeName)) : 0);
if (ExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return 0; }
GetAllAliasesRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
/* Determine the needed sizes */ GetAllAliasesRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); GetAllAliasesRequest->Unicode = GetAllAliasesRequest->Unicode2 = bUnicode;
GetAllAliasesRequest->AliasesBufferLength = AliasBufferLength;
/* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(2, GetAllAliasesRequest->ExeLength + GetAllAliasesRequest->AliasesBufferLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; }
/* Capture the exe name and allocate space for the aliases buffer */ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)ExeName, GetAllAliasesRequest->ExeLength, (PVOID*)&GetAllAliasesRequest->ExeName);
CsrAllocateMessagePointer(CaptureBuffer, GetAllAliasesRequest->AliasesBufferLength, (PVOID*)&GetAllAliasesRequest->AliasesBuffer);
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliases), sizeof(*GetAllAliasesRequest)); if (!NT_SUCCESS(ApiMessage.Status)) { CsrFreeCaptureBuffer(CaptureBuffer); BaseSetLastNTError(ApiMessage.Status); return 0; }
/* Copy the returned aliases string into the user buffer */ RtlCopyMemory(AliasBuffer, GetAllAliasesRequest->AliasesBuffer, GetAllAliasesRequest->AliasesBufferLength);
/* Release the capture buffer and exit */ CsrFreeCaptureBuffer(CaptureBuffer);
return GetAllAliasesRequest->AliasesBufferLength;}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasesW( _Out_writes_(AliasBufferLength) LPWSTR AliasBuffer, _In_ DWORD AliasBufferLength, _In_ LPCWSTR ExeName){ DPRINT("GetConsoleAliasesW entered with ExeName '%S'\n", ExeName);
return IntGetConsoleAliases(AliasBuffer, AliasBufferLength, ExeName, TRUE);}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasesA( _Out_writes_(AliasBufferLength) LPSTR AliasBuffer, _In_ DWORD AliasBufferLength, _In_ LPCSTR ExeName){ DPRINT("GetConsoleAliasesA entered with ExeName '%s'\n", ExeName);
return IntGetConsoleAliases(AliasBuffer, AliasBufferLength, ExeName, FALSE);}
static DWORDIntGetConsoleAliasesLength(LPCVOID ExeName, BOOLEAN bUnicode){ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest = &ApiMessage.Data.GetAllAliasesLengthRequest; PCSR_CAPTURE_BUFFER CaptureBuffer;
USHORT NumChars = (USHORT)(ExeName ? (bUnicode ? wcslen(ExeName) : strlen(ExeName)) : 0);
if (ExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return 0; }
GetAllAliasesLengthRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; GetAllAliasesLengthRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); GetAllAliasesLengthRequest->Unicode = GetAllAliasesLengthRequest->Unicode2 = bUnicode;
CaptureBuffer = CsrAllocateCaptureBuffer(1, GetAllAliasesLengthRequest->ExeLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; }
CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)ExeName, GetAllAliasesLengthRequest->ExeLength, (PVOID)&GetAllAliasesLengthRequest->ExeName);
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasesLength), sizeof(*GetAllAliasesLengthRequest));
CsrFreeCaptureBuffer(CaptureBuffer);
if (!NT_SUCCESS(ApiMessage.Status)) { BaseSetLastNTError(ApiMessage.Status); return 0; }
return GetAllAliasesLengthRequest->Length;}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasesLengthW( _In_ LPCWSTR ExeName){ return IntGetConsoleAliasesLength(ExeName, TRUE);}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasesLengthA( _In_ LPCSTR ExeName){ return IntGetConsoleAliasesLength(ExeName, FALSE);}
static DWORDIntGetConsoleAliasExes(PVOID lpExeNameBuffer, DWORD ExeNameBufferLength, BOOLEAN bUnicode){ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALIASESEXES GetAliasesExesRequest = &ApiMessage.Data.GetAliasesExesRequest; PCSR_CAPTURE_BUFFER CaptureBuffer;
GetAliasesExesRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; GetAliasesExesRequest->Length = ExeNameBufferLength; GetAliasesExesRequest->Unicode = bUnicode;
CaptureBuffer = CsrAllocateCaptureBuffer(1, ExeNameBufferLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; }
CsrAllocateMessagePointer(CaptureBuffer, ExeNameBufferLength, (PVOID*)&GetAliasesExesRequest->ExeNames);
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasExes), sizeof(*GetAliasesExesRequest)); if (!NT_SUCCESS(ApiMessage.Status)) { CsrFreeCaptureBuffer(CaptureBuffer); BaseSetLastNTError(ApiMessage.Status); return 0; }
RtlCopyMemory(lpExeNameBuffer, GetAliasesExesRequest->ExeNames, GetAliasesExesRequest->Length);
CsrFreeCaptureBuffer(CaptureBuffer);
return GetAliasesExesRequest->Length;}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasExesW(LPWSTR lpExeNameBuffer, DWORD ExeNameBufferLength){ DPRINT("GetConsoleAliasExesW called\n"); return IntGetConsoleAliasExes(lpExeNameBuffer, ExeNameBufferLength, TRUE);}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasExesA(LPSTR lpExeNameBuffer, DWORD ExeNameBufferLength){ DPRINT("GetConsoleAliasExesA called\n"); return IntGetConsoleAliasExes(lpExeNameBuffer, ExeNameBufferLength, FALSE);}
static DWORDIntGetConsoleAliasExesLength(BOOLEAN bUnicode){ CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest = &ApiMessage.Data.GetAliasesExesLengthRequest;
GetAliasesExesLengthRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; GetAliasesExesLengthRequest->Unicode = bUnicode;
CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, NULL, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasExesLength), sizeof(*GetAliasesExesLengthRequest)); if (!NT_SUCCESS(ApiMessage.Status)) { BaseSetLastNTError(ApiMessage.Status); return 0; }
return GetAliasesExesLengthRequest->Length;}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasExesLengthW(VOID){ DPRINT("GetConsoleAliasExesLengthW called\n"); return IntGetConsoleAliasExesLength(TRUE);}
/* * @implemented */DWORDWINAPIDECLSPEC_HOTPATCHGetConsoleAliasExesLengthA(VOID){ DPRINT("GetConsoleAliasExesLengthA called\n"); return IntGetConsoleAliasExesLength(FALSE);}
/* EOF */