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.

708 lines
20 KiB

  1. /*++
  2. Copyright (c) 1995 Microsoft Corporation
  3. Module Name:
  4. ntos\tdi\isn\fwd\tables.h
  5. Abstract:
  6. IPX Forwarder Driver Tables
  7. Author:
  8. Vadim Eydelman
  9. Revision History:
  10. --*/
  11. #ifndef _IPXFWD_TABLES_
  12. #define _IPXFWD_TABLES_
  13. // Ranges and defaults for registry configurable parameters
  14. #define MIN_ROUTE_SEGMENT_SIZE PAGE_SIZE
  15. #define MAX_ROUTE_SEGMENT_SIZE (PAGE_SIZE*8)
  16. #define DEF_ROUTE_SEGMENT_SIZE MIN_ROUTE_SEGMENT_SIZE
  17. #define MIN_INTERFACE_HASH_SIZE 31
  18. #define MAX_INTERFACE_HASH_SIZE 257
  19. #define DEF_INTERFACE_HASH_SIZE MAX_INTERFACE_HASH_SIZE
  20. #define MIN_CLIENT_HASH_SIZE 31
  21. #define MAX_CLIENT_HASH_SIZE 257
  22. #define DEF_CLIENT_HASH_SIZE MAX_CLIENT_HASH_SIZE
  23. #define MIN_NB_ROUTE_HASH_SIZE 31
  24. #define MAX_NB_ROUTE_HASH_SIZE 1023
  25. #define DEF_NB_ROUTE_HASH_SIZE 257
  26. #define MAX_SEND_PKTS_QUEUED 256 // No defined range
  27. #define NUM_INTERFACES_PER_SEGMENT 16 // Not configurable currently
  28. #define NUM_NB_ROUTES_PER_SEGMENT 16 // Not configurable currently
  29. // Special number reserved for routes that point to
  30. // client on global net
  31. #define GLOBAL_INTERFACE_REFERENCE ((PINTERFACE_CB)-1)
  32. // All types of WAN are emulated as ETHERNET by NDIS
  33. #define WAN_PACKET_SIZE 1500
  34. #define INVALID_NETWORK_NUMBER 0xFFFFFFFF
  35. #define INVALID_NIC_ID 0xFFFF
  36. // Interface control block
  37. struct _INTERFACE_CB;
  38. typedef struct _INTERFACE_CB * PINTERFACE_CB;
  39. struct _FWD_ROUTE;
  40. typedef struct _FWD_ROUTE * PFWD_ROUTE;
  41. struct _NB_ROUTE;
  42. typedef struct _NB_ROUTE *PNB_ROUTE;
  43. typedef struct _FWD_ROUTE {
  44. ULONG FR_Network; // Dest network
  45. USHORT FR_TickCount; // Route params
  46. USHORT FR_HopCount; //
  47. UCHAR FR_NextHopAddress[6]; // Next hop router
  48. PINTERFACE_CB FR_InterfaceReference; // Associated if CB
  49. // or NULL if global
  50. // network for clients
  51. LONG FR_ReferenceCount; // Number of external
  52. // references for this
  53. // block (must keep the
  54. // it till all of them
  55. // are released
  56. PFWD_ROUTE FR_Next; // Next route in the
  57. // table
  58. } FWD_ROUTE;
  59. typedef struct _INTERFACE_CB {
  60. ULONG ICB_Index; // Unique ID
  61. ULONG ICB_Network; // Network we boud to
  62. union {
  63. ULONGLONG ICB_ClientNode64[1];// For clients on
  64. // global net (faster
  65. // comparisons and
  66. // hashing using 64
  67. // bit support)
  68. UCHAR ICB_RemoteNode[6]; // Peer node for demand
  69. // dial connections
  70. };
  71. UCHAR ICB_LocalNode[6]; // Node we bound to
  72. USHORT ICB_Flags;
  73. #define FWD_IF_ENABLED 0x0001
  74. #define SET_IF_ENABLED(ifCB) ifCB->ICB_Flags |= FWD_IF_ENABLED;
  75. #define SET_IF_DISABLED(ifCB) ifCB->ICB_Flags &= ~FWD_IF_ENABLED;
  76. #define IS_IF_ENABLED(ifCB) (ifCB->ICB_Flags&FWD_IF_ENABLED)
  77. #define FWD_IF_CONNECTING 0x0002
  78. #define SET_IF_CONNECTING(ifCB) ifCB->ICB_Flags |= FWD_IF_CONNECTING;
  79. #define SET_IF_NOT_CONNECTING(ifCB) ifCB->ICB_Flags &= ~FWD_IF_CONNECTING;
  80. #define IS_IF_CONNECTING(ifCB) (ifCB->ICB_Flags&FWD_IF_CONNECTING)
  81. USHORT ICB_NicId; // Nic id we bound to
  82. UCHAR ICB_InterfaceType;
  83. UCHAR ICB_NetbiosDeliver;
  84. BOOLEAN ICB_NetbiosAccept;
  85. PNB_ROUTE ICB_NBRoutes; // Array of associated
  86. // NB routes
  87. ULONG ICB_NBRouteCount; // Number of nb routes
  88. LONGLONG ICB_DisconnectTime; // Time when if was disconnected
  89. FWD_IF_STATS ICB_Stats; // Accumulated
  90. PFWD_ROUTE ICB_CashedRoute; // MRU dest route
  91. PINTERFACE_CB ICB_CashedInterface;// MRU dest if
  92. NIC_HANDLE ICB_AdapterContext; // IPX stack supplied
  93. PVOID ICB_FilterInContext;
  94. PVOID ICB_FilterOutContext;
  95. LONG ICB_PendingQuota; // Remaining quota of
  96. // packets that can be
  97. // pending on
  98. // the interface
  99. LIST_ENTRY ICB_ExternalQueue; // Queue of external (received)
  100. // packets
  101. LIST_ENTRY ICB_InternalQueue; // Queue of internal (send)
  102. // requests
  103. #if DBG
  104. LIST_ENTRY ICB_InSendQueue; // packets being
  105. // sent by ipx
  106. #endif
  107. INT ICB_PacketListId; // ID of the packet list
  108. // (for the max frame size
  109. // on this interface)
  110. LIST_ENTRY ICB_IndexHashLink; // Link in interface idx hash
  111. LIST_ENTRY ICB_ConnectionLink; // Link in connection queue
  112. PNDIS_PACKET ICB_ConnectionPacket; // Packet that caused connection
  113. // request
  114. PUCHAR ICB_ConnectionData; // Pointer into packet to
  115. // place where actual data
  116. // (header) starts
  117. PINTERFACE_CB ICB_NodeHashLink; // Link in client node hash
  118. ULONG ICB_ReferenceCount; // Number of routes that
  119. // point to this CB
  120. KSPIN_LOCK ICB_Lock; // Protects state,
  121. // queues
  122. } INTERFACE_CB;
  123. #define InitICB(ifCB,IfIndex,IfType,NbAccept,NbDeliver) { \
  124. (ifCB)->ICB_Index = IfIndex; \
  125. (ifCB)->ICB_Network = INVALID_NETWORK_NUMBER; \
  126. (ifCB)->ICB_Flags = 0; \
  127. (ifCB)->ICB_NicId = INVALID_NIC_ID; \
  128. (ifCB)->ICB_InterfaceType = IfType; \
  129. (ifCB)->ICB_NetbiosAccept = NbAccept; \
  130. (ifCB)->ICB_NetbiosDeliver = NbDeliver; \
  131. memset (&(ifCB)->ICB_Stats, 0, sizeof (FWD_IF_STATS));\
  132. KeInitializeSpinLock (&(ifCB)->ICB_Lock); \
  133. (ifCB)->ICB_CashedInterface = NULL; \
  134. (ifCB)->ICB_CashedRoute = NULL; \
  135. (ifCB)->ICB_ReferenceCount = 0; \
  136. (ifCB)->ICB_FilterInContext = NULL; \
  137. (ifCB)->ICB_FilterOutContext = NULL; \
  138. (ifCB)->ICB_ClientNode64[0] = 0; \
  139. (ifCB)->ICB_NBRoutes = NULL; \
  140. (ifCB)->ICB_PacketListId = -1; \
  141. InitializeListHead (&(ifCB)->ICB_InternalQueue); \
  142. InitializeListHead (&(ifCB)->ICB_ExternalQueue); \
  143. (ifCB)->ICB_PendingQuota = MaxSendPktsQueued; \
  144. switch ((ifCB)->ICB_InterfaceType) { \
  145. case FWD_IF_PERMANENT: \
  146. (ifCB)->ICB_Stats.OperationalState = FWD_OPER_STATE_DOWN;\
  147. break; \
  148. case FWD_IF_DEMAND_DIAL: \
  149. case FWD_IF_LOCAL_WORKSTATION: \
  150. case FWD_IF_REMOTE_WORKSTATION: \
  151. (ifCB)->ICB_Stats.OperationalState = FWD_OPER_STATE_SLEEPING;\
  152. KeQuerySystemTime ((PLARGE_INTEGER)&(ifCB)->ICB_DisconnectTime);\
  153. (ifCB)->ICB_DisconnectTime -= (LONGLONG)SpoofingTimeout*10000000;\
  154. break; \
  155. } \
  156. }
  157. // Routes for netbios names (staticly seeded to reduce
  158. // internet broadcast traffic)
  159. typedef struct _NB_ROUTE {
  160. union {
  161. ULONGLONG NBR_Name128[2];
  162. UCHAR NBR_Name[16]; // Netbios name of destination
  163. };
  164. PINTERFACE_CB NBR_Destination; // Interface to send to
  165. PNB_ROUTE NBR_Next; // Next route in the name list
  166. } NB_ROUTE;
  167. // List used to allocate packets destined to WAN interfaces
  168. extern INT WanPacketListId;
  169. // Max number of outstanding sends
  170. extern ULONG MaxSendPktsQueued;
  171. // Segment sizes
  172. extern ULONG RouteSegmentSize;
  173. extern ULONG InterfaceSegmentSize;
  174. extern ULONG NBNameSegementSize;
  175. // Sizes of hash tables
  176. extern ULONG RouteHashSize;
  177. extern ULONG InterfaceHashSize;
  178. extern ULONG ClientHashSize;
  179. extern ULONG NBRouteHashSize;
  180. // Number of global client network
  181. extern ULONG GlobalNetwork;
  182. // Interface reserved for internal network
  183. extern PINTERFACE_CB InternalInterface;
  184. /*++
  185. *******************************************************************
  186. C r e a t e T a b l e s
  187. Routine Description:
  188. Allocates and intializes all hash tables and related structures
  189. Arguments:
  190. None
  191. Return Value:
  192. STATUS_SUCCESS - tables were created ok
  193. STATUS_INSUFFICIENT_RESOURCES - resource allocation failed
  194. *******************************************************************
  195. --*/
  196. NTSTATUS
  197. CreateTables (
  198. void
  199. );
  200. /*++
  201. *******************************************************************
  202. D e l e t e T a b l e s
  203. Routine Description:
  204. Releases resources allocated for all hash tables
  205. Arguments:
  206. None
  207. Return Value:
  208. STATUS_SUCCESS - tables were freed ok
  209. *******************************************************************
  210. --*/
  211. NTSTATUS
  212. DeleteTables (
  213. void
  214. );
  215. /*++
  216. *******************************************************************
  217. F r e e I n t e r f a c e
  218. Routine Description:
  219. Releases memory allocated for interface to interface memory
  220. zone.
  221. Arguments:
  222. fwRoute - route block to release
  223. Return Value:
  224. None
  225. *******************************************************************
  226. --*/
  227. VOID
  228. FreeInterface (
  229. PINTERFACE_CB ifCB
  230. );
  231. /*++
  232. *******************************************************************
  233. F r e e R o u t e
  234. Routine Description:
  235. Releases memory allocated for route to route memory
  236. zone.
  237. Arguments:
  238. fwRoute - route block to release
  239. Return Value:
  240. None
  241. *******************************************************************
  242. --*/
  243. VOID
  244. FreeRoute (
  245. PFWD_ROUTE fwRoute
  246. );
  247. /*++
  248. *******************************************************************
  249. A c q u i r e I n t e r f a c e R e f e r e n c e
  250. Routine Description:
  251. Increments refernce count of interface control block
  252. ICB can't be freed until all references to it are released.
  253. The caller of this routine should have already had a reference
  254. to the interface or must hold an InterfaceLock
  255. Arguments:
  256. ifCB - interface control block to reference
  257. Return Value:
  258. None
  259. *******************************************************************
  260. --*/
  261. //VOID
  262. //AcquireInterfaceReference (
  263. // PINTERFACE_CB ifCB
  264. // );
  265. #if DBG
  266. #define AcquireInterfaceReference(ifCB) \
  267. do { \
  268. ASSERTMSG ("Referenced ifCB is dead ", \
  269. InterlockedIncrement(&ifCB->ICB_ReferenceCount)>0); \
  270. } while (0)
  271. #else
  272. #define AcquireInterfaceReference(ifCB) \
  273. InterlockedIncrement(&ifCB->ICB_ReferenceCount)
  274. #endif
  275. /*++
  276. *******************************************************************
  277. R e l e a s e I n t e r f a c e R e f e r e n c e
  278. Routine Description:
  279. Decrements refernce count of interface control block
  280. Arguments:
  281. ifCB - interface control block to release
  282. Return Value:
  283. None
  284. *******************************************************************
  285. --*/
  286. //PINTERFACE_CB
  287. //ReleaseInterfaceReference (
  288. // PINTERFACE_CB ifCB
  289. // );
  290. // if it drops below 0, it has alredy been removed from the table
  291. #define ReleaseInterfaceReference(ifCB) ( \
  292. (InterlockedDecrement (&ifCB->ICB_ReferenceCount)>=0) \
  293. ? ifCB \
  294. : (FreeInterface (ifCB), (ifCB = NULL)) \
  295. )
  296. /*++
  297. *******************************************************************
  298. I n t e r f a c e C o n t e x t T o R e f e r e n c e
  299. Routine Description:
  300. Verifies that context supplied by the IPX stack is a valid
  301. interface block and is still bound to the adapter with which
  302. it is associated in the IPX stack
  303. Arguments:
  304. ifCB - interface control block to reference
  305. NicId - id of the adapter to which interface is bound
  306. Return Value:
  307. None
  308. *******************************************************************
  309. --*/
  310. //PINTERFACE_CB
  311. //InterfaceContextToReference (
  312. // PVOID Context
  313. // );
  314. #define InterfaceContextToReference(Context,NicId) ( \
  315. (InterlockedIncrement(&((PINTERFACE_CB)Context)->ICB_ReferenceCount)>0) \
  316. ? ((NicId==((PINTERFACE_CB)Context)->ICB_NicId) \
  317. ? (PINTERFACE_CB)Context \
  318. : (ReleaseInterfaceReference(((PINTERFACE_CB)Context)), NULL)) \
  319. : NULL \
  320. )
  321. /*++
  322. *******************************************************************
  323. G e t I n t e r f a c e R e f e r e n c e
  324. Routine Description:
  325. Returns reference interface based on its index
  326. Arguments:
  327. InterfaceIndex - unique id of the interface
  328. Return Value:
  329. Pointer to interface control block if there is one in the table
  330. NULL otherwise
  331. *******************************************************************
  332. --*/
  333. PINTERFACE_CB
  334. GetInterfaceReference (
  335. ULONG InterfaceIndex
  336. );
  337. /*++
  338. *******************************************************************
  339. G e t N e x t I n t e r f a c e R e f e r e n c e
  340. Routine Description:
  341. Returns reference to the next interface in the table
  342. Reference to the provided interface is released
  343. Arguments:
  344. ifCB - interface to start with or NULL to start from the
  345. beginning of the interface table
  346. Return Value:
  347. Pointer to interface control block if thare are any more interfaces
  348. in the table
  349. NULL otherwise
  350. *******************************************************************
  351. --*/
  352. PINTERFACE_CB
  353. GetNextInterfaceReference (
  354. PINTERFACE_CB ifCB
  355. );
  356. /*++
  357. *******************************************************************
  358. A d d I n t e r f a c e
  359. Routine Description:
  360. Adds interface control block to the table.
  361. Arguments:
  362. InterfaceIndex - unique if of the interface
  363. Info - interface paramters
  364. Return Value:
  365. STATUS_SUCCESS - interface added ok
  366. STATUS_UNSUCCESSFULL - interface is already in the table
  367. STATUS_INSUFFICIENT_RESOURCES - can't allocate memory for
  368. interface CB
  369. *******************************************************************
  370. --*/
  371. NTSTATUS
  372. AddInterface (
  373. ULONG InterfaceIndex,
  374. UCHAR InterfaceType,
  375. BOOLEAN NetbiosAccept,
  376. UCHAR NetbiosDeliver
  377. );
  378. /*++
  379. *******************************************************************
  380. A d d G l o b a l N e t C l i e n t
  381. Routine Description:
  382. Adds interface control block to the table of
  383. clients on the global network (should be done when
  384. client connects)
  385. Arguments:
  386. ifCB - interface control block to add to the table
  387. Return Value:
  388. STATUS_SUCCESS - interface was added ok
  389. STATUS_UNSUCCESSFULL - another interface with the same
  390. node address is already in the table
  391. *******************************************************************
  392. --*/
  393. NTSTATUS
  394. AddGlobalNetClient (
  395. PINTERFACE_CB ifCB
  396. );
  397. /*++
  398. *******************************************************************
  399. D e l e t e G l o b a l N e t C l i e n t
  400. Routine Description:
  401. Removes interface control block from the table of
  402. clients on the global network (should be done when
  403. client disconnects)
  404. Arguments:
  405. ifCB - interface control block to remove from the table
  406. Return Value:
  407. STATUS_SUCCESS - interface was removed ok
  408. *******************************************************************
  409. --*/
  410. NTSTATUS
  411. DeleteGlobalNetClient (
  412. PINTERFACE_CB ifCB
  413. );
  414. /*++
  415. *******************************************************************
  416. D e l e t e I n t e r f a c e
  417. Routine Description:
  418. Deletes interface control block (the block is not actually
  419. disposed of until all references to it are released).
  420. Arguments:
  421. InterfaceIndex - unique if of the interface
  422. Return Value:
  423. STATUS_SUCCESS - interface info retreived ok
  424. STATUS_UNSUCCESSFULL - interface is not in the table
  425. *******************************************************************
  426. --*/
  427. NTSTATUS
  428. DeleteInterface (
  429. ULONG InterfaceIndex
  430. );
  431. /*++
  432. *******************************************************************
  433. A d d R o u t e
  434. Routine Description:
  435. Adds route to the hash table and finds and stores the reference
  436. to the associated interface control block in the route.
  437. Arguments:
  438. Network - route's destination network
  439. NextHopAddress - mac address of next hop router if network is not
  440. directly connected
  441. TickCount - ticks to reach the destination net
  442. HopCount - hopss to reach the destination net
  443. InterfaceIndex - index of the associated interface (through which
  444. packets destined to the network are to be sent)
  445. Return Value:
  446. STATUS_SUCCESS - route was added ok
  447. STATUS_UNSUCCESSFUL - route is already in the table
  448. STATUS_INSUFFICIENT_RESOURCES - can't allocate memory for
  449. route block
  450. *******************************************************************
  451. --*/
  452. NTSTATUS
  453. AddRoute (
  454. ULONG Network,
  455. UCHAR *NextHopAddress,
  456. USHORT TickCount,
  457. USHORT HopCount,
  458. ULONG InterfaceIndex
  459. );
  460. /*++
  461. *******************************************************************
  462. D e l e t e R o u t e
  463. Routine Description:
  464. Deletes route from the hash table and releases the reference
  465. to the interface control block associated with the route.
  466. Arguments:
  467. Network - route's destination network
  468. Return Value:
  469. STATUS_SUCCESS - route was deleted ok
  470. STATUS_UNSUCCESSFUL - route is not in the table
  471. *******************************************************************
  472. --*/
  473. NTSTATUS
  474. DeleteRoute (
  475. ULONG Network
  476. );
  477. /*++
  478. *******************************************************************
  479. U p d a t e R o u t e
  480. Routine Description:
  481. Updates route in the hash table
  482. Arguments:
  483. Network - route's destination network
  484. NextHopAddress - mac address of next hop router if network is not
  485. directly connected
  486. TickCount - ticks to reach the destination net
  487. HopCount - hopss to reach the destination net
  488. InterfaceIndex - index of the associated interface (through which
  489. packets destined to the network are to be sent)
  490. Return Value:
  491. STATUS_SUCCESS - interface info retreived ok
  492. STATUS_UNSUCCESSFUL - interface is not in the table
  493. *******************************************************************
  494. --*/
  495. NTSTATUS
  496. UpdateRoute (
  497. ULONG Network,
  498. UCHAR *NextHopAddress,
  499. USHORT TickCount,
  500. USHORT HopCount,
  501. ULONG InterfaceIndex
  502. );
  503. /*++
  504. *******************************************************************
  505. F i n d D e s t i n a t i o n
  506. Routine Description:
  507. Finds destination interface for IPX address and
  508. returns reference to its control block.
  509. Arguments:
  510. Network - destination network
  511. Node - destination node (needed in case of global client)
  512. Route - buffer to place route reference
  513. Return Value:
  514. Reference to destination interface CB
  515. NULL if route it not found
  516. *******************************************************************
  517. --*/
  518. PINTERFACE_CB
  519. FindDestination (
  520. IN ULONG Network,
  521. IN PUCHAR Node,
  522. OUT PFWD_ROUTE *Route
  523. );
  524. /*++
  525. *******************************************************************
  526. A c q u i r e R o u t e R e f e r e n c e
  527. Routine Description:
  528. Increments refernce count of the route block
  529. Route block can't be freed until all references to it are released.
  530. The caller of this routine should have already had a reference
  531. to the route or must hold an TableWriteLock
  532. Arguments:
  533. fwRoute - route block to reference
  534. Return Value:
  535. None
  536. *******************************************************************
  537. --*/
  538. //VOID
  539. //AcquireRouteReference (
  540. // PFW+ROUTE fwRoute
  541. // );
  542. #define AcquireRouteReference(fwRoute) \
  543. InterlockedIncrement(&fwRoute->FR_ReferenceCount)
  544. /*++
  545. *******************************************************************
  546. R e l e a s e R o u t e R e f e r e n c e
  547. Routine Description:
  548. Decrements refernce count of route block
  549. Arguments:
  550. fwRoute - route block to release
  551. Return Value:
  552. None
  553. *******************************************************************
  554. --*/
  555. //VOID
  556. //ReleaseRouteReference (
  557. // PFW_ROUTE fwRoute
  558. // );
  559. // if it drops below 0, it has alredy been removed from the table
  560. #define ReleaseRouteReference(fwRoute) { \
  561. if (InterlockedDecrement (&fwRoute->FR_ReferenceCount)<0) { \
  562. FreeRoute (fwRoute); \
  563. fwRoute = NULL; \
  564. } \
  565. }
  566. /*++
  567. *******************************************************************
  568. A d d N B R o u t e s
  569. Routine Description:
  570. Adds netbios names associated with interface to netbios
  571. route hash table
  572. Arguments:
  573. ifCB - interface with which names are associated
  574. Names - array of names
  575. Count - number of names in the array
  576. routeArray - buffer to place pointer to allocated array of routes
  577. Return Value:
  578. STATUS_SUCCESS - names were added ok
  579. STATUS_UNSUCCESSFUL - one of the names is already in the table
  580. STATUS_INSUFFICIENT_RESOURCES - can't allocate memory for
  581. route array
  582. *******************************************************************
  583. --*/
  584. NTSTATUS
  585. AddNBRoutes (
  586. PINTERFACE_CB ifCB,
  587. FWD_NB_NAME Names[],
  588. ULONG Count,
  589. PNB_ROUTE *routeArray
  590. );
  591. /*++
  592. *******************************************************************
  593. D e l e t e N B R o u t e s
  594. Routine Description:
  595. Deletes nb routes in the array from the route table and frees
  596. the array
  597. Arguments:
  598. nbRoutes - array of routes
  599. Count - number of routes in the array
  600. Return Value:
  601. STATUS_SUCCESS - route was deleted ok
  602. STATUS_UNSUCCESSFUL - route is not in the table
  603. *******************************************************************
  604. --*/
  605. NTSTATUS
  606. DeleteNBRoutes (
  607. PNB_ROUTE nbRoutes,
  608. ULONG Count
  609. );
  610. /*++
  611. *******************************************************************
  612. F i n d N B D e s t i n a t i o n
  613. Routine Description:
  614. Finds destination interface for nb name and
  615. returns reference to its control block.
  616. Arguments:
  617. Name - name to look for
  618. Return Value:
  619. Reference to destination interface CB
  620. NULL if route it not found
  621. *******************************************************************
  622. --*/
  623. PINTERFACE_CB
  624. FindNBDestination (
  625. IN PUCHAR Name
  626. );
  627. #endif