/*++ Copyright (c) 1989-2000 Microsoft Corporation Module Name: match.c Abstract: This module implements ... Author: vadimb created sometime in 2000 Revision History: clupu cleanup 12/27/2000 --*/ #include "apphelp.h" // global Hinst HINSTANCE ghInstance; CRITICAL_SECTION g_csDynShimInfo; BOOL DllMain( HANDLE hModule, DWORD ul_reason, LPVOID lpReserved ) /*++ Return: TRUE on success, FALSE otherwise. Desc: apphelp.dll entry point. --*/ { switch (ul_reason) { case DLL_PROCESS_ATTACH: ghInstance = hModule; if (!NT_SUCCESS(RtlInitializeCriticalSectionAndSpinCount(&g_csDynShimInfo, 0x80000000))) { return FALSE; } break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } BOOL GetExeSxsData( IN HSDB hSDB, // handle to the database channel IN TAGREF trExe, // tagref of an exe entry OUT PVOID* ppSxsData, // pointer to the SXS data OUT DWORD* pcbSxsData // pointer to the SXS data size ) /*++ Return: TRUE on success, FALSE otherwise. Desc: Gets SXS (Fusion) data for the specified EXE from the database. --*/ { TAGID tiExe; TAGID tiSxsManifest; PDB pdb; WCHAR* pszManifest; DWORD dwManifestLength = 0; // in chars PVOID pSxsData = NULL; BOOL bReturn = FALSE; if (trExe == TAGREF_NULL) { goto exit; } if (!SdbTagRefToTagID(hSDB, trExe, &pdb, &tiExe)) { DBGPRINT((sdlError, "GetExeSxsData", "Failed to get the database the TAGREF 0x%x belongs to.\n", trExe)); goto exit; } tiSxsManifest = SdbFindFirstTag(pdb, tiExe, TAG_SXS_MANIFEST); if (!tiSxsManifest) { DBGPRINT((sdlInfo, "GetExeSxsData", "No SXS data for TAGREF 0x%x.\n", trExe)); goto exit; } pszManifest = SdbGetStringTagPtr(pdb, tiSxsManifest); if (pszManifest == NULL) { DBGPRINT((sdlError, "GetExeSxsData", "Failed to get manifest string tagid 0x%lx\n", tiSxsManifest)); goto exit; } dwManifestLength = wcslen(pszManifest); // // check if this is just a query for existance of the data tag // if (ppSxsData == NULL) { bReturn = TRUE; goto exit; } // // Allocate the string and return it. NOTE: SXS.DLL cannot handle // a NULL terminator at the end of the string. We must provide the // string without the NULL terminator. // pSxsData = (PVOID)RtlAllocateHeap(RtlProcessHeap(), HEAP_ZERO_MEMORY, dwManifestLength * sizeof(WCHAR)); if (pSxsData == NULL) { DBGPRINT((sdlError, "GetExeSxsData", "Failed to allocate %d bytes\n", dwManifestLength * sizeof(WCHAR))); goto exit; } RtlMoveMemory(pSxsData, pszManifest, dwManifestLength * sizeof(WCHAR)); bReturn = TRUE; exit: if (ppSxsData != NULL) { *ppSxsData = pSxsData; } if (pcbSxsData != NULL) { *pcbSxsData = dwManifestLength * sizeof(WCHAR); } return bReturn; }