PopulateMicroUDFRecords.pas
上传用户:wanyu_2000
上传日期:2021-02-21
资源大小:527k
文件大小:14k
源码类别:

DVD

开发平台:

Delphi

  1. {-----------------------------------------------------------------------------
  2.  Unit Name: PopulateMicroUDFRecords
  3.  Author:    Dancemammal
  4.  Purpose:   Help Setup default UDf Records
  5.  History:
  6. -----------------------------------------------------------------------------}
  7. unit PopulateMicroUDFRecords;
  8. interface
  9. Uses MicroUDFClassTypes,MicroUDFConsts, Windows, Covertfuncs, Messages, SysUtils, Classes;
  10. Procedure PopulateUDFPrimaryVolumeDescriptor(VAR UDF_PVD : UDF_PrimaryVolumeDescriptor; Sector : Integer ; VolumeName : string);
  11. Procedure PopulateUDFImplementationUseVolumeDescriptor(VAR UDF_IUVD : UDF_ImplementationUseVolumeDescriptor; Sector : Integer ; VolumeName : string);
  12. Procedure PopulateUDFPartitionDescriptor(VAR UDF_PD : UDF_PartitionDescriptor; Sector : Integer ; VolumeName : string);
  13. Procedure PopulateUDFlogicalVolDesc(VAR UDF_LVD : UDF_logicalVolDesc; Sector : Integer ; VolumeName : string);
  14. Procedure PopulateUDFUnallocSpaceDesc(VAR UDF_USD : UDF_UnallocSpaceDesc; Sector : Integer ; VolumeName : string);
  15. Procedure PopulateUDFTerminatingDesc(VAR UDF_TD : UDF_TerminatingDesc; Sector : Integer ; VolumeName : string);
  16. Procedure PopulateUDFAnchorVolumeDescriptorPointer(VAR UDF_ADVP : UDF_AnchorVolumeDescriptorPointer; Sector : Integer ; VolumeName : string);
  17. Procedure PopulateUDFlogicalVolumeIntegrityDesc(VAR UDF_LVID : UDF_logicalVolumeIntegrityDesc; Sector : Integer ; NumOfFiles,NumOfDirs : Integer);
  18. Procedure PopulateUDFFileSetDescriptor(VAR UDF_FSD : UDF_FileSetDescriptor; Sector : Integer ; VolumeName : string);
  19. implementation
  20. Procedure FillRandomChar(VAR MyArray : Array of Char);
  21. var
  22. Index : integer;
  23. begin
  24.   Randomize;
  25.   For Index := 0 to 15 do
  26.      MyArray[Index] := Char(Random(26) + 65);
  27. end;
  28. Procedure BuildVolumeDateTime(var TimeStmp : UDF_TimeStamp);
  29. var
  30.    Year : Word;
  31.   Hour, Min, Sec, MSec,Month, Day: word;
  32. begin
  33.   DecodeTime(Now, Hour, Min, Sec, MSec);
  34.   DecodeDate(Now, Year, Month, Day);
  35.   TimeStmp.TypeAndTimezone := $0010;
  36.   TimeStmp.Year := Year;
  37.   TimeStmp.Month := Month;
  38.   TimeStmp.Day := Day;
  39.   TimeStmp.Hour := Hour;
  40.   TimeStmp.Minute := Min;
  41.   TimeStmp.Second := Sec;
  42.   TimeStmp.Centiseconds := MSec div 10;
  43.   TimeStmp.HundredsOfMicroseconds := MSec div 100;
  44.   TimeStmp.Microseconds := MSec;
  45. end;
  46. {Sector 32 plus repeated at sector 48}
  47. Procedure PopulateUDFPrimaryVolumeDescriptor(VAR UDF_PVD : UDF_PrimaryVolumeDescriptor; Sector : Integer ; VolumeName : string);
  48. begin
  49.   FillChar(UDF_PVD, SizeOf(UDF_PVD), Char(0)); // empty record
  50.   UDF_PVD.DescriptorTag.TagIdentifier       := TAG_IDENT_PVD;
  51.   UDF_PVD.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  52.   UDF_PVD.DescriptorTag.TagChecksum         := $00;
  53.   UDF_PVD.DescriptorTag.TagSerialNumber     := $00;
  54.   UDF_PVD.DescriptorTag.DescriptorCRC       := $00;
  55.   UDF_PVD.DescriptorTag.DescriptorCRCLength := $00;
  56.   UDF_PVD.DescriptorTag.TagLocation         := Sector; //20 00 00 00
  57.   UDF_PVD.VolumeDescriptorSequenceNumber    := $00000000;
  58.   UDF_PVD.PrimaryVolumeDescriptorNumber     := $00000000;
  59.   StrPCopy(UDF_PVD.VolumeIdentifier,Copy(VolumeName, 1, Length(UDF_PVD.VolumeIdentifier)));
  60.   UDF_PVD.VolumeSequenceNumber              := $0001; //0100
  61.   UDF_PVD.MaximumVolumeSequenceNumber       := $0001; //0100
  62.   UDF_PVD.InterchangeLevel                  := $0002;
  63.   UDF_PVD.MaximumInterchangeLevel           := $0002;
  64.   UDF_PVD.CharacterSetList                  := CHARSPEC_TYPE_CS1;
  65.   UDF_PVD.MaximumCharacterSetList           := CHARSPEC_TYPE_CS1;
  66.   FillRandomChar(UDF_PVD.VolumeSetIdentifier);// 08 33 33 39 45 42 44 36 44
  67.   UDF_PVD.DescriptorCharacterSet.CharSetType := OSTA_CS0_CHARACTER_SET_TYPE;
  68.   UDF_PVD.DescriptorCharacterSet.CharSetInfo := OSTA_CS0_CHARACTER_SET_INFO;
  69.   UDF_PVD.ExplanatoryCharacterSet.CharSetType := OSTA_CS0_CHARACTER_SET_TYPE;
  70.   UDF_PVD.ExplanatoryCharacterSet.CharSetInfo := OSTA_CS0_CHARACTER_SET_INFO;
  71.   UDF_PVD.VolumeAbstract.ExtentLength          := $0000;
  72.   UDF_PVD.VolumeAbstract.ExtentLocation        := $0000;
  73.   UDF_PVD.VolumeCopyrightNotice.ExtentLength          := $0000;
  74.   UDF_PVD.VolumeCopyrightNotice.ExtentLocation        := $0000;
  75.   BuildVolumeDateTime(UDF_PVD.RecordingDateAndTime);
  76.   UDF_PVD.ImplementationIdentifier.Flags         := $00;
  77.   UDF_PVD.ImplementationIdentifier.Identifier    := OSTA_DEVELOPER_ID;
  78. end;
  79. {Sector 33}
  80. Procedure PopulateUDFImplementationUseVolumeDescriptor(VAR UDF_IUVD : UDF_ImplementationUseVolumeDescriptor; Sector : Integer ; VolumeName : string);
  81. begin
  82.   UDF_IUVD.DescriptorTag.TagIdentifier       := TAG_IDENT_IUVD;
  83.   UDF_IUVD.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  84.   UDF_IUVD.DescriptorTag.TagChecksum         := $00;
  85.   UDF_IUVD.DescriptorTag.TagSerialNumber     := $00;
  86.   UDF_IUVD.DescriptorTag.DescriptorCRC       := $00;
  87.   UDF_IUVD.DescriptorTag.DescriptorCRCLength := $00;
  88.   UDF_IUVD.DescriptorTag.TagLocation         := Sector; //21 00 00 00
  89.   
  90.   UDF_IUVD.VolumeDescriptorSequenceNumber    := $0001; //0100
  91.   UDF_IUVD.ImplementationIdentifier.Flags         := $00;
  92.   UDF_IUVD.ImplementationIdentifier.Identifier    := REGID_ID_LV_INFO;
  93.   UDF_IUVD.LVInformation.LVICharset.CharSetType := OSTA_CS0_CHARACTER_SET_TYPE;
  94.   UDF_IUVD.LVInformation.LVICharset.CharSetInfo := OSTA_CS0_CHARACTER_SET_INFO;
  95.   StrPCopy(UDF_IUVD.LVInformation.LogicalVolumeIdentifier,Copy(VolumeName, 1, Length(UDF_IUVD.LVInformation.LogicalVolumeIdentifier)));
  96.   UDF_IUVD.LVInformation.ImplementionID.Flags := $00;
  97.   UDF_IUVD.LVInformation.ImplementionID.Identifier := OSTA_DEVELOPER_ID;
  98. end;
  99. {Sector 34}
  100. Procedure PopulateUDFPartitionDescriptor(VAR UDF_PD : UDF_PartitionDescriptor; Sector : Integer ; VolumeName : string);
  101. begin
  102.   UDF_PD.DescriptorTag.TagIdentifier       := TAG_IDENT_PD;
  103.   UDF_PD.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  104.   UDF_PD.DescriptorTag.TagChecksum         := $00;
  105.   UDF_PD.DescriptorTag.TagSerialNumber     := $00;
  106.   UDF_PD.DescriptorTag.DescriptorCRC       := $00;
  107.   UDF_PD.DescriptorTag.DescriptorCRCLength := $00;
  108.   UDF_PD.DescriptorTag.TagLocation         := Sector; //22 00 00 00
  109.   UDF_PD.VolumeDescriptorSequenceNumber    := $0002;
  110.   UDF_PD.PartitionFlags                    := $0001;
  111.   UDF_PD.PartitionNumber                   := $0000;
  112.   UDF_PD.PartitionContents.Flags           := $02;
  113.   UDF_PD.PartitionContents.Identifier      := PD_PARTITION_CONTENTS_NSR02;
  114.   UDF_PD.AccessType                        := PD_ACCESS_TYPE_READ_ONLY;
  115.   UDF_PD.PartitionStartingLocation         := 262; //06 01 00 00
  116.   UDF_PD.PartitionLength                   := 1364814; //4E D3 14 00
  117.   UDF_PD.ImplementationIdentifier.Flags    := $00;
  118.   UDF_PD.ImplementationIdentifier.Identifier := OSTA_DEVELOPER_ID;
  119. end;
  120. {Sector 35}
  121. Procedure PopulateUDFlogicalVolDesc(VAR UDF_LVD : UDF_logicalVolDesc; Sector : Integer ; VolumeName : string);
  122. begin
  123.   UDF_LVD.DescriptorTag.TagIdentifier       := TAG_IDENT_LVD;
  124.   UDF_LVD.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  125.   UDF_LVD.DescriptorTag.TagChecksum         := $00;
  126.   UDF_LVD.DescriptorTag.TagSerialNumber     := $00;
  127.   UDF_LVD.DescriptorTag.DescriptorCRC       := $00;
  128.   UDF_LVD.DescriptorTag.DescriptorCRCLength := $00;
  129.   UDF_LVD.DescriptorTag.TagLocation         := Sector; //22 00 00 00
  130.   UDF_LVD.VolumeDescSeqNum                  := $0003;
  131.   UDF_LVD.DescriptorCharacterSet.CharSetType := OSTA_CS0_CHARACTER_SET_TYPE;
  132.   UDF_LVD.DescriptorCharacterSet.CharSetInfo := OSTA_CS0_CHARACTER_SET_INFO;
  133.   StrPCopy(UDF_LVD.LogicalVolumeIdentifier,Copy(VolumeName, 1, Length(UDF_LVD.LogicalVolumeIdentifier)));
  134.   UDF_LVD.LogicalBlockSize                   := 2048;
  135.   UDF_LVD.DomainIdentifier.Flags             := $00;
  136.   UDF_LVD.DomainIdentifier.Identifier        := REGID_ID_COMPLIANT;
  137.   UDF_LVD.ImplementationIdentifier.Flags     := $00;
  138.   UDF_LVD.ImplementationIdentifier.Identifier := OSTA_DEVELOPER_ID;
  139.   UDF_LVD.IntegritySequenceExtent.ExtentLength := 4096;
  140.   UDF_LVD.IntegritySequenceExtent.ExtentLocation:= 64;
  141.   UDF_LVD.partitionMap1.PartitionMapType        :=$01;
  142.   UDF_LVD.partitionMap1.PartitionMapLength      :=$06;
  143.   UDF_LVD.partitionMap1.VolumeSeqNumber         :=$01;
  144.   UDF_LVD.partitionMap1.partitionNumber         :=$00;
  145. end;
  146. {Sector 36}
  147. Procedure PopulateUDFUnallocSpaceDesc(VAR UDF_USD : UDF_UnallocSpaceDesc; Sector : Integer ; VolumeName : string);
  148. begin
  149.   UDF_USD.DescriptorTag.TagIdentifier       := TAG_IDENT_USD;
  150.   UDF_USD.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  151.   UDF_USD.DescriptorTag.TagChecksum         := $00;
  152.   UDF_USD.DescriptorTag.TagSerialNumber     := $00;
  153.   UDF_USD.DescriptorTag.DescriptorCRC       := $00;
  154.   UDF_USD.DescriptorTag.DescriptorCRCLength := $00;
  155.   UDF_USD.DescriptorTag.TagLocation         := Sector; //22 00 00 00
  156.   UDF_USD.VolumeDescSeqNum                  := $0004;
  157. end;
  158. {Sector 36 - 65}
  159. Procedure PopulateUDFTerminatingDesc(VAR UDF_TD : UDF_TerminatingDesc; Sector : Integer ; VolumeName : string);
  160. begin
  161.   UDF_TD.DescriptorTag.TagIdentifier       := TAG_IDENT_TD;
  162.   UDF_TD.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  163.   UDF_TD.DescriptorTag.TagChecksum         := $00;
  164.   UDF_TD.DescriptorTag.TagSerialNumber     := $00;
  165.   UDF_TD.DescriptorTag.DescriptorCRC       := $0000;
  166.   UDF_TD.DescriptorTag.DescriptorCRCLength := $0000;
  167.   UDF_TD.DescriptorTag.TagLocation         := Sector; //263  Dword
  168. end;
  169. {Sector 64}
  170. Procedure PopulateUDFlogicalVolumeIntegrityDesc(VAR UDF_LVID : UDF_logicalVolumeIntegrityDesc; Sector : Integer ; NumOfFiles,NumOfDirs : Integer);
  171. begin
  172.   UDF_LVID.DescriptorTag.TagIdentifier       := TAG_IDENT_LVID;
  173.   UDF_LVID.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  174.   UDF_LVID.DescriptorTag.TagChecksum         := $00;
  175.   UDF_LVID.DescriptorTag.TagSerialNumber     := $00;
  176.   UDF_LVID.DescriptorTag.DescriptorCRC       := $00;
  177.   UDF_LVID.DescriptorTag.DescriptorCRCLength := $00;
  178.   UDF_LVID.DescriptorTag.TagLocation         := Sector; //22 00 00 00
  179.   BuildVolumeDateTime(UDF_LVID.RecordingDateAndTime);
  180.   UDF_LVID.IntegrityType                     := LVID_INTEGRITY_TYPE_CLOSE;
  181.   UDF_LVID.NextIntegrityExt.ExtentLength     := $00000000;
  182.   UDF_LVID.NextIntegrityExt.ExtentLocation   := $00000000;
  183.   UDF_LVID.NumOfPartitions                   := $00000001;
  184.   UDF_LVID.LengthOfImpUse                    := $0000002E;
  185.   UDF_LVID.FreeSpaceTable                    := $00000000;
  186.   UDF_LVID.SizeTable                         := $0019F4F3;//      F3F41900;
  187.   UDF_LVID.ImpUse.Flags                      := $00;
  188.   UDF_LVID.ImpUse.Identifier                 := OSTA_DEVELOPER_ID;
  189.   //UDF_LVID.ImpUse.IdentifierSuffix           := $0000000000010005;
  190.   UDF_LVID.NumberOfFiles                     := NumOfFiles;
  191.   UDF_LVID.NumberOfDirectories               := NumOfDirs;
  192.   UDF_LVID.MinimumUDFReadRevision            := $0102;
  193.   UDF_LVID.MinimumUDFWriteRevision           := $0102;
  194.   UDF_LVID.MaximumUDFWriteRevision           := $0105;
  195. end;
  196. {Sector 256}
  197. Procedure PopulateUDFAnchorVolumeDescriptorPointer(VAR UDF_ADVP : UDF_AnchorVolumeDescriptorPointer; Sector : Integer ; VolumeName : string);
  198. begin
  199.   UDF_ADVP.DescriptorTag.TagIdentifier       := TAG_IDENT_AVDP;
  200.   UDF_ADVP.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  201.   UDF_ADVP.DescriptorTag.TagChecksum         := $00;
  202.   UDF_ADVP.DescriptorTag.TagSerialNumber     := $00;
  203.   UDF_ADVP.DescriptorTag.DescriptorCRC       := $00;
  204.   UDF_ADVP.DescriptorTag.DescriptorCRCLength := $00;
  205.   UDF_ADVP.DescriptorTag.TagLocation         := Sector; //22 00 00 00
  206.   UDF_ADVP.MainVolumeDescriptorSequenceExtent.ExtentLength := 32768; //00 80 00 00
  207.   UDF_ADVP.MainVolumeDescriptorSequenceExtent.ExtentLocation := 32; //20 00 00 00
  208.   UDF_ADVP.ReserveVolumeDescriptorSequenceExtent.ExtentLength :=  32768; //00 80 00 00
  209.   UDF_ADVP.ReserveVolumeDescriptorSequenceExtent.ExtentLocation := 48; //20 00 00 00
  210. end;
  211. {Sector 262}
  212. Procedure PopulateUDFFileSetDescriptor(VAR UDF_FSD : UDF_FileSetDescriptor; Sector : Integer ; VolumeName : string);
  213. begin
  214.   UDF_FSD.DescriptorTag.TagIdentifier       := TAG_IDENT_FSD;
  215.   UDF_FSD.DescriptorTag.DescriptorVersion   := TAG_DESCRIPTOR_VERSION;
  216.   UDF_FSD.DescriptorTag.TagChecksum         := $00;
  217.   UDF_FSD.DescriptorTag.TagSerialNumber     := $00;
  218.   UDF_FSD.DescriptorTag.DescriptorCRC       := $00;
  219.   UDF_FSD.DescriptorTag.DescriptorCRCLength := $00;
  220.   UDF_FSD.DescriptorTag.TagLocation         := Sector; //22 00 00 00
  221.   BuildVolumeDateTime(UDF_FSD.RecordingDateAndTime);
  222.   UDF_FSD.InterchangeLevel                  := $0003;
  223.   UDF_FSD.MaximumInterchangeLevel           := $0003;
  224.   UDF_FSD.CharacterSetList                  := CHARSPEC_TYPE_CS1;
  225.   UDF_FSD.MaximumCharacterSetList           := CHARSPEC_TYPE_CS1;
  226.   UDF_FSD.FileSetNumber                     := $00;
  227.   UDF_FSD.FileSetDescriptorNumber           := $00;
  228.   UDF_FSD.LogicalVolumeIdentifierCharSet.CharSetType := OSTA_CS0_CHARACTER_SET_TYPE;
  229.   UDF_FSD.LogicalVolumeIdentifierCharSet.CharSetInfo := OSTA_CS0_CHARACTER_SET_INFO;
  230.   StrPCopy(UDF_FSD.LogicalVolumeIdentifier,Copy(VolumeName, 1, Length(UDF_FSD.LogicalVolumeIdentifier)));
  231.   UDF_FSD.FileSetCharacterSet.CharSetType   := OSTA_CS0_CHARACTER_SET_TYPE;
  232.   UDF_FSD.FileSetCharacterSet.CharSetInfo   := OSTA_CS0_CHARACTER_SET_INFO;
  233.   StrPCopy(UDF_FSD.FileSetIdentifier,Copy(VolumeName, 1, Length(UDF_FSD.FileSetIdentifier)));
  234.   UDF_FSD.RootDirectoryICB.ExtentLength      := $00000800;
  235.   UDF_FSD.RootDirectoryICB.ExtentLocation.LogicalBlockNum := $0002;
  236.   UDF_FSD.RootDirectoryICB.ExtentLocation.PartitionReferenceNum := $0000;
  237.   UDF_FSD.DomainIdentifier.Flags             := $00;
  238.   UDF_FSD.DomainIdentifier.Identifier        := REGID_ID_COMPLIANT;
  239. end;
  240. end.