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.

569 lines
21 KiB

  1. //****************************************************************************
  2. //
  3. // Microsoft Windows NT RIP
  4. //
  5. // Copyright 1995-96
  6. //
  7. //
  8. // Revision History
  9. //
  10. //
  11. // 2/26/95 Gurdeep Singh Pall Picked up from JBallard's team
  12. //
  13. //
  14. // Description: Globals, headers, defines.
  15. //
  16. //****************************************************************************
  17. #define CLASSA_ADDR(a) (( (*((uchar *)&(a))) & 0x80) == 0)
  18. #define CLASSB_ADDR(a) (( (*((uchar *)&(a))) & 0xc0) == 0x80)
  19. #define CLASSC_ADDR(a) (( (*((uchar *)&(a))) & 0xe0) == 0xc0)
  20. #define CLASSD_ADDR(a) (( (*((uchar *)&(a))) & 0xf0) == 0xe0)
  21. #define CLASSE_ADDR(a) ((( (*((uchar *)&(a))) & 0xf0) == 0xf0) && \
  22. ((a) != 0xffffffff))
  23. #define CLASSA_MASK 0x000000ff
  24. #define CLASSB_MASK 0x0000ffff
  25. #define CLASSC_MASK 0x00ffffff
  26. #define CLASSD_MASK 0x000000e0
  27. #define CLASSE_MASK 0xffffffff
  28. #define IP_LOOPBACK_ADDR(x) (((x) & 0xff) == 0x7f)
  29. #define IS_BROADCAST_ADDR(a) \
  30. ((a) == INADDR_BROADCAST || \
  31. (CLASSA_ADDR(a) && (((a) & ~CLASSA_MASK) == ~CLASSA_MASK)) || \
  32. (CLASSB_ADDR(a) && (((a) & ~CLASSB_MASK) == ~CLASSB_MASK)) || \
  33. (CLASSC_ADDR(a) && (((a) & ~CLASSC_MASK) == ~CLASSC_MASK)))
  34. #define HOSTADDR_MASK 0xffffffff
  35. #define NETCLASS_MASK(a) \
  36. (CLASSA_ADDR(a) ? CLASSA_MASK : \
  37. (CLASSB_ADDR(a) ? CLASSB_MASK : \
  38. (CLASSC_ADDR(a) ? CLASSC_MASK : \
  39. (CLASSD_ADDR(a) ? CLASSD_MASK : CLASSE_MASK))))
  40. #define HASH_TABLE_SIZE 101
  41. #define NEW_ENTRY 0x0001
  42. #define TIMEOUT_TIMER 0x0002
  43. #define GARBAGE_TIMER 0x0004
  44. #define ROUTE_CHANGE 0x0008
  45. #define ROUTE_UPDATE 0x0010
  46. #define ROUTE_ZOMBIE 0x0020
  47. #define ROUTE_HOST 0x0040
  48. #define ADDRFLAG_DISABLED 0x01
  49. #define RIP_MESSAGE_SIZE 512
  50. #define RIP_SERVICE "IPRIP"
  51. //
  52. // definitions for IPRIP packet fields
  53. //
  54. #define RIP_REQUEST 1
  55. #define RIP_RESPONSE 2
  56. #define RIP_PORT 520
  57. #define METRIC_INFINITE 16
  58. #define RIP_MULTIADDR ((DWORD)0x090000E0)
  59. //
  60. // authentication definitions
  61. //
  62. #define RIP_MAX_AUTHKEY_SIZE 16
  63. #define RIP_AUTHTYPE_NONE 1
  64. #define RIP_AUTHTYPE_SIMPLE_PASSWORD 2
  65. #define RIP_AUTHTYPE_MD5 3
  66. #define ADDRFAMILY_AUTHENT 0xFFFF
  67. #define MAX_ADDRESS_COUNT 128
  68. #define DHCP_ADDR_CHANGE_EVENT "DHCPNEWIPADDRESS"
  69. #define RIP_STATS_TABLE_NAME "IPRIP Statistics"
  70. #define RIP_DUMP_ROUTES_NAME "IPRIP Dump Routes"
  71. #define RIP_DUMP_REPLY "Dump Routes Reply"
  72. #define RIP_DUMP_REQUEST "Dump Routes Request"
  73. //-----------------------------------------------------------------------
  74. // type definitions
  75. //-----------------------------------------------------------------------
  76. // the following struct is used to store information about routes
  77. // see the comment for the RIP_GLOBALS for more information about
  78. // accessing these. All addresses and masks are in network order.
  79. typedef struct _HASH_TABLE_ENTRY {
  80. struct _HASH_TABLE_ENTRY *next;
  81. struct _HASH_TABLE_ENTRY *prev;
  82. DWORD dwIndex;
  83. DWORD dwDestaddr;
  84. DWORD dwNetmask;
  85. DWORD dwNexthop;
  86. DWORD dwMetric; // the metric is in host order
  87. DWORD dwFlag;
  88. LONG lTimeout;
  89. DWORD dwProtocol;
  90. } HASH_TABLE_ENTRY, *LPHASH_TABLE_ENTRY;
  91. // the following two types are templates used on network packets.
  92. // therefore, we require bytes to be packed.
  93. // rgatta : changing reserved fields to unions for RIPv2 compatibility
  94. #pragma pack(1)
  95. typedef struct {
  96. BYTE chCommand;
  97. BYTE chVersion;
  98. WORD wReserved;
  99. } RIP_HEADER, *LPRIP_HEADER;
  100. typedef struct {
  101. WORD wAddrFamily;
  102. union {
  103. WORD wReserved;
  104. WORD wRoutetag;
  105. };
  106. DWORD dwAddress;
  107. union {
  108. DWORD dwReserved1;
  109. DWORD dwSubnetmask;
  110. };
  111. union {
  112. DWORD dwReserved2;
  113. DWORD dwNexthop;
  114. };
  115. DWORD dwMetric;
  116. } RIP_ENTRY, *LPRIP_ENTRY;
  117. typedef struct {
  118. WORD wAddrFamily;
  119. WORD wAuthType;
  120. BYTE AuthKey[RIP_MAX_AUTHKEY_SIZE];
  121. } RIP_AUTHENT_ENTRY, *LPRIP_AUTHENT_ENTRY;
  122. #pragma pack()
  123. // this struct is used to save operational parameters
  124. // read from the registry. There is a single instance
  125. // for the process, so for read/write access to the fields,
  126. // first acquire the parameters lock by calling RIP_LOCK_PARAMS(),
  127. // and release it by calling RIP_UNLOCK_PARAMS()
  128. typedef struct {
  129. DWORD dwSilentRIP;
  130. DWORD dwAcceptHost;
  131. DWORD dwAnnounceHost;
  132. DWORD dwLoggingLevel;
  133. DWORD dwAcceptDefault;
  134. DWORD dwAnnounceDefault;
  135. DWORD dwSplitHorizon;
  136. DWORD dwPoisonReverse;
  137. DWORD dwRouteTimeout;
  138. DWORD dwGarbageTimeout;
  139. DWORD dwUpdateFrequency;
  140. DWORD dwTriggeredUpdates;
  141. DWORD dwMaxTriggerFrequency;
  142. DWORD dwOverwriteStaticRoutes;
  143. DWORD dwMaxTimedOpsInterval;
  144. } RIP_PARAMETERS, *LPRIP_PARAMETERS;
  145. #ifdef ROUTE_FILTERS
  146. typedef struct {
  147. DWORD dwCount;
  148. DWORD pdwFilter[1];
  149. } RIP_FILTERS, *PRIP_FILTERS;
  150. #endif
  151. // this struct is used to save statistics for each RIP interface
  152. // All writes to these fields are done using InterlockedIncrement,
  153. // by whichever thread is holding the address table lock.
  154. // Interlocking is called for because these variables are in
  155. // file-mapped memory, and may be read by other processes.
  156. // Thus, it is important that all the fields here are DWORDs
  157. typedef struct {
  158. DWORD dwAddress;
  159. DWORD dwSendFailures;
  160. DWORD dwReceiveFailures;
  161. DWORD dwRequestsSent;
  162. DWORD dwResponsesSent;
  163. DWORD dwRequestsReceived;
  164. DWORD dwResponsesReceived;
  165. DWORD dwBadPacketsReceived;
  166. DWORD dwBadRouteResponseEntries;
  167. DWORD dwTriggeredUpdatesSent;
  168. } RIP_ADDRESS_STATISTICS, *LPRIP_ADDRESS_STATISTICS;
  169. typedef struct {
  170. DWORD dwAddrCount;
  171. DWORD dwRouteCount;
  172. DWORD dwSystemAddRouteFailures;
  173. DWORD dwSystemDeleteRouteFailures;
  174. DWORD dwRoutesAddedToSystemTable;
  175. DWORD dwRoutesDeletedFromSystemTable;
  176. RIP_ADDRESS_STATISTICS lpAddrStats[MAX_ADDRESS_COUNT];
  177. } RIP_STATISTICS, *LPRIP_STATISTICS;
  178. // The following struct contains information stored for each IP address
  179. // in use by RIP. For information on the field lpstats, see above
  180. typedef struct {
  181. SOCKET sock;
  182. DWORD dwFlag;
  183. DWORD dwIndex;
  184. DWORD dwAddress;
  185. DWORD dwNetmask;
  186. LPRIP_ADDRESS_STATISTICS lpstats;
  187. } RIP_ADDRESS, *LPRIP_ADDRESS;
  188. // The following struct contains several variables
  189. // used in more than one thread. All changes to the first three
  190. // are made using the InterlockedExchange function, so they can
  191. // be safely read directly.
  192. // For read/write access to dwAddrCount and lpAddrTable, first acquire the
  193. // address table lock by calling RIP_LOCK_ADDRTABLE(), and then release it
  194. // by calling RIP_UNLOCK_ADDRTABLE()
  195. // For read/write access to lpRouteTable, first acquire the route table lock
  196. // by calling RIP_LOCK_ROUTETABLE(), and release it by calling
  197. // RIP_UNLOCK_ROUTETABLE().
  198. // For nested locking, the following rules apply:
  199. // 1. When getting both the address table lock and the parameters lock
  200. // always call RIP_LOCK_ADDRTABLE() before RIP_LOCK_PARAMS()
  201. // 2. When getting both the address table lock and the route table lock
  202. // always call RIP_LOCK_ADDRTABLE() before RIP_LOCK_ROUTETABLE()
  203. // 3. When getting both the route table lock and the parameters lock,
  204. // always call RIP_LOCK_ROUTETABLE() before RIP_LOCK_PARAMS()
  205. // 4. Never hold more than two of the above locks simultaneously
  206. typedef struct {
  207. DWORD dwRouteChanged;
  208. DWORD dwLastTriggeredUpdate;
  209. DWORD dwMillisecsTillFullUpdate;
  210. HANDLE hTCPDriver;
  211. DWORD dwAddrCount;
  212. RIP_ADDRESS lpAddrTable[MAX_ADDRESS_COUNT];
  213. LPRIP_STATISTICS lpStatsTable;
  214. HASH_TABLE_ENTRY *lpRouteTable[HASH_TABLE_SIZE];
  215. } RIP_GLOBALS, *LPRIP_GLOBALS;
  216. //-----------------------------------------------------------------------
  217. // string for product type/version verfication
  218. //-----------------------------------------------------------------------
  219. #define REGKEY_PRODUCT_OPTION TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions")
  220. #define REGVAL_PRODUCT_TYPE TEXT("ProductType")
  221. #define WINNT_WORKSTATION TEXT("WinNt")
  222. //-----------------------------------------------------------------------
  223. // strings used for registry access
  224. //-----------------------------------------------------------------------
  225. #define REGKEY_RIP_LINKAGE "System\\CurrentControlSet\\Services" \
  226. "\\IpRip\\Linkage"
  227. #define REGKEY_RIP_DISABLED "System\\CurrentControlSet\\Services" \
  228. "\\IpRip\\Linkage\\Disabled"
  229. #define REGVAL_BIND "Bind"
  230. #define REGVAL_ENABLEDHCP "EnableDHCP"
  231. #define REGVAL_DHCPIPADDRESS "DhcpIPAddress"
  232. #define REGVAL_IPADDRESS "IPAddress"
  233. #define REGVAL_DHCPNETMASK "DhcpSubnetMask"
  234. #define REGVAL_NETMASK "SubnetMask"
  235. #define REGKEY_SERVICES "System\\CurrentControlSet\\Services"
  236. #define REGKEY_PARAMETERS "\\Parameters"
  237. #define REGKEY_TCPIP "\\TCPIP"
  238. #define REGKEY_TCPIP_PARAMS "SYSTEM\\CurrentControlSet\\Services" \
  239. "\\TCPIP\\Parameters"
  240. #define REGKEY_RIP_PARAMS "SYSTEM\\CurrentControlSet\\Services" \
  241. "\\IpRip\\Parameters"
  242. #define REGVAL_ACCEPT_HOST "AcceptHostRoutes"
  243. #define REGVAL_ANNOUNCE_HOST "AnnounceHostRoutes"
  244. #define REGVAL_ACCEPT_DEFAULT "AcceptDefaultRoutes"
  245. #define REGVAL_ANNOUNCE_DEFAULT "AnnounceDefaultRoutes"
  246. #define REGVAL_SPLITHORIZON "EnableSplitHorizon"
  247. #define REGVAL_POISONREVERSE "EnablePoisonedReverse"
  248. #define REGVAL_LOGGINGLEVEL "LoggingLevel"
  249. #define REGVAL_ROUTETIMEOUT "RouteTimeout"
  250. #define REGVAL_GARBAGETIMEOUT "GarbageTimeout"
  251. #define REGVAL_UPDATEFREQUENCY "UpdateFrequency"
  252. #define REGVAL_TRIGGEREDUPDATES "EnableTriggeredUpdates"
  253. #define REGVAL_TRIGGERFREQUENCY "MaxTriggeredUpdateFrequency"
  254. #define REGVAL_OVERWRITESTATIC "OverwriteStaticRoutes"
  255. #define REGVAL_MAXTIMEDOPSINTERVAL "MaxTimedOpsInterval"
  256. #define REGVAL_IP_ENABLEROUTER "IPEnableRouter"
  257. #define REGVAL_SILENTRIP "SilentRIP"
  258. #ifdef ROUTE_FILTERS
  259. #define REGVAL_ANNOUCE_FILTERS "AnnounceRouteFilters"
  260. #define REGVAL_ACCEPT_FILTERS "AcceptRouteFilters"
  261. #endif
  262. #define LOGLEVEL_NONE 0
  263. #define LOGLEVEL_ERROR 1
  264. #define LOGLEVEL_WARNING 2
  265. #define LOGLEVEL_INFORMATION 3
  266. // all values pertaining to time are in milliseconds,
  267. // but are read as seconds from the registry
  268. #define DEF_SILENTRIP 0
  269. #define DEF_ACCEPT_HOST 0
  270. #define DEF_ANNOUNCE_HOST 0
  271. #define DEF_ACCEPT_DEFAULT 0
  272. #define DEF_ANNOUNCE_DEFAULT 0
  273. #define DEF_SPLITHORIZON 1
  274. #define DEF_POISONREVERSE 1
  275. #define DEF_GETROUTEFREQUENCY (60 * 1000)
  276. #define DEF_LOGGINGLEVEL LOGLEVEL_ERROR
  277. #define DEF_ROUTETIMEOUT (180 * 1000)
  278. #define DEF_LOCALROUTETIMEOUT (90 * 1000)
  279. #define DEF_GARBAGETIMEOUT (120 * 1000)
  280. #define DEF_UPDATEFREQUENCY (30 * 1000)
  281. #define DEF_TRIGGEREDUPDATES 1
  282. #define DEF_TRIGGERFREQUENCY (5 * 1000)
  283. #define DEF_OVERWRITESTATIC 0
  284. #define DEF_MAXTIMEDOPSINTERVAL (10 * 1000)
  285. #define MIN_LOGGINGLEVEL LOGLEVEL_NONE
  286. #define MIN_ROUTETIMEOUT (15 * 1000)
  287. #define MIN_GARBAGETIMEOUT (15 * 1000)
  288. #define MIN_UPDATEFREQUENCY (15 * 1000)
  289. #define MIN_TRIGGERFREQUENCY (1 * 1000)
  290. #define MAX_LOGGINGLEVEL LOGLEVEL_INFORMATION
  291. #define MAX_ROUTETIMEOUT ((60 * 60 * 24 * 3) * 1000)
  292. #define MAX_GARBAGETIMEOUT ((60 * 60 * 24 * 3) * 1000)
  293. #define MAX_UPDATEFREQUENCY ((60 * 60 * 24) * 1000)
  294. #define MAX_TRIGGERFREQUENCY ((60 * 60 * 24) * 1000)
  295. #define STOP_REASON_QUIT 0
  296. #define STOP_REASON_ADDRCHANGE 1
  297. //-----------------------------------------------------------------------
  298. // global data declarations
  299. //-----------------------------------------------------------------------
  300. extern RIP_PARAMETERS g_params;
  301. extern RIP_GLOBALS g_ripcfg;
  302. #ifdef ROUTE_FILTERS
  303. extern PRIP_FILTERS g_prfAnnounceFilters;
  304. extern PRIP_FILTERS g_prfAcceptFilters;
  305. extern CRITICAL_SECTION g_csAccFilters;
  306. extern CRITICAL_SECTION g_csAnnFilters;
  307. #endif
  308. extern CRITICAL_SECTION g_csRoutes;
  309. extern CRITICAL_SECTION g_csParameters;
  310. extern CRITICAL_SECTION g_csAddrtables;
  311. extern DWORD g_dwTraceID;
  312. extern HANDLE g_stopEvent;
  313. extern HANDLE g_addressChangeEvent;
  314. extern HANDLE g_netEvent;
  315. extern HANDLE g_triggerEvent;
  316. extern HANDLE g_hUpdateThread;
  317. #ifndef CHICAGO
  318. extern HMODULE g_hmodule;
  319. #endif
  320. //-----------------------------------------------------------------------
  321. // macro functions
  322. //-----------------------------------------------------------------------
  323. #define HASH_VALUE(ad) (((ad & 0xff) + \
  324. ((ad >> 8) & 0xff) + \
  325. ((ad >> 16) & 0xff) + \
  326. ((ad >> 24) & 0xff)) % HASH_TABLE_SIZE)
  327. #define RIP_CREATE_ROUTETABLE_LOCK() InitializeCriticalSection(&g_csRoutes)
  328. #define RIP_DESTROY_ROUTETABLE_LOCK() DeleteCriticalSection(&g_csRoutes)
  329. #define RIP_LOCK_ROUTETABLE() EnterCriticalSection(&g_csRoutes)
  330. #define RIP_UNLOCK_ROUTETABLE() LeaveCriticalSection(&g_csRoutes)
  331. #define RIP_CREATE_PARAMS_LOCK() InitializeCriticalSection(&g_csParameters)
  332. #define RIP_DESTROY_PARAMS_LOCK() DeleteCriticalSection(&g_csParameters)
  333. #define RIP_LOCK_PARAMS() EnterCriticalSection(&g_csParameters)
  334. #define RIP_UNLOCK_PARAMS() LeaveCriticalSection(&g_csParameters)
  335. #define RIP_CREATE_ADDRTABLE_LOCK() InitializeCriticalSection(&g_csAddrtables)
  336. #define RIP_DESTROY_ADDRTABLE_LOCK() DeleteCriticalSection(&g_csAddrtables)
  337. #define RIP_LOCK_ADDRTABLE() EnterCriticalSection(&g_csAddrtables)
  338. #define RIP_UNLOCK_ADDRTABLE() LeaveCriticalSection(&g_csAddrtables)
  339. #ifdef ROUTE_FILTERS
  340. #define RIP_CREATE_ANNOUNCE_FILTERS_LOCK() \
  341. InitializeCriticalSection( &g_csAnnFilters )
  342. #define RIP_DESTROY_ANNOUNCE_FILTERS_LOCK() \
  343. DeleteCriticalSection( &g_csAnnFilters )
  344. #define RIP_LOCK_ANNOUNCE_FILTERS() \
  345. EnterCriticalSection( &g_csAnnFilters )
  346. #define RIP_UNLOCK_ANNOUNCE_FILTERS() \
  347. LeaveCriticalSection( &g_csAnnFilters )
  348. #define RIP_CREATE_ACCEPT_FILTERS_LOCK() \
  349. InitializeCriticalSection( &g_csAccFilters )
  350. #define RIP_DESTROY_ACCEPT_FILTERS_LOCK() \
  351. DeleteCriticalSection( &g_csAccFilters )
  352. #define RIP_LOCK_ACCEPT_FILTERS() \
  353. EnterCriticalSection( &g_csAccFilters )
  354. #define RIP_UNLOCK_ACCEPT_FILTERS() \
  355. LeaveCriticalSection( &g_csAccFilters )
  356. #endif
  357. //-----------------------------------------------------------------------
  358. // function prototypes
  359. //-----------------------------------------------------------------------
  360. DWORD UpdateThread(LPVOID lpvParam);
  361. ULONG AddressChangeNotificationThread(LPVOID lpvParam);
  362. VOID serviceHandlerFunction(DWORD dwControl);
  363. VOID FAR PASCAL serviceMainFunction(IN DWORD dwNumServicesArgs,
  364. IN LPSTR *lpServiceArgVectors);
  365. DWORD InitializeRouteTable();
  366. VOID CleanupRouteTable();
  367. VOID CheckRouteTableEntries();
  368. LPHASH_TABLE_ENTRY GetRouteTableEntry(DWORD dwIndex, DWORD dwDestaddr,
  369. DWORD dwNetmask);
  370. BOOL RouteTableEntryExists(DWORD dwIndex, DWORD dwDestaddr);
  371. VOID DumpRouteTableEntries(BOOL bChangesOnly);
  372. VOID ProcessRouteTableChanges(BOOL bTriggered);
  373. VOID ClearChangeFlags();
  374. DWORD SubnetMask(DWORD dwAddress);
  375. DWORD NetclassMask(DWORD dwAddress);
  376. INT LoadRouteTable(BOOL bFirstTime);
  377. DWORD UpdateSystemRouteTable(LPHASH_TABLE_ENTRY rt_entry,
  378. BOOL bAdd);
  379. VOID dbgprintf(LPSTR szFormat, ...);
  380. DWORD LoadParameters();
  381. DWORD InitializeAddressTable(BOOL bFirstTime);
  382. DWORD InitializeStatsTable();
  383. VOID CleanupStatsTable();
  384. BOOL IsHostAddress(DWORD dwAddress);
  385. BOOL IsLocalAddr(DWORD dwAddress);
  386. BOOL IsDisabledLocalAddress(DWORD dwAddress);
  387. BOOL IsBroadcastAddress(DWORD dwAddress);
  388. DWORD BroadcastRouteTableRequests();
  389. DWORD BroadcastRouteTableContents(BOOL bTriggered,
  390. BOOL bChangesOnly);
  391. VOID TransmitRouteTableContents(LPRIP_ADDRESS lpaddr,
  392. LPSOCKADDR_IN lpdestaddr,
  393. BOOL bChangesOnly);
  394. VOID InitUpdateBuffer(BYTE buffer[], LPRIP_ENTRY *lplpentry,
  395. LPDWORD lpdwSize);
  396. VOID AddUpdateEntry(BYTE buffer[], LPRIP_ENTRY *lplpentry,
  397. LPDWORD lpdwSize, LPRIP_ADDRESS lpaddr,
  398. LPSOCKADDR_IN lpdestaddr, DWORD dwAddress,
  399. DWORD dwMetric);
  400. VOID FinishUpdateBuffer(BYTE buffer[], LPDWORD lpdwSize,
  401. LPRIP_ADDRESS lpaddr,
  402. LPSOCKADDR_IN lpdestaddr);
  403. VOID ProcessRIPRequest(LPRIP_ADDRESS lpaddr,
  404. LPSOCKADDR_IN lpsrcaddr,
  405. BYTE buffer[], int length);
  406. VOID ProcessRIPResponse(LPRIP_ADDRESS lpaddr,
  407. LPSOCKADDR_IN lpsrcaddr,
  408. BYTE buffer[], int length);
  409. DWORD ProcessResponse(RIP_ADDRESS *lpAddress);
  410. DWORD ProcessRIPEntry(LPRIP_ADDRESS lpaddr, IN_ADDR srcaddr,
  411. LPRIP_ENTRY rip_entry, BYTE chVersion);
  412. DWORD ProcessRIPQuery(LPRIP_ADDRESS lpaddr,
  413. LPRIP_ENTRY rip_entry);
  414. VOID DoTimedOperations(DWORD dwMillisecsSinceLastCall);
  415. /* add option to disable triggered updates */
  416. /* pass socket address to process_rip_entry and process_rip_query */
  417. /* add index field to rt_entry */
  418. VOID RIPServiceStop();
  419. VOID RipLogError(DWORD dwMsgID, WORD wNumString,
  420. LPSTR *lplpStrings, DWORD dwErr);
  421. VOID RipLogWarning(DWORD dwMsgID, WORD wNumString,
  422. LPSTR *lplpStrings, DWORD dwErr);
  423. VOID RipLogInformation(DWORD dwMsgID, WORD wNumString,
  424. LPSTR *lplpStrings, DWORD dwErr);
  425. #ifdef ROUTE_FILTERS
  426. PRIP_FILTERS
  427. LoadFilters(
  428. IN HKEY hKeyParams,
  429. IN LPSTR lpszKeyName
  430. );
  431. #endif
  432. //-----------------------------------------------------------------------------
  433. //
  434. // WIN 95 String resources
  435. //
  436. //-----------------------------------------------------------------------------
  437. #ifdef CHICAGO
  438. #define IDS_STRING_BASE 4096
  439. #define IDS_APP_NAME IDS_STRING_BASE + 0
  440. #define IDS_TITLE_BAR IDS_STRING_BASE + 1
  441. #define IDS_HELP_TEXT1 IDS_STRING_BASE + 6
  442. #define IDS_HELP_TEXT2 IDS_STRING_BASE + 7
  443. #define IP_ADDRESS_RELOAD_INTR 120
  444. //
  445. // SYNOPSIS: One debug statememt in time can save nine.
  446. // Last modified Time-stamp: <25-Nov-96 17:49>
  447. // History:
  448. // MohsinA, 14-Nov-96.
  449. //
  450. void DbgPrintf( char * format, ... );
  451. #endif