567 lines
13 KiB
NASM
567 lines
13 KiB
NASM
page ,132
|
|
if 0
|
|
|
|
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
netapis.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 Lan Manager API
|
|
stubs:
|
|
|
|
NetIRemoteAPI
|
|
NetMessageBufferSend
|
|
NetNullTransactAPI
|
|
NetServerEnum
|
|
NetServiceControl
|
|
NetTransactAPI
|
|
NetUseAdd
|
|
NetUseDel
|
|
NetUseEnum
|
|
NetUseGetInfo
|
|
NetWkstaGetInfo
|
|
NetWkstaSetInfo
|
|
|
|
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 asmmacro.inc ; language extensions
|
|
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
|
|
assume es:nothing
|
|
assume ss:nothing
|
|
|
|
extrn SetNetErrorCodeAx:near
|
|
|
|
;
|
|
; if we are remoting NetUserSetInfo with an unencrypted password, we need
|
|
; somewhere in 16-bit memory to store the encrypted password. Hence, this:
|
|
;
|
|
|
|
password_buffer db 16 dup(?)
|
|
|
|
; *** NetIRemoteAPI
|
|
; *
|
|
; * Remotes API requests to a server. Creates a transaction smb. The
|
|
; * return data buffer address and length are in the caller's parameters.
|
|
; *
|
|
; * This is an internal API so the parameters are trusted.
|
|
; *
|
|
; * Function = 5F3Fh
|
|
; *
|
|
; * ENTRY CX = API number
|
|
; * ES:BX = pointer to caller parameters
|
|
; * DS:SI = pointer to ASCIZ parameter descriptor string
|
|
; * DS:DI = pointer to ASCIZ data descriptor string
|
|
; * DS:DX = pointer to ASCIZ aux data descriptor string
|
|
; *
|
|
; * EXIT CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * CF = 0
|
|
; * Output depends on type of request
|
|
; *
|
|
; * USES ax, flags
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetIRemoteAPI
|
|
NetIRemoteAPI proc near
|
|
mov ax,offset cs:password_buffer
|
|
SVC SVC_RDRIREMOTEAPI
|
|
|
|
;
|
|
; all routines in this module come here for exit processing
|
|
;
|
|
|
|
common_net_api_exit:
|
|
jc common_api_error_exit ; quick return on success
|
|
ret
|
|
|
|
common_api_error_exit:
|
|
push ax
|
|
DosCallBack GET_USER_STACK
|
|
pop [si].User_Ax ; return failure status in caller's ax
|
|
call SetNetErrorCodeAx ; set up to return 16-bit error to app
|
|
stc ; failure indication
|
|
ret
|
|
NetIRemoteAPI endp
|
|
|
|
|
|
|
|
; *** NetMessageBufferSend
|
|
; *
|
|
; * Function = 5F40h
|
|
; *
|
|
; * ENTRY DS:DX = NetMessageBufferSendStruct:
|
|
; *
|
|
; * char FAR * NMBSS_NetName; /* asciz net name. */
|
|
; * char FAR * NMBSS_Buffer; /* pointer to buffer. */
|
|
; * unsigned int NMBSS_BufSize; /* size of buffer. */
|
|
; *
|
|
; * EXIT CF = 0
|
|
; * Success
|
|
; *
|
|
; * CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetMessageBufferSend
|
|
NetMessageBufferSend proc
|
|
SVC SVC_RDRMESSAGEBUFFERSEND
|
|
jmps common_net_api_exit
|
|
NetMessageBufferSend endp
|
|
|
|
|
|
|
|
; *** NetNullTransactApi
|
|
; *
|
|
; * Function = 5F54h
|
|
; *
|
|
; * ENTRY DS:SI = transaction packet
|
|
; *
|
|
; * EXIT CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * CF = 0
|
|
; * Success
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetNullTransactAPI
|
|
NetNullTransactAPI proc near
|
|
SVC SVC_RDRNULLTRANSACTAPI
|
|
jmps common_net_api_exit
|
|
NetNullTransactAPI endp
|
|
|
|
|
|
|
|
; *** NetServerEnum
|
|
; *
|
|
; * Function = 5F4Ch
|
|
; *
|
|
; * ENTRY BL = level (0 or 1)
|
|
; * CX = size of buffer
|
|
; * ES:DI = buffer
|
|
; *
|
|
; * EXIT CF = 1
|
|
; * AX = Error code:
|
|
; * NERR_BufTooSmall
|
|
; * ERROR_MORE_DATA
|
|
; *
|
|
; * CF = 0
|
|
; * BX = entries read
|
|
; * CX = total available
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetServerEnum
|
|
NetServerEnum proc near
|
|
mov al,4ch
|
|
jmp short common_server_enum
|
|
NetServerEnum endp
|
|
|
|
|
|
|
|
; *** NetServerEnum2
|
|
; *
|
|
; * Function = 5F53h
|
|
; *
|
|
; * ENTRY DS:SI = NetServerEnum2Struct:
|
|
; * DW Level
|
|
; * DD Buffer
|
|
; * DW Buflen
|
|
; * DD Type
|
|
; * DD Domain
|
|
; *
|
|
; * EXIT CF = 1
|
|
; * AX = Error code:
|
|
; * NERR_BufTooSmall
|
|
; * ERROR_MORE_DATA
|
|
; *
|
|
; * CF = 0
|
|
; * BX = entries read
|
|
; * CX = total available
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetServerEnum2
|
|
NetServerEnum2 proc near
|
|
mov al,53h
|
|
common_server_enum:
|
|
SVC SVC_RDRSERVERENUM
|
|
|
|
;
|
|
; we are going to set the caller's BX and CX irrespective of whether we have
|
|
; meaningful values in them. This function
|
|
; is used to unpack a real-mode buffer into a protect-mode buffer, and it uses
|
|
; the returned EntriesRead in BX to do so. It's bad because it doesn't
|
|
; look at the return code until after its tried to unpack BX elements from its
|
|
; buffer. This took me a day to find out why its
|
|
; blowing up in 16-bit windows protect-mode netapi.dll, and probably means that
|
|
; if the real DOS redir ever returned anything other than a list of servers,
|
|
; then windows would fall over too. (Actually, the real redir does the right
|
|
; thing. This is what you get for believing comments, and not reading the code
|
|
; #^*&^@@*&%!)
|
|
;
|
|
|
|
pushf
|
|
push ax
|
|
DosCallBack GET_USER_STACK
|
|
mov [si].User_Bx,bx
|
|
mov [si].User_Cx,cx
|
|
pop ax ; error status or XXXX
|
|
popf ; error indication
|
|
@@: jmps common_net_api_exit
|
|
NetServerEnum2 endp
|
|
|
|
|
|
|
|
; *** NetServiceControl
|
|
; *
|
|
; * Returns information about the state of a service, or applies a control
|
|
; * to a service (and its dependents). We only allow INTERROGATE under NT
|
|
; * since we don't want DOS apps starting and stopping the NT services. In
|
|
; * most cases they couldn't anyway, since a DOS program will most likely
|
|
; * be running in an account with not enough privilege to control the
|
|
; * services (ie an admin is very likely to be using only 32-bit tools
|
|
; * to control services)
|
|
; *
|
|
; * Function = 5F42h
|
|
; *
|
|
; * ENTRY ES:BX = NetServiceControlStruct:
|
|
; * char far* ServiceName
|
|
; * unsigned short BufLen
|
|
; * char far* Buffer (service_info_2)
|
|
; * DL = opcode:
|
|
; * 0 = interrogate
|
|
; * 1 = pause
|
|
; * 2 = continue
|
|
; * 3 = uninstall
|
|
; * 4 - 127 = reserved
|
|
; * 128 - 255 = OEM defined
|
|
; *
|
|
; * EXIT CF = 0
|
|
; * Buffer contains service_info_2 structure for requested service
|
|
; *
|
|
; * CF = 1
|
|
; * AX = error code:
|
|
; * NERR_ServiceCtlNotValid
|
|
; * NERR_BufTooSmall
|
|
; * NERR_ServiceNotInstalled
|
|
; * ERROR_INVALID_PARAMETER (NEW)
|
|
; *
|
|
; * USES ax, flags
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetServiceControl
|
|
NetServiceControl proc near
|
|
SVC SVC_RDRSERVICECONTROL
|
|
jmps common_net_api_exit
|
|
NetServiceControl endp
|
|
|
|
|
|
|
|
; *** NetTransactAPI
|
|
; *
|
|
; * Function = 5F3Dh
|
|
; *
|
|
; * ENTRY DS:SI = transaction packet
|
|
; *
|
|
; * EXIT CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * CF = 0
|
|
; * Success
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetTransactAPI
|
|
NetTransactAPI proc near
|
|
SVC SVC_RDRTRANSACTAPI
|
|
jmps common_net_api_exit
|
|
NetTransactAPI endp
|
|
|
|
|
|
|
|
; *** NetUseAdd
|
|
; *
|
|
; * Function = 5F47h
|
|
; *
|
|
; * ENTRY BX = level
|
|
; * CX = buffer length
|
|
; * DS:SI = server name for remote call (MBZ)
|
|
; * ES:DI = buffer containing use_info_1 structure
|
|
; *
|
|
; * EXIT CF = 0
|
|
; * Success
|
|
; *
|
|
; * CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetUseAdd
|
|
NetUseAdd proc
|
|
SVC SVC_RDRUSEADD
|
|
jmps common_net_api_exit
|
|
NetUseAdd endp
|
|
|
|
|
|
|
|
; *** NetUseDel
|
|
; *
|
|
; * Function = 5F48h
|
|
; *
|
|
; * ENTRY BX = force flag
|
|
; * DS:SI = server name for remote call (MBZ)
|
|
; * ES:DI = use name
|
|
; *
|
|
; * EXIT CF = 0
|
|
; * Success
|
|
; *
|
|
; * CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetUseDel
|
|
NetUseDel proc
|
|
SVC SVC_RDRUSEDEL
|
|
jmps common_net_api_exit
|
|
NetUseDel endp
|
|
|
|
|
|
|
|
; *** NetUseEnum
|
|
; *
|
|
; * Function = 5F46h
|
|
; *
|
|
; * ENTRY BX = level of info required - 0 or 1
|
|
; * CX = buffer length
|
|
; * ES:DI = buffer for enum info
|
|
; *
|
|
; * EXIT CF = 0
|
|
; * CX = Entries Read
|
|
; * DX = Total number of entries available
|
|
; *
|
|
; * CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetUseEnum
|
|
NetUseEnum proc
|
|
SVC SVC_RDRUSEENUM
|
|
pushf ; error indication
|
|
push ax ; error code
|
|
|
|
;
|
|
; return EntriesRead and TotalEntries regardless of error
|
|
;
|
|
|
|
DosCallBack GET_USER_STACK
|
|
mov [si].User_Cx,cx
|
|
mov [si].User_Dx,dx
|
|
pop ax
|
|
popf
|
|
jmpc common_api_error_exit ; error
|
|
ret
|
|
NetUseEnum endp
|
|
|
|
|
|
|
|
; *** NetUseGetInfo
|
|
; *
|
|
; * Function = 5F49h
|
|
; *
|
|
; * ENTRY DS:DX = NetUseGetInfoStruc:
|
|
; *
|
|
; * const char FAR* NUGI_usename; /* ASCIZ redirected device name */
|
|
; * short NUGI_level; /* level of info */
|
|
; * char FAR* NUGI_buffer; /* buffer for returned info */
|
|
; * unsigned short NUGI_buflen; /* size of buffer */
|
|
; *
|
|
; * EXIT CF = 0
|
|
; * DX = size of entry returned (or size of buffer required)
|
|
; *
|
|
; * CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetUseGetInfo
|
|
NetUseGetInfo proc
|
|
SVC SVC_RDRUSEGETINFO
|
|
jmpc common_api_error_exit
|
|
DosCallBack GET_USER_STACK
|
|
mov [si].User_Dx,dx
|
|
clc
|
|
ret
|
|
NetUseGetInfo endp
|
|
|
|
|
|
|
|
; *** NetWkstaGetInfo
|
|
; *
|
|
; * Function = 5F44h
|
|
; *
|
|
; * ENTRY BX = level of information - 0, 1, 10
|
|
; * CX = size of caller's buffer
|
|
; * DS:SI = server name for remote call (Must Be Null)
|
|
; * ES:DI = caller's buffer
|
|
; *
|
|
; * EXIT CF = 0
|
|
; * DX = size of buffer required for request
|
|
; * AX = NERR_Success (0)
|
|
; *
|
|
; * CF = 1
|
|
; * AX = Error code
|
|
; * NERR_BufTooSmall (2123)
|
|
; * Caller's buffer not large enough to hold even fixed
|
|
; * part of structure
|
|
; *
|
|
; * ERROR_MORE_DATA (234)
|
|
; * Caller's buffer large enough to hold fixed structure
|
|
; * part of data, but not all variable parts too
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetWkstaGetInfo
|
|
NetWkstaGetInfo proc
|
|
SVC SVC_RDRWKSTAGETINFO
|
|
pushf ; save error indication in carry
|
|
push ax ; save error code
|
|
DosCallBack GET_USER_STACK
|
|
mov [si].User_Dx,dx ; user's dx = buffer required
|
|
pop ax ; ax = error code or ?
|
|
popf ; carry flag = error (1) or no error
|
|
jmps common_net_api_exit ; if error, store it, and return
|
|
NetWkstaGetInfo endp
|
|
|
|
|
|
|
|
; *** NetWkstaSetInfo
|
|
; *
|
|
; * Function = 5F45h
|
|
; *
|
|
; * ENTRY BX = level - MBZ
|
|
; * CX = buffer size
|
|
; * DX = parm num
|
|
; * DS:SI = server name for remote call (MBZ)
|
|
; * ES:DI = caller's buffer
|
|
; *
|
|
; * EXIT CF = 0
|
|
; * Success
|
|
; *
|
|
; * CF = 1
|
|
; * AX = Error code
|
|
; *
|
|
; * USES
|
|
; *
|
|
; * ASSUMES nothing
|
|
; *
|
|
; ***
|
|
|
|
public NetWkstaSetInfo
|
|
NetWkstaSetInfo proc
|
|
SVC SVC_RDRWKSTASETINFO
|
|
jmps common_net_api_exit
|
|
NetWkstaSetInfo endp
|
|
|
|
ResidentCodeEnd
|
|
end
|