[ros-diffs] [janderwald] 32166: - partly fix AddConsoleAlias/GetConsoleAlias - add hack for GetConsoleAliasW to circumvent CsrCaptureMessageBuffer is not working

janderwald at svn.reactos.org janderwald at svn.reactos.org
Wed Feb 6 19:57:40 CET 2008


Author: janderwald
Date: Wed Feb  6 21:57:40 2008
New Revision: 32166

URL: http://svn.reactos.org/svn/reactos?rev=32166&view=rev
Log:
- partly fix AddConsoleAlias/GetConsoleAlias
- add hack for GetConsoleAliasW to circumvent CsrCaptureMessageBuffer is not working

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/console.c?rev=32166&r1=32165&r2=32166&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/console.c (original)
+++ trunk/reactos/dll/win32/kernel32/misc/console.c Wed Feb  6 21:57:40 2008
@@ -181,27 +181,55 @@
 		  LPCWSTR lpTarget,
 		  LPCWSTR lpExeName)
 {
-  CSR_API_MESSAGE Request; 
+  PCSR_API_MESSAGE Request; 
   ULONG CsrRequest;
   NTSTATUS Status;
+  ULONG SourceLength;
+  ULONG TargetLength = 0;
+  ULONG ExeLength;
+  ULONG Size;
+  ULONG RequestLength;
+  WCHAR * Ptr;
+  
+  DPRINT("AddConsoleAliasW enterd with lpSource %S lpTarget %S lpExeName %S\n", lpSource, lpTarget, lpExeName);
+
+  ExeLength = wcslen(lpExeName) + 1;
+  SourceLength = wcslen(lpSource)+ 1;
+  if (lpTarget)
+      TargetLength = wcslen(lpTarget) + 1;
+
+  Size = (ExeLength + SourceLength + TargetLength) * sizeof(WCHAR);
+  RequestLength = sizeof(CSR_API_MESSAGE) + Size;
+  
+  Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, RequestLength);
+  Ptr = (WCHAR*)(((ULONG_PTR)Request) + sizeof(CSR_API_MESSAGE));
+  
+  wcscpy(Ptr, lpSource);
+  Request->Data.AddConsoleAlias.SourceLength = SourceLength;
+  Ptr = (WCHAR*)(((ULONG_PTR)Request) + sizeof(CSR_API_MESSAGE) + SourceLength * sizeof(WCHAR));
+
+  wcscpy(Ptr, lpExeName);
+  Request->Data.AddConsoleAlias.ExeLength = ExeLength;
+  Ptr = (WCHAR*)(((ULONG_PTR)Request) + sizeof(CSR_API_MESSAGE) + (ExeLength + SourceLength)* sizeof(WCHAR));
+
+  if (lpTarget) /* target can be optional */
+      wcscpy(Ptr, lpTarget);
+
+  Request->Data.AddConsoleAlias.TargetLength = TargetLength;
 
   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,
+  Status = CsrClientCallServer(Request,
+                   NULL,
 			       CsrRequest,
-			       sizeof(CSR_API_MESSAGE));
-
-  if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+			       RequestLength);
+
+  if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
   {
     SetLastErrorByStatus(Status);
+    RtlFreeHeap(GetProcessHeap(), 0, Request);
     return FALSE;
   }
-
+  RtlFreeHeap(GetProcessHeap(), 0, Request);
   return TRUE;
 }
 
@@ -298,29 +326,73 @@
 		  DWORD		TargetBufferLength,
 		  LPWSTR	lpExeName)
 {
-  CSR_API_MESSAGE Request; 
+  PCSR_API_MESSAGE Request; 
   ULONG CsrRequest;
   NTSTATUS Status;
+  ULONG Size;
+  ULONG ExeLength;
+  ULONG SourceLength;
+  ULONG RequestLength;
+  //PVOID CaptureBuffer;
+  WCHAR * Ptr;
+
+  DPRINT("GetConsoleAliasW entered lpSource %S lpExeName %S\n", lpSource, lpExeName);
 
   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,
+  ExeLength = wcslen(lpExeName) + 1;
+  SourceLength = wcslen(lpSource) + 1;
+
+  Size = (ExeLength + SourceLength + CSRSS_MAX_ALIAS_TARGET_LENGTH) * sizeof(WCHAR);
+
+  RequestLength = Size + sizeof(CSR_API_MESSAGE);
+  Request = RtlAllocateHeap(GetProcessHeap(), 0, RequestLength);
+  
+#if 0  
+  CaptureBuffer = CsrAllocateCaptureBuffer(1, TargetBufferLength);
+  if (!CaptureBuffer)
+  {
+    RtlFreeHeap(GetProcessHeap(), 0, Request);    
+    return 0;
+  }
+
+  Request->Data.GetConsoleAlias.TargetBuffer = NULL;
+  CsrCaptureMessageBuffer(CaptureBuffer,
+                          NULL,
+                          TargetBufferLength,
+                          (PVOID*)&Request->Data.GetConsoleAlias.TargetBuffer);
+  Request->Data.GetConsoleAlias.TargetBufferLength = TargetBufferLength;
+
+#endif
+
+  Ptr = (LPWSTR)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE));
+  wcscpy(Ptr, lpSource);
+  Ptr += SourceLength;
+  wcscpy(Ptr, lpExeName);
+  Ptr += ExeLength;
+
+  Request->Data.GetConsoleAlias.ExeLength = ExeLength;
+  Request->Data.GetConsoleAlias.TargetBufferLength = CSRSS_MAX_ALIAS_TARGET_LENGTH * sizeof(WCHAR);
+  Request->Data.GetConsoleAlias.SourceLength = SourceLength;
+
+  Status = CsrClientCallServer(Request,
+			       NULL, //CaptureBuffer,
 			       CsrRequest,
-			       sizeof(CSR_API_MESSAGE));
-
-  if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
-  {
+			       sizeof(CSR_API_MESSAGE) + Size);
+
+  if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
+  {
+    RtlFreeHeap(GetProcessHeap(), 0, Request);
+    //CsrFreeCaptureBuffer(CaptureBuffer);
     SetLastErrorByStatus(Status);
     return 0;
   }
 
