📄 ztvregister.pas
字号:
If is64BitEndingHdr(pEndZipHeader64^.SignAtr) Then
Begin
CopyMem(pEndZipHeader64, @EndZipHeader64, SizeOf(TZipTV_End64));
CopyMem(pEndZipHeader64, @EndZipHeader, SizeOf(EndZipHeader.SignAtr));
ArchiveCommentPos := EndHeadPos + SizeOf(TZipTV_End64);
CentralHeadPos := EndZipHeader64.CentralDirOffset;
End
Else
Begin
ArchiveCommentPos := EndHeadPos + SizeOf(TEnd);
If (htLocator In HeaderTypeState) Then
CopyMem(pWZipLocator, @WZipLocator, SizeOf(TWZipLocator));
If (htEnding64 In HeaderTypeState) Then
Begin
CopyMem(pWZip_End64, @WZip_End64, SizeOf(TWZIP_END64));
CentralHeadPos :=
pWZipLocator^.RelativeOffsetOfCentralHeader -
pWZip_End64^.SizeOfCentralDir;
End
Else
Begin
CopyMem(pEndZipHeader64, @EndZipHeader, SizeOf(TEnd));
//CentralHeadPos := EndZipHeader.CentralDirOffset;
CentralHeadPos := EndHeadPos - EndZipHeader.SizeOfCentralDir;
End;
End;
//If EndZipHeader.CommentLen > 0 Then
// ArchiveCommentPos := EndHeadPos + SizeOf(TEnd)
//Else
// ArchiveCommentPos := 0;
s.Position := CentralHeadPos;
BytesRead := s.Read(CentralZipHeader, SizeOf(TCentral));
If BytesRead <> SizeOf(TCentral) Then
Begin
CentralHeadPos :=
EndHeadPos - Cardinal(EndZipHeader.SizeOfCentralDir);
s.Position := CentralHeadPos;
BytesRead := s.Read(CentralZipHeader, SizeOf(TCentral));
If BytesRead <> SizeOf(TCentral) Then
Break;
End;
// first, check of CentralDir is where it's suppose to be
IsHeader := VerSig(CentralZipHeader.SignAtr, htCentral, Encrypted) =
htCentral;
// second, if a Central.SignAtr not found, start at the beginning
// ending header offset, subtract the size of the value of the
// SizeOfCentralDir variable... see if the Central.SignAtr
// exists in this position.
//
// Zip archives require the size of an sfx-stub file be added
// to the OffsetOfLocalHeader variable in all central headers
// when appending an archive to a sfx-stub. Some utilities do
// not know this and will simply append a zip archive to a stub.
// The remainder of the code block compensates for this oversite
// in archives created by these sfx creation utilities.
//
If Not IsHeader Then
Begin
CentralHeadPos :=
EndHeadPos - Cardinal(EndZipHeader.SizeOfCentralDir);
s.Position := CentralHeadPos;
BytesRead := s.Read(CentralZipHeader, SizeOf(TCentral));
If BytesRead <> SizeOf(TCentral) Then
Break;
IsHeader :=
VerSig(CentralZipHeader.SignAtr, htCentral, Encrypted) =
htCentral;
If IsHeader Then
ZipSFX_OffsetAdjustment :=
CentralHeadPos - EndZipHeader.CentralDirOffset
Else
ZipSFX_OffsetAdjustment := 0;
End
Else
ZipSFX_OffsetAdjustment := 0;
If IsHeader Then
Begin
Include(HeaderTypeState, htCentral);
Result := CentralHeadPos;
If Encrypted Then
DecodeHeader(@CentralZipHeader, htCentral);
s.Position :=
CentralZipHeader.RelativeOffsetOfLocalHeader +
ZipSFX_OffsetAdjustment;
BytesRead := s.Read(LocalZipHeader, SizeOf(TLocal));
If BytesRead <> SizeOf(TLocal) Then
Break;
If (BytesRead = SizeOf(TLocal)) And
(VerSig(LocalZipHeader.SignAtr, htLocal, Encrypted) = htLocal) Then
Include(HeaderTypeState, htLocal);
End
Else
Begin
s.Position := 0;
For i := 0 To 3 Do //search upto 32k * 4 for local signature
Begin
BytesRead := s.Read(Buffer[0], BufSize);
If (BytesRead = 0) Then
Exit;
Result := -1;
b := @Buffer[0];
For j := 0 To BytesRead Do
Begin
If b^ = 80 Then
Begin
pSignattr := @Buffer[j];
If VerSig(pSignattr^, htLocal, Encrypted) = htLocal Then
Begin
Result := 0 + (i * BufSize) + j;
HeaderTypeState := [htLocal];
Break;
End;
End;
Inc(b);
End;
If (Result > -1) Then
Break;
End;
End;
Break;
End;
dec(BytesRead);
End; (* While BytesRead *)
Finally
s.TempFileProgressProc := FileProgressProc;
FreeMem(Buffer);
End;
End;
//-------------------------------------------------------------
Procedure TRegisterZipTV.SetArcType(ArcType: TArcType);
Var
s: TFileStream32;
Begin
If fArchiveFile <> '' Then
Begin
s := TFileStream32.Create(fArchiveFile, fmOpenRead Or fmShareDenyWrite);
If (s.Handle < 0) Then
Begin
fArcType := atFileOpenErr;
// v6.5.3 revised
Exit; //Raise EFOpenError.CreateFmt(LoadStr(E_FOPEN), [fArchiveFile]);
End;
Try
fArcType := GetArcType(s);
Finally
s.Free();
End;
End;
End;
//------------------------------------------------------------
Function TRegisterZipTV.OpenArchive(Var f: THandle; FileName: String): Boolean;
Begin
Result := False;
Try
f := CreateFile(Pchar(FileName), GENERIC_READ, FILE_SHARE_READ, Nil,
OPEN_EXISTING, faAnyFile, 0);
Result := f <> INVALID_HANDLE_VALUE;
Finally
If Result Then
FLOF := ztvGetFileSize(f)
Else
FLOF := 0;
End;
End;
//-------------------------------------------------------------
Function TRegisterZipTV.doByteSearch(s: TStream32; Var FAT: TArcType;
StartOffset: Cardinal): Cardinal;
Var
b: ^Byte;
Buffer: Pchar;
Signattr: ^Integer;
Signattr64: ^Int64;
i, j, BytesRead: Integer;
pArjHeader: ^TARJHEADER;
Begin
Result := 0;
FAT := atNA;
Try
GetMem(Buffer, WSIZE);
Try
If (FLOF > StartOffset) Then
Begin
s.Position := StartOffset;
For i := 0 To 10 Do
Begin
BytesRead := s.Read(Buffer[0], WSIZE);
If BytesRead = 0 Then
Exit;
b := @Buffer[0];
For j := 0 To BytesRead Do
Begin
Case b^ Of
42: (* atAce *)
If (Integer(StartOffset) + (i * WSIZE) + j + 5 < s.Size) Then
Begin
If (Buffer[j + 1] = '*') And
(Buffer[j + 2] = 'A') And
(Buffer[j + 3] = 'C') And
(Buffer[j + 4] = 'E') Then
Begin
Result :=
StartOffset + Cardinal((i * WSIZE) + (j - 7));
If Result > 0 Then
FAT := atAceExe
Else
FAT := atAce;
Break;
End;
End;
77: (* CabExe *)
If (StartOffset + Cardinal((i * WSIZE) + j + 5)) < FLOF Then
Begin
Signattr64 := @Buffer[j];
If (Signattr64^ = CAB_SIGNATURE) Then
Begin
If StartOffset > 0 Then
Begin
Result := StartOffset + Cardinal((i * WSIZE) + j);
If Result > 0 Then
FAT := atCabExe
Else
FAT := atCab;
End;
Break;
End;
End;
45: (* Lha / Lzh *)
If (StartOffset + Cardinal((i * WSIZE) + j + 5)) < FLOF Then
Begin
If (Buffer[j + 1] = 'l') And
(Buffer[j + 2] = 'h') And
(Buffer[j + 4] = '-') Then
Begin
Result := StartOffset + Cardinal((i * WSIZE) + j - 2);
If Result > 0 Then
FAT := atLhaExe
Else
FAT := atLha;
Break;
End;
End;
66: (* BlakHole *)
Begin
Signattr := @Buffer[j];
If (Signattr^ = BLAKHOLE_SIGNATURE) Then
Begin
Inc(Signattr);
If Signattr^ <> Integer($84C3940F) Then
Begin
Result := StartOffset + Cardinal((i * WSIZE) + j);
If Result > 0 Then
FAT := atBhExe
Else
FAT := atBh;
Break;
End;
End;
End;
80: (* Looking for an uppercase P in PkZIP *)
Begin
Signattr := @Buffer[j];
If (Signattr^ = LOCAL_FILE_HEADER_SIGNATURE) Then
Begin
Inc(Signattr);
If Signattr^ <> $3D0B74 Then
Begin
If StartOffset > 0 Then
FAT := atZipExe
Else
FAT := atZip;
Result := GetCentralDirOffset(s);
If Result = 0 Then
Result := StartOffset + Cardinal((i * WSIZE) + j);
Break;
End;
End;
End;
82: (* Looking for an uppercase R in RAR *)
Begin
Signattr := @Buffer[j];
If (Signattr^ = MAIN_RAR_HEADER_SIGNATURE) Then
Begin
Result := StartOffset + Cardinal((i * WSIZE) + j);
If Result > 0 Then
FAT := atRarExe
Else
FAT := atRar;
Break;
End;
End;
96: (* Arj *)
Begin
pArjHeader := @Buffer[j];
If pArjHeader^.HeadId = ARJ_SIGNATURE Then
Begin
If j + pArjHeader^.HdrSize + 10 < WSIZE Then
Begin
pArjHeader := @Buffer[j + pArjHeader^.HdrSize + 10];
If pArjHeader^.HeadId = ARJ_SIGNATURE Then
Begin
Result := StartOffset + Cardinal((i * WSIZE) + j);
If Result > 0 Then
FAT := atArjExe
Else
FAT := atArj;
Break;
End;
End;
End;
End;
End;
Inc(b);
End;
If Result > 0 Then
Break;
End;
End;
Finally
FreeMem(Buffer);
End;
Except
End;
End;
(* ***********************************************************
Check offset:
7612 : WinZip 16-bit SFX
15770 : PkZip using Zip2Exe.exe
25669 : WinZip 32-bit SFX
************************************************************* *)
Function TRegisterZipTV.IsSFXZipped(s: TStream32): TArcType;
Const
SixteenBitPkZip = 15770;
SixteenBitWinZip = 7612;
ThirtyTwoBitWinZip = 25661;
Var
Buffer: Pchar;
BytesRead: DWord;
i,
Signattr: Integer;
Begin
Result := atNA;
// new pkzip header methods (handled with
// regular signature search routines
// pk250w32.exe
// pk361.exe (makesfx.com)
//
(* **************************** *)
(* mksarc.exe / Arc602.exe 1989 *)
(* **************************** *)
s.Position := 6674; // Start with pk151.exe
For i := 0 To 4 Do
Begin
Case i Of
//pak151.exe
// 1988
// NOGATE CONSULTING
// Signattr: $a1a
// Decompression support: expand ?
// SFX Size: 6673
// Begin offset: 6674
0:
If s.Size > 6676 Then // add 2 for read of sizeof(word) bytes
s.Position := 6674
Else
Break; // post loop file-positions are greater
//pak251.exe
// mksarc.exe v1.0 and exemake.exe v1.5 sfx creation utilities
// 1989
// NOGATE CONSULTING
// Signattr: $a1a
// Decompression support: expand ?
// SFX Size: 6866
// Begin offset: 6867
1:
If s.Size > 6869 Then // add 2 for read of sizeof(word) bytes
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -