我正在开发一个实用程序来挂钩不同应用程序使用的 Windows API 的各个位。目前,该项目的目标是通过使用 easyhook 将文件系统和注册表调用重定向到自定义位置来使任何应用程序可移植。然而,Windows API 的复杂性使我有限的编程技能达到了极限。
下面是我项目的注册表模拟部分的一个函数。当程序调用 RegCreateKeyExA 并接收它的所有参数时调用它。当它被调用时,它会在我用作一种虚拟注册表的 json 文件中创建一个空条目。通常,当创建一个新的注册表项时,内核会为其分配一个句柄。这个句柄被分配给 phkResult(或者更确切地说是它指向的地址)。
我已经设置了自己的句柄系统(基本上是 json 的“DICTIONARY”对象中的项目数减去默认条目(HKEY_LOCAL_MACHINE 等等(因此是 - 10))。但是,我在转换句柄时遇到了麻烦可以分配给phkResult的任何类型。必须分配给它的值是ss.str(),但转换为我似乎无法正确处理的适当类型。
LSTATUS WINAPI myRegCreateKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, const LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition)
{
std::cout << "Function: RegCreateKeyExA" << "\n";
std::cout << "lpSubKey: " << lpSubKey << "\n";
std::cout << "hKey: " << hKey << "\n";
boost::property_tree::ptree VirtualRegistry;
boost::property_tree::read_json("VirtualRegistry.json", VirtualRegistry);
std::string RegPath(GetHiveA(hKey) + "\\" + lpSubKey);
VirtualRegistry.put(boost::property_tree::ptree::path_type(RegPath, '\\'), NULL);
std::stringstream ss;
ss << std::setfill('0') << std::hex << std::setw(8) << VirtualRegistry.get_child("DICTIONARY").size() - 10;
VirtualRegistry.get_child("DICTIONARY").put(ss.str(), RegPath);
*phkResult = ((HKEY)(ULONG_PTR)((LONG)0x8000ffff)); //REPLACE 0x8000ffff with ss.str() somehow!!
boost::property_tree::write_json("VirtualRegistry.json", VirtualRegistry);
return ERROR_SUCCESS;
}
我还需要指定我正在使用 boost 进行 json 和属性树操作。谢谢你。