; 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 kernel API. ; ; cProc _SetWin32Event <> ParmD dwRing0Evt cBegin nogen mov dx, MMDEVLDR_API_SetEvent jmp short MMDEVLDR_Call cEnd nogen ; ; ; cProc MMDEVLDR_Call <> 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, 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, 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