//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "ParserPch.h" #include "errstr.h" // scaffolding - get a g_hInstance from scrbgase.cpp HANDLE g_hInstance; // Used as a prefix to generate the resource dll name. const char16 g_wszPrefix[] = _u("js"); static BOOL FGetStringFromLibrary(HMODULE hlib, int istring, __out_ecount(cchMax) WCHAR * psz, int cchMax) { // NOTE - istring is expected to be HRESULT Assert(0 < cchMax); Assert(psz); HGLOBAL hgl = NULL; WCHAR * pchRes = NULL; HRSRC hrsrc; WCHAR * pchCur; int cch; int cstring; DWORD cbRes; int itable = ((WORD)istring >> 4) + 1; istring &= 0x0F; BOOL fRet = FALSE; #ifdef ENABLE_GLOBALIZATION psz[0] = '\0'; if (NULL == hlib) goto LError; hrsrc = FindResourceEx((HMODULE)hlib, RT_STRING, MAKEINTRESOURCE(itable), 0); if (NULL == hrsrc) goto LError; hgl = LoadResource((HMODULE)hlib, hrsrc); if (NULL == hgl) goto LError; pchRes = (WCHAR *)LockResource(hgl); if (NULL == pchRes) goto LError; cbRes = SizeofResource((HMODULE)hlib, hrsrc); if (cbRes < sizeof(WORD)) goto LError; pchCur = pchRes; for (cstring = istring; cstring-- > 0;) { if (cbRes - sizeof(WORD) < sizeof(WCHAR) * (pchCur - pchRes)) goto LError; cch = (*(WORD *) pchCur) + 1; if (cch <= 0) goto LError; if (cbRes < sizeof(WCHAR) * cch) goto LError; if (cbRes - sizeof(WCHAR) * cch < sizeof(WCHAR) * (pchCur - pchRes)) goto LError; pchCur += cch; } if (cbRes - sizeof(WORD) < sizeof(WCHAR) * (pchCur - pchRes)) goto LError; cch = * (WORD *) pchCur; if (cch <= 0) goto LError; if (cbRes < sizeof(WCHAR) * (cch + 1)) goto LError; if (cbRes - sizeof(WCHAR) * (cch + 1) < sizeof(WCHAR) * (pchCur - pchRes)) goto LError; if (cch > cchMax - 1) cch = cchMax - 1; js_memcpy_s(psz, cchMax * sizeof(WCHAR), pchCur + 1, cch * sizeof(WCHAR)); psz[cch] = '\0'; fRet = TRUE; LError: #if !defined(_WIN32) // // Unlock/FreeResource non-essential on win32/64. // if (NULL != hgl) { if (NULL != pchRes) UnlockResource(hgl); FreeResource(hgl); } #endif // !defined(_WIN32) #endif // ENABLE_GLOBALIZATION return fRet; } BOOL FGetResourceString(int32 isz, __out_ecount(cchMax) OLECHAR *psz, int cchMax) { return FGetStringFromLibrary((HINSTANCE)g_hInstance, isz, psz, cchMax); } // Get a bstr version of the error string _NOINLINE // Don't inline. This function needs 2KB stack. BSTR BstrGetResourceString(int32 isz) { // NOTE - isz is expected to be HRESULT #ifdef _WIN32 OLECHAR szT[1024]; if (!FGetResourceString(isz, szT, sizeof(szT) / sizeof(szT[0]) - 1)) { return NULL; } #else const char16* LoadResourceStr(UINT id); UINT id = (WORD)isz; const char16* szT = LoadResourceStr(id); if (!szT || !szT[0]) { return NULL; } #endif return SysAllocString(szT); }