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

📄 mbcdbc.pas

📁 刻录机源码
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    else
    begin
      CopyToArray(fn, fd.FileName, L);
      fd.LenOfFileIdentifier := l;
      ll := -1;
    end;
    if (p.Attr and faHidden = faHidden) then
       fd.FileFlag := fd.FileFlag or 1;
    l := l + 33+ELen;
    if ELen <> 0 then
      SetExt(@fd.FileName[fd.LenOfFileIdentifier+ll], fd.FileFlag, p.Prev, 1);

    if bytes - l < 0 then
    begin
      ISOHeader.Write(ZEROS, bytes);
      bytes := DefaultSectorSize - l;
    end
    else
    begin
      bytes := bytes - l;
    end;
    fd.Extended := 0;
    fd.LenDr := l;
    fd.VolSeqnumber := 1;
    fd.VolSeqnumberBE := 256;
    if (p.Attr and faDirectory <> faDirectory) and (p.FileSize = 0) then
    begin
      fd.Address := 0;
      fd.AddressBE := 0;
    end;
    SetDateTime(p.Time, fd);
    ISOHeader.Write(fd, l);
    p := p.Next;
  end;
  ISOHeader.Write(ZEROS, bytes);
end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}
procedure TMCDBurner.WriteFileAndDirDescriptor(Start, FileStart: Integer);
var
  i: Integer;
  d: PDirEntry;
begin
  for i:=0 to DirCounter-1 do
  begin
    d := dirs[i];
    WriteFileAndDirDescriptor_r(d, Start, FileStart);
  end;
end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}
function FileAndDirDescriptorWidthJ_r(d: PDirEntry): Integer;
var
  l, W, bytes: Integer;
  p: PFileEntry;
  fn: String;
  wfn: WideString;
begin
  p := d.Files;
  if (d.Files = nil) or (p.LongName <> '.') then
  begin
    w := 68+ELen+ELen;
    bytes := DefaultSectorSize-w;
  end
  else
  begin
    bytes := DefaultSectorSize;
    w := 0;
  end;
  while p <> nil do
  begin
    if (p.Attr and faDirectory <> faDirectory) then
      fn := p.LongName+fSuf
    else
      fn := p.LongName;
    wfn := fn;
    l := Length(wfn)*2;
    if (fn = '.') or (fn = '..') then
      l := 1
    else if l mod 2 = 0 then
      l := l + 1;
    l := l + 33+ELen;
    if bytes - l < 0 then
    begin
      w := w + bytes + l;
      bytes := DefaultSectorSize - l;
    end
    else
    begin
      bytes := bytes - l;
      w := w + l;
    end;
    p := p.Next;
  end;
  w := w + bytes;
  result := Sectors(w)*DefaultSectorSize;

end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}
function TMCDBurner.FileAndDirDescriptorWidthJ: Integer;
var
  i: Integer;
  a, w, ww: Integer;
  d: PDirEntry;
begin
  ww := 0;
  a := 0;
  for i:=0 to DirCounter-1 do
  begin
    d := dirs[i];
    w := FileAndDirDescriptorWidthJ_r(d);
    ww := ww + w;
    d.AddressJ := a;
    d.SizeJ := w;
    a := a + w div DefaultSectorSize;
  end;
  result := ww;
end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}
procedure TMCDBurner.WriteFileAndDirDescriptorJ_r(d: PDirEntry; Start, FileStart: Integer);
var
  l, ll, bytes: Integer;
  p: PFileEntry;
  fn: String;
  wfn: WideString;
  fd: TDirectoryDescriptor;

