本文概述
在Windows中, 对于某些基于x64的系统, 当你尝试从Windows的(C:\ Windows \ system32)目录中的应用程序运行某些可执行文件时, 有时会遇到奇怪的行为, 例如使用dfrgui.exe, 允许用户对系统上的磁盘进行碎片整理的应用程序。理论上可以从以下代码开始:
// First way
Process processToStart = new Process
{
StartInfo =
{
FileName = @"dfrgui.exe", WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
}
};
processToStart.Start();
// Second way
Process.Start(@"C:\Windows\system32\dfrgui.exe");
但是, 当你在提到的平台上运行代码时, 你什么也看不到, 绝对什么也没有。没有例外, 没有堆栈跟踪, 仅此而已。这个问题可能让人非常沮丧, 幸运的是, 有一个解决方案, 你可以轻松地在应用程序中实现而无需太多麻烦。
在本文中, 我们将向你介绍如何防止这种行为, 并使用Winforms中的C#运行Windows的System32目录中的任何可执行文件。
1.创建Wow64Interop类
为了运行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 namespaces
using System;
using System.Diagnostics;
using System.Windows.Forms;
IntPtr wow64Value = IntPtr.Zero;
try
{
// 1. Disable initially the Wow64FSRedirection
Wow64Interop.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.exe
Process processToStart = new Process
{
StartInfo =
{
FileName = @"dfrgui.exe", WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
}
};
// Start the application
processToStart.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 state
Wow64Interop.Wow64RevertWow64FsRedirection(wow64Value);
}
现在, 该代码应该可以启动应用程序而没有任何问题(如果你没有权限, 你将至少看到异常触发的凭据原因, 但你至少会看到一些东西, 这与我们之前的代码不同)开始)。一旦可执行文件在finally语句中启动, 别忘了再次还原对重定向所做的更改(Wow64Interop.Wow64RevertWow64FsRedirection(true))。
编码愉快!
评论前必须登录!
注册