METHOD AND APPARATUS FOR CREATING A CD-ROM DISC FOR USE WITH MULTIPLE OPERATING SYSTEMS

Abstract: A method and apparatus for making a single CD-ROM disc useable on computers having unrelated operating systems or for multi-media platforms, specifically, wherein the two different operating systems are Hierarchical File System (HFS) (11) used by Macintosh computers and MS-DOS (13) which is the operating system used by IBM and compatible personal computers. The resulting compact disc is in ISO 9660 format (25) which is a standard of the International Standards Organization which describes a logical format for organizing data on a Compact Disc Read Only Memory (CD-ROM). In this manner, it is possible to, for example, store two versions of a program on the same CD-ROM, one for execution on Macintosh computers and the other for execution on IBM PC and compatible computers. Thus, data which is to be stored on an ISO 9660 formatted disc can be sent from the producer or supplier of the data to a compact disc presser on a single magnetic medium such as a Bernoulli removable cartridge disk (17) under a single operating system partition.

Description: METHOD AND APPARATUS FOR CREATING A CD-ROM DISC FOR USE WITH MULTIPLE OPERATING SYSTEMS SUMMARY OF THE INVENTION The invention is directed to a method and apparatus for making a single CD-ROM disc useable on computers having unrelated operating systems or for multi-media platforms, specifically, wherein the two different operating systems are Hierarchical File System (HFS) used by Macintosh computers and MS-DOS which is the operating system used by IBM and compatible personal computers. The resulting compact disc is in ISO 9660 format. The concepts of the present invention are intended to work with any operating system which supports the ISO 9660 format which is a standard of the International Standards Organization which describes a logical format for organizing data on a Compact Disc Read Only Memory (CD-ROM) . By use of the present invention, it is possible to, for example, store, two versions of a program on the same CD-ROM, one for execution on Macintosh computers and the other for execution on IBM PC and compatible computers. By using the present invention, data which is to be stored on an ISO 9660 formatted disc can be sent from the producer or supplier of the data to a compact disc presser on a single magnetic medium such as a Bernoulli removable cartridge disk under a single operating system partition. BRIEF DESCRIPTION OF THE DRAWINGS Figure 1 is a diagramatic representation of the processing performed in conjunction with the present invention. Figure 2 is a hierarchical diagram of the processing performed by block 23 of Figure 1. DETAILED DESCRIPTION OF THE INVENTION Referring to Figure 1, data and programs which are desired to be placed onto the CD-ROM disc are stored in their native file formats, e.g., Macintosh files 11 and PC files 13 on storage media and systems associated with a computer system such as hard disk drives. In the preferred embodiment, both the PC files and the Macintosh files are transferred to an MS-DOS formatted Bernoulli cartridge. This can be accomplished using commercially available products which convert HFS files to MS-DOS format (Block 15 in Figure 1) and store the converted files on Bernoulli cartridge 17. A suitable software package which performs this function is known as Bernoulli file exchange available from Iomega of Roy, Utah. The conversion simply copies the files in MS-DOS format from PC files 13 to Bernoulli cartridge 17. However, Macintosh HFS files which are physically one file may be logically comprised of a data fork and a resource fork or only a data fork or only a resource fork. When a Macintosh file having both a data fork and a resource fork is copied to an MS-DOS partition, in order to maintain the integrity of the Macintosh file, since MS-DOS does not have a structure analogous to the resource fork, it is necessary to create two physically distinct MS-DOS files. one for the data fork portion of the file and the other for the resource fork portion of the same Macintosh file. Both files have the same name, but the resource fork file is placed in a hidden directory called Resource.FRK at the same level as the data fork file. Inasmuch as some Macintosh files comprise only resource forks, while others comprise only data forks, there may not be entries in the hidden Resource.FRK directory corresponding to a file in the data fork directory on Bernoulli cartridge 17. Conversely, in such situations, there may not be a data fork file which correspond to an entry in the hidden Resource.FRK directory on Bernoulli cartridge 17. Additionally, placing an HFS directory and file on an ISO 9660 formatted compact disc with a name longer than eight characters (e.g., GUIDED_TOUR) , and with the correct file owner (e.g., WILD) and type (e.g., STAK) is ordinarily not possible when an intermediate step in the processing requires the use of an MS-DOS partition since MS-DOS names are limited to 8 characters with an optional, up to 3 character, extension. Additionally, MS-DOS does not maintain file owner and type information. The present invention resolves these problems by referencing an ASCII file called RENAMER having four columns of information. As shown in the following Table I, the first column is a list of filenames of all files to be processed for Macintosh compatibility on Bernoulli cartridge 17, with at least one trailing X added so that the name is eight characters long, the second column is a list of the eventual ISO file names, the third column is the HFS file type and owner concatenated together, and the fourth column is a list of letters B, D, or R, which refer to the data and resource fork parts of the file. B refers to a file having both a data and resource fork, D refers to a file having only a data fork and R refers to a file having only a resource fork. TABLE I The RENAMER file 18 is presently created by first ensuring that HFS files on media 11 are named in a manner which will not create problems when converted to legal MS-DOS names (e.g., two file names should be unique in eight characters or less and should not have imbedded spaces or special characters) . It will be readily apparent to persons skilled in the art as to what names can be used without creating problems. The RENAMER file is created manually by, for example, a word processor producing an ASCII file with four columns as described above. The RENAMER file can of course be created by a routine which performs the aforesaid processing to create the RENAMER file. To create the CD-ROM disc, it is first necessary to create a CD-ROM disc image in ISO 9660 format from the data on the Bernoulli cartridge (processing performed by block 19) . The creation of the CD-ROM disc image which is also known as pre- mastering, can be performed using readily available commercial software such as Topix from Optical Media. The resulting image of the CD-ROM disc resides on a hard disk 21 which must have sufficient capacity to store the CD-ROM disc image which may be 600 megabytes or larger. Although the CD-ROM can be pressed from the image on hard disk 21, programs on the resulting compact disc would not execute on a Macintosh computer since critical information contained in the resource fork is stored in a separate file in the hidden Resource.FRK directory. The present invention modifies directory records to resolve resource fork/data fork problems and the loss of complete file names, and owner and type information resulting from the temporary storage in an MS-DOS partition. In essence, the present invention performs modifications to the CD-ROM image hard disk directory on disk 21 correcting problems which are not properly handled by the software 19 used by compact disc pressers to create CD-ROM masters. Pre-mastering of the data on the Bernoulli cartridge 17 requires attention to the order of how files are placed in the CD-ROM image hard disk directory on disk 21. As noted above, during the conversion from HFS to MS-DOS format, both the resource and data fork files placed on the Bernoulli cartridge have the same name, but do not conflict with each other because they are in different directories (or folders) . At the time of pre-mastering, the two files (data and resource) must be placed in the same directory (folder) level. However, since only a single file name is associated with the data fork and resource fork of an HFS file, a conflict would arise if resource fork and data fork files were created with the same name in the same level directory. To resolve this conflict, each resource fork file name is renamed (using, for example, the MS-DOS RENAME command) to have the letter "X" appended to the name (e.g., old resource fork name = "REQUIEM", new resource fork name = "REQUIEMX"). If the original name is already eight characters long, then to maintain MS-DOS compatibility, the eighth (8th) character is forced to be the letter "X" (e.g. old resource fork name = "SUPERCAR", new resource fork name ="SUPERCAX") . Similarly, and in order to guarantee placement of the data fork file directory entry after the corresponding resource fork file directory entry in the ISO 9660 format directory record, the data fork file is renamed to have the letter "Y" appended to the name (e.g. old data fork name = "REQUIEM", new data fork name = "REQUIEMY"). If the original name is already eight characters long, then to maintain MS-DOS compatibility, the eight (8th) character is forced to be the letter "Y" (e.g, . old data fork name = "SUPERCAR", new data fork name = "SUPERCAY"). It should be noted that even though the directory entries for the resource and data fork files must be sequential and unseparated, the corresponding data of each resource and data fork file can physically reside anywhere on the CD-ROM disc. Following the convention set forth above, all files on Bernoulli cartridge 17 are processed by program 19 and transferred to the CD-ROM image hard disk 21 on the pre- mastering workstation. Before program 19 is used to transfer data from cartridge 17 to disk 21, the data on cartridge 17 must be pre-processed. The files on cartridge 17 that exist in the hidden resource.FRK directory are moved into the visible data.FRK directory using a standard off-the-shelf program such as XTPRO from Executive Systems. The files in the resource.FRK directory are tagged and moved with the AUTOMATICALLY REPLACE EXISTING FILES switch of XTPRO set to NO so as to verify that none of the moved files will over-write the existing data.FRK directory files. Then, all the files in the data. ' FRK are sorted by name in ascending order using an off-the-shelf utility such as Norton Utilities from Peter Norton Corporation. Program 19 is used now to transfer files from disk 17 by prompting for the name of the pre-processed directory which now contains both resource and data files which have been sorted in alphabetical order. The processing performed by program 19 also builds the ISO 9660 directory record(s) when the resource and data files are copied from Bernoulli cartridge 17 to CD-ROM image hard disk 21. After all files are transferred to CD-ROM image hard disk 21, the virtual CD-ROM directory block(s) from the CD-ROM image hard disk are written to a conventional MS-DOS file (ISO.DOS) which may be on disk 21 or a separate MS-DOS hard disk. The CD- ROM directory block(s) are transferred to ISO.DOS using a program from Optical Media called VCD2FILE.EXE. This program allows the simple transfer of virtual CD blocks from disk 21 to a file on any destination MS-DOS disk drive. The user prompts the program with name of the file to create. The resultant file will have the contents of the virtual CD-ROM directory blocks specified by the user. The program VCD2FILE.EXE has no knowledge of directory blocks or any other types of blocks, so the user is responsible for identifying the beginning and ending locations on the virtual CD-ROM disk 21 that contain valid directory block(s) . The actual locations for the directory blocks are specified by the user at the time of transfer from disk 17 to disk 21 by use of program 19. The directory blocks form the ISO.DOS file which is a directory file that contains the names and location of the HFS files to be converted. As noted above, the ISO.DOS file contains resource fork and data fork file names. If a resource fork file does not have a data fork file part, then only the resource fork file name will be present in the ISO.DOS file. If a data fork file does not have a resource fork file part, then only the data fork file name will be present in the ISO.DOS file. However, if the data fork file does have a resource fork file part, then both file names will be present in the ISO.DOS file. The resource fork file name appears first and is immediately followed by the data fork file name. Each file name (data or resource) in the ISO.DOS file is referred to as an entry. Therefore, in the ISO.DOS file, the resource fork file name is the first entry and is also called the associated entry, so its associated bit is set by the ISO.PC program. The next entry is the data fork file name and is not associated with any other entries, so its associated bit is cleared by the ISO.PC program. For data files which have no resource file and for resource files with no data files, the associated bit is always cleared by the ISO.PC program. The ISO.DOS file is processed using a computer program 23 which forms the present invention (attached hereto as Appendix 1) that customizes the data of the directory records using the RENAMER file and writes the resultant data creating a new file (ISO.ISO) . In particular, the program opens the RENAMER file which is read and processed. As noted above, RENAMER contains DOS names, HFS names, and type and owner, and the file fork indicator letter. The file ISO.DOS is processed by looking for a file name that matches one of the file names contained in the RENAMER file. When a match is found, the ISO name is inserted over the DOS name. Padding is added at the end of each file name, the directory record's length is adjusted relative to the ISO name inserted, and all lengths are updated (the ISO directory record is a variable length record) . Next the type and owner information is inserted and again the length values are adjusted. This process is repeated on the next entry if the current entry is an associated entry. Then the associated bit of the first entry is set and the corresponding bit of the next entry is cleared. The above process is repeated for each file name match between the ISO.DOS file and the RENAMER file. The customization makes the changes needed to.form a proper Macintosh resource and data fork in the ISO 9660 format directory record, with both members of the pair having the same name. The file name for each file pair may also be changed to a name that is not restricted to MS-DOS requirements (that is, greater than 8 characters plus a 3 character extension) , and may or may not end with ".; (version*) " . The ISO.ISO file is then rewritten back to the CD-ROM image hard disk 21 shown in Figure 1 as the corrected image of CD-ROM disc in ISO 9660 format on hard disk 25 so that it overwrites the data originally used to make ISO.DOS. This step essentially replaced the old directory records with new modified ones that still point to the correct data somewhere else on the CD-ROM image hard disk 25. Figure 2 is a hierarchical diagram of the routines (main 31, addext 33, fixfile 35, setupxref 37, dosxref 39 and updatecd 41) utilized by the present invention. The following is a description of each of the routines and the parameters passed to or from each routine, main (Ta. Tbl1) If no command line parameters are present, Help information is printed to the screen. Parameter (a) is the name of the "source" file (with or without a .dos extension) and is required. Parameter (b) is the name of the "resultant" file (with or without an .iso extension) and is optional. The main() routine tests for the presence of parameter(s) and prints Help information if no parameters are present. If parameters are present, main() (i) creates and adjusts file names using defaults and overrides; (ii) allocates the entire working memory needed for the source and resultant file; (iii) opens the source file and the RENAMER file, reads the contents of the "source" file, fills any extra buffer space with 00's and closes the source file; (iv) calls "setxref" to read in the renaming tables from the RENAMER file and closes the RENAMER file; (v) calls the "fixfile" routine to make the changes to the directory records as described herein; (vi) opens the "resultant" file and writes the same amount of data as read from the "source" file from the working memory area and closes the "resultant" file; and (vii) frees the working memory, prints statistics and exits. addext (a.b) Parameter (a) is a file name and parameter (b) is a file extension. If the file name has no ".", the file extension is added to the file name, otherwise no changes are made. setupxref() The routine setupxref() has no parameters. The routine reads the RENAMER file and puts the four entries into four arrays as follows, where i ranges from 1 to 500: xref[i] .old => the source's old ".dos" name. xref[i].new => the resultant's new ".iso" name. sys_type[i => the system area TYPE and CREATOR. file-type[i] => the file fork indicator letter fixfile() The routine fixfile0 has no parameters. Zeroes out statistics. During a first pass, the routine loops through the data from the "source file" in the working memory which contains directory records according to the ISO 9660 standard (see Table II) to find all occurrences of ISO directories (based on the directory bit in byte location 26) and stores the number of bytes needed for all the directory records of all of the files contained in each directory in a table called dir_end. During a second pass, (i) if a length 0 is found for a directory record, the program guarantees that no records will span a 2K byte boundary (ISO requirement) and no 00's are left between records in a single 2K byte block; (ii) it skips records which describe actual ISO directories (folders) ; (iii) it makes validity checks on length for overall filesize and directory record entry, and if invalid, returns with an error and terminates; (iv) it determines if filenames for the current entry and the next entry match, then checks that the respective filename lengths match as well; (v) if both match, and the dosxref function finds the new name, the user is informed, and the new name is moved into both entry positions, adjusted for the new size of the names. Various special cases are handled like the end of a 2K byte buffer - if the dosxref function does not return a match, the entry is not modified; (vi) handles file names of less than 7 characters and 00 padding; (vii) deals with the Macintosh system area -TYPE and CREATOR from Table I are concatenated after the sequence <42><41><06> and followed with <01><00> (or <21><00> if the type is appl) and with another <00> if needed to make the directory record even; (viii) if required, it pushes all data starting with the next ISO directory record to the next 2048 byte boundary, and pads the end with 00's; and (ix) handles the change of filenames and system area for, data only (D) , and resource only (R) files. TABLE II ISO 9660 DIRECTORY RECORD LAYOUT (RELEVANT FIELDS) FIELD BYTE LOCATION 1 Length of current directory record (must be even) 2-10 (not relevant) 11-18 If this record describes a "directory" (or "folder") this is the length of the records for the file within this directory. 19-25 (not relevant) 26 File Flags 27-32 (not relevant) 33 Length of the file name (length) 34-(33+ length) File name 34+ length System Area (ending in an extra 00 byte only if needed to make the whole directory record an even number of bytes) updatecd(a) Parameter (a) is an unsigned integer which represents the position of the compact disc directory length. The. routine updates the compact disk directory length by adding 1 to the compact disc block count if more space is required. This allocates additional space in 2,048 byte increments. (However, this extension of the directory records will fit in the ISO image only if enough directory record space was reserved for growth during the pre astering process. ) dos re (ar rc) Parameter (a) is the DOS input file name, parameter (b) is the HFS output file name,and parameter (c) is the index of the three arrays created by setupxref() . The routine finds the DOS name in the xref[i].old array and copies the ISO name from the xref[i].new array and returns the index. A source code listing of the routines main 31, addext 33, fixfile 35, setupxref 37, dosxref 39 and updatecd 41 are attached hereto as Appendix 1. #include <stdlib.h> #include <stdio. > #include <dos.h> #include <string.h> #include <ctype.h> #include <fcntl.h> #include <sys\types.h> #include <sys\stat.h> #include <malloc.h> #include <io.h> #define true -1 #define false 0 #define FILE_BUF_SIZE 64000 Λ 0 to 59392 7 #define RENAMER_BUF_SIZE 500 #define DIR_ARRAY_SIZE 32 Λ 29 * 2048 ( ONE CD BLOCK ) = 59392 7 unsigned intfilesize; unsigned int filecount; unsigned int dir_end[DIR_ARRAY_SIZE]; int last_dir_cnt; int blocksize; int dir_entry, gen_entry; int pair_entry, pair_entry_chd, pair_entry )assed; int sng_entry, sng_entry_chd, sng_entry_passed; /* int even; used to determine if new file name is odd or even 7 char * filebuf; char "buffer; char sysarea[14] = { 0X42, 0X41, 0X06, 'S'. .'A'.'K'.'W'.T.'L'.'D', 0X01, 0X00, 0X00 }; char nullchar[1] = { 0x00 }; FILE *xreffile struct { char old[20]; char new[33I; } xref[RENAMER_BUF_SIZE]; char sys_type[RENAMER_BUF_SIZE][33]; char file_type[RENAMER_BUF_SIZE][33]; int xreflines; #**#*******♦********************»*********************************************/ / * main 7 ft****************************************************************************/ main(int argc.char * argv[]) { int i.count; unsigned int size_of_buffer; int source.result; char sourcename[20],resultname[201; if (argc == 1) { printfCWisoV syntax :\n u ); printf(" iso <sourcename> <resuttname>\n"); printfC where <sourcename> = name of source file\n"); printf (" <resultname> = name of result file\n"); printfC if file names extensions are not included,\n"); printf (" V.dosV will be used for the source file, and n"); printfC \".iso\ u will be usecLfor the report file\n"); printf( B if no result file name is given, it is assumed to be\n"); printfC t ne same as the source file name, with extension WisoW); printfC Also, existence of file called 'renamer 1 assumed^"); exit(1); strcpy(sourcename,argv[1 ]); / * Format name of output file... 7 if (argc == 2) { strcpy(resultname,sourcename); "strchrfresultname,'.') = '\0'; } else strcpy(resultname,argv[2]); addext(sourcename,".DOS"); addext(resultname,".ISO"); / * Allocate file buffers, open source file and read contents... 7 size_of_buffer = FILE_BUF_SIZE; filebuf = ( char * ) halIoc(size_of_buffer,2); if (filebuf == NULL) { printf("\nNot enough memory for file buffeAn"); exit(2); } buffer = ( char * ) malloc(2048); if (buffer = NULL) { printf(" nNot enough memory for buffer file\n"); exit(2); } source = open(sourcename,0_BINARY | 0_RDONLY); xreffile = fopen("renamer\0", u r"); if (source = -1 II xreffile == NULL) { if (source == -1) printf("\nError opening source file %s\n",sourcename); else printf("\nError opening file 'renamerV); hfree(filebuf); free(buffer); exit(3); } f ilesize = 0; blocksiz =0; do { blocksize = read(source,buffer,2048); for (i=0;i<blocksize;ϊ++) { filebuf[filesize+i] = buffer[i]; } filesize = filesize + blocksize; } while (blocksize > 0); if (filesize == FILE_BUF_SIZE) { printfpnSource file %s too large (must be less than %d bytes)\n", sourcename,FILE_BUF_SIZE); hfree(filebuf); free uffer); exit (3); } /* clear out buffer after use. 7 for (i=0;i<2048;i++){ buffer[i] = 0x00; } close(source); r Setup the xref array by reading and formatting 'renamer 1 7 setupxrefO; fclose(xreffiIe); Go re-format the directory... 7 fixfileO; if (( result = open(resultname,0_CREAT I O.BINARY I 0_WRONLY I O.TRUNC, SJREAD I SJWRITE )) == -1)( printf("\nError opening result file %s\n",resultname); hfree(filebuf); free(buffer); exit(4); } filecount = 0; do { ff( (filecount + 2048) <= filesize ) { blocksize = 2048; } else { blocksize = filesize - filecount; } for(i=0;i<blocksize;i++){ bufferϊj] = filebuplecount + i]; } count = write(result,buffer,blocksize); filecount = filecount + count; }while(filecount < filesize); close(result); hfree(filebuf); free(buffer); printf(" ndirectory entries = %d n u ,dir_entry); printf("total entries found = %d\n u ,gen_entry); printf("pair entries found = %d n",pair_entry); printf("pair entries changed = %d n",pair_entry_chd); printf("pair entries passed = %d\n",pair_entry_passed); printfCsingle entries found = %d\n u ,sng_entry); printfCsingle entries changed = %d\n B ,sng_entry_chd); printfCsingle entries passed = %d\n",sng_entry_passed); exrt(0); /* setupxref() - Reads and processed the file 'renamer 1 for cross-referencing 7 setupxref() I * Setup the xref matrix by reading the xref file and formatting into memory 7 { char curline[RENAMER_BUF_SIZE]; char dos_name[33], mac_name[33], area_type[33], type[33]; int count; int stln; int ij; i = 0; while (NULL != fgets(curline, RENAMER_BUF_SIZE, xreffile)) { count = sscanf(curline, " %[ Λ >]> %[ Λ >]> %[ Λ >]> %[ \n]", dos_name, mac_name, areajype, type); ff (strlen(dos_name) > 20 II count != 4) { if (strlen(dos_name) > 20) fprintf(stderr, "DOS name %s is too long!\n", dos_name); else fprintf(stderr, "Can't understand input line %s!\n", curline); free(filebuf); exit(4); } sscanf(dos_name, "%s", xref[i].old); I* Remove trailing white-space7 sscanf(mac_name, "%s", xref[i].new); strcpy (sy s_ty p e [ i] , areajype); strcpy(file_type[i], type); if (++I > RENAMER_BUF_SIZE) exit(5); } xreflines = i; } SUBSTITUTE SHEET HH+tt±±t*********************************************************************/ I* doxrefO - looks up 'dosname' in xref matrix & maps it to mac equivalent 7 l******************************t**********************************************f char doxref(char * dosname, char * macname, int Index) { int i; for (i=0; i < xreflines; i++) if (strcmp(dosname, xref[i].old) == 0) { strcpy(macname, xref[i].new); * index=i; return true; } *index = -1; return false; } i*******************^**********************************^********************** / /* updatecdO - updates the cd directory length by adding 1 to cd block count 7 /****#********************************************************************#*♦♦ void updatecd( unsigned int *cd_position ) { unsigned int i,j,k; i = *cd_position; /* calculate new value to dir_end and CD block */ j = (filebuf[i+16] * 0x100) + filebuf[i+17]; j = j + 2048; k = j / 0x100; j = j - ( k * 0x100); I* if directory entry and directory length > 0 */ I* update CD block length */ if( ( ( filebuf[i+25] & 0x02) == 0x02 ) && ( filebufp] > 0 ) ) { filebuf[i+10] = j; filebuf[i+11] = k; filebuf[i+12] = filebuf[i+13] = 0x00; filebuf[i+14] = filebuf[i+15] = 0x00; filebuf[i+16] = k; filebuf[i+17] = j; dir_end[last_dir_cnt] = dir_end[last_dir_cnt] + 0x800; } /* if associated directory exists, update it. 7 /* filebuf[ position + entry length + byte count 7 if( ( ( filebufp + filebufp] + 25] & 0x02) == 0x02 ) && ( filebuffi + filebufjf ]] > 0 ) ) { filebuφ + filebufp] + 10] = j; filebufp + filebufp] + 11] = k; filebuffi + filebufp] + 12] = 0x00; filebuf [i + filebuf [i] + 13] = 0x00; filebuf [i + filebufp] + 14] = 0x00; filebufp + filebufp] + 15] = 0x00; filebufp + filebufp] + 16] = k; filebuf[i + filebufp] + 17] = l; I* addext 7 addext(char "filename, char * ext) { / * strupr(filename); * / if (strchr(filename,'.') == NULL) strcat(filename,ext); } A*****************************************************************************/ I* fixfile locates which file names will be changed, inserts the new 7 I* name, inserts the system area data and adjusts the rest 7 Λ of the file. 7 ft**************************************************************************** / fixfileQ { unsigned intfileindex,i,j,k; unsigned int paddingjength; int l,m; int match, length, addedjength; int dif; char curtext[80],nxttext[80]; char * curptr, * nxtptr,*sysptr,*difptr; unsigned int lastchunk; / * memcpy statement uses an integer variable 7 int sysSize; int index, ias dir, dirjarray; unsigned intfileindexjstart; char newname[33]; unsigned int cur lir; / * clear variables used to track entries 7 dir__entry = 0; gen_entry = 0; pair_entry = 0; pair_entry_chd = 0; pair_entry_passed = 0; sng_entry = 0; sng_entry_chd = 0; sng_entryjpassed = 0; / * clear out directory end array 7 for (l=1;k=DlR_ARRAY_SIZE;l++){ dir_end[l] = 0; } I* determine end of each directory 7 m = 0; fileindex = 0; while(fileindex <= filesize){ length = filebuf[fileindex]; /* find new way of knowing a directory starting point * / /* first directory tells its size, then go to next point if there 7 if( ( ( filebuf[fileindex+25] & 0x02 ) = 0x02 ) && ( length > 0 ) ){ m = m + 1; dir_end[m] = fileindex + (filebupleindex + 16] * 256) + (filebuf[fileindex + 17]); fileindex = dir_end[m]; ) else fileindex = fileindex + 1 ; } last_dir = -1; for(i=1 ;i<=DIR_ARRAY_SIZE;i++){ if ( (dir_end[i] == 0) && (last _dir < 0) ){ last_dir = i-1; } } Λ Set pointer to current entry-set to beg. of file 7 fileindex = 0; /* loop for each directory 7 for (last_dir_cnt=1 ;last_dir_cnt<=last_dir;last_dir_cnt++){ / * paddingjength is a variable used to determine is there is 7 / * any padding between entries. 7 7* set paddingjength to zero at start of directory 7 paddingjength = 0; I* Loop until we reach end of current directory.. / while (fileindex <= dir_end[last_dir_cnt] ) { I* Get length of current entry & see if we're done...7 length = f ilebuf[fileindex]; if (length = 0){ / * if length is equal to zero, no current entry, 7 I * SO add one and check the next byte until end of file 7 I * add one to paddingjength because there may be some 7 /* padding added at the 2048 byte boundry 7 /* continue will send control to outer while loop * / fileindex = fileindex + 1 ; paddingjength = paddingjength + 1 ; continue; } if paddingjength is greater than zero, must have found padding 7 Λ between two entries * / I * remove padding and move remaining bytes up. 7 ' if (paddingjength > 0){ dif - paddingjength * (-1 ); difptr = &filebuf[fileindex]; lastchunk = (unsigned int) (&filebuf[filesϊze]); Jmemmove(difptr+dif, difptr, lastchunk); I * adjust fileindex to new location 7 fileinde = fileinde + dif; paddingjength =0; / * insert 0x00 at the end of the file 7 j=filesize+ 1 + dif; for (i=j;k=filesize;i++){ filebufp] = 0x00; } } if ((filebu ileindex + 25] & 0x02) = 2){ / * if directory record bit 2 of byte 26 is set */ /* ( file flags ) means that directory record 7 /* identifies a directory and should be skipped 7 fileindex = fileindex + length; / * increment directory entry counter 7 dir_entry = dir_entry + 1; continue; } if ( (fileindex + length) >= filesize){ return false; } Make sure existing dir length is even & * / / * it starts on an even boundary 7 if ((length % 2 != 0) II (fileindex % 2 != 0)){ fprintf(stderr 1 " * Bad directory length (must be even) n"); return false; } / * find where the next entry is. addedjength is used to account 7 I* for padding before boundries. * / addedjength = 0; if( ( filebuf[fileindex] != filebuf[fileindex + length] ) && ( fiiebuf[fileindex + length] == 0x00 ) ){ do { if ( filebuf[fileindex + length + addedjength] == 0x00) { addedjength = addedjength + 1 ; } } while ( (filebuf[fileindex] != filebu leindex + length + addedjength]) && ( filebuf[fileindex + length + addedjength] = 0x00) && ( addedjength < 256) ); } /* if the two entry length don't match reset addedjength 7 if ( filebuf[fileindex] != filebu ileindex + length + addedjength] ){ addedjength = 0; } r I'm assuming that the padding is no longer needed at this point 7 / * because each previous entry has had its name changed and 7 I* system area added. Meaming that its location is no longer on 7 I * a boundry 7 /* So move the entry up the addedjength 7 if ( addedjength > 0 ) { dif = addedjength * (-1); difptr = &filebuf[fileindex+ length + addedjength]; lastchunk = (unsigned int) (&filebuf[filesize]); Jmemmove(difptr+dif, difptr, lastchunk); addedjength = 0; /* insert 0x00 at the end of the file 7 j = filesize + 1 + dif; for(i=j;k=filesize;i++){ filebufp] = 0x00; ] } Λ Get pointers to filenames for both entries & * / /* see if 1st 7 chars, match 7 curptr = &f ilebuf [fileindex + 33]; nxtptr s &fifebuf[fileindex + length + addedjength + 33]; match = true; for (i = 0; i < f ilebuffjileindex + 32] && i < 7; i++ J curptr++,nxtptr++) if (Cnxtptr) != ("curptr)) { match = false; } /* general entry found, increment counter 7 gen_entry = gen_entry + 1; / * Also verify that filename lengths match as well 7 if (i > 0 && match && filebupleindex + 32] == filebupleindex + length + addedjength + 32]) { I* Extract the filenames so we can notify user about the match 7 curptr = &filebuf[fileindex + 33]; nxtptr = &filebuf[fileindex + length + addedjength + 33]; for (i = 0; i < filebuf[fileindex + 32]; i++,cuφtr++,nxtptr++) { curtextp] = "curptr; nxttextp] = "nxtptr; "nxtptr = curtextp]; } curtextp] = \0'; nxttextp] = '\0'; /* pair of entries found, increment pair counter 7 pair_entry = pair_entry + 1; /* Cross reference the old names with the 'renamer 1 7 I* file and substitute 7 /* the result. 7 / * printf( u curtext= %s",curtext); 7 if (doxref(&curtext[0], newname, &index)) { ' priπtffMateh found : \ n %sV and \"%s\"\n",curtext,newname); Λ pair found and name is in renamer, so increment 7 / * pair_entry_chd * / pair_entry_chd = pair_entry_chd + 1; / * cur_dir is the value of the next cd border (2048, 4096..) 7 for(cur_dir=0x800;cur_dir<=fileindex;cur_dir=cur_dir+0x800); / * get difference of old name and new name 7 dif = strlen(newname) - filebuf[fileindex+32]; I * check if new file entry will extend over the CD border 7 /* dif = dos-mac name, 14 is system size and 1 is for even 7 I* file name lengths 7 if((fileindex+length+dif+14+1)>=(cur_dir-1)){ dif = curjdir - fileindex; difptr = &filebuf[fileindex]; lastchunk = ( unsigned int) (&filebuf[filesize-dif]-difptr); Jmemmove(difptr+dif,difptr,lastchunk); / * padding end of previous directory with 0x00 7 filebufp] = 0x00; } I* update the new fileindex value 7 fileindex = cur ir; / * Since first file went over the boundry and was moved 7 * down the second file is addedjength from first should 7 /" be moved up * / if ( addedjength > 0 )( dif = addedjength * (-1 ); difptr = &filebuf[fileindex + length + addedjength]; lastchunk = (unsigned int) (&filebuf[filesize]); Jmemmove(difptr+dif, difptr, lastchunk); addedjength =0; / * insert 0x00 at the end of the file 7 j = filesize + 1 + dif; for(i=j;i<=filesize;i++){ filebufp] = 0x00; } } I* if your at the last CD block and isopc needs more space 7 /* update all values to allow isopc ot continue into the 7 /" the next cd block 7 I* what if dir_end[?] is not equal to cur_dir */ jf(dir_end[lastjjir_cnt] = cur_dir)( if(last_dir_cnt>1){ i = dir_end[last_dir_cnt -1]; } / * what if last_dir_cnt is equal to 1 * / else{ i = 0x00; } updatecd ( &i ); } / * end if */ } /* end if ((fileindex + length.... 7 / * 7 Λ 7 / * if old file name is even, there will be a trailing 0x00 7 /* leave the trailing 0x00 and adjust the length of the 7 /* filename so that the 0x00 becomes part of the file name. 7 if( (filebupleindex + 32] % 2) = 0 )( filebupleindex + 32] = filebupleindex + 32] + 1 ; filebupleindex + 32 + length + addedjength] = filebupleindex + 32 + length + addedjength] + 1; } / * insert new file name * / dif = strlen(newname) - filebupleindex + 32]; if (dif > 0) { difptr = &filebuf[fileindex + 33 + dif]; / * Ptr to excess 7 lastchunk = (unsigned int) (&filebuf[filesize - dif] - difptr); Jmemmove(difptr + dif, difptr, lastchunk); memcpy(&filebupleindex + 33], newname, strlen(newname)); length += dif; / * And, for the companion entry... 7 difptr = &filebuf[fileindex + length + addedjength + 33 + dif]; Jmemmove(drfptr+ dif, difptr, lastchunk); memcpy(&filebuf[fileindex+ length + addedjength + 33], newname, strien(newname)); /* Now update all length bytes to reflect added data 7 f ilebuf[f ileindex] += dif; f ilebupleindex + length + addedjength] += dif; filebuf [fileindex + 32] = filebupleindex + length + addedjength + 32] = strlen(newname); } / * This new modification allows a file name to be less than 7 /* seven characters but greater than or equal to one character. 7 else rf( (dif>= -15) && (dif<=0) ){ * calculate what data to move up */ difptr = &filebuf [f ileindex] ' + filebupleindex]; lastchunk = (unsigned int) (&filebuf [filesize]) ; I * move the data up. */ Jmemmove(difptr+dif, difptr, lastchunk); r copy the new file name into place * / memcpy(&filebuf[fiIeindex+33], newname, strlen(newname)); length += dif; And, repeat for the companion entry... 7 difptr s &f ilebuf [f ileindex+length+added Jength]+ filebupleindex+length+addedjength]; Jmemmove(difptr+dif, difptr, lastchunk); memcpy(&filebupIeindex+length+addedJength+33], newname, strlen(newname)); /* Now update all lenght bytes to reflect added data 7 filebupleindex] += dif; filebupleindex+length+addedjength] += dif; filebupleindex + 32] = filebupIeindex+length+addedJength+32] = strlen(newname); / * insert 0x00 at the end of file 7 /* in this section, dif is a negative number 7 / * dif is used twice because of the main directory and 7 /* compainion entry * / j = filesize + 1 + dif + dif; for(i=j;k=filesize;i++){ filebufp] = 0x00; } } /* This section inserts a padding field (0x00) if the 7 Λ file name is even, (see section 9.1.12 of iso9660 std. 7 if ( (strlen(newname) % 2 ) == 0 ){ dif = 1; difptr = &filebuf[fileindex + 33 + strlen(newname)]; lastchunk = (unsigned int) (&fiiebuf[filesize - dif] - difptr); Jmemmove(difptr + dif, difptr, lastchunk); memcpy(&filebupleindex + 33 + strlen(newname)], nullchar, 1); length += dif; I * and, for the companion entry... 7 difptr = &filebuf[fileindex + length + addedjength + 33 + strlen(newname)]; Jmemmove(difptr + dif.difptr.lastchunk); memcpy(&filebup!eindex + 33 + length + addedjength + strlen(newname)],nullchar, 1); / * now update all length bytes to reflect added data 7 f ilebuf[f ileindex] = filebuf [fileindex] + 1;_ filebupleindex + length + addedjength] = filebuφ ileindex + length + addedjength] + 1; } / * Insert some space at end of entry for the new 7 UBSTIT TE SHEET / * system area, update the length bytes of both directory 7 /* entries and copy in the new data... 7 /* (We already know that dir length & boundary are even, so 7 Λ use the standard size for system area) 7 sysSize = 13 + ((fileindex + length + 13) % 2); if (fileindex + (((length + sysSize) « 1) + addedjength) > FILE_BUF 3IZE) { fprintf(stderr, " * Ran out of space for new directoryVT); return false; } /* bump both lengths 7 filebuf [fileindex] = filebuf [fileindex + length + addedjength] = length + sysSize; /* Get ptr to sysareato be 7 sysptr = &filebuf[fileindex + length]; lastchun = (unsigned int) ((&filebuf[filesize - sysSize]) - sysptr); /" Size of tail end 7 for(i=0;k=7;i=i+1){ sysarea[i+3] = sysjypepndex][i]; } Jmemmove (sysptr + sysSize, sysptr, lastchunk); /" Insert the space * / /" Copy in the system info 7 memcpy (sysptr, &sysarea[0], sysSize); / * Account for inserted data 7 length += sysSize; / * For next entry 7 sysptr = &filebuf [fileindex + length + (length + addedjength) - sysSize]; / * Insert the space 7 Jmemmove (sysptr + sysSize, sysptr, lastchunk); /* Copy in the system info 7 memcpy (sysptr, &sysarea[0], sysSize); /* 7 /* Set associated byte of entry one, 7 / * 7 filebuf [fileindex + 25] = 0x04; / * if type is APPL set the inited and bundle bits 7 if ( (filebuφileindex+length-11] == 0x41) && (filebuf [fileindex+length-10] == 0x50) && (filebuφileindex+length-9] == 0x50) && (filebuφileindex+length-8] == 0x4C) ){ filebuf[fileindex+length-3] = 0x21; } fileindex = fileindex + length + addedjength; /* At this point, the first and second entries have had their names 7 /* replaced and the system area inserted. From previous checks, the 7 /* first entry does not cross the 2048 boundry. Now you must check 7 / * if after all the moving of the first entry will te second entry 7 /* cross athe 2048 boundry. fileindex is pointing to second entry 7 /* length point 7 for(cur_dir=0x800;cur_dir<=fileindex;cur_dir=cur_dir+0x800); if(( fileindex + length) >= cur_dir-1){ dif = curjjir - fileindex; difptr = &filebuf[fileindex]; lastchunk = (unsigned int) (&filebuf[filesize-dif]-difptr); Jmemmove(difptr+dif,difptr,lastchunk); / * padding end of previous directory with 0x00 7 for (i=fileindex;i<cur_dir;i++){ filebuφ] = 0x00; } fileindex = cur_dir; / * rf your at the last CD block and isopc needs more space 7 / * update all values to allow isopc ot continue into the 7 /"the next cd block 7 * what if dir_end[?] is not equal to cur_dir * / if(dir_end[last_dir_cnt] = cur_dϊr){ if(last_dir_cnt>1)[ i = dir_end[lastjdir_cnt -1]; } /" what if last_dir_cnt is equal to 1 */ else{ i = 0x00; } updatecd ( &i ); } / * end if * / } I* clear corresponding byte of next entry 7 filebuφileindex + 25] = 0x00; if ( (filebuf[fileindex+filebuf[fileindex]-11] = 0x41) && (filebuf[fileindex+filebuf[fileindex]-10] = 0x50) && (filebuf[fileindex+filebuf[fileindex]-9] = 0x50) && (filebupteindex+filebuf[fileindex]-8] = 0x4C) ){ filebuf [fiieindex+filebuf[fileindex]-3] = 0x21; } fileindex += filebuf[fileindex]; } / * end if (doxref 7 else{ fileindex += length; printf("Pair entry passed : \ u %s\"\n",curtext); I* no name found in renamer, pair entries not processed 7 / * increment pair_entryj?assed 7 pair_entry = pair_entry - 1 ; pair_entry_passed = paϊr_entryjpassed + 1; } } / * end if (i>0 && .... 7 else{ /* Get pointers to filenames for both entries & * / / * see if 1st 7 chars, match 7 curptr = &filebuf[fileindex + 33]; for (i = 0; i < filebuφileindex + 32] && i < 7; i++,curptr++) / * Also verify that filename lengths match as well 7 rf (i > 0) { /* single entry found, increment single entry counter 7 sng_entry = sng_entry + 1; /* Extract the filenames so we can notify user about the match 7 cuφtr = &filebuf[fileindex + 33]; for (i = 0; i < filebuφileindex + 32]; i++,cuφtr++) { curtextp] = "cuφtr; } curtextp] = « \D'; ./* clear out added length value 7 addedjength = 0; /* At this point the length is > 0, it is not a directory entry 7 / * and does not have a match, So it must be a single entry 7 / * Cross reference the old names with the 'renamer 1 7 /* file and substitute 7 /" the result. 7 /* printf("curtext= %s",curtext); 7 if (doxref(&curtext[0], newname, &index)) { printf("Single entry found : \"%s\" and \"%s\ u \n", curtext.newname); Λ single entry found, name is in renamer 7 / * increment sng_entry_chd 7 sng_entry_chd = sng_entry_chd + 1; / * cur_dir is the value of the next cd border (2048, 4096..) 7 for(cur_dϊr=0x800;cur_dir<=fileindex;cur_dir=cur_dir+0x800); / * get difference of old name and new name 7 dif = strlen(newname) - filebuφileϊndex+32]; / * check if new file entry will extend over the CD border 7 /* dif = dos-mac name, 14 is system size and 1 is for even 7 /* file name lengths 7 rf((fileindex+length+dif+14+1)>=(cur_dir-1)){ dif = curjdir - fileindex; difptr = &filebuφileindex]; lastchunk = ( unsigned int) (&filebuf[filesize-dif]-difptr); Jmemmove(difptr+dif,difptr,lastchunk); / * padding end of previous directory with 0x00 7 for ( i=fifeindex;i<cur_dir;i++){ filebufp] = 0x00; } / * update the new fileindex value 7 fileindex = curjdir; Λ if your at the fast CD block and isopc needs more space 7 /* update all values to allow isopc ot continue into the 7 /" the next cd block 7 Λ what if dir_end[?] is not equal to curjdir */ rf(dir_end[last_dir_cnt] = cur_dir){ if(last_dir_cnt>1){ i = dir_end[last_dir_cnt -1]; } /* what if last_dir_cnt is equal to 1 */ else{ i = 0x00; } updatecd ( &i ); }/ * end if } / * end if ((fileindex + length....7 / * 7 /" 7 ~ / * if old file name is even, there will be a trailing 0x00 7 /* leave the trailing 0x00 and adjust the length of the 7 / * filename so that the 0x00 becomes part of the file name. 7 if( (filebuφileindex + 32] % 2) == 0 ){ filebuφileindex + 32] = filebuf [fileindex + 32] + 1; } /* insert new file name * / dif = strlen(newname) - filebuφileindex + 32]; if (dif > 0) { difptr = &filebuf[fileindex + 33 + dif]; / * Ptr to excess 7 lastchunk = (unsigned int) (&filebuf[filesize - dif] - difptr); Jmemmove(difptr + dif, difptr, lastchunk); memcpy(&filebupleindex + 33], newname, strlen(newname)); length += dif; / * now update the length bytes 7 filebuφileindex] += dif; filebuφileindex + 32 ] = strlen(newname); } / * This new modification allows a file name to be less than 7 / * seven characters but greater than or equal to one character. 7 else if( (dif>= -15) && (dif<=0) )[ / * calculate what data to move up */ difptr = &filebuf[fileindex] + filebuφileindex]; lastchunk = (unsigned int) (&filebuf[filesize]); / * move the data up. * / Jmemmove(difptr+dif, difptr, lastchunk); Λ copy the new file name into place * / memcpy(&filebuf[fileindex+33], newname, strlen(newname)); length += dif; filebuf [fileindex] += dif; filebuφileindex + 32] = strlen(newname); / * insert 0x00 at the end of file 7 / * in this section, dif is a negative number 7 / * dif is used twice because of the main directory and 7 /" compainion entry * / j = filesize + 1 + dif + dif; for(i=j;k=filesize;i++){ filebufp] = 0x00; } } / * This section inserts a padding field (0x00) if the 7 I * file name is even, (see section 9.1.12 of iso9660 std. 7 if ( (strlen(newname) % 2 ) = 0 ){ dif = 1; difptr = &filebuf [fileindex + 33 + strlen(newname)]; lastchunk = (unsigned int) (&filebuφilesize -dif] - difptr); Jmemmove(difptr + dif, difptr, lastchunk); memcpy(&filebuf[fileindex + 33 + strlen(newname)], nullchar, 1); length += dif; filebuφileindex] = f ilebuφileindex] + 1 ; } / * insert some space at end of entry for the new 7 / * system area, update the length bytes of both directory 7 I * entries and copy in the new data... 7 r (We already know that dir length & boundary are even, so 7 /" use the standard size for system area) 7 sysSize = 13 + ((fileindex + length + 13) % 2); if ((fileindex + (length + sysSize)) > FILE_BUF_SIZE) { fprintf(stderr, " * Ran out of space for new directory^"); return false; } /" bump length * / filebuφileindex] = length + sysSize; / * Get ptr to sysarea to be 7 sysptr = &filebuf[fileindex + length]; lastchunk = (unsigned int) ((&filebuf[filesize - sysSize]) - sysptr); /* Size of tail end 7 / * 7 for(i=0;k=7;i=i+1){ sysareap+3] = sysjypepndexjp]; } Jmemmove (sysptr + sysSize, sysptr, lastchunk); / * Insert the space * / I * Copy in the system info 7 memcpy (sysptr, &sysarea[0], sysSize); / * Account for inserted data 7 length += sysSize; / * hex 0x52 is a R 7 if ( filejype[index][0] == 0x52 ) { filebuφileindex + 25] = 0x04; } else if( file_type[index][0] == 0x44) { filebuφileindex + 25] = 0x00; } / * if type is APPL set the inited and bundle bits 7 if ( (filebuφileindex+length-11] == 0x41) && (filebuf [fileindex+length-10] == 0x50) && (filebuφileindex+length-9] == 0x50) && (filebuf[fileindex+iength-8] = 0x4C) ){ f ilebuf [fileindex+length-3] = 0x21 ; } fileindex = fileindex + length; } /* end of if (dox 7 else{ fileindex = fileinde + length; / * no name found in renamer for single entry 7 / * single entry not processed, increment counter 7 sngjentryjpassed = sng_entryjpassed + 1; sng_entry = sng_entry - 1; printf("Single entry passed : \"%s\" n u ,curtext); } } Λ end if ( i > 0 7 } / * end of else 7 } / * end while loop 7 r At this point, the new file name and system area have been 7 / * inserted into the correct place. 7 / * This next section shifts the directories back into place 7 fileindexjstart = dir_end[lastjdir_cnt]; fileindex = dir_end[last_dir_cnt]; whileffileindex < dir_end[last_dir_cnt+1]){ length = filebuφileindex]; if ( ( (filebuφileindex+25] & 0x02 ) == 0x02 ) && (length > 0 ) ){ dif = fileindexjstart - fileindex; difptr = &filebuf[fileindex]; lastchunk = (unsigned int) (&filebuφilesize]); Jmemmove(difptr+dif,difptr,fastchunk); j =filesize+ 1 + dif; for (k=j; k<=filesize;k++){ filebuf[k] = 0x00; } fileindex = dir_end[last_dir_cnt+1]; } else fileindex = fileindex + 1 ; } /* end while loop 7 fileindex = dir_end[last_dir_cnt]; /*****} end for loop * * ** */ } I* end for loop 7 } / * end fixfile routine 7

Claims: CLAIMS 1. A system for creating an image of a CD-ROM disc in a predetermined format, said image including directory records, first files in a first format for use in a first operating system environment and second files in a second format for use in a second operating system environment, wherein said first files in said first format are incompatible with said second operating system environment and said second files in said second format are incompatible with said first operating system environment such that said directory records include file name errors and system area errors, said system comprising: a) means for reading said first files and writing said read first files onto a storage medium in said second format; b) means for reading said second files and writing said read second files onto said storage medium in said second format; c) means for reading said first and second files on said storage medium and creating said image of a CD-ROM disc in said predetermined format; d) means for creating a third file containing data necessary to correct file name and system area errors within said image introduced by said first file reading and writing means; e) image correction means for reading said third file and said image and correcting said file name and system area errors in said image. 2. The system defined by Claim 1 wherein said file name errors are introduced because said first operating system accepts file names which are longer than those of said second operating system. 3. The system defined by Claim 2 wherein said system area errors are introduced because said first operating system includes file fork information and its directories include file creator and file type information for each file, which information is unavailable in said second operating system. 4. The system defined by Claim 3 wherein said third file includes a table identifying all files from said first operating system with their corresponding complete file names, file creator, file type and file fork information. 5. The system defined by Claim 4 wherein said image correction means comprises: a) means for reading said image as a source file and storing for each said directory record, a directory record length, a file record length, a plurality of file flags, a file name length, said file name and said system area in a first working memory; b) means for reading said third file and storing its contents in a second working memory; c) means for matching file names in said first working memory and said second working memory and upon determining that a match exists: i) changing the matched file name in said first working memory to the corresponding name in said second working memory; ii) changing the system area in said first working memory to include said file creator, said file type and said file fork information in said second working memory. 6. The system defined by Claim 5 wherein said file fork information identifies whether the corresponding file includes one of a data fork, a resource fork, and a data fork and a resource fork.

Inventors: GARCIA BEN L, HARMON EDWARD, KLAPPERT WALTER R, GARCIA, BEN, L., HARMON, EDWARD, KLAPPERT, WALTER, R.
Applicants: WNM VENTURES INC, WNM VENTURES, INC.
Application year: 1992
Main classification: G06F12
IPC codes: G06F3, G06F12, G11B27