RegCreateKeyEx函数:创建指定的注册表项。如果键已经存在,函数将打开它。

LONG RegCreateKeyEx(HKEY hKey,                                  // handle to open key
  LPCTSTR lpSubKey,                           // subkey name
  DWORD Reserved,                             // reserved
  LPTSTR lpClass,                             // class string
  DWORD dwOptions,                            // special options
  REGSAM samDesired,                          // desired security access
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance
  PHKEY phkResult,                            // key handle
  LPDWORD lpdwDisposition                     // disposition value buffer
);

参数

hkey:当前打开的密钥或以下预定义密钥之一的句柄:

HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Windows NT / 2000 / XP:HKEY_PERFORMANCE_DATA
Windows 95/98 / Me:HKEY_DYN_DATA

RegCreateKeyEx函数打开或创建的键是由hKey参数标识的键的子键。

lpSubKey: 指向空终止字符串的指针,该字符串指定此函数打开或创建的子键的名称。指定的子键必须是由hKey参数标识的键的子键。这个参数不能为空。
Windows NT/2000/XP: lpSubKey指定的子键名不能以反斜杠字符('\')开头。如果是,则返回ERROR_BAD_PATHNAME。

Windows 95/98/Me:忽略lpSubKey指定的子键名称中的开始反斜杠字符。

Reserved:保留;必须是零。

lpClass:指向空终止字符串的指针,该字符串指定此键的类(对象类型)。如果键已经存在,则忽略此参数。目前没有定义类;应用程序应该传递一个空字符串。Windows 95和Windows 98只对远程注册表键使用此参数;对于本地注册表项,它是被忽略的。对于本地和远程注册表键,Windows NT/Windows 2000都支持此参数。

dwOptions :指定密钥的特殊选项。此参数可以是以下值之一。REG_OPTION_NON_VOLATILE、REG_OPTION_VOLATILE、REG_OPTION_BACKUP_RESTORE。

samDesired :一个访问掩码,它指定对密钥的期望访问权限。这个参数可以是以下值的组合。KEY_CREATE_LINK、KEY_CREATE_SUB_KEY、KEY_ENUMERATE_SUB_KEYS、KEY_EXECUTE、KEY_NOTIFY、KEY_QUERY_VALUE、KEY_SET_VALUE、KEY_ALL_ACCESS、KEY_READ、KEY_WOW64_64KEY、KEY_WOW64_32KEY、KEY_WRITE。

lpSecurityAttributes :一个SECURITY_ATTRIBUTES结构的指针,该结构确定返回的句柄是否可以被子进程继承。如果lpSecurityAttributes为NULL,则不能继承该句柄。

Windows NT/2000/XP:结构的lpSecurityDescriptor成员为新密钥指定了安全描述符。如果lpSecurityAttributes为空,则该键获得一个默认的安全描述符。

phkResult :指向一个变量的指针,该变量接收以下配置值之一。REG_CREATED_NEW_KEY、REG_OPENED_EXISTING_KEY,

返回值

如果函数成功,返回值为ERROR_SUCCESS。

如果函数失败,返回值是Winerror.h中定义的非零错误代码。您可以使用FormatMessage函数和FORMAT_MESSAGE_FROM_SYSTEM标志来获得错误的通用描述。

示例代码:

#include <windows.h>
#include <stdio.h>
#include <aclapi.h>void main(int argc, char *argv[]) {DWORD dwRes, dwDisposition;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
SECURITY_ATTRIBUTES sa;
LONG lRes;
HKEY hkSub = NULL;// Create a well-known SID for the Everyone group.if(! AllocateAndInitializeSid( &SIDAuthWorld, 1,SECURITY_WORLD_RID,0, 0, 0, 0, 0, 0, 0,&pEveryoneSID) ) {printf( "AllocateAndInitializeSid Error %u\n", GetLastError() );return;
}// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = KEY_READ;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName  = (LPTSTR) pEveryoneSID;// Create a SID for the BUILTIN\Administrators group.if(! AllocateAndInitializeSid( &SIDAuthNT, 2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0, 0, 0, 0, 0, 0,&pAdminSID) ) {printf( "AllocateAndInitializeSid Error %u\n", GetLastError() );goto Cleanup;
}// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow the Administrators group full access to the key.ea[1].grfAccessPermissions = KEY_ALL_ACCESS;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance= NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName  = (LPTSTR) pAdminSID;// Create a new ACL that contains the new ACEs.dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);
if (ERROR_SUCCESS != dwRes) {printf( "SetEntriesInAcl Error %u\n", GetLastError() );goto Cleanup;
}// Initialize a security descriptor.  pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (pSD == NULL) { printf( "LocalAlloc Error %u\n", GetLastError() );goto Cleanup;
} if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {  printf( "InitializeSecurityDescriptor Error %u\n", GetLastError() );goto Cleanup;
} // Add the ACL to the security descriptor. if (!SetSecurityDescriptorDacl(pSD, TRUE,     // fDaclPresent flag   pACL, FALSE))   // not a default DACL
{  printf( "SetSecurityDescriptorDacl Error %u\n", GetLastError() );goto Cleanup;
} // Initialize a security attributes structure.sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;// Use the security attributes to set the security descriptor
// when you create a key.lRes = RegCreateKeyEx(HKEY_CURRENT_USER, "mykey", 0, "", 0, KEY_READ | KEY_WRITE, &sa, &hkSub, &dwDisposition);
printf( "RegCreateKeyEx result %u\n", lRes );Cleanup:if (pEveryoneSID) FreeSid(pEveryoneSID);if (pAdminSID) FreeSid(pAdminSID);if (pACL) LocalFree(pACL);if (pSD) LocalFree(pSD);if (hkSub) RegCloseKey(hkSub);return;}

