1 /*---------------------------------------------------------------------------* 2 Project: header for archiver for Revolution dvd 3 File: darch.h 4 5 Copyright (C) 2001-2006 Nintendo All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Log: darch.h,v $ 14 Revision 1.2 2007/11/13 07:02:09 nakano_yoshinobu 15 Fixed path names of files in .arc file. 16 17 Revision 1.1 2006/04/20 01:41:01 hiratsu 18 Initial check-in. 19 20 21 1 7/02/01 11:34p Hashida 22 Initial revision. 23 24 $NoKeywords: $ 25 *---------------------------------------------------------------------------*/ 26 27 #include <stdlib.h> 28 #include <stdio.h> 29 #include <string.h> 30 #include <io.h> 31 #include <fcntl.h> 32 #include <errno.h> 33 #include <sys/stat.h> 34 #include <assert.h> 35 #include <revolution/dvd.h> 36 #include <revolution/arc.h> 37 38 typedef struct diskMap diskMap; 39 40 struct diskMap 41 { 42 int fstPosition; 43 int fstLength; 44 int userFilePosition; 45 int userFileLength; 46 47 }; 48 49 typedef struct FSTEntryInfo FSTEntryInfo; 50 51 struct FSTEntryInfo 52 { 53 FSTEntryInfo* next; 54 int entryNum; 55 char pathName[FILENAME_MAX]; 56 char* name; 57 int nameOffset; 58 BOOL isDir; 59 int parentEntry; // dir only 60 int nextEntry; // dir only: next entry under the same dir 61 int filePosition; // file only 62 int fileLength; // file only 63 }; 64 65 typedef struct FSTEntry FSTEntry; 66 67 struct FSTEntry 68 { 69 unsigned int isDirAndStringOff; // the first byte is for isDir 70 // the next 3bytes: name offset 71 unsigned int parentOrPosition; // parent entry (dir entry) 72 // position (file entry) 73 unsigned int nextEntryOrLength; // next entry (dir entry) 74 // length (file entry) 75 }; 76 77 typedef struct 78 { 79 char name[FILENAME_MAX]; 80 int fid; 81 int currEntry; 82 int entryNum; 83 int stringStartOffset; 84 char* stringStart; 85 FSTEntry* fst; 86 int fileStart; 87 88 } DarchHandle; 89 90 91 #define roundUp4B(x) (((unsigned int)(x) + 4 - 1) & \ 92 ~(4 - 1)) 93 #define roundUp32B(x) (((unsigned int)(x) + 32 - 1) & \ 94 ~(32 - 1)) 95 96 97 /*---------------------------------------------------------------------------* 98 Name: setData 99 100 Description: macro to set data in big endian 101 102 Arguments: addr address to set data 103 data data to set 104 offset data is set from addr+offset 105 nbytes data length 106 107 Returns: none 108 *---------------------------------------------------------------------------*/ 109 #define setData(addr, data, offset, nbytes) do { \ 110 int ___i; \ 111 for (___i = 0; ___i < nbytes; ___i++) \ 112 { \ 113 *( (char*)(addr) + offset + ___i ) \ 114 = ( (data) >> (8*(nbytes - ___i - 1)) ) & 0xff; \ 115 }\ 116 } while(0) 117 118 119 120 /* 121 * 0 1 4 8 11 122 * +-----+-----------+----------------+-----------------+ 123 * |ISDIR| STRINGOFF | PARENT or | Next Entry or | 124 * | | | Position | Length | 125 * +-----+-----------+----------------+-----------------+ 126 */ 127 #define ISDIR_OFFSET 0 128 #define ISDIR_LENGTH 1 129 #define STRINGOFF_OFFSET 1 130 #define STRINGOFF_LENGTH 3 131 #define PARENT_OFFSET 4 132 #define PARENT_LENGTH 4 133 #define POSITION_OFFSET 4 134 #define POSITION_LENGTH 4 135 #define NEXTENTRY_OFFSET 8 136 #define NEXTENTRY_LENGTH 4 137 #define LENGTH_OFFSET 8 138 #define LENGTH_LENGTH 4 139 140 #define setIsDir(eAddr, data) \ 141 setData(eAddr, data, ISDIR_OFFSET, ISDIR_LENGTH) 142 #define setStringOff(eAddr, data) \ 143 setData(eAddr, data, STRINGOFF_OFFSET, STRINGOFF_LENGTH) 144 #define setParent(eAddr, data) \ 145 setData(eAddr, data, PARENT_OFFSET, PARENT_LENGTH) 146 #define setPosition(eAddr, data) \ 147 setData(eAddr, data, POSITION_OFFSET, POSITION_LENGTH) 148 #define setNextEntry(eAddr, data) \ 149 setData(eAddr, data, NEXTENTRY_OFFSET, NEXTENTRY_LENGTH) 150 #define setLength(eAddr, data) \ 151 setData(eAddr, data, LENGTH_OFFSET, LENGTH_LENGTH) 152 #define set4BData(eAddr, data, offset) \ 153 setData(eAddr, data, offset, 4) 154 155 #define RoundUp32B(x) (((u32)(x) + 32 - 1) & ~(32 - 1)) 156 #define RoundDown32B(x) (((u32)(x)) & ~(32 - 1)) 157 158 #define RoundUp4B(x) (((u32)(x) + 4 - 1) & ~(4 - 1)) 159 #define RoundDown4B(x) (((u32)(x)) & ~(4 - 1)) 160 161 #define REV32(data) ( ( ((data) & 0xff000000) >> 24 ) | \ 162 ( ((data) & 0x00ff0000) >> 8 ) | \ 163 ( ((data) & 0x0000ff00) << 8 ) | \ 164 ( ((data) & 0x000000ff) << 24 ) ) 165 166 #define entryIsDir(entry) \ 167 ( ( ( REV32((entry)->isDirAndStringOff) & 0xff000000 ) == 0 )? FALSE:TRUE ) 168 #define stringOff(entry) \ 169 ( REV32((entry)->isDirAndStringOff) & 0x00ffffff ) 170 #define parentDir(entry) \ 171 ( REV32((entry)->parentOrPosition) ) 172 #define nextDir(entry) \ 173 ( REV32((entry)->nextEntryOrLength) ) 174 #define filePosition(entry) \ 175 ( REV32((entry)->parentOrPosition) ) 176 #define fileLength(entry) \ 177 ( REV32((entry)->nextEntryOrLength) ) 178 179 /* 180 * FST max size ... 1M bytes 181 * This is because bs2 assumes that. 182 */ 183 //#define FST_MAX_SIZE 0x00100000 184 185 #define MIN(x, y) (((x) < (y))? (x) : (y)) 186 187 188 typedef struct 189 { 190 char* currDir; 191 char** argStart; 192 int argNum; 193 194 } Arg_s; 195 196 extern int makeFST(void); 197 extern int makeOutFile(char* name); 198 extern void makeTmpFileNames(void); 199 200 extern void ListArc(char* name); 201 extern void ListArcInDiscOrder(char* name); 202 extern void ExtractArc(char* name, char* root); 203 extern void DiffArc(char* name, char* root); 204 extern void DeleteArc(char* arcFile, Arg_s* arg, int count); 205 extern void ReplaceArc(char* arcFile, Arg_s* arg, int count); 206 extern void CreateArc(char* arcFile, Arg_s* arg, int count); 207 208 extern void CopyUtility(int srcfid, int srcoff, int dstfid, int dstoff, int size); 209 extern BOOL DiffUtility(int fidA, int Aoff, int fidB, int Boff, int size); 210 211 212 extern char fstFile[FILENAME_MAX]; 213 extern char userFile[FILENAME_MAX]; 214 215 extern char arcRoot[FILENAME_MAX]; 216 217 extern diskMap map; 218 extern char* progName; 219 extern int debugMode; 220 extern int verbose; 221 extern void* BigBuffer; 222 223 #define ALLOC_MEMSIZE (16*1024*1024) 224 225 //for VC2005 226 #pragma warning(disable: 4996) 227 228