All pastes #270126 Raw Edit

Mine

public text v1 · immutable
·published 2006-12-07 02:40 UTC
rendered paste body
#include <dos.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

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() );
}