⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbisolib.pas

📁 刻录机源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{*******************************************************************************
  Unit        : mbISOLib.pas
  Date        : Jul 2001 - Jan 2003
  Author      : Ehsan Khan
  Description :
  Copyright   : 2001-03 Binary Magic, All rights reserved.
{******************************************************************************}
unit mbISOLib;
{$I DEFINES.INC}
interface

uses
  SysUtils, windows;
  
type
  PDirEntry = ^TDEntry;
  PFileEntry = ^TFEntry;
  TFEntry = record
    ShortName: String;
    LongName: String;
    Path: String;
    Imported: Boolean;
    Time: TDateTime;
    FileSize, FileSizeJ: Int64;
    SpaceReqOnDisc: Int64;
    Address: Integer;
    AddressJ: Integer;
    Attr: Integer;
    ResetArchiveBit: Boolean;
    DirRec: PDirEntry;
    Next: PFileEntry;
    Prev: Boolean;
    Buffer: PChar;
  end;

  TDEntry = record
    ShortName: String;
    LongName: String;
    Imported: Boolean;
    Size, SizeJ: Int64;
    Path: String;
    Address,
    AddressJ: Integer;
    Depth: Byte;
    Number: Integer;
    Parent: PDirEntry;
    Files: PFileEntry;
    Order: Integer;
  end;

  TDirectoryDescriptor = packed record
    LenDr: Byte;                        // 01-01
    Extended: Byte;                     // 02-02
    Address,                            // 03-06
    AddressBE: LONGWORD;                // 07-10
    DataLength: LONGWORD;               // 11-14
    DataLengthBE: LONGWORD;             // 15-18
    Year, Month, Day: Byte;             // 19-21
    Hour, Min, Sec: Byte;               // 22-24
    TimeDiffernce: Shortint;            // 25-25
    FileFlag: Byte;                     // 26-26
    FileUnitSize: Byte;                 // 27-27
    InterleaveGap: Byte;                // 28-28
    VolSeqnumber: WORD;                 // 29-32
    VolSeqnumberBE: WORD;               // 29-32
    LenOfFileIdentifier: Byte;          // 33-33
    FileName: array[0..255] of char;
  end;

  TDirectoryDescriptor2 = packed record
    LenDr: Byte;                        // 01-01
    Extended: Byte;                     // 02-02
    Address,                            // 03-06
    AddressBE: LONGWORD;                // 07-10
    DataLength: LONGWORD;               // 11-14
    DataLengthBE: LONGWORD;             // 15-18
    Year, Month, Day: Byte;             // 19-21
    Hour, Min, Sec: Byte;               // 22-24
    TimeDiffernce: Byte;                // 25-25
    FileFlag: Byte;                     // 26-26
    FileUnitSize: Byte;                 // 27-27
    InterleaveGap: Byte;                // 28-28
    VolSeqnumber: WORD;                 // 29-32
    VolSeqnumberBE: WORD;               // 29-32
    LenOfFileIdentifier: Byte;          // 33-33
    Dummy: Byte;                        // 34-34
  end;

  TPathTableRecord = packed record
    LenDI: Byte;
    ExtAttr: Byte;
    Address: LongWord;
    ParentNumber: Word;
    Name: Array[0..255] of char;
    BytesToWrite: Word;
  end;
  
  TVolumeDescriptor = packed record
    pdType: Byte;                              //   1 -   1
    Identifier: array[1..5] of char;           //   2 -   6
    Version: Byte;                             //   7 -   7
    VolumeFlag: Byte;                          //   8 -   8
    IdSystem: array[0..31] of char;            //   9 -  40
    IdVolume: array[0..31] of char;            //  41 -  72
    IdBC: array[0..7] of char;                 //  73 -  80
    NoOfSectors: LONGWORD;                     //  81 -  84
    NoOfSectorsBE: LONGWORD;                   //  85 -  88
    EscapeChars: array[0..31] of Char;         //  89 - 120
    VolSetSize: WORD;                          // 121 - 124
    VolSetSizeBE: WORD;                        // 121 - 124
    VolSeqNumber: WORD;                        // 125 - 128
    VolSeqNumberBE: WORD;                      // 125 - 128
    SectorSize: WORD;                          // 129 - 132
    SectorSizeBE: WORD;                        // 129 - 132
    PathTableSize: LONGWORD;                   // 133 - 136
    PathTableSizeBE: LONGWORD;                 // 137 - 140
    Type1PathTable: LONGWORD;                  // 141 - 144
    Type1PathTableBE: LONGWORD;                // 145 - 148
    TypeMPathTable: LONGWORD;                  // 149 - 152
    TypeMPathTableBE: LONGWORD;                // 153 - 156
    RootDirRec: TDirectoryDescriptor2;         // 157 - 190
    IdVolumeSet: Array[0..127] of char;        // 191 - 318
    IdPublisher: Array[0..127] of char;        // 319 - 446
    IdPreparer: Array[0..127] of char;         // 447 - 574
    IdApplication: Array[0..127] of char;      // 575 - 702
    FileCopyright: Array[0..36] of char;       // 703 - 739
    FileAbstract: Array[0..36] of char;        // 740 - 776
    FileBibliographic: Array[0..36] of char;   // 777 - 813
    DateCreation: Array[0..16] of char;        // 814 - 830
    DateModification: Array[0..16] of char;    // 831 - 847
    DateExpiration: Array[0..16] of char;      // 848 - 864
    DateEffective: Array[0..16] of char;       // 865 - 881
    FileStructureVer: Byte;                    // 882 - 882
    UnUsed1: Byte;                             // 883 - 883
    ApplicationData: array[884..1024] of char; // 884
    ApplicationData2: array[1025..1032] of char; // 884 - 1395
    ApplicationData3: array[1033..1395] of char; // 884 - 1395
    Unused2: array[1396..2048] of byte;        // 1396 - 2048
  end;

  TBootVolumeDescriptor = packed record
    pdType: Byte;                              //   0
    Identifier: array[1..5] of char;           //   1 - 5
    Version: Byte;                             //   6
    Ident: array[7..$26] of char;              //   7 - $26
    Unused1: array[$27..$46] of byte;          // $27 - $46
    BootCatLocation: Cardinal;
    Unused2: array[$4B..$7FF] of byte;
  end;
  TBootCatalog = packed record
    Header: Byte;                              
    PlatformID: Byte;
    Reserved1: Word;
    Developer: array[$4..$1b] of char;
    Checksum: Word;
    KeyByte1, KeyByte2: Byte;
    BootIndicator: Byte;
    BootMediaType: Byte;
    LoadSegment: Word;
    SystemType: Byte;
    Unused1: Byte;
    SectorCount: Word;
    LoadRBA: DWORD;
    Unused2: array[$0c..$1f] of byte;
    Unused3: array[$30..$7ef] of byte;
  end;

Const
  MaxDepth  = $FF;
  DefaultSectorSize = 2048;
var
  MaxFiles: Integer;
  MaxDirs: Integer;
  Files: array of PFileEntry;
  Dirs: array of pointer;
  PathTable: array of pointer;
  PathTableJ: array of pointer;
  DirCounter: Integer;
  FileCounter: Integer;
  DirectoryFirst: Boolean = False;
  TimeZoneDiff: SmallInt;
  TimeZoneInformation: TTimeZoneInformation;
  
procedure CopyToArrayW(src: String; var Dest:array of char; Len: Integer);
procedure CopyToArray(src: String; var Dest: array of char; Max: Integer);
procedure SortFiles(var List: PFileEntry; Joliet: Boolean);
procedure SortParent(var A : array of Pointer; N : integer);
procedure SortNumber(var A : array of Pointer; N : integer);
procedure SortLevel(var A : array of Pointer; N : integer);
procedure SortPN(var A : array of Pointer; N : integer; Joliet: Boolean);
procedure SortLN(var A : array of Pointer; N : integer; Joliet: Boolean);
procedure SetDateTime(Time: TDateTime; var d: TDirectoryDescriptor);
function  MSF2LBA(h, m, s, f: Byte): Cardinal;
procedure LBA2MSFH(lba: Cardinal; var m, s, f: Byte);
procedure LBA2MSF(LBA: Cardinal; var m, s, f: Byte);
function  LBA2MSFStr(LBA: Cardinal): String;
function  Sectors(bytes: Int64): Int64;
function  Sectors2(var P: PFileEntry): Int64;
function  IntToDec(i: Int64; n: Integer=2; pad: String = '0'): String;
function  ExtractLastDir(Path: String): String;

implementation

procedure LBA2MSFH(lba: Cardinal; var m, s, f: Byte);
begin
  f := lba mod 75;
  s := (lba div 75) mod 60;  m := (lba div 75) div 60;  f := ((f div 10) shl 4) or (f mod 10);  m := ((m div 10) shl 4) or (m mod 10);  s := ((s div 10) shl 4) or (s mod 10);end;
procedure LBA2MSF(lba: Cardinal; var m, s, f: Byte);
begin
  f := lba mod 75;
  s := (lba div 75) mod 60;  m := (lba div 75) div 60;end;

function LBA2MSFStr(LBA: Cardinal): String;
var
  m, s, f: Byte;
begin
  LBA2MSF(LBA, m, s, f);
  Result := Format('%2.2d:%2.2d:%2.2d',[m, s, f]);
end;

procedure CopyToArrayW(src: String; var Dest:array of char; Len: Integer);
var
  i: Integer;
  ws: WideString;
  sa: array[0..4096] of char;
begin
  src := Copy(src+'                                                                                                                                                                 ', 1, len+12);
  ws := src;
  move(ws[1], sa[0], len*2);
  i := 0;
  while i < (len) do
  begin
    dest[i] := sa[i+1];
    dest[i+1] := sa[i];
    inc(i, 2);
  end;
end;

procedure CopyToArray(Src: String; var Dest: array of char; Max: Integer);
var
  i: Integer;
begin
  src := Copy(src+'                                                                                                                                                                                                                           ', 1, Max);
  for i:=1 to Max do
    dest[i-1] := src[i]
end;

procedure Swap(var X, Y : Pointer);
var
  Temp : PDirEntry;
begin
  Temp := X;
  X := Y;
  Y := Temp
end;

{function DirName(s: string): String;
begin
  if s = '.' then
    result := #0
  else if s = '..' then
    result := #1
  else
    result := s;
end;}

function FileName(s: PFileEntry): String; overload;
begin
  if ((s.Attr and faDirectory) = faDirectory) then
    result := '1'+s.ShortName
  else    
    result := '2'+s.ShortName;
end;

function FileName(s: String): String; overload;
begin
  result := s;
end;

function FileNameJ(s: PFileEntry): String;
begin
  result := s.ShortName;
end;

procedure SortFiles(var List: PFileEntry; Joliet: Boolean);
var
  node, node2, List2: PFileEntry;
begin
  if (List = nil) or (List.Next = nil) then exit;
  new(List2);
  list2.Next := list;
  list := list.Next;
  list2.Next.Next := nil;
  While List <> nil do
  begin
    Node  := List;
    list  := List.Next;
    Node2 := List2;
    if DirectoryFirst then
    begin
      if Joliet then
        While (Node2.Next <> nil) and (FileName(Node) > FileName(Node2.Next)) do Node2 := Node2.Next
      else
        While (Node2.Next <> nil) and (FileNameJ(Node) > FileNameJ(Node2.Next)) do Node2 := Node2.Next;
    end
    else
    begin
      if Joliet then
        While (Node2.Next <> nil) and (Node.ShortName > Node2.Next.ShortName) do Node2 := Node2.Next
      else
        While (Node2.Next <> nil) and (FileNameJ(Node) > FileNameJ(Node2.Next)) do Node2 := Node2.Next;
    end;
    Node.Next  := Node2.Next;
    Node2.Next := Node;
  end;
  List := List2.Next;
//  node := list;
  Dispose(List2);
end;

procedure SortLevel(var A : array of Pointer; N : integer);
var

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -