[APPHELP][SHIMLIB] Forward some events to loaded shims. CORE-11329
authorMark Jansen <mark.jansen@reactos.org>
Sat, 13 May 2017 18:49:27 +0000 (18:49 +0000)
committerMark Jansen <mark.jansen@reactos.org>
Sat, 13 May 2017 18:49:27 +0000 (18:49 +0000)
svn path=/trunk/; revision=74535

reactos/dll/appcompat/apphelp/CMakeLists.txt
reactos/dll/appcompat/apphelp/apphelp.spec
reactos/dll/appcompat/apphelp/shimeng.c [new file with mode: 0644]
reactos/dll/appcompat/shims/shimlib/CMakeLists.txt
reactos/dll/appcompat/shims/shimlib/shimdbgsupp.c [deleted file]
reactos/dll/appcompat/shims/shimlib/shimlib.h

index 019a874..d2fa858 100644 (file)
@@ -15,6 +15,7 @@ list(APPEND SOURCE
     sdbread.c
     sdbstringtable.c
     sdbwrite.c
+    shimeng.c
     apphelp.spec
     apphelp.h
     ${CMAKE_CURRENT_BINARY_DIR}/apphelp_stubs.c)
index 51a3019..dfebf83 100644 (file)
 @ stdcall SdbWriteStringTag(ptr long wstr)
 @ stub SdbWriteStringTagDirect
 @ stdcall SdbWriteWORDTag(ptr long long)
-@ stub SE_DllLoaded
-@ stub SE_DllUnloaded
+@ stdcall SE_DllLoaded(ptr)
+@ stdcall SE_DllUnloaded(ptr)
+@ stub SE_DynamicShim
+@ stub SE_DynamicUnshim
+@ stdcall SE_InstallAfterInit(ptr ptr)
+@ stdcall SE_InstallBeforeInit(ptr ptr)
+@ stdcall SE_IsShimDll(ptr)
+@ stdcall SE_ProcessDying()
 @ stub SE_GetHookAPIs
 @ stub SE_GetMaxShimCount
 @ stub SE_GetProcAddressLoad
 @ stub SE_GetShimCount
-@ stub SE_InstallAfterInit
-@ stub SE_InstallBeforeInit
-@ stub SE_IsShimDll
 @ stub SE_LdrEntryRemoved
-@ stub SE_ProcessDying
 @ stub SetPermLayers
 @ cdecl ShimDbgPrint(long str str)
 @ stub ShimDumpCache
