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

; parameter. The

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 for more info. ; ; @parm WORD | nCmdShow | Specifies how the application is shown. ; See 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 for valid ; error values. ; ; @xref LoadModule WinExec ; ;============================================================================ cProc BWinExec, , 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, ; 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