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