blob: dfa676cdf71587e050ebda401013ab92d1cfcb71 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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);
}