#pragma once
#include "BKDImage.h"
#pragma pack(push)
#pragma pack(1)
struct CsidosFileRecord
{
	BYTE type;      //тип записи, номер директории для записи-директории
	BYTE protection;//если <0 - защита от удаления
	BYTE name[11];  //имя файла с расширением, но без точки
	BYTE status;    //статус файла.
	WORD start_block;//начальный блок
	WORD address;   //адрес загрузки
	WORD length;    //длина файла, в байтах или блоках, зависит от статуса
	CsidosFileRecord()
	{
		memset(this, 0, sizeof(CsidosFileRecord));
	}
	CsidosFileRecord &operator = (const CsidosFileRecord &src)
	{
		memcpy(this, &src, sizeof(CsidosFileRecord));
		return *this;
	}
	CsidosFileRecord &operator = (const CsidosFileRecord *src)
	{
		memcpy(this, src, sizeof(CsidosFileRecord));
		return *this;
	}
};
#pragma pack(pop)

class CBKDCsidos3 :
	public CBKDImage
{
	public:
		CBKDCsidos3(const PARSE_RESULT &image);
		virtual ~CBKDCsidos3(void);

		virtual BOOL ReadCatalog();
		FILESAVE_STATUS ReadCat(CsidosFileRecord *buf);
		FILESAVE_STATUS WriteCat(CsidosFileRecord *buf);
		int CompareSize(CsidosFileRecord *cfr, UINT fileSize);
		int GetLength(CsidosFileRecord *cfr);
		void SetLength(CsidosFileRecord *cfr, UINT fileSize);
		virtual BOOL ExtractFile(FileRecord *sFile, BOOL bExtractAsBin = FALSE, BOOL bExtractLog = FALSE);
		virtual FILESAVE_STATUS AddFile(const CString &str, int nDirBelong, BOOL bAddAsBin = FALSE);
		//получение данных специфических для заданной ОС
		virtual CString GetSpecificData(DWORD dd);
		virtual UINT HasSpecificData(void) const
		{
			return IDS_LC_SPECIFIC_CSIDOS_HDR;
		}
};

/*
Расположение информации на диске

00 блок - загрузчик системы
02-011 блок - каталог
012-... блоки под файлы

Расположение записей в каталоге

первый блок
смещение длина значение
------------------------------
0       2       физический номер блока
2       2       общее число блоков на диске
4       2       0123123 для csidos-3
6       2       0123123 для csidos-3
010     2       0123123 принадлежность диска системе csidos
012     2       не используется == 0
014     0764    записи о файлах

остальные блоки
смещение длина значение
------------------------------
0       2       физический номер блока
2       012     не используется == 0
014     0764    записи о файлах


Формат записи о файле (024 байта)

смещение длина значение
------------------------------
0       1       тип:
                1-0310 номер директории, к которой принадлежит запись. 1 - корень.
                0311 плохое место
                0376 дырка
                0312 запись не содержит информации
                0377 удалённый файл, который можно восстановить
                0 конец каталога
1       1       <0 - защита от удаления
2       013     имя файла с расширением (без точки)
015     1       статус файла:
                7 бит - признак длины в блоках
                3 бит - признак файла для бк0010 0==БК10 1==БК11
                остальные биты - копия регистра 0177717 (страницы)
                либо номер директории для директории
016     2       начальный блок файла, 0 для директории
020     2       адрес загрузки, 0 для директории
022     2       длина файла, 0 для директории

оставшееся свободное место в конце диска помечается дыркой.

*/