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

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

; Новый проект masm32 успешно создан
; Заполнен демо программой «Здравствуй, мир!»
.386
.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

Так а в чем ценность этого кода?) Как убить процесс на любом языке программирования не сложно же нагуглить, для этого не нужен асм.

Тут просто WinApi функции вызываются для поиска и убийства процесса.
CreateToolhelp32Snapshot, Process32First, Process32Next, OpenProcess, TerminateProcess.

Нужно именно асм. Желательно описать код. Кусок кода + что он делает и все

К примеру, вот что делает вот эта часть кода, для чего она

 dwSize              DWORD ?
    cntUsage            DWORD ?
    th32ProcessID       DWORD ?
    th32DefaultHeapID   DWORD ?
    th32ModuleID        DWORD ?
    cntThreads          DWORD ?
    th32ParentProcessID DWORD ?
    pcPriClassBase      DWORD ?
    dwFlags             DWORD ?

Если не сложно, помогите описать) Буду безумно благодарен

Что вот эта часть кода делает

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

Вадим, Вам надо открыть учебник и прочитать.
По winApi
Дж. Ритхер Windows для профессионалов
И учебник по ассемблеру.
Ирвин К. Язык ассемблера для процессоров Intel 2005

Я все понимаю, но может вы сможете немножко мне помочь, я уже почти половину разобрал

DWORD определяет переменную. Символ ? означает, что память под переменную выделяется не очищенная.

1 лайк

Спасибо, это понял

Можно вам еще вопрос, по поводу кода?

invoke - вызывает функцию указную первым параметром. И передает все остальные в неё.
CharToOemA(PROMPT,Buffer)
CharToOemA - преобразовывает строку из кодировки приложения в кодировку консоли.
Или если совсем грубо из кодироки Windows в кодировку DOS.

print offset Buffer

print - печать, в нашем случае выводит страку

invoke crt_scanf, offset IntFmt, offset Choise

Вызываем из библиотеки crt::scanf для получения результата

switch Choise

switch - в зависимости от переменной переходи к соответствующей метки.

1 лайк

Прям слов нет, как вам благодарен

Так видно ж даже если не знать асм )

Цикл с меню программы, switch с выбором 1-2 пунктов и 0 выход.

1 лайк