[ros-diffs] [janderwald] 32167: - 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:59:19 CET 2008


Author: janderwald
Date: Wed Feb  6 21:59:18 2008
New Revision: 32167

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

Modified:
    trunk/reactos/subsystems/win32/csrss/api/alias.c

Modified: trunk/reactos/subsystems/win32/csrss/api/alias.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/api/alias.c?rev=32167&r1=32166&r2=32167&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/api/alias.c (original)
+++ trunk/reactos/subsystems/win32/csrss/api/alias.c Wed Feb  6 21:59:18 2008
@@ -112,6 +112,7 @@
     PALIAS_ENTRY RootHeader = Header->Data;
     while(RootHeader)
     {
+        DPRINT("IntGetAliasEntry>lpSource %S\n", RootHeader->lpSource);
         INT diff = _wcsicmp(RootHeader->lpSource, lpSrcName);
         if (!diff)
             return RootHeader;
@@ -136,6 +137,7 @@
   if (!CurrentEntry)
   {
     Header->Data = NewEntry;
+    NewEntry->Next = NULL;
     return;
   }
 
@@ -235,10 +237,12 @@
        Length += wcslen(CurEntry->lpTarget);
        Length += 2; // zero byte and '='
    }
+
    if (Length)
-       Length++; // extra zero
-
-   return sizeof(WCHAR) * Length;
+   {
+       return (Length+1) * sizeof(WCHAR);
+   }
+   return 0;
 }
 UINT
 IntGetAllConsoleAliases(PALIAS_HEADER Header, LPWSTR TargetBuffer, UINT TargetBufferLength)
