summaryrefslogtreecommitdiffstats
path: root/private/nw/nw16/drv
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/nw/nw16/drv/dllentry.asm81
-rw-r--r--private/nw/nw16/drv/ints.asm368
-rw-r--r--private/nw/nw16/drv/makefile127
-rw-r--r--private/nw/nw16/drv/netware.def21
-rw-r--r--private/nw/nw16/drv/netware.h61
-rw-r--r--private/nw/nw16/drv/nwasmutl.asm70
-rw-r--r--private/nw/nw16/drv/nwerror.h46
-rw-r--r--private/nw/nw16/drv/nwinit.c81
8 files changed, 855 insertions, 0 deletions
diff --git a/private/nw/nw16/drv/dllentry.asm b/private/nw/nw16/drv/dllentry.asm
new file mode 100644
index 000000000..fce965935
--- /dev/null
+++ b/private/nw/nw16/drv/dllentry.asm
@@ -0,0 +1,81 @@
+PAGE,132
+;***************************************************************************
+;*
+;* DLLENTRY.ASM
+;*
+;* VER.DLL Entry code
+;*
+;* This module generates a code segment called INIT_TEXT.
+;* It initializes the local heap if one exists and then calls
+;* the C routine LibMain() which should have the form:
+;* BOOL FAR PASCAL LibMain(HANDLE hInstance,
+;* WORD wDataSeg,
+;* WORD cbHeap,
+;* LPSTR lpszCmdLine);
+;*
+;* The result of the call to LibMain is returned to Windows.
+;* The C routine should return TRUE if it completes initialization
+;* successfully, FALSE if some error occurs.
+;*
+;**************************************************************************
+
+ INCLUDE CMACROS.INC
+
+externFP <LIBMAIN> ;The C routine to be called
+
+ifndef SEGNAME
+ SEGNAME equ <_TEXT> ; default seg name
+endif
+
+createSeg %SEGNAME, CodeSeg, word, public, CODE
+
+
+sBegin CodeSeg ; this defines what seg this goes in
+assumes cs,CodeSeg
+
+?PLM=0 ;'C'naming
+externA <_acrtused> ;Ensures that Win DLL startup code is linked
+
+?PLM=1 ;'PASCAL' naming
+externFP <LOCALINIT> ;Windows heap init routine
+
+cProc LibEntry, <PUBLIC,FAR> ;Entry point into DLL
+
+cBegin
+ push di ;Handle of the module instance
+ push ds ;Library data segment
+ push cx ;Heap size
+ push es ;Command line segment
+ push si ;Command line offset
+
+ ;** If we have some heap then initialize it
+ jcxz callc ;Jump if no heap specified
+
+ ;** Call the Windows function LocalInit() to set up the heap
+ ;** LocalInit((LPSTR)start, WORD cbHeap);
+
+ xor ax,ax
+ cCall LOCALINIT <ds, ax, cx>
+ or ax,ax ;Did it do it ok ?
+ jz error ;Quit if it failed
+
+ ;** Invoke the C routine to do any special initialization
+
+callc:
+ call LIBMAIN ;Invoke the 'C' routine (result in AX)
+ jmp short exit ;LibMain is responsible for stack clean up
+
+error:
+ pop si ;Clean up stack on a LocalInit error
+ pop es
+ pop cx
+ pop ds
+ pop di
+exit:
+
+cEnd
+
+sEnd _thisseg
+
+ END LibEntry
+
diff --git a/private/nw/nw16/drv/ints.asm b/private/nw/nw16/drv/ints.asm
new file mode 100644
index 000000000..1dfe878ca
--- /dev/null
+++ b/private/nw/nw16/drv/ints.asm
@@ -0,0 +1,368 @@
+page ,132
+
+if 0
+
+/*++
+
+Copyright (c) 1993 Microsoft Corporation
+
+Module Name:
+
+ ints.asm
+
+Abstract:
+
+ Contains handler for Windows protect-mode NetwareRequest function, exported
+ by NETWARE.DRV. Code in this file access real mode memory via an LDT descriptor
+ created especially for this purpose. This selector gives us access to all
+ code and data contained in the Nw16 TSR
+
+Author:
+
+ Richard L Firth 22-Jan-1994
+
+Environment:
+
+ Windows protect mode only
+
+Revision History:
+
+ 22-Jan-1994 rfirth
+ Created
+
+--*/
+
+endif
+
+include nwdos.inc ; NWDOSTABLE_ASM structure
+include isvbop.inc ; DispatchCall
+
+.286
+.model medium,pascal
+
+_DATA segment word public 'DATA'
+
+OldInt21Handler dd ?
+RMSegment dw ?
+RMBase dw ? ; MUST be in this order - loaded
+RMSelector dw ? ; via lds dx,word ptr RMBase
+
+.errnz (RMSelector - (RMBase + 2))
+
+_DATA ends
+
+;
+; code segment ordering
+;
+
+INIT_TEXT segment byte public 'CODE'
+INIT_TEXT ends
+
+_TEXT segment byte public 'CODE'
+_TEXT ends
+
+;
+; macros
+;
+
+LOAD_DS macro
+ push _DATA
+ pop ds
+ assume ds:_DATA
+ endm
+
+SET_DS macro
+ push ds
+ LOAD_DS
+ endm
+
+RESTORE_DS macro
+ pop ds
+ assume ds:nothing
+ endm
+
+LOAD_RM_DS_BX macro
+ LOAD_DS
+ lds bx,dword ptr RMBase
+ assume ds:nothing
+ endm
+
+RESTORE_DS_BX macro
+ RESTORE_DS
+ pop bx
+ endm
+
+INIT_TEXT segment byte public 'CODE'
+
+ assume cs:INIT_TEXT
+
+ public GetLowRedirInfo
+GetLowRedirInfo proc far
+ mov ax,9f00h
+ int 21h ; get the RM data segment in BX
+ jc @f
+ SET_DS
+ mov RMSegment,bx
+ mov RMBase,dx
+ mov ax,2
+ int 31h
+ jc @f ; can't create selector
+ mov RMSelector,ax
+
+;
+; now that we have the selector, we write the selector value into the low
+; memory area. The 32-bit DLL will use this value when setting output DS or ES
+; register values if the call originated in Protect Mode
+;
+
+ lds bx,dword ptr RMBase
+ mov [bx]._PmSelector,ax
+
+;
+; we now hook int 21
+;
+
+ LOAD_DS
+ push es
+ mov ax,3521h
+ int 21h
+ mov word ptr OldInt21Handler,bx
+ mov word ptr OldInt21Handler[2],es
+ mov cx,_TEXT
+ mov dx,offset _TEXT:NewInt21Handler
+ mov ax,205h
+ mov bl,21h
+ int 31h
+ pop es
+ RESTORE_DS
+ xor ax,ax ; success: return TRUE
+ inc ax
+ ret
+@@: xor ax,ax ; failure: return FALSE
+ ret
+GetLowRedirInfo endp
+
+INIT_TEXT ends
+
+_TEXT segment byte public 'CODE'
+
+ assume cs:_TEXT
+
+ public NewInt21Handler
+NewInt21Handler proc far
+ sti
+ cmp ah,0e3h
+ jb @f
+ call far ptr NetwareRequest
+ retf 2
+@@: sub sp,4
+ push bp
+ mov bp,sp
+ push es
+ push bx
+ SET_DS
+ les bx,OldInt21Handler
+ mov [bp+2],bx
+ mov [bp+4],es
+ RESTORE_DS
+ pop bx
+ pop es
+ pop bp
+ retf
+NewInt21Handler endp
+
+ public NetwareRequest
+NetwareRequest proc far
+ push bx
+ push ds
+ LOAD_RM_DS_BX
+ cmp ah,0f0h
+ jne for_dll
+
+;
+; these are the 0xF000, 0xF001, 0xF002, 0xF004, 0xF005 calls that we can handle
+; here without having to BOP. All we need do is access the table in the shared
+; real-mode/protect-mode (low) memory
+;
+
+.errnz (_PrimaryServer - (_PreferredServer + 1))
+
+;
+; point bx at PreferredServer in the low memory area. If the request is a
+; PrimaryServer request (0xF004, 0xF005) then point bx at PrimaryServer
+;
+
+ lea bx,[bx]._PreferredServer; bx = offset of PreferredServer
+ cmp al,3
+ cmc
+ adc bx,0 ; bx = &PrimaryServer if F004 or F005
+ or al,al ; f000 = set preferred server
+ jz set_server
+ cmp al,4 ; f004 = set primary server
+ jnz try_01
+
+;
+; 0xF000 or 0xF004: set Preferred or Primary Server to value contained in DL.
+; If DL > 8, set respective server index to 0
+;
+
+set_server:
+ xor al,al
+ cmp dl,8
+ ja @f
+ mov al,dl
+@@: mov [bx],al
+ jmp short exit_f0
+
+;
+; 0xF001 or 0xF005: get Preferred or Primary Server
+;
+
+try_01: cmp al,1 ; f001 = get preferred server
+ jz get_server
+ cmp al,5
+ jnz try_02
+
+get_server:
+ mov al,[bx]
+ jmp short exit_f0
+
+try_02: cmp al,2 ; f002 = get default server
+ jnz for_dll ; try to handle on 32-bit side
+ mov al,[bx] ; al = PreferredServer
+ or al,al
+ jnz exit_f0
+ mov al,[bx+1] ; al = PrimaryServer
+
+exit_f0:RESTORE_DS_BX
+ ret
+
+;
+; if we're here then the call must go through to the 32-bit DLL. Save any relevant
+; info in the low memory area, load the handle and BOP (DispatchCall)
+;
+
+for_dll:mov [bx]._SavedAx,ax ; save AX value for DLL
+ push word ptr [bx]._hVdd ; put VDD handle on top of stack
+
+ cmp ah,0BCh ; bc, bd, be need handle mapping
+ jb @f
+ cmp ah,0BEh
+ ja @f
+ pop ax ; ax = hVdd
+ RESTORE_DS_BX ; ds, bx = user ds, bx
+ call MapNtHandle
+ jmp dispatchola
+
+@@: push bp
+ cmp ah, 0E3h ; Is it new or old Create Job request?
+ je lookupcode
+ cmp ax, 0F217h
+ jne check_f3
+
+lookupcode:
+ mov bp,sp
+ mov ds,[bp+4]
+ cmp byte ptr [si+2],68h
+ je createjob
+ cmp byte ptr [si+2],79h
+ je createjob
+ jmp short outtahere
+
+createjob:
+ LOAD_RM_DS_BX
+ mov [bx]._SavedAx,9f02h
+ push ax ; Open \\Server\queue for NCP
+ mov ax,[bp+2] ; ax = hVdd
+ mov ds,[bp+4] ; ds = users ds
+ push ds
+ push dx ; users dx
+ DispatchCall ; Set DeNovellBuffer to \\Server\queue
+ ; and registers ready for DOS OpenFile
+ int 21h ; Open \\server\queue
+ LOAD_RM_DS_BX
+ jc openfailed
+ mov [bx]._JobHandle, al
+ mov [bx]._CreatedJob, 1 ; Flag JobHandle is valid
+ push bx
+ mov bx, ax ; JobHandle
+ call MapNtHandle ; take bx and find the Nt handle
+ pop bx
+
+openfailed:
+ pop dx
+ pop ds ; Proceed and send the NCP
+ pop ax
+
+ push ds
+ push bx
+ LOAD_RM_DS_BX
+ mov [bx]._SavedAx, ax
+ pop bx
+ pop ds ; users DS
+ jmp short outtahere
+
+check_f3:
+ cmp ah, 0F3h
+ jne outtahere
+ ; FileServerCopy, change both
+ ; handles in the structure es:di
+ push bx
+
+ mov bx,word ptr es:[di] ; Map Source Handle
+ call MapNtHandle
+
+ pop bx
+ mov ax,[bx]._NtHandleHi
+ mov [bx]._NtHandleSrcHi,ax
+ mov ax,[bx]._NtHandleLow
+ mov [bx]._NtHandleSrcLow,ax
+
+ mov bx,word ptr es:[di+2] ; Map Destination Handle
+ call MapNtHandle
+
+outtahere:
+ pop bp
+ pop ax ; ax = hVdd
+ RESTORE_DS_BX ; ds, bx = user ds, bx
+dispatchola:
+ DispatchCall ; BOP: DLL performs action
+ ret ; return to the application
+
+;
+; if the request was not recognized by the DLL, it modifies IP so that control
+; will resume at the next int 21. We just fill the intervening space with NOPs
+; (space that makes up a retf <n> instruction in the RM TSR)
+;
+
+ nop
+ nop
+ int 21h
+ ret
+NetwareRequest endp
+
+; *** MapNtHandle
+; *
+; * Given a handle in BX, map it to a 32-bit Nt handle in NtHandle[Hi|Low]
+; *
+; * ENTRY bx = handle to map
+; *
+; * EXIT Success - NtHandle set to 32-bit Nt handle from SFT
+; *
+; * USES ax, bx, flags
+; *
+; * ASSUMES nothing
+; *
+; ***
+
+MapNtHandle proc near
+ push ax
+ mov ax,9f01h ; call MapNtHandle on (BX) in RM
+ int 21h ; update NtHandleHi, NtHandleLow
+ pop ax
+@@: ret
+MapNtHandle endp
+
+_TEXT ends
+
+end
diff --git a/private/nw/nw16/drv/makefile b/private/nw/nw16/drv/makefile
new file mode 100644
index 000000000..7b44d0246
--- /dev/null
+++ b/private/nw/nw16/drv/makefile
@@ -0,0 +1,127 @@
+# netware.drv makefile
+#
+# Copyright (c) 1991-1993 Microsoft Corporation
+#
+# History:
+# Created 25-Mar-1993 Chuck Y. Chan (ChuckC)
+#
+
+!IFDEF USEBUILD
+
+# If using BUILD.EXE, edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the components of NT OS/2.
+
+!INCLUDE $(NTMAKEENV)\makefile.def
+
+!ELSE
+
+.SUFFIXES:
+.SUFFIXES: .c .asm .h .inc .obj .lst .sys .exe .com .map .sym .def .lib .dll
+
+WOW16 =..\..\..\mvdm\wow16
+
+! ifdef INCLUDE
+WBIN =
+INCS =
+! else
+WBIN = $(WOW16)\bin^\
+CINCS = -I. -I$(WOW16)\inc
+ASMINCS = $(CINCS) -I..\inc -I\nt\public\sdk\inc
+! endif
+
+# DEFINES = -DWOW -DDEBUG $(MVDMFLAGS)
+DEFINES = -DWOW $(MVDMFLAGS) -DBUILDDLL
+
+AOBJ = -Ml -t $(DEFINES) $(ASMINCS)
+
+CW16 = -AS -G2sw -Os -W3 -Zp $(DEFINES) $(CINCS)
+CW16B = $(CW16) -B1 c1l.exe -B2 c2l.exe -B3 c3l.exe
+
+LPATH = ..\..\tools.os2
+LINKFLAG= /map
+
+! ifdef LIB
+W16LIBS = sdllcew
+! else
+W16LIBS = $(WOW16)\lib\sdllcew.lib
+! endif
+
+
+! IF "$(QFE_BUILD)" != "1"
+CL16=cl16
+! ELSE
+CL16=cl
+! ENDIF
+
+PATH=..\..\..\mvdm\tools16;$(PATH)
+
+.asm.obj:
+ masm $(AOBJ) $*;
+
+.asm.lst:
+ masm $(AOBJ) -l $*,nul,$*.lst;
+
+
+.c.obj:
+ $(CL16) -c -nologo $(CW16) $*.c
+
+.c.lst:
+ $(CL16) -c -nologo $(CW16) -Fonul -Fc$*.lst $*.c
+
+
+.def.lib:
+ implib $*.lib $*.def
+
+.map.sym:
+ $(WBIN)mapsym $*
+
+
+all: netware.drv netware.sym
+ binplace netware.drv
+ binplace netware.sym
+
+clean:
+ if exist *.lrf del *.lrf
+ if exist *.obj del *.obj
+ if exist *.exe del *.exe
+ if exist *.dll del *.dll
+ if exist *.map del *.map
+ if exist *.sym del *.sym
+ if exist *.drv del *.drv
+
+
+nwinit.obj: nwinit.c .\netware.h .\nwerror.h
+ $(CL16) -c -nologo $(CW16) $*.c
+
+! ifdef NTVDM_BASED_BUILD
+LINK16 = link16
+RC16 = rc16
+! else
+LINK16 = $(LPATH)\link
+RC16 = $(LPATH)\rc
+! endif
+
+! if exist ($(WOW16)\lib\libw.lib) && exist ($(WOW16)\lib\sdllcew.lib)
+
+netware.drv: nwinit.obj dllentry.obj nwasmutl.obj netware.def ints.obj
+ $(LINK16) @<<netware.lrf
+nwinit.obj+
+dllentry.obj+
+nwasmutl.obj+
+ints.obj
+netware.drv
+netware $(LINKFLAG)
+$(WOW16)\lib\libw.lib+
+$(WOW16)\lib\sdllcew.lib /nod
+netware;
+<<KEEP
+ $(RC16) netware.drv
+
+! else
+
+netware.drv: nwinit.obj dllentry.obj nwasmutl.obj netware.def ints.obj
+ @echo Nothing to build yet... No libraries
+! endif
+
+!endif
diff --git a/private/nw/nw16/drv/netware.def b/private/nw/nw16/drv/netware.def
new file mode 100644
index 000000000..fa251cdc5
--- /dev/null
+++ b/private/nw/nw16/drv/netware.def
@@ -0,0 +1,21 @@
+LIBRARY NETWARE
+DESCRIPTION 'NETWARE '
+EXETYPE WINDOWS
+CODE MOVEABLE DISCARDABLE
+DATA PRELOAD MOVEABLE SINGLE
+HEAPSIZE 512
+
+EXPORTS
+ WEP @1 RESIDENTNAME ;Internal
+
+ WNETADDCONNECTION @17
+ WNETGETCONNECTION @12
+ WNETCANCELCONNECTION @18
+
+ NETWAREREQUEST @1000
+ PNETWAREREQUEST @1001
+
+
+SEGMENTS
+ _TEXT PRELOAD MOVEABLE DISCARDABLE
+
diff --git a/private/nw/nw16/drv/netware.h b/private/nw/nw16/drv/netware.h
new file mode 100644
index 000000000..c96086ab8
--- /dev/null
+++ b/private/nw/nw16/drv/netware.h
@@ -0,0 +1,61 @@
+/*****************************************************************/
+/** Microsoft Windows 4.0 **/
+/** Copyright (C) Microsoft Corp., 1991-1993 **/
+/*****************************************************************/
+
+
+/*
+ * History:
+ * 08/08/93 vlads Created
+ * 10/16/93 gregj Removed #pragma pack() because of #include nesting
+ *
+ */
+
+#ifndef _INC_NETWARE
+#define _INC_NETWARE
+
+#include <windows.h>
+
+// #include <npdefs.h>
+
+// #include <base.h>
+
+// #include <npassert.h>
+// #include <buffer.h>
+
+// #include <..\..\dev\ddk\inc16\error.h>
+// #include <bseerr.h>
+#include "nwerror.h"
+// #include "..\nwnp\nwsysdos.h"
+
+#ifdef __cplusplus
+extern "C" { /* Assume C declarations for C++ */
+#endif /* __cplusplus */
+
+// #include <netcons.h>
+// #include <netlib.h>
+
+WINAPI NETWAREREQUEST (LPVOID);
+WINAPI PNETWAREREQUEST(LPVOID);
+WINAPI DOSREQUESTER(LPVOID);
+
+//UINT WINAPI WNetAddConnection(LPSTR, LPSTR, LPSTR);
+//UINT WINAPI WNetGetConnection(LPSTR, LPSTR, UINT FAR*);
+//UINT WINAPI WNetCancelConnection(LPSTR, BOOL);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#ifdef DEBUG
+#define TRACE(s) OutputDebugString(s)
+#else
+#define TRACE(s)
+#endif
+
+extern HINSTANCE hInstance;
+
+#endif /* !_INC_NETWARE */
+
diff --git a/private/nw/nw16/drv/nwasmutl.asm b/private/nw/nw16/drv/nwasmutl.asm
new file mode 100644
index 000000000..aa03a37b5
--- /dev/null
+++ b/private/nw/nw16/drv/nwasmutl.asm
@@ -0,0 +1,70 @@
+PAGE,132
+;*****************************************************************;
+;** Microsoft Windows for Workgroups **;
+;** Copyright (C) Microsoft Corp., 1991-1993 **;
+;*****************************************************************;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; ;;
+;; COMPONENT: Windows NetWare DLL. ;;
+;; ;;
+;; FILE: NWASMUTL.ASM ;;
+;; ;;
+;; PURPOSE: General routines used that cannot be done in C. ;;
+;; ;;
+;; REVISION HISTORY: ;;
+;; vlads 09/20/93 First cut ;;
+;; ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ INCLUDE CMACROS.INC
+
+?PLM = 1
+?WIN=0
+
+ifndef SEGNAME
+ SEGNAME equ <_TEXT> ; default seg name
+endif
+
+createSeg %SEGNAME, CodeSeg, word, public, CODE
+
+sBegin CodeSeg ; this defines what seg this goes in
+assumes cs,CodeSeg
+
+;;
+;; Swapping bytes in a word
+;;
+
+cProc WordSwap, <PUBLIC,FAR>
+ parmW inWord
+
+cBegin
+ mov ax, word ptr (inWord)
+ xchg al, ah
+cEnd
+
+
+;;
+;; Swapping words in a long word
+;;
+cProc LongSwap, <FAR,PUBLIC>, <dx>
+ parmD inLong
+
+cBegin
+ mov dx, word ptr (inLong + 2)
+ xchg dl, dh
+ mov ax, word ptr (inLong)
+ xchg al, ah
+cEnd
+
+;public NETWAREREQUEST
+;
+;NETWAREREQUEST proc far
+; int 21h
+; retf
+;NETWAREREQUEST endp
+
+sEnd _thisseg
+
+ END
+
diff --git a/private/nw/nw16/drv/nwerror.h b/private/nw/nw16/drv/nwerror.h
new file mode 100644
index 000000000..f369855ce
--- /dev/null
+++ b/private/nw/nw16/drv/nwerror.h
@@ -0,0 +1,46 @@
+/*****************************************************************/
+/** Microsoft Windows for Workgroups **/
+/** Copyright (C) Microsoft Corp., 1991-1992 **/
+/*****************************************************************/
+
+/* NWERROR.H -- Novell defined error return codes from Netware API
+ *
+ * History:
+ * 03/16/93 vlads Created
+ *
+ */
+
+#ifndef _nwerror_h_
+#define _nwerror_h_
+
+
+#define NWSC_SUCCESS 0x00
+#define NWSC_SERVEROUTOFMEMORY 0x96
+#define NWSC_NOSUCHVOLUME 0x98 // Volume does not exist
+#define NWSC_BADDIRECTORYHANDLE 0x9b
+#define NWSC_NOSUCHPATH 0x9c
+#define NWSC_NOJOBRIGHTS 0xd6
+#define NWSC_EXPIREDPASSWORD 0xdf
+#define NWSC_NOSUCHSEGMENT 0xec // Segment does not exist
+#define NWSC_INVALIDNAME 0xef
+#define NWSC_NOWILDCARD 0xf0 // Wildcard not allowed
+#define NWSC_NOPERMBIND 0xf1 // Invalid bindery security
+
+#define NWSC_ALREADYATTACHED 0xf8 // Already attached to file server
+#define NWSC_NOPERMREADPROP 0xf9 // No property read privelege
+#define NWSC_NOFREESLOTS 0xf9 // No free connection slots at server
+#define NWSC_NOMORESLOTS 0xfa // No more server slots
+#define NWSC_NOSUCHPROPERTY 0xfb // Property does not exist
+#define NWSC_UNKNOWN_REQUEST 0xfb // Invalid NCP number
+#define NWSC_NOSUCHOBJECT 0xfc // End of Scan Bindery Object service
+ // No such object
+#define NWSC_UNKNOWNSERVER 0xfc // Unknown file server
+#define NWSC_SERVERBINDERYLOCKED 0xfe // Server bindery locked
+#define NWSC_BINDERYFAILURE 0xff // Bindery failure
+#define NWSC_ILLEGALSERVERADDRESS 0xff // No response from server (illegal server address)
+#define NWSC_NOSUCHCONNECTION 0xff // Connection ID does not exist
+
+
+typedef WORD NW_STATUS;
+
+#endif
diff --git a/private/nw/nw16/drv/nwinit.c b/private/nw/nw16/drv/nwinit.c
new file mode 100644
index 000000000..c61a4fb40
--- /dev/null
+++ b/private/nw/nw16/drv/nwinit.c
@@ -0,0 +1,81 @@
+/*****************************************************************/
+/** Microsoft Windows 4.0 **/
+/** Copyright (C) Microsoft Corp., 1992-1993 **/
+/*****************************************************************/
+
+/* INIT.C -- General code for MS/Netware network driver emulator.
+ *
+ * History:
+ * 09/22/93 vlads Created
+ *
+ */
+
+#include "netware.h"
+
+#define Reference(x) ((void)(x))
+
+extern BOOL far pascal GetLowRedirInfo(void);
+
+int FAR PASCAL LibMain(
+ HANDLE hInst,
+ WORD wDataSeg,
+ WORD wcbHeapSize,
+ LPSTR lpstrCmdLine)
+{
+
+ //
+ // get shared data segment address. Fail initialization if an error is
+ // returned
+ //
+
+ if (!GetLowRedirInfo()) {
+ return 0;
+ }
+
+ //
+ // return success
+ //
+
+ return 1;
+}
+
+/* WEP
+ * Windows Exit Procedure
+ */
+
+int FAR PASCAL _loadds WEP(int nParameter)
+{
+ Reference(nParameter);
+ return 1;
+}
+
+
+WINAPI PNETWAREREQUEST(LPVOID x)
+{
+ return(1);
+}
+
+//
+// removed because nwcalls makes use of this function; removing it causes
+// NWCALLS to use real INT 21
+//
+
+//WINAPI DOSREQUESTER(LPVOID x)
+//{
+// return(1);
+//}
+
+UINT WINAPI WNetAddConnection(LPSTR p1, LPSTR p2, LPSTR p3)
+{
+ return(1);
+}
+
+UINT WINAPI WNetGetConnection(LPSTR p1, LPSTR p2, UINT FAR *p3)
+{
+ return(1);
+}
+
+UINT WINAPI WNetCancelConnection(LPSTR p1, BOOL p2)
+{
+ return(1);
+}