diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/nbt/vxd/nbtinfo.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to '')
-rw-r--r-- | private/ntos/nbt/vxd/nbtinfo.c | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/private/ntos/nbt/vxd/nbtinfo.c b/private/ntos/nbt/vxd/nbtinfo.c new file mode 100644 index 000000000..ad267685f --- /dev/null +++ b/private/ntos/nbt/vxd/nbtinfo.c @@ -0,0 +1,227 @@ +/**********************************************************************/ +/** Microsoft Windows/NT **/ +/** Copyright(c) Microsoft Corp., 1993 **/ +/**********************************************************************/ + +/* + Nbtinfo.c + + This file contains the NBT Info APIs + + + + FILE HISTORY: + Johnl 13-Dec-1993 Created + +*/ + + +#include <nbtprocs.h> +#include <dhcpinfo.h> +#include <nbtinfo.h> + +/******************************************************************* + + NAME: AddrChngNotification + + SYNOPSIS: Notification handler called by Dhcp when an IpAddress + lease has expired or changed. + + ENTRY: Context - Pointer to device context + OldIpAddress - in network order + NewIpAddress - in network order + NewMask - in network order + + NOTES: + + HISTORY: + Johnl 21-Dec-1993 Created + +********************************************************************/ + +VOID AddrChngNotification( PVOID Context, + ULONG OldIpAddress, + ULONG NewIpAddress, + ULONG NewMask ) +{ + tDEVICECONTEXT * pDeviceContext = (tDEVICECONTEXT*) Context ; + TDI_STATUS tdistatus ; + NTSTATUS status ; + ULONG IpBuff[4] ; + UINT Size ; + ULONG TmpNodeType; + + DbgPrint("DhcpNotification: Nbt being notified of IP Address change by DHCP\r\n") ; + + // + // NBT assumes the address goes to zero then comes up on the new + // address, so if the address is going to a new address (not to + // zero first) then fake it. + // + + if ( NewIpAddress && pDeviceContext->IpAddress ) + { + if ( status = NbtNewDhcpAddress( pDeviceContext, 0, 0 ) ) + { + CDbgPrint( DBGFLAG_ERROR, ("DhcpNotification: NbtSetNewDhcpAddress failed")) ; + } + } + + if ( NewIpAddress == 0 ) + { + if ( status = NbtNewDhcpAddress( pDeviceContext, 0, 0 ) ) + { + CDbgPrint( DBGFLAG_ERROR, ("DhcpNotification: NbtSetNewDhcpAddress failed")) ; + } + pDeviceContext->IpAddress = 0 ; + return ; + } + + // + // Get all of the values that may change when the IP address changes. + // Currently this is only NBNS (scope & broadcast address are global + // NBT config parameters). + // + + Size = sizeof( IpBuff ) ; + tdistatus = DhcpQueryOption( NewIpAddress, + 44, // NBNS + IpBuff, + &Size ) ; + + if ( tdistatus != TDI_SUCCESS && + tdistatus != TDI_BUFFER_OVERFLOW ) + { + CDbgPrint( DBGFLAG_ERROR, ("DhcpNotification: Query on NBNS failed")) ; + } + else + { + if ( Size >= 4 ) + pDeviceContext->lNameServerAddress = ntohl(IpBuff[0]) ; + + if ( Size >= 8 ) + pDeviceContext->lBackupServer = ntohl(IpBuff[1]) ; + } + + // + // if the node type is set to Bnode by default then switch to Hnode if + // there are any WINS servers configured. + // + TmpNodeType = NodeType; + + if ((NodeType & DEFAULT_NODE_TYPE) && + (pDeviceContext->lNameServerAddress || pDeviceContext->lBackupServer)) + { + NodeType = MSNODE; + if (TmpNodeType & PROXY) + NodeType |= PROXY; + } + + // + // Now set the new IP address + // + + status = NbtNewDhcpAddress( pDeviceContext, + NewIpAddress, + NewMask ) ; + + if ( NT_SUCCESS(status) ) + { + if (pDeviceContext->IpAddress) + { + // + // Add the "permanent" name to the local name table. + // + status = NbtAddPermanentName(pDeviceContext); + + if (!(NodeType & BNODE)) + { + // the Ip address just changed and Dhcp may be informing + // us of a new Wins Server addresses, so refresh all the + // names to the new wins server + // + ReRegisterLocalNames(); + } + else + { + // + // no need to refresh on a Bnode + // + LockedStopTimer(&NbtConfig.pRefreshTimer); + } + } + } + + else + { + CDbgPrint( DBGFLAG_ERROR, ("DhcpNotification: NbtSetNewDhcpAddress failed")) ; + } + + + +} + + +/******************************************************************* + + NAME: CloseAddressesWithTransport + + SYNOPSIS: Closes address objects on the passed in device + + ENTRY: pDeviceContext - Device context to close + + NOTES: Used after an IP address loses its DHCP lease by OS + independent code. + + HISTORY: + Johnl 13-Dec-1993 Created + +********************************************************************/ + +NTSTATUS +CloseAddressesWithTransport( + IN tDEVICECONTEXT *pDeviceContext ) +{ + TDI_REQUEST Request ; + NTSTATUS status; + + + if (pDeviceContext->pDgramFileObject) + { + Request.Handle.AddressHandle = pDeviceContext->pDgramFileObject ; + if ( TdiVxdCloseAddress( &Request )) + CDbgPrint( DBGFLAG_ERROR, ("NbtSetInfo: Warning - CloseAddress Failed\r\n")) ; + pDeviceContext->pDgramFileObject = NULL; + } + + if (pDeviceContext->pNameServerFileObject) + { + Request.Handle.AddressHandle = pDeviceContext->pNameServerFileObject ; + if ( TdiVxdCloseAddress( &Request )) + CDbgPrint( DBGFLAG_ERROR, ("NbtSetInfo: Warning - CloseAddress Failed\r\n")) ; + pDeviceContext->pNameServerFileObject = NULL; + } + + if (pDeviceContext->pSessionFileObject) + { + Request.Handle.AddressHandle = pDeviceContext->pSessionFileObject ; + if ( TdiVxdCloseAddress( &Request )) + CDbgPrint( DBGFLAG_ERROR, ("NbtSetInfo: Warning - CloseAddress Failed\r\n")) ; + pDeviceContext->pSessionFileObject = NULL; + } + + if (pDeviceContext->hBroadcastAddress) + { + Request.Handle.ConnectionContext = pDeviceContext->hBroadcastAddress ; + status = NbtCloseAddress( &Request, NULL, pDeviceContext, NULL ); + if ( !NT_SUCCESS(status) ) + { + CDbgPrint( DBGFLAG_ERROR, ("NbtSetInfo: Warning - Close Broadcast Address Failed\r\n")) ; + ASSERT(0); + } + } + + return STATUS_SUCCESS ; +} + + |