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

FILENAME: DfrgFat.h

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

DESCRIPTION:
        This contains the prototypes for routines in the FAT file system
        defragmentation central module.

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

// If ESI_MESSAGE_WINDOW is defined, then the Message() routine is set active otherwise it is set
// to NULL so there is no overhead costs.

#ifdef ESI_MESSAGE_WINDOW
    #define DisplayFatFileSpecs() DisplayFatFileSpecsFunction()
#else
    #define DisplayFatFileSpecs()
#endif

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

/////////////////////////////////
// ACPI Support
/////////////////////////////////
#define STATUS_AC_POWER_OFFLINE             0
#define STATUS_BATTERY_POWER_LOW            2
#define STATUS_BATTERY_POWER_CRITICAL       4
#define STATUS_POWER_UNKNOWN                255

#define BOOT_OPTIMIZE_REGISTRY_PATH				TEXT("SOFTWARE\\Microsoft\\Dfrg\\BootOptimizeFunction")
#define BOOT_OPTIMIZE_REGISTRY_LCNSTARTLOCATION TEXT("LcnStartLocation")
#define BOOT_OPTIMIZE_REGISTRY_LCNENDLOCATION	TEXT("LcnEndLocation")


//This is the WndProc for Dfrg.
LRESULT CALLBACK
MainWndProc(
	IN HWND  hWnd,
	IN UINT  uMsg,
	IN WPARAM  wParam,
	IN LPARAM  lParam
	);

//This initializes DCOM and the message window.
BOOL Initialize();

//This gets data about the volume and initializes variables and so forth for the Dfrg engine.
BOOL InitializeDrive(IN PTCHAR pCommandLine);

//Initializes defrag specific stuff before defragging, and after scanning.
BOOL InitializeDefrag();

//Sends status data to the UI.
VOID SendStatusData();

//Send the report text data to the UI.
VOID SendReportData();

//Sends the graphical data to the UI.
void SendGraphicsData();

//Notifies the UI there is not enough memory for graphics.
void SendGraphicsMemoryErr();

// send error to client to display for user
VOID SendErrData(PTCHAR pErrText, DWORD ErrCode = ENGERR_UNKNOWN);

//This is the exit routine that cleans up after being called by WM_CLOSE.
VOID Exit();

//This gets the MFT bitmap which has one bit set for each file record that is in use.
BOOL GetMftBitmap();

//This gets the names of the pagefiles on a given drive and stores them in a list.
BOOL
GetPagefileNames(
	TCHAR    cDrive,
	HANDLE*  phPageFileNames,
	TCHAR**  ppPageFileNames
	);

//Checks a file to see if it is a pagefile.
BOOL CheckForPagefileFat();

//Checks a given file name to see if it matches that of one of the pagefiles on a drive.
BOOL
CheckPagefileNameMatch(
	IN TCHAR*  pCompareName,
	IN TCHAR*  pPageFileNames
	);

//Display various statistics about the volume.
VOID DisplayFatVolumeStats();

//Displays the data about a given file on a FAT volume.
VOID DisplayFatFileSpecsFunction();

//This is the analyze thread's main routine.
BOOL AnalyzeThread();

//Determines how big the file lists will have to be.
BOOL PreScanFat();

//Fills in the file lists.
BOOL ScanFat();

//This is the defrag thread's main routine.
BOOL DefragThread();

//This defrags all the files in the file lists.
BOOL DefragFat();

//Tells the caller to end the current pass if there was no space to move a file into.
BOOL EndPassIfNoSpaces();

BOOL NextFileIfFalse();

BOOL BeepNowIfFileNotMoved();

//When a file cannot be fully defragmented, this routine will partially defragment it.
BOOL PartialDefragFat();

//Once a spot has been found for a file, this will move it there.
BOOL MoveFatFile();

//Allocate memory for the file lists.
BOOL AllocateFileLists();

//Free up the memory allocated for the file lists.
BOOL DeallocateFileLists();

BOOL UpdateDiskView();

//Sends the most fragged list to the UI.
BOOL SendMostFraggedList();