@@ -298,17 +302,31 @@
 {
     PALIAS_HEADER Header;
     PALIAS_ENTRY Entry;
-
-    if (Request->Data.AddConsoleAlias.lpExeName == NULL || Request->Data.AddConsoleAlias.lpSource == NULL)
-    {
-        Request->Status = STATUS_INVALID_PARAMETER;
-        return Request->Status;
-    }
-
-    Header = IntFindAliasHeader(RootHeader, Request->Data.AddConsoleAlias.lpExeName);
-    if (!Header && Request->Data.AddConsoleAlias.lpTarget != NULL)
-    {
-        Header = IntCreateAliasHeader(Request->Data.AddConsoleAlias.lpExeName);
+    WCHAR * lpExeName;
+    WCHAR * lpSource;
+    WCHAR * lpTarget;
+    ULONG TotalLength;
+    WCHAR * Ptr;
+
+    TotalLength = Request->Data.AddConsoleAlias.SourceLength + Request->Data.AddConsoleAlias.ExeLength + Request->Data.AddConsoleAlias.TargetLength;
+    Ptr = (WCHAR*)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE));
+
+    lpSource = (WCHAR*)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE));
+    lpExeName = (WCHAR*)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE) + Request->Data.AddConsoleAlias.SourceLength * sizeof(WCHAR));
+    lpTarget = (Request->Data.AddConsoleAlias.TargetLength != 0 ? lpExeName + Request->Data.AddConsoleAlias.ExeLength : NULL);
+
+    DPRINT("CsrAddConsoleAlias entered Request %p lpSource %p lpExeName %p lpTarget %p\n", Request, lpSource, lpExeName, lpTarget);
+
+    if (lpExeName == NULL || lpSource == NULL)
+    {
+        Request->Status = STATUS_INVALID_PARAMETER;
+        return Request->Status;
+    }
+    
+    Header = IntFindAliasHeader(RootHeader, lpExeName);
+    if (!Header && lpTarget != NULL)
+    {
+        Header = IntCreateAliasHeader(lpExeName);
         if (!Header)
         {
             Request->Status = STATUS_INSUFFICIENT_RESOURCES;
@@ -317,9 +335,9 @@
         IntInsertAliasHeader(&RootHeader, Header);
     }
 
-    if (Request->Data.AddConsoleAlias.lpTarget == NULL) // delete the entry
-    {
-        Entry = IntGetAliasEntry(Header, Request->Data.AddConsoleAlias.lpSource);
+    if (lpTarget == NULL) // delete the entry
+    {
+        Entry = IntGetAliasEntry(Header, lpSource);
         if (Entry)
         {
             IntDeleteAliasEntry(Header, Entry);
@@ -329,12 +347,10 @@
         {
             Request->Status = STATUS_INVALID_PARAMETER;
         }
-
-        return Request->Status;
-    }
-
-    Entry = IntCreateAliasEntry(Request->Data.AddConsoleAlias.lpSource,
-                Request->Data.AddConsoleAlias.lpTarget);
+        return Request->Status;
+    }
+
+    Entry = IntCreateAliasEntry(lpSource, lpTarget);
 
     if (!Entry)
     {
@@ -343,7 +359,6 @@
     }
 
     IntInsertAliasEntry(Header, Entry);
-
     Request->Status = STATUS_SUCCESS;
     return Request->Status;
 }
@@ -353,22 +368,33 @@
     PALIAS_HEADER Header;
     PALIAS_ENTRY Entry;
     UINT Length;
-
-    if (Request->Data.GetConsoleAlias.lpExeName == NULL || Request->Data.GetConsoleAlias.TargetBuffer == NULL || 
-        Request->Data.GetConsoleAlias.TargetBufferLength == 0 || Request->Data.GetConsoleAlias.lpSource == NULL)
-    {
-        Request->Status = STATUS_INVALID_PARAMETER;
-        return Request->Status;
-    }
-
-    Header = IntFindAliasHeader(RootHeader, Request->Data.GetAllConsoleAlias.lpExeName);
+    WCHAR * lpExeName;
+    WCHAR * lpSource;
+    WCHAR * lpTarget;
+
+    lpSource = (LPWSTR)((ULONG_PTR)Request + sizeof(CSR_API_MESSAGE));
+    lpExeName = lpSource + Request->Data.GetConsoleAlias.SourceLength;
+    lpTarget = (LPWSTR)lpExeName + Request->Data.GetConsoleAlias.ExeLength;
+
+
+    DPRINT("CsrGetConsoleAlias entered lpExeName %p lpSource %p TargetBuffer %p TargetBufferLength %u\n", 
+        lpExeName, lpSource, lpTarget, Request->Data.GetConsoleAlias.TargetBufferLength);
+    
+    if (Request->Data.GetConsoleAlias.ExeLength == 0 || lpTarget == NULL || 
+        Request->Data.GetConsoleAlias.TargetBufferLength == 0 || Request->Data.GetConsoleAlias.SourceLength == 0)
+    {
+        Request->Status = STATUS_INVALID_PARAMETER;
+        return Request->Status;
+    }
+
+    Header = IntFindAliasHeader(RootHeader, lpExeName);
     if (!Header)
     {
         Request->Status = STATUS_INVALID_PARAMETER;
         return Request->Status;
     }
 
-    Entry = IntGetAliasEntry(Header, Request->Data.GetConsoleAlias.lpSource);
+    Entry = IntGetAliasEntry(Header, lpSource);
     if (!Entry)
     {
         Request->Status = STATUS_INVALID_PARAMETER;
@@ -381,7 +407,20 @@
         Request->Status = ERROR_INSUFFICIENT_BUFFER;
         return Request->Status;      
     }
-    wcscpy(Request->Data.GetConsoleAlias.TargetBuffer, Entry->lpTarget);
+
+#if 0
+    if (((PVOID)lpTarget < ProcessData->CsrSectionViewBase)
+      || (((ULONG_PTR)lpTarget + Request->Data.GetConsoleAlias.TargetBufferLength) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize)))
+    {
+        Request->Status = STATUS_ACCESS_VIOLATION;
+        DPRINT1("CsrGetConsoleAlias out of range lpTarget %p LowerViewBase %p UpperViewBase %p Size %p\n", lpTarget, 
+            ProcessData->CsrSectionViewBase, (ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize, ProcessData->CsrSectionViewSize);
+        return Request->Status;
+    }
+#endif
+
+    wcscpy(lpTarget, Entry->lpTarget);
+    lpTarget[CSRSS_MAX_ALIAS_TARGET_LENGTH-1] = '\0';
     Request->Data.GetConsoleAlias.BytesWritten = Length;
     Request->Status = STATUS_SUCCESS;
     return Request->Status;
@@ -448,7 +487,11 @@
 CSR_API(CsrGetConsoleAliasesExes)
 {
     UINT BytesWritten;
-    UINT ExesLength = IntGetConsoleAliasesExesLength(RootHeader);
+    UINT ExesLength;
+    
+    DPRINT("CsrGetConsoleAliasesExes entered\n");
+
+    ExesLength = IntGetConsoleAliasesExesLength(RootHeader);
     
     if (ExesLength > Request->Data.GetConsoleAliasesExes.Length)
     {
@@ -473,6 +516,8 @@
 
 CSR_API(CsrGetConsoleAliasesExesLength)
 {
+    DPRINT("CsrGetConsoleAliasesExesLength entered\n");
+
     Request->Status = STATUS_SUCCESS;
     Request->Data.GetConsoleAliasesExesLength.Length = IntGetConsoleAliasesExesLength(RootHeader);
     return Request->Status;




More information about the Ros-diffs mailing list