我正在使用 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.Inject.Main.RegQueryValueExW(IntPtrhKey, String lpValueName, Int32 lpReserved, RegistryValueKind& lpType, StringBuilder lpData, Int32& lpcbData) at AG.RU.Valuation.Controller.AFMToolbox.Inject 的容量.Main.RegQueryValueExW_Hooked(IntPtr hKey, String lpValueName, Int32 lpReserved, RegistryValueKind& lpType, StringBuilder lpData, Int32& lpcbData)
问题似乎是 StringBuilder 类型的 lpData (某种溢出,StringBuilder 不够大或其他什么)。如果我用 IntPtr 替换 StringBuilder,它不会崩溃;但后来我有一个指针而不是 StringBuilder,所以我不确定如何替换 lpData 的值。
有谁知道为什么会这样,应该怎么做?
谢谢!