135 lines
3.3 KiB
NASM
135 lines
3.3 KiB
NASM
|
; Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
;;MMDEVLDR.ASM
|
||
|
|
||
|
page ,132
|
||
|
;-----------------------------Module-Header-----------------------------;
|
||
|
;
|
||
|
; @Doc DMusic16
|
||
|
;
|
||
|
; @Module MMDevLdr.asm - Interface routines for MMDevLdr |
|
||
|
;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
|
||
|
?PLM = 1
|
||
|
?WIN = 0
|
||
|
PMODE = 1
|
||
|
|
||
|
.xlist
|
||
|
include cmacros.inc
|
||
|
include windows.inc
|
||
|
include mmdevldr.inc
|
||
|
include mmsystem.inc
|
||
|
.list
|
||
|
|
||
|
externFP AllocCStoDSAlias ;(UINT sel);
|
||
|
externFP FreeSelector ;(UINT sel);
|
||
|
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;
|
||
|
; equates
|
||
|
;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
|
||
|
OFFSEL struc
|
||
|
off dw ?
|
||
|
sel dw ?
|
||
|
OFFSEL ends
|
||
|
|
||
|
GetDeviceAPI EQU 1684h ; int 2Fh query
|
||
|
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;
|
||
|
; segmentation
|
||
|
;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
|
||
|
;;;createSeg %SEGNAME, CodeSeg, word, public, CODE
|
||
|
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;
|
||
|
; code segment
|
||
|
;
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
|
||
|
; Remember, we are still 16bit.
|
||
|
|
||
|
.model medium
|
||
|
.386
|
||
|
|
||
|
;sBegin CodeSeg
|
||
|
.code
|
||
|
|
||
|
; assumes cs, _text
|
||
|
|
||
|
MMDEVLDR_Entry dd ? ; the api entry point for mmdevldr
|
||
|
|
||
|
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
;
|
||
|
; @func BOOL CDECL | SetWin32Event | Set a Win32 event from any context
|
||
|
;
|
||
|
; @comm
|
||
|
;
|
||
|
; Given the VxD handle to an event, set the event. This function calls the MMDevLdr
|
||
|
; VxD API entry, which in turn calls the VWin32 function to perform the set.
|
||
|
;
|
||
|
; @rdesc
|
||
|
; Returns TRUE on success, or FALSE if MMDevLdr could not be found.
|
||
|
;
|
||
|
; @parm DWORD | dwRing0Event | The VxD handle of the event as returned
|
||
|
; from the <f OpenVxDHandle> kernel API.
|
||
|
;
|
||
|
;
|
||
|
|
||
|
cProc _SetWin32Event <FAR, CDECL, PUBLIC> <>
|
||
|
ParmD dwRing0Evt
|
||
|
cBegin nogen
|
||
|
mov dx, MMDEVLDR_API_SetEvent
|
||
|
jmp short MMDEVLDR_Call
|
||
|
cEnd nogen
|
||
|
|
||
|
;
|
||
|
;
|
||
|
;
|
||
|
cProc MMDEVLDR_Call <FAR, CDECL> <>
|
||
|
cBegin nogen
|
||
|
mov ecx, [MMDEVLDR_Entry]
|
||
|
jecxz short mmdevldr_load
|
||
|
jmp [MMDEVLDR_Entry]
|
||
|
mmdevldr_load:
|
||
|
push dx ; save MMDEVLDR command ID
|
||
|
push di
|
||
|
push si
|
||
|
cCall AllocCStoDSAlias, <cs>
|
||
|
mov si, ax
|
||
|
xor di, di ; zero ES:DI before call
|
||
|
mov es, di
|
||
|
mov ax, GetDeviceAPI ; get device API entry point
|
||
|
mov bx, MMDEVLDR_Device_ID ; virtual device ID
|
||
|
int 2Fh ; call WIN/386 INT 2F API
|
||
|
mov ax, es
|
||
|
mov es, si
|
||
|
; assumes es, CodeSeg
|
||
|
mov es:MMDEVLDR_Entry.off, di
|
||
|
mov es:MMDEVLDR_Entry.sel, ax
|
||
|
assumes es, nothing
|
||
|
push ax
|
||
|
cCall FreeSelector, <si>
|
||
|
pop ax
|
||
|
or ax, di
|
||
|
pop si
|
||
|
pop di
|
||
|
pop dx
|
||
|
jz short mmdevldr_fail
|
||
|
jmp [MMDEVLDR_Entry]
|
||
|
mmdevldr_fail:
|
||
|
mov ax, MMSYSERR_NODRIVER;
|
||
|
retf
|
||
|
cEnd nogen
|
||
|
|
||
|
|
||
|
;sEnd CodeSeg
|
||
|
|
||
|
end
|