| 1 | #include <types.h> | 
 
 
 
 
 | 2 | #include <irx.h> | 
 
 
 
 
 | 3 | #include <stdio.h> | 
 
 
 
 
 | 4 | #include <sysclib.h> | 
 
 
 
 
 | 5 | #include <sysmem.h> | 
 
 
 
 
 | 6 | #include <iomanX.h> | 
 
 
 
 
 | 7 | #include <sys/fcntl.h> | 
 
 
 
 
 | 8 | #include <cdvdman.h> | 
 
 
 
 
 | 9 |  | 
 
 
 
 
 | 10 |  | 
 
 
 
 
 | 11 | //  Define this to enable debugging, will later support debugging levels, so only messages greater then a certain level will be displayed | 
 
 
 
 
 | 12 | //#define DEBUG 8 | 
 
 
 
 
 | 13 | //For release versions of uLE, DEBUG should not be defined | 
 
 
 
 
 | 14 | //To avoid slowdown and size bloat | 
 
 
 
 
 | 15 |  | 
 
 
 
 
 | 16 | //  Define this to enable some basic profiling support, each function will display the time it took to run. | 
 
 
 
 
 | 17 | //  #define PROFILING | 
 
 
 
 
 | 18 |  | 
 
 
 
 
 | 19 |  | 
 
 
 
 
 | 20 | //  Misc defintions | 
 
 
 
 
 | 21 | #define malloc( a ) AllocSysMemory( 0, ( a ), NULL ) | 
 
 
 
 
 | 22 | #define free( a )   FreeSysMemory(  ( a )  ) | 
 
 
 
 
 | 23 |  | 
 
 
 
 
 | 24 | #define TRUE    1 | 
 
 
 
 
 | 25 | #define FALSE   0 | 
 
 
 
 
 | 26 |  | 
 
 
 
 
 | 27 | #define MAX_NAME   32 | 
 
 
 
 
 | 28 | #define MAX_PATH 1024 | 
 
 
 
 
 | 29 |  | 
 
 
 
 
 | 30 |  | 
 
 
 
 
 | 31 | //  Vmcfs error definitions | 
 
 
 
 
 | 32 | #define VMCFS_ERR_NO            0 | 
 
 
 
 
 | 33 | #define VMCFS_ERR_INITIALIZED  -1 | 
 
 
 
 
 | 34 | #define VMCFS_ERR_VMC_OPEN     -2 | 
 
 
 
 
 | 35 | #define VMCFS_ERR_VMC_READ     -3 | 
 
 
 
 
 | 36 | #define VMCFS_ERR_CARD_TYPE    -4 | 
 
 
 
 
 | 37 | #define VMCFS_ERR_NOT_FORMATED -5 | 
 
 
 
 
 | 38 | #define VMCFS_ERR_VMC_SIZE     -6 | 
 
 
 
 
 | 39 | #define VMCFS_ERR_NOT_MOUNT    -7 | 
 
 
 
 
 | 40 | #define VMCFS_ERR_MOUNT_BUSY   -8 | 
 
 
 
 
 | 41 | #define VMCFS_ERR_IMPLEMENTED  -9 | 
 
 
 
 
 | 42 |  | 
 
 
 
 
 | 43 |  | 
 
 
 
 
 | 44 | //  The devctl commands: 0x56 == V, 0x4D == M, 0x43 == C, 0x01, 0x02, ... == command number. | 
 
 
 
 
 | 45 | #define DEVCTL_VMCFS_CLEAN   0x564D4301 //  Set as free all fat cluster corresponding to a none existing object. ( Object are just marked as none existing but not removed from fat table when rmdir or remove fonctions are call. This allow to recover a deleted file. ) | 
 
 
 
 
 | 46 | #define DEVCTL_VMCFS_CKFREE  0x564D4302 //  Check free space available on vmc. | 
 
 
 
 
 | 47 |  | 
 
 
 
 
 | 48 | //  The ioctl commands: 0x56 == V, 0x4D == M, 0x43 == C, 0x01, 0x02, ... == command number. | 
 
 
 
 
 | 49 | #define IOCTL_VMCFS_RECOVER  0x564D4303 //  Recover an object marked as none existing. ( data must be a valid path to an object in vmc file ) | 
 
 
 
 
 | 50 |  | 
 
 
 
 
 | 51 |  | 
 
 
 
 
 | 52 | //  Vmc format enum | 
 
 
 
 
 | 53 | typedef enum { | 
 
 
 
 
 | 54 | FORMAT_FULL, | 
 
 
 
 
 | 55 | FORMAT_FAST | 
 
 
 
 
 | 56 | } Vmc_Format_Enum; | 
 
 
 
 
 | 57 |  | 
 
 
 
 
 | 58 |  | 
 
 
 
 
 | 59 | //  Memorycard type definitions | 
 
 
 
 
 | 60 | #define PSX_MEMORYCARD   0x1 | 
 
 
 
 
 | 61 | #define PS2_MEMORYCARD   0x2 | 
 
 
 
 
 | 62 | #define PDA_MEMORYCARD   0x3 | 
 
 
 
 
 | 63 |  | 
 
 
 
 
 | 64 | //  Directory Entry Mode Flags | 
 
 
 
 
 | 65 | #define DF_READ          0x0001  //     Read permission. | 
 
 
 
 
 | 66 | #define DF_WRITE         0x0002  //     Write permission. | 
 
 
 
 
 | 67 | #define DF_EXECUTE       0x0004  //     Execute permission. | 
 
 
 
 
 | 68 | #define DF_PROTECTED     0x0008  //     Directory is copy protected. | 
 
 
 
 
 | 69 | #define DF_FILE          0x0010  //     Regular file. | 
 
 
 
 
 | 70 | #define DF_DIRECTORY     0x0020  //     Directory. | 
 
 
 
 
 | 71 | #define DF_040           0x0040  //     Used internally to create directories. | 
 
 
 
 
 | 72 | #define DF_080           0x0080  //     Copied? | 
 
 
 
 
 | 73 | #define DF_0100          0x0100  //     - | 
 
 
 
 
 | 74 | #define O_CREAT          0x0200  //     Used to create files. | 
 
 
 
 
 | 75 | #define DF_0400          0x0400  //     Set when files and directories are created, otherwise ignored. | 
 
 
 
 
 | 76 | #define DF_POCKETSTN     0x0800  //     PocketStation application save file. | 
 
 
 
 
 | 77 | #define DF_PSX           0x1000  //     PlayStation save file. | 
 
 
 
 
 | 78 | #define DF_HIDDEN        0x2000  //     File is hidden. | 
 
 
 
 
 | 79 | #define DF_04000         0x4000  //     - | 
 
 
 
 
 | 80 | #define DF_EXISTS        0x8000  //     This entry is in use. If this flag is clear, then the file or directory has been deleted. | 
 
 
 
 
 | 81 |  | 
 
 
 
 
 | 82 |  | 
 
 
 
 
 | 83 | //  Cluster definitions | 
 
 
 
 
 | 84 | #define MAX_CLUSTER_SIZE 0x400 | 
 
 
 
 
 | 85 |  | 
 
 
 
 
 | 86 | #define ROOT_CLUSTER     0x00000000 | 
 
 
 
 
 | 87 | #define FREE_CLUSTER     0x7FFFFFFF | 
 
 
 
 
 | 88 | #define EOF_CLUSTER      0xFFFFFFFF | 
 
 
 
 
 | 89 | #define ERROR_CLUSTER    0xFFFFFFFF | 
 
 
 
 
 | 90 | #define NOFOUND_CLUSTER  0xFFFFFFFF | 
 
 
 
 
 | 91 | #define MASK_CLUSTER     0x80000000 | 
 
 
 
 
 | 92 |  | 
 
 
 
 
 | 93 |  | 
 
 
 
 
 | 94 | // The debugging functions, very very handy | 
 
 
 
 
 | 95 | #ifdef DEBUG | 
 
 
 
 
 | 96 | #define DEBUGPRINT( level, args... ) \ | 
 
 
 
 
 | 97 | if( DEBUG >= level ) printf( args ) | 
 
 
 
 
 | 98 | #else | 
 
 
 
 
 | 99 | #define DEBUGPRINT( args... ) | 
 
 
 
 
 | 100 | #endif | 
 
 
 
 
 | 101 |  | 
 
 
 
 
 | 102 |  | 
 
 
 
 
 | 103 | // Used for timing functions, use this to optimize stuff | 
 
 
 
 
 | 104 | #ifdef PROFILING | 
 
 
 
 
 | 105 | void profilerStart( iop_sys_clock_t *iopclock ); | 
 
 
 
 
 | 106 | void profilerEnd( const char *function, const char* name, iop_sys_clock_t *iopclock1 ); | 
 
 
 
 
 | 107 | //This creates 2 variables with the names name1/name2, and starts the profiler | 
 
 
 
 
 | 108 | #define PROF_START( name ) \ | 
 
 
 
 
 | 109 | iop_sys_clock_t name;\ | 
 
 
 
 
 | 110 | profilerStart( &name ); | 
 
 
 
 
 | 111 | //this takes the 2 variable names and ends the profiler, printing the time taken | 
 
 
 
 
 | 112 | #define PROF_END( name ) \ | 
 
 
 
 
 | 113 | profilerEnd( __func__, #name, &name ); | 
 
 
 
 
 | 114 | #else | 
 
 
 
 
 | 115 | //define away the profiler functions | 
 
 
 
 
 | 116 | #define PROF_START( args )      ; | 
 
 
 
 
 | 117 | #define PROF_END( args )                ; | 
 
 
 
 
 | 118 | #endif | 
 
 
 
 
 | 119 |  | 
 
 
 
 
 | 120 |  | 
 
 
 
 
 | 121 | //  Global Structures Defintions | 
 
 
 
 
 | 122 |  | 
 
 
 
 
 | 123 | //  General data struct shared by both files  /  folders that we have opened | 
 
 
 
 
 | 124 | struct gen_privdata | 
 
 
 
 
 | 125 | { | 
 
 
 
 
 | 126 | int fd; | 
 
 
 
 
 | 127 | unsigned int indir_fat_clusters[ 32 ]; | 
 
 
 
 
 | 128 | unsigned int first_allocatable; | 
 
 
 
 
 | 129 | unsigned int last_allocatable; | 
 
 
 
 
 | 130 | unsigned char dirent_page; | 
 
 
 
 
 | 131 | }; | 
 
 
 
 
 | 132 |  | 
 
 
 
 
 | 133 | //  the structure used by files that we have opened | 
 
 
 
 
 | 134 | struct file_privdata | 
 
 
 
 
 | 135 | { | 
 
 
 
 
 | 136 | struct gen_privdata gendata; | 
 
 
 
 
 | 137 | unsigned int file_startcluster; | 
 
 
 
 
 | 138 | unsigned int file_length; | 
 
 
 
 
 | 139 | unsigned int file_position; | 
 
 
 
 
 | 140 | unsigned int file_cluster; | 
 
 
 
 
 | 141 | unsigned int cluster_offset; | 
 
 
 
 
 | 142 | unsigned int file_dirpage; | 
 
 
 
 
 | 143 | }; | 
 
 
 
 
 | 144 |  | 
 
 
 
 
 | 145 | //  the structure used by directories that we have opened | 
 
 
 
 
 | 146 | struct dir_privdata | 
 
 
 
 
 | 147 | { | 
 
 
 
 
 | 148 | struct gen_privdata gendata; | 
 
 
 
 
 | 149 | unsigned int dir_number;      //  first or second entry in the cluster? | 
 
 
 
 
 | 150 | unsigned int dir_cluster;     //  what cluster we are currently reading directory entries from | 
 
 
 
 
 | 151 | unsigned int dir_length;      //  the length of the directory | 
 
 
 
 
 | 152 | }; | 
 
 
 
 
 | 153 |  | 
 
 
 
 
 | 154 | //  date  /  time descriptor | 
 
 
 
 
 | 155 | typedef struct { | 
 
 
 
 
 | 156 | unsigned char  unused0; | 
 
 
 
 
 | 157 | unsigned char  sec; | 
 
 
 
 
 | 158 | unsigned char  min; | 
 
 
 
 
 | 159 | unsigned char  hour; | 
 
 
 
 
 | 160 | unsigned char  day; | 
 
 
 
 
 | 161 | unsigned char  month; | 
 
 
 
 
 | 162 | unsigned short year; | 
 
 
 
 
 | 163 | } vmc_datetime; | 
 
 
 
 
 | 164 |  | 
 
 
 
 
 | 165 | //  the structure of a directory entry | 
 
 
 
 
 | 166 | struct direntry | 
 
 
 
 
 | 167 | { | 
 
 
 
 
 | 168 | unsigned short mode;            //  See directory mode definitions. | 
 
 
 
 
 | 169 | unsigned char  unused0[ 2 ];    //  - | 
 
 
 
 
 | 170 | unsigned int   length;          //  Length in bytes if a file, or entries if a directory. | 
 
 
 
 
 | 171 | vmc_datetime   created;         //  created time. | 
 
 
 
 
 | 172 | unsigned int   cluster;         //  First cluster of the file, or 0xFFFFFFFF for an empty file. In "." entries it's the first cluster of the parent directory relative to first_allocatable. | 
 
 
 
 
 | 173 | unsigned int   dir_entry;       //  Only in "." entries. Entry of this directory in its parent's directory. | 
 
 
 
 
 | 174 | vmc_datetime   modified;        //  Modification time. | 
 
 
 
 
 | 175 | unsigned int   attr;            //  User defined attribute. | 
 
 
 
 
 | 176 | unsigned char  unused1[ 28 ];   //  - | 
 
 
 
 
 | 177 | unsigned char  name[ 32 ];      //  Zero terminated name for this directory entry. | 
 
 
 
 
 | 178 | unsigned char  unused2[ 416 ];  //  - | 
 
 
 
 
 | 179 | }; | 
 
 
 
 
 | 180 |  | 
 
 
 
 
 | 181 | //  A structure containing all of the information about the superblock on a memory card. | 
 
 
 
 
 | 182 | struct superblock | 
 
 
 
 
 | 183 | { | 
 
 
 
 
 | 184 | unsigned char  magic[ 40 ]; | 
 
 
 
 
 | 185 | unsigned short page_size; | 
 
 
 
 
 | 186 | unsigned short pages_per_cluster; | 
 
 
 
 
 | 187 | unsigned short pages_per_block; | 
 
 
 
 
 | 188 | unsigned short unused0;                        //  always 0xFF00 | 
 
 
 
 
 | 189 | unsigned int   clusters_per_card; | 
 
 
 
 
 | 190 | unsigned int   first_allocatable; | 
 
 
 
 
 | 191 | unsigned int   last_allocatable; | 
 
 
 
 
 | 192 | unsigned int   root_cluster;               //  must be 0 | 
 
 
 
 
 | 193 | unsigned int   backup_block1;              //  1023 | 
 
 
 
 
 | 194 | unsigned int   backup_block2;              //  1024 | 
 
 
 
 
 | 195 | unsigned char  unused1[ 8 ];                     //  unused  /  who knows what it is | 
 
 
 
 
 | 196 | unsigned int   indir_fat_clusters[ 32 ]; | 
 
 
 
 
 | 197 | unsigned int   bad_block_list[ 32 ]; | 
 
 
 
 
 | 198 | unsigned char  mc_type; | 
 
 
 
 
 | 199 | unsigned char  mc_flag; | 
 
 
 
 
 | 200 | unsigned short unused2;                  //  zero | 
 
 
 
 
 | 201 | unsigned int   cluster_size;             //  1024 always, 0x400 | 
 
 
 
 
 | 202 | unsigned int   unused3;                  //  0x100 | 
 
 
 
 
 | 203 | unsigned int   size_in_megs;             //  size in megabytes | 
 
 
 
 
 | 204 | unsigned int   unused4;                  //  0xffffffff | 
 
 
 
 
 | 205 | unsigned char  unused5[ 12 ];            //  zero | 
 
 
 
 
 | 206 | unsigned int   max_used;                 //  97%of total clusters | 
 
 
 
 
 | 207 | unsigned char  unused6[ 8 ];             //  zero | 
 
 
 
 
 | 208 | unsigned int   unused7;                  //  0xffffffff | 
 
 
 
 
 | 209 | }; | 
 
 
 
 
 | 210 |  | 
 
 
 
 
 | 211 | //  General vmc image structure | 
 
 
 
 
 | 212 | struct global_vmc | 
 
 
 
 
 | 213 | { | 
 
 
 
 
 | 214 | int               fd;                                    //  global descriptor | 
 
 
 
 
 | 215 | struct superblock header;                                //  superblock header | 
 
 
 
 
 | 216 | int               formated;                              //  card is formated | 
 
 
 
 
 | 217 | int               ecc_flag;                              //  ecc data found in vmc file | 
 
 
 
 
 | 218 | unsigned int      card_size;                             //  vmc file size | 
 
 
 
 
 | 219 | unsigned int      total_pages;                           //  total number of pages in the vmc file | 
 
 
 
 
 | 220 | unsigned int      cluster_size;                          //  size in byte of a cluster | 
 
 
 
 
 | 221 | unsigned short    erase_byte;                            //  erased blocks have all bits set to 0x0 or 0xFF | 
 
 
 
 
 | 222 | unsigned int      last_idc;                              //  last indirect cluster | 
 
 
 
 
 | 223 | unsigned int      last_cluster;                          //  last cluster | 
 
 
 
 
 | 224 | unsigned int      indirect_cluster[ MAX_CLUSTER_SIZE ];  //  indirect fat cluster | 
 
 
 
 
 | 225 | unsigned int      fat_cluster[ MAX_CLUSTER_SIZE ];       //  fat cluster | 
 
 
 
 
 | 226 | unsigned int      last_free_cluster;                     //  adress of the last free cluster found when getting free cluster | 
 
 
 
 
 | 227 | }; | 
 
 
 
 
 | 228 |  | 
 
 
 
 
 | 229 |  | 
 
 
 
 
 | 230 | extern struct global_vmc g_Vmc_Image[ 2 ]; | 
 
 
 
 
 | 231 | extern int               g_Vmc_Format_Mode; | 
 
 
 
 
 | 232 | extern int               g_Vmc_Remove_Flag; | 
 
 
 
 
 | 233 | extern int               g_Vmc_Initialized; | 
 
 
 
 
 | 234 |  | 
 
 
 
 
 | 235 |  | 
 
 
 
 
 | 236 | //  vmc_fs.c | 
 
 
 
 
 | 237 | int          Vmc_Initialize ( iop_device_t * driver ); | 
 
 
 
 
 | 238 | int          Vmc_Deinitialize ( iop_device_t * driver ); | 
 
 
 
 
 | 239 |  | 
 
 
 
 
 | 240 | // vmc_io.c | 
 
 
 
 
 | 241 | int          Vmc_Format    ( iop_file_t *, const char *dev, const char *blockdev, void *arg, size_t arglen ); | 
 
 
 
 
 | 242 | int          Vmc_Open      ( iop_file_t *f, const char *name, int flags, int mode ); | 
 
 
 
 
 | 243 | int          Vmc_Close     ( iop_file_t* f ); | 
 
 
 
 
 | 244 | int          Vmc_Read      ( iop_file_t* f, void* buffer, int size ); | 
 
 
 
 
 | 245 | int          Vmc_Write     ( iop_file_t* f, void* buffer, int size ); | 
 
 
 
 
 | 246 | int          Vmc_Lseek     ( iop_file_t* f, unsigned long offset, int whence ); | 
 
 
 
 
 | 247 | int          Vmc_Ioctl     ( iop_file_t* f, unsigned long request, void* data ); | 
 
 
 
 
 | 248 | int          Vmc_Remove    ( iop_file_t* f, const char* path ); | 
 
 
 
 
 | 249 | int          Vmc_Mkdir     ( iop_file_t* f, const char* path1, int mode ); | 
 
 
 
 
 | 250 | int          Vmc_Rmdir     ( iop_file_t* f, const char* path1 ); | 
 
 
 
 
 | 251 | int          Vmc_Dopen     ( iop_file_t* f, const char* path ); | 
 
 
 
 
 | 252 | int          Vmc_Dclose    ( iop_file_t* f ); | 
 
 
 
 
 | 253 | int          Vmc_Dread     ( iop_file_t* f, iox_dirent_t *buf ); | 
 
 
 
 
 | 254 | int          Vmc_Getstat   ( iop_file_t* f, const char* path, iox_stat_t * stat ); | 
 
 
 
 
 | 255 | int          Vmc_Chstat    ( iop_file_t* f, const char* path, iox_stat_t * stat, unsigned int unknown ); | 
 
 
 
 
 | 256 | int          Vmc_Rename    ( iop_file_t* f, const char* path, const char* new_name ); | 
 
 
 
 
 | 257 | int          Vmc_Chdir     ( iop_file_t* f, const char* path ); | 
 
 
 
 
 | 258 | int          Vmc_Sync      ( iop_file_t* f, const char* device, int flag ); | 
 
 
 
 
 | 259 | int          Vmc_Mount     ( iop_file_t* f, const char* fsname, const char* devname, int flag, void *arg, unsigned int arg_len ); | 
 
 
 
 
 | 260 | int          Vmc_Umount    ( iop_file_t* f, const char* fsname ); | 
 
 
 
 
 | 261 | int          Vmc_Lseek64   ( iop_file_t* f, long long offset, int whence ); | 
 
 
 
 
 | 262 | int          Vmc_Devctl    ( iop_file_t* f, const char* path, int cmd, void *arg, unsigned int arglen, void *buf, unsigned int buflen ); | 
 
 
 
 
 | 263 | int          Vmc_Symlink   ( iop_file_t* f, const char* old, const char* new ); | 
 
 
 
 
 | 264 | int          Vmc_Readlink  ( iop_file_t* f, const char* path, char* buf, unsigned int buf_len ); | 
 
 
 
 
 | 265 | int          Vmc_Ioctl2    ( iop_file_t* f, int cmd, void *arg, unsigned int arglen,    void *buf, unsigned int buflen ); | 
 
 
 
 
 | 266 | int          Vmc_Recover   ( int unit, const char* path1 ); | 
 
 
 
 
 | 267 | unsigned int Vmc_Checkfree ( int unit ); | 
 
 
 
 
 | 268 | int          Vmc_Clean     ( int unit ); | 
 
 
 
 
 | 269 |  | 
 
 
 
 
 | 270 | //  mcfat.c | 
 
 
 
 
 | 271 | typedef enum { | 
 
 
 
 
 | 272 | FAT_VALUE, | 
 
 
 
 
 | 273 | FAT_MASK | 
 
 
 
 
 | 274 | } GetFat_Mode; | 
 
 
 
 
 | 275 |  | 
 
 
 
 
 | 276 | typedef enum { | 
 
 
 
 
 | 277 | FAT_RESET, | 
 
 
 
 
 | 278 | FAT_SET | 
 
 
 
 
 | 279 | } SetFat_Mode; | 
 
 
 
 
 | 280 |  | 
 
 
 
 
 | 281 | unsigned int getFatEntry ( int fd, unsigned int cluster, unsigned int* indir_fat_clusters, GetFat_Mode Mode ); | 
 
 
 
 
 | 282 | unsigned int setFatEntry ( int fd, unsigned int cluster, unsigned int value, unsigned int* indir_fat_clusters, SetFat_Mode Mode ); | 
 
 
 
 
 | 283 |  | 
 
 
 
 
 | 284 |  | 
 
 
 
 
 | 285 | //  ps2.c | 
 
 
 
 
 | 286 | int          eraseBlock ( int fd, unsigned int block ); | 
 
 
 
 
 | 287 | int          writePage ( int fd, unsigned char* page, unsigned int pagenum ); | 
 
 
 
 
 | 288 | int          writeCluster ( int fd, unsigned char* cluster, unsigned int clusternum ); | 
 
 
 
 
 | 289 | int          writeClusterPart ( int fd, unsigned char* cluster, unsigned int clusternum, int cluster_offset, int size ); | 
 
 
 
 
 | 290 | int          readPage ( int fd, unsigned char* page, unsigned int pagenum ); | 
 
 
 
 
 | 291 | int          readCluster ( int fd, unsigned char* cluster, unsigned int clusternum ); | 
 
 
 
 
 | 292 |  | 
 
 
 
 
 | 293 |  | 
 
 
 
 
 | 294 | //  misc.c | 
 
 
 
 
 | 295 | unsigned int getDirentryFromPath ( struct direntry* retval, const char* path, struct gen_privdata* gendata, int unit ); | 
 
 
 
 
 | 296 | unsigned int addObject ( struct gen_privdata* gendata, unsigned int parentcluster, struct direntry* parent, struct direntry* dirent, int unit ); | 
 
 
 
 
 | 297 | void         removeObject ( struct gen_privdata* gendata, unsigned int dirent_cluster, struct direntry* dirent, int unit ); | 
 
 
 
 
 | 298 | unsigned int getFreeCluster ( struct gen_privdata* gendata, int unit ); | 
 
 
 
 
 | 299 | int          getPs2Time ( vmc_datetime* tm ); | 
 
 
 
 
 | 300 | int          setDefaultSpec ( int unit ); | 
 
 
 
 
 | 301 | int          buildECC ( int unit, char* Page_Data, char* ECC_Data ); |