Je viens de commencer une source pour le chargement des fichiers de type ISO (pour le moment c'est la détection du type et le nom de CD).
Je continu mes recherches sur la structure des fichiers ISO car avec tout les protocoles différents, il y a du boulot


Code : Tout sélectionner
; +======================================================+
; | ISO CD FILE LOADER (Réalisation par KoakDesign) |
; +------------------------------------------------------+
; | COPYRIGHT(C)2007-2008, ALL RIGHT RESERVED KOAKDESIGN |
; +--------------+---------------------------------------+
; | Program type | PUREBASIC 5.10 |
; +--------------+---------------------------------------+
; | VER & REV | 0.0.1 |
; +--------------+---------------------------------------+
; | Program name | iso_file.pb |
; +======================================================+
; +======================================================+
; | Original Version: 0.0.1 |
; +--------------+---------------------------------------+
; | Created by | GallyHomeCorp |
; | Graphix by | |
; +--------------+---------------------------------------+
; | Comments: | |
; +--------------+ |
; | |
; | |
; | |
; +======================================================+
; +======================================================+
; | Système d'Exploitation |
; +--------------+---------------------------------------+
; | Window | Oui |
; | Linux | Oui |
; | MacOS | Oui |
; +======================================================+
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
EnableExplicit
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
#CDFS_SIZE_2048 = 2048
;#CDFS_SIZE_2336 = 2336
#VSD_STD_ID_CD001 = "CD001" ; (* STANDARD ID *)
#VSD_STD_ID_NSR02 = "NSR02" ; (* (3/9.1) * Standard Identifier)
#VSD_STD_ID_NSR03 = "NSR03" ; (* (3/9.1) *)
#VSD_STD_ID_BEA01 = "BEA01" ; (* (2/9.2) *)
#VSD_STD_ID_TEA01 = "TEA01" ; (* (2/9.3) *)
#VSD_STD_ID_BOOT2 = "BOOT2" ; (* (2/9.4) *)
#VSD_STD_ID_CD001 = "CD001" ; (* (ECMA-119) *)
#VSD_STD_ID_CDW02 = "CDW02" ; (* (ECMA-168) *)
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Structure FILE_DIRECTORY_DATE_TIME
year.a
month.a
day.a
hour.a
minute.a
second.a
gmtoffset.a
EndStructure
Structure PRIMARY_ROOT_DATE_TIME
year.l
month.a
day.a
hour.a
minute.a
second.a
Hundredths.l
gmtoffset.l
EndStructure
Structure ROOT_DIRECTORY_RECORD
LengthOfDirectoryRecord.a
ExtendedAttributeRecordLength.a
LocationOfExtent.q
DataLength.q
RecordingDateAndTime.FILE_DIRECTORY_DATE_TIME
FileFlags.a
FileUnitSize.a
InterleaveGapSize.a
VolumeSequenceNumber.l
LengthOfFileIdentifier.a
FileIdentifier.a
EndStructure
Structure PRIMARY_VOLUME_DESCRIPTOR
StandardType.a
StandardIdentifier.s{5}
VolumeDescriptorVersion.a
Unused1.a
SystemIdentifier.s{32}
VolumeIdentifier.s{32}
Unused2.b[8]
VolumeSpaceSize.q
EscapeSequences.s{32}
VolumeSetSize.l
VolumeSequenceNumber.l
LogicalBlockSize.l
PathTableSize.q
LocationOfTypeLPathTable.l
LocationOfOptionalTypeLPathTable.l
LocationOfTypeMPathTable.l
LocationOfOptionalTypeMPathTable.l
LocationDirectoryEntryRoot.ROOT_DIRECTORY_RECORD
VolumeSetIdentifier.s{128}
PublisherIdentifier.s{128}
DataPreparerIdentifier.s{128}
ApplicationIdentifier.s{128}
CopyrightFileIdentifier.s{37}
AbstractFileIdentifier.s{37}
BibliographicFileIdentifier.s{37}
VolumeCreatedTimeDate.PRIMARY_ROOT_DATE_TIME
VolumeMidifiedTimeDate.PRIMARY_ROOT_DATE_TIME
VolumeExpiratedTimeDate.PRIMARY_ROOT_DATE_TIME
VolumeEffectiveTimeDate.PRIMARY_ROOT_DATE_TIME
FilestructureVersion.a
Unused3.a
ApplicationUsed.s{512}
Reserved.a[653]
EndStructure
Structure FILE_DIRECTORY_DESCRIPTORS
DirectoryLenRecord.a
ExtendedAttributeRecordLen.a
LocationofExtent.q
DataLength.q
RecordingDateTime.FILE_DIRECTORY_DATE_TIME
FileFlags.a
FileUnitSize.a
InterleaveGapSize.a
VolumeSequenceNumber.l
LengthofFileIdentifier.a
FileIdentifier.a
EndStructure
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; +--------------------------------------------------------------------------+
; | |
; +--------------------------------------------------------------------------+
Define i.i
Define j.i
Define ifile.i
Define iflen.i
Define iseek.i
Define itemp.i
Define atemp.a
Define btemp.b
Define stemp.s
Define szfile.s = "fileiso_0.iso"
Define pvdescriptor.PRIMARY_VOLUME_DESCRIPTOR
Define fldescriptor.FILE_DIRECTORY_DESCRIPTORS
ifile = ReadFile(#PB_Any, szfile)
If ifile
iflen = Lof(ifile)
; LES 16 PREMIERS SECTEURS SONT A VIDE.
; 1 SECTEUR = 2048 PAQUETS DONC DEPLACEMENT DE "16 x 2048".
iseek = 16 * #CDFS_SIZE_2048
FileSeek(ifile, iseek)
; LECTURE DU PREMIER BLOCK D'INFORMATION.
; ON DOIT AVOIR "CD001" DANS LA VARIABLE "STANDADIDENTIFIER".
ReadData(ifile, pvdescriptor, SizeOf(PRIMARY_VOLUME_DESCRIPTOR))
; PASSAGE DES DIVERS TAGS DU FICHIER.
; AU MINIMUM IL Y A DEUX TAGS "CD001" DANS LES FICHIERS ISO.
Debug "RECHERCHE DES TAGS :"
Debug #NULL$
btemp = #False
Repeat
atemp = ReadByte(ifile)
stemp = ReadString(ifile, #PB_Ascii, 5)
If stemp <> #NULL$
i + 1
If atemp <> 255
Debug Str(i) + " : " + stemp + " : " + Str(atemp)
Else
Debug Str(i) + " : " + stemp + " : " + Str(atemp) + " : FIN DE TAG CD001"
EndIf
Select stemp
Case #VSD_STD_ID_CD001
iseek + #CDFS_SIZE_2048
FileSeek(ifile, iseek)
Case #VSD_STD_ID_NSR02
iseek + #CDFS_SIZE_2048
FileSeek(ifile, iseek)
Case #VSD_STD_ID_NSR03
iseek + #CDFS_SIZE_2048
FileSeek(ifile, iseek)
Case #VSD_STD_ID_BEA01
iseek + #CDFS_SIZE_2048
FileSeek(ifile, iseek)
Case #VSD_STD_ID_BOOT2
iseek + #CDFS_SIZE_2048
FileSeek(ifile, iseek)
Case #VSD_STD_ID_CDW02
iseek + #CDFS_SIZE_2048
FileSeek(ifile, iseek)
Case #VSD_STD_ID_TEA01
iseek + (11* #CDFS_SIZE_2048)
FileSeek(ifile, iseek)
Default
btemp = #True
EndSelect
Else
btemp = #True
FileSeek(ifile, iseek)
EndIf
Until btemp = #True
; ON RECHERCHE LE PREMIER FICHIER DE L'ISO.
; PREMIER BIT DOIT AVOIR 34 ($22) POUR ETRE PREMIER FICHIER.
Repeat
i + 1
atemp = ReadByte(ifile)
If atemp <> 34
iseek + #CDFS_SIZE_2048
FileSeek(ifile, iseek)
Else
FileSeek(ifile, iseek)
EndIf
Until atemp = 34
Debug #NULL$
Debug "-----------------------"
Debug "PREMIER FICHIER A : " + Str(Loc(ifile)) + " ($"+ Hex(Loc(ifile)) + ")"
Debug Str(i) + " : " + Str(atemp)
; LE PREMIER FICHIER OU REPERTOIRE EST :
; LIRE A PARTIR DE l'OCTET 101 EN MEMOIRE.
Debug #NULL$
Debug "-----------------------"
Debug "PREMIER FICHIER OU REPERTOIRE :"
ReadData(ifile, fldescriptor, SizeOf(FILE_DIRECTORY_DESCRIPTORS))
CloseFile(ifile)
;
; NETOYAGE DES INFORMATIONS.
;
pvdescriptor\VolumeIdentifier = RTrim(pvdescriptor\VolumeIdentifier)
pvdescriptor\VolumeSetIdentifier = RTrim(pvdescriptor\VolumeSetIdentifier)
;
; NETOYAGE DES INFORMATIONS.
;
Debug #NULL$
Debug "-----------------------"
Debug "INFORMATION DU CD :"
Debug #NULL$
Debug "VOLUME NAME : " + pvdescriptor\VolumeIdentifier
Debug "DATA IDENTIFIER : " + pvdescriptor\DataPreparerIdentifier
Debug #NULL$
Debug "-----------------------"
Debug #NULL$
If pvdescriptor\StandardType = 1 And pvdescriptor\StandardIdentifier = #VSD_STD_ID_CD001
Debug "ISO FILE IS OK"
EndIf
EndIf
GallyHC