// Включаемый файл для MFC
#include <afxwin.h>

//===================================================== 
// Главный класс приложения CMFStartApp
//===================================================== 
class CMFStartApp : public CWinApp
{
public:
	virtual BOOL	InitInstance();
	void					FileSystemInfo();
};
 
// Создаем объект приложение класса CMFStartApp
CMFStartApp MFStartApp;
 
//===================================================== 
// Переопределяем виртуальный метод InitInstance
// класса CWinApp
//===================================================== 
BOOL CMFStartApp::InitInstance()
{
	// Определяем характеристики файловой системы
	FileSystemInfo();	

	// Завершаем приложение
	return FALSE;
}

//===================================================== 
// Метод FileSystemInfo главного класса приложения
// Определяет характеристики текущего тома и записывает 
// их в файл 
//===================================================== 
void CMFStartApp::FileSystemInfo() 
{

	// Метка тома
	CString	VolumeNameBuffer;

	// Максимальная длина метки тома
	DWORD	nVolumeNameSize = 100;	

	// Серийный номер тома
	DWORD	VolumeSerialNumber;

	// Максимальная длина имени файла
	DWORD	MaximumComponentLength;

	// Характеристики файловой системы
	DWORD	FileSystemFlags;

	// Тип файловой системы
	CString	FileSystemNameBuffer;

	// Максимальная длина строки типа файловой системы
	DWORD	nFileSystemNameSize = 100;

	// Получаем данные о файловой системе и текущем устройстве
	GetVolumeInformation(
		NULL, 
		VolumeNameBuffer.GetBuffer(nVolumeNameSize), 
		nVolumeNameSize, 
		&VolumeSerialNumber,
		&MaximumComponentLength, &FileSystemFlags,
		FileSystemNameBuffer.GetBuffer(nFileSystemNameSize),
		nFileSystemNameSize );

	// Снимаем блокировку буферов 
	VolumeNameBuffer.ReleaseBuffer();
	FileSystemNameBuffer.ReleaseBuffer();

	// Обрабатываем ошибочные ситуации, которые могут 
	// возникнуть при работе с файлами
	try
	{
		// Создаем файл fsystem.dat и открываем его для записи
		CStdioFile file("fsystem.dat", 
			CFile::modeCreate | 
			CFile::modeWrite | 
			CFile::typeText);

		// Временная строка, используемая для записи в файл
		CString	strTmpOut;

		// Увеличиваем размер буфера до 512 байт
		strTmpOut.GetBuffer(512);

		// Записываем в файл метку тома
		strTmpOut.Format("Метка тома: %s \n", VolumeNameBuffer);
		file.WriteString(strTmpOut);

		// Записываем в файл серийный номер
		strTmpOut.Format("Серийный номер: %X \n", 
			VolumeSerialNumber);

		file.WriteString(strTmpOut);

		// Записываем в файл тип файловой системы
		strTmpOut.Format("Тип файловой системы: %s \n", 
			FileSystemNameBuffer);

		file.WriteString(strTmpOut);
	
		// Записываем в файл максимальную длину имени файла
		strTmpOut.Format("Максимальная длина имени файла: %d \n", 
			MaximumComponentLength);

		file.WriteString(strTmpOut);
		
		// Записываем в файл свойства файловой системы
		strTmpOut = "Свойства файловой системы \n";

		if(FileSystemFlags & FS_CASE_IS_PRESERVED)
			strTmpOut += "   FS_CASE_IS_PRESERVED\n";

		if(FileSystemFlags & FS_CASE_SENSITIVE)
			strTmpOut += "   FS_CASE_SENSITIVE\n";
	
		if(FileSystemFlags & FS_UNICODE_STORED_ON_DISK)
			strTmpOut += "   FS_UNICODE_STORED_ON_DISK\n";
	
		if(FileSystemFlags & FS_PERSISTENT_ACLS)
			strTmpOut += "   FS_PERSISTENT_ACLS\n";
	
		if(FileSystemFlags & FS_FILE_COMPRESSION)
			strTmpOut += "   FS_FILE_COMPRESSION\n";

		if(FileSystemFlags & FS_VOL_IS_COMPRESSED)
			strTmpOut += "   FS_VOL_IS_COMPRESSED\n";

		file.WriteString(strTmpOut);	
	
		// Закрываем файл
		file.Close();
		// Отображаем сообщение об успешном завершении приложения
		MessageBox(NULL, "File fsystem.dat", "Message", MB_OK);
	}

	// Обработчик исключения. Вызывается при ошибках 
	// работы с файлами
	catch(...)
	{
		// Отображаем сообщение о возникшей ошибке 
		MessageBox(NULL, "File I/O Error", "Error", MB_OK);
	}

	return;
}