begin
  ll := 0;
  fillchar(fd, sizeof(fd), 0);
  p := d.Files;
  fd.FileUnitSize := 0;
  fd.InterleaveGap := 0;
  if (d.Files = nil) or (p.LongName <> '.') then
  begin
    fd.LenDr := 34+ELen;
    fd.FileName[0] := #0;
    fd.LenOfFileIdentifier := 1;
    fd.FileFlag := 2;
    fd.Address := d.AddressJ+Start;
    fd.AddressBE := L2MDW(d.AddressJ+Start);
    fd.DataLength := d.SizeJ;
    fd.DataLengthBE := L2MDW(d.Size);
    fd.VolSeqnumber := 1;
    fd.VolSeqnumberBE := 256;
    SetDateTime(Now, fd);
    if ELen <> 0 then
      SetExt(@fd.FileName[0], fd.FileFlag, False, 0);
    ISOHeader.write(fd, 34+ELen);

    fd.FileName[0] := #1;
    fd.Address := d.Parent.AddressJ+Start;
    fd.AddressBE := L2MDW(d.Parent.AddressJ+Start);
    fd.DataLength := d.Parent.SizeJ;
    fd.DataLengthBE := L2MDW(d.Parent.Size);
    if ELen <> 0 then
      SetExt(@fd.FileName[0], fd.FileFlag, False, 1);
    ISOHeader.Write(fd, 34+ELen);
    bytes := DefaultSectorSize-(68+ELen+ELen);
  end
  else
    bytes := DefaultSectorSize;
  while p <> nil do
  begin
    fillchar(fd, sizeof(fd), 0);
    if (p.Attr and faDirectory <> faDirectory) then
    begin
      fn := p.LongName+fSuf;
      fd.FileFlag := 0;
      if not p.Imported then
      begin
        fd.Address := p.AddressJ+FileStart;
        fd.AddressBE := L2MDW(p.AddressJ+FileStart);
      end
      else
      begin
        fd.Address := p.AddressJ;
        fd.AddressBE := L2MDW(p.AddressJ);
      end;
      fd.DataLength := p.FileSizeJ;
      fd.DataLengthBE := L2MDW(p.FileSizeJ);
    end
    else
    begin
      fd.FileFlag := 2;
      fn := p.LongName;
      fd.Address := p.AddressJ+Start;
      fd.AddressBE := L2MDW(p.AddressJ+Start);
      fd.DataLength := p.FileSizeJ;
      if p.dirRec.SizeJ <> p.FileSizeJ then
      begin
        //.. error
      end;
      fd.DataLengthBE := L2MDW(p.FileSizeJ);
    end;
    wfn := fn;
    l := Length(wfn)*2;
    if fn = '.' then
    begin
      l := 1;
      fd.FileName[0] := #0;
      fd.LenOfFileIdentifier := l;
    end
    else if fn = '..' then
    begin
      l := 1;
      fd.FileName[0] := #1;
      fd.LenOfFileIdentifier := l;
    end
    else if l mod 2 = 0 then
    begin
      CopyToArrayW(fn, fd.FileName, L);
      fd.FileName[l] := #0;
      fd.LenOfFileIdentifier := l;
      l := l + 1;
      ll := 0;
    end
    else
    begin
      CopyToArrayW(fn, fd.FileName, L);
      fd.LenOfFileIdentifier := l;
      ll := -1;
    end;
    if (p.Attr and faHidden = faHidden) then
     fd.FileFlag := fd.FileFlag or 1;
    fd.LenDr := l+ELen;
    l := l + 33+ELen;
    if ELen <> 0 then
      SetExt(@fd.FileName[fd.LenOfFileIdentifier+ll], fd.FileFlag, p.Prev, 1);

    if bytes - l < 0 then
    begin
      ISOHeader.Write(ZEROS, bytes);
      bytes := DefaultSectorSize - l;
    end
    else
    begin
      bytes := bytes - l;
    end;
    fd.Extended := 0;
    if (l > 230) then
      l := l;
    fd.LenDr := l;
    fd.VolSeqnumber := 1;
    fd.VolSeqnumberBE := 256;
    SetDateTime(p.Time, fd);
    if (p.Attr and faDirectory <> faDirectory) and (p.FileSize = 0) then
    begin
      fd.Address := 0;
      fd.AddressBE := 0;
    end;
    ISOHeader.Write(fd, l);
    p := p.Next;
  end;
  ISOHeader.Write(ZEROS, bytes);
end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}
procedure TMCDBurner.WriteFileAndDirDescriptorJ(Start, FileStart: Integer);
var
  i: Integer;
  d: PDirEntry;
begin
  for i:=0 to DirCounter-1 do
  begin
    d := dirs[i];
    WriteFileAndDirDescriptorJ_r(d, Start, FileStart);
  end;
end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}
function TMCDBurner.PathTableWidthJ: Integer;
var
  i, Len, TotalLen: Integer;
  p: PDirEntry;
  wfn: WideString;
begin
  TotalLen := 10;
  for i := 1 to DirCounter-1 do
  begin
    p := Dirs[i];
    wfn := p.LongName;
    Len := Length(wfn)*2;
    if len mod 2 <> 0 then
      Len := len + 1;
    Len := Len+8;
    Totallen := TotalLen + Len;
  end;
  iPathTableSizeJ := TotalLen;
  result := Sectors(TotalLen)*DefaultSectorSize;
end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}
procedure TMCDBurner.WritePathTableJ(Start: Integer; Most: Boolean);
var
  i, TotalLen, Len: Integer;
  p: PDirEntry;
  wfn: WideString;
  pt: TPathTableRecord;
begin
  TotalLen := 10;
  pt.Name[0] := #0;
  pt.Name[1] := #0;
  pt.ExtAttr := 0;
  if Most then
  begin
    pt.Address := L2MDW(Start);
    pt.ParentNumber := LTOMW(1);
  end
  else
  begin
    pt.Address := Start;
    pt.ParentNumber := 1;
  end;
  pt.LenDI := 1;
  ISOHeader.Write(pt, 10);
  for i := 1 to DirCounter-1 do
  begin
    p := PathTableJ[i];
    wfn := p.LongName;
    Len := Length(wfn)*2;
    CopyToArrayW(p.LongName, pt.Name, Len);
    pt.LenDI := Len;
    if len mod 2 <> 0 then
    begin
      Len := len + 1;
      pt.Name[Len-1] := #0;
    end;
    Len := Len+8;
    if Most then
    begin
      pt.Address := L2MDW(p.AddressJ+Start);
      pt.ParentNumber := LToMW(p.Parent.Number);
    end
    else
    begin
      pt.Address := p.AddressJ+Start;
      pt.ParentNumber := p.Parent.Number;
    end; 
    ISOHeader.Write(pt, Len);
    Totallen := TotalLen + Len;
  end;
  if TotalLen - DefaultSectorSize <> 0 then
    ISOHeader.Write(ZEROS, DefaultSectorSize-(TotalLen mod DefaultSectorSize));
end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}
function TMCDBurner.PathTableWidth: Integer;
var
  i, Len, TotalLen: Integer;
  p: PDirEntry;
begin
  TotalLen := 10;
  for i := 1 to DirCounter-1 do
  begin
    p := Dirs[i];
    Len := Length(p.ShortName);
    if len mod 2 <> 0 then
      Len := len + 1;
    Len := Len+8;
    Totallen := TotalLen + Len;
  end;
  iPathTableSize := TotalLen;
  result := Sectors(TotalLen)*DefaultSectorSize;
end;
{******************************************************************************}
{                                                                              }
{******************************************************************************}

⌨️ 快捷键说明

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