Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
3.4 KiB

  1. ; Copyright (c) 1998 Microsoft Corporation
  2. ;;MMDEVLDR.ASM
  3. page ,132
  4. ;-----------------------------Module-Header-----------------------------;
  5. ;
  6. ; @Doc DMusic16
  7. ;
  8. ; @Module MMDevLdr.asm - Interface routines for MMDevLdr |
  9. ;
  10. ;-----------------------------------------------------------------------;
  11. ?PLM = 1
  12. ?WIN = 0
  13. PMODE = 1
  14. .xlist
  15. include cmacros.inc
  16. include windows.inc
  17. include mmdevldr.inc
  18. include mmsystem.inc
  19. .list
  20. externFP AllocCStoDSAlias ;(UINT sel);
  21. externFP FreeSelector ;(UINT sel);
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23. ;
  24. ; equates
  25. ;
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  27. OFFSEL struc
  28. off dw ?
  29. sel dw ?
  30. OFFSEL ends
  31. GetDeviceAPI EQU 1684h ; int 2Fh query
  32. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  33. ;
  34. ; segmentation
  35. ;
  36. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  37. ;;;createSeg %SEGNAME, CodeSeg, word, public, CODE
  38. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  39. ;
  40. ; code segment
  41. ;
  42. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  43. ; Remember, we are still 16bit.
  44. .model medium
  45. .386
  46. ;sBegin CodeSeg
  47. .code
  48. ; assumes cs, _text
  49. MMDEVLDR_Entry dd ? ; the api entry point for mmdevldr
  50. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  51. ;
  52. ; @func BOOL CDECL | SetWin32Event | Set a Win32 event from any context
  53. ;
  54. ; @comm
  55. ;
  56. ; Given the VxD handle to an event, set the event. This function calls the MMDevLdr
  57. ; VxD API entry, which in turn calls the VWin32 function to perform the set.
  58. ;
  59. ; @rdesc
  60. ; Returns TRUE on success, or FALSE if MMDevLdr could not be found.
  61. ;
  62. ; @parm DWORD | dwRing0Event | The VxD handle of the event as returned
  63. ; from the <f OpenVxDHandle> kernel API.
  64. ;
  65. ;
  66. cProc _SetWin32Event <FAR, CDECL, PUBLIC> <>
  67. ParmD dwRing0Evt
  68. cBegin nogen
  69. mov dx, MMDEVLDR_API_SetEvent
  70. jmp short MMDEVLDR_Call
  71. cEnd nogen
  72. ;
  73. ;
  74. ;
  75. cProc MMDEVLDR_Call <FAR, CDECL> <>
  76. cBegin nogen
  77. mov ecx, [MMDEVLDR_Entry]
  78. jecxz short mmdevldr_load
  79. jmp [MMDEVLDR_Entry]
  80. mmdevldr_load:
  81. push dx ; save MMDEVLDR command ID
  82. push di
  83. push si
  84. cCall AllocCStoDSAlias, <cs>
  85. mov si, ax
  86. xor di, di ; zero ES:DI before call
  87. mov es, di
  88. mov ax, GetDeviceAPI ; get device API entry point
  89. mov bx, MMDEVLDR_Device_ID ; virtual device ID
  90. int 2Fh ; call WIN/386 INT 2F API
  91. mov ax, es
  92. mov es, si
  93. ; assumes es, CodeSeg
  94. mov es:MMDEVLDR_Entry.off, di
  95. mov es:MMDEVLDR_Entry.sel, ax
  96. assumes es, nothing
  97. push ax
  98. cCall FreeSelector, <si>
  99. pop ax
  100. or ax, di
  101. pop si
  102. pop di
  103. pop dx
  104. jz short mmdevldr_fail
  105. jmp [MMDEVLDR_Entry]
  106. mmdevldr_fail:
  107. mov ax, MMSYSERR_NODRIVER;
  108. retf
  109. cEnd nogen
  110. ;sEnd CodeSeg
  111. end