vc++高级班之注册表篇[2]---注册表中键的相关操作
来源:互联网 发布:巴西足球知乎 编辑:程序博客网 时间:2024/05/21 12:50
vc++高级班之注册表篇[2]---注册表中键的相关操作
----------------------------------------------------------------------------------------
①、键信息的获取:用到的API函数:RegQueryInfoKey
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
DWORD dwSubKeys = 0, maxSubKeyLen = 0, dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, &maxSubKeyLen, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
if (lRet == ERROR_SUCCESS) {
//
}
}
}
===================================================
②、子键的枚举操作:用到的API函数:RegEnumKeyEx
在进行子键的枚举操作时,要借助刚才给大家讲解的 RegQueryInfoKey 函数!
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
DWORD dwSubKeys = 0, maxSubKeyLen = 0, dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, &maxSubKeyLen, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
if (lRet == ERROR_SUCCESS) {
//Enum for the sub keys
DWORD dwNameLen = maxSubKeyLen+1;
TCHAR *pszName = new TCHAR[maxSubKeyLen+1];
for (DWORD dwIndex = 0; dwIndex < dwSubKeys; ++dwIndex) {
ZeroMemory(pszName, dwNameLen);
dwNameLen = maxSubKeyLen+1; //※※※
RegEnumKeyEx(hKey, dwIndex, pszName, &dwNameLen, NULL, NULL, NULL, NULL);
//Other operations
}
delete [] pszName;
}
RegCloseKey(hKey);
}
}
===================================================
③、键的备份与恢复:
备份:RegSaveKey:第二个参数 lpFile 为保存信息的文件名称,这个文件必须是不存在的
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
EnableTargetPriv(SE_BACKUP_NAME);
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
lRet = RegSaveKey(hKey, _T("C:\\123"), NULL);
RegCloseKey(hKey);
}
}
恢复:RegRestoreKey:
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
EnableTargetPriv(SE_RESTORE_NAME);
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
LPCTSTR lpszFile = _T("C:\\123");
lRet = RegRestoreKey(hKey, lpszFile, REG_FORCE_RESTORE);
RegCloseKey(hKey);
}
}
#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@
BOOL EnableTargetPriv(LPTSTR lpszPrivilege)
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tkp = {0};
if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) {
return FALSE;
}
if ( !LookupPrivilegeValue( NULL, lpszPrivilege, &tkp.Privileges[0].Luid ) ) {
CloseHandle( hToken );
return FALSE;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ) ) {
CloseHandle( hToken );
return FALSE;
}
return TRUE;
}
===================================================
※※※ 小作业:
1、实践本节课给大家讲解的各个 API 函数的使用;
2、时间允许的话,大家可以以树形控件为例,枚举指定注册表键下的子键,用树形控件进行显示!
------------------------------------- End -------------------------------------------
----------------------------------------------------------------------------------------
①、键信息的获取:用到的API函数:RegQueryInfoKey
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
DWORD dwSubKeys = 0, maxSubKeyLen = 0, dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, &maxSubKeyLen, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
if (lRet == ERROR_SUCCESS) {
//
}
}
}
===================================================
②、子键的枚举操作:用到的API函数:RegEnumKeyEx
在进行子键的枚举操作时,要借助刚才给大家讲解的 RegQueryInfoKey 函数!
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
DWORD dwSubKeys = 0, maxSubKeyLen = 0, dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, &maxSubKeyLen, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
if (lRet == ERROR_SUCCESS) {
//Enum for the sub keys
DWORD dwNameLen = maxSubKeyLen+1;
TCHAR *pszName = new TCHAR[maxSubKeyLen+1];
for (DWORD dwIndex = 0; dwIndex < dwSubKeys; ++dwIndex) {
ZeroMemory(pszName, dwNameLen);
dwNameLen = maxSubKeyLen+1; //※※※
RegEnumKeyEx(hKey, dwIndex, pszName, &dwNameLen, NULL, NULL, NULL, NULL);
//Other operations
}
delete [] pszName;
}
RegCloseKey(hKey);
}
}
===================================================
③、键的备份与恢复:
备份:RegSaveKey:第二个参数 lpFile 为保存信息的文件名称,这个文件必须是不存在的
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
EnableTargetPriv(SE_BACKUP_NAME);
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
lRet = RegSaveKey(hKey, _T("C:\\123"), NULL);
RegCloseKey(hKey);
}
}
恢复:RegRestoreKey:
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
EnableTargetPriv(SE_RESTORE_NAME);
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
LPCTSTR lpszFile = _T("C:\\123");
lRet = RegRestoreKey(hKey, lpszFile, REG_FORCE_RESTORE);
RegCloseKey(hKey);
}
}
#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@
BOOL EnableTargetPriv(LPTSTR lpszPrivilege)
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tkp = {0};
if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) {
return FALSE;
}
if ( !LookupPrivilegeValue( NULL, lpszPrivilege, &tkp.Privileges[0].Luid ) ) {
CloseHandle( hToken );
return FALSE;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ) ) {
CloseHandle( hToken );
return FALSE;
}
return TRUE;
}
===================================================
※※※ 小作业:
1、实践本节课给大家讲解的各个 API 函数的使用;
2、时间允许的话,大家可以以树形控件为例,枚举指定注册表键下的子键,用树形控件进行显示!
------------------------------------- End -------------------------------------------
- vc++高级班之注册表篇[2]---注册表中键的相关操作
- vc++高级班之注册表篇[3]---注册表中键值的相关操作
- VC之注册表相关操作
- vc++高级班之注册表篇[1]---认识并操作注册表
- 注册表的相关操作
- VC中操作注册表的实现源码
- vc中注册表的一些简单操作
- VC++ 中对注册表的操作
- VC++ 中对注册表的操作
- VC中注册表的读写修改操作
- vc++高级班之注册表篇[4]---其他类型键值的设置
- vc++高级班之注册表篇[5]---提权打开SAM子键
- VC中简单操作注册表
- VC中简单操作注册表
- VC中简单操作注册表
- VC中简单操作注册表
- VC中简单操作注册表
- VC中操作注册表的一些函数(基础).
- struts2标签<s:if>和部分表达式的使用
- 协方差矩阵的含义与使用
- 面向对象之继承,封装,多态c语言实现
- GDI+笔记
- 以特定字符相隔or以空格相隔的字符串分割
- vc++高级班之注册表篇[2]---注册表中键的相关操作
- 《Android深度探索(卷1):HAL与驱动开发》虚拟实验环境(Ubuntu Linux)及源代码免费下载,不需要CPU虚拟化支持
- XML解析(SAX详解)
- vc++高级班之注册表篇[3]---注册表中键值的相关操作
- 1004 大数
- Android---把用户带入另外一个应用程序(二)
- Objective-C 协议 简介 +委托的实现
- XML解析(SAX详解)
- 区分虚拟网卡与物理网卡