windows-nt/Source/XPSP1/NT/base/mvdm/wow16/mmsystem/bwinexec.asm
2020-09-26 16:20:57 +08:00

223 lines
6 KiB
NASM

PAGE 58,132
;******************************************************************************
TITLE bwinexec.asm - WinExec with binary command line
;******************************************************************************
;
; Copyright (C) Microsoft Corporation 1985-1990. All rights reserved.
;
; Title: bwinexec.asm - Exec. an app. with a block of binary data.
;
; Version: 1.00
;
; Date: 14-Mar-1990 (from winexec)
;
; Author: ROBWI
;
;------------------------------------------------------------------------------
;
; Change log:
;
; DATE REV DESCRIPTION
; ----------- --- -----------------------------------------------------------
; 14-Mar-1990 RJW Modified Toddla's WinExec code to take a binary command
; block instead of an ascii command line
;
;==============================================================================
?PLM=1
?WIN=0
PMODE=1
.xlist
include cmacros.inc
include windows.inc
.list
externFP LoadModule
EXECBLOCK struc
envseg dw ? ; seg addr of environment
lpcmdline dd ? ; pointer to command block (normally ascii str)
lpfcb1 dd ? ; default fcb at 5C
lpfcb2 dd ? ; default fcb at 6C
EXECBLOCK ends
; The following structure should be used to access high and low
; words of a DWORD. This means that "word ptr foo[2]" -> "foo.hi".
LONG struc
lo dw ?
hi dw ?
LONG ends
ifndef SEGNAME
SEGNAME equ <_TEXT>
endif
createSeg %SEGNAME, CodeSeg, word, public, CODE
sBegin CodeSeg
assumes cs,CodeSeg
assumes es,nothing
assumes ds,nothing
;****************************************************************************
;
; @doc INTERNAL MMSYSTEMS
;
; @api HANDLE | BWinExec | This function executes the Windows
; or non-Windows application identified by the <p lpCmdLine>
; parameter. The <p nCmdShow> parameter specifies the initial
; state of the applications main window when it is created.
;
; @parm LPSTR | lpModuleName | Far pointer to a null-terminated
; character string that contains the filename of the
; application to run. See <f LoadModule> for more info.
;
; @parm WORD | nCmdShow | Specifies how the application is shown.
; See <f ShowWindow> for valid values.
;
; @parm LPVOID | lpParameters | Specifies a far pointer to a block
; of data which will be passed to the application as a cmd
; tail. The first byte of the block must be the length of the
; data and must be less than or equal to 120.
;
; @rdesc The return value identifies the instance of the loaded module if
; the function was successful. Otherwise, it is a value less than
; 32 that specifies the error. See <f LoadModule> for valid
; error values.
;
; @xref LoadModule WinExec
;
;============================================================================
cProc BWinExec, <FAR,PUBLIC,NODATA>,<si,di>
parmD lpszFile ; Pathname ptr
parmW wShow ; Mode flag
parmD lpParameters ; Cmd Line Data
LocalV szCommand, 128 ; ASCIIZ Name of program to exec
LocalV szParm, 128 ; DOS version of parameters
LocalB szParmLen ; DOS parm length
LocalB bDotFound ; Non-zero if a period is in the string
LocalV loadparams, %(SIZE EXECBLOCK)
LocalV rOF, %(SIZE OPENSTRUC)
LocalD FCB1
cBegin
mov byte ptr szParm,0Dh
mov szParmLen,0 ; Init to zero length, Line feed
; Copy first part of line into szCommand.
lds si,lpszFile
mov ax,ss
mov es,ax
lea di,szCommand
xor al,al
mov bDotFound,al
; Loop until a blank or NULL is found.
WELoop1:
lodsb
cmp al,' ' ; Exit loop if blank or NULL
je WECont1
or al,al
je WECont1
cmp al,'.'
jne WELoopCont
mov bDotFound,al
WELoopCont:
stosb
jmp short WELoop1
WECont1:
; Does the command have an extension?
cmp bDotFound,0
jne WEHasExt
mov ax,0452Eh ;'.E'
stosw
mov ax,04558h ;'XE'
stosw
WEHasExt:
xor ax,ax ; NULL terminate string
stosb
lds si,lpParameters
mov ax, ds
or ax, si ; NULL Parameter block?
jz WEExec ; Y: exec
; Copy Parameter Block into szParm.
lea di, szParmLen
lodsb
xor cx,cx
mov cl, al
push dx ; truncate to legal length!
mov ax, 78h
sub ax, cx
cwd
and ax, dx
add cx, ax ; length + 1 in cx
pop dx
mov al, cl
stosb
dec cx
cld
rep movsb
; Terminate it with a linefeed.
mov al,0Dh
stosb
; Set up the FCBs.
WEExec:
mov word ptr FCB1[0],2 ; FCB1[0] = 2;
mov ax,wShow ; FCB1[1] = wShow;
mov word ptr FCB1[2],ax
xor ax,ax
mov loadparams.envseg,ax ; loadparms.segEnv = 0;
mov loadparams.lpfcb2.lo,ax ; loadparms.lpFCB2 = (LPSTR)NULL;
mov loadparams.lpfcb2.hi,ax
lea ax,szParmLen ; loadparms.lpCmdLine = (LPSTR)ach;
mov loadparams.lpCmdLine.lo,ax
mov loadparams.lpCmdLine.hi,ss
lea ax,FCB1 ; loadparms.lpFCB1 = (LPSTR)fcb1buf;
mov loadparams.lpfcb1.lo,ax
mov loadparams.lpfcb1.hi,ss
; Exec the progam.
lea dx,szCommand ; ds:ax == ptr to file to exec
lea bx,loadparams ; es:bx == ptr to param block
if 1
cCall LoadModule, <ss,dx, ss,bx> ; return ax=hInstance, dx=hTask
cmp ax,32
jb @f
mov ax,dx ; return hTask
@@:
else
mov ax,ss
mov ds,ax
mov ax,4B00h ; dos exec
int 21h
endif
cEnd
sEnd CodeSeg
end