diff --git a/reactos/dll/appcompat/apphelp/shimeng.c b/reactos/dll/appcompat/apphelp/shimeng.c
new file mode 100644 (file)
index 0000000..21fe781
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2015-2017 Mark Jansen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define WIN32_NO_STATUS
+#include "windows.h"
+#include "ntndk.h"
+#include "shimlib.h"
+#include <strsafe.h>
+
+HANDLE g_pShimEngModHandle = 0;
+
+
+ULONG g_ShimEngDebugLevel = 0xffffffff;
+
+
+
+
+VOID SeiInitDebugSupport(VOID)
+{
+    static const UNICODE_STRING DebugKey = RTL_CONSTANT_STRING(L"SHIMENG_DEBUG_LEVEL");
+    UNICODE_STRING DebugValue;
+    NTSTATUS Status;
+    ULONG NewLevel = 0;
+    WCHAR Buffer[40];
+
+    RtlInitEmptyUnicodeString(&DebugValue, Buffer, sizeof(Buffer));
+
+    Status = RtlQueryEnvironmentVariable_U(NULL, &DebugKey, &DebugValue);
+
+    if (NT_SUCCESS(Status))
+    {
+        if (!NT_SUCCESS(RtlUnicodeStringToInteger(&DebugValue, 10, &NewLevel)))
+            NewLevel = 0;
+    }
+    g_ShimEngDebugLevel = NewLevel;
+}
+
+
+/**
+ * Outputs diagnostic info.
+ *
+ * @param [in]  Level           The level to log this message with, choose any of [SHIM_ERR,
+ *                              SHIM_WARN, SHIM_INFO].
+ * @param [in]  FunctionName    The function this log should be attributed to.
+ * @param [in]  Format          The format string.
+ * @param   ...                 Variable arguments providing additional information.
+ *
+ * @return  Success: TRUE Failure: FALSE.
+ */
+BOOL WINAPIV SeiDbgPrint(SEI_LOG_LEVEL Level, PCSTR Function, PCSTR Format, ...)
+{
+    char Buffer[512];
+    char* Current = Buffer;
+    const char* LevelStr;
+    size_t Length = sizeof(Buffer);
+    va_list ArgList;
+    HRESULT hr;
+
+    if (g_ShimEngDebugLevel == 0xffffffff)
+        SeiInitDebugSupport();
+
+    if (Level > g_ShimEngDebugLevel)
+        return FALSE;
+
+    switch (Level)
+    {
+    case SEI_MSG:
+        LevelStr = "MSG ";
+        break;
+    case SEI_FAIL:
+        LevelStr = "FAIL";
+        break;
+    case SEI_WARN:
+        LevelStr = "WARN";
+        break;
+    case SEI_INFO:
+        LevelStr = "INFO";
+        break;
+    default:
+        LevelStr = "USER";
+        break;
+    }
+
+    if (Function)
+        hr = StringCchPrintfExA(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, "[%s] [%s] ", LevelStr, Function);
+    else
+        hr = StringCchPrintfExA(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, "[%s] ", LevelStr);
+
+    if (!SUCCEEDED(hr))
+        return FALSE;
+
+    va_start(ArgList, Format);
+    hr = StringCchVPrintfExA(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, Format, ArgList);
+    va_end(ArgList);
+    if (!SUCCEEDED(hr))
+        return FALSE;
+
+    DbgPrint("%s", Buffer);
+    return TRUE;
+}
+
+
+
+
+
+
+VOID NotifyShims(DWORD dwReason, PVOID Info)
+{
+    /* Enumerate all loaded shims */
+}
+
+
+VOID NTAPI SE_InstallBeforeInit(PUNICODE_STRING ProcessImage, PVOID pShimData)
+{
+    SHIMENG_FAIL("(%wZ, %p)", ProcessImage, pShimData);
+    /* Find & Load all shims.. */
+}
+
+VOID NTAPI SE_InstallAfterInit(PUNICODE_STRING ProcessImage, PVOID pShimData)
+{
+    SHIMENG_FAIL("(%wZ, %p)", ProcessImage, pShimData);
+    NotifyShims(SHIM_NOTIFY_ATTACH, NULL);
+}
+
+VOID NTAPI SE_ProcessDying(VOID)
+{
+    SHIMENG_FAIL("()");
+    NotifyShims(SHIM_NOTIFY_DETACH, NULL);
+}
+
+VOID WINAPI SE_DllLoaded(PLDR_DATA_TABLE_ENTRY LdrEntry)
+{
+    SHIMENG_FAIL("(%p)", LdrEntry);
+    NotifyShims(SHIM_REASON_DLL_LOAD, LdrEntry);
+}
+
+VOID WINAPI SE_DllUnloaded(PLDR_DATA_TABLE_ENTRY LdrEntry)
+{
+    SHIMENG_FAIL("(%p)", LdrEntry);
+    NotifyShims(SHIM_REASON_DLL_UNLOAD, LdrEntry);
+}
+
+BOOL WINAPI SE_IsShimDll(PVOID BaseAddress)
+{
+    SHIMENG_FAIL("(%p)", BaseAddress);
+    return FALSE;
+}
+
index 1b23316..2c799c9 100644 (file)
@@ -1,6 +1,5 @@
 
 list(APPEND SOURCE
-    shimdbgsupp.c
     shimlib.c
     shimlib.h
     # These .inl functions are included so they show up in vs
diff --git a/reactos/dll/appcompat/shims/shimlib/shimdbgsupp.c b/reactos/dll/appcompat/shims/shimlib/shimdbgsupp.c
deleted file mode 100644 (file)
index 7861ec7..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS Shim library
- * FILE:            dll/appcompat/shims/shimlib/shimdbgsupp.c
- * PURPOSE:         Shim debug helper functions
- * PROGRAMMER:      Mark Jansen
- */
-
-#include <windef.h>
-#include <winbase.h>
-#include <shimlib.h>
-#include <strsafe.h>
-
-#include "wine/winternl.h"
-
-#define DPFLTR_APPCOMPAT_ID 123
-
-void ApphelppInitDebugSupport(PCWSTR KeyName, PULONG Level);
-static void SeiInitDebugSupport()
-{
-    ApphelppInitDebugSupport(L"SHIMENG_DEBUG_LEVEL", &g_ShimEngDebugLevel);
-}
-
-
-/**
- * Outputs diagnostic info.
- *
- * @param [in]  Level           The level to log this message with, choose any of [SHIM_ERR,
- *                              SHIM_WARN, SHIM_INFO].
- * @param [in]  FunctionName    The function this log should be attributed to.
- * @param [in]  Format          The format string.
- * @param   ...                 Variable arguments providing additional information.
- *
- * @return  Success: TRUE Failure: FALSE.
- */
-BOOL WINAPIV SeiDbgPrint(SEI_LOG_LEVEL Level, PCSTR FunctionName, PCSTR Format, ...)
-{
-    char Buffer[512];
-    va_list ArgList;
-    char* Current = Buffer;
-    const char* LevelStr;
-    size_t Length = sizeof(Buffer);
-
-    if (g_ShimEngDebugLevel == 0xffffffff)
-        SeiInitDebugSupport();
-
-    if (Level > g_ShimEngDebugLevel)
-        return FALSE;
-
-    switch (Level)
-    {
-    case SEI_ERR:
-        LevelStr = "Err ";
-        Level = DPFLTR_MASK | (1 << DPFLTR_ERROR_LEVEL);
-        break;
-    case SEI_WARN:
-        LevelStr = "Warn";
-        Level = DPFLTR_MASK | (1 << DPFLTR_WARNING_LEVEL);
-        break;
-    case SEI_INFO:
-        LevelStr = "Info";
-        Level = DPFLTR_MASK | (1 << DPFLTR_INFO_LEVEL);
-        break;
-    default:
-        LevelStr = "User";
-        Level = DPFLTR_MASK | (1 << DPFLTR_INFO_LEVEL);
-        break;
-    }
-    StringCchPrintfExA(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, "[%s][%-20s] ", LevelStr, FunctionName);
-    va_start(ArgList, Format);
-    StringCchVPrintfExA(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, Format, ArgList);
-    va_end(ArgList);
-#if defined(APPCOMPAT_USE_DBGPRINTEX) && APPCOMPAT_USE_DBGPRINTEX
-    return NT_SUCCESS(DbgPrintEx(DPFLTR_APPCOMPAT_ID, Level, "%s", Buffer));
-#else
-    OutputDebugStringA(Buffer);
-    return TRUE;
-#endif
-}
index d7926f5..6f1efd9 100644 (file)
@@ -49,15 +49,17 @@ BOOL WINAPI ShimLib_NotifyShims(DWORD fdwReason, PVOID ptr);
 
 
 typedef enum _SEI_LOG_LEVEL {
-    SEI_ERR = 1,
-    SEI_WARN = 2,
-    SEI_INFO = 3,
+    SEI_MSG = 1,
+    SEI_FAIL = 2,
+    SEI_WARN = 3,
+    SEI_INFO = 4,
 } SEI_LOG_LEVEL;
 
-BOOL WINAPIV SeiDbgPrint(SEI_LOG_LEVEL Level, PCSTR FunctionName, PCSTR Format, ...);
+BOOL WINAPIV SeiDbgPrint(SEI_LOG_LEVEL Level, PCSTR Function, PCSTR Format, ...);
 extern ULONG g_ShimEngDebugLevel;
 
-#define SHIMENG_ERR(fmt, ...)  do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_ERR, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
+#define SHIMENG_MSG(fmt, ...)  do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_MSG, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
+#define SHIMENG_FAIL(fmt, ...)  do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_FAIL, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
 #define SHIMENG_WARN(fmt, ...)  do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_WARN, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
 #define SHIMENG_INFO(fmt, ...)  do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_INFO, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)