写程序经常用到注册表操作,特别麻烦.把一些常用的操作总结如下:
RING3:
1.枚举键下的keyvalue值:
BOOL RegKeyValueEnum(WCHAR *szKey)
{
HKEY hkey;
WCHAR RegBufferLocal[100];
DWORD dwSize=100;
DWORD dwVSize = 0;
DWORD dIndex=0;
DWORD type=REG_SZ;
if (szKey == NULL)
{
printf("szKey == NULL\n");
return FALSE;
}
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,szKey,0,KEY_ALL_ACCESS,&hkey) != ERROR_SUCCESS)
{
printf("Open Failed\n");
return FALSE;
}
while(RegEnumValueW(hkey,dIndex,RegBufferLocal,&dwSize,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
{
dIndex++;
dwSize = 100;
printf("%ws\n", RegBufferLocal);
WCHAR szKeyValue[MAX_PATH] = {0};
dwVSize = MAX_PATH*sizeof(WCHAR);
if (RegQueryValueExW(hkey, RegBufferLocal, NULL, &type, (LPBYTE)szKeyValue, &dwVSize) != ERROR_SUCCESS)
{
continue;
}
printf("%ws\n", szKeyValue);
}
RegCloseKey( hkey);
return TRUE;
}
2.查询某键下的默认值:
BOOL GetKeyDefaultValue(WCHAR *extName, WCHAR *buf)
{
HKEY hKEY = NULL;
DWORD dwSize = 0;
DWORD type=REG_SZ;
if (extName == NULL)
{
return FALSE;
}
if (RegOpenKeyExW(HKEY_CLASSES_ROOT,extName, 0, KEY_READ, &hKEY) != ERROR_SUCCESS)
{
return FALSE;
}
if (RegQueryValueExW(hKEY, L"", NULL, &type, NULL, &dwSize) != ERROR_SUCCESS)
{
return FALSE;
}
if (RegQueryValueExW(hKEY, L"", NULL, &type, (LPBYTE)buf, &dwSize) != ERROR_SUCCESS)
{
return FALSE;
}
RegCloseKey(hKEY);
return TRUE;
}
3。枚举子键:
void RegEnumKey()
{
HKEY hKey;
WCHAR *lpSubKey= L"HARDWARE\\";
long ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey);
if (ERROR_SUCCESS != ret)
return;
WCHAR achKey[MAX_PATH];
DWORD cbMaxSubKey = MAX_PATH;
DWORD i = 0;
while (RegEnumKeyExW(hKey, i, achKey, &cbMaxSubKey, NULL, NULL, NULL, NULL) ==
ERROR_SUCCESS)
{
printf("%ws\n", achKey); //显示子项名称
cbMaxSubKey = MAX_PATH;
ZeroMemory(achKey,MAX_PATH);
i++;
}
RegCloseKey(hKey);
}
BOOL GetKeyValue(HKEY key, DWORD option, WCHAR *szKey, WCHAR *szSubKey, WCHAR *buf)
{
HKEY hKEY = NULL;
DWORD dwSize = 0;
DWORD type=REG_SZ;
if (szKey == NULL || szSubKey == NULL)
{
return FALSE;
}
if (RegOpenKeyExW(key,szKey, 0, option, &hKEY) != ERROR_SUCCESS)
{
return FALSE;
}
if (RegQueryValueExW(hKEY, szSubKey, NULL, &type, NULL, &dwSize) != ERROR_SUCCESS)
{
RegCloseKey(hKEY);
return FALSE;
}
if (dwSize > (MAX_PATH -1)*sizeof(WCHAR))
{
RegCloseKey(hKEY);
return FALSE;
}
if (RegQueryValueExW(hKEY, szSubKey, NULL, &type, (LPBYTE)buf, &dwSize) != ERROR_SUCCESS)
{
RegCloseKey(hKEY);
return FALSE;
}
RegCloseKey(hKEY);
return TRUE;
}
4.创建一个value-key
#include <tchar.h>
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
BOOL CreateValKey(HKEY key, TCHAR *szKey, TCHAR *valkey, TCHAR *value)
{
HKEY hKEY = NULL;
if (szKey == NULL ||
valkey == NULL ||
value == NULL)
{
return FALSE;
}
if (RegOpenKeyEx(key,szKey, 0, KEY_WRITE, &hKEY) != ERROR_SUCCESS)
{
return FALSE;
}
if (RegSetValueEx(hKEY, valkey, 0, REG_SZ, (unsigned char *)value, _tcslen(value)) != ERROR_SUCCESS)
{
RegCloseKey(hKEY);
return FALSE;
}
RegCloseKey(hKEY);
return TRUE;
}
CreateValKey(HKEY_LOCAL_MACHINE, _TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),_TEXT("TEST"), _TEXT("c:\\1.exe"))