windows-nt/Source/XPSP1/NT/enduser/netmeeting/av/dcap/16/dcasm.asm

112 lines
1.6 KiB
NASM
Raw Normal View History

2020-09-26 03:20:57 -05:00
; DCASM.ASM
;
; Created 31-Jul-96 [JonT]
PAGE 60, 255
.MODEL small, pascal
TITLE DCASM.ASM
.386
.DATA
extrn g_dwEntrypoint:DWORD
szName DB 'DCAPVXD ', 0
.CODE
extrn OpenDriver:FAR
extrn CloseDriver:FAR
PUBLIC _OpenDriver
_OpenDriver::
jmp OpenDriver
PUBLIC _CloseDriver
_CloseDriver::
jmp CloseDriver
; ReturnSel
; Returns either CS or DS to the C caller
ReturnSel PROC NEAR PASCAL, fCS:WORD
mov ax, ds
cmp fCS, 0
jz RS_Done
mov ax, cs
RS_Done:
ret
ReturnSel ENDP
; GetVxDEntrypoint
; Returns device entrypoint in DX:AX or zero on error
GetVxDEntrypoint PROC NEAR PASCAL uses si di
; Get the entrypoint from the VMM
xor bx, bx
mov ax, 1684h
push ds
pop es
mov di, OFFSET szName
int 2Fh
; Return entrypoint in EAX
mov dx, es
mov ax, di
ret
GetVxDEntrypoint ENDP
; SetWin32Event
; Sets a Win32 event using the VxD
SetWin32Event PROC NEAR PASCAL, pev:DWORD
; Call the VxD. Note that pev is already a flat pointer
mov ah, 1
mov ecx, pev
call [g_dwEntrypoint]
ret
SetWin32Event ENDP
; _CloseVxDHandle
; Calls the VxD to close a VxD handle. This is really torturous
; since it's just going to call into KERNEL32, but there's no
; export to do this from ring 3. Go figure.
_CloseVxDHandle PROC FAR PASCAL USES ds, pev:DWORD
mov ax, DGROUP
mov ds, ax
mov ah, 2
mov ecx, pev
call [g_dwEntrypoint]
ret
_CloseVxDHandle ENDP
; ZeroMemory
;
; Since we can't call CRT, does a memset(lp, 0, len)
ZeroMemory PROC NEAR PASCAL USES di, lp:DWORD, len:WORD
les di, lp
xor eax, eax
mov cx, len
shr cx, 2
rep stosd
mov cx, len
and cx, 3
rep stosb
ret
ZeroMemory ENDP
END