python / python/cpython

[winreg] support options and opened disposition in CreateKeyEx and OpenKey[Ex]

未關閉
#95,461 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

3.13 OS-windows type-feature
主要語言
Python
星號
77.2k
分支
36k
PR 合併指標
PR 指標待擷取

描述

winreg.CreateKeyEx() should support the dwOptions and lpdwDisposition parameters of RegCreateKeyExW(), and winreg.OpenKey[Ex]() should support the ulOptions parameter of RegOpenKeyExW(). Also, the REG_LINK data type should be handled as a null-terminated Unicode string instead of as binary data.

The lpdwDisposition parameter can be supported indirectly by a new create_only parameter. If create_only is true and the opened disposition is REG_OPENED_EXISTING_KEY, close the handle and raise FileExistsError.

The dwOptions and ulOptions parameters can be supported as a new options parameter. Currently ulOptions is supported as a parameter named reserved, but RegOpenKeyExW() has been documented to support it since 2015. Unofficially, RegOpenKeyExW() first implemented support for REG_OPTION_OPEN_LINK in NT 4.0 (1996). The misnamed reserved parameter has to be retained for compatibility, but options should override it.

For example:

CreateKeyEx(key, sub_key, reserved=0, access=KEY_WRITE, options=0, create_only=False)
OpenKeyEx(key, sub_key, reserved=0, access=KEY_READ, options=0)

RegCreateKeyExW() supports the following options:

  • REG_OPTION_VOLATILE: create a dynamic key in memory that's never persisted to a hive file. This is useful for keys that should always be newly created for each session (e.g. "HKCU\Volatile Environment") or for test cases that shouldn't permanently modify a hive.
  • REG_OPTION_CREATE_LINK: create a key symbolic link. The NT target path has to be set as a REG_LINK value named "SymbolicLinkValue". The registry API supports creating and modifying symbolic links, but deleting a symbolic link requires NTAPI NtDeleteKey(KeyHandle).
  • REG_OPTION_OPEN_LINK: open a symbolic link to modify its target path or to delete it via NtDeleteKey().
  • REG_OPTION_BACKUP_RESTORE: use backup semantics. If "SeBackupPrivilege" is enabled for the thread or process, then the open is granted read access and system security (SACL) access. If "SeRestorePrivilege" is enabled, then the open is granted write access, delete access, security access, and system security access. All access is granted if both privileges are enabled. If neither privilege is enabled, the call fails with access denied.
  • REG_OPTION_DONT_VIRTUALIZE: disable open, read, and write virtualization for non-admin, interactive logons in legacy 32-bit processes. This isn't relevant to a 32-bit "python[w].exe" process or any 32-bit application that has a "requestedExecutionLevel" in its manifest.

RegOpenKeyExW() supports the following options:

  • REG_OPTION_OPEN_LINK
  • REG_OPTION_BACKUP_RESTORE
  • REG_OPTION_DONT_VIRTUALIZE
Linked PRs
  • gh-129903

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

從 winreg.CreateKeyEx()、winreg.OpenKey() 和 winreg.OpenKeyEx() 入口點開始,將它們的參數與 RegCreateKeyExW() 和 RegOpenKeyExW() 進行比較。確認要求的選項、create_only 行為以及 REG_LINK 的 Unicode 處理,然後執行相關的 winreg 測試,以驗證新鍵、現有鍵和符號連結的情況。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
operating-systems
Issue 類型
功能
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
基本清楚
新手友好度
25/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。