📄 ztvregister.pas
字号:
MAIN_RAR_HEADER_SIGNATURE:
Case method Of
0: Result := atRarExe;
1: Result := atRar;
End;
$5754DFB7:
Case method Of
0:
Begin
Result := atArcExe;
//v4.8.6 revised
fOffsetStart := 7716;
End;
1: Result := atArc;
End;
Else { Case Signattr Of }
Case HiWord(Signattr) Of
LHA_SIGNATURE:
Case method Of
0: Result := atLhaExe;
1: Result := atLha;
End;
Else
Case LoWord(Signattr) Of
$4B50, $4C50, $4D50, $4E50:
Case HiWord(Signattr) Of
$807: // Multivolume Zip Header Signature
Begin
Result := GetZipVolumeStatus();
End;
$201: // CentralZipHeader found on beginning of last disk
Begin
Result := GetZipVolumeStatus();
GetCentralDirOffset(s);
End;
$3447: ; // do nothing... could be a .dcp file.
$4943: ; // do nothing... could be an imate.dat file.
Else
Begin
Case method Of
0: Result := atZipExe;
1: Result := atZip;
End;
End;
End;
$4148:
Case method Of
0: Result := atUnsupported;
1: Result := atHA;
End;
$8B1F, // GZip 1.2.4
$9D1F, // GZip LZW
$9E1F, // Old_GZip
$1E1F, // GZip Pack
8485, // GZip Pack
$A01F: // GZip LZH
Case method Of
0: Result := atUnsupported;
1: Result := atGZip;
End;
ARJ_SIGNATURE:
Case method Of
0: Result := atArjExe;
1: Result := atArj;
End;
ZOO_SIGNATURE:
Case method Of
0: Result := atUnsupported;
1: Result := atZoo;
End;
//LHA_SIGNATURE:
// Case Method Of
// 0: Result := atLhaExe;
// 1: Result := atLha;
// End;
$A1A, // ver 1.51, 2.10, 2.51
$B1A:
Case method Of
0: Result := atPakExe;
1: Result := atPak;
End;
$1E1A, // Arc602 with stored paths
538:
Case method Of
0: Result := atUnsupported;
1: Result := atArc;
End;
$081A, // pkarc36
$091A:
Case method Of
0: Result := atArcExe;
1: Result := atArc;
End;
$92B7, // Arc602.exe only
$DFB7:
Begin
Result := atArcExe;
fOffsetStart := 7716;
End;
End; { Case LoWord( Signattr ) Of }
End;
End; { Case Signattr Of }
End;
Function TestUUE(s: TStream32): TArcType;
Const
MAXBYTES = 5000;
Var
i: Integer;
Buffer: Pchar;
InBegin: Boolean;
BufSize,
BytesRead: Integer;
Begin
Result := atNA;
If (s.Size < MAXBYTES) Then
BufSize := s.Size
Else
BufSize := MAXBYTES;
Try
GetMem(Buffer, BufSize);
Try
s.Position := 0;
BytesRead := s.Read(Buffer[0], BufSize);
If BytesRead = 0 Then
Exit;
i := 0;
InBegin := False;
While (i < BytesRead) Do
Begin
If ((i + 2) < BytesRead) Then
Begin
If (i = 0) Or ((i > 0) And (Buffer[i - 1] = #10)) Then
Begin
If (StrLComp(Buffer + i, 'begin 6', 7) = 0) Or
(StrLComp(Buffer + i, 'begin 7', 7) = 0) Then
Begin
Result := atUUE;
Exit;
End
Else
If (StrLComp(Buffer + i, 'begin', 5) = 0) Then
InBegin := True
Else
If InBegin Then
If (StrLComp(Buffer + i, 'M', 1) = 0) Then
Begin
Result := atUUE;
Exit;
End;
End;
End
Else
Exit;
Inc(i);
End;
Finally
FreeMem(Buffer, BufSize);
End;
Except
End;
End;
Function TestTAR(s: TStream32): TArcType;
Type
HdrArray = Array[0..{ $FFFF } SizeOf(TTarHeader)] Of Byte;
Var
BytesRead: DWord;
i, CheckSum: Integer;
OrigCheckSum: Integer;
HeaderPtr: ^HdrArray;
Begin
Result := atNA;
If SizeOf(TarHeader) < s.Size Then
Begin
s.Position := 0;
BytesRead := s.Read(TarHeader, SizeOf(TTarHeader));
If (BytesRead = 0) Then
Exit;
If (TarHeader.LinkFlag = LF_VOL) Then
Begin
fOffsetStart := s.Position;
If ((fOffsetStart + SizeOf(TTarHeader)) < s.Size) Then
Begin
If (s.Read(TarHeader, SizeOf(TTarHeader)) <> SizeOf(TTarHeader)) Then
Exit;
End
Else
Exit;
End;
OrigCheckSum := OctStrToInt(TarHeader.ChkSum);
CheckSum := 0;
HeaderPtr := @TarHeader;
For i := 0 To SizeOf(TarHeader) - 1 Do
If (Integer(@HeaderPtr^[i]) < Integer(@TarHeader.ChkSum)) Or
(Integer(@HeaderPtr^[i]) >= (Integer(@TarHeader.ChkSum) +
SizeOf(TarHeader.ChkSum))) Then
Inc(CheckSum, HeaderPtr^[i])
Else
Inc(CheckSum, Ord(' '));
If CheckSum = OrigCheckSum Then
Result := atTar
Else
fOffsetStart := -1; //1 v4.8.6
End;
End;
Function IsArcValid(AT: TArcType): Boolean;
Begin
Result := Not (AT In Invalid_ArcType);
End;
Const
BHSFX = 1;
ZIPSFX = 2;
ARJSFX = 3;
LHASFX = 4;
JARSFX = 5;
ACESFX = 6;
RARSFX = 7;
EXE_START_SEARCH_OFFSET = 17000; (* Some rar archives start at pos 17721 *)
Var
fOffsetBegin: Int64;
LocalTempFileProgressProc: TNotifyEvent;
Begin {GetArcType}
Result := atNA;
If s = Nil Then
Exit;
Try
ArchiveCommentPos := 0;
ZipSFX_OffsetAdjustment := 0;
fOffsetStart := -1;
HeaderTypeState := [];
FLOF := s.Size;
// don't want the progress bar updating...
LocalTempFileProgressProc := s.TempFileProgressProc;
s.TempFileProgressProc := Nil;
Try
If (s.Size > 19) Then
Begin
GetMem(c, WSIZE);
Try
s.Position := 0;
BytesRead := s.Read(c[0], WSIZE - 1);
Signattr := @c[0];
If LoWord(Signattr^) = $5A4D Then
Begin
Result := IsSFXZipped(s);
If IsArcValid(Result) Then
Begin
fOffsetStart :=
GetCentralDirOffset(s);
Exit;
End;
hLib := LoadLibraryEx(Pchar(fArchiveFile), 0,
LOAD_LIBRARY_AS_DATAFILE);
If hLib <> 0 Then
Begin
GetMem(Buffer, 12);
Try
For i := BHSFX To RARSFX Do
Begin
LoadString(hLib, i, Buffer, 6);
If StrLen(Buffer) > 0 Then
Begin
Try
Val(Buffer, fOffsetStart, code);
If code <> 0 Then
Break;
Except
Break;
End;
If fOffsetStart >= s.Size Then
Break;
s.Position := fOffsetStart;
Try
BytesRead := s.Read(c^, 14);
If StrLComp(@c[7], '**ACE**', 7) = 0 Then
Begin
Result := atAceExe;
Exit;
End;
If BytesRead = 14 Then
Begin
Signattr := @c[0];
Result := TAT(0, Signattr^);
(* Found archive type *)
If (Result <> atNA) Then
Begin
If (Result In Zipped_ArcType) Then
Begin
fOffsetBegin := fOffsetStart;
fOffsetStart :=
GetCentralDirOffset(s);
If HeaderTypeState = [] Then
fOffsetStart := fOffsetBegin;
End;
Exit;
End;
End;
Except
End;
End
Else
Break; (* Not a resource String created SFX *)
End;
Finally
FreeMem(Buffer, 12);
FreeLibrary(hLib);
End;
End;
CopyMem(@c, @IInfo, 6);
aOffset := Integer(IInfo.Size - 1) * 512 + IInfo.Remainder;
If (aOffset > 0) And (aOffset + SizeOf(h) < s.Size) Then
Begin
s.Position := aOffset;
BytesRead := s.Read(h, SizeOf(h));
If BytesRead = SizeOf(h) Then
Begin
{ add 2 bytes for ARJ241}
fOffsetStart := aOffset + (Ord(Boolean(h.SIG1 = ARJ_SIGNATURE)) *
2);
If (fOffsetStart + SizeOf(Integer)) < FLOF Then
Begin
s.Position := fOffsetStart;
BytesRead := s.Read(c^, SizeOf(Integer));
Signattr := @c[0];
If (BytesRead = SizeOf(Integer)) And
(Signattr^ <> LOCAL_FILE_HEADER_SIGNATURE) Then
Begin
Result := TAT(0, Signattr^);
If IsArcValid(Result) Then
Exit;
End;
End;
End;
End;
EndZipHeader.SignAtr := 0;
If Not IsArcValid(Result) Then
Begin
fOffsetStart :=
GetCentralDirOffset(s);
If fOffsetStart > 0 Then
Result := atZipExe;
End;
If Not IsArcValid(Result) Then
fOffsetStart :=
doByteSearch(s, Result, EXE_START_SEARCH_OFFSET);
End
Else
Begin
(* Some SFXs ar
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -