Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
3.4 KiB

/*
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;
}