page    ,132
;-----------------------------Module-Header-----------------------------;
; Module Name:  DRVR31.ASM - Installable driver code.
;
; all this code does is pass any installable driver API on to
; win 3.1 USER.
;
; Created:  28-08-91
; Author:   Todd Laney [ToddLa]
;
; Copyright (c) 1984-1991 Microsoft Corporation
;
;-----------------------------------------------------------------------;

        ?PLM    = 1
        ?WIN    = 0
        PMODE	= 1

	.xlist
	include cmacros.inc
        include windows.inc
        .list

;
; these are the USER driver interface functions
;
        externFP    OpenDriver                  ; USER
        externFP    CloseDriver                 ; USER
        externFP    GetDriverModuleHandle       ; USER
        externFP    SendDriverMessage           ; USER
	externFP    DefDriverProc		; USER

ifdef DEBUG
        externFP    GetModuleFileName           ; KERNEL
        externFP    _dprintf                    ; COMM.ASM
endif

; 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

FARPOINTER      struc
off     dw      ?
sel     dw      ?
FARPOINTER      ends

ifndef SEGNAME
        SEGNAME equ <_TEXT>
endif

createSeg %SEGNAME, CodeSeg, word, public, CODE

sBegin  CodeSeg
        assumes cs,CodeSeg
        assumes ds,nothing
        assumes es,nothing

;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
    assumes ds,nothing
    assumes es,nothing

ifdef DEBUG

szSuccess:
        db "MMSYSTEM: DrvOpen(%ls) (%ls)", 13,10,0

szFailed:
        db "MMSYSTEM: DrvOpen(%ls) *failed*", 13,10,0

cProc DrvOpen, <FAR, PUBLIC, PASCAL, LOADDS>, <>
        ParmD   szDriverName
        ParmD   szSectionName
        ParmD   dw2
        LocalV  ach,128
cBegin
	cCall   OpenDriver, <szDriverName, szSectionName, dw2>
        push    ax

        lea     bx,szFailed
        or      ax,ax
        jz      DrvOpenFailed

        cCall   GetDriverModuleHandle, <ax>

        lea     bx,ach
        cCall   GetModuleFileName,<ax, ss,bx, 128>

        lea     bx,szSuccess

DrvOpenFailed:
        lea     ax,ach
        push    ss                      ; ach
        push    ax

        push    szDriverName.sel        ; szDriverName
        push    szDriverName.off

        push    cs                      ; szFormat
        push    bx

        call    _dprintf                ; dprintf(szFormat, szDriverName, ach)
        add     sp,6*2

DrvOpenExit:
	pop	ax			; return hdrv to caller

DrvOpenExitNow:
cEnd

else ; DEBUG

cProc DrvOpen, <FAR, PUBLIC, PASCAL>, <>
;       ParmD   szDriverName
;       ParmD   szSectionName
;       ParmD   dw2
cBegin nogen

        jmp     OpenDriver

cEnd nogen




endif ; DEBUG

;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
    assumes ds,nothing
    assumes es,nothing

cProc DrvClose, <FAR, PUBLIC, PASCAL>, <>
;       ParmW   hDriver
;       ParmD   dw1
;       ParmD   dw2
cBegin nogen

        jmp     CloseDriver

cEnd nogen

;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
    assumes ds,nothing
    assumes es,nothing

cProc DrvGetModuleHandle, <FAR, PUBLIC, PASCAL>, <>
;       ParmW   hDriver
cBegin nogen

        jmp     GetDriverModuleHandle

cEnd nogen

;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
    assumes ds,nothing
    assumes es,nothing

cProc DrvSendMessage, <FAR, PUBLIC, PASCAL>, <>
;       ParmW   hDriver
;       ParmW   message
;       ParmD   dw1
;       ParmD   dw2
cBegin nogen

        jmp     SendDriverMessage

cEnd nogen

;-----------------------------------------------------------------------;
;-----------------------------------------------------------------------;
    assumes ds,nothing
    assumes es,nothing

cProc DrvDefDriverProc, <FAR, PUBLIC, PASCAL>, <>
;       ParmD   dwDriver
;       ParmW   hDriver
;       ParmW   message
;       ParmD   dw1
;       ParmD   dw2
cBegin nogen

        jmp     DefDriverProc

cEnd nogen

sEnd

end