Leaked source code of windows server 2003
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.

809 lines
22 KiB

  1. /********************************************************************/
  2. /** Copyright(c) 1995 Microsoft Corporation. **/
  3. /********************************************************************/
  4. //***
  5. //
  6. // Filename: ifobject.c
  7. //
  8. // Description: Routines to manipulate ROUTER_INTERFACE_OBJECTs
  9. //
  10. // History: May 11,1995 NarenG Created original version.
  11. //
  12. #include "dimsvcp.h"
  13. #include <netconp.h>
  14. //**
  15. //
  16. // Call: GetNewIfHandle
  17. //
  18. // Returns: Handle for new interface
  19. //
  20. // Description: Will generate an id that will be used for an handle to the new
  21. // interface.
  22. //
  23. HANDLE
  24. GetNewIfHandle(
  25. VOID
  26. )
  27. {
  28. static DWORD Id = 2;
  29. return( (HANDLE)UlongToPtr(Id++) );
  30. }
  31. //**
  32. //
  33. // Call: IfObjectAllocateAndInit
  34. //
  35. // Returns: ROUTER_INTERFACE_OBJECT * - Success
  36. // NULL - Failure
  37. //
  38. // Description: Allocates and initializes a ROUTER_INTERFACE_OBJECT structure
  39. //
  40. ROUTER_INTERFACE_OBJECT *
  41. IfObjectAllocateAndInit(
  42. IN LPWSTR lpwstrName,
  43. IN ROUTER_INTERFACE_STATE State,
  44. IN ROUTER_INTERFACE_TYPE IfType,
  45. IN HCONN hConnection,
  46. IN BOOL fEnabled,
  47. IN DWORD dwInterfaceReachableAfterSecondsMin,
  48. IN DWORD dwInterfaceReachableAfterSecondsMax,
  49. IN LPWSTR lpwsDialoutHoursRestriction,
  50. IN PVOID * ppvContext
  51. )
  52. {
  53. DWORD dwRetCode;
  54. ROUTER_INTERFACE_OBJECT * pIfObject;
  55. DWORD dwIfObjectSize;
  56. DWORD dwTransportIndex;
  57. //
  58. // On a workstation we do not allow creation of demand-dial interfaces
  59. //
  60. if ( gblDIMConfigInfo.NtProductType == NtProductWinNt )
  61. {
  62. if ( ( IfType == ROUTER_IF_TYPE_FULL_ROUTER ) )
  63. {
  64. WCHAR * pChar = lpwstrName;
  65. DIMLogWarning( ROUTERLOG_LIMITED_WKSTA_SUPPORT,1, &pChar );
  66. SetLastError( ERROR_NOT_SUPPORTED );
  67. return( (ROUTER_INTERFACE_OBJECT *)NULL );
  68. }
  69. }
  70. //
  71. // Hardcode to 2 routermanagers, one for IP, one for IPX. We need to do this
  72. // because then we do not need to reallocate the size to accomodate a new protocol
  73. // when it is added dynamically to the router
  74. //
  75. dwIfObjectSize = sizeof( ROUTER_INTERFACE_OBJECT )
  76. + ( sizeof( ROUTER_INTERFACE_TRANSPORT ) * 2 );
  77. pIfObject = (ROUTER_INTERFACE_OBJECT *)LOCAL_ALLOC( LPTR, dwIfObjectSize );
  78. if ( pIfObject == (ROUTER_INTERFACE_OBJECT *)NULL )
  79. {
  80. return( (ROUTER_INTERFACE_OBJECT *)NULL );
  81. }
  82. pIfObject->lpwsInterfaceName = (LPWSTR)LOCAL_ALLOC( LPTR,
  83. (wcslen(lpwstrName)+1)
  84. * sizeof(WCHAR) );
  85. if ( pIfObject->lpwsInterfaceName == (LPWSTR)NULL )
  86. {
  87. IfObjectFree( pIfObject );
  88. return( (ROUTER_INTERFACE_OBJECT *)NULL );
  89. }
  90. if ( ( IfType == ROUTER_IF_TYPE_DEDICATED ) ||
  91. ( IfType == ROUTER_IF_TYPE_TUNNEL1 ) ||
  92. ( IfType == ROUTER_IF_TYPE_INTERNAL ) )
  93. {
  94. if ( !fEnabled )
  95. {
  96. WCHAR * pChar = lpwstrName;
  97. SetLastError( ERROR_INVALID_PARAMETER );
  98. DIMLogErrorString( ROUTERLOG_COULDNT_LOAD_IF, 1, &pChar,
  99. ERROR_INVALID_PARAMETER, 1 );
  100. IfObjectFree( pIfObject );
  101. return( (ROUTER_INTERFACE_OBJECT *)NULL );
  102. }
  103. }
  104. pIfObject->dwReachableAfterSecondsMin=dwInterfaceReachableAfterSecondsMin;
  105. pIfObject->dwReachableAfterSecondsMax=dwInterfaceReachableAfterSecondsMax;
  106. pIfObject->dwReachableAfterSeconds =dwInterfaceReachableAfterSecondsMin;
  107. wcscpy( pIfObject->lpwsInterfaceName, lpwstrName );
  108. pIfObject->State = State;
  109. pIfObject->IfType = IfType;
  110. pIfObject->hConnection = hConnection;
  111. pIfObject->hDIMInterface = ( IfType == ROUTER_IF_TYPE_LOOPBACK )
  112. ? (HANDLE)1
  113. : GetNewIfHandle();
  114. pIfObject->fFlags = ( fEnabled ) ? IFFLAG_ENABLED : 0;
  115. pIfObject->hEventNotifyCaller = INVALID_HANDLE_VALUE;
  116. //
  117. // Initialize the router manager handles
  118. //
  119. for ( dwTransportIndex = 0;
  120. dwTransportIndex < gblDIMConfigInfo.dwNumRouterManagers;
  121. dwTransportIndex++ )
  122. {
  123. pIfObject->Transport[dwTransportIndex].hInterface=INVALID_HANDLE_VALUE;
  124. }
  125. //
  126. // If we are running in LANONLYMode then we do not care about media bits
  127. //
  128. if ( gblDIMConfigInfo.dwRouterRole == ROUTER_ROLE_LAN )
  129. {
  130. return( pIfObject );
  131. }
  132. if ( ( IfType == ROUTER_IF_TYPE_FULL_ROUTER ) )
  133. {
  134. DWORD
  135. (*IfObjectLoadPhonebookInfo)( ROUTER_INTERFACE_OBJECT *, VOID * ) =
  136. (DWORD(*)( ROUTER_INTERFACE_OBJECT *, VOID * ))
  137. GetDDMEntryPoint("IfObjectLoadPhonebookInfo");
  138. if(NULL == IfObjectLoadPhonebookInfo)
  139. {
  140. SetLastError( ERROR_PROC_NOT_FOUND );
  141. return NULL;
  142. }
  143. //
  144. // Load phonebook information for this interface
  145. //
  146. dwRetCode = IfObjectLoadPhonebookInfo( pIfObject, ppvContext );
  147. if ( dwRetCode != NO_ERROR )
  148. {
  149. if ( dwRetCode == ERROR_INTERFACE_HAS_NO_DEVICES )
  150. {
  151. pIfObject->fFlags |= IFFLAG_OUT_OF_RESOURCES;
  152. }
  153. else
  154. {
  155. WCHAR * pChar = lpwstrName;
  156. DIMLogErrorString( ROUTERLOG_COULDNT_LOAD_IF, 1, &pChar,
  157. dwRetCode, 1 );
  158. SetLastError( dwRetCode );
  159. IfObjectFree( pIfObject );
  160. return( NULL );
  161. }
  162. }
  163. pIfObject->lpwsDialoutHoursRestriction = lpwsDialoutHoursRestriction;
  164. }
  165. return( pIfObject );
  166. }
  167. //**
  168. //
  169. // Call: IfObjectInsertInTable
  170. //
  171. // Returns: NO_ERROR - Success
  172. // ERROR_MAX_WAN_INTERFACE_LIMIT - Failure
  173. // ERROR_MAX_LAN_INTERFACE_LIMIT - Failure
  174. // ERROR_MAX_CLIENT_INTERFACE_LIMIT - Failure
  175. //
  176. // Description: Will insert this interface object into the interface object
  177. // table
  178. //
  179. DWORD
  180. IfObjectInsertInTable(
  181. IN ROUTER_INTERFACE_OBJECT * pIfObject
  182. )
  183. {
  184. DWORD dwBucketIndex=IfObjectHashIfHandleToBucket(pIfObject->hDIMInterface);
  185. if ( pIfObject->IfType == ROUTER_IF_TYPE_FULL_ROUTER )
  186. {
  187. if ( gblInterfaceTable.dwNumWanInterfaces == DIM_MAX_WAN_INTERFACES )
  188. {
  189. return( ERROR_MAX_WAN_INTERFACE_LIMIT );
  190. }
  191. else
  192. {
  193. gblInterfaceTable.dwNumWanInterfaces++;
  194. }
  195. }
  196. else if ( pIfObject->IfType == ROUTER_IF_TYPE_DEDICATED )
  197. {
  198. if ( gblInterfaceTable.dwNumLanInterfaces == DIM_MAX_LAN_INTERFACES )
  199. {
  200. return( ERROR_MAX_LAN_INTERFACE_LIMIT );
  201. }
  202. else
  203. {
  204. gblInterfaceTable.dwNumLanInterfaces++;
  205. }
  206. }
  207. else if ( pIfObject->IfType == ROUTER_IF_TYPE_CLIENT )
  208. {
  209. if (gblInterfaceTable.dwNumClientInterfaces==DIM_MAX_CLIENT_INTERFACES)
  210. {
  211. return( ERROR_MAX_CLIENT_INTERFACE_LIMIT );
  212. }
  213. else
  214. {
  215. gblInterfaceTable.dwNumClientInterfaces++;
  216. }
  217. }
  218. pIfObject->pNext = gblInterfaceTable.IfBucket[dwBucketIndex];
  219. gblInterfaceTable.IfBucket[dwBucketIndex] = pIfObject;
  220. gblInterfaceTable.dwNumTotalInterfaces++;
  221. return( NO_ERROR );
  222. }
  223. //**
  224. //
  225. // Call:
  226. //
  227. // Returns:
  228. //
  229. // Description:
  230. //
  231. ROUTER_INTERFACE_OBJECT *
  232. IfObjectGetPointer(
  233. IN HANDLE hDIMInterface
  234. )
  235. {
  236. DWORD dwBucketIndex;
  237. ROUTER_INTERFACE_OBJECT * pIfObject;
  238. dwBucketIndex = IfObjectHashIfHandleToBucket(hDIMInterface);
  239. for( pIfObject = gblInterfaceTable.IfBucket[dwBucketIndex];
  240. pIfObject != (ROUTER_INTERFACE_OBJECT *)NULL;
  241. pIfObject = pIfObject->pNext )
  242. {
  243. if ( pIfObject->hDIMInterface == hDIMInterface )
  244. {
  245. return( pIfObject );
  246. }
  247. }
  248. return( (ROUTER_INTERFACE_OBJECT *)NULL );
  249. }
  250. //**
  251. //
  252. // Call: IfObjectHashIfHandleToBucket
  253. //
  254. // Returns:
  255. //
  256. // Description:
  257. //
  258. DWORD
  259. IfObjectHashIfHandleToBucket(
  260. IN HANDLE hDIMInterface
  261. )
  262. {
  263. return( (DWORD)((ULONG_PTR)hDIMInterface) % NUM_IF_BUCKETS );
  264. }
  265. //**
  266. //
  267. // Call: IfObjectRemove
  268. //
  269. // Returns:
  270. //
  271. // Description:
  272. //
  273. VOID
  274. IfObjectRemove(
  275. IN HANDLE hDIMInterface
  276. )
  277. {
  278. DWORD dwBucketIndex;
  279. ROUTER_INTERFACE_OBJECT * pIfObject;
  280. ROUTER_INTERFACE_OBJECT * pIfObjectPrev;
  281. dwBucketIndex = IfObjectHashIfHandleToBucket(hDIMInterface);
  282. pIfObject = gblInterfaceTable.IfBucket[dwBucketIndex];
  283. pIfObjectPrev = pIfObject;
  284. while( pIfObject != (ROUTER_INTERFACE_OBJECT *)NULL )
  285. {
  286. if ( pIfObject->hDIMInterface == hDIMInterface )
  287. {
  288. if ( gblInterfaceTable.IfBucket[dwBucketIndex] == pIfObject )
  289. {
  290. gblInterfaceTable.IfBucket[dwBucketIndex] = pIfObject->pNext;
  291. }
  292. else
  293. {
  294. pIfObjectPrev->pNext = pIfObject->pNext;
  295. }
  296. gblInterfaceTable.dwNumTotalInterfaces--;
  297. if ( pIfObject->IfType == ROUTER_IF_TYPE_FULL_ROUTER )
  298. {
  299. gblInterfaceTable.dwNumWanInterfaces--;
  300. }
  301. else if ( pIfObject->IfType == ROUTER_IF_TYPE_DEDICATED )
  302. {
  303. gblInterfaceTable.dwNumLanInterfaces--;
  304. }
  305. else if ( pIfObject->IfType == ROUTER_IF_TYPE_CLIENT )
  306. {
  307. gblInterfaceTable.dwNumClientInterfaces--;
  308. }
  309. IfObjectFree( pIfObject );
  310. return;
  311. }
  312. pIfObjectPrev = pIfObject;
  313. pIfObject = pIfObject->pNext;
  314. }
  315. }
  316. //**
  317. //
  318. // Call: IfObjectFree
  319. //
  320. // Returns: NO_ERROR - Success
  321. // Non-zero returns - Failure
  322. //
  323. // Description: Will release all memory allocated for the interfae object.
  324. //
  325. VOID
  326. IfObjectFree(
  327. IN ROUTER_INTERFACE_OBJECT * pIfObject
  328. )
  329. {
  330. if ( pIfObject->lpwsInterfaceName != NULL )
  331. {
  332. LOCAL_FREE( pIfObject->lpwsInterfaceName );
  333. }
  334. if ( pIfObject->lpwsDialoutHoursRestriction != NULL )
  335. {
  336. LOCAL_FREE( pIfObject->lpwsDialoutHoursRestriction );
  337. }
  338. LOCAL_FREE( pIfObject );
  339. }
  340. //**
  341. //
  342. // Call: IfObjectGetPointerByName
  343. //
  344. // Returns:
  345. //
  346. // Description:
  347. //
  348. ROUTER_INTERFACE_OBJECT *
  349. IfObjectGetPointerByName(
  350. IN LPWSTR lpwstrName,
  351. IN BOOL fIncludeClientInterfaces
  352. )
  353. {
  354. DWORD dwBucketIndex;
  355. ROUTER_INTERFACE_OBJECT * pIfObject;
  356. for ( dwBucketIndex = 0; dwBucketIndex < NUM_IF_BUCKETS; dwBucketIndex++ )
  357. {
  358. for( pIfObject = gblInterfaceTable.IfBucket[dwBucketIndex];
  359. pIfObject != (ROUTER_INTERFACE_OBJECT *)NULL;
  360. pIfObject = pIfObject->pNext )
  361. {
  362. if ( _wcsicmp( pIfObject->lpwsInterfaceName, lpwstrName ) == 0 )
  363. {
  364. if ( pIfObject->IfType == ROUTER_IF_TYPE_CLIENT )
  365. {
  366. if ( fIncludeClientInterfaces )
  367. {
  368. return( pIfObject );
  369. }
  370. else
  371. {
  372. continue;
  373. }
  374. }
  375. return( pIfObject );
  376. }
  377. }
  378. }
  379. return( (ROUTER_INTERFACE_OBJECT *)NULL );
  380. }
  381. //**
  382. //
  383. // Call: IfObjectDoesLanInterfaceExist
  384. //
  385. // Returns: NO_ERROR - Success
  386. // Non-zero returns - Failure
  387. //
  388. // Description:
  389. //
  390. BOOL
  391. IfObjectDoesLanInterfaceExist(
  392. VOID
  393. )
  394. {
  395. DWORD dwBucketIndex;
  396. ROUTER_INTERFACE_OBJECT * pIfObject;
  397. for ( dwBucketIndex = 0; dwBucketIndex < NUM_IF_BUCKETS; dwBucketIndex++ )
  398. {
  399. for( pIfObject = gblInterfaceTable.IfBucket[dwBucketIndex];
  400. pIfObject != (ROUTER_INTERFACE_OBJECT *)NULL;
  401. pIfObject = pIfObject->pNext )
  402. {
  403. if ( pIfObject->IfType == ROUTER_IF_TYPE_DEDICATED )
  404. {
  405. return( TRUE );
  406. }
  407. }
  408. }
  409. return( FALSE );
  410. }
  411. //**
  412. //
  413. // Call: IfObjectWANDeviceInstalled
  414. //
  415. // Returns: None
  416. //
  417. // Description: Called by DDM whenever a WAN device is installed or removed
  418. //
  419. VOID
  420. IfObjectWANDeviceInstalled(
  421. IN BOOL fWANDeviceInstalled
  422. )
  423. {
  424. DWORD dwXportIndex = GetTransportIndex( PID_IP );
  425. //
  426. // If a WAN device is installed and IP is installed then we
  427. // start advertizing on specific multicast address so as to make this
  428. // router discoverable
  429. //
  430. if ( ( fWANDeviceInstalled ) && ( dwXportIndex != (DWORD)-1 ) )
  431. {
  432. DWORD dwRetCode =
  433. gblRouterManagers[dwXportIndex].DdmRouterIf.SetRasAdvEnable(
  434. fWANDeviceInstalled );
  435. DIMTRACE2( "Calling SetRasAdvEnable( %d ) = %d",
  436. fWANDeviceInstalled, dwRetCode );
  437. }
  438. }
  439. //**
  440. //
  441. // Call: IfObjectNotifyOfMediaSenseChange
  442. //
  443. // Returns: None
  444. //
  445. // Description: Notifies the object of change in reachablity status due to
  446. // media sense.
  447. //
  448. //
  449. VOID
  450. IfObjectNotifyOfMediaSenseChange(
  451. VOID
  452. )
  453. {
  454. DWORD dwBucketIndex;
  455. ROUTER_INTERFACE_OBJECT * pIfObject;
  456. EnterCriticalSection( &(gblInterfaceTable.CriticalSection) );
  457. for ( dwBucketIndex = 0; dwBucketIndex < NUM_IF_BUCKETS; dwBucketIndex++ )
  458. {
  459. for( pIfObject = gblInterfaceTable.IfBucket[dwBucketIndex];
  460. pIfObject != (ROUTER_INTERFACE_OBJECT *)NULL;
  461. pIfObject = pIfObject->pNext )
  462. {
  463. if ( pIfObject->IfType == ROUTER_IF_TYPE_DEDICATED )
  464. {
  465. DWORD dwInactiveReason;
  466. if ( IfObjectIsLANDeviceActive( pIfObject->lpwsInterfaceName,
  467. &dwInactiveReason ) )
  468. {
  469. if ( pIfObject->State != RISTATE_CONNECTED )
  470. {
  471. pIfObject->State = RISTATE_CONNECTED;
  472. pIfObject->fFlags &= ~IFFLAG_NO_MEDIA_SENSE;
  473. IfObjectNotifyOfReachabilityChange(
  474. pIfObject,
  475. TRUE,
  476. INTERFACE_NO_MEDIA_SENSE );
  477. }
  478. }
  479. else if ( dwInactiveReason == INTERFACE_NO_MEDIA_SENSE )
  480. {
  481. if ( pIfObject->State != RISTATE_DISCONNECTED )
  482. {
  483. pIfObject->State = RISTATE_DISCONNECTED;
  484. pIfObject->fFlags |= IFFLAG_NO_MEDIA_SENSE;
  485. IfObjectNotifyOfReachabilityChange(
  486. pIfObject,
  487. FALSE,
  488. INTERFACE_NO_MEDIA_SENSE );
  489. }
  490. }
  491. }
  492. }
  493. }
  494. LeaveCriticalSection( &(gblInterfaceTable.CriticalSection) );
  495. }
  496. //**
  497. //
  498. // Call: IfObjectNotifyOfReachabilityChange
  499. //
  500. // Returns: None
  501. //
  502. // Description: Notifies the object of change in reachablity status due to
  503. // media sense.
  504. //
  505. //
  506. VOID
  507. IfObjectNotifyOfReachabilityChange(
  508. IN ROUTER_INTERFACE_OBJECT * pIfObject,
  509. IN BOOL fReachable,
  510. IN UNREACHABILITY_REASON dwReason
  511. )
  512. {
  513. DWORD dwIndex;
  514. WCHAR wchFriendlyName[MAX_INTERFACE_NAME_LEN+1];
  515. LPWSTR lpszFriendlyName = wchFriendlyName;
  516. for ( dwIndex = 0;
  517. dwIndex < gblDIMConfigInfo.dwNumRouterManagers;
  518. dwIndex++ )
  519. {
  520. if ( pIfObject->Transport[dwIndex].hInterface == INVALID_HANDLE_VALUE )
  521. {
  522. continue;
  523. }
  524. if ( fReachable )
  525. {
  526. DIMTRACE2( "Notifying Protocol = 0x%x, Interface=%ws is Reachable",
  527. gblRouterManagers[dwIndex].DdmRouterIf.dwProtocolId,
  528. pIfObject->lpwsInterfaceName );
  529. gblRouterManagers[dwIndex].DdmRouterIf.InterfaceReachable(
  530. pIfObject->Transport[dwIndex].hInterface );
  531. }
  532. else
  533. {
  534. DIMTRACE3(
  535. "Notifying Protocol = 0x%x,Interface=%ws is UnReachable=%d",
  536. gblRouterManagers[dwIndex].DdmRouterIf.dwProtocolId,
  537. pIfObject->lpwsInterfaceName,
  538. dwReason );
  539. gblRouterManagers[dwIndex].DdmRouterIf.InterfaceNotReachable(
  540. pIfObject->Transport[dwIndex].hInterface,
  541. dwReason );
  542. }
  543. }
  544. if ( MprConfigGetFriendlyName( gblDIMConfigInfo.hMprConfig,
  545. pIfObject->lpwsInterfaceName,
  546. wchFriendlyName,
  547. sizeof( wchFriendlyName ) ) != NO_ERROR )
  548. {
  549. wcscpy( wchFriendlyName, pIfObject->lpwsInterfaceName );
  550. }
  551. if ( fReachable )
  552. {
  553. DIMLogInformation(ROUTERLOG_IF_REACHABLE,1, &lpszFriendlyName );
  554. }
  555. else
  556. {
  557. DWORD dwEventLogId = 0;
  558. switch( dwReason )
  559. {
  560. case INTERFACE_OUT_OF_RESOURCES:
  561. dwEventLogId = ROUTERLOG_IF_UNREACHABLE_REASON1;
  562. break;
  563. case INTERFACE_CONNECTION_FAILURE:
  564. dwEventLogId = ROUTERLOG_IF_UNREACHABLE_REASON2;
  565. break;
  566. case INTERFACE_DISABLED:
  567. dwEventLogId = ROUTERLOG_IF_UNREACHABLE_REASON3;
  568. break;
  569. case INTERFACE_SERVICE_IS_PAUSED:
  570. dwEventLogId = ROUTERLOG_IF_UNREACHABLE_REASON4;
  571. break;
  572. case INTERFACE_DIALOUT_HOURS_RESTRICTION:
  573. dwEventLogId = ROUTERLOG_IF_UNREACHABLE_REASON5;
  574. break;
  575. case INTERFACE_NO_MEDIA_SENSE:
  576. dwEventLogId = ROUTERLOG_IF_UNREACHABLE_REASON6;
  577. break;
  578. case INTERFACE_NO_DEVICE:
  579. dwEventLogId = ROUTERLOG_IF_UNREACHABLE_REASON7;
  580. break;
  581. default:
  582. dwEventLogId = 0;
  583. break;
  584. }
  585. if ( dwEventLogId != 0 )
  586. {
  587. DIMLogInformation( dwEventLogId, 1, &lpszFriendlyName );
  588. }
  589. }
  590. }
  591. //**
  592. //
  593. // Call: IfObjectIsLANDeviceActive
  594. //
  595. // Returns: NO_ERROR - Success
  596. // Non-zero returns - Failure
  597. //
  598. // Description:
  599. //
  600. BOOL
  601. IfObjectIsLANDeviceActive(
  602. IN LPWSTR lpwsInterfaceName,
  603. OUT LPDWORD lpdwInactiveReason
  604. )
  605. {
  606. NETCON_STATUS NetConStatus;
  607. HRESULT hResult;
  608. BOOL fEnabled;
  609. GUID Guid;
  610. NTSTATUS NtStatus;
  611. UNICODE_STRING usTemp;
  612. //
  613. // First check media state
  614. //
  615. usTemp.Length = wcslen(lpwsInterfaceName) * sizeof(WCHAR);
  616. usTemp.MaximumLength = usTemp.Length + sizeof(WCHAR);
  617. usTemp.Buffer = lpwsInterfaceName;
  618. NtStatus = RtlGUIDFromString( &usTemp, &Guid );
  619. if ( NtStatus != STATUS_SUCCESS )
  620. {
  621. *lpdwInactiveReason = INTERFACE_NO_DEVICE;
  622. return( FALSE );
  623. }
  624. hResult = HrGetPnpDeviceStatus( &Guid, &NetConStatus );
  625. if ( HRESULT_CODE( hResult ) == NO_ERROR )
  626. {
  627. switch ( NetConStatus )
  628. {
  629. case NCS_MEDIA_DISCONNECTED:
  630. *lpdwInactiveReason = INTERFACE_NO_MEDIA_SENSE;
  631. return( FALSE );
  632. case NCS_CONNECTED:
  633. case NCS_INVALID_ADDRESS:
  634. case NCS_AUTHENTICATING:
  635. case NCS_CREDENTIALS_REQUIRED:
  636. case NCS_AUTHENTICATION_FAILED:
  637. case NCS_AUTHENTICATION_SUCCEEDED:
  638. {
  639. return( TRUE );
  640. }
  641. default:
  642. *lpdwInactiveReason = INTERFACE_NO_DEVICE;
  643. return( FALSE );
  644. }
  645. }
  646. else
  647. {
  648. *lpdwInactiveReason = INTERFACE_NO_DEVICE;
  649. return( FALSE );
  650. }
  651. return( TRUE );
  652. }
  653. //**
  654. //
  655. // Call: IfObjectDeleteInterface
  656. //
  657. // Returns: None
  658. //
  659. // Description: Delete this interface with all the router managers.
  660. //
  661. //
  662. VOID
  663. IfObjectDeleteInterfaceFromTransport(
  664. IN ROUTER_INTERFACE_OBJECT * pIfObject,
  665. IN DWORD dwPid
  666. )
  667. {
  668. DWORD dwIndex;
  669. DIM_ROUTER_INTERFACE * pDdmRouterIf;
  670. DWORD dwRetCode;
  671. for ( dwIndex = 0;
  672. dwIndex < gblDIMConfigInfo.dwNumRouterManagers;
  673. dwIndex++ )
  674. {
  675. if ( pIfObject->Transport[dwIndex].hInterface == INVALID_HANDLE_VALUE )
  676. {
  677. continue;
  678. }
  679. pDdmRouterIf=&(gblRouterManagers[dwIndex].DdmRouterIf);
  680. if ( pDdmRouterIf->dwProtocolId == dwPid )
  681. {
  682. dwRetCode = pDdmRouterIf->DeleteInterface(
  683. pIfObject->Transport[dwIndex].hInterface );
  684. if ( dwRetCode != NO_ERROR )
  685. {
  686. LPWSTR lpwsInsertStrings[2];
  687. lpwsInsertStrings[0] = pIfObject->lpwsInterfaceName;
  688. lpwsInsertStrings[1] = ( pDdmRouterIf->dwProtocolId == PID_IP )
  689. ? L"IP" : L"IPX";
  690. DIMLogErrorString( ROUTERLOG_COULDNT_REMOVE_INTERFACE, 2,
  691. lpwsInsertStrings, dwRetCode, 2 );
  692. }
  693. pIfObject->Transport[dwIndex].hInterface = INVALID_HANDLE_VALUE;
  694. }
  695. }
  696. }