RegQueryValueEx函数

RegQueryValueEx函数用于检索注册表项中指定值的类型和数据。它需要已打开的注册表项句柄,并支持获取不同类型的数据。如果值不存在,函数会返回错误代码。提供的示例代码展示了如何使用该函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RegQueryValueEx函数

0x01.功能介绍:

  • 检索与打开的注册表项相关联的指定值名称的类型和数据。要确保返回的任何字符串值(REG_SZREG_MULTI_SZREG_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访问权限打开。 有关详细信息,请参阅注册表项安全性和访问权限。
此句柄由RegCreateKeyExRegCreateKeyTransactedRegOpenKeyExRegOpenKeyTransacted函数返回。 它也可以是以下预定义键之一:

HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_PERFORMANCE_DATA
HKEY_PERFORMANCE_NLSTEXT
HKEY_PERFORMANCE_TEXT
HKEY_USERS
lpValueName [inoptional]

注册表值的名称。
如果lpValueNameNULL或空字符串“”,函数将检索键的未命名或默认值(如果有)的类型和数据。
如果lpValueName指定不在注册表中的值,则函数返回ERROR_FILE_NOT_FOUND
键不会自动具有未命名或默认值。未命名的值可以是任何类型。有关详细信息,请参阅注册表元素大小限制。

lpReserved

此参数保留,必须为NULL

lpType [out,optional]

指向接收指示存储在指定值中的数据类型的代码的变量的指针。有关可能的类型代码的列表,请参见注册表值类型。如果不需要类型代码,则lpType参数可以为NULL

lpData [out,optional]

指向接收值的数据的缓冲区的指针。如果不需要数据,此参数可以为NULL

lpcbData [inout,optional]

指向指定由lpData参数指向的缓冲区大小的变量的指针,以字节为单位。当函数返回时,此变量包含复制到lpData的数据的大小。
lpcbData参数只能在lpDataNULL时为NULL
如果数据具有REG_SZREG_MULTI_SZREG_EXPAND_SZ类型,则此大小包括任何终止的空字符或字符,除非没有它们存储数据。有关详细信息,请参阅注释。

如果lpData参数指定的缓冲区大小不足以容纳数据,则函数返回ERROR_MORE_DATA并将所需的缓冲区大小存储在lpcbData指向的变量中。在这种情况下,lpData缓冲区的内容未定义。
如果lpDataNULL,并且lpcbData为非NULL,则函数返回ERROR_SUCCESS并将数据大小(以字节为单位)存储在lpcbData指向的变量中。这使应用程序能够确定为值的数据分配缓冲区的最佳方式。

如果hKey指定了HKEY_PERFORMANCE_DATA,并且lpData缓冲区不足以包含所有返回的数据,则RegQueryValueEx返回ERROR_MORE_DATA,并且通过lpcbData参数返回的值未定义。这是因为性能数据的大小可以从一个调用改变到下一个调用。在这种情况下,您必须增加缓冲区大小,并再次调用RegQueryValueExlpcbData参数中传递更新的缓冲区大小。重复此操作直到函数成功。您需要维护一个单独的变量以跟踪缓冲区大小,因为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);
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值