Я пытался запустить процесс (без его полного пути), который присутствует в переменной среды% PATH%, и получить его через свойство модулей объектов процесса.
Большую часть времени он работает, но иногда свойство Modules содержит путь C:\Windows\SYSTEM32\ntdll.dll
Вот простой код vb.net для воспроизведения проблемы
Sub checkNtdllError()
' Run in a While Loop as this issues is reproduced rarely
While True
Dim psi = New ProcessStartInfo
With psi
.FileName = "cmd.exe"
.Arguments = "/c echo 'Hello'"
.RedirectStandardError = True
.RedirectStandardOutput = True
.RedirectStandardInput = True
.CreateNoWindow = True
.UseShellExecute = False
End With
Try
'Start a new Process of cmd.exe (from the %PATH% environment variable)
Dim proc = Process.Start(psi)
Dim moduleName = "Unknown"
If proc.Modules.Count > 0 Then
moduleName = proc.Modules(0).FileName
Else
If Debugger.IsAttached Then Debugger.Break()
' Question: Why proc.Modules.Count was 0?
Continue While
End If
Console.WriteLine(moduleName) ' This should print the full path of cmd.exe in the console
If Not moduleName.Contains("cmd") Then
' Question: Why was the ModuleName ntdll.dll?
Dim stdOut = proc.StandardOutput.ReadToEnd()
Dim stdErr = proc.StandardError.ReadToEnd
proc.WaitForExit()
proc.Dispose()
Dim procOut = stdOut & stdErr
Console.WriteLine(" " & procOut)
' Observer here that even when the Module Name was not cmd.exe, still the process output was correct
If Debugger.IsAttached Then Debugger.Break()
Console.WriteLine("--------------------------------------------------")
End If
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End While
Console.Read()
End Sub
Ожидание If cmd.exeнаходится в пути, он всегда должен печатать путь cmd.exe в ModuleName
Вопросы:
- Почему иногда массив proc.Modules пуст?
- Почему иногда массив proc.Modules содержит путь к ntdll.dll?