windows-nt/Source/XPSP1/NT/base/screg/sc/svchost/registry.c
2020-09-26 16:20:57 +08:00

216 lines
4.4 KiB
C

#include "pch.h"
#pragma hdrstop
#include "registry.h"
LONG
RegQueryDword (
IN HKEY hkey,
IN LPCTSTR pszValueName,
OUT LPDWORD pdwValue
)
{
LONG lr;
DWORD dwType;
DWORD dwSize;
ASSERT (hkey);
ASSERT (pszValueName);
ASSERT (pdwValue);
dwSize = sizeof(DWORD);
lr = RegQueryValueEx (
hkey,
pszValueName,
NULL,
&dwType,
(LPBYTE)pdwValue,
&dwSize);
if (!lr && (REG_DWORD != dwType))
{
*pdwValue = 0;
lr = ERROR_INVALID_DATATYPE;
}
return lr;
}
LONG
RegQueryValueWithAlloc (
IN HKEY hkey,
IN LPCTSTR pszValueName,
IN DWORD dwTypeMustBe,
OUT LPBYTE* ppbData,
OUT LPDWORD pdwSize
)
{
LONG lr;
DWORD dwType;
DWORD dwSize;
ASSERT (hkey);
ASSERT (pszValueName);
ASSERT (ppbData);
ASSERT (pdwSize);
// Initialize the output parameters.
//
*ppbData = NULL;
*pdwSize = 0;
// Get the size of the buffer required.
//
dwSize = 0;
lr = RegQueryValueEx (
hkey,
pszValueName,
NULL,
&dwType,
NULL,
&dwSize);
if (!lr && (dwType == dwTypeMustBe) && dwSize)
{
LPBYTE pbData;
// Allocate the buffer.
//
lr = ERROR_OUTOFMEMORY;
pbData = MemAlloc (0, dwSize);
if (pbData)
{
// Get the data.
//
lr = RegQueryValueEx (
hkey,
pszValueName,
NULL,
&dwType,
pbData,
&dwSize);
if (!lr)
{
*ppbData = pbData;
*pdwSize = dwSize;
}
else
{
MemFree (pbData);
}
}
}
else if (!lr)
{
lr = ERROR_INVALID_DATA;
}
return lr;
}
LONG
RegQueryString (
IN HKEY hkey,
IN LPCTSTR pszValueName,
IN DWORD dwTypeMustBe,
OUT PTSTR* ppszData
)
{
LONG lr;
DWORD dwSize;
ASSERT (hkey);
ASSERT (pszValueName);
lr = RegQueryValueWithAlloc (
hkey,
pszValueName,
dwTypeMustBe,
(LPBYTE*)ppszData,
&dwSize);
return lr;
}
LONG
RegQueryStringA (
IN HKEY hkey,
IN LPCTSTR pszValueName,
IN DWORD dwTypeMustBe,
OUT PSTR* ppszData
)
{
LONG lr;
PTSTR pszUnicode;
ASSERT (hkey);
ASSERT (pszValueName);
ASSERT (ppszData);
// Initialize the output parameter.
//
*ppszData = NULL;
lr = RegQueryString (
hkey,
pszValueName,
dwTypeMustBe,
&pszUnicode);
if (!lr)
{
INT cb;
INT cchUnicode = lstrlen (pszUnicode) + 1;
// Compute the number of bytes required to hold the ANSI string.
//
cb = WideCharToMultiByte (
CP_ACP, // CodePage
0, // dwFlags
pszUnicode,
cchUnicode,
NULL, // no buffer to receive translated string
0, // return the number of bytes required
NULL, // lpDefaultChar
NULL); // lpUsedDefaultChar
if (cb)
{
PSTR pszAnsi;
lr = ERROR_OUTOFMEMORY;
pszAnsi = MemAlloc (0, cb);
if (pszAnsi)
{
lr = NOERROR;
// Now translate the UNICODE string to ANSI.
//
cb = WideCharToMultiByte (
CP_ACP, // CodePage
0, // dwFlags
pszUnicode,
cchUnicode,
pszAnsi, // buffer to receive translated string
cb, // return the number of bytes required
NULL, // lpDefaultChar
NULL); // lpUsedDefaultChar
if (cb)
{
*ppszData = pszAnsi;
}
else
{
MemFree (pszAnsi);
lr = GetLastError ();
}
}
}
MemFree (pszUnicode);
}
return lr;
}