338 lines
8 KiB
NASM
338 lines
8 KiB
NASM
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
|
||
|