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.

860 lines
19 KiB

  1. /*++
  2. Copyright (c) 1990-2000 Microsoft Corporation
  3. Module Name:
  4. fatsa.hxx
  5. Abstract:
  6. Author:
  7. Matthew Bradburn (mattbr) 1-Oct-93
  8. --*/
  9. #ifndef FATSUPERA_DEFN
  10. #define FATSUPERA_DEFN
  11. #include "hmem.hxx"
  12. #include "supera.hxx"
  13. #include "message.hxx"
  14. #if defined ( _AUTOCHECK_ )
  15. #define UFAT_EXPORT
  16. #elif defined ( _UFAT_MEMBER_ )
  17. #define UFAT_EXPORT __declspec(dllexport)
  18. #else
  19. #define UFAT_EXPORT __declspec(dllimport)
  20. #endif
  21. #define FAT_TYPE_UNKNOWN 42 // DRIVE where type wasn't known
  22. #define FAT_TYPE_FAT32 32 // FAT 32 with DWORD SCN and no EA
  23. #define FAT_TYPE_EAS_OKAY 16 // Fat drive with EA's OK
  24. //
  25. // Forward references
  26. //
  27. DECLARE_CLASS( ARRAY );
  28. DECLARE_CLASS( BITVECTOR );
  29. DECLARE_CLASS( EA_HEADER );
  30. DECLARE_CLASS( FAT );
  31. DECLARE_CLASS( FAT_SA );
  32. DECLARE_CLASS( FAT_DIRENT );
  33. DECLARE_CLASS( FATDIR );
  34. DECLARE_CLASS( GENERIC_STRING );
  35. DECLARE_CLASS( INTSTACK );
  36. DECLARE_CLASS( NUMBER_SET );
  37. DECLARE_CLASS( LOG_IO_DP_DRIVE );
  38. DECLARE_CLASS( MESSAGE );
  39. DECLARE_CLASS( ROOTDIR );
  40. DECLARE_CLASS( SORTED_LIST );
  41. DECLARE_CLASS( TIMEINFO );
  42. DECLARE_CLASS( WSTRING );
  43. DEFINE_POINTER_TYPES( PFATDIR );
  44. DECLARE_CLASS( FILEDIR );
  45. enum FATTYPE {
  46. SMALL, // 12 bit fat
  47. LARGE16, // 16 bit fat
  48. LARGE32, // 32 bit fat
  49. INVALID_FATTYPE // Invalid value
  50. };
  51. // the text for the oem data field
  52. #define OEMTEXT "MSDOS5.0"
  53. #define OEMTEXTLENGTH 8
  54. #define sigBOOTSTRAP (UCHAR)0x29 // boot strap signature
  55. CONST MaxSecPerClus = 128; // The maximum number of sectors per cluster.
  56. struct _EA_INFO {
  57. USHORT OwnHandle;
  58. ULONG PreceedingCn; // Clus num preceeding first cluster of set.
  59. ULONG LastCn; // The number of the last cluster in the set.
  60. STR OwnerFileName[14]; // Owner file name as found in ea set.
  61. UCHAR UsedCount; // Number of files using ea set.
  62. STR UserFileName[14]; // File name of ea set user.
  63. ULONG UserFileEntryCn; // Clus num of directory for file.
  64. ULONG UserFileEntryNumber; // Dirent num for file name.
  65. };
  66. DEFINE_TYPE( struct _EA_INFO, EA_INFO );
  67. struct _FATCHK_REPORT {
  68. ULONG HiddenEntriesCount;
  69. ULONG HiddenClusters;
  70. ULONG FileEntriesCount;
  71. ULONG FileClusters;
  72. ULONG DirEntriesCount;
  73. ULONG DirClusters;
  74. ULONG ExitStatus;
  75. };
  76. DEFINE_TYPE( struct _FATCHK_REPORT, FATCHK_REPORT );
  77. struct _CENSUS_REPORT {
  78. ULONG FileEntriesCount;
  79. ULONG FileClusters;
  80. ULONG DirEntriesCount;
  81. ULONG DirClusters;
  82. ULONG EaClusters;
  83. };
  84. DEFINE_TYPE( struct _CENSUS_REPORT, CENSUS_REPORT );
  85. class FAT_SA : public SUPERAREA {
  86. public:
  87. UFAT_EXPORT
  88. DECLARE_CONSTRUCTOR(FAT_SA);
  89. VIRTUAL
  90. UFAT_EXPORT
  91. ~FAT_SA(
  92. );
  93. VIRTUAL
  94. BOOLEAN
  95. Initialize(
  96. IN OUT PLOG_IO_DP_DRIVE Drive,
  97. IN OUT PMESSAGE Message,
  98. IN BOOLEAN Formatted
  99. ) PURE;
  100. VIRTUAL
  101. BOOLEAN
  102. Create(
  103. IN PCNUMBER_SET BadSectors,
  104. IN OUT PMESSAGE Message,
  105. IN PCWSTRING Label DEFAULT NULL,
  106. IN ULONG Flags DEFAULT FORMAT_BACKWARD_COMPATIBLE,
  107. IN ULONG ClusterSize DEFAULT 0,
  108. IN ULONG VirtualSize DEFAULT 0
  109. ) PURE;
  110. NONVIRTUAL
  111. BOOLEAN
  112. VerifyAndFix(
  113. IN FIX_LEVEL FixLevel,
  114. IN OUT PMESSAGE Message,
  115. IN ULONG Flags DEFAULT 0,
  116. IN ULONG LogFileSize DEFAULT 0,
  117. IN USHORT Algorithm DEFAULT 0,
  118. OUT PULONG ExitStatus DEFAULT NULL,
  119. IN PCWSTRING DriveLetter DEFAULT NULL
  120. );
  121. NONVIRTUAL
  122. BOOLEAN
  123. RecoverFile(
  124. IN PCWSTRING FullPathFileName,
  125. IN OUT PMESSAGE Message
  126. );
  127. NONVIRTUAL
  128. BOOLEAN
  129. Read(
  130. );
  131. VIRTUAL
  132. BOOLEAN
  133. Read(
  134. IN OUT PMESSAGE Message
  135. ) PURE;
  136. NONVIRTUAL
  137. BOOLEAN
  138. Write(
  139. );
  140. VIRTUAL
  141. BOOLEAN
  142. Write(
  143. IN OUT PMESSAGE Message
  144. ) PURE;
  145. NONVIRTUAL
  146. PFAT
  147. GetFat(
  148. );
  149. NONVIRTUAL
  150. PROOTDIR
  151. GetRootDir(
  152. );
  153. NONVIRTUAL
  154. PFILEDIR
  155. GetFileDir(
  156. );
  157. VIRTUAL
  158. USHORT
  159. QuerySectorsPerCluster(
  160. ) CONST PURE;
  161. VIRTUAL
  162. ULONG
  163. QuerySectorsPerFat(
  164. ) CONST PURE;
  165. VIRTUAL
  166. ULONG
  167. QueryVirtualSectors(
  168. ) CONST PURE;
  169. VIRTUAL
  170. USHORT
  171. QueryFats(
  172. ) CONST PURE;
  173. VIRTUAL
  174. PARTITION_SYSTEM_ID
  175. QuerySystemId(
  176. ) CONST PURE;
  177. VIRTUAL
  178. LBN
  179. QueryStartDataLbn(
  180. ) CONST PURE;
  181. VIRTUAL
  182. ULONG
  183. QueryClusterCount(
  184. ) CONST PURE;
  185. NONVIRTUAL
  186. SECTORCOUNT
  187. QueryFreeSectors(
  188. ) CONST;
  189. NONVIRTUAL
  190. FATTYPE
  191. QueryFatType(
  192. ) CONST;
  193. VIRTUAL
  194. BYTE
  195. QueryVolumeFlags(
  196. ) CONST PURE;
  197. VIRTUAL
  198. VOID
  199. SetVolumeFlags(
  200. BYTE Flags,
  201. BOOLEAN ResetFlags
  202. ) PURE;
  203. VIRTUAL
  204. BOOLEAN
  205. RecoverChain(
  206. IN OUT PULONG StartingCluster,
  207. OUT PBOOLEAN ChangesMade,
  208. IN ULONG EndingCluster DEFAULT 0,
  209. IN BOOLEAN Replace DEFAULT FALSE,
  210. IN PBITVECTOR FatBitMap DEFAULT NULL
  211. ) PURE;
  212. VIRTUAL
  213. BOOLEAN
  214. QueryLabel(
  215. OUT PWSTRING Label
  216. ) CONST;
  217. NONVIRTUAL
  218. BOOLEAN
  219. QueryLabel(
  220. OUT PWSTRING Label,
  221. OUT PTIMEINFO TimeInfo
  222. ) CONST;
  223. NONVIRTUAL
  224. BOOLEAN
  225. SetLabel(
  226. IN PCWSTRING NewLabel
  227. );
  228. NONVIRTUAL
  229. UFAT_EXPORT
  230. ULONG
  231. QueryFileStartingCluster(
  232. IN PCWSTRING FullPathFileName,
  233. OUT PHMEM Hmem DEFAULT NULL,
  234. OUT PPFATDIR Directory DEFAULT NULL,
  235. OUT PBOOLEAN DeleteDirectory DEFAULT NULL,
  236. OUT PFAT_DIRENT DirEntry DEFAULT NULL
  237. );
  238. NONVIRTUAL
  239. UFAT_EXPORT
  240. BOOLEAN
  241. QueryCensusAndRelocate (
  242. OUT PCENSUS_REPORT CensusReport DEFAULT NULL,
  243. IN OUT PINTSTACK RelocationStack DEFAULT NULL,
  244. OUT PBOOLEAN Relocated DEFAULT NULL
  245. );
  246. STATIC
  247. USHORT
  248. ComputeSecClus(
  249. IN SECTORCOUNT Sectors,
  250. IN FATTYPE FatType,
  251. #if defined(FE_SB) && defined(_X86_)
  252. IN MEDIA_TYPE MediaType,
  253. IN ULONG SectorSize = 512 /* FMR */
  254. #else
  255. IN MEDIA_TYPE MediaType
  256. #endif
  257. );
  258. VIRTUAL
  259. BOOLEAN
  260. IsFileContiguous(
  261. IN ULONG StartingCluster
  262. ) CONST PURE;
  263. VIRTUAL
  264. BOOLEAN
  265. IsCompressed(
  266. ) CONST PURE;
  267. VIRTUAL
  268. BOOLEAN
  269. ReadSectorZero(
  270. ) PURE;
  271. STATIC BOOLEAN
  272. FAT_SA::IsValidString(
  273. IN PCWSTRING String
  274. );
  275. //
  276. // These routines are used to access the CVF_EXTENSIONS on
  277. // FATDB, and they do the minimal thing on REAL_FAT.
  278. //
  279. VIRTUAL
  280. ULONG
  281. QuerySectorFromCluster(
  282. IN ULONG Cluster,
  283. OUT PUCHAR NumSectors DEFAULT NULL
  284. ) PURE;
  285. VIRTUAL
  286. BOOLEAN
  287. IsClusterCompressed(
  288. IN ULONG Cluster
  289. ) CONST PURE;
  290. VIRTUAL
  291. VOID
  292. SetClusterCompressed(
  293. IN ULONG Cluster,
  294. IN BOOLEAN fCompressed
  295. ) PURE;
  296. VIRTUAL
  297. UCHAR
  298. QuerySectorsRequiredForPlainData(
  299. IN ULONG Cluster
  300. ) PURE;
  301. //
  302. // These routines are used to manage the sector heap for
  303. // FATDB, and do nothing on REAL_FAT.
  304. //
  305. VIRTUAL
  306. BOOLEAN
  307. FreeClusterData(
  308. IN ULONG Cluster
  309. ) PURE;
  310. VIRTUAL
  311. BOOLEAN
  312. AllocateClusterData(
  313. IN ULONG Cluster,
  314. IN UCHAR NumSectors,
  315. IN BOOLEAN bCompressed,
  316. IN UCHAR PlainSize
  317. ) PURE;
  318. protected:
  319. PFAT _fat; // Pointer to FAT;
  320. FATTYPE _ft; // fat type required by area
  321. PROOTDIR _dir; // Pointer to Root directory
  322. PFILEDIR _dirF32; // Pointer to FAT 32 Root dir
  323. PHMEM _hmem_F32; // Pointer to the Fat 32 Root dir data
  324. VIRTUAL
  325. BOOLEAN
  326. SetBpb(
  327. ) PURE;
  328. VIRTUAL
  329. ULONG
  330. SecPerBoot(
  331. ) PURE;
  332. VIRTUAL
  333. VOLID
  334. QueryVolId(
  335. ) CONST PURE;
  336. VIRTUAL
  337. VOLID
  338. SetVolId(
  339. IN VOLID VolId
  340. ) PURE;
  341. VIRTUAL
  342. UCHAR
  343. QueryMediaByte(
  344. ) CONST PURE;
  345. VIRTUAL
  346. VOID
  347. SetMediaByte(
  348. UCHAR MediaByte
  349. ) PURE;
  350. NONVIRTUAL
  351. PARTITION_SYSTEM_ID
  352. ComputeSystemId(
  353. ) CONST;
  354. NONVIRTUAL
  355. FATTYPE
  356. ComputeFatType(
  357. ) CONST;
  358. NONVIRTUAL
  359. BOOLEAN
  360. RecoverOrphans(
  361. IN OUT PBITVECTOR FatBitMap,
  362. IN FIX_LEVEL FixLevel,
  363. IN OUT PMESSAGE Message,
  364. IN OUT PBOOLEAN NeedErrorsMessage,
  365. IN OUT PFATCHK_REPORT Report
  366. );
  367. VIRTUAL
  368. BOOLEAN
  369. VerifyFatExtensions(
  370. IN FIX_LEVEL FixLevel,
  371. IN PMESSAGE Message,
  372. IN PBOOLEAN pfNeedMsg
  373. ) PURE;
  374. VIRTUAL
  375. VOID
  376. SetFat32RootDirStartingCluster (
  377. IN ULONG RootCluster
  378. ) PURE;
  379. VIRTUAL
  380. ULONG
  381. QueryFat32RootDirStartingCluster (
  382. ) PURE;
  383. VIRTUAL
  384. BOOLEAN
  385. CheckSectorHeapAllocation(
  386. IN FIX_LEVEL FixLevel,
  387. IN PMESSAGE Message,
  388. IN PBOOLEAN pfNeedMsg
  389. ) PURE;
  390. private:
  391. NONVIRTUAL
  392. VOID
  393. Construct(
  394. );
  395. NONVIRTUAL
  396. VOID
  397. Destroy(
  398. );
  399. NONVIRTUAL
  400. ULONG
  401. ComputeRootEntries(
  402. ) CONST;
  403. NONVIRTUAL
  404. BOOLEAN
  405. PerformEaLogOperations(
  406. IN ULONG EaFileCn,
  407. IN FIX_LEVEL FixLevel,
  408. IN OUT PFATCHK_REPORT Report,
  409. IN OUT PMESSAGE Message,
  410. IN OUT PBOOLEAN NeedErrorsMessage
  411. );
  412. NONVIRTUAL
  413. PEA_INFO
  414. RecoverEaSets(
  415. IN ULONG EaFileCn,
  416. OUT PUSHORT NumEas,
  417. IN FIX_LEVEL FixLevel,
  418. IN OUT PFATCHK_REPORT Report,
  419. IN OUT PMESSAGE Message,
  420. IN OUT PBOOLEAN NeedErrorsMessage
  421. );
  422. NONVIRTUAL
  423. ULONG
  424. VerifyAndFixEaSet(
  425. IN ULONG PreceedingCluster,
  426. OUT PEA_INFO EaInfo,
  427. IN FIX_LEVEL FixLevel,
  428. IN OUT PFATCHK_REPORT Report,
  429. IN OUT PMESSAGE Message,
  430. IN OUT PBOOLEAN NeedErrorsMessage
  431. );
  432. NONVIRTUAL
  433. BOOLEAN
  434. VerifyAndFixFat32RootDir (
  435. IN OUT PBITVECTOR FatBitMap,
  436. IN PMESSAGE Message,
  437. IN OUT PFATCHK_REPORT Report,
  438. IN OUT PBOOLEAN NeedErrorMessage
  439. );
  440. NONVIRTUAL
  441. BOOLEAN
  442. RelocateNewFat32RootDirectory (
  443. IN OUT PFATCHK_REPORT Report,
  444. IN OUT PBITVECTOR FatBitMap,
  445. IN PMESSAGE Message
  446. );
  447. NONVIRTUAL
  448. BOOLEAN
  449. EaSort(
  450. IN OUT PEA_INFO EaInfos,
  451. IN ULONG NumEas,
  452. IN OUT PFATCHK_REPORT Report,
  453. IN OUT PMESSAGE Message,
  454. IN OUT PBOOLEAN NeedErrorsMessage
  455. );
  456. NONVIRTUAL
  457. BOOLEAN
  458. RebuildEaHeader(
  459. IN OUT PULONG StartingCluster,
  460. IN OUT PEA_INFO EaInfos,
  461. IN ULONG NumEas,
  462. IN OUT PMEM EaHeaderMem,
  463. OUT PEA_HEADER EaHeader,
  464. IN OUT PBITVECTOR FatBitMap,
  465. IN FIX_LEVEL FixLevel,
  466. IN OUT PFATCHK_REPORT Report,
  467. IN OUT PMESSAGE Message,
  468. IN OUT PBOOLEAN NeedErrorsMessage
  469. );
  470. NONVIRTUAL
  471. BOOLEAN
  472. WalkDirectoryTree(
  473. IN OUT PEA_INFO EaInfos,
  474. IN OUT PUSHORT NumEas,
  475. IN OUT PBITVECTOR FatBitMap,
  476. OUT PFATCHK_REPORT Report,
  477. IN FIX_LEVEL FixLevel,
  478. IN BOOLEAN RecoverAlloc,
  479. IN OUT PMESSAGE Message,
  480. IN BOOLEAN Verbose,
  481. IN OUT PBOOLEAN NeedErrorsMessage
  482. );
  483. NONVIRTUAL
  484. BOOLEAN
  485. ValidateDirent(
  486. IN OUT PFAT_DIRENT Dirent,
  487. IN PCWSTRING FilePath,
  488. IN FIX_LEVEL FixLevel,
  489. IN BOOLEAN RecoverAlloc,
  490. IN OUT PFATCHK_REPORT Report,
  491. IN OUT PMESSAGE Message,
  492. IN OUT PBOOLEAN NeedErrorsMessage,
  493. IN OUT PBITVECTOR FatBitMap,
  494. OUT PBOOLEAN CrossLinkDetected,
  495. OUT PULONG CrossLinkPreviousCluster
  496. );
  497. NONVIRTUAL
  498. BOOLEAN
  499. EraseEaHandle(
  500. IN PEA_INFO EaInfos,
  501. IN USHORT NumEasLeft,
  502. IN USHORT NumEas,
  503. IN FIX_LEVEL FixLevel,
  504. IN OUT PMESSAGE Message
  505. );
  506. NONVIRTUAL
  507. BOOLEAN
  508. ValidateEaHandle(
  509. IN OUT PFAT_DIRENT Dirent,
  510. IN ULONG DirClusterNumber,
  511. IN ULONG DirEntryNumber,
  512. IN OUT PEA_INFO EaInfos,
  513. IN USHORT NumEas,
  514. IN PCWSTRING FilePath,
  515. IN FIX_LEVEL FixLevel,
  516. IN OUT PFATCHK_REPORT Report,
  517. IN OUT PMESSAGE Message,
  518. IN OUT PBOOLEAN NeedErrorsMessage
  519. );
  520. NONVIRTUAL
  521. BOOLEAN
  522. CopyClusters(
  523. IN ULONG SourceChain,
  524. OUT PULONG DestChain,
  525. IN OUT PBITVECTOR FatBitMap,
  526. IN FIX_LEVEL FixLevel,
  527. IN OUT PMESSAGE Message
  528. );
  529. NONVIRTUAL
  530. BOOLEAN
  531. PurgeEaFile(
  532. IN PEA_INFO EaInfos,
  533. IN USHORT NumEas,
  534. IN OUT PBITVECTOR FatBitMap,
  535. IN FIX_LEVEL FixLevel,
  536. IN OUT PFATCHK_REPORT Report,
  537. IN OUT PMESSAGE Message,
  538. IN OUT PBOOLEAN NeedErrorsMessage
  539. );
  540. NONVIRTUAL
  541. BOOLEAN
  542. InitRelocationList(
  543. IN OUT PINTSTACK RelocationStack,
  544. IN OUT PULONG RelocatedChain,
  545. IN OUT PSORTED_LIST ClustersToRelocate,
  546. OUT PBOOLEAN Relocated
  547. );
  548. NONVIRTUAL
  549. BOOLEAN
  550. RelocateFirstCluster(
  551. IN OUT PFAT_DIRENT Dirent
  552. );
  553. NONVIRTUAL
  554. ULONG
  555. RelocateOneCluster(
  556. IN ULONG Cluster,
  557. IN ULONG Previous
  558. );
  559. NONVIRTUAL
  560. BOOLEAN
  561. DoDirectoryCensusAndRelocation(
  562. IN OUT PFATDIR Directory,
  563. IN OUT PCENSUS_REPORT CensusReport,
  564. IN OUT PSORTED_LIST ClustersToRelocate,
  565. IN OUT PULONG RelocatedChain,
  566. OUT PBOOLEAN Relocated
  567. );
  568. NONVIRTUAL
  569. BOOLEAN
  570. DoVolumeCensusAndRelocation(
  571. IN OUT PCENSUS_REPORT CensusReport,
  572. IN OUT PSORTED_LIST ClustersToRelocate,
  573. IN OUT PULONG RelocatedChain,
  574. OUT PBOOLEAN Relocated
  575. );
  576. NONVIRTUAL
  577. BOOLEAN
  578. RecoverFreeSpace(
  579. IN OUT PFATCHK_REPORT Report,
  580. IN OUT PMESSAGE Message
  581. );
  582. NONVIRTUAL
  583. BOOLEAN
  584. AllocSectorsForChain(
  585. IN ULONG StartingCluster
  586. );
  587. };
  588. INLINE
  589. BOOLEAN
  590. FAT_SA::Read(
  591. )
  592. /*++
  593. Routine Description:
  594. This routine simply calls the other read with the default message
  595. object.
  596. Arguments:
  597. None.
  598. Return Value:
  599. FALSE - Failure.
  600. TRUE - Success.
  601. --*/
  602. {
  603. MESSAGE msg;
  604. return Read(&msg);
  605. }
  606. INLINE
  607. BOOLEAN
  608. FAT_SA::Write(
  609. )
  610. /*++
  611. Routine Description:
  612. This routine simply calls the other write with the default message
  613. object.
  614. Arguments:
  615. None.
  616. Return Value:
  617. FALSE - Failure.
  618. TRUE - Success.
  619. --*/
  620. {
  621. MESSAGE msg;
  622. return Write(&msg);
  623. }
  624. INLINE
  625. PFAT
  626. FAT_SA::GetFat(
  627. )
  628. /*++
  629. Routine Description:
  630. This routine returns a pointer to the FAT maintained by this class.
  631. It is not necessary to read or write this FAT since it shares memory
  632. with the FAT_SA class and thus performing FAT_SA::Read will read in
  633. the FAT and performing FAT_SA::Write will write the FAT. Additionally,
  634. performing a FAT_SA::Write will duplicate the information in the local
  635. FAT object to all other FATs on the disk.
  636. Arguments:
  637. None.
  638. Return Value:
  639. A pointer to the FAT super area's FAT.
  640. --*/
  641. {
  642. return _fat;
  643. }
  644. INLINE
  645. PROOTDIR
  646. FAT_SA::GetRootDir(
  647. )
  648. /*++
  649. Routine Description:
  650. This routine return a pointer to the FAT super area's root directory.
  651. The memory of this root directory is shared with the FAT super area.
  652. Hence, as with 'GetFat' it is not necessary to read or write the
  653. root directory returned by this routine if a FAT_SA::Read or
  654. FAT_SA::Write is being performed respecively.
  655. Arguments:
  656. None.
  657. Return Value:
  658. A pointer to the FAT super area's root directory.
  659. --*/
  660. {
  661. return _dir;
  662. }
  663. INLINE
  664. PFILEDIR
  665. FAT_SA::GetFileDir(
  666. )
  667. /*++
  668. Routine Description:
  669. This routine return a pointer to the FAT super area's root directory.
  670. The memory of this root directory is shared with the FAT super area.
  671. Hence, as with 'GetFat' it is not necessary to read or write the
  672. root directory returned by this routine if a FAT_SA::Read or
  673. FAT_SA::Write is being performed respecively.
  674. NOTE: Compiler refused to let me return either type FILE or ROOT DIR
  675. as a FATDIR from GetRootDir() above, so I made this parallel function,
  676. and coded a call to both in the FAT 32 cases that called GetRootDir.
  677. Arguments:
  678. None.
  679. Return Value:
  680. A pointer to the FAT 32 super area's FILEDIR type root directory.
  681. --*/
  682. {
  683. return _dirF32;
  684. }
  685. extern BOOLEAN
  686. IsValidString(
  687. IN PCWSTRING String
  688. );
  689. #endif // FATSUPERA_DEFN
  690. extern VOID
  691. dofmsg(
  692. IN PMESSAGE Message,
  693. IN OUT PBOOLEAN NeedErrorsMessage
  694. );