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.

674 lines
10 KiB

  1. /*++
  2. Copyright (c) 1998 Microsoft Corporation
  3. Module Name:
  4. cmdcons.h
  5. Abstract:
  6. This is the main include file for the command console.
  7. Author:
  8. Wesley Witt (wesw) 21-Oct-1998
  9. Revision History:
  10. --*/
  11. #include <spprecmp.h>
  12. #include <spcmdcon.h>
  13. #include "msg1.h"
  14. #define BUFFERSIZE (sizeof(KEY_VALUE_PARTIAL_INFORMATION)+256)
  15. //
  16. // Define maximum line length, which is the number of Unicode chars
  17. // we will allow the user to type on a single line of input.
  18. //
  19. #define RC_MAX_LINE_LEN 500
  20. //
  21. // Variables and other stuff from setupdd.sys, passed to us
  22. // in CommandConsole().
  23. //
  24. extern PCMDCON_BLOCK _CmdConsBlock;
  25. //
  26. // Base address where driver is loaded. Used to get messages
  27. // from resources.
  28. //
  29. extern PVOID ImageBase;
  30. //
  31. // indicates we're running in batch mode
  32. //
  33. extern ULONG InBatchMode;
  34. extern HANDLE OutputFileHandle;
  35. extern BOOLEAN RedirectToNULL;
  36. extern LARGE_INTEGER OutputFileOffset;
  37. extern WCHAR _CurDrive;
  38. extern LPWSTR _CurDirs[26];
  39. //
  40. // flags to override security
  41. //
  42. extern BOOLEAN AllowWildCards;
  43. extern BOOLEAN AllowAllPaths;
  44. extern BOOLEAN NoCopyPrompt;
  45. extern BOOLEAN AllowRemovableMedia;
  46. //
  47. // Console routines.
  48. //
  49. VOID
  50. RcConsoleInit(
  51. VOID
  52. );
  53. VOID
  54. RcConsoleTerminate(
  55. VOID
  56. );
  57. #define RcLineIn(_b,_m) _RcLineIn(_b,_m,FALSE,FALSE)
  58. #define RcLineInDefault(_b,_m) _RcLineIn(_b,_m,FALSE,TRUE)
  59. #define RcPasswordIn(_b,_m) _RcLineIn(_b,_m,TRUE,FALSE)
  60. unsigned
  61. _RcLineIn(
  62. OUT PWCHAR Buffer,
  63. IN unsigned MaxLineLen,
  64. IN BOOLEAN PasswordProtect,
  65. IN BOOLEAN UseBuffer
  66. );
  67. BOOLEAN
  68. RcRawTextOut(
  69. IN LPCWSTR Text,
  70. IN LONG Length
  71. );
  72. BOOLEAN
  73. RcTextOut(
  74. IN LPCWSTR Text
  75. );
  76. VOID
  77. pRcEnableMoreMode(
  78. VOID
  79. );
  80. VOID
  81. pRcDisableMoreMode(
  82. VOID
  83. );
  84. //
  85. // Message resource manipulation.
  86. //
  87. VOID
  88. vRcMessageOut(
  89. IN ULONG MessageId,
  90. IN va_list *arglist
  91. );
  92. VOID
  93. RcMessageOut(
  94. IN ULONG MessageId,
  95. ...
  96. );
  97. VOID
  98. RcNtError(
  99. IN NTSTATUS Status,
  100. IN ULONG FallbackMessageId,
  101. ...
  102. );
  103. ULONG
  104. RcFormatDateTime(
  105. IN PLARGE_INTEGER Time,
  106. OUT LPWSTR Output
  107. );
  108. //
  109. // Current directory stuff.
  110. //
  111. VOID
  112. RcInitializeCurrentDirectories(
  113. VOID
  114. );
  115. VOID
  116. RcTerminateCurrentDirectories(
  117. VOID
  118. );
  119. VOID
  120. RcAddDrive(
  121. WCHAR DriveLetter
  122. );
  123. VOID
  124. RcRemoveDrive(
  125. WCHAR DriveLetter
  126. );
  127. BOOLEAN
  128. RcFormFullPath(
  129. IN LPCWSTR PartialPath,
  130. OUT LPWSTR FullPath,
  131. IN BOOLEAN NtPath
  132. );
  133. BOOLEAN
  134. RcIsPathNameAllowed(
  135. IN LPCWSTR FullPath,
  136. IN BOOLEAN RemovableMediaOk,
  137. IN BOOLEAN Mkdir
  138. );
  139. BOOLEAN
  140. RcGetNTFileName(
  141. IN LPCWSTR DosPath,
  142. IN LPCWSTR NTPath
  143. );
  144. NTSTATUS
  145. GetDriveLetterLinkTarget(
  146. IN PWSTR SourceNameStr,
  147. OUT PWSTR *LinkTarget
  148. );
  149. VOID
  150. RcGetCurrentDriveAndDir(
  151. OUT LPWSTR Output
  152. );
  153. WCHAR
  154. RcGetCurrentDriveLetter(
  155. VOID
  156. );
  157. BOOLEAN
  158. RcIsDriveApparentlyValid(
  159. IN WCHAR DriveLetter
  160. );
  161. NTSTATUS
  162. pRcGetDeviceInfo(
  163. IN PWSTR FileName, // must be an nt name
  164. IN PFILE_FS_DEVICE_INFORMATION DeviceInfo
  165. );
  166. //
  167. // Line parsing/tokenizing stuff.
  168. //
  169. typedef struct _LINE_TOKEN {
  170. struct _LINE_TOKEN *Next;
  171. LPWSTR String;
  172. } LINE_TOKEN, *PLINE_TOKEN;
  173. typedef struct _TOKENIZED_LINE {
  174. //
  175. // Total number of tokens.
  176. //
  177. unsigned TokenCount;
  178. PLINE_TOKEN Tokens;
  179. } TOKENIZED_LINE, *PTOKENIZED_LINE;
  180. PTOKENIZED_LINE
  181. RcTokenizeLine(
  182. IN LPWSTR Line
  183. );
  184. VOID
  185. RcFreeTokenizedLine(
  186. IN OUT PTOKENIZED_LINE *TokenizedLine
  187. );
  188. //
  189. // Command dispatching.
  190. //
  191. typedef
  192. ULONG
  193. (*PRC_CMD_ROUTINE) (
  194. IN PTOKENIZED_LINE TokenizedLine
  195. );
  196. typedef struct _RC_CMD {
  197. //
  198. // Name of command.
  199. //
  200. LPCWSTR Name;
  201. //
  202. // Routine that carries out the command.
  203. //
  204. PRC_CMD_ROUTINE Routine;
  205. //
  206. // Arg counts. Mandatory arg count specifies the minimum number
  207. // of args that MUST be present (not including the command itself).
  208. // MaximumArgCount specifies the maximum number that are allowed
  209. // to be present. -1 means any number are allowed, and the command
  210. // itself validates the arg count.
  211. //
  212. unsigned MinimumArgCount;
  213. unsigned MaximumArgCount;
  214. unsigned Hidden;
  215. BOOLEAN Enabled;
  216. } RC_CMD, *PRC_CMD;
  217. ULONG
  218. RcDispatchCommand(
  219. IN PTOKENIZED_LINE TokenizedLine
  220. );
  221. BOOLEAN
  222. RcDisableCommand(
  223. IN PRC_CMD_ROUTINE CmdToDisable
  224. );
  225. VOID
  226. RcHideNetCommands(
  227. VOID
  228. );
  229. //
  230. // Chartype stuff.
  231. //
  232. // Be careful when using these as they evaluate their arg more than once.
  233. //
  234. #define RcIsUpper(c) (((c) >= L'A') && ((c) <= L'Z'))
  235. #define RcIsLower(c) (((c) >= L'a') && ((c) <= L'z'))
  236. #define RcIsAlpha(c) (RcIsUpper(c) || RcIsLower(c))
  237. #define RcIsSpace(c) (((c) == L' ') || (((c) >= L'\t') && ((c) <= L'\r')))
  238. #define RcToUpper(c) ((WCHAR)(RcIsLower(c) ? ((c)-(L'a'-L'A')) : (c)))
  239. #define DEBUG_PRINTF( x ) KdPrint( x );
  240. //define DEBUG_PRINTF( x )
  241. typedef enum {
  242. RcUnknown, RcFAT, RcFAT32, RcNTFS, RcCDFS
  243. } RcFileSystemType;
  244. //
  245. // Miscellaneous routines.
  246. //
  247. typedef
  248. BOOLEAN
  249. (*PENUMFILESCB) (
  250. IN LPCWSTR Directory,
  251. IN PFILE_BOTH_DIR_INFORMATION FileInfo,
  252. OUT NTSTATUS *Status,
  253. IN PVOID CallerContext
  254. );
  255. NTSTATUS
  256. RcEnumerateFiles(
  257. IN LPCWSTR OriginalPathSpec,
  258. IN LPCWSTR FullyQualifiedPathSpec,
  259. IN PENUMFILESCB Callback,
  260. IN PVOID CallerData
  261. );
  262. VOID
  263. RcFormat64BitIntForOutput(
  264. IN LONGLONG n,
  265. OUT LPWSTR Output,
  266. IN BOOLEAN RightJustify
  267. );
  268. // implemented in mbr.c
  269. NTSTATUS
  270. RcReadDiskSectors(
  271. IN HANDLE Handle,
  272. IN ULONG SectorNumber,
  273. IN ULONG SectorCount,
  274. IN ULONG BytesPerSector,
  275. IN OUT PVOID AlignedBuffer
  276. );
  277. NTSTATUS
  278. RcWriteDiskSectors(
  279. IN HANDLE Handle,
  280. IN ULONG SectorNumber,
  281. IN ULONG SectorCount,
  282. IN ULONG BytesPerSector,
  283. IN OUT PVOID AlignedBuffer
  284. );
  285. //
  286. // Set command helper routines
  287. //
  288. VOID
  289. RcSetSETCommandStatus(
  290. BOOLEAN bEnabled
  291. );
  292. BOOLEAN
  293. RcGetSETCommandStatus(
  294. VOID
  295. );
  296. //
  297. // Top-level routines for commands.
  298. //
  299. ULONG
  300. RcCmdSwitchDrives(
  301. IN WCHAR DriveLetter
  302. );
  303. ULONG
  304. RcCmdFdisk(
  305. IN PTOKENIZED_LINE TokenizedLine
  306. );
  307. ULONG
  308. RcCmdChdir(
  309. IN PTOKENIZED_LINE TokenizedLine
  310. );
  311. ULONG
  312. RcCmdType(
  313. IN PTOKENIZED_LINE TokenizedLine
  314. );
  315. ULONG
  316. RcCmdDir(
  317. IN PTOKENIZED_LINE TokenizedLine
  318. );
  319. ULONG
  320. RcCmdDelete(
  321. IN PTOKENIZED_LINE TokenizedLine
  322. );
  323. ULONG
  324. RcCmdSetFlags(
  325. IN PTOKENIZED_LINE TokenizedLine
  326. );
  327. ULONG
  328. RcCmdRename(
  329. IN PTOKENIZED_LINE TokenizedLine
  330. );
  331. ULONG
  332. RcCmdRepair(
  333. IN PTOKENIZED_LINE TokenizedLine
  334. );
  335. ULONG
  336. RcCmdVerifier(
  337. IN PTOKENIZED_LINE TokenizedLine
  338. );
  339. ULONG
  340. RcCmdBootCfg(
  341. IN PTOKENIZED_LINE TokenizedLine
  342. );
  343. ULONG
  344. RcCmdMakeDiskRaw(
  345. IN PTOKENIZED_LINE TokenizedLine
  346. );
  347. BOOLEAN
  348. pRcExecuteBatchFile(
  349. IN PWSTR BatchFileName,
  350. IN PWSTR OutputFileName,
  351. IN BOOLEAN Quiet
  352. );
  353. ULONG
  354. RcCmdBatch(
  355. IN PTOKENIZED_LINE TokenizedLine
  356. );
  357. BOOLEAN
  358. RcCmdParseHelp(
  359. IN PTOKENIZED_LINE TokenizedLine,
  360. ULONG MsgId
  361. );
  362. ULONG
  363. RcCmdMkdir(
  364. IN PTOKENIZED_LINE TokenizedLine
  365. );
  366. ULONG
  367. RcCmdRmdir(
  368. IN PTOKENIZED_LINE TokenizedLine
  369. );
  370. ULONG
  371. RcCmdChkdsk(
  372. IN PTOKENIZED_LINE TokenizedLine
  373. );
  374. ULONG
  375. RcCmdFormat(
  376. IN PTOKENIZED_LINE TokenizedLine
  377. );
  378. ULONG
  379. RcCmdCls(
  380. IN PTOKENIZED_LINE TokenizedLine
  381. );
  382. ULONG
  383. RcCmdCopy(
  384. IN PTOKENIZED_LINE TokenizedLine
  385. );
  386. ULONG
  387. RcCmdExpand(
  388. IN PTOKENIZED_LINE TokenizedLine
  389. );
  390. ULONG
  391. RcCmdDriveMap(
  392. IN PTOKENIZED_LINE TokenizedLine
  393. );
  394. ULONG
  395. RcCmdLogon(
  396. IN PTOKENIZED_LINE TokenizedLine
  397. );
  398. ULONG
  399. RcCmdEnableService(
  400. IN PTOKENIZED_LINE TokenizedLine
  401. );
  402. ULONG
  403. RcCmdDisableService(
  404. IN PTOKENIZED_LINE TokenizedLine
  405. );
  406. ULONG
  407. RcCmdFixMBR(
  408. IN PTOKENIZED_LINE TokenizedLine
  409. );
  410. ULONG
  411. RcCmdFixBootSect(
  412. IN PTOKENIZED_LINE TokenizedLine
  413. );
  414. ULONG
  415. RcCmdSystemRoot(
  416. IN PTOKENIZED_LINE TokenizedLine
  417. );
  418. ULONG
  419. RcCmdHelpHelp(
  420. IN PTOKENIZED_LINE TokenizedLine
  421. );
  422. ULONG
  423. RcCmdAttrib(
  424. IN PTOKENIZED_LINE TokenizedLine
  425. );
  426. ULONG
  427. RcCmdNet(
  428. IN PTOKENIZED_LINE TokenizedLine
  429. );
  430. ULONG
  431. RcCmdListSvc(
  432. IN PTOKENIZED_LINE TokenizedLine
  433. );
  434. //
  435. // struct used to track NT installation information
  436. //
  437. typedef struct _NT_INSTALLATION {
  438. LIST_ENTRY ListEntry;
  439. ULONG InstallNumber;
  440. WCHAR DriveLetter;
  441. WCHAR Path[MAX_PATH];
  442. PDISK_REGION Region;
  443. } NT_INSTALLATION, *PNT_INSTALLATION;
  444. //
  445. // redults from a full depth first scan of NT installations
  446. //
  447. extern LIST_ENTRY NtInstallsFullScan;
  448. extern ULONG InstallCountFullScan;
  449. //
  450. // The maximum directory depth we scan when searching for NT Installs
  451. //
  452. #define MAX_FULL_SCAN_RECURSION_DEPTH 10
  453. //
  454. // install that we're currently logged onto
  455. //
  456. extern PNT_INSTALLATION SelectedInstall;
  457. //
  458. // global to determine the selected NT install after login
  459. //
  460. extern PNT_INSTALLATION SelectedInstall;
  461. //
  462. // persistent data structure used for enumerating
  463. // the directory tree while looking for NT installs
  464. //
  465. typedef struct _RC_SCAN_RECURSION_DATA_ {
  466. PDISK_REGION NtPartitionRegion;
  467. ULONG RootDirLength;
  468. } RC_SCAN_RECURSION_DATA, *PRC_SCAN_RECURSION_DATA;
  469. typedef struct _RC_ALLOWED_DIRECTORY{
  470. BOOLEAN MustBeOnInstallDrive;
  471. PCWSTR Directory;
  472. } RC_ALLOWED_DIRECTORY, * PRC_ALLOWED_DIRECTORY;
  473. BOOL
  474. RcScanDisksForNTInstallsEnum(
  475. IN PPARTITIONED_DISK Disk,
  476. IN PDISK_REGION NtPartitionRegion,
  477. IN ULONG_PTR Context
  478. );
  479. VOID
  480. pRcCls(
  481. VOID
  482. );
  483. NTSTATUS
  484. RcIsFileOnRemovableMedia(
  485. IN PWSTR FileName // must be an nt name
  486. );
  487. NTSTATUS
  488. RcIsFileOnCDROM(
  489. IN PWSTR FileName // must be an nt name
  490. );
  491. NTSTATUS
  492. RcIsFileOnFloppy(
  493. IN PWSTR FileName // must be an nt name
  494. );
  495. void
  496. RcPurgeHistoryBuffer(
  497. void
  498. );
  499. BOOLEAN
  500. RcDoesPathHaveWildCards(
  501. IN LPCWSTR FullPath
  502. );
  503. BOOLEAN
  504. RcOpenSystemHive(
  505. VOID
  506. );
  507. BOOLEAN
  508. RcCloseSystemHive(
  509. VOID
  510. );
  511. BOOLEAN
  512. RcIsArc(
  513. VOID
  514. );
  515. NTSTATUS
  516. RcIsNetworkDrive(
  517. IN PWSTR NtFileName
  518. );
  519. NTSTATUS
  520. RcDoNetUse(
  521. PWSTR Share,
  522. PWSTR User,
  523. PWSTR Password,
  524. PWSTR Drive
  525. );
  526. NTSTATUS
  527. RcNetUnuse(
  528. PWSTR Drive
  529. );
  530. NTSTATUS
  531. PutRdrInKernelMode(
  532. VOID
  533. );