[SHIMENG] Pass shim commandline to shims. CORE-11329
[reactos.git] / reactos / dll / appcompat / apphelp / shimeng.c
index c04d5d3..8a708e1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2017 Mark Jansen
+ * Copyright 2015-2017 Mark Jansen (mark.jansen@reactos.org)
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -19,6 +19,7 @@
 #define WIN32_NO_STATUS
 #include "windows.h"
 #include "ntndk.h"
+#define IN_APPHELP
 #include "shimlib.h"
 #include <strsafe.h>
 /* Make sure we don't include apphelp logging */
@@ -789,13 +790,13 @@ VOID SeiInit(PUNICODE_STRING ProcessImage, HSDB hsdb, SDBQUERYRESULT* pQuery)
         TAGID ShimRef;
         if (SdbTagRefToTagID(hsdb, Data[n], &pdb, &ShimRef))
         {
-            LPCWSTR ShimName, DllName;
+            LPCWSTR ShimName, DllName, CommandLine = NULL;
             TAGID ShimTag;
             WCHAR FullNameBuffer[MAX_PATH];
             UNICODE_STRING UnicodeDllName;
             PVOID BaseAddress;
             PSHIMMODULE pShimInfo = NULL;
-            const char* szCommandLine = "";
+            ANSI_STRING AnsiCommandLine = RTL_CONSTANT_STRING("");
             PHOOKAPIEX pHookApi;
             DWORD dwHookCount;
 
@@ -806,6 +807,21 @@ VOID SeiInit(PUNICODE_STRING ProcessImage, HSDB hsdb, SDBQUERYRESULT* pQuery)
                 continue;
             }
 
+            CommandLine = SeiGetStringPtr(pdb, ShimRef, TAG_COMMAND_LINE);
+            if (CommandLine && *CommandLine)
+            {
+                RtlInitUnicodeString(&UnicodeDllName, CommandLine);
+                if (NT_SUCCESS(RtlUnicodeStringToAnsiString(&AnsiCommandLine, &UnicodeDllName, TRUE)))
+                {
+                    SHIMENG_INFO("COMMAND LINE %s for %S", AnsiCommandLine.Buffer, ShimName);
+                }
+                else
+                {
+                    AnsiCommandLine.Buffer = "";
+                    CommandLine = NULL;
+                }
+            }
+
             ShimTag = SeiGetDWORD(pdb, ShimRef, TAG_SHIM_TAGID);
             if (!ShimTag)
             {
@@ -828,11 +844,6 @@ VOID SeiInit(PUNICODE_STRING ProcessImage, HSDB hsdb, SDBQUERYRESULT* pQuery)
                 continue;
             }
 
-            /* TODO:
-            SeiGetShimCommandLine();
-            [SeiInit] COMMAND_LINE VirtualRegistry(WINNT;VistaRTMLie) from AcLayers.DLL
-            */
-
             RtlInitUnicodeString(&UnicodeDllName, FullNameBuffer);
             if (NT_SUCCESS(LdrGetDllHandle(NULL, NULL, &UnicodeDllName, &BaseAddress)))
             {
@@ -856,12 +867,14 @@ VOID SeiInit(PUNICODE_STRING ProcessImage, HSDB hsdb, SDBQUERYRESULT* pQuery)
             SHIMENG_INFO("Shim DLL 0x%p \"%wZ\" loaded\n", BaseAddress, &UnicodeDllName);
             SHIMENG_INFO("Using SHIM \"%S!%S\"\n", DllName, ShimName);
 
-
-            pHookApi = pShimInfo->pGetHookAPIs(szCommandLine, ShimName, &dwHookCount);
+            pHookApi = pShimInfo->pGetHookAPIs(AnsiCommandLine.Buffer, ShimName, &dwHookCount);
             SHIMENG_INFO("GetHookAPIs returns %d hooks for DLL \"%wZ\" SHIM \"%S\"\n", dwHookCount, &UnicodeDllName, ShimName);
             if (dwHookCount)
                 SeiAppendHookInfo(pShimInfo, pHookApi, dwHookCount);
 
+            if (CommandLine && *CommandLine)
+                RtlFreeAnsiString(&AnsiCommandLine);
+
             dwTotalHooks += dwHookCount;
             /*SeiBuildInclExclList*/
         }