RegQueryValueEx函数
0x01.功能介绍:
- 检索与打开的注册表项相关联的指定值名称的类型和数据。要确保返回的任何字符串值(
REG_SZ
,REG_MULTI_SZ
和REG_EXPAND_SZ
)为空终止,请使用RegGetValue
函数。
原型
LONG WINAPI RegQueryValueEx(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpValueName,
_Reserved_ LPDWORD lpReserved,
_Out_opt_ LPDWORD lpType,
_Out_opt_ LPBYTE lpData,
_Inout_opt_ LPDWORD lpcbData
);
返回值
Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。
参数
hKey [in]
打开注册表项的句柄。 该键必须已使用KEY_QUERY_VALUE
访问权限打开。 有关详细信息,请参阅注册表项安全性和访问权限。
此句柄由RegCreateKeyEx
,RegCreateKeyTransacted
,RegOpenKeyEx
或RegOpenKeyTransacted
函数返回。 它也可以是以下预定义键之一:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_PERFORMANCE_DATA
HKEY_PERFORMANCE_NLSTEXT
HKEY_PERFORMANCE_TEXT
HKEY_USERS
lpValueName [in,optional]
注册表值的名称。
如果lpValueName
为NULL
或空字符串“”,函数将检索键的未命名或默认值(如果有)的类型和数据。
如果lpValueName
指定不在注册表中的值,则函数返回ERROR_FILE_NOT_FOUND
。
键不会自动具有未命名或默认值。未命名的值可以是任何类型。有关详细信息,请参阅注册表元素大小限制。
lpReserved
此参数保留,必须为NULL
。
lpType [out,optional]
指向接收指示存储在指定值中的数据类型的代码的变量的指针。有关可能的类型代码的列表,请参见注册表值类型。如果不需要类型代码,则lpType
参数可以为NULL
。
lpData [out,optional]
指向接收值的数据的缓冲区的指针。如果不需要数据,此参数可以为NULL
。
lpcbData [in,out,optional]
指向指定由lpData
参数指向的缓冲区大小的变量的指针,以字节为单位。当函数返回时,此变量包含复制到lpData
的数据的大小。
lpcbData
参数只能在lpData
为NULL
时为NULL
。
如果数据具有REG_SZ
,REG_MULTI_SZ
或REG_EXPAND_SZ
类型,则此大小包括任何终止的空字符或字符,除非没有它们存储数据。有关详细信息,请参阅注释。
如果lpData
参数指定的缓冲区大小不足以容纳数据,则函数返回ERROR_MORE_DATA
并将所需的缓冲区大小存储在lpcbData
指向的变量中。在这种情况下,lpData
缓冲区的内容未定义。
如果lpData
为NULL
,并且lpcbData
为非NULL
,则函数返回ERROR_SUCCESS
并将数据大小(以字节为单位)存储在lpcbData
指向的变量中。这使应用程序能够确定为值的数据分配缓冲区的最佳方式。
如果hKey
指定了HKEY_PERFORMANCE_DATA
,并且lpData
缓冲区不足以包含所有返回的数据,则RegQueryValueEx
返回ERROR_MORE_DATA
,并且通过lpcbData
参数返回的值未定义。这是因为性能数据的大小可以从一个调用改变到下一个调用。在这种情况下,您必须增加缓冲区大小,并再次调用RegQueryValueEx
在lpcbData
参数中传递更新的缓冲区大小。重复此操作直到函数成功。您需要维护一个单独的变量以跟踪缓冲区大小,因为lpcbData
返回的值是不可预测的。
如果lpValueName
注册表值不存在,RegQueryValueEx
返回ERROR_FILE_NOT_FOUND
,并且通过lpcbData
参数返回的值未定义。
0x02.Example
#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#define TOTALBYTES 8192
#define BYTEINCREMENT 4096
void main()
{
DWORD BufferSize = TOTALBYTES;
DWORD cbData;
DWORD dwRet;
PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
cbData = BufferSize;
printf("\nRetrieving the data...");
dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
TEXT("Global"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData );
while( dwRet == ERROR_MORE_DATA )
{
// Get a buffer that is big enough.
BufferSize += BYTEINCREMENT;
PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
cbData = BufferSize;
printf(".");
dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
TEXT("Global"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData );
}
if( dwRet == ERROR_SUCCESS )
printf("\n\nFinal buffer size is %d\n", BufferSize);
else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
}