112 lines
3.4 KiB
C
112 lines
3.4 KiB
C
|
/*
|
||
|
File PnP.c
|
||
|
|
||
|
Implementation of pnp enhancements of the interface between the IPX stack and
|
||
|
the IPX user-mode router components software PnP enabled.
|
||
|
|
||
|
|
||
|
Paul Mayfield, 11/5/97.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include "ipxdefs.h"
|
||
|
#include "pnp.h"
|
||
|
|
||
|
// Globals from other files
|
||
|
extern WCHAR ISN_IPX_NAME[];
|
||
|
extern ULONG InternalNetworkNumber;
|
||
|
extern UCHAR INTERNAL_NODE_ADDRESS[6];
|
||
|
extern IO_STATUS_BLOCK IoctlStatus;
|
||
|
extern HANDLE IpxDriverHandle;
|
||
|
extern LONG AdapterChangeApcPending;
|
||
|
extern LIST_ENTRY PortListHead;
|
||
|
extern PCONFIG_PORT IpxWanPort;
|
||
|
extern CRITICAL_SECTION ConfigInfoLock;
|
||
|
extern ULONG NumAdapters;
|
||
|
|
||
|
// [pmay] The global trace id.
|
||
|
extern DWORD g_dwTraceId;
|
||
|
DWORD IpxPostIntNetNumMessage(PCONFIG_PORT pPort, DWORD dwNewNetNum);
|
||
|
|
||
|
// Queries the ipx stack for the current ipx internal net number. This code was
|
||
|
// stolen from OpenAdapterConfigPort.
|
||
|
DWORD PnpGetCurrentInternalNetNum(LPDWORD lpdwNetNum) {
|
||
|
PISN_ACTION_GET_DETAILS details;
|
||
|
PNWLINK_ACTION action;
|
||
|
CHAR IoctlBuffer[sizeof (NWLINK_ACTION)
|
||
|
+sizeof (ISN_ACTION_GET_DETAILS)];
|
||
|
NTSTATUS status;
|
||
|
IO_STATUS_BLOCK IoStatus;
|
||
|
|
||
|
|
||
|
//TracePrintf(g_dwTraceId, "Entered PnpGetCurrentInternalNetNum\n");
|
||
|
|
||
|
// Prepare to send an ioctl to the stack to get the internal
|
||
|
// net information along with the global adapter information
|
||
|
action = (PNWLINK_ACTION)IoctlBuffer;
|
||
|
action->Header.TransportId = ISN_ACTION_TRANSPORT_ID;
|
||
|
action->OptionType = NWLINK_OPTION_CONTROL;
|
||
|
action->BufferLength = sizeof(action->Option) + sizeof(ISN_ACTION_GET_DETAILS);
|
||
|
action->Option = MIPX_CONFIG;
|
||
|
details = (PISN_ACTION_GET_DETAILS)action->Data;
|
||
|
|
||
|
// Nic id 0 will return internal net information and
|
||
|
// total number of adapters
|
||
|
details->NicId = 0;
|
||
|
|
||
|
// Send the ioctl
|
||
|
status = NtDeviceIoControlFile(
|
||
|
IpxDriverHandle,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
&IoStatus,
|
||
|
IOCTL_TDI_ACTION,
|
||
|
NULL,
|
||
|
0,
|
||
|
action,
|
||
|
sizeof(NWLINK_ACTION) + sizeof(ISN_ACTION_GET_DETAILS));
|
||
|
|
||
|
// Wait for the ioctl to complete
|
||
|
if (status==STATUS_PENDING) {
|
||
|
status = NtWaitForSingleObject (IpxDriverHandle, FALSE, NULL);
|
||
|
if (NT_SUCCESS (status))
|
||
|
status = IoStatus.Status;
|
||
|
}
|
||
|
|
||
|
// Output the new net number
|
||
|
//TracePrintf(g_dwTraceId, "PnpGetCurrentInternalNetNum: Stack has returned internal net num: %x\n",
|
||
|
// details->NetworkNumber);
|
||
|
|
||
|
// If the stack reports all the requested information without error,
|
||
|
// update global variables with the information retrieved.
|
||
|
if (NT_SUCCESS (status)) {
|
||
|
NumAdapters = details->NicId;
|
||
|
*lpdwNetNum = details->NetworkNumber;
|
||
|
//TracePrintf(g_dwTraceId, "PnpGetCurrentInternalNetNum: Returning success\n");
|
||
|
return NO_ERROR;
|
||
|
}
|
||
|
|
||
|
return ERROR_CAN_NOT_COMPLETE;
|
||
|
}
|
||
|
|
||
|
// Notifies all clients to adptif (rtrmgr, sap, rip) that the internal
|
||
|
// network number has changed.
|
||
|
DWORD PnpHandleInternalNetNumChange(DWORD dwNewNetNum) {
|
||
|
PCONFIG_PORT pPort;
|
||
|
PLIST_ENTRY cur;
|
||
|
|
||
|
TracePrintf(g_dwTraceId, "PnpHandleInternalNetNumChange: Entered with number: %x", dwNewNetNum);
|
||
|
|
||
|
// Signal each client (as in rtrmgr, sap, rip) to update
|
||
|
// the internal network number.
|
||
|
for (cur=PortListHead.Flink; cur != &PortListHead; cur = cur->Flink) {
|
||
|
pPort = CONTAINING_RECORD (cur, CONFIG_PORT, link);
|
||
|
IpxPostIntNetNumMessage(pPort, dwNewNetNum);
|
||
|
}
|
||
|
|
||
|
TracePrintf(g_dwTraceId, "\n");
|
||
|
return NO_ERROR;
|
||
|
}
|
||
|
|