RegCreateKeyEx函数相关推荐

  1. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  2. Windows.h 常用API函数【转】

    转自:https://blog.csdn.net/farmwang/article/details/50603608 http://www.vbgood.com/api.html http://hi. ...

  3. windows常用 API函数

    系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个 ...

  4. VC API常用函数简单例子大全

    VC API常用函数简单例子大全 http://hi.baidu.com/tag/vc%20api%E5%87%BD%E6%95%B0/feeds 系统API查询 http://www.vbgood. ...

  5. VC API 常用函数简单例子大全

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  6. VC API常用函数

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName ...

  7. windows常用API函数

    windows常用API函数 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ff ...

  8. WINCE6.0隐藏文件夹和应用程序访问物理寄存器

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  9. WINCE流驱动的自动加载

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

最新文章

  1. python使用缩进作为语法边界、一般建议缩进()_Python百题计划
  2. MATLAB中常用的排列、组合、阶乘函数
  3. Linux set命令参数及与env, export的区别
  4. hdu 1023 大数 卡特兰数
  5. Leetcode--343. 整数拆分
  6. 解决python调试模型时,多次重复加载数据集与模型,节约大量等待时间
  7. VTK7.0.0编译安装心得
  8. map、forEach与filter实例详解
  9. Segment Advisor
  10. linux下docker部署nginx
  11. Android ADB命令?这一次我再也不死记了!【简单说】
  12. 深度学习笔记_基本概念_Depthwise卷积与Pointwise卷积
  13. 代数学笔记1: 域扩张(一)
  14. project实操——项目实例
  15. 单例模式及常用使用场景简析
  16. Save Apply mechanism of luci
  17. 20本父母必读的亲子教育书籍
  18. 【一句日历】2019年9月
  19. linux下浏览器插件 打开本地程序,使用Url Schemes打开本地程序
  20. 利用2阶分数阶微分掩模的边缘检测(Matlab代码实现)

热门文章

  1. C++中延时的几种使用方式
  2. Smarty-3.1.12配置
  3. 2021 市场上cmr硬盘盘点
  4. 我的程序人生路——雷军(2)
  5. 《软件测试经验与教训》读书笔记---第二章
  6. Word 2013去掉封面和目录的页眉
  7. 个人博客类网站为什么更适合虚拟主机?
  8. WebSocket WebSocket的简单用法 WebSocket的使用
  9. VS2015_VisualStudio2015-Professional版
  10. 在忙碌的工作中如何保持高效率?