RegLoadMUIString() proofed
This commit is contained in:
parent
d7d314f128
commit
0fcfe95e84
@ -1203,34 +1203,16 @@ inline LSTATUS RegQueryValueExW(_In_ HKEY hKey, _In_opt_ LPCWSTR lpValueName, __
|
|||||||
template<class _Elem, class _Traits, class _Ax>
|
template<class _Elem, class _Traits, class _Ax>
|
||||||
inline LSTATUS RegLoadMUIStringA(_In_ HKEY hKey, _In_opt_ LPCSTR pszValue, _Out_ std::basic_string<_Elem, _Traits, _Ax> &sOut, _In_ DWORD Flags, _In_opt_ LPCSTR pszDirectory)
|
inline LSTATUS RegLoadMUIStringA(_In_ HKEY hKey, _In_opt_ LPCSTR pszValue, _Out_ std::basic_string<_Elem, _Traits, _Ax> &sOut, _In_ DWORD Flags, _In_opt_ LPCSTR pszDirectory)
|
||||||
{
|
{
|
||||||
assert(0); // TODO: Test this code.
|
// According to "Remarks" section in MSDN documentation of RegLoadMUIString(),
|
||||||
|
// this function is defined but not implemented as ANSI variation.
|
||||||
LSTATUS lResult;
|
assert(0);
|
||||||
_Elem szStackBuffer[WINSTD_STACK_BUFFER_BYTES/sizeof(_Elem)];
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||||
DWORD dwSize;
|
|
||||||
|
|
||||||
Flags &= ~REG_MUI_STRING_TRUNCATE;
|
|
||||||
|
|
||||||
// Try with stack buffer first.
|
|
||||||
lResult = RegLoadMUIStringA(hKey, pszValue, szStackBuffer, _countof(szStackBuffer), &dwSize, Flags, pszDirectory);
|
|
||||||
if (lResult == ERROR_SUCCESS) {
|
|
||||||
// Copy from stack buffer.
|
|
||||||
sOut.assign(szStackBuffer, dwSize);
|
|
||||||
} else if (lResult == ERROR_MORE_DATA) {
|
|
||||||
// Allocate buffer on heap and retry.
|
|
||||||
std::unique_ptr<_Elem[]> szBuffer(new _Elem[dwSize + 1]);
|
|
||||||
sOut.assign(szBuffer.get(), (lResult = RegLoadMUIStringA(hKey, pszValue, szBuffer.get(), dwSize, &dwSize, Flags, pszDirectory)) == ERROR_SUCCESS ? dwSize : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return lResult;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class _Elem, class _Traits, class _Ax>
|
template<class _Elem, class _Traits, class _Ax>
|
||||||
inline LSTATUS RegLoadMUIStringW(_In_ HKEY hKey, _In_opt_ LPCWSTR pszValue, _Out_ std::basic_string<_Elem, _Traits, _Ax> &sOut, _In_ DWORD Flags, _In_opt_ LPCWSTR pszDirectory)
|
inline LSTATUS RegLoadMUIStringW(_In_ HKEY hKey, _In_opt_ LPCWSTR pszValue, _Out_ std::basic_string<_Elem, _Traits, _Ax> &sOut, _In_ DWORD Flags, _In_opt_ LPCWSTR pszDirectory)
|
||||||
{
|
{
|
||||||
assert(0); // TODO: Test this code.
|
|
||||||
|
|
||||||
LSTATUS lResult;
|
LSTATUS lResult;
|
||||||
_Elem szStackBuffer[WINSTD_STACK_BUFFER_BYTES/sizeof(_Elem)];
|
_Elem szStackBuffer[WINSTD_STACK_BUFFER_BYTES/sizeof(_Elem)];
|
||||||
DWORD dwSize;
|
DWORD dwSize;
|
||||||
@ -1238,14 +1220,14 @@ inline LSTATUS RegLoadMUIStringW(_In_ HKEY hKey, _In_opt_ LPCWSTR pszValue, _Out
|
|||||||
Flags &= ~REG_MUI_STRING_TRUNCATE;
|
Flags &= ~REG_MUI_STRING_TRUNCATE;
|
||||||
|
|
||||||
// Try with stack buffer first.
|
// Try with stack buffer first.
|
||||||
lResult = RegLoadMUIStringW(hKey, pszValue, szStackBuffer, _countof(szStackBuffer), &dwSize, Flags, pszDirectory);
|
lResult = RegLoadMUIStringW(hKey, pszValue, szStackBuffer, sizeof(szStackBuffer), &dwSize, Flags, pszDirectory);
|
||||||
if (lResult == ERROR_SUCCESS) {
|
if (lResult == ERROR_SUCCESS) {
|
||||||
// Copy from stack buffer.
|
// Copy from stack buffer.
|
||||||
sOut.assign(szStackBuffer, dwSize);
|
sOut.assign(szStackBuffer, wcsnlen(szStackBuffer, dwSize/sizeof(_Elem)));
|
||||||
} else if (lResult == ERROR_MORE_DATA) {
|
} else if (lResult == ERROR_MORE_DATA) {
|
||||||
// Allocate buffer on heap and retry.
|
// Allocate buffer on heap and retry.
|
||||||
std::unique_ptr<_Elem[]> szBuffer(new _Elem[dwSize + 1]);
|
std::unique_ptr<_Elem[]> szBuffer(new _Elem[(dwSize + sizeof(_Elem) - 1)/sizeof(_Elem)]);
|
||||||
sOut.assign(szBuffer.get(), (lResult = RegLoadMUIStringW(hKey, pszValue, szBuffer.get(), dwSize, &dwSize, Flags, pszDirectory)) == ERROR_SUCCESS ? dwSize : 0);
|
sOut.assign(szBuffer.get(), (lResult = RegLoadMUIStringW(hKey, pszValue, szBuffer.get(), dwSize, &dwSize, Flags, pszDirectory)) == ERROR_SUCCESS ? wcsnlen(szBuffer.get(), dwSize/sizeof(_Elem)) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return lResult;
|
return lResult;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user