Author: janderwald
Date: Mon Feb 4 21:58:17 2008
New Revision: 32118
URL:
http://svn.reactos.org/svn/reactos?rev=32118&view=rev
Log:
- call csrss for Console alias related functions
Modified:
trunk/reactos/dll/win32/kernel32/misc/console.c
Modified: trunk/reactos/dll/win32/kernel32/misc/console.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/co…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/console.c (original)
+++ trunk/reactos/dll/win32/kernel32/misc/console.c Mon Feb 4 21:58:17 2008
@@ -27,14 +27,10 @@
DWORD dwUsed;
} ALIAS, *LPALIAS;
-static LPALIAS lpFirst = NULL;
-static LPALIAS lpLast = NULL;
-
extern BOOL WINAPI DefaultConsoleCtrlHandler(DWORD Event);
extern __declspec(noreturn) VOID CALLBACK ConsoleControlDispatcher(DWORD CodeAndFlag);
extern RTL_CRITICAL_SECTION ConsoleLock;
extern BOOL WINAPI IsDebuggerPresent(VOID);
-static VOID partstrlwr (LPWSTR str);
/* GLOBALS *******************************************************************/
@@ -43,19 +39,6 @@
static PHANDLER_ROUTINE* CtrlHandlers = NULL;
static ULONG NrCtrlHandlers = 0;
static WCHAR InputExeName[MAX_PATH + 1] = L"";
-
-/* module internal functions */
-/* strlwr only for first word in string */
-static VOID
-partstrlwr (LPWSTR str)
-{
- LPWSTR c = str;
- while (*c && !iswspace (*c) && *c != L'=')
- {
- *c = towlower (*c);
- c++;
- }
-}
/* Default Console Control Handler *******************************************/
@@ -206,125 +189,28 @@
LPCWSTR lpTarget,
LPCWSTR lpExeName /* FIXME: currently ignored */)
{
- LPALIAS ptr = lpFirst;
- LPALIAS prev = NULL;
- LPALIAS entry = NULL;
- LPWSTR s;
-
- if (!lpTarget)
- {
- /* delete */
- while (ptr)
- {
- if (!wcsicmp (ptr->lpName, lpSource))
- {
- if (prev)
- prev->next = ptr->next;
- else
- lpFirst = ptr->next;
- RtlFreeHeap (GetProcessHeap(), 0, ptr->lpName);
- RtlFreeHeap (GetProcessHeap(), 0, ptr->lpSubst);
- RtlFreeHeap (GetProcessHeap(), 0, ptr);
- return TRUE;
- }
- prev = ptr;
- ptr = ptr->next;
- }
- }
- else
- {
- /* add */
- while (ptr)
- {
- if (!wcsicmp (ptr->lpName, lpSource))
- {
- s = (LPWSTR) RtlAllocateHeap (GetProcessHeap(), 0, ((wcslen (lpTarget) + 1) *
sizeof(WCHAR)));
- if (!s)
- {
- return FALSE;
- }
-
- RtlFreeHeap (GetProcessHeap(), 0, ptr->lpSubst);
- ptr->lpSubst = s;
- wcscpy (ptr->lpSubst, lpTarget);
- return TRUE;
- }
- ptr = ptr->next;
- }
-
- ptr = (LPALIAS) RtlAllocateHeap (GetProcessHeap(), 0, sizeof(ALIAS));
- if (!ptr)
- return FALSE;
-
- ptr->next = 0;
-
- ptr->lpName = (LPWSTR) RtlAllocateHeap (GetProcessHeap(), 0, ((wcslen (lpSource) +
1) * sizeof(WCHAR)));
- if (!ptr->lpName)
- {
- RtlFreeHeap (GetProcessHeap(), 0, ptr);
- return FALSE;
- }
- wcscpy (ptr->lpName, lpSource);
-
- ptr->lpSubst = (LPWSTR) RtlAllocateHeap (GetProcessHeap(), 0, ((wcslen (lpTarget) +
1) * sizeof(WCHAR)));
- if (!ptr->lpSubst)
- {
- RtlFreeHeap (GetProcessHeap(), 0, ptr->lpName);
- RtlFreeHeap (GetProcessHeap(), 0, ptr);
- return FALSE;
- }
- wcscpy (ptr->lpSubst, lpTarget);
-
- /* it's necessary for recursive substitution */
- partstrlwr (ptr->lpSubst);
-
- ptr->dwUsed = 0;
-
- /* Alias table must be sorted!
- * Here a little example:
- * command line = "ls -c"
- * If the entries are
- * ls=dir
- * ls -c=ls /w
- * command line will be expanded to "dir -c" which is not correct.
- * If the entries are sortet as
- * ls -c=ls /w
- * ls=dir
- * it will be expanded to "dir /w" which is a valid DOS command.
- */
- entry = lpFirst;
- prev = 0;
- while (entry)
- {
- if (wcsicmp (ptr->lpName, entry->lpName) > 0)
-
- {
- if (prev)
- {
- prev->next = ptr;
- ptr->next = entry;
- }
- else
- {
- ptr->next = entry;
- lpFirst = ptr;
- }
- return TRUE;
- }
- prev = entry;
- entry = entry->next;
- }
-
- /* The new entry is the smallest (or the first) and must be
- * added to the end of the list.
- */
- if (!lpFirst)
- lpFirst = ptr;
- else
- lpLast->next = ptr;
- lpLast = ptr;
- }
- return TRUE;
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest;
+ NTSTATUS Status;
+
+ CsrRequest = MAKE_CSR_API(ADD_CONSOLE_ALIAS, CSR_NATIVE);
+
+ Request.Data.AddConsoleAlias.lpExeName = lpExeName;
+ Request.Data.AddConsoleAlias.lpTarget = lpTarget;
+ Request.Data.AddConsoleAlias.lpSource = lpSource;
+
+ Status = CsrClientCallServer(& Request,
+ NULL,
+ CsrRequest,
+ sizeof(CSR_API_MESSAGE));
+
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return TRUE;
}
@@ -418,38 +304,36 @@
GetConsoleAliasW (LPWSTR lpSource,
LPWSTR lpTargetBuffer,
DWORD TargetBufferLength,
- LPWSTR lpExeName) /* FIXME: currently ignored */
-{
- DWORD dwRet = 0;
-
- if (!lpTargetBuffer)
- return 0;
-
- LPALIAS ptr = lpFirst;
- while (ptr)
- {
- if (wcscmp(ptr->lpName, lpSource) == 0)
- {
- if (TargetBufferLength >= wcslen(ptr->lpSubst) +1)
- {
- wcscpy(lpTargetBuffer, ptr->lpSubst);
- dwRet = wcslen(ptr->lpSubst);
- break;
- }
- else
- {
- return 0;
- }
- }
- ptr = ptr->next;
- }
-
- return dwRet;
-}
-
-
-/*
- * @unimplemented
+ LPWSTR lpExeName)
+{
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest;
+ NTSTATUS Status;
+
+ CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIAS, CSR_NATIVE);
+
+ Request.Data.GetConsoleAlias.lpExeName = lpExeName;
+ Request.Data.GetConsoleAlias.lpSource = lpSource;
+ Request.Data.GetConsoleAlias.TargetBuffer = lpTargetBuffer;
+ Request.Data.GetConsoleAlias.TargetBufferLength = TargetBufferLength;
+
+ Status = CsrClientCallServer(& Request,
+ NULL,
+ CsrRequest,
+ sizeof(CSR_API_MESSAGE));
+
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return Request.Data.GetConsoleAlias.BytesWritten / sizeof(WCHAR);
+}
+
+
+/*
+ * @implemented
*/
DWORD STDCALL
GetConsoleAliasA (LPSTR lpSource,
@@ -457,59 +341,130 @@
DWORD TargetBufferLength,
LPSTR lpExeName)
{
- DPRINT1("GetConsoleAliasA(0x%p, 0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n",
lpSource, lpTargetBuffer, TargetBufferLength, lpExeName);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
-
-/*
- * @unimplemented
+ LPWSTR lpwSource;
+ LPWSTR lpwExeName;
+ LPWSTR lpwTargetBuffer;
+ UINT dwSourceSize;
+ UINT dwExeNameSize;
+ UINT dwResult;
+
+ dwSourceSize = (strlen(lpSource)+1) * sizeof(WCHAR);
+ lpwSource = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSourceSize);
+ MultiByteToWideChar(CP_ACP, 0, lpSource, -1, lpwSource, dwSourceSize);
+
+ dwExeNameSize = (strlen(lpExeName)+1) * sizeof(WCHAR);
+ lpwExeName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwExeNameSize);
+ MultiByteToWideChar(CP_ACP, 0, lpExeName, -1, lpwExeName, dwExeNameSize);
+
+ lpwTargetBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, TargetBufferLength *
sizeof(WCHAR));
+
+ dwResult = GetConsoleAliasW(lpwSource, lpwTargetBuffer, TargetBufferLength,
lpwExeName);
+
+ HeapFree(GetProcessHeap(), 0, lpwSource);
+ HeapFree(GetProcessHeap(), 0, lpwExeName);
+
+ if (dwResult)
+ dwResult = WideCharToMultiByte(CP_ACP, 0, lpwTargetBuffer, dwResult, lpTargetBuffer,
TargetBufferLength, NULL, NULL);
+
+ HeapFree(GetProcessHeap(), 0, lpwTargetBuffer);
+
+ return dwResult;
+}
+
+
+/*
+ * @implemented
*/
DWORD STDCALL
GetConsoleAliasExesW (LPWSTR lpExeNameBuffer,
DWORD ExeNameBufferLength)
{
- DPRINT1("GetConsoleAliasExesW(0x%p, 0x%x) UNIMPLEMENTED!\n", lpExeNameBuffer,
ExeNameBufferLength);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
-
-/*
- * @unimplemented
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest;
+ NTSTATUS Status;
+
+ CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES, CSR_NATIVE);
+ Request.Data.GetConsoleAliasesExes.ExeNames = lpExeNameBuffer;
+ Request.Data.GetConsoleAliasesExes.Length = ExeNameBufferLength;
+
+ Status = CsrClientCallServer(& Request,
+ NULL,
+ CsrRequest,
+ sizeof(CSR_API_MESSAGE));
+
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return Request.Data.GetConsoleAliasesExes.BytesWritten / sizeof(WCHAR);
+}
+
+
+/*
+ * @implemented
*/
DWORD STDCALL
GetConsoleAliasExesA (LPSTR lpExeNameBuffer,
DWORD ExeNameBufferLength)
{
- DPRINT1("GetConsoleAliasExesA(0x%p, 0x%x) UNIMPLEMENTED!\n", lpExeNameBuffer,
ExeNameBufferLength);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
-
-/*
- * @unimplemented
+ LPWSTR lpwExeNameBuffer;
+ DWORD dwResult;
+
+ lpwExeNameBuffer = HeapAlloc(GetProcessHeap(), 0, ExeNameBufferLength *
sizeof(WCHAR));
+
+ dwResult = GetConsoleAliasExesW(lpwExeNameBuffer, ExeNameBufferLength);
+
+ if (dwResult)
+ dwResult = WideCharToMultiByte(CP_ACP, 0, lpwExeNameBuffer, dwResult,
lpExeNameBuffer, ExeNameBufferLength, NULL, NULL);
+
+ HeapFree(GetProcessHeap(), 0, lpwExeNameBuffer);
+ return dwResult;
+}
+
+/*
+ * @implemented
+ */
+DWORD STDCALL
+GetConsoleAliasExesLengthW (VOID)
+{
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest;
+ NTSTATUS Status;
+
+ CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CSR_NATIVE);
+ Request.Data.GetConsoleAliasesExesLength.Length = 0;
+
+
+ Status = CsrClientCallServer(& Request,
+ NULL,
+ CsrRequest,
+ sizeof(CSR_API_MESSAGE));
+
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return Request.Data.GetConsoleAliasesExesLength.Length;
+}
+
+/*
+ * @implemented
*/
DWORD STDCALL
GetConsoleAliasExesLengthA (VOID)
{
- DPRINT1("GetConsoleAliasExesLengthA() UNIMPLEMENTED!\n");
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
-
-/*
- * @unimplemented
- */
-DWORD STDCALL
-GetConsoleAliasExesLengthW (VOID)
-{
- DPRINT1("GetConsoleAliasExesLengthW() UNIMPLEMENTED!\n");
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ DWORD dwLength;
+
+ dwLength = GetConsoleAliasExesLengthW();
+
+ if (dwLength)
+ dwLength /= sizeof(WCHAR);
+
+ return dwLength;
}
@@ -519,47 +474,64 @@
DWORD STDCALL
GetConsoleAliasesW (LPWSTR AliasBuffer,
DWORD AliasBufferLength,
- LPWSTR ExeName) /* FIXME: currently ignored */
-{
- DWORD len;
- WCHAR Buffer[MAX_PATH];
- LPWSTR AliasPtr;
-
- if (!AliasBuffer)
- return 0;
-
- AliasPtr = AliasBuffer;
- len = GetConsoleAliasesLengthW (ExeName);
- if (len > AliasBufferLength)
- return 0;
-
- LPALIAS ptr = lpFirst;
- while (ptr)
- {
- swprintf(Buffer, L"%s=%s" , ptr->lpName, ptr->lpSubst);
- wcscpy(AliasBuffer, Buffer);
- AliasBuffer += wcslen(Buffer) + 1;
- ptr = ptr->next;
- }
-
- return (INT) (AliasBuffer - AliasPtr);
-}
-
-
-/*
- * @unimplemented
+ LPWSTR ExeName)
+{
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest;
+ NTSTATUS Status;
+ DWORD dwLength;
+
+ dwLength = GetConsoleAliasesLengthW(ExeName);
+ if (!dwLength || dwLength > AliasBufferLength)
+ return FALSE;
+
+ CsrRequest = MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES, CSR_NATIVE);
+ Request.Data.GetAllConsoleAlias.AliasBuffer = AliasBuffer;
+ Request.Data.GetAllConsoleAlias.AliasBufferLength = AliasBufferLength;
+ Request.Data.GetAllConsoleAlias.lpExeName = ExeName;
+
+ Status = CsrClientCallServer(& Request,
+ NULL,
+ CsrRequest,
+ sizeof(CSR_API_MESSAGE));
+
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return Request.Data.GetAllConsoleAlias.BytesWritten / sizeof(WCHAR);
+}
+
+
+/*
+ * @implemented
*/
DWORD STDCALL
GetConsoleAliasesA (LPSTR AliasBuffer,
DWORD AliasBufferLength,
LPSTR ExeName)
- /*
- * Undocumented
- */
-{
- DPRINT1("GetConsoleAliasesA(0x%p, 0x%x, 0x%p) UNIMPLEMENTED!\n", AliasBuffer,
AliasBufferLength, ExeName);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+{
+ DWORD dwRetVal = 0;
+ LPWSTR lpwExeName = NULL;
+ LPWSTR lpwAliasBuffer;
+
+ if (ExeName)
+ BasepAnsiStringToHeapUnicodeString(ExeName, (LPWSTR*) &lpwExeName);
+
+ lpwAliasBuffer = HeapAlloc(GetProcessHeap(), 0, AliasBufferLength * sizeof(WCHAR));
+
+ dwRetVal = GetConsoleAliasesW(lpwAliasBuffer, AliasBufferLength, lpwExeName);
+
+ if (lpwExeName)
+ RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*) lpwExeName);
+
+ if (dwRetVal)
+ dwRetVal = WideCharToMultiByte(CP_ACP, 0, lpwAliasBuffer, dwRetVal, AliasBuffer,
AliasBufferLength, NULL, NULL);
+
+ HeapFree(GetProcessHeap(), 0, lpwAliasBuffer);
+ return dwRetVal;
}
@@ -567,18 +539,28 @@
* @implemented
*/
DWORD STDCALL
-GetConsoleAliasesLengthW (LPWSTR lpExeName /* FIXME: currently ignored */)
-{
- DWORD len = 0;
- LPALIAS ptr = lpFirst;
- while (ptr)
- {
- len += wcslen(ptr->lpName) * sizeof(WCHAR);
- len += wcslen(ptr->lpSubst) * sizeof(WCHAR);
- len += 2 * sizeof(WCHAR); /* '=' + '\0' */
- ptr = ptr->next;
- }
- return len;
+GetConsoleAliasesLengthW (LPWSTR lpExeName)
+{
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest;
+ NTSTATUS Status;
+
+ CsrRequest = MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CSR_NATIVE);
+ Request.Data.GetAllConsoleAliasesLength.lpExeName = lpExeName;
+ Request.Data.GetAllConsoleAliasesLength.Length = 0;
+
+ Status = CsrClientCallServer(&Request,
+ NULL,
+ CsrRequest,
+ sizeof(CSR_API_MESSAGE));
+
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ return Request.Data.GetAllConsoleAliasesLength.Length;
}
@@ -594,7 +576,9 @@
if (lpExeName)
BasepAnsiStringToHeapUnicodeString(lpExeName, (LPWSTR*) &lpExeNameW);
- dwRetVal = (GetConsoleAliasesLengthW(lpExeNameW) / sizeof(WCHAR));
+ dwRetVal = GetConsoleAliasesLengthW(lpExeNameW);
+ if (dwRetVal)
+ dwRetVal /= sizeof(WCHAR);
/* Clean up */
if (lpExeNameW)