Author: mjansen Date: Sun Jul 30 12:47:57 2017 New Revision: 75455 URL: http://svn.reactos.org/svn/reactos?rev=75455&view=rev Log: [SHIMENG] Partial rewrite to make the code easier to maintain. - Protect ARRAY access with macro's / helper functions. - Do not store objects in the ARRAY data, but store pointers to the objects. - Rewrite import hooking to use an ARRAY instead of single linked lists.
Modified: trunk/reactos/dll/appcompat/apphelp/shimeng.c trunk/reactos/dll/appcompat/apphelp/shimeng.h Modified: trunk/reactos/dll/appcompat/apphelp/shimeng.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/appcompat/apphelp/shimeng.c?rev=75455&r1=75454&r2=75455&view=diff ============================================================================== --- trunk/reactos/dll/appcompat/apphelp/shimeng.c [iso-8859-1] (original) +++ trunk/reactos/dll/appcompat/apphelp/shimeng.c [iso-8859-1] Sun Jul 30 12:47:57 2017 @@ -17,7 +17,6 @@ */ #define WIN32_NO_STATUS -#include "windows.h" #include "ntndk.h" #define IN_APPHELP #include "shimlib.h" @@ -40,7 +39,7 @@ BOOL g_bComPlusImage = FALSE; BOOL g_bShimDuringInit = FALSE; BOOL g_bInternalHooksUsed = FALSE; -static ARRAY g_pShimInfo; /* SHIMMODULE */ +static ARRAY g_pShimInfo; /* PSHIMMODULE */ static ARRAY g_pHookArray; /* HOOKMODULEINFO */ HOOKAPIEX g_IntHookEx[] = @@ -50,23 +49,32 @@ "GetProcAddress", /* FunctionName */ StubGetProcAddress, /* ReplacementFunction*/ NULL, /* OriginalFunction */ - { NULL }, /* ModuleLink */ - { NULL } /* ApiLink */ + NULL, /* pShimInfo */ + NULL /* Unused */ }, }; - - - -static BOOL ARRAY_EnsureSize(PARRAY Array, DWORD ItemSize, DWORD GrowWith) +static inline BOOL ARRAY_InitWorker(PARRAY Array, DWORD ItemSize) +{ + Array->Data__ = NULL; + Array->Size__ = Array->MaxSize__ = 0; + Array->ItemSize__ = ItemSize; + + return TRUE; +} + +static inline BOOL ARRAY_EnsureSize(PARRAY Array, DWORD ItemSize, DWORD GrowWith) { PVOID pNewData; DWORD Count; - if (Array->MaxSize > Array->Size) + ASSERT(Array); + ASSERT(ItemSize == Array->ItemSize__); + + if (Array->MaxSize__ > Array->Size__) return TRUE; - Count = Array->Size + GrowWith; + Count = Array->Size__ + GrowWith; pNewData = SeiAlloc(Count * ItemSize); if (!pNewData) @@ -74,18 +82,49 @@ SHIMENG_FAIL("Failed to allocate %d bytes\n", Count * ItemSize); return FALSE; } - Array->MaxSize = Count; - - if (Array->Data) - { - memcpy(pNewData, Array->Data, Array->Size * ItemSize); - SeiFree(Array->Data); - } - Array->Data = pNewData; + Array->MaxSize__ = Count; + + if (Array->Data__) + { + memcpy(pNewData, Array->Data__, Array->Size__ * ItemSize); + SeiFree(Array->Data__); + } + Array->Data__ = pNewData; return TRUE; } +static inline PVOID ARRAY_AppendWorker(PARRAY Array, DWORD ItemSize, DWORD GrowWith) +{ + PBYTE pData; + + if (!ARRAY_EnsureSize(Array, ItemSize, GrowWith)) + return NULL; + + pData = Array->Data__; + pData += (Array->Size__ * ItemSize); + Array->Size__++; + + return pData; +} + +static inline PVOID ARRAY_AtWorker(PARRAY Array, DWORD ItemSize, DWORD n) +{ + PBYTE pData; + + ASSERT(Array); + ASSERT(ItemSize == Array->ItemSize__); + ASSERT(n < Array->Size__); + + pData = Array->Data__; + return pData + (n * ItemSize); +} + + +#define ARRAY_Init(Array, TypeOfArray) ARRAY_InitWorker((Array), sizeof(TypeOfArray)) +#define ARRAY_Append(Array, TypeOfArray) (TypeOfArray*)ARRAY_AppendWorker((Array), sizeof(TypeOfArray), 5) +#define ARRAY_At(Array, TypeOfArray, at) (TypeOfArray*)ARRAY_AtWorker((Array), sizeof(TypeOfArray), at) +#define ARRAY_Size(Array) (Array)->Size__ VOID SeiInitDebugSupport(VOID) @@ -185,16 +224,15 @@ /* TODO: Guard against recursive calling / calling init multiple times! */ VOID NotifyShims(DWORD dwReason, PVOID Info) { - PSHIMMODULE Data; DWORD n; - Data = g_pShimInfo.Data; - for (n = 0; n < g_pShimInfo.Size; ++n) - { - if (!Data[n].pNotifyShims) + for (n = 0; n < ARRAY_Size(&g_pShimInfo); ++n) + { + PSHIMMODULE pShimModule = *ARRAY_At(&g_pShimInfo, PSHIMMODULE, n); + if (!pShimModule->pNotifyShims) continue; - Data[n].pNotifyShims(dwReason, Info); + pShimModule->pNotifyShims(dwReason, Info); } } @@ -209,25 +247,25 @@ } -PSHIMMODULE SeiGetShimInfo(PVOID BaseAddress) -{ - PSHIMMODULE Data; +PSHIMMODULE SeiGetShimModuleInfo(PVOID BaseAddress) +{ DWORD n; - Data = g_pShimInfo.Data; - for (n = 0; n < g_pShimInfo.Size; ++n) - { - if (Data[n].BaseAddress == BaseAddress) - return &Data[n]; + for (n = 0; n < ARRAY_Size(&g_pShimInfo); ++n) + { + PSHIMMODULE pShimModule = *ARRAY_At(&g_pShimInfo, PSHIMMODULE, n); + + if (pShimModule->BaseAddress == BaseAddress) + return pShimModule; } return NULL; } -PSHIMMODULE SeiCreateShimInfo(PCWSTR DllName, PVOID BaseAddress) +PSHIMMODULE SeiCreateShimModuleInfo(PCWSTR DllName, PVOID BaseAddress) { static const ANSI_STRING GetHookAPIs = RTL_CONSTANT_STRING("GetHookAPIs"); static const ANSI_STRING NotifyShims = RTL_CONSTANT_STRING("NotifyShims"); - PSHIMMODULE Data; + PSHIMMODULE* pData, Data; PVOID pGetHookAPIs, pNotifyShims; if (!NT_SUCCESS(LdrGetProcedureAddress(BaseAddress, (PANSI_STRING)&GetHookAPIs, 0, &pGetHookAPIs)) || @@ -237,12 +275,13 @@ return NULL; } - if (!ARRAY_EnsureSize(&g_pShimInfo, sizeof(SHIMMODULE), 5)) + pData = ARRAY_Append(&g_pShimInfo, PSHIMMODULE); + if (!pData) return NULL; - Data = g_pShimInfo.Data; - Data += g_pShimInfo.Size; - g_pShimInfo.Size++; + *pData = SeiAlloc(sizeof(SHIMMODULE)); + + Data = *pData; RtlCreateUnicodeString(&Data->Name, DllName); Data->BaseAddress = BaseAddress; @@ -250,39 +289,40 @@ Data->pGetHookAPIs = pGetHookAPIs; Data->pNotifyShims = pNotifyShims; - Data->HookApis.Data = NULL; - Data->HookApis.Size = 0; - Data->HookApis.MaxSize = 0; + ARRAY_Init(&Data->EnabledShims, PSHIMINFO); return Data; } -VOID SeiAppendHookInfo(PSHIMMODULE pShimInfo, PHOOKAPIEX pHookApi, DWORD dwHookCount) -{ - PHOOKAPIPOINTERS Data; - if (!ARRAY_EnsureSize(&pShimInfo->HookApis, sizeof(HOOKAPIPOINTERS), 5)) +VOID SeiAppendHookInfo(PSHIMMODULE pShimModuleInfo, PHOOKAPIEX pHookApi, DWORD dwHookCount) +{ + PSHIMINFO* pData, Data; + + pData = ARRAY_Append(&pShimModuleInfo->EnabledShims, PSHIMINFO); + if (!pData) return; - Data = pShimInfo->HookApis.Data; - Data += pShimInfo->HookApis.Size; + *pData = SeiAlloc(sizeof(SHIMINFO)); + Data = *pData; Data->pHookApi = pHookApi; Data->dwHookCount = dwHookCount; - pShimInfo->HookApis.Size++; + Data->pShimModule = pShimModuleInfo; } PHOOKMODULEINFO SeiFindHookModuleInfo(PUNICODE_STRING ModuleName, PVOID BaseAddress) { DWORD n; - PHOOKMODULEINFO Data = g_pHookArray.Data; - - for (n = 0; n < g_pHookArray.Size; ++n) - { - if (BaseAddress && BaseAddress == Data[n].BaseAddress) - return &Data[n]; - - if (!BaseAddress && RtlEqualUnicodeString(ModuleName, &Data[n].Name, TRUE)) - return &Data[n]; + + for (n = 0; n < ARRAY_Size(&g_pHookArray); ++n) + { + PHOOKMODULEINFO pModuleInfo = ARRAY_At(&g_pHookArray, HOOKMODULEINFO, n); + + if (BaseAddress && BaseAddress == pModuleInfo->BaseAddress) + return pModuleInfo; + + if (!BaseAddress && RtlEqualUnicodeString(ModuleName, &pModuleInfo->Name, TRUE)) + return pModuleInfo; } return NULL; @@ -334,12 +374,12 @@ static VOID SeiAddShim(TAGREF trShimRef, PARRAY pShimRef) { TAGREF* Data; - if (!ARRAY_EnsureSize(pShimRef, sizeof(TAGREF), 10)) + + Data = ARRAY_Append(pShimRef, TAGREF); + if (!Data) return; - Data = pShimRef->Data; - Data[pShimRef->Size] = trShimRef; - pShimRef->Size++; + *Data = trShimRef; } static VOID SeiSetLayerEnvVar(LPCWSTR wszLayer) @@ -404,8 +444,8 @@ HRESULT hr; SeiDbgPrint(SEI_MSG, NULL, "ShimInfo(Layer(%S))\n", LayerName); if (wszLayerEnvVar[0]) - StringCchCatW(wszLayerEnvVar, _countof(wszLayerEnvVar), L" "); - hr = StringCchCatW(wszLayerEnvVar, _countof(wszLayerEnvVar), LayerName); + StringCchCatW(wszLayerEnvVar, ARRAYSIZE(wszLayerEnvVar), L" "); + hr = StringCchCatW(wszLayerEnvVar, ARRAYSIZE(wszLayerEnvVar), LayerName); if (!SUCCEEDED(hr)) { SHIMENG_FAIL("Unable to append %S\n", LayerName); @@ -429,9 +469,9 @@ } -VOID SeiAddHooks(PHOOKAPIEX hooks, DWORD dwHookCount) -{ - DWORD n; +VOID SeiAddHooks(PHOOKAPIEX hooks, DWORD dwHookCount, PSHIMINFO pShim) +{ + DWORD n, j; UNICODE_STRING UnicodeModName; WCHAR Buf[512]; @@ -442,8 +482,8 @@ ANSI_STRING AnsiString; PVOID DllHandle; PHOOKAPIEX hook = hooks + n; + PHOOKAPIEX* pHookApi; PHOOKMODULEINFO HookModuleInfo; - PSINGLE_LIST_ENTRY Entry; RtlInitAnsiString(&AnsiString, hook->LibraryName); if (!NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeModName, &AnsiString, FALSE))) @@ -475,23 +515,20 @@ if (!HookModuleInfo) { - if (!ARRAY_EnsureSize(&g_pHookArray, sizeof(HOOKMODULEINFO), 5)) + HookModuleInfo = ARRAY_Append(&g_pHookArray, HOOKMODULEINFO); + if (!HookModuleInfo) continue; - HookModuleInfo = g_pHookArray.Data; - HookModuleInfo += g_pHookArray.Size; - g_pHookArray.Size++; - HookModuleInfo->BaseAddress = DllHandle; + ARRAY_Init(&HookModuleInfo->HookApis, PHOOKAPIEX); RtlCreateUnicodeString(&HookModuleInfo->Name, UnicodeModName.Buffer); } - Entry = &HookModuleInfo->ModuleLink; - - while (Entry && Entry->Next) - { - PHOOKAPIEX HookApi = CONTAINING_RECORD(Entry->Next, HOOKAPIEX, ModuleLink); - + hook->pShimInfo = pShim; + + for (j = 0; j < ARRAY_Size(&HookModuleInfo->HookApis); ++j) + { + PHOOKAPIEX HookApi = *ARRAY_At(&HookModuleInfo->HookApis, PHOOKAPIEX, j); int CmpResult = strcmp(hook->FunctionName, HookApi->FunctionName); if (CmpResult == 0) { @@ -499,20 +536,9 @@ SHIMENG_FAIL("Multiple hooks on one API is not yet supported!\n"); ASSERT(0); } - else if (CmpResult < 0) - { - /* Break out of the loop to have the entry inserted 'in place' */ - break; - } - - Entry = Entry->Next; - } - /* If Entry is not NULL, the item is not inserted yet, so link it at the end. */ - if (Entry) - { - hook->ModuleLink.Next = Entry->Next; - Entry->Next = &hook->ModuleLink; - } + } + pHookApi = ARRAY_Append(&HookModuleInfo->HookApis, PHOOKAPIEX); + *pHookApi = hook; } } @@ -545,14 +571,10 @@ /* FIXME: Ordinal not yet supported */ if (HookModuleInfo && HIWORD(lpProcName)) { - PSINGLE_LIST_ENTRY Entry; - - Entry = HookModuleInfo->ModuleLink.Next; - - while (Entry) - { - PHOOKAPIEX HookApi = CONTAINING_RECORD(Entry, HOOKAPIEX, ModuleLink); - + DWORD n; + for (n = 0; n < ARRAY_Size(&HookModuleInfo->HookApis); ++n) + { + PHOOKAPIEX HookApi = *ARRAY_At(&HookModuleInfo->HookApis, PHOOKAPIEX, n); int CmpResult = strcmp(lpProcName, HookApi->FunctionName); if (CmpResult == 0) { @@ -560,14 +582,6 @@ proc = HookApi->ReplacementFunction; break; } - else if (CmpResult < 0) - { - SHIMENG_MSG("Not found %s\n", lpProcName); - /* We are not going to find it anymore.. */ - break; - } - - Entry = Entry->Next; } } @@ -576,24 +590,23 @@ VOID SeiResolveAPIs(VOID) { - PSHIMMODULE Data; DWORD mod, n; - Data = g_pShimInfo.Data; - /* Enumerate all Shim modules */ - for (mod = 0; mod < g_pShimInfo.Size; ++mod) - { - PHOOKAPIPOINTERS pShims = Data[mod].HookApis.Data; - DWORD dwShimCount = Data[mod].HookApis.Size; + for (mod = 0; mod < ARRAY_Size(&g_pShimInfo); ++mod) + { + PSHIMMODULE pShimModule = *ARRAY_At(&g_pShimInfo, PSHIMMODULE, mod); + DWORD dwShimCount = ARRAY_Size(&pShimModule->EnabledShims); /* Enumerate all Shims */ for (n = 0; n < dwShimCount; ++n) { - PHOOKAPIEX hooks = pShims[n].pHookApi; - DWORD dwHookCount = pShims[n].dwHookCount; - - SeiAddHooks(hooks, dwHookCount); + PSHIMINFO pShim = *ARRAY_At(&pShimModule->EnabledShims, PSHIMINFO, n); + + PHOOKAPIEX hooks = pShim->pHookApi; + DWORD dwHookCount = pShim->dwHookCount; + + SeiAddHooks(hooks, dwHookCount, pShim); } } } @@ -606,7 +619,7 @@ return; } - SeiAddHooks(g_IntHookEx, _countof(g_IntHookEx)); + SeiAddHooks(g_IntHookEx, ARRAYSIZE(g_IntHookEx), NULL); g_bInternalHooksUsed = TRUE; } @@ -678,20 +691,18 @@ if (HookModuleInfo) { PIMAGE_THUNK_DATA OriginalThunk, FirstThunk; - PSINGLE_LIST_ENTRY Entry; - - Entry = HookModuleInfo->ModuleLink.Next; - - while (Entry) + DWORD n; + + for (n = 0; n < ARRAY_Size(&HookModuleInfo->HookApis); ++n) { DWORD dwFound = 0; + PHOOKAPIEX HookApi = *ARRAY_At(&HookModuleInfo->HookApis, PHOOKAPIEX, n); + OriginalThunk = (PIMAGE_THUNK_DATA)(DllBase + ImportDescriptor->OriginalFirstThunk); FirstThunk = (PIMAGE_THUNK_DATA)(DllBase + ImportDescriptor->FirstThunk); - for (;OriginalThunk->u1.AddressOfData && FirstThunk->u1.Function && Entry; OriginalThunk++, FirstThunk++) + for (;OriginalThunk->u1.AddressOfData && FirstThunk->u1.Function; OriginalThunk++, FirstThunk++) { - PHOOKAPIEX HookApi = CONTAINING_RECORD(Entry, HOOKAPIEX, ModuleLink); - if (!IMAGE_SNAP_BY_ORDINAL32(OriginalThunk->u1.AddressOfData)) { PIMAGE_IMPORT_BY_NAME ImportName; @@ -712,19 +723,13 @@ } } - if (Entry) + if (dwFound != 1) { - if (dwFound != 1) - { - /* One entry not found. */ - PHOOKAPIEX HookApi = CONTAINING_RECORD(Entry, HOOKAPIEX, ModuleLink); - if (!dwFound) - SHIMENG_INFO("Entry \"%s!%s\" not found for \"%wZ\"\n", HookApi->LibraryName, HookApi->FunctionName, &LdrEntry->BaseDllName); - else - SHIMENG_INFO("Entry \"%s!%s\" found %d times for \"%wZ\"\n", HookApi->LibraryName, HookApi->FunctionName, dwFound, &LdrEntry->BaseDllName); - } - - Entry = Entry->Next; + /* One entry not found. */ + if (!dwFound) + SHIMENG_INFO("Entry \"%s!%s\" not found for \"%wZ\"\n", HookApi->LibraryName, HookApi->FunctionName, &LdrEntry->BaseDllName); + else + SHIMENG_INFO("Entry \"%s!%s\" found %d times for \"%wZ\"\n", HookApi->LibraryName, HookApi->FunctionName, dwFound, &LdrEntry->BaseDllName); } } } @@ -757,14 +762,17 @@ VOID SeiInit(PUNICODE_STRING ProcessImage, HSDB hsdb, SDBQUERYRESULT* pQuery) { DWORD n; - ARRAY ShimRef; - TAGREF* Data; + ARRAY ShimRefArray; DWORD dwTotalHooks = 0; PPEB Peb = NtCurrentPeb(); - ShimRef.Data = NULL; - ShimRef.Size = ShimRef.MaxSize = 0; + /* We should only be called once! */ + ASSERT(g_pShimInfo.ItemSize__ == 0); + + ARRAY_Init(&ShimRefArray, TAGREF); + ARRAY_Init(&g_pShimInfo, PSHIMMODULE); + ARRAY_Init(&g_pHookArray, HOOKMODULEINFO); SeiCheckComPlusImage(Peb->ImageBaseAddress); @@ -774,28 +782,29 @@ */ SeiDbgPrint(SEI_MSG, NULL, "ShimInfo(ExePath(%wZ))\n", ProcessImage); - SeiBuildShimRefArray(hsdb, pQuery, &ShimRef); + SeiBuildShimRefArray(hsdb, pQuery, &ShimRefArray); SeiDbgPrint(SEI_MSG, NULL, "ShimInfo(Complete)\n"); - SHIMENG_INFO("Got %d shims\n", ShimRef.Size); + SHIMENG_INFO("Got %d shims\n", ARRAY_Size(&ShimRefArray)); /* TODO: SeiBuildGlobalInclExclList() */ - Data = ShimRef.Data; - - for (n = 0; n < ShimRef.Size; ++n) + for (n = 0; n < ARRAY_Size(&ShimRefArray); ++n) { PDB pdb; TAGID ShimRef; - if (SdbTagRefToTagID(hsdb, Data[n], &pdb, &ShimRef)) + + TAGREF tr = *ARRAY_At(&ShimRefArray, TAGREF, n); + + if (SdbTagRefToTagID(hsdb, tr, &pdb, &ShimRef)) { LPCWSTR ShimName, DllName, CommandLine = NULL; TAGID ShimTag; WCHAR FullNameBuffer[MAX_PATH]; UNICODE_STRING UnicodeDllName; PVOID BaseAddress; - PSHIMMODULE pShimInfo = NULL; + PSHIMMODULE pShimModuleInfo = NULL; ANSI_STRING AnsiCommandLine = RTL_CONSTANT_STRING(""); PHOOKAPIEX pHookApi; DWORD dwHookCount; @@ -803,7 +812,7 @@ ShimName = SeiGetStringPtr(pdb, ShimRef, TAG_NAME); if (!ShimName) { - SHIMENG_FAIL("Failed to retrieve the name for 0x%x\n", Data[n]); + SHIMENG_FAIL("Failed to retrieve the name for 0x%x\n", tr); continue; } @@ -829,7 +838,7 @@ continue; } - if (!SdbGetAppPatchDir(NULL, FullNameBuffer, _countof(FullNameBuffer))) + if (!SdbGetAppPatchDir(NULL, FullNameBuffer, ARRAYSIZE(FullNameBuffer))) { SHIMENG_WARN("Failed to get the AppPatch dir\n"); continue; @@ -837,8 +846,8 @@ DllName = SeiGetStringPtr(pdb, ShimTag, TAG_DLLFILE); if (DllName == NULL || - !SUCCEEDED(StringCchCatW(FullNameBuffer, _countof(FullNameBuffer), L"\\")) || - !SUCCEEDED(StringCchCatW(FullNameBuffer, _countof(FullNameBuffer), DllName))) + !SUCCEEDED(StringCchCatW(FullNameBuffer, ARRAYSIZE(FullNameBuffer), L"\\")) || + !SUCCEEDED(StringCchCatW(FullNameBuffer, ARRAYSIZE(FullNameBuffer), DllName))) { SHIMENG_WARN("Failed to build a full path for %S\n", ShimName); continue; @@ -847,17 +856,17 @@ RtlInitUnicodeString(&UnicodeDllName, FullNameBuffer); if (NT_SUCCESS(LdrGetDllHandle(NULL, NULL, &UnicodeDllName, &BaseAddress))) { - pShimInfo = SeiGetShimInfo(BaseAddress); + pShimModuleInfo = SeiGetShimModuleInfo(BaseAddress); } else if (!NT_SUCCESS(LdrLoadDll(NULL, NULL, &UnicodeDllName, &BaseAddress))) { SHIMENG_WARN("Failed to load %wZ for %S\n", &UnicodeDllName, ShimName); continue; } - if (!pShimInfo) - { - pShimInfo = SeiCreateShimInfo(DllName, BaseAddress); - if (!pShimInfo) + if (!pShimModuleInfo) + { + pShimModuleInfo = SeiCreateShimModuleInfo(DllName, BaseAddress); + if (!pShimModuleInfo) { SHIMENG_FAIL("Failed to allocate ShimInfo for %S\n", DllName); continue; @@ -867,10 +876,10 @@ SHIMENG_INFO("Shim DLL 0x%p \"%wZ\" loaded\n", BaseAddress, &UnicodeDllName); SHIMENG_INFO("Using SHIM \"%S!%S\"\n", DllName, ShimName); - pHookApi = pShimInfo->pGetHookAPIs(AnsiCommandLine.Buffer, ShimName, &dwHookCount); + pHookApi = pShimModuleInfo->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); + SeiAppendHookInfo(pShimModuleInfo, pHookApi, dwHookCount); if (CommandLine && *CommandLine) RtlFreeAnsiString(&AnsiCommandLine); @@ -919,7 +928,7 @@ ProcessName.Length = ProcessImage->Length - Back; ProcessName.MaximumLength = ProcessImage->MaximumLength - Back; - for (n = 0; n < _countof(ForbiddenShimmingApps); ++n) + for (n = 0; n < ARRAYSIZE(ForbiddenShimmingApps); ++n) { if (RtlEqualUnicodeString(&ProcessName, ForbiddenShimmingApps + n, TRUE)) { @@ -990,6 +999,6 @@ { SHIMENG_MSG("(%p)\n", BaseAddress); - return SeiGetShimInfo(BaseAddress) != NULL; -} - + return SeiGetShimModuleInfo(BaseAddress) != NULL; +} + Modified: trunk/reactos/dll/appcompat/apphelp/shimeng.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/appcompat/apphelp/shimeng.h?rev=75455&r1=75454&r2=75455&view=diff ============================================================================== --- trunk/reactos/dll/appcompat/apphelp/shimeng.h [iso-8859-1] (original) +++ trunk/reactos/dll/appcompat/apphelp/shimeng.h [iso-8859-1] Sun Jul 30 12:47:57 2017 @@ -1,5 +1,5 @@ /* - * Copyright 2017 Mark Jansen + * Copyright 2017 Mark Jansen (mark.jan...@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,37 +19,42 @@ #ifndef SHIMENG_H #define SHIMENG_H -/* Structure that allows dynamic growing */ +/* ReactOS specific */ + +/* Structure that allows dynamic growing. + Be aware, the data may move! */ typedef struct _ARRAY { - PVOID Data; - DWORD Size; - DWORD MaxSize; + PVOID Data__; + DWORD Size__; + DWORD MaxSize__; + DWORD ItemSize__; } ARRAY, *PARRAY; +typedef struct _SHIMINFO *PSHIMINFO; +typedef struct _SHIMMODULE *PSHIMMODULE; -/* Shims do not know it, but actually they use the type HOOKAPIEX. - We use the 'Reserved' entry for our own purposes. */ - +/* Shims know this structure as HOOKAPI, with 2 reserved members (the last 2). */ typedef struct tagHOOKAPIEX { PCSTR LibraryName; PCSTR FunctionName; PVOID ReplacementFunction; PVOID OriginalFunction; - SINGLE_LIST_ENTRY ModuleLink; - SINGLE_LIST_ENTRY ApiLink; + PSHIMINFO pShimInfo; + PVOID Unused; } HOOKAPIEX, *PHOOKAPIEX; C_ASSERT(sizeof(HOOKAPIEX) == sizeof(HOOKAPI)); -C_ASSERT(offsetof(HOOKAPIEX, ModuleLink) == offsetof(HOOKAPI, Reserved)); +C_ASSERT(offsetof(HOOKAPIEX, pShimInfo) == offsetof(HOOKAPI, Reserved)); -typedef struct _HOOKAPIPOINTERS +typedef struct _SHIMINFO { PHOOKAPIEX pHookApi; DWORD dwHookCount; -} HOOKAPIPOINTERS, *PHOOKAPIPOINTERS; + PSHIMMODULE pShimModule; +} SHIMINFO, *PSHIMINFO; typedef struct _SHIMMODULE { @@ -59,7 +64,7 @@ PHOOKAPIEX (WINAPI* pGetHookAPIs)(LPCSTR szCommandLine, LPCWSTR wszShimName, PDWORD pdwHookCount); BOOL (WINAPI* pNotifyShims)(DWORD fdwReason, PVOID ptr); - ARRAY HookApis; /* HOOKAPIPOINTERS */ + ARRAY EnabledShims; /* PSHIMINFO */ } SHIMMODULE, *PSHIMMODULE; typedef struct _HOOKMODULEINFO @@ -67,8 +72,8 @@ UNICODE_STRING Name; PVOID BaseAddress; - SINGLE_LIST_ENTRY ModuleLink; /* Normal link, all entries from this module */ - SINGLE_LIST_ENTRY ApiLink; /* Multiple hooks on one api, unsupported for now */ + ARRAY HookApis; /* PHOOKAPIEX */ + } HOOKMODULEINFO, *PHOOKMODULEINFO;