summaryrefslogtreecommitdiffstats
path: root/contrib/libpcap/msdos/ndis_0.asm
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libpcap/msdos/ndis_0.asm')
-rw-r--r--contrib/libpcap/msdos/ndis_0.asm188
1 files changed, 188 insertions, 0 deletions
diff --git a/contrib/libpcap/msdos/ndis_0.asm b/contrib/libpcap/msdos/ndis_0.asm
new file mode 100644
index 0000000..2990985
--- /dev/null
+++ b/contrib/libpcap/msdos/ndis_0.asm
@@ -0,0 +1,188 @@
+PAGE 60,132
+NAME NDIS_0
+
+ifdef DOSX
+ .386
+ _TEXT SEGMENT PUBLIC DWORD USE16 'CODE'
+ _TEXT ENDS
+ _DATA SEGMENT PUBLIC DWORD USE16 'CODE'
+ _DATA ENDS
+ _TEXT32 SEGMENT PUBLIC BYTE USE32 'CODE'
+ _TEXT32 ENDS
+ CB_DSEG EQU <CS> ; DOSX is tiny-model
+ D_SEG EQU <_TEXT SEGMENT>
+ D_END EQU <_TEXT ENDS>
+ ASSUME CS:_TEXT,DS:_TEXT
+
+ PUSHREGS equ <pushad>
+ POPREGS equ <popad>
+
+ PUBPROC macro name
+ align 4
+ public @&name
+ @&name label near
+ endm
+else
+ .286
+ _TEXT SEGMENT PUBLIC DWORD 'CODE'
+ _TEXT ENDS
+ _DATA SEGMENT PUBLIC DWORD 'DATA'
+ _DATA ENDS
+ CB_DSEG EQU <SEG _DATA> ; 16bit is small/large model
+ D_SEG EQU <_DATA SEGMENT>
+ D_END EQU <_DATA ENDS>
+ ASSUME CS:_TEXT,DS:_DATA
+
+ PUSHREGS equ <pusha>
+ POPREGS equ <popa>
+
+ PUBPROC macro name
+ public _&name
+ _&name label far
+ endm
+endif
+
+;-------------------------------------------
+
+D_SEG
+
+D_END
+
+
+_TEXT SEGMENT
+
+EXTRN _NdisSystemRequest : near
+EXTRN _NdisRequestConfirm : near
+EXTRN _NdisTransmitConfirm : near
+EXTRN _NdisReceiveLookahead : near
+EXTRN _NdisIndicationComplete : near
+EXTRN _NdisReceiveChain : near
+EXTRN _NdisStatusProc : near
+EXTRN _NdisAllocStack : near
+EXTRN _NdisFreeStack : near
+
+;
+; *ALL* interrupt threads come through this macro.
+;
+CALLBACK macro callbackProc, argsSize
+
+ pushf
+ PUSHREGS ;; Save the registers
+
+ push es
+ push ds
+ mov ax,CB_DSEG ;; Load DS
+ mov ds,ax
+ call _NdisAllocStack ;; Get and install a stack.
+
+ mov bx,ss ;; Save off the old stack in other regs
+ mov cx,sp
+ mov ss,dx ;; Install the new one
+ mov sp,ax
+ push bx ;; Save the old one on to the new stack
+ push cx
+ sub sp,&argsSize ;; Allocate space for arguments on the stack
+
+ mov ax,ss ;; Set up the destination for the move
+ mov es,ax
+ mov di,sp
+ mov ds,bx ;; Set up the source for the move.
+ mov si,cx
+ add si,4+6+32
+
+ mov cx,&argsSize ;; Move the arguments to the stack.
+ shr cx,1
+ cld
+ rep movsw
+
+ mov ax,CB_DSEG ;; Set my data segment again.
+ mov ds,ax
+
+ call &callbackProc ;; Call the real callback.
+ pop di ;; Pop off the old stack
+ pop si
+ mov bx,ss ;; Save off the current allocated stack.
+ mov cx,sp
+ mov ss,si ;; Restore the old stack
+ mov sp,di
+ push ax ;; Save the return code
+ push bx ;; Free the stack. Push the pointer to it
+ push cx
+ call _NdisFreeStack
+ add sp,4
+ pop ax ;; Get the return code back
+ add di,32 ;; Get a pointer to ax on the stack
+ mov word ptr ss:[di],ax
+ pop ds
+ pop es
+
+ POPREGS
+ popf
+endm
+
+;
+; Define all of the callbacks for the NDIS procs.
+;
+
+PUBPROC systemRequestGlue
+CALLBACK _NdisSystemRequest,14
+RETF
+
+PUBPROC requestConfirmGlue
+CALLBACK _NdisRequestConfirm,12
+RETF
+
+PUBPROC transmitConfirmGlue
+CALLBACK _NdisTransmitConfirm,10
+RETF
+
+PUBPROC receiveLookaheadGlue
+CALLBACK _NdisReceiveLookahead,16
+RETF
+
+PUBPROC indicationCompleteGlue
+CALLBACK _NdisIndicationComplete,4
+RETF
+
+PUBPROC receiveChainGlue
+CALLBACK _NdisReceiveChain,16
+RETF
+
+PUBPROC statusGlue
+CALLBACK _NdisStatusProc,12
+RETF
+
+;
+; int FAR NdisGetLinkage (int handle, char *data, int size);
+;
+
+ifdef DOSX
+ PUBPROC NdisGetLinkage
+ push ebx
+ mov ebx, [esp+8] ; device handle
+ mov eax, 4402h ; IOCTRL read function
+ mov edx, [esp+12] ; DS:EDX -> result data
+ mov ecx, [esp+16] ; ECX = length
+ int 21h
+ pop ebx
+ jc @fail
+ xor eax, eax
+ @fail: ret
+
+else
+ PUBPROC NdisGetLinkage
+ enter 0, 0
+ mov bx, [bp+6]
+ mov ax, 4402h
+ mov dx, [bp+8]
+ mov cx, [bp+12]
+ int 21h
+ jc @fail
+ xor ax, ax
+ @fail: leave
+ retf
+endif
+
+ENDS
+
+END
OpenPOWER on IntegriCloud