1987da915Sopenharmony_ci/*
2987da915Sopenharmony_ci *		Declarations for processing log data
3987da915Sopenharmony_ci *
4987da915Sopenharmony_ci * Copyright (c) 2000-2005 Anton Altaparmakov
5987da915Sopenharmony_ci * Copyright (c) 2014-2016 Jean-Pierre Andre
6987da915Sopenharmony_ci */
7987da915Sopenharmony_ci
8987da915Sopenharmony_ci/*
9987da915Sopenharmony_ci * This program is free software; you can redistribute it and/or modify
10987da915Sopenharmony_ci * it under the terms of the GNU General Public License as published by
11987da915Sopenharmony_ci * the Free Software Foundation; either version 2 of the License, or
12987da915Sopenharmony_ci * (at your option) any later version.
13987da915Sopenharmony_ci *
14987da915Sopenharmony_ci * This program is distributed in the hope that it will be useful,
15987da915Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
16987da915Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17987da915Sopenharmony_ci * GNU General Public License for more details.
18987da915Sopenharmony_ci *
19987da915Sopenharmony_ci * You should have received a copy of the GNU General Public License
20987da915Sopenharmony_ci * along with this program (in the main directory of the NTFS-3G
21987da915Sopenharmony_ci * distribution in the file COPYING); if not, write to the Free Software
22987da915Sopenharmony_ci * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23987da915Sopenharmony_ci */
24987da915Sopenharmony_ci
25987da915Sopenharmony_ci#define getle16(p,x) le16_to_cpu(*(const le16*)((const char*)(p) + (x)))
26987da915Sopenharmony_ci#define getle32(p,x) le32_to_cpu(*(const le32*)((const char*)(p) + (x)))
27987da915Sopenharmony_ci#define getle64(p,x) le64_to_cpu(*(const le64*)((const char*)(p) + (x)))
28987da915Sopenharmony_ci
29987da915Sopenharmony_ci#define feedle16(p,x) (*(const le16*)((const char*)(p) + (x)))
30987da915Sopenharmony_ci#define feedle32(p,x) (*(const le32*)((const char*)(p) + (x)))
31987da915Sopenharmony_ci#define feedle64(p,x) (*(const le64*)((const char*)(p) + (x)))
32987da915Sopenharmony_ci
33987da915Sopenharmony_cienum ACTIONS {
34987da915Sopenharmony_ci	Noop,					/* 0 */
35987da915Sopenharmony_ci	CompensationlogRecord,			/* 1 */
36987da915Sopenharmony_ci	InitializeFileRecordSegment,		/* 2 */
37987da915Sopenharmony_ci	DeallocateFileRecordSegment,		/* 3 */
38987da915Sopenharmony_ci	WriteEndofFileRecordSegment,		/* 4 */
39987da915Sopenharmony_ci	CreateAttribute,			/* 5 */
40987da915Sopenharmony_ci	DeleteAttribute,			/* 6 */
41987da915Sopenharmony_ci	UpdateResidentValue,			/* 7 */
42987da915Sopenharmony_ci	UpdateNonResidentValue,			/* 8 */
43987da915Sopenharmony_ci	UpdateMappingPairs,			/* 9 */
44987da915Sopenharmony_ci	DeleteDirtyClusters,			/* 10 */
45987da915Sopenharmony_ci	SetNewAttributeSizes,			/* 11 */
46987da915Sopenharmony_ci	AddIndexEntryRoot,			/* 12 */
47987da915Sopenharmony_ci	DeleteIndexEntryRoot,			/* 13 */
48987da915Sopenharmony_ci	AddIndexEntryAllocation,		/* 14 */
49987da915Sopenharmony_ci	DeleteIndexEntryAllocation,		/* 15 */
50987da915Sopenharmony_ci	WriteEndOfIndexBuffer,			/* 16 */
51987da915Sopenharmony_ci	SetIndexEntryVcnRoot,			/* 17 */
52987da915Sopenharmony_ci	SetIndexEntryVcnAllocation,		/* 18 */
53987da915Sopenharmony_ci	UpdateFileNameRoot,			/* 19 */
54987da915Sopenharmony_ci	UpdateFileNameAllocation,		/* 20 */
55987da915Sopenharmony_ci	SetBitsInNonResidentBitMap,		/* 21 */
56987da915Sopenharmony_ci	ClearBitsInNonResidentBitMap,		/* 22 */
57987da915Sopenharmony_ci	HotFix,					/* 23 */
58987da915Sopenharmony_ci	EndTopLevelAction,			/* 24 */
59987da915Sopenharmony_ci	PrepareTransaction,			/* 25 */
60987da915Sopenharmony_ci	CommitTransaction,			/* 26 */
61987da915Sopenharmony_ci	ForgetTransaction,			/* 27 */
62987da915Sopenharmony_ci	OpenNonResidentAttribute,		/* 28 */
63987da915Sopenharmony_ci	OpenAttributeTableDump,			/* 29 */
64987da915Sopenharmony_ci	AttributeNamesDump,			/* 30 */
65987da915Sopenharmony_ci	DirtyPageTableDump,			/* 31 */
66987da915Sopenharmony_ci	TransactionTableDump,			/* 32 */
67987da915Sopenharmony_ci	UpdateRecordDataRoot,			/* 33 */
68987da915Sopenharmony_ci	UpdateRecordDataAllocation,		/* 34 */
69987da915Sopenharmony_ci	Win10Action35,				/* 35 */
70987da915Sopenharmony_ci	Win10Action36,				/* 36 */
71987da915Sopenharmony_ci	Win10Action37,				/* 37 */
72987da915Sopenharmony_ci	LastAction				/* 38 */
73987da915Sopenharmony_ci} ;
74987da915Sopenharmony_ci
75987da915Sopenharmony_cistruct BUFFER {
76987da915Sopenharmony_ci	unsigned int num;
77987da915Sopenharmony_ci	unsigned int rnum;
78987da915Sopenharmony_ci	unsigned int size;
79987da915Sopenharmony_ci	unsigned int headsz;
80987da915Sopenharmony_ci	BOOL safe;
81987da915Sopenharmony_ci	union {
82987da915Sopenharmony_ci		u64 alignment;
83987da915Sopenharmony_ci		RESTART_PAGE_HEADER restart;
84987da915Sopenharmony_ci		RECORD_PAGE_HEADER record;
85987da915Sopenharmony_ci		char data[1];
86987da915Sopenharmony_ci	} block;  /* variable length, keep at the end */
87987da915Sopenharmony_ci} ;
88987da915Sopenharmony_ci
89987da915Sopenharmony_cistruct ACTION_RECORD {
90987da915Sopenharmony_ci	struct ACTION_RECORD *next;
91987da915Sopenharmony_ci	struct ACTION_RECORD *prev;
92987da915Sopenharmony_ci	int num;
93987da915Sopenharmony_ci	unsigned int flags;
94987da915Sopenharmony_ci	LOG_RECORD record; /* variable length, keep at the end */
95987da915Sopenharmony_ci} ;
96987da915Sopenharmony_ci
97987da915Sopenharmony_cienum {		/* Flag values for ACTION_RECORD */
98987da915Sopenharmony_ci	ACTION_TO_REDO = 1	/* Committed, possibly not synced */
99987da915Sopenharmony_ci	} ;
100987da915Sopenharmony_ci
101987da915Sopenharmony_cistruct ATTR {
102987da915Sopenharmony_ci	u64 inode;
103987da915Sopenharmony_ci	u64 lsn;
104987da915Sopenharmony_ci	le32 type;
105987da915Sopenharmony_ci	u16 key;
106987da915Sopenharmony_ci	u16 namelen;
107987da915Sopenharmony_ci	le16 name[1];
108987da915Sopenharmony_ci} ;
109987da915Sopenharmony_ci
110987da915Sopenharmony_ciextern u32 clustersz;
111987da915Sopenharmony_ciextern int clusterbits;
112987da915Sopenharmony_ciextern u32 blocksz;
113987da915Sopenharmony_ciextern int blockbits;
114987da915Sopenharmony_ciextern u16 bytespersect;
115987da915Sopenharmony_ciextern u64 mftlcn;
116987da915Sopenharmony_ciextern u32 mftrecsz;
117987da915Sopenharmony_ciextern int mftrecbits;
118987da915Sopenharmony_ciextern u32 mftcnt; /* number of entries */
119987da915Sopenharmony_ciextern BOOL optc;
120987da915Sopenharmony_ciextern BOOL optn;
121987da915Sopenharmony_ciextern int opts;
122987da915Sopenharmony_ciextern int optv;
123987da915Sopenharmony_ciextern unsigned int redocount;
124987da915Sopenharmony_ciextern unsigned int undocount;
125987da915Sopenharmony_ciextern ntfs_inode *log_ni;
126987da915Sopenharmony_ciextern ntfs_attr *log_na;
127987da915Sopenharmony_ciextern u64 logfilelcn;
128987da915Sopenharmony_ciextern u32 logfilesz; /* bytes */
129987da915Sopenharmony_ciextern u64 redos_met;
130987da915Sopenharmony_ciextern u64 committed_lsn;
131987da915Sopenharmony_ciextern u64 synced_lsn;
132987da915Sopenharmony_ciextern u64 latest_lsn;
133987da915Sopenharmony_ciextern u64 restart_lsn;
134987da915Sopenharmony_ci
135987da915Sopenharmony_ciextern RESTART_AREA restart;
136987da915Sopenharmony_ciextern LOG_CLIENT_RECORD client;
137987da915Sopenharmony_ci
138987da915Sopenharmony_ciconst char *actionname(int op);
139987da915Sopenharmony_ciconst char *mftattrname(ATTR_TYPES attr);
140987da915Sopenharmony_civoid showname(const char *prefix, const char *name, int cnt);
141987da915Sopenharmony_ciint fixnamelen(const char *name, int len);
142987da915Sopenharmony_ciBOOL within_lcn_range(const LOG_RECORD *logr);
143987da915Sopenharmony_cistruct ATTR *getattrentry(unsigned int key, unsigned int lth);
144987da915Sopenharmony_civoid copy_attribute(struct ATTR *pa, const char *buf, int length);
145987da915Sopenharmony_ciu32 get_undo_offset(const LOG_RECORD *logr);
146987da915Sopenharmony_ciu32 get_redo_offset(const LOG_RECORD *logr);
147987da915Sopenharmony_ciu32 get_extra_offset(const LOG_RECORD *logr);
148987da915Sopenharmony_ciBOOL exception(int num);
149987da915Sopenharmony_ci
150987da915Sopenharmony_cistruct STORE;
151987da915Sopenharmony_ciextern int play_undos(ntfs_volume *vol, const struct ACTION_RECORD *firstundo);
152987da915Sopenharmony_ciextern int play_redos(ntfs_volume *vol, const struct ACTION_RECORD *firstredo);
153987da915Sopenharmony_ciextern void show_redos(void);
154987da915Sopenharmony_ciextern void freeclusterentry(struct STORE*);
155987da915Sopenharmony_civoid hexdump(const char *buf, unsigned int lth);
156