Windows2003-3790/base/mvdm/dos/v86/redir/mailslot.asm
2020-09-30 16:53:55 +02:00

338 lines
8.3 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

page ,132
if 0
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
mailslot.asm
Abstract:
This module contains the resident code part of the stub redir TSR for NT
VDM net support. The routines contained herein are the mailslot API stubs:
DosDeleteMailslot
DosMailslotInfo
DosMakeMailslot
DosPeekMailslot
DosReadMailslot
DosWriteMailslot
Author:
Richard L Firth (rfirth) 05-Sep-1991
Environment:
Dos mode only
Revision History:
05-Sep-1991 rfirth
Created
--*/
endif
.xlist ; don't list these include files
.xcref ; turn off cross-reference listing
include dosmac.inc ; Break macro etc (for following include files only)
include dossym.inc ; User_<Reg> defines
include mult.inc ; MultNET
include error.inc ; DOS errors - ERROR_INVALID_FUNCTION
include syscall.inc ; DOS system call numbers
include rdrint2f.inc ; redirector Int 2f numbers
include segorder.inc ; segments
include enumapis.inc ; dispatch codes
include debugmac.inc ; DbgPrint macro
include localmac.inc ; DbgPrint macro
include rdrsvc.inc ; BOP and SVC macros/dispatch codes
include sf.inc ; SFT definitions/structure
.cref ; switch cross-reference back on
.list ; switch listing back on
subttl ; kill subtitling started in include file
.286 ; all code in this module 286 compatible
ResidentCodeStart
assume cs:ResidentCode
assume ds:nothing
; *** DosDeleteMailslot
; *
; * Delete a local mailslot. We must also pass in the current PDB. A
; * Dos process can only delete mailslots which it has previously
; * created. We pass the PDB in ax, since it only contains a dispatch
; * vector
; *
; * Function = 5F4Eh
; *
; * ENTRY BX = Mailslot handle
; *
; * EXIT CF = 1
; * AX = Error code
; *
; * CF = 0
; * ES:DI = Mailslot buffer address
; * DX = Mailslot selector
; *
; * RETURNS
; *
; * USES ax, dx, di, ds, es, flags
; *
; * ASSUMES nothing
; *
; ***
public DosDeleteMailslot
DosDeleteMailslot proc near
push bx
mov ah,51h
int 21h ; get current PDB
mov ax,bx ; ax := current PDB
pop bx ; bx := mailslot handle
SVC SVC_RDRDELETEMAILSLOT
jc @f
;
; success - copy returned info in registers to copy of caller's registers in
; DOS segment
;
DosCallBack GET_USER_STACK
mov [si].User_Dx,dx
mov [si].User_Es,es
mov [si].User_Di,di
clc
@@: ret
DosDeleteMailslot endp
; *** DosMailslotInfo
; *
; * Retrieves local mailslot info
; *
; * Function = 5F4Fh
; *
; * ENTRY BX = Mailslot handle
; *
; * EXIT CF = 1
; * AX = Error code
; *
; * CF = 0
; * AX = Message size
; * BX = Mailslot size
; * CX = Next size
; * DX = Next priority
; * SI = Message count
; *
; * USES ax, bx, cx, dx, si, ds, flags
; *
; * ASSUMES nothing
; *
; ***
public DosMailslotInfo
DosMailslotInfo proc near
SVC SVC_RDRGETMAILSLOTINFO
jc @f
push si ; push returned values on stack
push dx
push cx
push bx
push ax
DosCallBack GET_USER_STACK ; get caller register frame
pop [si].User_Ax ; set caller's registers to returned values
pop [si].User_Bx
pop [si].User_Cx
pop [si].User_Dx
pop [si].User_Si
clc
@@: ret
DosMailslotInfo endp
; *** DosMakeMailslot
; *
; * Creates a local mailslot. We need to pass in the current PDB as a
; * process identifier (see DosDeleteMailslot). We use ax since this only
; * contains a dispatch vector
; *
; * Function = 5F4Dh
; *
; * ENTRY DS:SI = ASCIZ Name of mailslot to create
; * BX = Message size (hint)
; * CX = Mailslot size (hint)
; * DX = Mailslot selector (for WIN 3 protect mode)
; * ES:DI = User's data buffer
; *
; * EXIT CF = 1
; * AX = Error code
; *
; * CF = 0
; * AX = Mailslot handle
; *
; * USES ax, flags
; *
; * ASSUMES nothing
; *
; ***
public DosMakeMailslot
DosMakeMailslot proc near
push bx
mov ah,51h
int 21h ; get current PDB
mov ax,bx ; ax := current PDB
pop bx ; bx := mailslot size
if 0
if DEBUG
DbgPrintString "DosMakeMailslot: ax="
DbgPrintHexWord ax
DbgPrintString <13,10," Message size (bx) =">, NO_BANNER
DbgPrintHexWord bx
DbgPrintString <13,10," Mailslot size (cx) =">, NO_BANNER
DbgPrintHexWord cx
DbgPrintString <13,10," Mailslot selector (dx) =">, NO_BANNER
DbgPrintHexWord dx
DbgPrintString <13,10," User buffer (es:di) =">, NO_BANNER
DbgPrintHexWord es
DbgPrintString ":", NO_BANNER
DbgPrintHexWord di
DbgPrintString <13,10>,NO_BANNER
endif
endif
SVC SVC_RDRMAKEMAILSLOT
ret
DosMakeMailslot endp
; *** DosPeekMailslot
; *
; * Reads a message from a mailslot non-destructively
; *
; * Function = 5F51h
; *
; * ENTRY BX = Mailslot handle
; * ES:DI = Buffer address
; *
; * EXIT CF = 1
; * AX = Error code
; *
; * CF = 0
; * AX = Bytes read
; * CX = Next size
; * DX = Next priority
; *
; * USES ax, cx, dx, si, ds, flags
; *
; * ASSUMES nothing
; *
; ***
public DosPeekMailslot
DosPeekMailslot proc near
SVC SVC_RDRPEEKMAILSLOT
jmp short common_peek_read ; jump to common read/peek processing
DosPeekMailslot endp
; *** DosReadMailslot
; *
; * Reads the next message from a mailslot
; *
; * Function = 5F50h
; *
; * ENTRY BX = Mailslot handle
; * ES:DI = Buffer address
; * DX:CX = Timeout (mSec)
; *
; * EXIT CF = 1
; * AX = Error code
; *
; * CF = 0
; * AX = Bytes read
; * CX = NextSize
; * DX = NextPriorty
; *
; * USES ax, cx, dx, si, ds, flags
; *
; * ASSUMES nothing
; *
; ***
public DosReadMailslot
DosReadMailslot proc near
SVC SVC_RDRREADMAILSLOT
;
; common read/peek mailslot code - if error return else copy following values
; returned in registers to caller's registers in DOS stack segment
;
common_peek_read:
jc @f ; error - return
push dx
push cx
push ax
DosCallBack GET_USER_STACK
pop [si].User_Ax ; # bytes read
pop [si].User_Cx ; byte size of next message
pop [si].User_Dx ; priority of next message
clc ; indicate success
@@: ret
DosReadMailslot endp
; *** DosWriteMailslot
; *
; * Writes a message to a mailslot. The mailslot is identified by a
; * symbolic name (even if its local)
; *
; * Function = 5F52h
; *
; * ENTRY DS:SI = Destination mailslot name
; * ES:DI = Pointer to DosWriteMailslotStruct:
; * DWORD Timeout
; * char far* Buffer
; * CX = Number of bytes in buffer
; * DX = Message priority
; * BX = Message class
; *
; * EXIT CF = 1
; * AX = Error code
; *
; * CF = 0
; * No error
; *
; * USES ax, flags
; *
; * ASSUMES nothing
; *
; ***
public DosWriteMailslot
DosWriteMailslot proc near
SVC SVC_RDRWRITEMAILSLOT
ret
DosWriteMailslot endp
ResidentCodeEnd
end