我试图用C ++ / windows隐藏注册表中的一些值(例如序列号)
所以我一直在看这篇文章http://www.codeproject.com/KB/system/NtRegistry.aspx
其中说:
这怎么可能?答案是 这个名字被算作一个 Unicode字符串可以明确包含 NULL字符(0)作为的一部分 名称。例如,“Key \ 0”。包括 最后的NULL,长度 Unicode字符串指定为4。 绝对没有办法指定 此名称使用Win32 API,因为如果 “Key \ 0”作为名称API传递 将确定名称是“密钥” (长度为3个字符)因为 “\ 0”表示名称的结尾。
当一个键(或任何其他具有一个对象的对象) 诸如命名事件,信号量之类的名称, 或者Mutex)是用这样的名字创建的, 任何使用Win32 API的应用程序 甚至不会打开这个名字 虽然他们似乎看到了它。
所以我尝试做类似的事情:
HKEY keyHandle;
PHKEY key;
unsigned long status = 0;
wchar_t *wKeyName = new wchar_t[m_keyLength];
MultiByteToWideChar(CP_ACP, 0, m_keyName, m_keyLength, wKeyName, m_keyLength);
wKeyName[18] = '\0';
long result = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
wKeyName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&keyHandle,
&status);
其中m_keyName
是ASCII文本而wKeyName是宽字符文本,但在regedit
中我看到它被视为相同而且键只是在我把'\ 0'放在哪里。
它出了什么问题?
答案 0 :(得分:1)
问题是您使用的是Win32 API而不是NT Native API。有一个关于1/2 the article that you referenced的表格,其中包含Native API列表。例如,您可以使用NtCreateKey
或ZwCreateKey
代替RegCreateKeyExW
。 Win32 API假定所有字符串都由NUL字符终止,而Native API对应物使用UNICODE_STRING
结构作为名称。
答案 1 :(得分:1)
我会在黑暗中刺伤,因为我从未尝试过这样做。
您似乎使用了错误的功能来创建注册表项。您应该使用NtCreateKey
方法,因为RegCreateKeyEx
[AW]会注意到您的'\0'
并切断它。
为什么不使用示例中提供的类?它提供了一个名为CreateHiddenKey
的方法。要使用它,只需在它之前调用SetKey
即可。它会更清洁。