smirnoff_rg Posted April 18, 2003 Report Share Posted April 18, 2003 Знаете, есть такая функция WinExec под Delphi. Так вот, надо запустить прогу, но ограничение софта (драйвер VXD) не позволяет использовать модули Delphi (юзаю только консоль без никаких наворотов :-( Посему откликнитесь кто-нить у кого есть кусок кода (Pascal/Delphi), но именно в ASM или Inline обработке.... Quote Link to comment Share on other sites More sharing options...
mmap Posted April 18, 2003 Report Share Posted April 18, 2003 Попробуй использовать системные функции вроде ShellExecute, CreateProcess и т.д. Quote Link to comment Share on other sites More sharing options...
smirnoff_rg Posted April 19, 2003 Author Report Share Posted April 19, 2003 В том-то и проблема - не могу использовать ни один модуль 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 Quote Link to comment Share on other sites More sharing options...
dmc Posted April 19, 2003 Report Share Posted April 19, 2003 smirnoff_rg У тебя линкер ASM виндовый (т.е. для 32-бит прог?) Quote Link to comment Share on other sites More sharing options...
mmap Posted April 19, 2003 Report Share Posted April 19, 2003 БЛИН! Я же объясняю - используй ф-ю CreateProcess! Она НЕ Delphi-вская, она Windows-овская (причём есть как 32, так и 16 битные её версии!) Эта функция - самая что ни на есть системная. Системней НЕ бывает!!! И что ты думаешь, что ASM не использует Windows-овских ф-й? Если так, то ты жестоко ошибаешся. В ASM коде ПОЛНО системных Windows-овских ф-й. Например: push eax; // HANDLE открытого файла. call CloseHandle; Тем же способом реализуется запуск программ в ASM коде. Quote Link to comment Share on other sites More sharing options...
NoNameDev Posted August 13 Report Share Posted August 13 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; Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.