Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

574 lines
11 KiB

page ,132
title LOADHIGH Internal Command
;/*
; * Microsoft Confidential
; * Copyright (C) Microsoft Corporation 1991
; * All Rights Reserved.
; */
;
;************ LOADHIGH command -- loads programs into UMBs.
;
comment %==================================================================
This is a new module added to support loading programs into UMBs provided
by DOS 5.0.
Usage:
LOADHIGH <filespec>
<filespec> has to be a filename that is not wildcarded.
==========================================================================%
;
; Revision History
; ================
;
; M009 SR 08/01/90 Set flags to indicate that we are
; loading and high and also remember
; current UMB state.
;
; M016 SR 08/09/90 Give special error message on attempt
; to loadhigh batch files and invalid
; filename on Loadhigh command line.
;
; M039 SR 11/19/90 Bug #4270. Copy all the whitespaces
; after the program name also as part
; of the command line being passed to
; the program to be invoked.
;
;*** INCLUDE FILES
.xlist
.xcref
include comseg.asm
include comequ.asm
include dossym.inc
include syscall.inc
include arena.inc
.list
.cref
;*** EQUATES AND STRUCTURES
NUM_LH_SWS equ 5 ;number of valid switches
ResultBuffer struc ; structure of parse result buffer
ValueType db ?
ValueTag db ?
SynPtr dw ?
ValuePtr dd ?
ResultBuffer ends
DATARES segment
extrn LoadHiFlg :BYTE
DATARES ends
TRANDATA segment
extrn ComExt :BYTE
extrn ExeExt :BYTE
extrn Extend_Buf_Ptr :WORD
extrn Msg_Disp_Class :BYTE
extrn Parse_LoadHi :BYTE
extrn NoExecBat_Ptr :WORD ; M016
extrn LhInvFil_Ptr :WORD ; M016
TRANDATA ends
TRANSPACE segment
extrn ResSeg :WORD
extrn ExecPath :BYTE
extrn Comsw :WORD
extrn Arg :BYTE
extrn SwitChar :BYTE ; M039
TRANSPACE ends
TRANCODE segment
extrn Cerror:near
extrn Parse_With_Msg:near
extrn Lh_Execute:near ;new execute label; M051
extrn Path_Search:near
assume cs:TRANGROUP,ds:TRANGROUP,es:nothing,ss:TRANGROUP
;**** LoadHigh -- Main routine for Loadhigh command
;
; ENTRY Command line tail is at PSP:81h terminated by 0dh
; CS = DS = SS = TRANGROUP
;
; EXIT None
;
; USED ax, bx, cx, dx, si, di, es
;
; ERROR EXITS
; Message pointers are setup at the error locations and then
; we jump back to CERROR which is the transient error recycle point.
; Apart from parse errors, the other errors handled are too many
; switches anf invalid filenames.
;
; EFFECTS
; The allocation strategy and the state of the arena chain are
; put in the requested state according to the given options. If a
; filename is also given, it is executed as well.
;
;
public LoadHigh
LoadHigh proc near
push ds
pop es
assume es:TRANGROUP
;
;M039
; Get command tail to be passed to the program. This includes any whitespace
;chars between the program name and its parameters as well.
;On return, ds:si points at the start of the command tail.
;
call GetCmdTail ;Get command tail for pgm ;M039
push si ;save its start offset ;M039
call ParseLhCmd ;parse the command line
pop si ;restore start offset ;M039
jc LhErr ;error parsing, abort
call SetupCmdLine ;setup pgm's command line
call SetupPath ;setup path for file
jc LhErr ;file not found
;
;Set allocation strategy to HighFirst and link in UMBs for exec. This will
;be reset after return from the Exec
;We will also set a resident flag to indicate that UMBs were activated for
;the Exec. On return from the Exec, this flag will be used to deactivate UMBs
;
call SetupUMBs ;set alloc strat & link state
jmp Lh_Execute ;go and exec file ;M051
LhErr:
;
;The error message has been setup at this stage
;
jmp Cerror ;print error message and recycle
LoadHigh endp
;*** ParseLhCmd -- calls system parser to parse command line
;
; ENTRY Parse block Parse_LoadHi setup
;
; EXIT Carry clear -- command line parsed successfully
; Carry set -- appropriate error message setup
;
; USED di, cx, bx, ax, si, dx
;
; EFFECTS
; Options set up
; Filename to be executed setup
;
ParseLhCmd proc near
assume ds:TRANGROUP, es:TRANGROUP
mov si,81h ;ds:si points at command line
mov Comsw,0 ;clear switch indicator
mov di,offset TRANGROUP:Parse_LoadHi ;es:di = ptr to parse blk
xor cx,cx ;no positionals found yet
lhParse:
call Parse_With_Msg
cmp ax,END_OF_LINE
je lhpRet ;EOL encountered, return(no carry)
cmp ax,RESULT_NO_ERROR
jne lhperrRet ;parse error, return
;
;Parse call succeeded. We have a filespec
;DX = ptr to result buffer
;
mov bx,dx ;BX = ptr to parse result buffer
call LhCopyFilename ;copy filename into our buffer
jc lhpRet ;bad filename, return
jmp short lhpRet ;done parsing, return (no error)
lhperrRet:
stc
lhpRet:
ret
ParseLhCmd endp
;*** Lh_On -- Activate allocation of UMBs
;
; ENTRY None
;
; EXIT None
;
; USED
;
; EFFECTS
; Allocation strategy is set to HighFirst
;
Lh_On proc near
mov ax,(ALLOCOPER shl 8) OR 0
int 21h ;get alloc strategy
mov bx,ax
or bx,HIGH_FIRST ;set alloc to HighFirst
mov ax,(ALLOCOPER shl 8) OR 1
int 21h ;set alloc strategy
ret
Lh_On endp
;*** Lh_Link -- links UMBs to arena
;
; ENTRY None
;
; EXIT None
;
; USED ax, bx
;
; EFFECTS
; UMBs are linked into the DOS arena chain
;
Lh_Link proc near
mov ax,(ALLOCOPER shl 8) OR 3
mov bx,1
int 21h ;link in UMBs
ret
Lh_Link endp
;*** LhCopyFilename -- copy filename from command line to buffer
;
; ENTRY ds:bx points at parse result block
;
; EXIT CY set -- filename has wildcards
; Setup for error message
;
; USED ax
;
; EFFECTS
; ExecPath contains the filename
;
LhCopyFilename proc near
assume ds:TRANGROUP, es:TRANGROUP
push ds
push si
push di
lds si,[bx].ValuePtr
mov di,offset TRANGROUP:ExecPath
movlp:
lodsb
;
;If there are any wildcards in the filename, then we have an error
;
cmp al,'*' ;wildcard?
je lhfilerr ;yes, error
cmp al,'?' ;wildcard?
je lhfilerr ;yes, error
stosb ;store char
or al,al ;EOS reached?
jnz movlp ;no, continue
clc ;indicate no error
lhcopyret:
pop di
pop si
pop ds
ret
lhfilerr:
mov dx,offset TRANGROUP:LhInvFil_Ptr ; "Invalid Filename" ; M016
stc
jmp short lhcopyret
LhCopyFilename endp
;
;M039; Begin changes
;*** GetCmdTail -- scan through the command line looking for the start
; of the command tail to be passed to program that is to be invoked.
;
; ENTRY ds = TRANGROUP
; At ds:80h, command tail for lh is present.
;
; EXIT ds:si points at the command tail for program
;
; USED
;
GetCmdTail proc near
assume ds:TRANGROUP, es:TRANGROUP
mov si,81h ;ds:si = command line for lh
invoke scanoff ;scan all delims before name
;
; Skip over the program name until we hit a delimiter
;
lhdo_skipcom:
lodsb ;
invoke delim ;is it a delimiter?
jz scandone ;yes, we are done
cmp AL, 0DH ;end of line?
jz scandone ;yes, found command tail
cmp al,SwitChar ;switch char?
jnz lhdo_skipcom ;no, continue scanning
scandone:
dec si ;point at the command tail start
ret
GetCmdTail endp
;M039; End changes
;
;*** SetupCmdLine -- prepare command line for the program
;
; ENTRY ds:si = points just beyond prog name on command line
;
; EXIT None
;
; USED
;
; EFFECTS
; The rest of the command line following the pgm name is
; moved to the top of the command line buffer (at TRANGROUP:80h)
; and a new command line length is put in
;
SetupCmdLine proc near
assume ds:TRANGROUP, es:TRANGROUP
mov di,81h
xor cl,cl
dec cl ;just CR means count = 0
stcllp:
lodsb
stosb
inc cl ;update count
cmp al,0dh ;carriage return?
jne stcllp ;no, continue storing
mov es:[80h],cl ;store new cmd line length
ret
SetupCmdLine endp
;*** LhSetupErrMsg -- Sets up error messages
;
; ENTRY ax = error message number
;
; EXIT None
;
; USED dx
;
; EFFECTS
; Everything setup to display error message
;
LhSetupErrMsg proc near
assume ds:TRANGROUP, es:TRANGROUP
mov msg_disp_class,EXT_MSG_CLASS
mov dx,offset TranGroup:Extend_Buf_ptr
mov Extend_Buf_ptr,ax
ret
LhSetupErrMsg endp
;
;M009; Start of changes
;
;*** GetUMBState -- get the current alloc strat and link state
;
; ENTRY None
;
; EXIT al contains the status as follows:
; b0 = 1 if Alloc strat is HighFirst
; = 0 if alloc strat is LowFirst
; b1 = 1 if UMBs are linked in
; = 0 if UMBs are unlinked
;
; USED ax, bx
;
GetUMBState proc near
assume ds:TRANGROUP, es:TRANGROUP
mov ax,(ALLOCOPER shl 8) OR 0 ;get alloc strat
int 21h
mov bl,al
mov ax,(ALLOCOPER shl 8) OR 2 ;get link state
int 21h
mov bh,al
xchg ax,bx ;ax contains the state
rol al,1 ;get HighFirst state in b0
and al,01 ;mask off b1-b7
shl ah,1 ;linkstate in b1
or al,ah ;b0=HighFirst, b1=Linkstate
ret
GetUMBState endp
;
; M009; End of changes
;
;*** SetupUMBs -- set allocation strategy to HighFirst and link in UMBs to
; DOS arena to load the program into UMBs
;
; ENTRY None
;
; EXIT None
;
; USED
;
; EFFECTS
; Allocation strategy set to HighFirst
; UMBs linked into DOS arena
SetupUMBs proc near
assume ds:TRANGROUP
push ds
call GetUMBState ;get current state of UMBs ;M009
mov ds,ds:ResSeg ; M009
assume ds:DATARES ; M009
mov LoadHiFlg,al ; M009
or LoadHiFlg,80h ;indicate loadhigh issued ; M009
pop ds
assume ds:TRANGROUP
call Lh_On ;alloc strategy to HighFirst
call Lh_Link ;link in UMBs
ret
SetupUMBs endp
;*** SetupPath -- Do path search for the file to be executed
;
; ENTRY None
;
; EXIT Carry set if file not found or not executable file
;
; EFFECTS
; ExecPath contains the full path of the file to be executed
;
SetupPath proc near
assume ds:TRANGROUP, es:TRANGROUP
;
;Juggle around the argv pointers to make argv[1] into argv[0]. This is
;because the path search routine that we are about to invoke expects the
;filename to search for to be argv[0]
;
mov ax,arg.argvcnt ;total number of arguments
dec ax ;less one - skip "LoadHigh"
mov bx,SIZE Argv_ele
mul bx ;dx:ax = size of argument lists
;
;Move argv[1]..argv[n] to argv[0]..argv[n-1]
;
mov di,offset TRANGROUP:Arg
mov si,di
add si,SIZE Argv_ele
mov cx,ax ;size to move
cld
rep movsb ;Move the argument list
dec arg.argvcnt ;fake one less argument
call path_search ;look in the path
;
;ax = 0, no file found
;ax < 4, batch file found -- cant be executed
;ax = 4,8 => .com or .exe file found
;
or ax,ax ;any file found?
jz no_exec_file ;no, error
cmp ax,4 ;executable file?
jl no_exec_bat ;no, indicate fail ; M016
clc
ret
no_exec_bat: ; M016
mov dx,offset TRANGROUP:NoExecBat_Ptr ;Setup message ptr ; M016
jmp short lhsp_errret ;return error; M016
no_exec_file:
mov ax,ERROR_FILE_NOT_FOUND
call LhSetupErrMsg ;setup error message
lhsp_errret: ; M016
stc
ret
SetupPath endp
TRANCODE ends
end