Функция _WinAPI_OpenProcess

 ↑  ←  Описание функции


_WinAPI_OpenProcess

Возвращает дескриптор существующего объекта процесса

#include <WinAPI.au3>
_WinAPI_OpenProcess($iAccess, $fInherit, $iProcessID [, $fDebugPriv = False])

Параметры

$iAccess Указывает доступ к объекту процесса
$fInherit Указывает, может ли возвращаемый дескриптор быть унаследованным
$iProcessID Идентификатор процесса (PID)
$fDebugPriv [необязательный] Некоторые системные процессы не могут быть открыты, если у вас нет привилегий отладчика (debug security privilege). Если True, то эта функция будет пытаться открыть процесс с привилегиями отладки, в случае если процесс не может быть открыт со стандартными привилегиями доступа.

Возвращаемое значение

Успех:Возвращает дескриптор объекта процесса
Ошибка:Устанавливает @error

См. также

_WinAPI_CloseHandle, _WinAPI_ReadProcessMemory, _WinAPI_WriteProcessMemory

См. также

Искать OpenProcess в библиотеке MSDN

Пример

#include <ProcessConstants.au3>
#include <WinAPI.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>

If StringInStr($CmdLineRaw, '--TestRun') Then
    _ReadWriteMemory()
    Exit
EndIf

$iVal = 100
$t = DllStructCreate('WORD')
DllStructSetData($t, 1, $iVal)

$hForm = GUICreate("Тестовая программа", 274, 97, -1, -1)
GUICtrlCreateLabel("Адрес памяти :", 60, 24, 81, 17)
GUICtrlCreateInput(DllStructGetPtr($t), 160, 20, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_READONLY,$ES_NUMBER))
GUICtrlCreateLabel("Значение памяти :", 44, 60, 98, 17)
$Input = GUICtrlCreateInput(DllStructGetData($t, 1), 160, 56, 89, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_READONLY,$ES_NUMBER))
GUISetState(@SW_SHOW)

Sleep(1000)
If @Compiled Then
    Run('"' & @ScriptFullPath & '" --TestRun')
Else
    Run(FileGetShortName(@AutoItExe) & ' /AutoIt3ExecuteScript "' & FileGetShortName(@ScriptFullPath) & '" --TestRun')
EndIf

$begin = TimerInit()
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
    If TimerDiff($begin) > 200 Then
        $tmp = DllStructGetData($t, 1)
        If $iVal <> $tmp Then
            $iVal = $tmp
            GUICtrlSetData($Input, $iVal)
        EndIf
        $begin = TimerInit()
    EndIf
WEnd

Func _ReadWriteMemory()
    $hWnd = WinGetHandle('[Title:Тестовая программа; Class:AutoIt v3 GUI]')
    If $hWnd Then
        $iPid = WinGetProcess($hWnd)
        If $iPid Then
            $iAddress = ControlGetText($hWnd, '', '[Class:Edit; Instance:1]')
            If $iAddress > 0 Then
                $iAddress = Int($iAddress);адрес памяти внешнего процесса
                $hProcess = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, 0, $iPid)
                If $hProcess Then
                    Local $iRead, $iWrite, $t = DllStructCreate('WORD')
                    For $i = 1 To 10
                        If ProcessExists($iPid) Then
                            ; Чтение значения памяти
                            _WinAPI_ReadProcessMemory($hProcess, $iAddress, DllStructGetPtr($t), 2, $iRead)
                            $iVal = DllStructGetData($t, 1)
                            $iVal += 5
                            ; Запись значения в память
                            DllStructSetData($t, 1, $iVal)
                            _WinAPI_WriteProcessMemory($hProcess, $iAddress, DllStructGetPtr($t), 2, $iWrite)
                        Else
                            ExitLoop
                        EndIf
                        Sleep(1000)
                    Next
                    If ProcessExists($iPid) Then
                        _WinAPI_CloseHandle($hProcess); Открытый процесс необходимо закрывать
                    EndIf
                Else
                    MsgBox(16+4096, 'Ошибка', 'Не удалось открыть память тестовой программы')
                EndIf
            Else
                MsgBox(16+4096, 'Ошибка', 'Не найден адрес памяти тестовой программы')
            EndIf
        Else
            MsgBox(16+4096, 'Ошибка', 'Не найден процесс тестовой программы')
        EndIf
    Else
        MsgBox(16+4096, 'Ошибка', 'Не найдено окно тестовой программы')
    EndIf
EndFunc