Prozess mit Leerzeichen ?!

  • Ich verwende das Programm strukted 0.99c und benötige eine Überprüfung ob der Prozess bereits existiert.

    Im Windows Taskmanager wird der Prozess mit einem (mehreren?) Leerzeichen am Anfang dargestellt.
    In der Prozessliste die durch ProcessList erstellt wird taucht es gar nicht auf.

    Über den Windows Titel kann ich auch nicht prüfen ob das Programm gestartet ist das InfoTool zeigt keinen Titel an.

    Jemand eine Idee was man noch prüfen könnte?

  • Das ist ein uraltes 16-Bit Tool.
    Das läuft also nicht direkt auf Windows sondern in einer 16-Bit Emulation.
    Bei Windows ist das die Windows NT Virtual DOS Machine: NTVDM.
    Eine gewisse Wahrscheinlichkeit das dein Prozess läuft könntest du also anhand der Existenz des Prozesses ntvdm.exe ableiten.
    Allerdings ist mir nicht bekannt wie man darin das ausgeführte Programm herausfinden kann bzw. bleibt der Prozess auch erhalten auch wenn das 16-Bit Programm schon geschlossen wurde.

    Edit: >>Damit<< sollte man rausbekommen können welche Prozesse in der Virtual DOS Machine laufen.
    Brauchst aber bisschen Ahnung von DLL-Aufrufen in AutoIt und der Windows-API

    2 Mal editiert, zuletzt von AspirinJunkie (26. Juni 2009 um 14:17)

  • Bitte schön ;)

    Spoiler anzeigen
    [autoit]

    $__ghVDMEnumProc = DllCallbackRegister("_VDMEnumProc", "int", "DWORD;DWORD;LPARAM")
    $__ghVDMTaskEnumProc = DllCallbackRegister("_VDMTaskEnumProcEx", "int", "DWORD;USHORT;USHORT;str;str;LPARAM")
    $__gpVDMEnumProc = DllCallbackGetPtr($__ghVDMEnumProc)
    $__gpVDMTaskEnumProc = DllCallbackGetPtr($__ghVDMTaskEnumProc)

    [/autoit] [autoit][/autoit] [autoit]

    Func _VDMEnumProcessWOW($fp, $lparam )
    ; Author: Prog@ndy
    Local $aResult = DllCall("VDMDBG.dll", "int", "VDMEnumProcessWOW", "ptr", $fp, "LPARAM", $lparam );
    If @error Then Return SetError(1,0,0)
    Return $aResult[0]
    EndFunc
    Func _VDMEnumTaskWOWEx( $dwProcessId, $fp,$lparam );
    ; Author: Prog@ndy
    Local $aResult = DllCall("VDMDBG.dll", "int", "VDMEnumTaskWOWEx", "DWORD", $dwProcessId, "ptr", $fp, "LPARAM", $lparam );
    If @error Then Return SetError(1,0,0)
    Return $aResult[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Global $__gavWin16Processes[1][6] = [[0]]

    [/autoit] [autoit][/autoit] [autoit]

    Func _VDMEnumProc( $dwProcessId, $dwAttributes, $lpUserDefined)
    ; Author: Prog@ndy
    _VDMEnumTaskWOWEx( $dwProcessId, $__gpVDMTaskEnumProc, $dwProcessId)
    Return False
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _VDMTaskEnumProcEx($dwThreadId, $hMod16, $hTask16, $pszModName, $pszFileName, $lpUserDefined)
    ; Author: Prog@ndy
    $__gavWin16Processes[0][0] += 1
    Local $Index = $__gavWin16Processes[0][0]
    ReDim $__gavWin16Processes[$Index+1][6]
    $__gavWin16Processes[$Index][0] = $lpUserDefined
    $__gavWin16Processes[$Index][1] = $dwThreadId
    $__gavWin16Processes[$Index][2] = $hMod16
    $__gavWin16Processes[$Index][3] = $hTask16
    $__gavWin16Processes[$Index][4] = $pszModName
    $__gavWin16Processes[$Index][5] = $pszFileName
    Return False
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ListDOSProcesses()
    ; Author: Prog@ndy
    ; Array: [0][0] : Zahl der gefundenen Threads
    ; Array: [i][0] : PID des Emulators
    ; Array: [i][1] : ThreadID
    ; Array: [i][2] : module handle.
    ; Array: [i][3] : task handle
    ; Array: [i][4] : module name.
    ; Array: [i][5] : file name
    Global $__gavWin16Processes[1][6] = [[0]]
    _VDMEnumProcessWOW($__gpVDMEnumProc,0)
    Return $__gavWin16Processes
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;-----------------------------------------------------------------------------------
    #include<Array.au3>
    $avArray = _ListDOSProcesses()
    _ArrayDisplay($avArray)

    [/autoit]

    Einmal editiert, zuletzt von progandy (26. Juni 2009 um 14:48)

  • Hehe - hab mich auch grad mal hingesetzt - so hat er jetzt 2 Möglichkeiten :) :

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $asProcs[1][3]
    Global $hVdmdbgDLL = DllOpen("vdmdbg.dll")
    Global $hProcessTasks = DllCallbackRegister("ProcessTasks", "int", "dword;ushort;ushort;str;str;lparam")
    Global $hProcessVDMs = DllCallbackRegister("ProcessVDMs", "int", "dword;dword;lparam")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GetDOSTasks()
    _ArrayDisplay($asProcs)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetDOSTasks()
    DllCall($hVdmdbgDLL, "int", "VDMEnumProcessWOW", "ptr", DllCallbackGetPtr($hProcessVDMs), "lparam", 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;----------------------CallBack-Funktionen--------------------------------------------------
    Func ProcessTasks($dwThreadID, $hMod16, $hTask16, $pszModName, $pszFileName, $lpUserDefined)
    Local $x = UBound($asProcs,1)
    ReDim $asProcs[$x+1][3]
    $asProcs[$x][0] = $pszFileName ;Dateiname
    $asProcs[$x][1] = $pszModName ;Modulname
    $asProcs[$x][2] = $lpUserDefined ;ProzessID der aufgerufenen ntvdm.exe
    $asProcs[0][0] = $asProcs[0][0]+1
    Return False
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func ProcessVDMs($dwProcessId, $dwAttributes, $lpUserDefined)
    DllCall($hVdmdbgDLL, "int", "VDMEnumTaskWOWEx", "dword", $dwProcessId, "ptr", DllCallbackGetPtr($hProcessTasks), "lparam", $dwProcessId)
    EndFunc
    ;--------------------------------------------------------------------------------------------

    [/autoit]

    4 Mal editiert, zuletzt von AspirinJunkie (26. Juni 2009 um 15:20)

  • Hallo BitBoy,

    hat es geklappt. Wäre schön, wenn du eine Rückmeldung geben könntest.

    Denn genau so ein Tool suche ich auch. :)

    Vielen Dank an die beiden Autoren. :thumbup:

    Viele Grüße,
    Axel

    --
    Mit freundlichen Grüßen,
    Axel Stoppa