-  return Request.Data.GetConsoleAlias.BytesWritten / sizeof(WCHAR);
+  wcscpy(lpTargetBuffer, Ptr);
+  RtlFreeHeap(GetProcessHeap(), 0, Request);
+  //CsrFreeCaptureBuffer(CaptureBuffer);
+
+  return Size;
 }
 
 
@@ -340,6 +412,8 @@
   UINT dwExeNameSize;
   UINT dwResult;
 
+  DPRINT("GetConsoleAliasA entered\n");
+
   dwSourceSize = (strlen(lpSource)+1) * sizeof(WCHAR);
   lpwSource = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSourceSize);
   MultiByteToWideChar(CP_ACP, 0, lpSource, -1, lpwSource, dwSourceSize);
@@ -374,6 +448,8 @@
   CSR_API_MESSAGE Request; 
   ULONG CsrRequest;
   NTSTATUS Status;
+
+  DPRINT("GetConsoleAliasExesW entered\n");
 
   CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES, CSR_NATIVE);
   Request.Data.GetConsoleAliasesExes.ExeNames = lpExeNameBuffer;
@@ -404,6 +480,8 @@
   LPWSTR lpwExeNameBuffer;
   DWORD dwResult;
 
+  DPRINT("GetConsoleAliasExesA entered\n");
+
   lpwExeNameBuffer = HeapAlloc(GetProcessHeap(), 0, ExeNameBufferLength * sizeof(WCHAR));
 
   dwResult = GetConsoleAliasExesW(lpwExeNameBuffer, ExeNameBufferLength);
@@ -424,6 +502,8 @@
   CSR_API_MESSAGE Request; 
   ULONG CsrRequest;
   NTSTATUS          Status;
+
+  DPRINT("GetConsoleAliasExesLengthW entered\n");
 
   CsrRequest = MAKE_CSR_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CSR_NATIVE);
   Request.Data.GetConsoleAliasesExesLength.Length = 0;
@@ -451,6 +531,8 @@
 {
   DWORD dwLength;
 
+  DPRINT("GetConsoleAliasExesLengthA entered\n");
+
   dwLength = GetConsoleAliasExesLengthW();
 
   if (dwLength)
@@ -473,6 +555,8 @@
   NTSTATUS Status;
   DWORD dwLength;
 
+  DPRINT("GetConsoleAliasesW entered\n");
+
   dwLength = GetConsoleAliasesLengthW(ExeName);
   if (!dwLength || dwLength > AliasBufferLength)
       return 0;
@@ -508,6 +592,8 @@
   DWORD dwRetVal = 0;
   LPWSTR lpwExeName = NULL;
   LPWSTR lpwAliasBuffer;
+
+  DPRINT("GetConsoleAliasesA entered\n");
 
 	if (ExeName)
 		BasepAnsiStringToHeapUnicodeString(ExeName, (LPWSTR*) &lpwExeName);
@@ -536,6 +622,8 @@
   CSR_API_MESSAGE Request; 
   ULONG CsrRequest;
   NTSTATUS          Status;
+
+  DPRINT("GetConsoleAliasesLengthW entered\n");
 
   CsrRequest = MAKE_CSR_API(GET_ALL_CONSOLE_ALIASES_LENGTH, CSR_NATIVE);
   Request.Data.GetAllConsoleAliasesLength.lpExeName = lpExeName;




More information about the Ros-diffs mailing list