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