#include #include #include #include struct __execblock { unsigned short envseg; void far * cmdtail; void far * fcb1; void far * fcb2; }; int __dodexec( const char *path, struct __execblock *xb ); #pragma aux __dodexec = \ "mov ax, 0x4B00" \ "int 0x21" \ "jnc finish" \ "mov _doserrno, ax" \ "mov ax, 0xFFFF" \ "finish:" \ parm [dx] [bx] \ value [ax] \ modify [ax bx dx]; unsigned char __dogetrt( void ); #pragma aux __dogetrt = \ "mov ah, 0x4D" \ "int 0x21" \ value [al] \ modify [ax]; unsigned short __makeenv( int size, char *envp ); #pragma aux __makeenv = \ "mov ah, 0x48" \ "int 0x21" \ "jnc docopy" \ "mov ax, 0" \ "jmp end" \ "docopy:" \ "push es" \ "mov es, ax" \ "mov bx, 0" \ "cont:" \ "mov cx, [si]" \ "mov es:[bx], cx" \ "inc bx" \ "inc si" \ "cmp -2[si], 0" \ "jnz cont" \ "cmp -1[si], 0" \ "jnz cont" \ "pop es" \ "end:" \ parm [bx] [si] \ value [ax] \ modify [ax bx cx si]; int _exec( const char *path, const char *cmdline ) { char fullcmdline[ 128 ]; char environment[ 4096 ], *envp = environment; int i, j; struct __execblock xb = { 0, NULL, NULL, NULL }; for( i = 0; environ[ i ] != NULL; i++ ) { for( j = 0; environ[ i ][ j ] != '\0'; j++ ) { *envp = environ[ i ][ j ]; envp++; } *envp = '\0'; envp++; } *envp = '\0'; xb.envseg = __makeenv( ( 4096 / 16 ), environment ); xb.cmdtail = fullcmdline; fullcmdline[ 0 ] = strlen( cmdline ); fullcmdline[ fullcmdline[ 0 ] ] = '\r'; strcpy( &fullcmdline[ 1 ], cmdline ); if( __dodexec( path, &xb ) < 0 ) { _dos_freemem( xb.envseg ); return( -1 ); } _dos_freemem( xb.envseg ); return( __dogetrt() ); }