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.

451 lines
12 KiB

  1. //=============================================================================
  2. // Copyright (c) 2002 Microsoft Corporation
  3. // Abstract:
  4. // This module implements ISATAP configuration commands.
  5. //=============================================================================
  6. #include "precomp.h"
  7. #pragma hdrstop
  8. #define KEY_ENABLE_ISATAP_RESOLUTION L"EnableIsatapResolution"
  9. #define KEY_ISATAP_RESOLUTION_INTERVAL L"IsatapResolutionInterval"
  10. #define KEY_ISATAP_ROUTER_NAME L"IsatapRouterName"
  11. #define KEY_ISATAP_STATE L"IsatapState"
  12. // The commands supported in this context
  13. //
  14. CMD_ENTRY g_IsatapSetCmdTable[] =
  15. {
  16. CREATE_CMD_ENTRY(ISATAP_SET_STATE, IsatapHandleSetState),
  17. CREATE_CMD_ENTRY(ISATAP_SET_ROUTER, IsatapHandleSetRouter),
  18. };
  19. CMD_ENTRY g_IsatapShowCmdTable[] =
  20. {
  21. CREATE_CMD_ENTRY(ISATAP_SHOW_STATE, IsatapHandleShowState),
  22. CREATE_CMD_ENTRY(ISATAP_SHOW_ROUTER, IsatapHandleShowRouter),
  23. };
  24. CMD_GROUP_ENTRY g_IsatapCmdGroups[] =
  25. {
  26. CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_IsatapSetCmdTable),
  27. CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_IsatapShowCmdTable),
  28. };
  29. ULONG g_ulIsatapNumGroups = sizeof(g_IsatapCmdGroups)/sizeof(CMD_GROUP_ENTRY);
  30. DWORD
  31. WINAPI
  32. IsatapStartHelper(
  33. IN CONST GUID *pguidParent,
  34. IN DWORD dwVersion
  35. )
  36. /*++
  37. Routine Description
  38. Used to initialize the helper.
  39. Arguments
  40. pguidParent IPv6's guid
  41. pfnRegisterContext
  42. Return Value
  43. NO_ERROR
  44. other error code
  45. --*/
  46. {
  47. DWORD dwErr = NO_ERROR;
  48. NS_CONTEXT_ATTRIBUTES attMyAttributes;
  49. // Initialize attributes. We reuse the same GUID as 6to4 since both
  50. // are leaf contexts.
  51. //
  52. ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
  53. attMyAttributes.pwszContext = L"isatap";
  54. attMyAttributes.guidHelper = g_Ip6to4Guid;
  55. attMyAttributes.dwVersion = IP6TO4_VERSION;
  56. attMyAttributes.dwFlags = 0;
  57. attMyAttributes.pfnDumpFn = IsatapDump;
  58. attMyAttributes.ulNumTopCmds= 0;
  59. attMyAttributes.pTopCmds = NULL;
  60. attMyAttributes.ulNumGroups = g_ulIsatapNumGroups;
  61. attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_IsatapCmdGroups;
  62. dwErr = RegisterContext( &attMyAttributes );
  63. return dwErr;
  64. }
  65. DWORD
  66. IsatapHandleSetState(
  67. IN LPCWSTR pwszMachine,
  68. IN OUT LPWSTR *ppwcArguments,
  69. IN DWORD dwCurrentIndex,
  70. IN DWORD dwArgCount,
  71. IN DWORD dwFlags,
  72. IN LPCVOID pvData,
  73. OUT BOOL *pbDone
  74. )
  75. {
  76. DWORD dwErr = NO_ERROR;
  77. HKEY hKey = INVALID_HANDLE_VALUE;
  78. STATE stState = 0;
  79. BOOL bState = FALSE;
  80. TAG_TYPE pttTags[] = {{TOKEN_STATE, NS_REQ_ZERO, FALSE}};
  81. DWORD rgdwTagType[sizeof(pttTags) / sizeof(TAG_TYPE)];
  82. DWORD i;
  83. // Parse arguments
  84. dwErr = PreprocessCommand(g_hModule,
  85. ppwcArguments,
  86. dwCurrentIndex,
  87. dwArgCount,
  88. pttTags,
  89. sizeof(pttTags) / sizeof(TAG_TYPE),
  90. 1,
  91. sizeof(pttTags) / sizeof(TAG_TYPE),
  92. rgdwTagType );
  93. if (dwErr != NO_ERROR) {
  94. return dwErr;
  95. }
  96. for (i = 0; i < (dwArgCount - dwCurrentIndex); i++) {
  97. switch(rgdwTagType[i]) {
  98. case 0: // STATE
  99. dwErr = MatchEnumTag(NULL,
  100. ppwcArguments[dwCurrentIndex + i],
  101. NUM_TOKENS_IN_TABLE(rgtvEnums),
  102. rgtvEnums,
  103. (PDWORD) &stState);
  104. if (dwErr != NO_ERROR) {
  105. dwErr = ERROR_INVALID_PARAMETER;
  106. break;
  107. }
  108. bState = TRUE;
  109. break;
  110. default:
  111. dwErr = ERROR_INVALID_SYNTAX;
  112. break;
  113. }
  114. if (dwErr != NO_ERROR) {
  115. return dwErr;
  116. }
  117. }
  118. // Now do the sets
  119. dwErr = RegCreateKeyEx(HKEY_LOCAL_MACHINE, KEY_GLOBAL, 0, NULL, 0,
  120. KEY_READ | KEY_WRITE, NULL, &hKey, NULL);
  121. if (dwErr != NO_ERROR) {
  122. return dwErr;
  123. }
  124. if (bState) {
  125. dwErr = SetInteger(hKey, KEY_ISATAP_STATE, stState);
  126. if (dwErr != NO_ERROR) {
  127. RegCloseKey(hKey);
  128. return dwErr;
  129. }
  130. }
  131. RegCloseKey(hKey);
  132. Ip6to4PokeService();
  133. return ERROR_OKAY;
  134. }
  135. #define BM_ENABLE_RESOLUTION 0x01
  136. #define BM_ROUTER_NAME 0x02
  137. #define BM_RESOLUTION_INTERVAL 0x04
  138. DWORD
  139. IsatapHandleSetRouter(
  140. IN LPCWSTR pwszMachine,
  141. IN OUT LPWSTR *ppwcArguments,
  142. IN DWORD dwCurrentIndex,
  143. IN DWORD dwArgCount,
  144. IN DWORD dwFlags,
  145. IN LPCVOID pvData,
  146. OUT BOOL *pbDone
  147. )
  148. {
  149. DWORD dwErr = NO_ERROR;
  150. HKEY hGlobal;
  151. STATE stEnableResolution = 0;
  152. ULONG ulResolutionInterval = 0;
  153. PWCHAR pwszRouterName = NULL;
  154. DWORD dwBitVector = 0;
  155. TAG_TYPE pttTags[] = {{TOKEN_NAME, NS_REQ_ZERO, FALSE},
  156. {TOKEN_STATE, NS_REQ_ZERO, FALSE},
  157. {TOKEN_INTERVAL, NS_REQ_ZERO, FALSE}};
  158. DWORD rgdwTagType[sizeof(pttTags)/sizeof(TAG_TYPE)];
  159. DWORD i;
  160. // Parse arguments
  161. dwErr = PreprocessCommand(g_hModule,
  162. ppwcArguments,
  163. dwCurrentIndex,
  164. dwArgCount,
  165. pttTags,
  166. sizeof(pttTags)/sizeof(TAG_TYPE),
  167. 1,
  168. sizeof(pttTags)/sizeof(TAG_TYPE),
  169. rgdwTagType );
  170. if (dwErr isnot NO_ERROR) {
  171. return dwErr;
  172. }
  173. for (i=0; i<dwArgCount-dwCurrentIndex; i++) {
  174. switch(rgdwTagType[i]) {
  175. case 0: // ROUTERNAME
  176. pwszRouterName = ppwcArguments[dwCurrentIndex + i];
  177. dwBitVector |= BM_ROUTER_NAME;
  178. break;
  179. case 1: // STATE
  180. dwErr = MatchEnumTag(NULL,
  181. ppwcArguments[dwCurrentIndex + i],
  182. NUM_TOKENS_IN_TABLE(rgtvEnums),
  183. rgtvEnums,
  184. (PDWORD)&stEnableResolution);
  185. if (dwErr isnot NO_ERROR) {
  186. dwErr = ERROR_INVALID_PARAMETER;
  187. break;
  188. }
  189. dwBitVector |= BM_ENABLE_RESOLUTION;
  190. break;
  191. case 2: // INTERVAL
  192. ulResolutionInterval = wcstoul(ppwcArguments[dwCurrentIndex + i],
  193. NULL, 10);
  194. dwBitVector |= BM_RESOLUTION_INTERVAL;
  195. break;
  196. default:
  197. dwErr = ERROR_INVALID_SYNTAX;
  198. break;
  199. }
  200. if (dwErr isnot NO_ERROR) {
  201. return dwErr;
  202. }
  203. }
  204. // Now do the sets
  205. dwErr = RegCreateKeyEx(HKEY_LOCAL_MACHINE, KEY_GLOBAL, 0, NULL, 0,
  206. KEY_READ | KEY_WRITE, NULL, &hGlobal, NULL);
  207. if (dwErr != NO_ERROR) {
  208. return dwErr;
  209. }
  210. if (dwBitVector & BM_ENABLE_RESOLUTION) {
  211. dwErr = SetInteger(hGlobal, KEY_ENABLE_ISATAP_RESOLUTION,
  212. stEnableResolution);
  213. if (dwErr != NO_ERROR) {
  214. RegCloseKey(hGlobal);
  215. return dwErr;
  216. }
  217. }
  218. if (dwBitVector & BM_ROUTER_NAME) {
  219. dwErr = SetString(hGlobal, KEY_ISATAP_ROUTER_NAME, pwszRouterName);
  220. if (dwErr != NO_ERROR) {
  221. RegCloseKey(hGlobal);
  222. return dwErr;
  223. }
  224. }
  225. if (dwBitVector & BM_RESOLUTION_INTERVAL) {
  226. dwErr = SetInteger(hGlobal, KEY_ISATAP_RESOLUTION_INTERVAL,
  227. ulResolutionInterval);
  228. if (dwErr != NO_ERROR) {
  229. RegCloseKey(hGlobal);
  230. return dwErr;
  231. }
  232. }
  233. RegCloseKey(hGlobal);
  234. Ip6to4PokeService();
  235. return ERROR_OKAY;
  236. }
  237. DWORD
  238. ShowState(
  239. IN FORMAT Format
  240. )
  241. {
  242. HKEY hKey = INVALID_HANDLE_VALUE;
  243. STATE stState;
  244. (VOID) RegOpenKeyEx(
  245. HKEY_LOCAL_MACHINE, KEY_GLOBAL, 0, KEY_READ, &hKey);
  246. stState = GetInteger(hKey, KEY_ISATAP_STATE, VAL_DEFAULT);
  247. if (stState >= VAL_MAXIMUM) {
  248. stState = VAL_DEFAULT;
  249. }
  250. if (hKey != INVALID_HANDLE_VALUE) {
  251. RegCloseKey(hKey);
  252. }
  253. if (Format == FORMAT_DUMP) {
  254. if (stState != VAL_DEFAULT) {
  255. DisplayMessageT(DMP_ISATAP_SET_STATE, pwszStateString[stState]);
  256. }
  257. } else {
  258. DisplayMessage(g_hModule, MSG_ISATAP_STATE, pwszStateString[stState]);
  259. }
  260. return NO_ERROR;
  261. }
  262. DWORD
  263. IsatapHandleShowState(
  264. IN LPCWSTR pwszMachine,
  265. IN OUT LPWSTR *ppwcArguments,
  266. IN DWORD dwCurrentIndex,
  267. IN DWORD dwArgCount,
  268. IN DWORD dwFlags,
  269. IN LPCVOID pvData,
  270. OUT BOOL *pbDone
  271. )
  272. {
  273. return ShowState(FORMAT_NORMAL);
  274. }
  275. DWORD
  276. ShowRouterConfig(
  277. IN BOOL bDump
  278. )
  279. {
  280. DWORD dwErr = NO_ERROR;
  281. HKEY hGlobal;
  282. STATE stEnableResolution;
  283. ULONG ulResolutionInterval;
  284. WCHAR pwszRouterName[NI_MAXHOST];
  285. BOOL bHaveRouterName;
  286. dwErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KEY_GLOBAL, 0, KEY_READ,
  287. &hGlobal);
  288. if (dwErr != NO_ERROR) {
  289. hGlobal = INVALID_HANDLE_VALUE;
  290. dwErr = NO_ERROR;
  291. }
  292. stEnableResolution = GetInteger(hGlobal,
  293. KEY_ENABLE_ISATAP_RESOLUTION,
  294. VAL_DEFAULT);
  295. bHaveRouterName = GetString(hGlobal, KEY_ISATAP_ROUTER_NAME, pwszRouterName,
  296. NI_MAXHOST);
  297. ulResolutionInterval = GetInteger(hGlobal,
  298. KEY_ISATAP_RESOLUTION_INTERVAL,
  299. 0);
  300. if (hGlobal != INVALID_HANDLE_VALUE) {
  301. RegCloseKey(hGlobal);
  302. }
  303. if (bDump) {
  304. if (bHaveRouterName || (stEnableResolution != VAL_DEFAULT)
  305. || (ulResolutionInterval > 0)) {
  306. DisplayMessageT(DMP_ISATAP_SET_ROUTER);
  307. if (bHaveRouterName) {
  308. DisplayMessageT(DMP_STRING_ARG, TOKEN_NAME,
  309. pwszRouterName);
  310. }
  311. if (stEnableResolution != VAL_DEFAULT) {
  312. DisplayMessageT(DMP_STRING_ARG,
  313. TOKEN_STATE,
  314. pwszStateString[stEnableResolution]);
  315. }
  316. if (ulResolutionInterval > 0) {
  317. DisplayMessageT(DMP_INTEGER_ARG, TOKEN_INTERVAL,
  318. ulResolutionInterval);
  319. }
  320. DisplayMessage(g_hModule, MSG_NEWLINE);
  321. }
  322. } else {
  323. DisplayMessage(g_hModule, MSG_ROUTER_NAME);
  324. if (bHaveRouterName) {
  325. DisplayMessage(g_hModule, MSG_STRING, pwszRouterName);
  326. } else {
  327. DisplayMessage(g_hModule, MSG_STRING, TOKEN_VALUE_DEFAULT);
  328. }
  329. DisplayMessage(g_hModule, MSG_RESOLUTION_STATE,
  330. pwszStateString[stEnableResolution]);
  331. DisplayMessage(g_hModule, MSG_RESOLUTION_INTERVAL);
  332. if (ulResolutionInterval) {
  333. DisplayMessage(g_hModule, MSG_MINUTES, ulResolutionInterval);
  334. } else {
  335. DisplayMessage(g_hModule, MSG_STRING, TOKEN_VALUE_DEFAULT);
  336. }
  337. }
  338. return dwErr;
  339. }
  340. DWORD
  341. IsatapHandleShowRouter(
  342. IN LPCWSTR pwszMachine,
  343. IN OUT LPWSTR *ppwcArguments,
  344. IN DWORD dwCurrentIndex,
  345. IN DWORD dwArgCount,
  346. IN DWORD dwFlags,
  347. IN LPCVOID pvData,
  348. OUT BOOL *pbDone
  349. )
  350. {
  351. return ShowRouterConfig(FALSE);
  352. }
  353. DWORD
  354. WINAPI
  355. IsatapDump(
  356. IN LPCWSTR pwszRouter,
  357. IN OUT LPWSTR *ppwcArguments,
  358. IN DWORD dwArgCount,
  359. IN LPCVOID pvData
  360. )
  361. {
  362. DisplayMessage(g_hModule, DMP_ISATAP_HEADER);
  363. DisplayMessageT(DMP_ISATAP_PUSHD);
  364. ShowState(FORMAT_DUMP);
  365. ShowRouterConfig(TRUE);
  366. DisplayMessageT(DMP_ISATAP_POPD);
  367. DisplayMessage(g_hModule, DMP_ISATAP_FOOTER);
  368. return NO_ERROR;
  369. }