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 |