You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.6 KiB
156 lines
4.6 KiB
/*
|
|
* Declarations for processing log data
|
|
*
|
|
* Copyright (c) 2000-2005 Anton Altaparmakov
|
|
* Copyright (c) 2014-2016 Jean-Pierre Andre
|
|
*/
|
|
|
|
/*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program (in the main directory of the NTFS-3G
|
|
* distribution in the file COPYING); if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#define getle16(p,x) le16_to_cpu(*(const le16*)((const char*)(p) + (x)))
|
|
#define getle32(p,x) le32_to_cpu(*(const le32*)((const char*)(p) + (x)))
|
|
#define getle64(p,x) le64_to_cpu(*(const le64*)((const char*)(p) + (x)))
|
|
|
|
#define feedle16(p,x) (*(const le16*)((const char*)(p) + (x)))
|
|
#define feedle32(p,x) (*(const le32*)((const char*)(p) + (x)))
|
|
#define feedle64(p,x) (*(const le64*)((const char*)(p) + (x)))
|
|
|
|
enum ACTIONS {
|
|
Noop, /* 0 */
|
|
CompensationlogRecord, /* 1 */
|
|
InitializeFileRecordSegment, /* 2 */
|
|
DeallocateFileRecordSegment, /* 3 */
|
|
WriteEndofFileRecordSegment, /* 4 */
|
|
CreateAttribute, /* 5 */
|
|
DeleteAttribute, /* 6 */
|
|
UpdateResidentValue, /* 7 */
|
|
UpdateNonResidentValue, /* 8 */
|
|
UpdateMappingPairs, /* 9 */
|
|
DeleteDirtyClusters, /* 10 */
|
|
SetNewAttributeSizes, /* 11 */
|
|
AddIndexEntryRoot, /* 12 */
|
|
DeleteIndexEntryRoot, /* 13 */
|
|
AddIndexEntryAllocation, /* 14 */
|
|
DeleteIndexEntryAllocation, /* 15 */
|
|
WriteEndOfIndexBuffer, /* 16 */
|
|
SetIndexEntryVcnRoot, /* 17 */
|
|
SetIndexEntryVcnAllocation, /* 18 */
|
|
UpdateFileNameRoot, /* 19 */
|
|
UpdateFileNameAllocation, /* 20 */
|
|
SetBitsInNonResidentBitMap, /* 21 */
|
|
ClearBitsInNonResidentBitMap, /* 22 */
|
|
HotFix, /* 23 */
|
|
EndTopLevelAction, /* 24 */
|
|
PrepareTransaction, /* 25 */
|
|
CommitTransaction, /* 26 */
|
|
ForgetTransaction, /* 27 */
|
|
OpenNonResidentAttribute, /* 28 */
|
|
OpenAttributeTableDump, /* 29 */
|
|
AttributeNamesDump, /* 30 */
|
|
DirtyPageTableDump, /* 31 */
|
|
TransactionTableDump, /* 32 */
|
|
UpdateRecordDataRoot, /* 33 */
|
|
UpdateRecordDataAllocation, /* 34 */
|
|
Win10Action35, /* 35 */
|
|
Win10Action36, /* 36 */
|
|
Win10Action37, /* 37 */
|
|
LastAction /* 38 */
|
|
} ;
|
|
|
|
struct BUFFER {
|
|
unsigned int num;
|
|
unsigned int rnum;
|
|
unsigned int size;
|
|
unsigned int headsz;
|
|
BOOL safe;
|
|
union {
|
|
u64 alignment;
|
|
RESTART_PAGE_HEADER restart;
|
|
RECORD_PAGE_HEADER record;
|
|
char data[1];
|
|
} block; /* variable length, keep at the end */
|
|
} ;
|
|
|
|
struct ACTION_RECORD {
|
|
struct ACTION_RECORD *next;
|
|
struct ACTION_RECORD *prev;
|
|
int num;
|
|
unsigned int flags;
|
|
LOG_RECORD record; /* variable length, keep at the end */
|
|
} ;
|
|
|
|
enum { /* Flag values for ACTION_RECORD */
|
|
ACTION_TO_REDO = 1 /* Committed, possibly not synced */
|
|
} ;
|
|
|
|
struct ATTR {
|
|
u64 inode;
|
|
u64 lsn;
|
|
le32 type;
|
|
u16 key;
|
|
u16 namelen;
|
|
le16 name[1];
|
|
} ;
|
|
|
|
extern u32 clustersz;
|
|
extern int clusterbits;
|
|
extern u32 blocksz;
|
|
extern int blockbits;
|
|
extern u16 bytespersect;
|
|
extern u64 mftlcn;
|
|
extern u32 mftrecsz;
|
|
extern int mftrecbits;
|
|
extern u32 mftcnt; /* number of entries */
|
|
extern BOOL optc;
|
|
extern BOOL optn;
|
|
extern int opts;
|
|
extern int optv;
|
|
extern unsigned int redocount;
|
|
extern unsigned int undocount;
|
|
extern ntfs_inode *log_ni;
|
|
extern ntfs_attr *log_na;
|
|
extern u64 logfilelcn;
|
|
extern u32 logfilesz; /* bytes */
|
|
extern u64 redos_met;
|
|
extern u64 committed_lsn;
|
|
extern u64 synced_lsn;
|
|
extern u64 latest_lsn;
|
|
extern u64 restart_lsn;
|
|
|
|
extern RESTART_AREA restart;
|
|
extern LOG_CLIENT_RECORD client;
|
|
|
|
const char *actionname(int op);
|
|
const char *mftattrname(ATTR_TYPES attr);
|
|
void showname(const char *prefix, const char *name, int cnt);
|
|
int fixnamelen(const char *name, int len);
|
|
BOOL within_lcn_range(const LOG_RECORD *logr);
|
|
struct ATTR *getattrentry(unsigned int key, unsigned int lth);
|
|
void copy_attribute(struct ATTR *pa, const char *buf, int length);
|
|
u32 get_undo_offset(const LOG_RECORD *logr);
|
|
u32 get_redo_offset(const LOG_RECORD *logr);
|
|
u32 get_extra_offset(const LOG_RECORD *logr);
|
|
BOOL exception(int num);
|
|
|
|
struct STORE;
|
|
extern int play_undos(ntfs_volume *vol, const struct ACTION_RECORD *firstundo);
|
|
extern int play_redos(ntfs_volume *vol, const struct ACTION_RECORD *firstredo);
|
|
extern void show_redos(void);
|
|
extern void freeclusterentry(struct STORE*);
|
|
void hexdump(const char *buf, unsigned int lth);
|