-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBKParseImage.h
93 lines (79 loc) · 2.95 KB
/
BKParseImage.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#pragma once
#include "BKImgFile.h"
fs::path wstringToFsPath(std::wstring str);
std::wstring fsPathToWstring(fs::path& path);
enum class IMAGE_TYPE : int
{
ERROR_NOIMAGE = -1,
UNKNOWN = 0,
ANDOS,
MKDOS,
AODOS,
NORD,
MIKRODOS,
CSIDOS3,
RT11,
NCDOS,
DXDOS,
OPTOK,
HOLOGRAPHY,
DALE,
MSDOS
};
// размер блока по умолчанию. == размер сектора
constexpr auto BLOCK_SIZE = 512;
struct PARSE_RESULT
{
unsigned long nImageSize; // размер файла в байтах
unsigned long nBaseOffset; // смещение до логического диска (раздела) в образе файла
int nPartLen; // размер раздела в блоках (если возможно получить)
IMAGE_TYPE imageOSType; // результат парсинга
bool bImageBootable; // флаг загрузочного образа
std::wstring strName; // имя файла образа
PARSE_RESULT()
{
clear();
}
~PARSE_RESULT()
{
strName.clear();
}
void clear()
{
nImageSize = nBaseOffset = nPartLen = 0;
imageOSType = IMAGE_TYPE::UNKNOWN;
bImageBootable = false;
strName.clear();
}
PARSE_RESULT(const PARSE_RESULT *src)
{
nImageSize = src->nImageSize;
nBaseOffset = src->nBaseOffset;
nPartLen = src->nPartLen;
imageOSType = src->imageOSType;
bImageBootable = src->bImageBootable;
strName = src->strName;
}
PARSE_RESULT &operator = (const PARSE_RESULT &src)
= default;
};
class CBKParseImage
{
public:
CBKParseImage();
~CBKParseImage();
PARSE_RESULT ParseImage(const fs::path &fname, unsigned long nBaseOffset) const;
static const std::wstring GetOSName(const IMAGE_TYPE t);
protected:
// сука, не получается эту функцию из ImgUtil здесь применять, поэтому тупо продублируем
uint16_t CalcCRC(uint8_t *buffer, size_t len) const;
bool charcompare(uint8_t a, uint8_t b) const;
bool substrfind(uint8_t *bufs, size_t len_bufs, uint8_t *buff, size_t len_buff) const;
int IsCSIDOS3(CBKImgFile *f, unsigned long nBaseOffsetLBA, uint8_t *buf) const;
int IsRT11_old(CBKImgFile *f, unsigned long nBaseOffsetLBA, uint8_t *buf) const;
int IsRT11(CBKImgFile *f, unsigned long nBaseOffsetLBA, uint8_t *buf) const;
int AnalyseMicrodos(CBKImgFile *f, unsigned long nBaseOffsetLBA, uint8_t *buf) const;
int IsOPTOK(CBKImgFile *f, unsigned long nBaseOffsetLBA, uint8_t *buf) const;
int IsHolography(CBKImgFile *f, unsigned long nBaseOffsetLBA, uint8_t *buf) const;
int IsDaleOS(CBKImgFile *f, unsigned long nBaseOffsetLBA, uint8_t *buf) const;
};