yww
yww
驱动牛犊
驱动牛犊
  • 注册日期2001-05-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分322分
  • 威望34点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
阅读:2280回复:2

用ZwOpenKey老是出错!

楼主#
更多 发布于:2001-10-17 10:43
我的程序需要在响应Deviceiocontrol的时候读注册表,获得一个值:

我这么调用:
ULONG value;
GetRegValueDword(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\mykey", L"test", &value);
其中函数的定义如下:
int GetRegValueDword(PCWSTR RegPath,PCWSTR ValueName,PULONG Value)
{
    int                             ReturnValue = 0;
    NTSTATUS                        Status;
    OBJECT_ATTRIBUTES               ObjectAttributes;
    HANDLE                          KeyHandle;
    KEY_VALUE_PARTIAL_INFORMATION   *Information;
    ULONG                           InformationSize;
    UNICODE_STRING                  UnicodeRegPath;
    UNICODE_STRING                  UnicodeValueName;

    RtlInitUnicodeString(&UnicodeRegPath, RegPath);
    RtlInitUnicodeString(&UnicodeValueName, ValueName);

    InitializeObjectAttributes(&ObjectAttributes,
                               &UnicodeRegPath,
                               OBJ_CASE_INSENSITIVE,           // Flags
                               NULL,        // Root directory
                               NULL);       // Security descriptor

    Status = ZwOpenKey(&KeyHandle,
                       KEY_ALL_ACCESS,
                       &ObjectAttributes);
    if (Status != STATUS_SUCCESS)
    {
        return 0;
    }

    InformationSize = sizeof(Information) + sizeof(ULONG);
    Information = (KEY_VALUE_PARTIAL_INFORMATION*)ExAllocatePoolWithTag(PagedPool, InformationSize,'ISmD'); //  DmSI

    if (Information == NULL)
    {
        ZwClose(KeyHandle);
        return 0;
    }

    Status = ZwQueryValueKey(KeyHandle,
                             &UnicodeValueName,
                             KeyValuePartialInformation,
                             Information,
                             sizeof(Information),
                             &InformationSize);
    if (Status == STATUS_SUCCESS)
    {
        if (Information->Type == REG_DWORD && Information->DataLength == sizeof(ULONG))
        {
            RtlCopyMemory(Value, Information->Data, sizeof(ULONG));
            ReturnValue = 1;
        }
    }                                
    ExFreePool(Information);
    ZwClose(KeyHandle);
    return ReturnValue;                                
}
经过跟踪发现,ZwopenKey不能打开注册表,请问为什么?
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-11-12 14:56
可能是CurrentControlSet还没有映射.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
jinsanlen
驱动牛犊
驱动牛犊
  • 注册日期2005-06-10
  • 最后登录2005-10-04
  • 粉丝0
  • 关注0
  • 积分-1分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-16 16:48
有没有大侠能给几个读写注册表成功的例子啊,先谢啦
Jin
游客

返回顶部