我正在使用EasyHook来拦截注册表调用。更详细地说,我使用RegQueryValue来拦截从注册表中读取密钥并使用其他内容更改其值的调用。相关代码如下:
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
delegate int DRegQueryValueExW(
IntPtr hKey,
string lpValueName,
int lpReserved,
ref Microsoft.Win32.RegistryValueKind lpType,
StringBuilder lpData,
ref int lpcbData);
[DllImport("Advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
static extern int RegQueryValueExW(
IntPtr hKey,
string lpValueName,
int lpReserved,
ref Microsoft.Win32.RegistryValueKind lpType,
StringBuilder lpData,
ref int lpcbData);
int RegQueryValueExW_Hooked(
IntPtr hKey,
string lpValueName,
int lpReserved,
ref Microsoft.Win32.RegistryValueKind lpType,
StringBuilder lpData,
ref int lpcbData)
{
// todo: change value of lpData and return 0
return RegQueryValueExW(hKey, lpValueName, lpReserved, ref lpType, lpData, ref lpcbData);
}
如果我使用目标x64构建所有内容,这一切都会毫无问题地执行。
但是,如果我使用目标x32构建它,它会在RegQueryValueExW_Hooked中崩溃并出现错误:
未处理的异常:System.Runtime.InteropServices.SEHException:外部组件引发了异常。在DummyDCA.Program.Main(String [] args) 未处理的异常:System.ArgumentOutOfRangeException:容量超过最大容量。 参数名称:AG.RU.Valuation.Controller.AFMToolbox上的AG.RU.Valuation.Controller.AFMToolbox.Inject.Main.RegQueryValueExW(IntPtrhKey,String lpValueName,Int32 lpReserved,RegistryValueKind& lpType,StringBuilder lpData,Int32& lpcbData)的容量.Inject.Main.RegQueryValueExW_Hooked(IntPtr hKey,String lpValueName,Int32 lpReserved,RegistryValueKind& lpType,StringBuilder lpData,Int32& lpcbData)
问题似乎是StringBuilder类型的lpData(某种溢出,StringBuilder不够大或什么的)。如果我用IntPtr替换StringBuilder,它不会崩溃;但是我有一个指针而不是StringBuilder,所以我不确定如何替换lpData的值。
有没有人知道为什么会这样,以及应该怎么做?
谢谢!
答案 0 :(得分:1)
似乎我不得不使用IntPtr而不是StringBuilder;而RegQueryValueExW_Hooked的实现也有点特别。
Luaan在这个帖子中描述了实际的解决方案:Changing the string to which an IntPtr is pointing