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.

691 lines
12 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. //
  226. // Chartype stuff.
  227. //
  228. // Be careful when using these as they evaluate their arg more than once.
  229. //
  230. #define RcIsUpper(c) (((c) >= L'A') && ((c) <= L'Z'))
  231. #define RcIsLower(c) (((c) >= L'a') && ((c) <= L'z'))
  232. #define RcIsAlpha(c) (RcIsUpper(c) || RcIsLower(c))
  233. #define RcIsSpace(c) (((c) == L' ') || (((c) >= L'\t') && ((c) <= L'\r')))
  234. #define RcToUpper(c) ((WCHAR)(RcIsLower(c) ? ((c)-(L'a'-L'A')) : (c)))
  235. #define DEBUG_PRINTF( x ) KdPrint( x );
  236. //define DEBUG_PRINTF( x )
  237. typedef enum {
  238. RcUnknown, RcFAT, RcFAT32, RcNTFS, RcCDFS
  239. } RcFileSystemType;
  240. //
  241. // Miscellaneous routines.
  242. //
  243. typedef
  244. BOOLEAN
  245. (*PENUMFILESCB) (
  246. IN LPCWSTR Directory,
  247. IN PFILE_BOTH_DIR_INFORMATION FileInfo,
  248. OUT NTSTATUS *Status,
  249. IN PVOID CallerContext
  250. );
  251. NTSTATUS
  252. RcEnumerateFiles(
  253. IN LPCWSTR OriginalPathSpec,
  254. IN LPCWSTR FullyQualifiedPathSpec,
  255. IN PENUMFILESCB Callback,
  256. IN PVOID CallerData
  257. );
  258. VOID
  259. RcFormat64BitIntForOutput(
  260. IN LONGLONG n,
  261. OUT LPWSTR Output,
  262. IN BOOLEAN RightJustify
  263. );
  264. // implemented in mbr.c
  265. NTSTATUS
  266. RcReadDiskSectors(
  267. IN HANDLE Handle,
  268. IN ULONG SectorNumber,
  269. IN ULONG SectorCount,
  270. IN ULONG BytesPerSector,
  271. IN OUT PVOID AlignedBuffer
  272. );
  273. NTSTATUS
  274. RcWriteDiskSectors(
  275. IN HANDLE Handle,
  276. IN ULONG SectorNumber,
  277. IN ULONG SectorCount,
  278. IN ULONG BytesPerSector,
  279. IN OUT PVOID AlignedBuffer
  280. );
  281. //
  282. // Set command helper routines
  283. //
  284. VOID
  285. RcSetSETCommandStatus(
  286. BOOLEAN bEnabled
  287. );
  288. BOOLEAN
  289. RcGetSETCommandStatus(
  290. VOID
  291. );
  292. //
  293. // Top-level routines for commands.
  294. //
  295. ULONG
  296. RcCmdSwitchDrives(
  297. IN WCHAR DriveLetter
  298. );
  299. ULONG
  300. RcCmdFdisk(
  301. IN PTOKENIZED_LINE TokenizedLine
  302. );
  303. ULONG
  304. RcCmdChdir(
  305. IN PTOKENIZED_LINE TokenizedLine
  306. );
  307. ULONG
  308. RcCmdType(
  309. IN PTOKENIZED_LINE TokenizedLine
  310. );
  311. ULONG
  312. RcCmdDir(
  313. IN PTOKENIZED_LINE TokenizedLine
  314. );
  315. ULONG
  316. RcCmdDelete(
  317. IN PTOKENIZED_LINE TokenizedLine
  318. );
  319. ULONG
  320. RcCmdSetFlags(
  321. IN PTOKENIZED_LINE TokenizedLine
  322. );
  323. ULONG
  324. RcCmdRename(
  325. IN PTOKENIZED_LINE TokenizedLine
  326. );
  327. ULONG
  328. RcCmdRepair(
  329. IN PTOKENIZED_LINE TokenizedLine
  330. );
  331. ULONG
  332. RcCmdVerifier(
  333. IN PTOKENIZED_LINE TokenizedLine
  334. );
  335. ULONG
  336. RcCmdBootCfg(
  337. IN PTOKENIZED_LINE TokenizedLine
  338. );
  339. ULONG
  340. RcCmdMakeDiskRaw(
  341. IN PTOKENIZED_LINE TokenizedLine
  342. );
  343. ULONG
  344. pRcExecuteBatchFile(
  345. IN PWSTR BatchFileName,
  346. IN PWSTR OutputFileName,
  347. IN BOOLEAN Quiet
  348. );
  349. ULONG
  350. RcCmdBatch(
  351. IN PTOKENIZED_LINE TokenizedLine
  352. );
  353. BOOLEAN
  354. RcCmdParseHelp(
  355. IN PTOKENIZED_LINE TokenizedLine,
  356. ULONG MsgId
  357. );
  358. ULONG
  359. RcCmdMkdir(
  360. IN PTOKENIZED_LINE TokenizedLine
  361. );
  362. ULONG
  363. RcCmdRmdir(
  364. IN PTOKENIZED_LINE TokenizedLine
  365. );
  366. ULONG
  367. RcCmdChkdsk(
  368. IN PTOKENIZED_LINE TokenizedLine
  369. );
  370. ULONG
  371. RcCmdFormat(
  372. IN PTOKENIZED_LINE TokenizedLine
  373. );
  374. ULONG
  375. RcCmdCls(
  376. IN PTOKENIZED_LINE TokenizedLine
  377. );
  378. ULONG
  379. RcCmdCopy(
  380. IN PTOKENIZED_LINE TokenizedLine
  381. );
  382. ULONG
  383. RcCmdExpand(
  384. IN PTOKENIZED_LINE TokenizedLine
  385. );
  386. ULONG
  387. RcCmdDriveMap(
  388. IN PTOKENIZED_LINE TokenizedLine
  389. );
  390. ULONG
  391. RcCmdLogon(
  392. IN PTOKENIZED_LINE TokenizedLine
  393. );
  394. ULONG
  395. RcCmdEnableService(
  396. IN PTOKENIZED_LINE TokenizedLine
  397. );
  398. ULONG
  399. RcCmdDisableService(
  400. IN PTOKENIZED_LINE TokenizedLine
  401. );
  402. ULONG
  403. RcCmdFixMBR(
  404. IN PTOKENIZED_LINE TokenizedLine
  405. );
  406. ULONG
  407. RcCmdFixBootSect(
  408. IN PTOKENIZED_LINE TokenizedLine
  409. );
  410. ULONG
  411. RcCmdSystemRoot(
  412. IN PTOKENIZED_LINE TokenizedLine
  413. );
  414. ULONG
  415. RcCmdHelpHelp(
  416. IN PTOKENIZED_LINE TokenizedLine
  417. );
  418. ULONG
  419. RcCmdAttrib(
  420. IN PTOKENIZED_LINE TokenizedLine
  421. );
  422. ULONG
  423. RcCmdNet(
  424. IN PTOKENIZED_LINE TokenizedLine
  425. );
  426. ULONG
  427. RcCmdListSvc(
  428. IN PTOKENIZED_LINE TokenizedLine
  429. );
  430. //
  431. // struct used to track NT installation information
  432. //
  433. typedef struct _NT_INSTALLATION {
  434. LIST_ENTRY ListEntry;
  435. ULONG InstallNumber;
  436. WCHAR DriveLetter;
  437. WCHAR Path[MAX_PATH];
  438. PDISK_REGION Region;
  439. WCHAR NtNameSelectedInstall[MAX_PATH];
  440. } NT_INSTALLATION, *PNT_INSTALLATION;
  441. //
  442. // redults from a full depth first scan of NT installations
  443. //
  444. extern LIST_ENTRY NtInstallsFullScan;
  445. extern ULONG InstallCountFullScan;
  446. //
  447. // The maximum directory depth we scan when searching for NT Installs
  448. //
  449. #define MAX_FULL_SCAN_RECURSION_DEPTH 10
  450. //
  451. // install that we're currently logged onto
  452. //
  453. extern PNT_INSTALLATION SelectedInstall;
  454. //
  455. // global to determine the selected NT install after login
  456. //
  457. extern PNT_INSTALLATION SelectedInstall;
  458. //
  459. // persistent data structure used for enumerating
  460. // the directory tree while looking for NT installs
  461. //
  462. typedef struct _RC_SCAN_RECURSION_DATA_ {
  463. PDISK_REGION NtPartitionRegion;
  464. ULONG RootDirLength;
  465. } RC_SCAN_RECURSION_DATA, *PRC_SCAN_RECURSION_DATA;
  466. typedef struct _RC_ALLOWED_DIRECTORY{
  467. BOOLEAN MustBeOnInstallDrive;
  468. PCWSTR Directory;
  469. } RC_ALLOWED_DIRECTORY, * PRC_ALLOWED_DIRECTORY;
  470. BOOL
  471. RcScanDisksForNTInstallsEnum(
  472. IN PPARTITIONED_DISK Disk,
  473. IN PDISK_REGION NtPartitionRegion,
  474. IN ULONG_PTR Context
  475. );
  476. VOID
  477. pRcCls(
  478. VOID
  479. );
  480. NTSTATUS
  481. RcIsFileOnRemovableMedia(
  482. IN PWSTR FileName, // must be an nt name
  483. OUT PBOOLEAN Result
  484. );
  485. NTSTATUS
  486. RcIsFileOnCDROM(
  487. IN PWSTR FileName // must be an nt name
  488. );
  489. NTSTATUS
  490. RcIsFileOnFloppy(
  491. IN PWSTR FileName // must be an nt name
  492. );
  493. void
  494. RcPurgeHistoryBuffer(
  495. void
  496. );
  497. BOOLEAN
  498. RcDoesPathHaveWildCards(
  499. IN LPCWSTR FullPath
  500. );
  501. BOOLEAN
  502. RcOpenSystemHive(
  503. VOID
  504. );
  505. BOOLEAN
  506. RcCloseSystemHive(
  507. VOID
  508. );
  509. BOOLEAN
  510. RcIsArc(
  511. VOID
  512. );
  513. NTSTATUS
  514. RcIsNetworkDrive(
  515. IN PWSTR NtFileName
  516. );
  517. NTSTATUS
  518. RcDoNetUse(
  519. PWSTR Share,
  520. PWSTR User,
  521. PWSTR Password,
  522. PWSTR Drive
  523. );
  524. NTSTATUS
  525. RcNetUnuse(
  526. PWSTR Drive
  527. );
  528. NTSTATUS
  529. PutRdrInKernelMode(
  530. VOID
  531. );
  532. VOID
  533. FORCEINLINE
  534. RcSecureZeroStringW(
  535. LPWSTR String
  536. )
  537. {
  538. if(String != NULL) {
  539. volatile WCHAR* sz;
  540. for(sz = (volatile WCHAR*) String; sz[0] != UNICODE_NULL; *sz++ = UNICODE_NULL);
  541. }
  542. }
  543. BOOLEAN
  544. FORCEINLINE
  545. RcPathBeginsWith(
  546. LPCWSTR Path,
  547. LPCWSTR Begin
  548. )
  549. {
  550. size_t Len = wcslen(Begin);
  551. return Len != 0 && 0 == _wcsnicmp(Path, Begin, Len) && (L'\\' == Begin[Len - 1] || L'\\' == Path[Len] || UNICODE_NULL == Path[Len]);
  552. }