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.

1226 lines
29 KiB

  1. /*
  2. File: routerif.c
  3. Defines callbacks needed to deal with interfaces supported by
  4. the router.
  5. */
  6. #include "precomp.h"
  7. DWORD
  8. RtruiInterfaceShow(
  9. IN PWCHAR pwszIfName,
  10. IN DWORD dwLevel,
  11. IN DWORD dwFormat,
  12. IN PVOID pvData,
  13. IN HANDLE hData
  14. )
  15. /*++
  16. Routine Description:
  17. Prints interface info to display or file
  18. Arguments:
  19. pIfInfo - Info for adding the interface
  20. Return Value:
  21. NO_ERROR
  22. --*/
  23. {
  24. DWORD dwErr, dwSize;
  25. WCHAR rgwcIfDesc[MAX_INTERFACE_NAME_LEN + 1];
  26. PWCHAR pwszEnabled, pwszDisabled, pwszConnected, pwszDisconn;
  27. PWCHAR pwszConnecting, pwszUnreachable, pwszClient, pwszHome, pwszFull;
  28. PWCHAR pwszDedicated, pwszInternal, pwszLoop;
  29. PWCHAR pwszAdminState, pwszState, pwszType;
  30. MPR_INTERFACE_0* pIfInfo = (MPR_INTERFACE_0*)pvData;
  31. BOOL bDump = (hData) && (*((BOOL*)hData));
  32. pwszEnabled = MakeString(g_hModule, STRING_ENABLED);
  33. pwszDisabled = MakeString(g_hModule, STRING_DISABLED);
  34. pwszConnected = MakeString(g_hModule, STRING_CONNECTED);
  35. pwszDisconn = MakeString(g_hModule, STRING_DISCONNECTED);
  36. pwszConnecting = MakeString(g_hModule, STRING_CONNECTING);
  37. pwszUnreachable = MakeString(g_hModule, STRING_UNREACHABLE);
  38. pwszClient = MakeString(g_hModule, STRING_CLIENT);
  39. pwszHome = MakeString(g_hModule, STRING_HOME_ROUTER);
  40. pwszFull = MakeString(g_hModule, STRING_FULL_ROUTER);
  41. pwszDedicated = MakeString(g_hModule, STRING_DEDICATED);
  42. pwszInternal = MakeString(g_hModule, STRING_INTERNAL);
  43. pwszLoop = MakeString(g_hModule, STRING_LOOPBACK);
  44. do
  45. {
  46. if(!pwszEnabled or
  47. !pwszDisabled or
  48. !pwszConnected or
  49. !pwszDisconn or
  50. !pwszConnecting or
  51. !pwszUnreachable or
  52. !pwszClient or
  53. !pwszHome or
  54. !pwszFull or
  55. !pwszDedicated or
  56. !pwszInternal or
  57. !pwszLoop)
  58. {
  59. DisplayError(NULL,
  60. ERROR_NOT_ENOUGH_MEMORY);
  61. break;
  62. }
  63. dwSize = sizeof(rgwcIfDesc);
  64. IfutlGetInterfaceDescription(pIfInfo->wszInterfaceName,
  65. rgwcIfDesc,
  66. &dwSize);
  67. switch(pIfInfo->dwConnectionState)
  68. {
  69. case ROUTER_IF_STATE_UNREACHABLE:
  70. {
  71. pwszState = pwszUnreachable;
  72. break;
  73. }
  74. case ROUTER_IF_STATE_DISCONNECTED:
  75. {
  76. pwszState = pwszDisconn;
  77. break;
  78. }
  79. case ROUTER_IF_STATE_CONNECTING:
  80. {
  81. pwszState = pwszConnecting;
  82. break;
  83. }
  84. case ROUTER_IF_STATE_CONNECTED:
  85. {
  86. pwszState = pwszConnected;
  87. break;
  88. }
  89. default:
  90. {
  91. pwszState = L"";
  92. break;
  93. }
  94. }
  95. if (bDump == FALSE)
  96. {
  97. switch(pIfInfo->dwIfType)
  98. {
  99. case ROUTER_IF_TYPE_CLIENT:
  100. pwszType = pwszClient;
  101. break;
  102. case ROUTER_IF_TYPE_HOME_ROUTER:
  103. pwszType = pwszHome;
  104. break;
  105. case ROUTER_IF_TYPE_FULL_ROUTER:
  106. pwszType = pwszFull;
  107. break;
  108. case ROUTER_IF_TYPE_DEDICATED:
  109. pwszType = pwszDedicated;
  110. break;
  111. case ROUTER_IF_TYPE_INTERNAL:
  112. pwszType = pwszInternal;
  113. break;
  114. case ROUTER_IF_TYPE_LOOPBACK:
  115. pwszType = pwszLoop;
  116. break;
  117. default:
  118. pwszType = L"";
  119. break;
  120. }
  121. if(pIfInfo->fEnabled)
  122. {
  123. pwszAdminState = pwszEnabled;
  124. }
  125. else
  126. {
  127. pwszAdminState = pwszDisabled;
  128. }
  129. }
  130. else
  131. {
  132. switch(pIfInfo->dwIfType)
  133. {
  134. case ROUTER_IF_TYPE_FULL_ROUTER:
  135. pwszType = TOKEN_FULL;
  136. break;
  137. default:
  138. pwszType = L"";
  139. break;
  140. }
  141. if(pIfInfo->fEnabled)
  142. {
  143. pwszAdminState = TOKEN_VALUE_ENABLED;
  144. }
  145. else
  146. {
  147. pwszAdminState = TOKEN_VALUE_DISABLED;
  148. }
  149. }
  150. if (bDump)
  151. {
  152. PWCHAR pwszQuoted = NULL;
  153. if (wcscmp(pIfInfo->wszInterfaceName, rgwcIfDesc))
  154. {
  155. pwszQuoted = MakeQuotedString( rgwcIfDesc );
  156. }
  157. else
  158. {
  159. pwszQuoted = MakeQuotedString( pIfInfo->wszInterfaceName );
  160. }
  161. if (pIfInfo->dwIfType == ROUTER_IF_TYPE_FULL_ROUTER)
  162. {
  163. WCHAR pwszUser[256], pwszDomain[256];
  164. PWCHAR pszQuoteUser = NULL, pszQuoteDomain = NULL;
  165. DisplayMessageT( DMP_IF_ADD_IF,
  166. pwszQuoted,
  167. pwszType);
  168. DisplayMessageT( DMP_IF_SET_IF,
  169. pwszQuoted,
  170. pwszAdminState);
  171. dwErr = RtrdbInterfaceReadCredentials(
  172. pIfInfo->wszInterfaceName,
  173. pwszUser,
  174. NULL,
  175. pwszDomain);
  176. if (dwErr == NO_ERROR)
  177. {
  178. pszQuoteUser = MakeQuotedString( pwszUser );
  179. if (pszQuoteUser == NULL)
  180. {
  181. break;
  182. }
  183. if (*pwszDomain == L'\0')
  184. {
  185. DisplayMessageT( DMP_IF_SET_CRED_IF_NOD,
  186. pwszQuoted,
  187. pszQuoteUser);
  188. }
  189. else
  190. {
  191. pszQuoteDomain = MakeQuotedString( pwszDomain );
  192. if (pszQuoteUser == NULL)
  193. {
  194. FreeString(pszQuoteUser);
  195. break;
  196. }
  197. DisplayMessageT( DMP_IF_SET_CRED_IF,
  198. pwszQuoted,
  199. pszQuoteUser,
  200. pszQuoteDomain);
  201. FreeString(pszQuoteDomain);
  202. }
  203. }
  204. DisplayMessageT( DMP_IF_NEWLINE );
  205. }
  206. FreeQuotedString(pwszQuoted);
  207. }
  208. else
  209. {
  210. DisplayMessage(g_hModule,
  211. (dwFormat>0)? MSG_IF_ENTRY_LONG : MSG_IF_ENTRY_SHORT,
  212. pwszAdminState,
  213. pwszState,
  214. pwszType,
  215. rgwcIfDesc );
  216. }
  217. }while(FALSE);
  218. if(pwszEnabled)
  219. {
  220. FreeString(pwszEnabled);
  221. }
  222. if(pwszDisabled)
  223. {
  224. FreeString(pwszDisabled);
  225. }
  226. if(pwszConnected)
  227. {
  228. FreeString(pwszConnected);
  229. }
  230. if(pwszDisconn)
  231. {
  232. FreeString(pwszDisconn);
  233. }
  234. if(pwszConnecting)
  235. {
  236. FreeString(pwszConnecting);
  237. }
  238. if(pwszUnreachable)
  239. {
  240. FreeString(pwszUnreachable);
  241. }
  242. if(pwszClient)
  243. {
  244. FreeString(pwszClient);
  245. }
  246. if(pwszHome)
  247. {
  248. FreeString(pwszHome);
  249. }
  250. if(pwszFull)
  251. {
  252. FreeString(pwszFull);
  253. }
  254. if(pwszDedicated)
  255. {
  256. FreeString(pwszDedicated);
  257. }
  258. if(pwszInternal)
  259. {
  260. FreeString(pwszInternal);
  261. }
  262. if(pwszLoop)
  263. {
  264. FreeString(pwszLoop);
  265. }
  266. return NO_ERROR;
  267. }
  268. DWORD
  269. RtrHandleResetAll(
  270. IN PWCHAR *ppwcArguments,
  271. IN DWORD dwCurrentIndex,
  272. IN DWORD dwArgCount,
  273. IN BOOL *pbDone
  274. )
  275. /*++
  276. Routine Description:
  277. Handler for displaying interfaces
  278. Arguments:
  279. ppwcArguments - Argument array
  280. dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg
  281. dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg
  282. Return Value:
  283. NO_ERROR
  284. --*/
  285. {
  286. DWORD dwErr = NO_ERROR, dwSize;
  287. MPR_INTERFACE_0 If0;
  288. WCHAR pszName[MAX_INTERFACE_NAME_LEN];
  289. do
  290. {
  291. // Make sure no arguments were passed in
  292. //
  293. if (dwArgCount - dwCurrentIndex != 0)
  294. {
  295. dwErr = ERROR_INVALID_SYNTAX;
  296. break;
  297. }
  298. dwErr = RtrdbResetAll();
  299. BREAK_ON_DWERR(dwErr);
  300. } while (FALSE);
  301. // Cleanup
  302. {
  303. }
  304. return dwErr;
  305. }
  306. DWORD
  307. RtrHandleAddDel(
  308. IN PWCHAR *ppwcArguments,
  309. IN DWORD dwCurrentIndex,
  310. IN DWORD dwArgCount,
  311. IN BOOL bAdd
  312. )
  313. /*++
  314. Routine Description:
  315. The actual parser for the add and delete commands
  316. Arguments:
  317. ppwcArguments - Argument array
  318. dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg
  319. dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg
  320. bAdd - TRUE to add the interface
  321. Return Value:
  322. NO_ERROR
  323. --*/
  324. {
  325. DWORD i, dwNumArgs, dwRes, dwErr, dwIfType, dwSize;
  326. MPR_INTERFACE_0 IfInfo;
  327. PWCHAR pszIfDesc = NULL;
  328. TOKEN_VALUE rgEnumType[] =
  329. {
  330. {TOKEN_FULL, ROUTER_IF_TYPE_FULL_ROUTER}
  331. };
  332. IFMON_CMD_ARG pArgs[] =
  333. {
  334. {
  335. IFMON_CMD_TYPE_STRING,
  336. {TOKEN_NAME, TRUE, FALSE},
  337. NULL,
  338. 0,
  339. NULL
  340. },
  341. {
  342. IFMON_CMD_TYPE_ENUM,
  343. {TOKEN_TYPE, FALSE, FALSE},
  344. rgEnumType,
  345. sizeof(rgEnumType) / sizeof(*rgEnumType),
  346. NULL
  347. }
  348. };
  349. // Initialize
  350. //
  351. ZeroMemory(&IfInfo, sizeof(IfInfo));
  352. IfInfo.fEnabled = TRUE;
  353. do
  354. {
  355. // Parse out the values
  356. //
  357. dwErr = IfutlParse(
  358. ppwcArguments,
  359. dwCurrentIndex,
  360. dwArgCount,
  361. NULL,
  362. pArgs,
  363. sizeof(pArgs) / sizeof(*pArgs));
  364. if (dwErr isnot NO_ERROR)
  365. {
  366. break;
  367. }
  368. //
  369. // Get the arguments that were specified
  370. //
  371. pszIfDesc = IFMON_CMD_ARG_GetPsz(&pArgs[0]);
  372. if (!pszIfDesc) {
  373. dwErr = ERROR_INVALID_SYNTAX;
  374. break;
  375. }
  376. IfInfo.dwIfType = IFMON_CMD_ARG_GetDword(&pArgs[1]);
  377. if(bAdd)
  378. {
  379. // Make sure the type was specified
  380. //
  381. if (! pArgs[1].rgTag.bPresent)
  382. {
  383. dwErr = ERROR_INVALID_SYNTAX;
  384. break;
  385. }
  386. wcscpy(
  387. IfInfo.wszInterfaceName,
  388. pszIfDesc
  389. );
  390. dwErr = RtrdbInterfaceAdd(
  391. IfInfo.wszInterfaceName,
  392. 0,
  393. (PVOID)&IfInfo);
  394. }
  395. else
  396. {
  397. WCHAR pszName[MAX_INTERFACE_NAME_LEN + 1];
  398. dwSize = sizeof(pszName);
  399. IfutlGetInterfaceName(
  400. pszIfDesc,
  401. pszName,
  402. &dwSize);
  403. dwErr = RtrdbInterfaceDelete(pszName);
  404. }
  405. } while(FALSE);
  406. // Cleanup
  407. {
  408. IfutlFree(pszIfDesc);
  409. }
  410. return dwErr;
  411. }
  412. DWORD
  413. RtrHandleAdd(
  414. IN PWCHAR *ppwcArguments,
  415. IN DWORD dwCurrentIndex,
  416. IN DWORD dwArgCount,
  417. IN BOOL *pbDone
  418. )
  419. /*++
  420. Routine Description:
  421. Handler for adding an dial interface to the router
  422. Arguments:
  423. ppwcArguments - Argument array
  424. dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg
  425. dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg
  426. Return Value:
  427. NO_ERROR
  428. --*/
  429. {
  430. return RtrHandleAddDel(
  431. ppwcArguments,
  432. dwCurrentIndex,
  433. dwArgCount,
  434. TRUE);
  435. }
  436. DWORD
  437. RtrHandleDel(
  438. IN PWCHAR *ppwcArguments,
  439. IN DWORD dwCurrentIndex,
  440. IN DWORD dwArgCount,
  441. IN BOOL *pbDone
  442. )
  443. /*++
  444. Routine Description:
  445. Handler for deleting a dial interface or from the router
  446. Arguments:
  447. ppwcArguments - Argument array
  448. dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg
  449. dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg
  450. Return Value:
  451. NO_ERROR
  452. --*/
  453. {
  454. return RtrHandleAddDel(
  455. ppwcArguments,
  456. dwCurrentIndex,
  457. dwArgCount,
  458. FALSE);
  459. }
  460. DWORD
  461. RtrHandleSet(
  462. IN PWCHAR *ppwcArguments,
  463. IN DWORD dwCurrentIndex,
  464. IN DWORD dwArgCount,
  465. IN BOOL *pbDone
  466. )
  467. /*++
  468. Routine Description:
  469. Handler for displaying interfaces
  470. Arguments:
  471. ppwcArguments - Argument array
  472. dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg
  473. dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg
  474. Return Value:
  475. NO_ERROR
  476. --*/
  477. {
  478. DWORD dwErr = NO_ERROR, dwSize;
  479. MPR_INTERFACE_0 If0;
  480. TOKEN_VALUE rgEnumAdmin[] =
  481. {
  482. {TOKEN_VALUE_ENABLED, TRUE},
  483. {TOKEN_VALUE_DISABLED, FALSE}
  484. };
  485. TOKEN_VALUE rgEnumConnect[] =
  486. {
  487. {TOKEN_VALUE_CONNECTED, TRUE},
  488. {TOKEN_VALUE_DISCONNECTED, FALSE}
  489. };
  490. IFMON_CMD_ARG pArgs[] =
  491. {
  492. {
  493. IFMON_CMD_TYPE_STRING,
  494. {TOKEN_NAME, TRUE, FALSE},
  495. NULL,
  496. 0,
  497. NULL
  498. },
  499. {
  500. IFMON_CMD_TYPE_ENUM,
  501. {TOKEN_ADMIN, FALSE, FALSE},
  502. rgEnumAdmin,
  503. sizeof(rgEnumAdmin) / sizeof(*rgEnumAdmin),
  504. NULL
  505. },
  506. {
  507. IFMON_CMD_TYPE_ENUM,
  508. {TOKEN_CONNECT, FALSE, FALSE},
  509. rgEnumConnect,
  510. sizeof(rgEnumConnect) / sizeof(*rgEnumConnect),
  511. NULL
  512. },
  513. {
  514. IFMON_CMD_TYPE_STRING,
  515. {TOKEN_NEWNAME, FALSE, FALSE},
  516. NULL,
  517. 0,
  518. NULL
  519. }
  520. };
  521. PWCHAR pszIfName = NULL, pszNewName = NULL;
  522. WCHAR pszName[MAX_INTERFACE_NAME_LEN];
  523. BOOL fEnable = FALSE, fConnect = FALSE;
  524. BOOL fEnablePresent = FALSE, fConnectPresent = FALSE;
  525. do
  526. {
  527. // Parse
  528. //
  529. dwErr = IfutlParse(
  530. ppwcArguments,
  531. dwCurrentIndex,
  532. dwArgCount,
  533. NULL,
  534. pArgs,
  535. sizeof(pArgs)/sizeof(*pArgs));
  536. BREAK_ON_DWERR(dwErr);
  537. // Get the returned values from the parse
  538. //
  539. pszIfName = IFMON_CMD_ARG_GetPsz(&pArgs[0]);
  540. fEnable = IFMON_CMD_ARG_GetDword(&pArgs[1]);
  541. fConnect = IFMON_CMD_ARG_GetDword(&pArgs[2]);
  542. pszNewName = IFMON_CMD_ARG_GetPsz(&pArgs[3]);
  543. fEnablePresent = pArgs[1].rgTag.bPresent;
  544. fConnectPresent = pArgs[2].rgTag.bPresent;
  545. // Get the interface info so that we can
  546. // make sure we have the right type.
  547. //
  548. dwSize = sizeof(pszName);
  549. dwErr = GetIfNameFromFriendlyName(
  550. pszIfName,
  551. pszName,
  552. &dwSize);
  553. BREAK_ON_DWERR(dwErr);
  554. ZeroMemory(&If0, sizeof(If0));
  555. dwErr = RtrdbInterfaceRead(
  556. pszName,
  557. 0,
  558. (PVOID*)&If0,
  559. fEnablePresent? TRUE: FALSE);
  560. BREAK_ON_DWERR(dwErr);
  561. // Rename the interface if that is the request
  562. //
  563. if ( If0.dwIfType == ROUTER_IF_TYPE_DEDICATED )
  564. {
  565. if (!pszNewName && !fEnablePresent)
  566. {
  567. DisplayError(
  568. g_hModule,
  569. EMSG_CANT_FIND_EOPT);
  570. dwErr = ERROR_INVALID_SYNTAX;
  571. break;
  572. }
  573. if (g_pwszRouter)
  574. {
  575. DisplayError(
  576. g_hModule,
  577. EMSG_IF_NEWNAME_ONLY_FOR_LOCAL);
  578. dwErr = ERROR_CAN_NOT_COMPLETE;
  579. break;
  580. }
  581. if (fConnectPresent)
  582. {
  583. DisplayError(
  584. g_hModule,
  585. EMSG_IF_LAN_ONLY_COMMAND);
  586. dwErr = ERROR_CAN_NOT_COMPLETE;
  587. break;
  588. }
  589. // Rename the interface
  590. //
  591. if (pszNewName)
  592. {
  593. dwErr = RtrdbInterfaceRename(
  594. pszName,
  595. 0,
  596. (PVOID)&If0,
  597. pszNewName);
  598. if (dwErr != NO_ERROR)
  599. break;
  600. }
  601. if (fEnablePresent)
  602. {
  603. dwErr = RtrdbInterfaceEnableDisable(
  604. pszIfName,
  605. //(PVOID)&If0,
  606. fEnable
  607. );
  608. }
  609. break;
  610. }
  611. if (pszNewName)
  612. {
  613. DisplayError(
  614. g_hModule,
  615. EMSG_IF_NEWNAME_ONLY_FOR_LAN);
  616. dwErr = ERROR_CAN_NOT_COMPLETE;
  617. break;
  618. }
  619. // Make sure that at least one option was specified
  620. //
  621. if (!fEnablePresent && !fConnectPresent)
  622. {
  623. dwErr = ERROR_INVALID_SYNTAX;
  624. break;
  625. }
  626. // Validate the interface type
  627. //
  628. //if ( ( If0.dwIfType == ROUTER_IF_TYPE_DEDICATED ) ||
  629. // ( If0.dwIfType == ROUTER_IF_TYPE_INTERNAL )
  630. // )
  631. if ( If0.dwIfType != ROUTER_IF_TYPE_FULL_ROUTER )
  632. {
  633. DisplayError(
  634. g_hModule,
  635. EMSG_IF_WAN_ONLY_COMMAND);
  636. dwErr = ERROR_CAN_NOT_COMPLETE;
  637. break;
  638. }
  639. // Allow the connection request to override
  640. // the admin enabling.
  641. if (fConnectPresent)
  642. {
  643. if (!IfutlIsRouterRunning())
  644. {
  645. DisplayError(
  646. g_hModule,
  647. EMSG_IF_CONNECT_ONLY_WHEN_ROUTER_RUNNING);
  648. dwErr = ERROR_CAN_NOT_COMPLETE;
  649. break;
  650. }
  651. if (fConnect)
  652. {
  653. fEnablePresent = TRUE;
  654. fEnable = TRUE;
  655. }
  656. }
  657. // Enable if requested
  658. //
  659. if (fEnablePresent)
  660. {
  661. // Enable/disable the interface
  662. //
  663. If0.fEnabled = fEnable;
  664. // Commit
  665. //
  666. dwErr = RtrdbInterfaceWrite(
  667. If0.wszInterfaceName,
  668. 0,
  669. (PVOID)&If0);
  670. BREAK_ON_DWERR(dwErr);
  671. }
  672. // Connect if requested
  673. //
  674. if (fConnectPresent)
  675. {
  676. if (fConnect)
  677. {
  678. dwErr = MprAdminInterfaceConnect(
  679. g_hMprAdmin,
  680. If0.hInterface,
  681. NULL,
  682. TRUE);
  683. BREAK_ON_DWERR(dwErr);
  684. }
  685. else
  686. {
  687. dwErr = MprAdminInterfaceDisconnect(
  688. g_hMprAdmin,
  689. If0.hInterface);
  690. BREAK_ON_DWERR(dwErr);
  691. }
  692. }
  693. } while (FALSE);
  694. // Cleanup
  695. {
  696. IfutlFree(pszIfName);
  697. IfutlFree(pszNewName);
  698. }
  699. return dwErr;
  700. }
  701. DWORD
  702. RtrHandleSetCredentials(
  703. IN PWCHAR *ppwcArguments,
  704. IN DWORD dwCurrentIndex,
  705. IN DWORD dwArgCount,
  706. IN BOOL *pbDone
  707. )
  708. /*++
  709. Routine Description:
  710. Handler for displaying interfaces
  711. Arguments:
  712. ppwcArguments - Argument array
  713. dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg
  714. dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg
  715. Return Value:
  716. NO_ERROR
  717. --*/
  718. {
  719. DWORD dwErr = NO_ERROR, dwSize;
  720. MPR_INTERFACE_0 If0;
  721. IFMON_CMD_ARG pArgs[] =
  722. {
  723. {
  724. IFMON_CMD_TYPE_STRING,
  725. {TOKEN_NAME, TRUE, FALSE},
  726. NULL,
  727. 0,
  728. NULL
  729. },
  730. {
  731. IFMON_CMD_TYPE_STRING,
  732. {TOKEN_USER, TRUE, FALSE},
  733. NULL,
  734. 0,
  735. NULL
  736. },
  737. {
  738. IFMON_CMD_TYPE_STRING,
  739. {TOKEN_DOMAIN, FALSE, FALSE},
  740. NULL,
  741. 0,
  742. NULL
  743. },
  744. {
  745. IFMON_CMD_TYPE_STRING,
  746. {TOKEN_PASSWORD, FALSE, FALSE},
  747. NULL,
  748. 0,
  749. NULL
  750. }
  751. };
  752. PWCHAR pszIfName = NULL, pszUser = NULL;
  753. PWCHAR pszPassword = NULL, pszDomain = NULL;
  754. WCHAR pszName[MAX_INTERFACE_NAME_LEN];
  755. do
  756. {
  757. // Parse
  758. //
  759. dwErr = IfutlParse(
  760. ppwcArguments,
  761. dwCurrentIndex,
  762. dwArgCount,
  763. NULL,
  764. pArgs,
  765. sizeof(pArgs)/sizeof(*pArgs));
  766. BREAK_ON_DWERR(dwErr);
  767. // Get the returned values from the parse
  768. //
  769. pszIfName = IFMON_CMD_ARG_GetPsz(&pArgs[0]);
  770. pszUser = IFMON_CMD_ARG_GetPsz(&pArgs[1]);
  771. pszDomain = IFMON_CMD_ARG_GetPsz(&pArgs[2]);
  772. pszPassword = IFMON_CMD_ARG_GetPsz(&pArgs[3]);
  773. // Get the interface info so that we can
  774. // make sure we have the right type.
  775. //
  776. dwSize = sizeof(pszName);
  777. dwErr = GetIfNameFromFriendlyName(
  778. pszIfName,
  779. pszName,
  780. &dwSize);
  781. BREAK_ON_DWERR(dwErr);
  782. dwErr = RtrdbInterfaceWriteCredentials(
  783. pszName,
  784. pszUser,
  785. pszPassword,
  786. pszDomain);
  787. BREAK_ON_DWERR(dwErr);
  788. } while (FALSE);
  789. // Cleanup
  790. {
  791. IfutlFree(pszIfName);
  792. IfutlFree(pszUser);
  793. if (pszPassword)
  794. RtlSecureZeroMemory(pszPassword, wcslen(pszPassword)*sizeof(WCHAR));
  795. IfutlFree(pszPassword);
  796. IfutlFree(pszDomain);
  797. }
  798. return dwErr;
  799. }
  800. DWORD
  801. RtrHandleShow(
  802. IN PWCHAR *ppwcArguments,
  803. IN DWORD dwCurrentIndex,
  804. IN DWORD dwArgCount,
  805. IN BOOL *pbDone
  806. )
  807. /*++
  808. Routine Description:
  809. Handler for displaying interfaces
  810. Arguments:
  811. ppwcArguments - Argument array
  812. dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg
  813. dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg
  814. Return Value:
  815. NO_ERROR
  816. --*/
  817. {
  818. DWORD dwErr = NO_ERROR, dwSize;
  819. MPR_INTERFACE_0 If0;
  820. IFMON_CMD_ARG pArgs[] =
  821. {
  822. {
  823. IFMON_CMD_TYPE_STRING,
  824. {TOKEN_NAME, FALSE, FALSE},
  825. NULL,
  826. 0,
  827. NULL
  828. }
  829. };
  830. PWCHAR pszIfName = NULL;
  831. WCHAR pszName[MAX_INTERFACE_NAME_LEN];
  832. do
  833. {
  834. // Parse
  835. //
  836. dwErr = IfutlParse(
  837. ppwcArguments,
  838. dwCurrentIndex,
  839. dwArgCount,
  840. NULL,
  841. pArgs,
  842. sizeof(pArgs)/sizeof(*pArgs));
  843. BREAK_ON_DWERR(dwErr);
  844. // Get the returned values from the parse
  845. //
  846. pszIfName = IFMON_CMD_ARG_GetPsz(&pArgs[0]);
  847. // Handle the no argument case
  848. //
  849. if (pszIfName == NULL)
  850. {
  851. RtrdbInterfaceEnumerate(0, 0, RtruiInterfaceShow, NULL);
  852. dwErr = NO_ERROR;
  853. break;
  854. }
  855. // Map the name
  856. //
  857. dwSize = sizeof(pszName);
  858. GetIfNameFromFriendlyName(
  859. pszIfName,
  860. pszName,
  861. &dwSize);
  862. // Get the info
  863. //
  864. dwErr = RtrdbInterfaceRead(
  865. pszName,
  866. 0,
  867. (PVOID)&If0,
  868. FALSE);
  869. BREAK_ON_DWERR( dwErr );
  870. RtruiInterfaceShow(
  871. If0.wszInterfaceName,
  872. 0,
  873. 1,
  874. (PVOID)&If0,
  875. NULL
  876. );
  877. } while (FALSE);
  878. // Cleanup
  879. //
  880. {
  881. if (pszIfName != NULL)
  882. {
  883. IfutlFree(pszIfName);
  884. }
  885. }
  886. return dwErr;
  887. }
  888. DWORD
  889. RtrHandleShowCredentials(
  890. IN PWCHAR *ppwcArguments,
  891. IN DWORD dwCurrentIndex,
  892. IN DWORD dwArgCount,
  893. IN BOOL *pbDone
  894. )
  895. /*++
  896. Routine Description:
  897. Handler for showing credentials of an interface
  898. Arguments:
  899. ppwcArguments - Argument array
  900. dwCurrentIndex - ppwcArguments[dwCurrentIndex] is the first arg
  901. dwArgCount - ppwcArguments[dwArgCount - 1] is the last arg
  902. Return Value:
  903. NO_ERROR
  904. --*/
  905. {
  906. DWORD dwErr = NO_ERROR, dwSize;
  907. MPR_INTERFACE_0 If0;
  908. IFMON_CMD_ARG pArgs[] =
  909. {
  910. {
  911. IFMON_CMD_TYPE_STRING,
  912. {TOKEN_NAME, TRUE, FALSE},
  913. NULL,
  914. 0,
  915. NULL
  916. },
  917. };
  918. PWCHAR pszIfName = NULL;
  919. WCHAR pszName[MAX_INTERFACE_NAME_LEN];
  920. WCHAR pszUser[256], pszDomain[256], pszPassword[256];
  921. do
  922. {
  923. // Parse
  924. //
  925. dwErr = IfutlParse(
  926. ppwcArguments,
  927. dwCurrentIndex,
  928. dwArgCount,
  929. NULL,
  930. pArgs,
  931. sizeof(pArgs)/sizeof(*pArgs));
  932. BREAK_ON_DWERR(dwErr);
  933. // Get the returned values from the parse
  934. //
  935. pszIfName = IFMON_CMD_ARG_GetPsz(&pArgs[0]);
  936. // Get the interface info so that we can
  937. // make sure we have the right type.
  938. //
  939. dwSize = sizeof(pszName);
  940. dwErr = GetIfNameFromFriendlyName(
  941. pszIfName,
  942. pszName,
  943. &dwSize);
  944. BREAK_ON_DWERR(dwErr);
  945. dwErr = RtrdbInterfaceReadCredentials(
  946. pszName,
  947. pszUser,
  948. pszPassword,
  949. pszDomain);
  950. BREAK_ON_DWERR(dwErr);
  951. DisplayMessage(
  952. g_hModule,
  953. MSG_IF_CREDENTIALS,
  954. pszIfName,
  955. pszUser,
  956. pszDomain,
  957. pszPassword);
  958. } while (FALSE);
  959. // Cleanup
  960. {
  961. RtlSecureZeroMemory(pszPassword, sizeof(pszPassword));
  962. IfutlFree(pszIfName);
  963. }
  964. return dwErr;
  965. }
  966. DWORD
  967. RtrHandleDump(
  968. PWCHAR *ppwcArguments,
  969. DWORD dwCurrentIndex,
  970. DWORD dwArgCount,
  971. BOOL *pbDone
  972. )
  973. {
  974. DWORD dwErr, dwCount, dwTotal;
  975. ULONG i;
  976. PMPR_INTERFACE_0 pIfTable;
  977. BOOL bFormat = TRUE;
  978. // Display dump header
  979. //
  980. DisplayMessage(g_hModule, DMP_IF_HEADER_COMMENTS);
  981. DisplayMessageT(DMP_IF_HEADER);
  982. // Display the interfaces
  983. //
  984. RtrdbInterfaceEnumerate(0, 0, RtruiInterfaceShow, &bFormat);
  985. // Display dump footer
  986. //
  987. DisplayMessageT(DMP_IF_FOOTER);
  988. DisplayMessage(g_hModule, DMP_IF_FOOTER_COMMENTS);
  989. return NO_ERROR;
  990. }
  991. DWORD
  992. RtrDump(
  993. IN PWCHAR *ppwcArguments,
  994. IN DWORD dwArgCount
  995. )
  996. {
  997. BOOL bDone;
  998. return RtrHandleDump(ppwcArguments, 1, dwArgCount, &bDone);
  999. }