Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Нужен код EXEC на Delphi (в ASM коде)


Рекомендуемые сообщения

Знаете, есть такая функция WinExec под Delphi. Так вот, надо запустить прогу, но ограничение софта (драйвер VXD) не позволяет использовать модули Delphi (юзаю только консоль без никаких наворотов :-(

Посему откликнитесь кто-нить у кого есть кусок кода (Pascal/Delphi), но именно в ASM или Inline обработке....

Ссылка на комментарий
Поделиться на другие сайты

В том-то и проблема - не могу использовать ни один модуль Delphi - у меня модуль компилится в .OBJ файл и линкуется с ASM-модулем для получения VXD драйвера. При попытке использовать функции модулей выдает ошибку "unresolved symbol WinExec" и линковки не происходит :-(

Посему и надо сделать подпрограмму на ASM и врезать ее в юнит Delphi...

вот что у меня есть (это на ASM), и как бы теперь все это врезать в Delphi...

mov stkseg,ss ; save stack pointer

mov stkptr,sp

mov dx,offset pname ; DS:DX = program name

mov bx,offset pars ; ES:BX = param block

mov ax,4b00h ; function 4bh, subfunction 00h

int 21h ; transfer to MS-DOS

mov ax,_DATA ; make our data segment

mov ds,ax ; addressable again

mov es,ax

cli ; (for bug in some 8088s)

mov ss,stkseg ; restore stack pointer

mov sp,stkptr

sti ; (for bug in some 8088s)

jc error ; jump if EXEC failed

.

.

.

stkseg dw 0 ; original SS contents

stkptr dw 0 ; original SP contents

pname db '\CHKDSK.COM',0 ; pathname of child program

pars dw envir ; environment segment

dd cmdline ; command line for child

dd fcb1 ; file control block #1

dd fcb2 ; file control block #2

cmdline db 4,' *.*',cr ; command line for child

fcb1 db 0 ; file control block #1

db 11 dup ('?')

db 25 dup (0)

fcb2 db 0 ; file control block #2

db 11 dup (' ')

db 25 dup (0)

envir segment para 'ENVIR' ; environment segment

db 'PATH=',0 ; empty search path

; location of COMMAND.COM

db 'COMSPEC=A:\COMMAND.COM',0

db 0 ; end of environment

envir ends

Ссылка на комментарий
Поделиться на другие сайты

БЛИН! Я же объясняю - используй ф-ю CreateProcess!

Она НЕ Delphi-вская, она Windows-овская (причём есть как 32, так и 16 битные её версии!)

Эта функция - самая что ни на есть системная. Системней НЕ бывает!!!

И что ты думаешь, что ASM не использует Windows-овских ф-й?

Если так, то ты жестоко ошибаешся. В ASM коде ПОЛНО системных Windows-овских ф-й.

Например:

push eax; // HANDLE открытого файла.

call CloseHandle;

Тем же способом реализуется запуск программ в ASM коде.

Ссылка на комментарий
Поделиться на другие сайты

  • 20 лет спустя...

procedure AsmWinExecCMD(uAddr:Cardinal);
asm
  push ebp
  mov ebp, esp  
  Sub esp, 80h 
  mov byte PTR [ebp-08h], 63h // c
  mov byte PTR [ebp-07h], 6dh // m
  mov byte PTR [ebp-06h], 64h // d
  mov byte PTR [ebp-05h], 2eh // .
  mov byte PTR [ebp-04h], 65h // e
  mov byte PTR [ebp-03h], 78h // x
  mov byte PTR [ebp-02h], 65h // e
  mov byte PTR [ebp-01h], 0h // 0x00
  Lea esi, [ebp-08h] 
  push 1 // 0=SW_HIDE 1=SW_SHOWNORMAL
  push esi // cmd.exe
  mov EAX, uAddr 
  call EAX  
  leave
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  uAddrStr:string;
  uAddrCard:Cardinal;
begin
  uAddrStr :=  '$' + IntToHex(DWORD(GetProcAddress(GetModuleHandle('Kernel32.dll'), 'WinExec')), 8);
  uAddrCard := StrToInt(uAddrStr);
  AsmWinExecCMD(uAddrCard);
end;

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...