为了完成一个简单的注册表删除程序,由于我本身是win7 64位的OS,写了以下代码来递归删除注册表键值,程序代码如下:
#include <tchar.h>
#include <afx.h>
#define KEY_WOW64_64KEY 256
long DeleteSubKeyTree(HKEY hKey, LPCTSTR lpSubKey)
{
LONG lResult;
HKEY hSubKey;
DWORD dwIndex, cbName;
char szSubKey[512];
FILETIME ft;
lResult = RegOpenKeyEx(hKey,lpSubKey,0,KEY_ALL_ACCESS | KEY_WOW64_64KEY,&hSubKey);
if (lResult != ERROR_SUCCESS)
{
RegCloseKey(hSubKey);
return 0;
}
dwIndex = 0;
cbName = sizeof(szSubKey)/sizeof(szSubKey[0]);
while (ERROR_SUCCESS == (lResult = RegEnumKeyEx(hSubKey, dwIndex, szSubKey, &cbName, NULL, NULL, NULL, &ft)))
{
DeleteSubKeyTree(hSubKey, szSubKey);
}
RegCloseKey(hSubKey);
lResult = RegDeleteKey(hKey, lpSubKey);
return lResult;
}
int main()
{
LPCTSTR DeleteText = _T("Software\\Bentley\\Licensing");
DeleteSubKeyTree(HKEY_LOCAL_MACHINE,DeleteText);
::MessageBox(NULL, _T("破解成功!"), "", MB_OK);
return 0;
}
发现键值存在,在调用RegQueryValueEx的时候总是查询失败,返回了0,一直以为是权限的问题,将其提升到debug还是不行,网络上也有朋友说创建.mainfest的文件提升权限,后面在MSDN网上也找到相关说明。不过还是失败。把这个程序放到xp下和win7 32下均能正常得到读取出来的值.于是就想会不会是64位OS的问题呢?最后还是在微软最新MSDN在线找到了答案。原来是在64位OS下操作注册表必须注意设置一个值。首先在文件头定义:
#define KEY_WOW64_64KEY 256 // 兼容64位主机
然后将RegOpenKeyEx的参数加上
KEY_ALL_ACCESS|KEY_WOW64_64KEY, // 所有访问权限