Process.Modules дает другое имя процесса случайным образом - PullRequest
0 голосов
/ 20 сентября 2018

Я пытался запустить процесс (без его полного пути), который присутствует в переменной среды% 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

Вопросы:

  1. Почему иногда массив proc.Modules пуст?
  2. Почему иногда массив proc.Modules содержит путь к ntdll.dll?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...