【问题标题】:VB.NET - Calling Kernel32.DLL's Wow64DisableWow64FsRedirectionVB.NET - 调用 Kernel32.DLL 的 Wow64DisableWow64FsRedirection
【发布时间】:2011-04-24 23:46:33
【问题描述】:

查看 Wow64DisableWow64FsRedirection 上的 Microsoft's page,我看到了一些 C 代码。如果你想调用这个函数并且它是从 VB.net 恢复的呢?

到目前为止,我已经这样做了:

 <Runtime.InteropServices.DllImport("KERNEL32.DLL",  EntryPoint:="Wow64DisableWow64FsRedirection")> _
Public Shared Function DisableWow64Redirection() As Boolean
End Function

对于 Revert Brother 功能,我也是如此。

我这样称呼它:

DisableWow64Redirection()

这似乎有效,因为我调用的shell命令实际上在system32中找到了它的exe,但我不确定Revert,它需要参数吗?这个Revert page 似乎希望我从禁用中获取输出并将其插入到还原调用中。听起来对吗?如何更改我的 DLLimport 以获取布尔值并在 Kernal32.DLL 函数中实际使用它?

谢谢!

【问题讨论】:

    标签: vb.net pinvoke kernel32


    【解决方案1】:

    声明错误,它需要一个 (ByRef oldValue As IntPtr) 参数。您需要将其传递给还原函数。

    但是,您不能在 .NET 程序中安全地使用它。它还会影响 CLR,它将无法再找到 .NET 框架程序集。您无法预测它们何时加载。肯定有更好的方法可以满足您的需求,请就此提出一个新问题。

    【讨论】:

    • 嗯,这是安装的一部分。你是说即使我要求它恢复,它可能不会?其余的安装可能搞砸了?我想安装和运行程序之间的差距足以让它恢复吗?我真的只想在 64 位 Windows Server 2008 中运行 ServerManagerCmd,但除非我将 exe 从 system32 移动到 sysWow64,否则找不到它。
    • 不,我是说您的自定义安装代码会爆炸。在这种情况下很可能是因为您将在取消重定向后执行代码,这将编译 JIT。这会导致程序集被加载。我不是说它会,测试它的bejeesus。有更好的方法来处理 64 位和 32 位安装,我建议你问一个关于它的问题。不要忘记仔细记录您正在尝试做的事情。
    【解决方案2】:

    您可以将函数定义更改为

    <DllImport("kernel32.dll", EntryPoint := "Wow64DisableWow64FsRedirection")> _
    Public Shared Function DisableWow64Redirection(ByRef output As IntPtr) As Boolean
    

    并像这样定义 Revert():

    <DllImport("kernel32.dll", EntryPoint := "Wow64RevertWow64FsRedirection")> _
    Public Shared Function RevertWow64Redirection(ByRef handle As IntPtr) As Boolean
    

    你会像这样调用这些:

    Dim handle As IntPtr
    DisableWow64Redirection(handle)
    RevertWow64Redirection(handle)
    

    我不是 VB.NET 人,所以可能某些语法不正确 - 重要的是您提供了 IntPtr 类型的引用参数,它映射到 PVOID 本机类型。你会想要坚持下去,并将相同的值传递给 Revert()。

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多