home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / sysutil / exec3.asm < prev    next >
Assembly Source File  |  1994-03-05  |  6KB  |  272 lines

  1. PAGE 55,132
  2. ;
  3. ; name        exec -- system call for .EXE files
  4. ;
  5. ; synopsis    status = exec(cmd);
  6. ;        int status;        error returns
  7. ;         char *cmd;        command to execute
  8. ;
  9. ;
  10. ; description    This function accepts a string with the pathname and
  11. ;        parameters of a command to be executed and executes it.
  12. ;        See Appendix F. of the DOS 2.0 Reference Manual for more
  13. ;        information.
  14. ;
  15. ; returns    0:    Successful
  16. ;        -1:    Insufficient Memory
  17. ;        -2:    Access Denied
  18. ;        -3:    No such command
  19. ;        -4:    Invalid command format
  20. ;        -5:    Memory control blocks destroyed
  21. ;        -6:    Invalid memory block address
  22. ;
  23. ; cautions    Use only with .EXE files built with the Lattice C
  24. ;        compiler, and linked with C.OBJ.
  25. ;
  26. ; authors    Written by Darrel Plank.  Modified from the macro by Brad
  27. ;        Davis (b-davis@utah-cs).  The prolog and epilog are modified
  28. ;        from Jim Holtman's macros for Pascal.  Modified by Marco Papa
  29. ;        (papa.use-cse@csnet-relay) to work with .EXE files.
  30. ;
  31.  
  32. PROLOG    MACRO
  33.     PUSH    BP
  34.     MOV    BP,SP
  35.     ENDM
  36.  
  37. EPILOG    MACRO    NUM
  38.     POP    BP
  39.     RET
  40.     ENDM
  41.  
  42. EXECVAL    EQU    0
  43. OVLVAL    EQU    3
  44. FNCINT    EQU    21H
  45. SETBLK    EQU    4AH
  46. EXECF    EQU    4BH
  47. CR    EQU    0DH
  48.  
  49. PSP     STRUC
  50. INTVECT DW      ?
  51. TOM     DW      ?
  52. RES1    DB      ?
  53. DOSLONG DB      5 DUP (?)
  54. TERMINA DD      ?
  55. CTRLBRK DD      ?
  56. CRITERR DD      ?
  57. DOS1    DB      22 DUP (?)
  58. ENVIRO  DW      ?
  59. DOS2    DB      46 DUP (?)
  60. FPA1    DB      16 DUP (?)
  61. FPA2    DB      20 DUP (?)
  62. UPA     DB      128 DUP (?)
  63. PSP     ENDS
  64.  
  65. EXECDEF STRUC
  66. NENVIRO DW
  67. COMMND  DW      2 DUP (0)
  68. FCB5CH  DW      2 DUP (0)
  69. FCB6CH  DW      2 DUP (0)
  70. EXECDEF ENDS
  71.  
  72. PGROUP    GROUP PROG
  73. PROG    SEGMENT BYTE PUBLIC 'prog'
  74.     ASSUME CS:PGROUP
  75.  
  76. PUBLIC    EXEC
  77. EXEC    PROC NEAR
  78.         PROLOG
  79.         PUSH    DS
  80.         PUSH    ES
  81. ;
  82. ; free up as much memory as we can
  83. ;
  84.     MOV    AX,CS        ; Code Segment to AX
  85.     PUSH    ES        ; Save ES for later
  86.     SUB    AX,10H        ; point to PSP ****
  87.     MOV    ES,AX
  88.     MOV    BX,SS
  89.     SUB    BX,AX
  90.     ADD    BX,1000H    ; 64K for stack segment
  91.     MOV    AH,SETBLK
  92.     INT    FNCINT
  93.     JNC    NEAR PTR LBL1
  94.     POP    ES
  95.     JMP    NEAR PTR LBL2
  96. LBL1:    POP    ES        ; Get ES's original value
  97. ;
  98. ; Save SS and SP registers
  99. ;
  100.         MOV     CS:SPSAVE,SP
  101.         MOV     CS:SSSAVE,SS
  102. ;
  103. ; set up the parameter block
  104. ;
  105.         MOV     CS:EXECBLK.NENVIRO,0    ; Inherit envir. from parent
  106.     MOV    AX,3700H        ; Undocumented call for SWITCHAR
  107. ;
  108. ; W A R N I N G:  The following function call is undocumented and is
  109. ; liable to disappear or change in future versions of DOS.
  110. ;
  111.     INT    FNCINT
  112.     MOV    CS:COMMAND[1],DL    ; Switchar
  113.     MOV    DX,4[BP]        ; Address of the command
  114.     MOV    SI,DX
  115.     MOV    DI,DX
  116.     CLD
  117.     XOR    AL,AL
  118.     MOV    CX,100H            ; Longest string can be 100h
  119.     REPNE SCASB            ; Find Null termination
  120.     SUB    DX,DI
  121.     NEG    DX
  122.     MOV    CX,DX
  123.     DEC    CX
  124.     ADD    DX,2
  125.     MOV    CS:COMMAND[0],DL    ; Save command length
  126.     LEA    DI,CS:COMMAND[4]
  127.     MOV    AX,CS
  128.     MOV    ES,AX
  129.     REP MOVSB            ; Copy command into our buffer
  130. ASSUME    DS:PGROUP
  131.     MOV    AX,CS
  132.     MOV    DS,AX            ; DS points at code segment
  133.     MOV    BYTE PTR [DI],CR    ; Put in Carriage Return
  134.     LEA    DX,COMMAND
  135.         MOV     EXECBLK.COMMND[0],DX
  136.         MOV     EXECBLK.COMMND[2],DS
  137.     MOV    BX,OFFSET EXECBLK
  138.     SUB    AX,10H            ; AH points to PSP ****
  139.     MOV    DS,AX            ; DS points to PSP also ****
  140.         XOR     SI,SI
  141.     MOV    DS,[SI].ENVIRO        ; Get environment address
  142. ASSUME    DS:NOTHING
  143.     LEA    SI,CS:COMSPEC        ; Point SI at env. variable name
  144.     PUSH    DS            ; Swap
  145.     PUSH    ES            ; ES
  146.     POP    DS            ; and
  147.     POP    ES            ; DS
  148.     CALL    GETENV
  149.     PUSH    DS            ; Swap
  150.     PUSH    ES            ; them
  151.     POP    DS            ; back
  152.     POP    ES            ; again
  153.         MOV     AH,EXECF
  154.     MOV    AL,EXECVAL        ; OVLVAL here for overlay
  155.         INT     FNCINT
  156.     MOV     SS,CS:SSSAVE
  157.         MOV     SP,CS:SPSAVE
  158.     JC    NEAR PTR LBL2
  159.     MOV    AX,0            ; Successful exec
  160.     JMP    NEAR PTR FINE
  161. LBL2:    MOV    SI,AX
  162.     MOV    AL,CS:ERRORS[SI]    ; Get error code
  163.     MOV    AH,0FFH            ; Sign extension - Assume Negative
  164. FINE:    POP     ES
  165.         POP     DS
  166.     EPILOG    1
  167. EXECBLK EXECDEF <>
  168. ;
  169. ; first byte of command is length excluding the length byte and the
  170. ; trailing \r.  Second byte is switchar.
  171. ;
  172. COMMAND    DB    2 DUP(?),"C ",254 DUP(?)
  173. COMSPEC    DB    "COMSPEC",0
  174. SPSAVE  DW
  175. SSSAVE  DW
  176. ERRORS    DB    ?
  177.     DB    ?
  178.     DB    -3    ; No such command
  179.     DB    ?
  180.     DB    ?
  181.     DB    -2    ; Access denied
  182.     DB    ?
  183.     DB    -5    ; Memory control blocks destroyed
  184.     DB    -1    ; Insufficient memory
  185.     DB    -6    ; Invalid memory block address
  186.     DB    ?
  187.     DB    -4    ; Invalid command format
  188.  
  189. EXEC    ENDP
  190.  
  191. ;
  192. ; Getenv expects ES to have the environment paragraph and DS:SI to point
  193. ; to an ASCIIZ string with the desired environment variable in it.
  194. ; It returns the address of the proper string in ES:DX.
  195. ;
  196.  
  197.     PUBLIC GETENV
  198. GETENV    PROC NEAR
  199.  
  200.     PROLOG
  201.     PUSH    AX
  202.     PUSH    CX
  203.     PUSH    SI
  204.     PUSH    DI
  205.     MOV    CS:VARNAME,SI        ; Save offset of env. name
  206.     XOR    DI,DI
  207. ;
  208. ; At this point ds:si points to dummy variable environment name and
  209. ; es:di points to environment.
  210. ;
  211.     CLD                ;Forward string operations
  212. TOP:
  213.     LODSB                ;Get a char. of env. name
  214.     CMP    AL,0            ;If we're at the end
  215.     JNE    NEAR PTR LBL3
  216.     CMP    BYTE PTR ES:[DI],'='    ;Check for match
  217.     JNE    NEAR PTR LBL4
  218. ;
  219. ; We matched
  220. ;
  221.     INC    DI            ;Move beyond '='
  222.     MOV    DX,DI
  223.     POP    DI
  224.     POP    SI
  225.     POP    CX
  226.     POP    AX
  227.     EPILOG    2
  228. LBL4:
  229. ;
  230. ; At this point we found the end of the Env. variable name but it didn't
  231. ; match because the env. string was too long
  232. ;
  233.     MOV    CX,-1
  234.     REPNE SCASB            ;Find the end of the env. string
  235.     CMP    BYTE PTR ES:[DI],0
  236.     JNE    LBL3
  237.     MOV    AX,-1            ;End of environment area
  238.     POP    DI
  239.     POP    SI
  240.     POP    CX
  241.     POP    AX
  242.     EPILOG    2
  243. LBL3:
  244. ;
  245. ; Check if the next character matches
  246. ;
  247.     AND    AX,11011111b        ;Capitalize the character in ax
  248.     SCASB
  249.     JE    TOP
  250. ;
  251. ; If we get here we don't have a match so move on
  252. ;
  253.     MOV    SI,CS:VARNAME        ;Go back to start of env. string
  254.     XOR    AX,AX
  255.     MOV    CX,-1
  256.     REPNE SCASB            ;Go to next env. variable
  257.     CMP    BYTE PTR ES:[DI],0
  258.     JNE    TOP
  259.     MOV    AX,-1            ;End of environment area
  260.     POP    DI
  261.     POP    SI
  262.     POP    CX
  263.     POP    AX
  264.     EPILOG    2
  265.  
  266. VARNAME    DW    ?
  267.  
  268. GETENV    ENDP
  269.  
  270. PROG    ENDS
  271.     END
  272.