Псевдокод Masm не могу разобраться

Есть код на Ассемблере. Мне нужен псевдокод по данному коду, с описанием. Если кому не сложно, не могу разобраться что к чему. Можно комментарий просто построчно. Суть программы - это диспетчер задач, который закрывает задачу, когда вводишь полное имя задачи. Код рабочий

.model flat, stdcall
option casemap :none
include includes\Windows.inc
include includes\masm32.inc ; print
include includes\user32.inc  ; CharToOem(),...
include includes\kernel32.inc ; Process32Next(), Process32First()
include includes\msvcrt.inc ; printf(), crt_scanf,...  
include includes\macros\macros.asm
includelib includes\masm32.lib
includelib includes\user32.lib
includelib includes\msvcrt.lib
includelib includes\kernel32.lib
.code
PROCESSENTRY32W STRUCT
    dwSize              DWORD ?
    cntUsage            DWORD ?
    th32ProcessID       DWORD ?
    th32DefaultHeapID   DWORD ?
    th32ModuleID        DWORD ?
    cntThreads          DWORD ?
    th32ParentProcessID DWORD ?
    pcPriClassBase      DWORD ?
    dwFlags             DWORD ?
    szExeFile           dw MAX_PATH dup(?)
PROCESSENTRY32W ENDS



GetListOrTerminate PROTO :DWORD ; принимает адрес буфера строки с именем процесса
                                ; (в формате name.exe), который надо закрыть;
                                ; выводит список процессов, если передано "none" 


.data
    ConsoleCaption db 'List and end processes',0
    PROMPT db 'List of processes - 1',13,10,'The completion of the process - 2',13,10
           db 'Exit - 0',13,10,'Choose: ',0
    IntFmt db '%d',0
    NONE db 'none',0
    AskName db 'Process name: ',0
    StrFmt db '%s',0
    ErrClose db 'Process completion failed %s',13,10,0
    OkClose db 'The process is complete %s',13,10,0

.data?
    Buffer db 512 dup(?) ; с запасом
    Choise dd ?
    NamePr db 80 dup(?) 

.code

start:
    ;Заглавие окна консоли
    invoke CharToOem, offset ConsoleCaption, offset Buffer
    SetConsoleCaption offset Buffer

    .while 1
        invoke CharToOemA, offset PROMPT, offset Buffer
        print offset Buffer
        invoke crt_scanf, offset IntFmt, offset Choise
        switch Choise
            case 1
                invoke GetListOrTerminate, offset NONE 
            case 2
                invoke CharToOemA, offset AskName, offset Buffer
                print offset Buffer
                invoke crt_scanf, offset StrFmt, offset NamePr
                invoke GetListOrTerminate, ADDR NamePr   
            case 0
                ret
        endsw
    
    .endw



GetListOrTerminate proc proc_name:DWORD

    LOCAL hProcessSnap : HANDLE
    LOCAL pe32         : PROCESSENTRY32W
    LOCAL hProcess     : HANDLE



    invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
    .if eax == INVALID_HANDLE_VALUE
        ret        
    .endif 
    mov hProcessSnap, eax

    mov pe32.dwSize, sizeof pe32
    invoke Process32FirstW, hProcessSnap, ADDR pe32
    .if eax == 0
        invoke CloseHandle, hProcessSnap
        ret
    .endif

    .repeat 
        invoke crt_strcmp, ADDR NONE, proc_name  
        .if eax == 0    
            invoke CharToOemW, ADDR pe32.szExeFile, offset Buffer
            print offset Buffer, 13, 10
        .else
            invoke OemToCharW, proc_name, offset Buffer
            invoke crt_wcscmp, ADDR pe32.szExeFile, offset Buffer
            .if eax == 0
                mov hProcess, 0
                invoke OpenProcess, PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID
                mov hProcess, eax
                invoke TerminateProcess, hProcess, 0
                .if eax == 0
                    invoke CharToOemA, offset ErrClose, offset Buffer
                  
                .else                    
                    invoke CharToOemA, offset OkClose, offset Buffer
                    invoke crt_printf, offset Buffer, proc_name
                .endif
                .if hProcess != 0 
                    invoke CloseHandle, hProcess 
                .endif 
            .endif
        .endif
        invoke Process32NextW, hProcessSnap, ADDR pe32
    .until eax == 0

    invoke CloseHandle, hProcessSnap
        
    ret

GetListOrTerminate endp

end start

Ответы (0 шт):