本文概述
- 1.创建Wow64Interop类
- 2.运行位于system32目录内的应用程序
// First wayProcess processToStart = new Process{StartInfo ={FileName = @"dfrgui.exe", WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)}};
processToStart.Start();
// Second wayProcess.Start(@"C:\Windows\system32\dfrgui.exe");
但是, 当你在提到的平台上运行代码时, 你什么也看不到, 绝对什么也没有。没有例外, 没有堆栈跟踪, 仅此而已。这个问题可能让人非常沮丧, 幸运的是, 有一个解决方案, 你可以轻松地在应用程序中实现而无需太多麻烦。
在本文中, 我们将向你介绍如何防止这种行为, 并使用Winforms中的C#运行Windows的System32目录中的任何可执行文件。
1.创建Wow64Interop类【如何在WinForms中使用C#在Windows的System32目录中运行任何可执行文件】为了运行Windows系统目录(C:\ Windows \ system32)中的任何可执行文件, 你将需要为调用线程禁用文件系统重定向。默认情况下, 每个系统上都启用文件系统重定向, 因此你将需要运行Windows的本机方法, 即Wow64DisableWow64FsRedirection函数。以前, 实现此目的的先决功能是Wow64EnableWow64FsRedirection, 但是, 当存在嵌套调用时, 此功能可能无法可靠地工作。为确保你的应用程序具有正确的功能, 请确保使用Wow64DisableWow64FsRedirection方法。该类还将包含用于还原我们在上一个函数开始时所做的操作的方法, 即Wow64RevertWow64FsRedirection方法, 代表Wow64DisableWow64FsRedirection函数的所有数据分配都将被该函数清除。
我们可以通过以下方式在我们的代码中包含此帮助程序。继续在你的Winforms应用程序中包含此方法, 从而在你自己的名称空间中创建以下类。此类的名称将是Wow64Interop(文件名Wow64Interop.cs), 并包含以下代码:
using System;
using System.Runtime.InteropServices;
namespace Sandbox{public class Wow64Interop{const string Kernel32dll = "Kernel32.Dll";
[DllImport(Kernel32dll, EntryPoint = "Wow64DisableWow64FsRedirection")]public static extern bool DisableWow64FSRedirection(ref IntPtr ptr);
[DllImport(Kernel32dll, EntryPoint = "Wow64RevertWow64FsRedirection")]public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
}}
包含该类后, 它应该在你的应用程序中公开公开, 因为稍后我们将使用它来运行该应用程序。
2.运行位于system32目录内的应用程序现在, 如开篇所述, 我们首先需要为调用线程禁用文件系统重定向, 因此我们将代码包装应用程序初始化, 并在try-catch块中初始化应用程序, 该块将在Wow64Interop.DisableWow64FSRedirection(true)方法之前运行将允许你启动可执行文件(禁用重定向):
// Required namespacesusing System;
using System.Diagnostics;
using System.Windows.Forms;
IntPtr wow64Value = http://www.srcmini.com/IntPtr.Zero;
try{// 1. Disable initially the Wow64FSRedirectionWow64Interop.DisableWow64FSRedirection(ref wow64Value);
// 2. Prepare the code that starts another executable// Run the application from the system32 directory// In this case we will run the dfrgui.exe app//// C:/Windows/system32/dfrgui.exeProcess processToStart = new Process{StartInfo ={FileName = @"dfrgui.exe", WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)}};
// Start the applicationprocessToStart.Start();
}catch (Exception exc){Console.WriteLine("Unabled to disable/enable WOW64 File System Redirection");
Console.WriteLine(exc.Message);
}finally{// 3. Let the Wow64FSRedirection with its initially stateWow64Interop.Wow64RevertWow64FsRedirection(wow64Value);
}
现在, 该代码应该可以启动应用程序而没有任何问题(如果你没有权限, 你将至少看到异常触发的凭据原因, 但你至少会看到一些东西, 这与我们之前的代码不同)开始)。一旦可执行文件在finally语句中启动, 别忘了再次还原对重定向所做的更改(Wow64Interop.Wow64RevertWow64FsRedirection(true))。
编码愉快!
推荐阅读
- 如何解决Visual Studio Form Render异常(可以设计Form类,但不是文件中的第一类)
- 跨平台与单平台开发-这是你应该知道的
- 如何确定数字在C中是否强
- PHP 7.3提供的主要功能
- 如何解决C#异常(必须先将当前线程设置为单线程单元(STA)模式,然后才能进行OLE调用,请确保你的Main函数已在其上标记了STAThreadAttribute)
- 如何在Symfony 4中将Twig Extension注册为不带自动接线的服务
- 如何在Symfony 4中使用服务检索项目的根目录和其他容器参数
- 前端开发人员可以通过这些技巧来帮助避免倦怠
- 如何解决(解决方案)Google的Blockly Future Programmers Game(Bird Level)