virtueller Speicher eines Prozesses ermitteln

  • Hallo,

    ich möchte den virtuellen Speicher eines Prozesses ermitteln.
    Kann mir jemand auf die Sprünge helfen, wie ich da dran komme ?

    Danke und Grüße
    Asterix

  • Am einfachsten mit WMI.
    Hab dir mal ne Mini-Funktion gebastelt wo du nur die Prozess-ID (bekommst du z.B. über ProcessExists() heraus) eintragen musst und zürück kommt die Größe des verwendeten virtuellen Speichers:

    Bsp:

    [autoit]

    $Prozessname = "explorer.exe"
    $ProzessID = ProcessExists($Prozessname)
    $VirtMem = _GetProcessVirtualMem($ProzessID)

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

    MsgBox(0,"",$Prozessname & ': ' & $VirtMem & ' Bytes')

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

    Func _GetProcessVirtualMem($PID)
    Local $WMIObj = ObjGet("winmgmts:\\localhost\root\CIMV2")
    If @error Then Return SetError(1,1,-1)

    For $i In $WMIObj.ExecQuery("SELECT VirtualSize FROM Win32_Process WHERE ProcessId = " & $PID, "WQL", 48)
    Return $i.VirtualSize
    Next
    Return SetError(2,2,-1)
    EndFunc

    [/autoit]
  • Hi,

    danke für die schnelle Hilfe. Ist so ungefähr das, was ich wollte. Jetzt habe nur ein Problem: der zurück gelieferte
    Wert stimmt nicht mit dem Wert überein, der vom taskmanager angezeigt wird. Das wird wohl aber ein Fehler
    von Winzigweich sein.
    Wie kann ich denn das berichtigen ?
    BZW. wo bekommt der Taskmanager den Soeicherwert her ...

    Danke

    Asterix

  • Wie kann man im Taskmanager den virtuellen Arbeitsspeicher eines Prozesses anzeigen?...

    Hab jetzt grad nur Vista vor mir und da wird standardmäßig nur der Wert "Arbeitsspeicher - Privater Arbeitssatz" angezeigt.
    Das hat mit dem virtuellen Arbeitsspeicher aber nichts zu tun.
    Woher dieser Wert kommt - ganz ehrlich: Keine Ahnung.
    Glaube mich zu erinnern das unter XP standardmäßig der WorkingSetSize-Wert angezeigt wird - bin aber nicht mehr sicher.
    Diesen bekommst du mit ProcessGetStats() heraus.
    Ansonsten musst du auch beachten das die Angaben zum Virtuellen Speicher in Byte angegeben sind und du sie noch durch 1024 teilen musst damit sie, wie im Explorer in KB stehen.

    Ansonsten hab ich dir mal eine Funktion geschrieben die detailiertere Informationen zum Speicherverbrauch eines Prozesses zurückgibt:

    [autoit]

    $Prozessname = "firefox.exe"
    $PMemInfo = _GetProcessMemInfo($Prozessname)

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

    $Text = $Prozessname & @CRLF & @CRLF & _
    "PeakWorkingSetSize: " & $PMemInfo[0] & ' kb' & @CRLF & _
    "WorkingSetSize: " & $PMemInfo[1] & ' kb' & @CRLF & _
    "QuotaPeakPagedPoolUsage: " & $PMemInfo[2] & ' kb' & @CRLF & _
    "QuotaPagedPoolUsage: " & $PMemInfo[3] & ' kb' & @CRLF & _
    "QuotaPeakNonPagedPoolUsage: " & $PMemInfo[4] & ' kb' & @CRLF & _
    "QuotaNonPagedPoolUsage: " & $PMemInfo[5] & ' kb' & @CRLF & _
    "PagefileUsage: " & $PMemInfo[6] & ' kb' & @CRLF & _
    "PeakPagefileUsage: " & $PMemInfo[7] & ' kb' & @CRLF & _
    "PrivateUsage: " & $PMemInfo[8] & ' kb'

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

    MsgBox(0,"", $Text)

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

    Func _GetProcessMemInfo($PID)
    Local $PROCESS_MEMORY_COUNTERSEX, $StructSize, $PHandle, $StructPointer
    Local $RetArray[9]


    If IsString($PID) Then $PID = ProcessExists($PID)
    If $PID < 1 Then Return SetError(1,1,$RetArray)

    $PHandle = DllCall("Kernel32.dll", "int", "OpenProcess", "dword", 0x400 + 0x10, "dword", False, "dword", $PID)
    If @error Or Not $PHandle[0] Then Return SetError(2,2,$RetArray)

    $PHandle = $PHandle[0]

    $PROCESS_MEMORY_COUNTERSEX = DllStructCreate("dword; dword; uint; uint; uint; uint; uint; uint; uint; uint; uint")
    $StructSize = DllStructGetSize($PROCESS_MEMORY_COUNTERSEX)
    $StructPointer = DllStructGetPtr($PROCESS_MEMORY_COUNTERSEX)

    DllCall("Psapi.dll", "int", "GetProcessMemoryInfo", "hwnd", $PHandle, "ptr", $StructPointer, "dword", $StructSize)
    DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $PHandle)

    For $i = 0 To 8
    $RetArray[$i] = DllStructGetData($PROCESS_MEMORY_COUNTERSEX, $i + 2) / 1024
    Next

    Return $RetArray
    EndFunc

    [/autoit]

    Edit: "PrivateUsage"-Wert noch dazu genommen (ab XP > SP2)

    Einmal editiert, zuletzt von AspirinJunkie (14. August 2008 um 18:00)

  • Hallo AspirinJunkie,

    genau das war's.
    Der Taskmanager zeigt als virtuellen Speicher den Wert ""PeakPagefileUsage: " & $PMemInfo[7] & ' kb' & @CRLF & _" an.

    Vielen Dank für Deine Hilfe !!!!!!


    Viele Grüße
    Asterix