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