summaryrefslogtreecommitdiffstats
path: root/private/nw/vwipxspx/dll/vwdll.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/nw/vwipxspx/dll/vwdll.c')
-rw-r--r--private/nw/vwipxspx/dll/vwdll.c502
1 files changed, 502 insertions, 0 deletions
diff --git a/private/nw/vwipxspx/dll/vwdll.c b/private/nw/vwipxspx/dll/vwdll.c
new file mode 100644
index 000000000..0b7b9fcd7
--- /dev/null
+++ b/private/nw/vwipxspx/dll/vwdll.c
@@ -0,0 +1,502 @@
+/*++
+
+Copyright (c) 1993 Microsoft Corporation
+
+Module Name:
+
+ vwdll.c
+
+Abstract:
+
+ ntVdm netWare (Vw) IPX/SPX Functions
+
+ Vw: The peoples' network
+
+ VDD functions for DOS/WOW IPX/SPX support
+
+ Contents:
+ VwDllEntryPoint
+ VwInitialize
+ VWinInitialize
+ VwDispatcher
+ VwInvalidFunction
+
+Author:
+
+ Richard L Firth (rfirth) 30-Sep-1993
+
+Environment:
+
+ User-mode Win32
+
+Revision History:
+
+ 30-Sep-1993 rfirth
+ Created
+
+--*/
+
+#include "vw.h"
+#pragma hdrstop
+
+//
+// private prototypes
+//
+
+PRIVATE
+VOID
+VwInvalidFunction(
+ VOID
+ );
+
+//
+// private data
+//
+
+PRIVATE
+VOID
+(*VwDispatchTable[])(VOID) = {
+ VwIPXOpenSocket, // 0x00
+ VwIPXCloseSocket, // 0x01
+ VwIPXGetLocalTarget, // 0x02
+ VwIPXSendPacket, // 0x03
+ VwIPXListenForPacket, // 0x04
+ VwIPXScheduleIPXEvent, // 0x05
+ VwIPXCancelEvent, // 0x06
+ VwIPXScheduleAESEvent, // 0x07
+ VwIPXGetIntervalMarker, // 0x08
+ VwIPXGetInternetworkAddress, // 0x09
+ VwIPXRelinquishControl, // 0x0A
+ VwIPXDisconnectFromTarget, // 0x0B
+ VwInvalidFunction, // 0x0C
+ VwInvalidFunction, // 0x0D old-style GetMaxPacketSize
+ VwInvalidFunction, // 0x0E
+ VwInvalidFunction, // 0x0F internal send packet function
+ VwSPXInitialize, // 0x10
+ VwSPXEstablishConnection, // 0x11
+ VwSPXListenForConnection, // 0x12
+ VwSPXTerminateConnection, // 0x13
+ VwSPXAbortConnection, // 0x14
+ VwSPXGetConnectionStatus, // 0x15
+ VwSPXSendSequencedPacket, // 0x16
+ VwSPXListenForSequencedPacket, // 0x17
+ VwInvalidFunction, // 0x18
+ VwInvalidFunction, // 0x19
+ VwIPXGetMaxPacketSize, // 0x1A
+ VwInvalidFunction, // 0x1B
+ VwInvalidFunction, // 0x1C
+ VwInvalidFunction, // 0x1D
+ VwInvalidFunction, // 0x1E
+ VwIPXGetInformation, // 0x1F
+ VwIPXSendWithChecksum, // 0x20
+ VwIPXGenerateChecksum, // 0x21
+ VwIPXVerifyChecksum // 0x22
+};
+
+#define MAX_IPXSPX_FUNCTION LAST_ELEMENT(VwDispatchTable)
+
+WSADATA WsaData = {0};
+HANDLE hAesThread = NULL;
+
+//
+// global data
+//
+
+SOCKADDR_IPX MyInternetAddress;
+WORD MyMaxPacketSize;
+int Ica;
+BYTE IcaLine;
+
+//
+// not-really-global data
+//
+
+extern CRITICAL_SECTION SerializationCritSec;
+extern CRITICAL_SECTION AsyncCritSec;
+
+//
+// functions
+//
+
+
+BOOL
+WINAPI
+VwDllEntryPoint(
+ IN PVOID DllHandle,
+ IN ULONG Reason,
+ IN PCONTEXT Context OPTIONAL
+ )
+
+/*++
+
+Routine Description:
+
+ Called when the process attaches (LoadLibrary/init) and detaches (FreeLibrary/
+ process termination) from this DLL
+
+ Attach:
+ initialize Winsock DLL
+ get internet address for this station
+ get maximum packet size supported by transport (IPX)
+ create AES thread
+
+ Detach:
+ terminate Winsock DLL
+
+Arguments:
+
+ DllHandle - unused
+ Reason - checked for process attach/detach
+ Context - unused
+
+Return Value:
+
+ BOOLEAN
+
+--*/
+
+{
+ DWORD aesThreadId; // unused outside of this function
+
+ static BOOL CriticalSectionsAreInitialized = FALSE;
+
+ UNREFERENCED_PARAMETER(DllHandle);
+ UNREFERENCED_PARAMETER(Context);
+
+ IPXDBGSTART();
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_INFO,
+ "VwDllEntryPoint: %s\n",
+ Reason == DLL_PROCESS_ATTACH ? "DLL_PROCESS_ATTACH"
+ : Reason == DLL_PROCESS_DETACH ? "DLL_PROCESS_DETACH"
+ : Reason == DLL_THREAD_ATTACH ? "DLL_THREAD_ATTACH"
+ : Reason == DLL_THREAD_DETACH ? "DLL_THREAD_DETACH"
+ : "?"
+ ));
+
+ if (Reason == DLL_PROCESS_ATTACH) {
+
+ int err;
+
+ //
+ // BUGBUG: get ICA values from new VDD service. Right now we grab
+ // line 4 on the slave (base = 0x70, modifier = 0x03)
+ //
+
+ Ica = ICA_SLAVE;
+ IcaLine = 3;
+
+ err = WSAStartup(MAKEWORD(1, 1), &WsaData);
+ if (err) {
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_FATAL,
+ "VwDllEntryPoint: WSAStartup() returns %d\n",
+ err
+ ));
+
+ return FALSE;
+ } else {
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_INFO,
+ "VwDllEntryPoint: WsaData:\n"
+ "\twVersion : 0x%04x\n"
+ "\twHighVersion : 0x%04x\n"
+ "\tszDescription : \"%s\"\n"
+ "\tszSystemStatus : \"%s\"\n"
+ "\tiMaxSockets : %d\n"
+ "\tiMaxUdpDg : %d\n"
+ "\tlpVendorInfo : 0x%08x\n",
+ WsaData.wVersion,
+ WsaData.wHighVersion,
+ WsaData.szDescription,
+ WsaData.szSystemStatus,
+ WsaData.iMaxSockets,
+ WsaData.iMaxUdpDg,
+ WsaData.lpVendorInfo
+ ));
+
+ }
+
+ //
+ // retrieve the internet address for this station. Used in
+ // IPXGetInternetworkAddress() and IPXSendPacket()
+ //
+
+ err = GetInternetAddress(&MyInternetAddress);
+ if (err) {
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_FATAL,
+ "VwDllEntryPoint: GetInternetAddress() returns %d\n",
+ WSAGetLastError()
+ ));
+
+ goto attach_error_exit;
+ } else {
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_INFO,
+ "VwDllEntryPoint: MyInternetAddress:\n"
+ "\tNet : %02.2x-%02.2x-%02.2x-%02.2x\n"
+ "\tNode : %02.2x-%02.2x-%02.2x-%02.2x-%02.2x-%02.2x\n",
+ MyInternetAddress.sa_netnum[0] & 0xff,
+ MyInternetAddress.sa_netnum[1] & 0xff,
+ MyInternetAddress.sa_netnum[2] & 0xff,
+ MyInternetAddress.sa_netnum[3] & 0xff,
+ MyInternetAddress.sa_nodenum[0] & 0xff,
+ MyInternetAddress.sa_nodenum[1] & 0xff,
+ MyInternetAddress.sa_nodenum[2] & 0xff,
+ MyInternetAddress.sa_nodenum[3] & 0xff,
+ MyInternetAddress.sa_nodenum[4] & 0xff,
+ MyInternetAddress.sa_nodenum[5] & 0xff
+ ));
+
+ }
+
+ //
+ // get the maximum packet size supported by IPX. Used in
+ // IPXGetMaxPacketSize()
+ //
+
+ err = GetMaxPacketSize(&MyMaxPacketSize);
+ if (err) {
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_FATAL,
+ "VwDllEntryPoint: GetMaxPacketSize() returns %d\n",
+ WSAGetLastError()
+ ));
+
+ goto attach_error_exit;
+ } else {
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_INFO,
+ "VwDllEntryPoint: GetMaxPacketSize: %04x (%d)\n",
+ MyMaxPacketSize,
+ MyMaxPacketSize
+ ));
+
+ }
+
+ hAesThread = CreateThread(NULL,
+ 0,
+ (LPTHREAD_START_ROUTINE)VwAesThread,
+ NULL,
+ 0,
+ &aesThreadId
+ );
+ if (hAesThread == NULL) {
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_FATAL,
+ "VwDllEntryPoint: CreateThread() returns %d\n",
+ GetLastError()
+ ));
+
+ goto attach_error_exit;
+ }
+
+ //
+ // finally initialize any critical sections
+ //
+
+ InitializeCriticalSection(&SerializationCritSec);
+ InitializeCriticalSection(&AsyncCritSec);
+ CriticalSectionsAreInitialized = TRUE;
+ } else if (Reason == DLL_PROCESS_DETACH) {
+ if (hAesThread != NULL) {
+ WaitForSingleObject(hAesThread, ONE_TICK * 2);
+ CloseHandle(hAesThread);
+ }
+
+ WSACleanup();
+
+ if (CriticalSectionsAreInitialized) {
+ DeleteCriticalSection(&SerializationCritSec);
+ DeleteCriticalSection(&AsyncCritSec);
+ }
+
+ IPXDBGEND();
+ }
+ return TRUE;
+
+attach_error_exit:
+
+ //
+ // here if any fatal errors on process attach after successfully performing
+ // WSAStartup
+ //
+
+ WSACleanup();
+ return FALSE;
+}
+
+BYTE
+VWinInitialize(
+ VOID
+ )
+/*++
+
+Routine Description:
+
+ Called by interface when nwipxspx.dll is loaded. We
+ return the IRQ value.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ The IRQ value.
+
+--*/
+
+{
+ return 0x73;
+}
+
+
+
+VOID
+VwInitialize(
+ VOID
+ )
+
+/*++
+
+Routine Description:
+
+ Called by VDD interface when DLL loaded via call to RegisterModule. We
+ get the IRQ value and return it as an interrupt vector in BX
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+--*/
+
+{
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_INFO,
+ "VwInitialize\n"
+ ));
+
+ //
+ // only lines on slave PIC are available. Currently, lines 3, 4 and 7 are
+ // not used. We'll grab line 3 here, but in the future we expect a function
+ // to return the available IRQ line
+ //
+
+ setBX( VWinInitialize() );
+}
+
+
+VOID
+VwDispatcher(
+ VOID
+ )
+
+/*++
+
+Routine Description:
+
+ Branches to relevant IPX/SPX handler for DOS calls, based on contents of
+ VDM BX register.
+
+ Control transfered here from 16-bit entry point, either as result of call
+ to far address returned from INT 2Fh/AH=7A or INT 7Ah
+
+ Special: we use BX = 0xFFFF to indicate that the app is terminating. The
+ TSR hooks INT 0x2F/AX=0x1122 (IFSResetEnvironment)
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+--*/
+
+{
+ DWORD dispatchIndex;
+
+ dispatchIndex = (DWORD)getBX() & 0x7fff;
+
+ if (dispatchIndex <= MAX_IPXSPX_FUNCTION) {
+ VwDispatchTable[dispatchIndex]();
+ } else if (dispatchIndex == 0x7FFE) {
+ EsrCallback();
+ } else if (dispatchIndex == 0x7FFF) {
+ VwTerminateProgram();
+ } else {
+
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_ERROR,
+ "ERROR: VwDispatcher: dispatchIndex = %x\n",
+ dispatchIndex
+ ));
+
+ //
+ // BUGBUG - what's the correct error code to return in this situation?
+ // (will it ever arise?)
+ //
+
+ setAX(ERROR_INVALID_FUNCTION);
+ setCF(1);
+ }
+}
+
+
+PRIVATE
+VOID
+VwInvalidFunction(
+ VOID
+ )
+
+/*++
+
+Routine Description:
+
+ Just alerts us to the fact that an invalid function request was made.
+ Useful if any app makes a bad call, or we miss out a required function
+ during design/implementation
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+--*/
+
+{
+ IPXDBGPRINT((__FILE__, __LINE__,
+ FUNCTION_ANY,
+ IPXDBG_LEVEL_INFO,
+ "VwInvalidFunction: BX=%04x\n",
+ getBX()
+ ));
+}