Код (Text): format PE64 Console include '%fasm%/win64ax.inc' section '.code' executable start: sub rsp,8 invoke GetCommandLine mov ebx,eax @@: cmp byte [ebx],NULL je sh cmp byte [ebx],' ' je @f inc ebx jmp @r @@: inc ebx cmp byte [ebx],' ' je @r ;cmp byte [ebx],'*' ;jne sh ;jmp exit sh: invoke wsprintf,a,'/c subinacl.exe /subdirectories %s /perm /setowner=Everyone /grant=Everyone=F',ebx invoke ShellExecute,NULL,NULL,'cmd.exe',a,NULL,SW_HIDE exit: invoke ExitProcess,NULL Даже не знаю, вроде бы работает. Мне хотелось бы использовать ключи '-f' = для файлов /subdirectories '-r'= для реестра /subkeyreg чтобы кроме ebx подставить ещё ключ, как это сделать? Ещё бы прикрутить какой-то диалог Код (Text): invoke SetConsoleOutputCP,1251 invoke SetConsoleCP,1251 invoke GetStdHandle, STD_OUTPUT_HANDLE mov [stdout], eax invoke GetStdHandle, STD_INPUT_HANDLE mov [stdin], eax invoke WriteConsole,[stdout],cMsg,12,NULL,NULL invoke ReadConsole,[stdin],lpBuffer,1,lpCharsRead,NULL правда обработку ввода я не нашёл как сделать, прочитал, напиал и на этом усё. Я на радостях ReadConsole,[stdin],lpBuffer хотел в ShellExecute выполнить, но не тут то было. Это просто текст :\ Хочется писать, читать и ещё чтобы Execute делать --- Сообщение объединено, 2 сен 2024 --- subinacl.exe наверное с пустым вводом зависает, пытается что-то обработать, я закрываю консоль, при этом error memory read итд итп иногда вылетает. Поэтому как-то сомнительно. Видимо надо ещё и пустой путь что ли предусмотреть. --- Сообщение объединено, 2 сен 2024 --- ах, да и ещё, всё новые окна открываются, что не желательно, хочется в текущем CMD.exe видеть работу
Для начала сделайте все дескрипторы и указатели 64-битными. cmp byte [ebx],' ' mov [stdout], eax и пр. не катят.
Я понял что не так, ShellExecute делает дело, но вывод в консоль нужен. Иначе не видно что происходит. Наверняка есть готовый шаблон, пример, template. Только не Hello World. Мне бы exec с выводом в STDOUT.
wsprintf принимает произвольное количество аргументов, точно так же через запятую после ebx. Но определись сначала в х64 или в х32 режиме ты делаешь приложение. В x32 например надо самому стек выравнивать после wsprintf: add esp,n*4.
Можно ключи /subdirectories в wstprintf %s прямо подставить, но они такие длинные, что хотелось избавиться, а свой -d подставлять я понял довольно сложная задача. Это надо строку scasb-ом делить на PATH и KEY --- Сообщение объединено, 4 сен 2024 --- 32-бит регистры чем плохи? А когда al, ah в 32-битном коде ничего?
В регистрах х32 нет ничего плохого, тем более что запись в eax автоматом обнуляет старшие 32-бита в rax (это касается и всех остальных 64-бит регистров, избавляя от префиксов REX). Более того, даже в режиме х64 почти все Win-API возвращают только 32-битные значения, а потому сохранять выхлоп в 8-байтные переменные нет никакого смысла. По большому счёту кодинг в х64 оправдывает себя лишь в требовательных к памяти приложениях (например игры), а так-же при огромных математических вычислениях.
на форуме fasm один из ответов вместо мессидж бокса wsprintf как вариант и format отрихтовать надо ) Код (ASM): ; Example of 64-bit PE program format PE64 GUI entry start section '.text' code readable executable start: sub rsp,8*5 ; reserve stack for API use and make stack dqword aligned mov r9d,0 lea r8,[_caption] lea rdx,[_message] mov rcx,0 call [MessageBoxA] mov ecx,eax call [ExitProcess] section '.data' data readable writeable _caption db 'Win64 assembly program',0 _message db 'Hello World!',0 section '.idata' import data readable writeable dd 0,0,0,RVA kernel_name,RVA kernel_table dd 0,0,0,RVA user_name,RVA user_table dd 0,0,0,0,0 kernel_table: ExitProcess dq RVA _ExitProcess dq 0 user_table: MessageBoxA dq RVA _MessageBoxA dq 0 kernel_name db 'KERNEL32.DLL',0 user_name db 'USER32.DLL',0 _ExitProcess dw 0 db 'ExitProcess',0 _MessageBoxA dw 0 db 'MessageBoxA',0 вывод в STDOUT скорее всего WriteFileA или W с требуемым стандартным handle открываем CreateFileA для файла с именем CON, нет? или WriteConsole