--- /dev/null
+/*
+ * 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;
+}
+
+++ /dev/null
-/*
- * 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
-}
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)