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