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

📄 ztvregister.pas

📁 ziptv为delphi控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:

         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 + -