Delphi - 将NtCreateKey与HKCU一起使用

Jos*_*ine 2 delphi registry winapi delphi-7

并感谢您抽出宝贵时间来审视我的问题.

我正在尝试使用本机NtCreateKey API在HKCU中创建一个密钥.

我有一个来源可以帮助我理解API的工作原理,但我似乎无法使其适用于HKCU,只有HKLM ......这可能吗?

源代码我已经:

const
   KeyNameBuffer: AnsiString = '\Registry\Machine\SOFTWARE'; //Assuming I need to change this.....
   NewKeyNameBuffer: AnsiString = 'Parent Key To Create';
   HiddenKeyNameBuffer: AnsiString = 'Main Key To Create';
   HiddenValueNameBuffer: AnsiString = 'Value Key To Create';

 procedure TForm1.btnDemoClick(Sender: TObject);
 var
    KeyName, ValueName: UNICODE_STRING;
    SoftwareKeyHandle, SysKeyHandle, HiddenKeyHandle: THandle;
    Status: ULONG;
    ObjectAttributes: OBJECT_ATTRIBUTES;
    Disposition: ULONG;
    Buffer: array of WideChar;
 begin

    //
    // Open the Software key
    //
   SetLength(Buffer, Length(KeyNameBuffer));
   MultiByteToWideChar(CP_UTF8, 0, @KeyNameBuffer[1], Length(KeyNameBuffer),
       PWideChar(Buffer), Length(Buffer));
   KeyName.Buffer := @Buffer[0];
    KeyName.Length := Length(KeyNameBuffer) * SizeOf(WideChar);
    InitializeObjectAttributes(ObjectAttributes, @KeyName, OBJ_CASE_INSENSITIVE,
       0, nil);
    Status := NtCreateKey(SoftwareKeyHandle, KEY_ALL_ACCESS, ObjectAttributes, 0,
       nil, REG_OPTION_NON_VOLATILE, Disposition);
    if not NT_SUCCESS(Status) then
      raise Exception.Create('Error: Couldn''t open HKLM\Software');
 end;
Run Code Online (Sandbox Code Playgroud)

我的所有类型定义和API声明都是在代码之上进行的,我只是不认为它必须全部发布.

我使用的是Delphi 7 IDE.

任何有关解决此问题的帮助将不胜感激.

谢谢.

Dav*_*nan 5

我相信你应该RegCreateKeyEx为此而使用.

但是,您的问题的答案是HKCU的相应密钥名称是:

\Registry\User\<Users_SID>
Run Code Online (Sandbox Code Playgroud)

当然,您必须为当前用户提供SID.这是Win32 API为您提供的众多服务之一RegCreateKeyEx.