VB.NET - 调用Kernel32.DLL的Wow64DisableWow64FsRedirection

时间:2010-10-13 17:31:21

标签: vb.net pinvoke kernel32

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

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

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

我也为Revert兄弟功能做了同样的事。

我称之为:

DisableWow64Redirection()

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

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以将功能定义更改为

<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()。

答案 1 :(得分:1)

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

但是,您无法在.NET程序中安全地使用它。它也会影响CLR,它将无法再找到.NET框架程序集。你无法预测它们何时被加载。肯定有更好的方法来完成你所需要的,开始一个新的问题。