/**************************************************************************************************

FILENAME: FastFat2.h

COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.

DESCRIPTION:
        Fat file sytem prototypes.

**************************************************************************************************/

// Define some special character codes used in FAT directory entries
#define Deleted				0xe5			//The code placed in the first byte of the filename on a deleted fat entry.
#define DirPointer			0x2e			//The code placed in the first byte of the filename on a Directory Pointer fat entry.

//The attribute field of a FAT entry can be set to any of the following (which identifies what kind of entry it is):
#define EndOfDirectory		0x0
#define LabelAttribute		0x8
#define DirAttribute		0x10
#define UnicodeAttribute	0x0F

#define MaxDirs 128						//We cannnot have a directory tree more than 128 directories deep.

//Flags for which types of FAT entries are kept by StripDir (see StripDir() below).
#define KEEP_DIRECTORIES	0x01
#define KEEP_FILES			0x02
#define KEEP_DELDIRECTORIES 0x04
#define KEEP_DELFILES       0x08

typedef struct {
	HANDLE FatTreeHandles[MaxDirs];			//Handles to each FAT directory in our chain
	DIRSTRUC* pCurrentFatDir;				//Pointer to the beginning of the current FAT directory
	DIRSTRUC* pCurrentFatDirEnd;			//Pointer to the end of the current FAT directory
	DIRSTRUC* pCurrentEntry;				//Pointer to the current entry in the current FAT directory
	DWORD dwCurrentEntryNum;				//Number of the current entry in the current FAT directory
	DWORD CurrentEntryPos[MaxDirs];			//Number of the current entry in each level of the FAT chain
	TCHAR DirName[MaxDirs][MAX_PATH];		//Name of each directory at each level of our FAT chain
	DWORD dwCurrentLevel;					//Which level we're at - 0 is root.
	BOOL bMovedUp;							//If we moved up a directory, files have already been processed at this level.
	BOOL bProcessingFiles;					//Whether or not we are processing files at this level (as compared to directories).
	LONGLONG llCurrentFatDirLcn[MaxDirs];	//LCN of the current FAT Directory
} TREE_DATA;

//extern  TREE_DATA TreeData;

//
// Routine Declarations
//

//Gets data from the boot sector of a FAT drive.  Initializes NextFatFile.
BOOLEAN
GetFatBootSector(
        );

//Gets one at a time files on a FAT drive by directly traversing a directory tree.
BOOL
NextFatFile(
        );

//Strips a directory of unused/unwanted entries.  Called by NextFatFile.
BOOL
StripDir(
	TREE_DATA* pTreeData,
	DWORD dwFlags
	);

//Reads a new directory from the disk.  Called by NextFatFile.
BOOL
LoadDir(
	TREE_DATA* pTreeData
	);

//Gets the unicode name for a file from its directory.  Called by NextFatFile.
BOOL
GetUnicodeName(
	TREE_DATA* pTreeData,
	VString &unicodeName
	);

//Gets the full unicode path for a file by traversing up it's directory tree.  Called by NextFatFile.
BOOL
GetUnicodePath(
	IN TREE_DATA* pTreeData,
	OUT VString &unicodePath
	);