programming-examples/assembly/Fetches and prints the network serial number under Novell Netware 3.11.asm

98 lines
2.6 KiB
NASM
Raw Normal View History

2019-11-15 12:59:38 +01:00
TITLE "NetWare serial number routine"
; Net_SN.Asm
;
; I've tested this code with Netware 386 version 3.11,
; but it may also work with 2.15. It wasn't documented
; for 2.15, but it may still have existed.
;
.MODEL SMALL
.STACK 100h
.DATA
AAMn macro num
db 0d4h, num
endm
STDOUT = 1 ; handle for stdout
SNREQBUFF struc
MyLength DW 1 ; request structure length - 2
Function DB 12h ; function number of GetNetworkSerialNumber
SNREQBUFF ends
SNREPLYBUFF struc
MyLength DW 6 ; reply structure length - 2
NetSN DD 0 ; network serial number in big endian packed BCD
AppNumber DW 0 ; Application number in same format
SNREPLYBUFF ends
U_Request SNREQBUFF <>
U_Reply SNREPLYBUFF <>
SerialNum DB "00000000",0dh, 0ah
SerialLen = $ - SerialNum
.CODE
;
; Test code gets network serial number and prints it to stdout
;
Start:
mov ax,@data
mov ds,ax ; set up the data segment
call NetworkSN
Exit:
mov ah,04ch ; return with error code preset in AL
int 21h
;
; here's the Network stuff
;
NetworkSN proc
push ds
push si
push di
push es
push dx
push cx
lea si,[U_Request] ; prepare to request data
lea di,[U_Reply ] ; prepare to receive data
mov ax,ds
mov es,ax
mov ah,0e3h ; Get File Server Serial Number
int 21h
jc @@NoMore
lea si,[U_Reply.NetSN] ; point ds:si at binary data
lea di,[SerialNum] ; and point es:di at target ASCII string
mov cx,4 ; loop four times (once for each SN digit pair)
cld ; count up
@@convbyte:
lodsb ; read a byte
AAMn 16 ; convert to two-digit BCD in ah,al
xchg ah,al ; swap so that memory image will be correct
or ax,3030h ; convert both to ASCII numbers
stosw ; put 'em in our table
loop @@convbyte
lea dx,[SerialNum] ; we're going to point ds:dx to string
mov cx,SerialLen ; load the length of the string
mov bx,STDOUT ; print to STDOUT
mov ah,40h ; DOS function to print string
int 21h ; do it
mov al,0 ; return with appropriate error code
@@NoMore:
pop cx
pop dx
pop es
pop di
pop si
pop ds
ret
NetworkSN endp
END Start