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

📄 ztvregister.pas

📁 ziptv为delphi控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
            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 + -