我正在捕获执行一些我们内部人员不再使用的旧16位应用程序.它们是1985年的DOS应用程序,因此捕获它们很容易...捕获在NTVDM.exe下启动的任何进程
现在,问题是找出NTVDM实际上在哪个程序下运行.显然,1985年的程序中有几个应该被允许运行,所以我需要看到隐藏在NTVDM下的实际EXE名称.
WqlEventQuery query =
new WqlEventQuery("__InstanceCreationEvent",
new TimeSpan(0, 0, 1),
"TargetInstance isa \"Win32_Process\"");
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Start();
...
static void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
ProcessInfo PI = new ProcessInfo();
PI.ProcessID = int.Parse(instance["ProcessID"].ToString());
PI.ProcessName = instance["Name"].ToString();
PI.ProcessPath = instance["ExecutablePath"].ToString();
// Here's the part I need...
PI.ActualEXE = ???;
// ... do the magic on the PI class ...
instance.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
当我捕获实例信息时,我可以获取命令行,但参数是"-f -i10"...命令行上没有EXE名称.是否有任何其他方法/属性我应该查看以确定实际运行的16位应用程序的EXE名称?
更新:让我改进一下这个问题:如果我能找到NTVDM进程,我怎样才能 - 以编程方式 - 知道正在执行的EXE的实际路径?
谢谢.
我尝试启用Windows NTVDM功能以在Windows 8虚拟机上运行16位应用程序。
我知道如何通过Windows控制面板启用NTVDM。
但是我不知道如何使用命令(wmic?vb script?)在我的批处理文件中启用它。
感谢您的帮助,谢谢。
我想创建一个 16 位 Dos 应用程序,并希望它在我的 32 位 Windows 7 计算机上使用 NTVDM.exe 运行。我该怎么做?我基本上希望我的应用程序通过 NTVDM 执行文件操作,为此我想我首先需要一个 16 位应用程序,还有其他方法吗?
我使用 GNU 汇编器将ArithmeticExpressionCompiler中的 32 位模拟时钟从 Linux 交叉编译到 DOS。当在 QEMU 或 VirtualBox(它们是比 NTVDM 更好的模拟器,对吧?)中的 FreeDOS 下运行时,它会创建以下图片:
我预计它也可以在 Windows 10 上运行。但是,当我尝试在 Windows 10 上运行它时,出现以下错误:
那有什么意思?我的程序不是 16 位,而是 32 位,那么为什么某些 16 位子系统正在运行?“错误4001h”是什么意思?Windows 应该能够运行 32 位 DOS 程序,对吧?
这是我的程序的源代码,抱歉,如果它有点长,但我不知道可能导致此错误的原因(我对系统编程的了解很少):
Syntax GAS
;This is the same program as in the "analogClock.aec" file, just modified to
;run on DOS instead of Linux. It also compiles using GNU Assembler.
;Namely, GCC 9.3.0 and GNU Assembler 2.34, although they are released in
;2019, still feature the ability …
Run Code Online (Sandbox Code Playgroud)