| 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 |