home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Software / Vyzkuste / archident / IDPACKER.PAS < prev    next >
Pascal/Delphi Source File  |  2001-06-24  |  109KB  |  3,070 lines

  1. {*********************************************************}
  2. {    Turbo Pascal-Routinen zum Identifizieren von 176     }
  3. {       verschiedenen Typen komprimierter Dateien         }
  4. {                                                         }
  5. {    Turbo Pascal routines to identify 176 different      }
  6. {            types of compressed files                    }
  7. {                                                         }
  8. {           Version 2.66.04 / 25.06.2001                  }
  9. {                             06-25-2001                  }
  10. {                                                         }
  11. {            (C) 1994-2001, Juergen Peters                }
  12. {                                                         }
  13. {       eMail : jp@graybeast.de                           }
  14. {       WWW   : http://www.graybeast.de                   }
  15. {       FTP   : ftp://graybeast.dyndns.org                }
  16. {               ftp://graybeast.2y.net                    }
  17. {               ftp://graybeast.darktech.org              }
  18. {               ftp://graybeast.dyn.ee                    }
  19. {               ftp://graybeast.dyns.cx                   }
  20. {               ftp://graybeast.myip.org                  }
  21. {               ftp://uu.scieron.com                      }
  22. {               (wenn eine URL nicht funktioniert,        }
  23. {                andere probieren)                        }
  24. {               (if one URL doesn't work try another)     }
  25. {                                                         }
  26. {                 Released as Freeware                    }
  27. {                                                         }
  28. { Dieser Source ist noch in keinster Weise optimiert, er  }
  29. { tut lediglich, was er soll (hoffe ich).                 }
  30. { Eine Dokumentation gibt es auch nicht, aber ich glaube, }
  31. { es dürfte auch so alles klar sein...                    }
  32. { Der Autor übernimmt keine Haftung für irgendetwas ;-))  }
  33. {                                                         }
  34. { This source isn't yet optimized in any way, it simply   }
  35. { does, what it is intended to do (hopefully).            }
  36. { Another documentation than the comments in it is not    }
  37. { available, but I hope it's all clear nevertheless.      }
  38. { The author is not to be made responsible for anything   }
  39. { this source does to your computer... ;-))               }
  40. {*********************************************************}
  41.  
  42. { Letzte Änderungen: 04.04.95: - Erkennung von BSN-EXE-Dateien verbessert }
  43. {           1.53:    13.05.95: - Erkennung von AIN-Dateien verbessert     }
  44. {                              - Packer BS2/BSArc und GZIP hinzugefügt    }
  45. {           1.54:    20.05.95  - Packer ACB hinzugefügt                   }
  46. {                    21.05.95  - Packer MAR hinzugefügt                   }
  47. {                              - ACB-Erkennung verbessert                 }
  48. {           1.55:    24.05.95  - Packer CPShrink hinzugefügt              }
  49. {                              - Packer JRC hinzugefügt                   }
  50. {                              - Packer JARCS hinzugefügt                 }
  51. {                              - Packer Quantum hinzugefügt               }
  52. {                              - Packer ReSOF hinzugefügt                 }
  53. {                    25.05.95  - Erkennt nun auch BSN-Sfxes, die nicht    }
  54. {                                die Extension .EXE haben                 }
  55. {           2.00     27.05.95  - Archiveinleseroutinen komplett überarbei-}
  56. {                                tet. Archivheader wird jetzt in einen    }
  57. {                                Puffer eingelesen, dadurch großer Ge-    }
  58. {                                schwindigkeitsgewinn                     }
  59. {                              - Ungepackte Crush-Dateien hinzugefügt     }
  60. {                              - Packer ARX (LHArc-Clone) hinzugefügt     }
  61. {                    02.06.95  - Erkennt Sfx-Dateien von UC2 Pro          }
  62. {           2.01     06.06.95  - Erkennt mit UCEXE gepackte Files         }
  63. {                    08.06.95  - Erkennung von WWPack (EXE-Packer)        }
  64. {           2.02     12.06.95  - Formate von YAC und Quark werden erkannt }
  65. {           2.03     18.06.95  - Probleme mit 0 Byte-Files und Lesen nach }
  66. {                                Dateiende beseitigt (Dank an Christoph   }
  67. {                                Schuppius für den Hinweis!)              }
  68. {                    27.06.95  - ACB 1.07-Erkennung                       }
  69. {                    29.06.95  - Bugfix bei Funktion IsEXE                }
  70. {           2.04     01.07.95  - Auch RAR-OS/2-Sfx-Dateien werden erkannt }
  71. {                    02.07.95  - X1-eigenes Format wird erkannt           }
  72. {                    05.07.95  - Codec- und Codec-DOS-Sfx werden erkannt  }
  73. {                              - AMGC-Format wird identifiziert           }
  74. {                              - NuLIB-Format wird erkannt                }
  75. {                              - PAKLeo-Format wird erkannt               }
  76. {                    09.07.95  - Format TGZ wird erkannt                  }
  77. {                              - WWPack-Datafile wird erkannt             }
  78. {                              - ACB 1.08a wird identifiziert             }
  79. {                    18.07.95  - ACB 1.10a, ChArc und PSA werden erkannt  }
  80. {                    20.07.95  - Format ZAR wird erkannt                  }
  81. {                    27.07.95  - Fälschlicherweise wurden viele ungepackte}
  82. {                                EXE-Dateien als ZAR-Archive erkannt      }
  83. {                    29.07.95  - Auch Read Only-Files werden jetzt erkannt}
  84. {                    09.08.95  - ACB 1.13a wird identifiziert             }
  85. {                    19.08.95  - Erneut ZAR-Bugfix                        }
  86. {                    25.08.95  - Format TPK wird als LZS-Clone erkannt    }
  87. {           2.05     06.10.95  - Verbesserte FileExist-Routine            }
  88. {                    07.10.95  - Packer LHARK (-lh7-) wird erkannt        }
  89. {           2.06     03.11.95  - ACB 1.14a wird identifiziert             }
  90. {                    04.11.95  - CrossePAC, Freeze, KBoom und NSQ werden  }
  91. {                                erkannt                                  }
  92. {                    14.11.95  - Format DPA wird identifiziert            }
  93. {           2.07     20.02.96  - ACB 1.15b-Format wird erkannt            }
  94. {                    22.02.96  - ACB 1.17a-Format wird identifiziert      }
  95. {                    27.02.96  - ACB 1.20a wird erkannt                   }
  96. {                    29.02.96  - ACB-Erkennung verallgemeinert; nicht mehr}
  97. {                                jede Version muß einzeln identifiziert   }
  98. {                                werden                                   }
  99. {           2.08     31.05.96  - Format TTComp wird erkannt               }
  100. {           2.09     10.08.96  - Format WIC wird identifiziert, obwohl es }
  101. {                                sich bei dem Packer um einen Fake handelt}
  102. {                                (packt nicht wirklich, legt nur eine     }
  103. {                                versteckte Datei WINFILE.DLL an, die die }
  104. {                                angeblich gepackten Daten enthält)       }
  105. {           2.10     24.10.96  - Format von RKive wird erkannt            }
  106. {                    31.10.96  - Bugfixes                                 }
  107. {                              - Format JAR wird identifiziert            }
  108. {                    12.11.96  - Kleinere Bugfixes                        }
  109. {           2.11     15.11.96  - EXEPacker-Erkennung LZExe, PKLite, Diet  }
  110. {                                und TinyProg integriert                  }
  111. {           2.12     08.12.96  - Packer ESP wird erkannt                  }
  112. {                              - Format ZPack wird identifiziert          }
  113. {           2.13     08.01.97  - Erste deutsch-englische Version          }
  114. {                    01.02.97  - Format DRY (Dehydrated) wird erkannt     }
  115. {                    03.02.97  - Format OWS wird identifiziert, obwohl es }
  116. {                                sich bei dem Packer um einen Fake handelt}
  117. {                                (packt nicht wirklich)                   }
  118. {           2.14     23.02.97  - Format SKY wird erkannt                  }
  119. {                    24.02.97  - RKive-Erkennung verbessert               }
  120. {           2.15     08.03.97  - ZAR wurde manchmal als TTComp erkannt    }
  121. {                              - Format ARI wird notdürftig (anhand der   }
  122. {                                Dateiextension .ARI) erkannt             }
  123. {                              - Format UFA wird identifiziert            }
  124. {                    09.03.97  - Microsofts CAB (Windows 95) wird erkannt }
  125. {                    11.03.97  - Bugfix: einige Archive wurden nur        }
  126. {                                erkannt, wenn der Archivname großge-     }
  127. {                                schrieben war                            }
  128. {                    12.03.97  - Erkennung von FOXSQZ                     }
  129. {                    16.03.97  - Erkennung von AR7                        }
  130. {                    18.03.97  - Identifizierung des Stirling-Compressors }
  131. {                    22.03.97  - Erkennung von PPMZ                       }
  132. {           2.16     30.03.97  - MS Compress hinzugefügt                  }
  133. {                    02.04.97  - Erkennung von MP3 und ZET                }
  134. {           2.17     07.04.97  - Erkennung von XPack-Data- und Diskimage- }
  135. {                                Dateien                                  }
  136. {                    17.04.97  - Identifiziert ARQ-Archive                }
  137. {           2.18     27.04.97  - Erkennt ACE-Archive                      }
  138. {                    10.05.97  - Packer Squash (D. Murk) wird erkannt     }
  139. {           2.19     14.05.97  - ACE-Sfx-Erkennung verbessert             }
  140. {                              - Packer Terse wird identifiziert          }
  141. {                    17.05.97  - XPack-Single Data File wird erkannt      }
  142. {           2.20     21.05.97  - Erkennt BS Archiver 1.6 (ältere Form von }
  143. {                                BSA (PTS-DOS)) als BSN                   }
  144. {                    24.05.97  - Auch ACE 0.9c5 und 0.9d1 Junior Sfx      }
  145. {                                werden erkannt                           }
  146. {                              - Stuffit (Mac) wird identifiziert         }
  147. {                              - Erkennung von PKZip-Windows- und OS/2-   }
  148. {                                Sfxes und WinRAR-Install-Sfxes verbessert}
  149. {           2.21     25.05.97  - Wegen Schwierigkeiten mancher älterer    }
  150. {                                Unpacker mit Multitaskern (z.B. PKUnpak  }
  151. {                                unter OS/2) öffnet IDPACKER die Archive  }
  152. {                                nun im Sharing-Modus (permit all)        }
  153. {                    01.06.97  - PUCrunch wird identifiziert              }
  154. {                    04.06.97  - ACE 0.9d3-Sfx wird erkannt               }
  155. {                    05.06.97  - BZip wird identifiziert                  }
  156. {           2.22     08.06.97  - ACE 0.9d4-Sfx wird erkannt               }
  157. {                    09.06.97  - Folgende Multiple Volume-Archive werden  }
  158. {                                nicht mehr nur anhand der Dateiextension,}
  159. {                                sondern am Volume-Flag im Archivheader   }
  160. {                                erkannt: ARJ, ARJ-Sfx, RAR, RAR-Sfx, ACE }
  161. {          2.23      18.06.97  - Erkennung von ACE 0.9e3-Sfx              }
  162. {                    20.06.97  - Erkennung von PKZip/2 2.50-Sfx           }
  163. {                    23.06.97  - Bugfix: Bei Wildcards in Archivnamen     }
  164. {                                wurden Sfxes teilweise nicht erkannt     }
  165. {          2.24      19.07.97  - Erkennung von UHarc 0.1.66               }
  166. {                    23.07.97  - Bei folgenden Formaten wird am AV-Flag   }
  167. {                                im Archivheader erkannt, ob sie einen    }
  168. {                                AV-Envelope haben oder "locked" sind:    }
  169. {                                ARJ, ARJ-Sfx, RAR, RAR-Sfx, ACE          }
  170. {                    03.08.97  - Bugfix bei IsEXE(): die Variable FileMode}
  171. {                                wurde evtl. nicht zurückgesetzt          }
  172. {                                (Dank an Ralph Roth)                     }
  173. {                    04.08.97  - Format ABComp ab 2.04b wird erkannt      }
  174. {                    18.08.97  - Format CMP (André Olejko) wird erkannt   }
  175. {                    20.08.97  - Kleinere Bugfixes                        }
  176. {          2.25      24.08.97  - BZip2 wird erkannt                       }
  177. {          2.26      25.08.97  - Erkennt BS Archiver 1.9 (ältere Form von }
  178. {                                BSA (PTS-DOS)) als BSN                   }
  179. {                              - Erkennt LZOP (M.-F.-X.-J. Oberhumer)     }
  180. {          2.27      26.08.97  - Bessere Unterscheidung ARC/PAK           }
  181. {                                (Dank an George Shadoff)                 }
  182. {          2.28      28.08.97  - Bugfix bei ARJ-AV-Erkennung              }
  183. {                              - "Rohe" szip-Erkennung (nach nur einem    }
  184. {                                Byte und Extension .sz)                  }
  185. {                    31.08.97  - WinZip-Sfxes werden (als ZIP) erkannt    }
  186. {                    09.09.97  - Format Splint wird erkannt               }
  187. {                    14.09.97  - Funktion IsEXE: DOS-EXEs können auch mit }
  188. {                                'ZM' statt 'MZ' beginnen (Dank an Pierre }
  189. {                                Foucart).                                }
  190. {          2.29      17.09.97  - Format TAR wird (nur an der Extension    }
  191. {                                .TAR) erkannt.                           }
  192. {                              - InstallShield-Format wird erkannt        }
  193. {          2.30      24.09.97  - Codec-Erkennung verbessert               }
  194. {                              - ZIP-Archiv-Erkennung verbessert          }
  195. {                              - Limit-Erkennung verbessert               }
  196. {                              - Format CARComp wird (nur an der Extension}
  197. {                                .CAR) erkannt                            }
  198. {                    26.09.97  - Bessere Erkennung von WinRAR (inkl. 2.02)}
  199. {                    29.09.97  - LZS erhält eigenen Archivtyp             }
  200. {          2.31      11.10.97  - Auch 32 Bit-WinZip-Sfxes werden (als ZIP)}
  201. {                                erkannt                                  }
  202. {                    13.10.97  - Weiteres Windows-Install-Sfx-Format (ZIP)}
  203. {                                hinzugefügt                              }
  204. {                    14.10.97  - Dateizugriffsmodus simplifiziert         }
  205. {                    15.10.97  - Manchmal wurden LHark-Archive als AIN    }
  206. {                                erkannt                                  }
  207. {          2.32      01.11.97  - Format BOA wird identifiziert            }
  208. {                              - InstallShield-Z-Format wird erkannt      }
  209. {                    08.11.97  - Formate ARG und Gather (GTH) werden erk. }
  210. {                              - RKive 1.9 wird identifiziert.            }
  211. {          2.33      27.11.97  - Formate Pack Magic, Big Tree Software    }
  212. {                                Archiver, ELI 5750 und QFC werden erkannt}
  213. {                    06.12.97  - PRO-PACK wird identifiziert              }
  214. {                              - WinZip32-Erkennung weiter verbessert     }
  215. {                    01.01.98  - MSXiE von Mercury Soft Technology wird   }
  216. {                                erkannt                                  }
  217. {                    17.01.98  - Weitere WinZip-Variante wird identifiz.  }
  218. {          2.34      31.01.98  - Format RAX wird erkannt                  }
  219. {                    01.03.98  - Format 777 (Win32) wird identifiziert    }
  220. {          2.35      12.04.98  - Formate LZS221 (Stac), HPA (Hungarian    }
  221. {                                Pirate Alliance), Arhangel (George       }
  222. {                                Lyapko), EXP1 (Bulat Ziganshin) und IMP  }
  223. {                                werden erkannt                           }
  224. {                    20.04.98  - BMF (komprimiertes Grafikformat) wird    }
  225. {                                erkannt                                  }
  226. {                    29.04.98  - NRV (Demo von Markus Oberhumer) wird     }
  227. {                                identifiziert                            }
  228. {                    30.04.98  - PAK 1.0a (Dmitry Dvoinikov) wird erkannt }
  229. {          2.36      08.05.98  - Squisch (Mike Albert) wird identifiziert }
  230. {                              - PRO-PACK 2.14 (mit anderem Header) wird  }
  231. {                                erkannt                                  }
  232. {                              - ParB (Win32-Archiver) wird identifiziert }
  233. {                    10.05.98  - PAK 1.0a-Erkennung verbessert            }
  234. {                    13.05.98  - ARX-Erkennung verbessert                 }
  235. {                    17.05.98  - WinRAR-Erkennung optimiert               }
  236. {          2.37      05.06.98  - Formate HIT (Bogdan Ureche) und SBX      }
  237. {                                werden identifiziert                     }
  238. {                    09.06.98  - Weitere WinZip-Sfx-Variante wird erkannt }
  239. {          2.40      14.06.98  - szip-Erkennung verbessert (Dank an       }
  240. {                                Michael Schindler für Infos)             }
  241. {                              - Erkennung der alten Sfx-Formate LHarc und}
  242. {                                LARC verbessert                          }
  243. {          2.41.00   01.07.98  - Indentifizierung des NSK-Formats         }
  244. {          2.41.01   03.07.98  - Weiteres WinZip-32 Bit-Sfx erkannt       }
  245. {          2.41.02   11.07.98  - Format DST (Disintegrator 0.9b, Tommaso  }
  246. {                                Gugli) wird erkannt                      }
  247. {          2.41.03   12.07.98  - ASD (Tobias Svensson) wird identifiziert }
  248. {          2.42.00   03.08.98  - Zur besseren Errorlevel-Auswertung werden}
  249. {                                unbekannte Archive/Nichtarchivdateien    }
  250. {                                nicht mehr als Typ 0, sondern 251 erkannt}
  251. {          2.42.01   12.08.98  - SZip-Bugfix                              }
  252. {          2.42.02   17.08.98  - Erkennung von BTSPK verbessert           }
  253. {          2.42.03   23.08.98  - InstallShield-CAB wird erkannt           }
  254. {          2.42.04   02.09.98  - QFC 2.0 wird erkannt                     }
  255. {          2.42.05   10.09.98  - TOP4 und Batcomp (4DOS) werden erkannt   }
  256. {          2.42.06   11.09.98  - Kleinere Bugfixes                        }
  257. {          2.42.07   12.09.98  - TOP4- und Batcomp-Erkennung präzisiert   }
  258. {          2.42.08   14.10.98  - BlakHole (Win32) wird erkannt            }
  259. {          2.43.00   02.12.98  - BIX (Igor Pavlov) wird identifiziert     }
  260. {          2.43.01   15.01.99  - ChiefLZA wird erkannt                    }
  261. {          2.50.00   14.02.99  - Bei Einbindung von LFN.PAS von Andreas   }
  262. {                                Killer ($DEFINE LONGNAME) werden lange   }
  263. {                                Dateinamen unter Windows unterstützt     }
  264. {          2.50.01   24.02.99  - Blink von D.T.S. wird erkannt            }
  265. {          2.50.02   01.03.99  - CAR von MylesHi! Software wird erkannt   }
  266. {          2.50.03   07.03.99  - SARJ wird anhand Extension .SRJ + ARJ-   }
  267. {                                Format identifiziert                     }
  268. {          2.50.04   11.03.99  - Compack-Sfxes werden erkannt             }
  269. {          2.50.05   16.03.99  - LogiTech Compress wird identifiziert     }
  270. {          2.50.06   20.03.99  - LHarc 1.13c-Sfxes werden erkannt         }
  271. {          2.51.00   24.03.99  - Alle Funktionen LFN-fähig gemacht        }
  272. {          2.51.01   31.03.99  - ARS-Sfx-Packer wird erkannt              }
  273. {          2.51.02   02.04.99  - Format AKT wird identifiziert            }
  274. {          2.51.03   05.04.99  - Formate Flash (FLH) und PC/3270 werden   }
  275. {                                identifiziert                            }
  276. {          2.51.04   11.04.99  - Formate NPack und PFT (Perfect Finishing }
  277. {                                Touch) werden erkannt                    }
  278. {          2.51.05   06.05.99  - Neues 4DOS 6.02-BATCOMP-Format wird erk. }
  279. {          2.52.00   11.05.99  - Packer XTreme wird erkannt (scheint eine }
  280. {                                RAX-Variante zu sein)                    }
  281. {                              - Format SemOne wird identifiziert         }
  282. {          2.52.01   12.05.99  - AKT32 wird erkannt                       }
  283. {          2.52.02   18.05.99  - InstallIt 2.0x wird identifiziert        }
  284. {          2.52.03   23.05.99  - Erkennung von MS Compress verbessert     }
  285. {          2.52.04   27.05.99  - SemOne 0.5-Erkennung                     }
  286. {          2.52.05   18.06.99  - Erkennung von PPMD                       }
  287. {          2.53.00   02.07.99  - Neues ZIP-Format mit 'PK00PK' im         }
  288. {                                Dateiheader wird erkannt                 }
  289. {          2.53.01   13.07.99  - Format SWG (Sourceware Archival Group)   }
  290. {                                wird identifiziert                       }
  291. {          2.53.02   02.08.99  - Deutscher Winzip 32 Bit-Selfextractor    }
  292. {                                wird erkannt (z.B. TGeb)                 }
  293. {          2.54.00   08.08.99  - ARJ-Win32-Sfxes werden identifiziert     }
  294. {                              - ARJ-Erkennung verbessert                 }
  295. {                              - FIZ-Format wird erkannt                  }
  296. {          2.55.00   13.08.99  - Wesentlich mehr RAR-32 Bit-Sfx-Formate   }
  297. {                                werden identifiziert                     }
  298. {          2.55.01   14.08.99  - RAR-32 Bit-Sfx 2.60b2 und RAR Linux      }
  299. {                                2.60b2 werden erkannt                    }
  300. {          2.56.00   18.09.99  - BA (M. Lundqvist) wird identifiziert     }
  301. {                              - RAR-32 Bit-Sfx 2.60b4 wird identifiziert }
  302. {                              - Unbekannte EXEs ohne angehängtes Archiv  }
  303. {                                (Non-Sfxes) werden nicht mehr falsch     }
  304. {                                identifiziert                            }
  305. {                              - Kleinere Bugfixes bei LFN-Verarbeitung   }
  306. {          2.56.01   21.09.99  - Bessere ARJ-DOS-Sfx-Erkennung (inklusive }
  307. {                                Version 2.63)                            }
  308. {          2.56.02   22.09.99  - RAR-32 Bit-Sfx 2.60b5 wird erkannt       }
  309. {          2.56.03   29.09.99  - Format XPA32 (Jauming Tseng) wird erkannt}
  310. {          2.56.04   02.10.99  - BA-Erkennung verbessert (einige Win-Sfxes}
  311. {                                wurden fälschlicherweise als BA erkannt) }
  312. {          2.57.00   14.11.99  - Format RK (Nachfolger von RKive) wird    }
  313. {                                identifiziert                            }
  314. {          2.57.01   09.01.00  - ARJ/2 2.70-Sfxes werden erkannt          }
  315. {          2.58.00   21.02.00  - RedHat Linux RPM-Dateien werden erkannt  }
  316. {          2.58.01   12.03.00  - PAK-Format wird sicherer von ARC/ARC+    }
  317. {                                unterschieden                            }
  318. {                              - Format DeepFreezer wird erkannt          }
  319. {          2.58.02   16.03.00  - ZZip (Damien Debin) wird identifiziert   }
  320. {          2.58.03   01.04.00  - ABComp 2.06 wird erkannt                 }
  321. {          2.58.04   15.04.00  - DC 0.98b (Edgar Binder) wird erkannt     }
  322. {          2.60.00   24.05.00  - ACE 2.0ß1-Sfxe werden identifiziert      }
  323. {          2.60.01   29.05.00  - TPac 1.7 von Tim Gordon wird erkannt     }
  324. {          2.60.02   07.06.00  - ACE 2.0ß2-Sfxe werden identifiziert      }
  325. {          2.61.00   16.07.00  - Neue eMail-, WWW- und FTP-Adressen       }
  326. {          2.61.01   24.07.00  - Bessere Erkennung neuerer ACE-, RAR- und }
  327. {                                ARJ-Sfxe (alle Plattformen)              }
  328. {          2.62.00   09.08.00  - Packer Ai (E.Ilya) wird identifiziert    }
  329. {          2.62.01   26.08.00  - Ybs (Vadim Yoockin) wird erkannt         }
  330. {                              - (Win)ACE 2.0b2-Sfxe werden identifiziert }
  331. {          2.62.02   20.09.00  - Ai32 wird erkannt                        }
  332. {          2.62.03   08.10.00  - (Win)ACE 2.0b3-Sfxe werden identifiziert }
  333. {          2.63.00   18.10.00  - ACE 2.0b3-Sfx-Erkennung verbessert       }
  334. {                              - Packer SBC (Sami Mäkinen) wird erkannt   }
  335. {          2.63.01   29.10.00  - DitPack 1.0 wird identifiziert           }
  336. {          2.64.00   08.12.00  - ACE-Sfxe 2.0b3 und 2.0b4 werden identi-  }
  337. {                                fiziert (alle Plattformen)               }
  338. {                              - Codeoptimierung der ACE-Sfx-Erkennungs-  }
  339. {                                Funktion (Dank an Snow Panther)          }
  340. {          2.64.01   12.12.00  - Codeoptimierung der ZIP- und RAR-Sfx-    }
  341. {                                Erkennungs-Funktionen durch Snow Panther }
  342. {                              - Viele neue ZIP-Sfxe (vor allem von Unix- }
  343. {                                Plattformen) und einige ACE-Sfxe zugefügt}
  344. {          2.64.02   31.12.00  - (Win-)ACE 2.0b5-Sfxe werden erkannt      }
  345. {          2.65.00   11.01.01  - WinRAR und Rar/Linux 2.80b3 werden       }
  346. {                                identifiziert                            }
  347. {                              - ZZip 0.36b (inkl. Sfxe) wird erkannt     }
  348. {          2.65.01   29.01.01  - PAR 2.00 Beta wird identifiziert         }
  349. {          2.65.02   01.02.01  - (Win)ACE 2.0 Release-Sfxes werden erkannt}
  350. {          2.65.03   13.02.01  - DMS (Amiga) wird identifiziert           }
  351. {          2.65.04   17.02.01  - Weitere WinRAR- und WinACE-Sfxes werden  }
  352. {                                identifiziert                            }
  353. {          2.65.05   21.02.01  - Packer EPC wird erkannt                  }
  354. {          2.65.06   10.03.01  - vectorsoft VSARC wird erkannt            }
  355. {          2.65.07   29.03.01  - Weitere WinRAR-Sfxes werden identifiziert}
  356. {          2.66.00   12.04.01  - Format RDMC wird erkannt                 }
  357. {                              - Weitere ZIP-Sfxes werden identifiziert   }
  358. {          2.66.01   04.05.01  - RDMC-Erkennung war unzuverlässig -       }
  359. {                                entfernt                                 }
  360. {          2.66.02   19.05.01  - Format PDZ wird erkannt                  }
  361. {          2.66.03   04.06.01  - Bugfix in Installshield-EXE-Erkennung    }
  362. {                                (Dank an Snow Panther)                   }
  363. {          2.66.04   25.06.01  - "Package for the Web"-Format wird erkannt}
  364. {                                (Dank an Snow Panther)                   }
  365.  
  366.  
  367. {  Last changes:                                                          }
  368. {          2.13                - First german-english version             }
  369. {          2.14      02-23-97  - Format SKY is being recognized           }
  370. {                    02-24-97  - Better RKive detection                   }
  371. {          2.15      03-08-97  - ZAR was sometimes identified as TTComp   }
  372. {                              - Format ARI is recognized - but only due  }
  373. {                                to the file extension                    }
  374. {                              - Format UFA is identified                 }
  375. {                    03-09-97  - Microsoft's CAB (Windows 95) is being    }
  376. {                                recognized                               }
  377. {                    03-11-97  - Bugfix: some archives were only recog-   }
  378. {                                nized, if their names were written in    }
  379. {                                uppercase letters                        }
  380. {                    03-12-97  - Recognition of FOXSQZ                    }
  381. {                    03-16-97  - Recognition of AR7                       }
  382. {                    03-18-97  - Idenfification of the Stirling Compressor}
  383. {                    03-22-97  - Added PPMZ-recognition                   }
  384. {          2.16      03-30-97  - Added MS Compress                        }
  385. {                    04-02-97  - Identifies MP3 and ZET                   }
  386. {          2.17      04-07-97  - Identifies XPack data and disk image     }
  387. {                                files                                    }
  388. {                    04-17-97  - Recognizes ARQ archives                  }
  389. {          2.18      04-27-97  - Recognizes ACE archives                  }
  390. {                    05-10-97  - Squash by D. Murk is being recognized    }
  391. {          2.19      05-14-97  - Improved ACE-Sfx-recognition             }
  392. {                              - Identification of packer Terse           }
  393. {                    05-17-97  - Recognizes XPack single file data        }
  394. {          2.20      05-21-97  - BS Archiver 1.6 (older version of BSA)   }
  395. {                                is being identified (as BSN)             }
  396. {                    05-24-97  - ACE 0.9c5 Sfx jr. is being recognized    }
  397. {                              - Stuffit (Mac) is being identified        }
  398. {                              - Improved PKZip Windows- and OS/2 sfx and }
  399. {                                WinRAR install sfx recognition           }
  400. {          2.21      05-25-97  - Because of problems of some older        }
  401. {                                unpackers with multitaskers (eg. PKUnpak }
  402. {                                and OS/2) IDPACKER opens archives in     }
  403. {                                sharing mode (permit all)                }
  404. {                    06-01-97  - PUCrunch is being identified             }
  405. {                    06-04-97  - ACE 0.9d3 sfx is being recognized        }
  406. {                    06-05-97  - BZip is being identified                 }
  407. {          2.22      06-08-97  - ACE 0.9d4 sfx is being recognized        }
  408. {                    06-09-97  - The following multiple volume archives   }
  409. {                                are not more identified only from the    }
  410. {                                file extension, but from the volume flag }
  411. {                                in the archive header: ARJ, ARJ-Sfx, RAR,}
  412. {                                RAR-Sfx, ACE                             }
  413. {          2.23      06-18-97  - Recognition of ACE 0.9e3 sfx             }
  414. {                    06-20-97  - Recognition of PKZip/2 2.50 sfx          }
  415. {                    06-23-97  - Bugfix: when using wildcards in archive  }
  416. {                                names sfxes were not recognized correctly}
  417. {          2.24      07-19-97  - Recognition of UHarc 0.1.66              }
  418. {                    07-23-97  - At the following archive formats it is   }
  419. {                                detected, whether they are AV-secured    }
  420. {                                or locked (through AV-Flag in header):   }
  421. {                                ARJ, ARJ-Sfx, RAR, RAR-Sfx, ACE          }
  422. {                    08-03-97  - Bugfix in function IsEXE(): the variable }
  423. {                                FileMode was eventually not reset        }
  424. {                                (Thanks to Ralph Roth)                   }
  425. {                    08-04-97  - Format ABComp 2.04b is being recognized  }
  426. {                    08-18-97  - Format CMP (André Olejko) is identified  }
  427. {                    08-20-97  - Smaller bugfixes                         }
  428. {          2.25      08-24-97  - BZip2 is recognized                      }
  429. {          2.26      08-25-97  - BS Archiver 1.9 (older version of BSA)   }
  430. {                                is being identified (as BSN)             }
  431. {                              - Recognizes LZOP (M.-F.-X.-J. Oberhumer)  }
  432. {          2.27      08-26-97  - Better distinction ARC/PAK               }
  433. {                                (Thanks to George Shadoff)               }
  434. {          2.28      08-28-97  - Bugfix at ARJ-AV-recognition             }
  435. {                              - Crude szip detection (only by one byte   }
  436. {                                and extension .sz)                       }
  437. {                    08-31-97  - WinZip sfxes are identified (as ZIPs)    }
  438. {                    09-09-97  - Format Splint is being identified        }
  439. {                    09-14-97  - Function IsEXE: DOS-EXEs may also start  }
  440. {                                with 'ZM' instead of 'MZ' (thanks to     }
  441. {                                Pierre Foucart)                          }
  442. {          2.29      09-17-97  - Format TAR is recognized (only from file }
  443. {                                extension .TAR)                          }
  444. {                              - InstallShield format is identified       }
  445. {          2.30      09-24-97  - Enhanced Codec-Detection                 }
  446. {                              - Enhanced ZIP-Archiv-Detection            }
  447. {                              - Enhanced Limit-Detection                 }
  448. {                              - Format CARComp is recognized (only from  }
  449. {                                file extension .CAR)                     }
  450. {                    09-26-97  - Better detection of WinRAR (incl. 2.02)  }
  451. {                    09-29-97  - LZS gets own archive type                }
  452. {          2.31      10-11-97  - Also 32 bit WinZip sfxes are recognized  }
  453. {                                (as ZIP)                                 }
  454. {                    10-13-97  - Another Windows install sfx format (ZIP) }
  455. {                                added                                    }
  456. {                    10-14-97  - Simplified file access mode              }
  457. {                    10-15-97  - Sometimes LHark archives were identified }
  458. {                                as AIN                                   }
  459. {          2.32      01-11-97  - Format BOA is being identified           }
  460. {                              - InstallShield-Z-format is recognized     }
  461. {                    08-11-97  - Formats ARG and Gather (GTH) are identif.}
  462. {                              - RKive 1.9 is identified                  }
  463. {          2.33      11-27-97  - Formats Pack Magic, Big Tree Software    }
  464. {                                Archiver, ELI 5750 and QFC are identified}
  465. {                    12-06-97  - PRO-PACK is identified                   }
  466. {                              - WinZip32 recognition again improved      }
  467. {                    01-01-98  - MSXiE by Mercury Soft Technology is      }
  468. {                                being identified                         }
  469. {                    01-17-98  - Another WinZip variant is identified     }
  470. {          2.34      01-31-98  - Format RAX is being recognized           }
  471. {                    03-01-98  - Format 777 (Win32) is being identified   }
  472. {          2.35      04-12-98  - Formats LZS221 (Stac), HPA (Hungarian    }
  473. {                                Pirate Alliance), Arhangel (George       }
  474. {                                Lyapko), EXP1 (Bulat Ziganshin) and IMP  }
  475. {                                are being identified                     }
  476. {                    04-20-98  - BMF (compressed graphics format) is      }
  477. {                                being identified                         }
  478. {                    04-29-98  - NRV (demo by Markus Oberhumer) is being  }
  479. {                                identified                               }
  480. {                    04-30-98  - PAK 1.0a (Dmitry Dvoinikov) is recognized}
  481. {                    05-07-98  - Squisch (Mike Albert) is identified      }
  482. {          2.36      05-10-98  - Squisch (Mike Albert) is identified      }
  483. {                              - PRO-PACK 2.14 (with other header) is     }
  484. {                                recognized                               }
  485. {                              - ParB (Win32 archiver) is being identified}
  486. {                    05-10-98  - Identification of PAK 1.0a improved      }
  487. {                    05-13-98  - Identification of ARX improved           }
  488. {                    05-17-98  - WinRAR detection optimized               }
  489. {          2.37      06-05-98  - Formats HIT (Bogdan Ureche) and SBX      }
  490. {                                are being identified.                    }
  491. {                    06-09-98  - Another WinZip sfx type added            }
  492. {          2.40      06-14-98  - Improved szip detection (thanks to       }
  493. {                                Michael Schindler for infos              }
  494. {                              - Improved old LHarc and LARC sfx detection}
  495. {          2.41.00   07-01-98  - Format NSK is identified                 }
  496. {          2.41.01   07-03-98  - Another WinZip 32 bit sfx detected       }
  497. {          2.41.02   07-11-98  - Format DST (Disintegrator 0.9b, Tommaso  }
  498. {                                Gugli) is recognized                     }
  499. {          2.41.03   07-12-98  - ASD (Tobias Svensson) is identified      }
  500. {          2.42.00   08-03-98  - For better interpretation of the         }
  501. {                                errorlevel unknown/invalid archives do   }
  502. {                                not have type 0 anymore, but 251         }
  503. {          2.42.01   08-12-98  - SZip bugfix                              }
  504. {          2.42.02   08-17-98  - Better BTSPK identification              }
  505. {          2.42.03   08-23-98  - InstallShield-CAB is recognized          }
  506. {          2.42.04   09-02-98  - QFC 2.0 is identified                    }
  507. {          2.42.05   09-10-98  - TOP4 and Batcomp (4DOS) are recognized   }
  508. {          2.42.06   09-11-98  - Smaller bugfixes                         }
  509. {          2.42.07   09-12-98  - Enhanced TOP4 and Batcomp identification }
  510. {          2.42.08   10-14-98  - BlakHole (Win32) is recognized           }
  511. {          2.43.00   12-02-98  - BIX (Igor Pavlov) is identified          }
  512. {          2.43.01   01-15-99  - ChiefLZA is recognized                   }
  513. {          2.50.00   02-14-99  - When incorporating LFN.PAS by Andreas    }
  514. {                                Killer ($DEFINE LONGNAME) LFNs are       }
  515. {                                supported under windows                  }
  516. {          2.50.01   02-24-99  - Blink by D.T.S. is identified            }
  517. {          2.50.02   03-01-99  - CAR by MylesHi! Software is recognized   }
  518. {          2.50.03   03-07-99  - SARJ is recognized by extension .SRJ and }
  519. {                                ARJ format                               }
  520. {          2.50.04   03-11-99  - Compack sfxes are recognized             }
  521. {          2.50.05   03-16-99  - LogiTech Compress is identified          }
  522. {          2.50.06   03-20-99  - LHarc 1.13c sfxes are recognized         }
  523. {          2.51.00   03-24-99  - Made all functions LFN capable           }
  524. {          2.51.01   03-31-99  - ARS-Sfx-Packer wird erkannt              }
  525. {          2.51.02   04-02-99  - Format AKT is identified                 }
  526. {          2.51.03   04-05-99  - Formats Flash (FLH) and PC/3270 are      }
  527. {                                identified                               }
  528. {          2.51.04   04-11-99  - Formats NPack and PFT (Perfect Finishing }
  529. {                                Touch) are recognized                    }
  530. {          2.51.05   05-06-99  - New 4DOS 6.02-BATCOMP format is identif. }
  531. {          2.52.00   05-11-99  - Packer XTreme is recognized (seems to be }
  532. {                                a RAX variant)                           }
  533. {                              - Format SemOne is identified              }
  534. {          2.52.01   05-12-99  - AKT32 is recognized                      }
  535. {          2.52.02   05-18-99  - InstallIt 2.0x is identified             }
  536. {          2.52.03   05-25-99  - Improved MS Compress detection           }
  537. {          2.52.04   05-27-99  - SemOne 0.5 recognition                   }
  538. {          2.52.05   06-18-99  - Recognition of PPMD                      }
  539. {          2.53.00   07-02-99  - New ZIP format with 'PK00PK' in the file }
  540. {                                header is recognized                     }
  541. {          2.53.01   07-13-99  - Format SWG (Sourceware Archival Group)   }
  542. {                                is being identified                      }
  543. {          2.53.02   08-02-99  - Added german Winzip 32 Bit selfextractor }
  544. {          2.54.00   08-08-99  - ARJ Win32 sfxes are identified           }
  545. {                              - Improved ARJ detection                   }
  546. {                              - FIZ format is recognized                 }
  547. {          2.55.00   08-13-99  - Added several RAR 32 bit-sfx formats     }
  548. {          2.55.01   08-14-99  - RAR 32 bit sfx 2.60b2 and RAR Linux      }
  549. {                                2.60b2 are identified                    }
  550. {          2.56.00   09-18-99  - BA (M. Lundqvist) is recognized          }
  551. {                              - RAR 32 bit sfx 2.60b4 is identified      }
  552. {                              - No more false identifications of unknown }
  553. {                                EXEs without archive data at the end     }
  554. {                                (non-sfxes)                              }
  555. {                              - Small bugfixes in LFN handling           }
  556. {          2.56.01   09-21-99  - Better ARJ DOS sfx recognition (including}
  557. {                                version 2.63)                            }
  558. {          2.56.02   09-22-99  - RAR 32 bit sfx 2.60b5 is identified      }
  559. {          2.56.03   09-29-99  - Format XPA32 (J. Tseng) is identified    }
  560. {          2.56.04   10-02-99  - BA-Recognition improved (some Win-sfxes  }
  561. {                                were falsely identified as BA)           }
  562. {          2.57.00   11-14-99  - Format RK (successor of RKive) is being  }
  563. {                                identified                               }
  564. {          2.57.01   01-09-00  - ARJ/2 2.70 format is recognized          }
  565. {          2.58.00   02-21-00  - RedHat Linux RPM files are identified    }
  566. {          2.58.01   03-12-00  - PAK is better distinguished from ARC/ARC+}
  567. {                              - Format DeepFreezer is recognized         }
  568. {          2.58.02   03-16-00  - ZZip (Damien Debin) is being identified  }
  569. {          2.58.03   04-01-00  - ABComp 2.06 is recognized                }
  570. {          2.58.04   04-15-00  - DC 0.98b (Edgar Binder) is identified    }
  571. {          2.60.00   05-24-00  - ACE 2.0ß1 sfxes are recognized           }
  572. {          2.60.01   05-29-00  - TPac 1.7 by Tim Gordon is identified     }
  573. {          2.60.02   06-07-00  - ACE 2.0ß1 sfxes are recognized           }
  574. {          2.61.00   07-16-00  - New eMail, WWW and FTP addresses         }
  575. {          2.61.01   07-24-00  - More reliable identification of newer    }
  576. {                                ACE, RAR and ARJ sfxes (all platforms)   }
  577. {          2.62.00   08-09-00  - Packer Ai (E.Ilya) is being identified   }
  578. {          2.62.01   08-26-00  - Ybs (Vadim Yoockin) is identified        }
  579. {                              - (Win)ACE 2.0b2 sfxes are recognized      }
  580. {          2.62.02   09-20-00  - Ai32 is identified                       }
  581. {          2.62.03   10-08-00  - (Win)ACE 2.0b3 sfxes are recognized      }
  582. {          2.63.00   10-18-00  - ACE 2.0b3 sfx recognition improved       }
  583. {                              - Packer SBC (Sami Mäkinen) is identified  }
  584. {          2.63.01   10-19-00  - DitPack 1.0 is being identified          }
  585. {          2.64.00   12-08-00  - ACE sfxes 2.0b3 and 2.0b4 are identified }
  586. {                                (all platforms)                          }
  587. {                              - Code optimization of ACE sfx recognition }
  588. {                                function (thanks to Snow Panther)        }
  589. {          2.64.01   12-12-00  - Code optimization of RAR and ZIP sfx     }
  590. {                                recognition functions (by Snow Panther)  }
  591. {                              - Added many new ZIP sfxes (primarily from }
  592. {                                Unix platforms) and some ACE sfxes       }
  593. {          2.64.02   12-31-00  - (Win-)ACE 2.0b5 sfxes are recognized     }
  594. {          2.65.00   01-11-01  - WinRAR and Rar/Linux 2.80b3 are being    }
  595. {                                identified                               }
  596. {                              - ZZip 0.36b (incl. sfxes) is recognized   }
  597. {          2.65.01   01-29-01  - PAR 2.00 beta is being identified        }
  598. {          2.65.02   02-01-01  - (Win)ACE 2.0 Release sfxes are identified}
  599. {          2.65.03   02-13-01  - DMS (Amiga) is recognized                }
  600. {          2.65.04   02-17-01  - Some other WinRAR and WinACE sfxes are   }
  601. {                                being identified                         }
  602. {          2.65.05   02-21-01  - Packer EPC is recognized                 }
  603. {          2.65.06   03-10-01  - vectorsoft VSARC is recognized           }
  604. {          2.65.07   03-29-01  - More WinRAR sfxes are identified         }
  605. {          2.66.00   04-12-01  - Format RDMC is recognized                }
  606. {                              - More ZIP sfxes are identified            }
  607. {          2.66.01   05-04-01  - RDMC recognition was unreliable - removed}
  608. {          2.66.02   05-19-01  - Format PDZ is identified                 }
  609. {          2.66.03   06-04-01  - Fixed a bug in Installshield EXE         }
  610. {                                detection (thanks to Snow Panther)       }
  611. {          2.66.04   06-25-01  - "Package for the Web" format is ident.   }
  612. {                                (thanks to Snow Panther)                 }
  613.  
  614. UNIT IDPacker;
  615.  
  616. {$B-,I-,V-,E-,S-,N-,R-,X+,A+}
  617. {$IFNDEF DEBUG}
  618. {$D-,L-}
  619. {$ENDIF}
  620.  
  621. INTERFACE
  622.  
  623. USES Dos
  624.  
  625. {$IFDEF LONGNAME}
  626.    ,LFN
  627. {$ENDIF};
  628.  
  629. CONST ARCType=1;
  630.      ZIPType=2;
  631.      ZOOType=3;
  632.      LZHType=4;
  633.      DWCType=5;
  634.      MDType=6;
  635.      LBRType=7;
  636.      ARJType=8;
  637.      HYPType=9;
  638.      UC2Type=10;
  639.      HAPType=11;
  640.      HAType=12;
  641.      HPKType=13;
  642.      SQZType=14;
  643.      RARType=15;
  644.      PAKType=16;
  645.      ARCPlusType=17;
  646.      LIMType=18;
  647.      BSNType=19;
  648.      PUTType=20;
  649.      SQWEZType=21;
  650.      CruPType=22;
  651.      CruJType=23;
  652.      CruLType=24;
  653.      CruZType=25;
  654.      CruHType=26;
  655.      LZEXEType=27;
  656.      PKLiteType=28;
  657.      DietType=29;
  658.      TinyProgType=30;
  659.      GIFType=31;
  660.      JFIFType=32;
  661.      JHSIType=33;
  662.      AINType=34;
  663.      AINEXEType=35;
  664.      SARType=36;
  665.      BS2Type=37;
  666.      GZIPType=38;
  667.      ACBType=39;
  668.      MARType=40;
  669.      CPZType=41;
  670.      JRCType=42;
  671.      JARType=43;
  672.      QType=44;
  673.      SofType=45;
  674.      CruType=46;
  675.      ARXType=47;
  676.      UCEXEType=48;
  677.      WWPType=49;
  678.      QARKType=50;
  679.      YACType=51;
  680.      X1Type=52;
  681.      CDCType=53;
  682.      AMGType=54;
  683.      NLIType=55;
  684.      PLLType=56;
  685.      TGZType=57;
  686.      WWDType=58;
  687.      CHZType=59;
  688.      PSAType=60;
  689.      ZARType=61;
  690.      LHKType=62;
  691.      PACType=63;
  692.      XFType=64;
  693.      KBOType=65;
  694.      NSQType=66;
  695.      DPAType=67;
  696.      TTCType=68;
  697.      WICType=69;
  698.      RKVType=70;
  699.      JRType=71;
  700.      ESPType=72;
  701.      ZPKType=73;
  702.      DRYType=74;
  703.      OWSType=75;
  704.      SkyType=76;
  705.      ARIType=77;
  706.      UfaType=78;
  707.      CABType=79;
  708.      FSqzType=80;
  709.      AR7Type=81;
  710.      TSCType=82;
  711.      PPMZType=83;
  712.      ExpType=84;
  713.      MP3Type=85;
  714.      ZetType=86;
  715.      XpaType=87;
  716.      XdiType=88;
  717.      ArqType=89;
  718.      AceType=90;
  719.      ArhType=91;
  720.      TerType=92;
  721.      XpdType=93;
  722.      SitType=94;
  723.      PucType=95;
  724.      BZipType=96;
  725.      UhaType=97;
  726.      AbcType=98;
  727.      CmpType=99;
  728.      BZip2Type=100;
  729.      LzoType=101;
  730.      SzipType=102;
  731.      SplType=103;
  732.      TarType=104;
  733.      IShType=105;
  734.      CaCType=106;
  735.      LzsType=107;
  736.      BoaType=108;
  737.      IShZType=109;
  738.      ArgType=110;
  739.      GthType=111;
  740.      PckType=112;
  741.      BtsType=113;
  742.      EliType=114;
  743.      QfcType=115;
  744.      RncType=116;
  745.      XieType=117;
  746.      RaxType=118;
  747.      _777Type=119;
  748.      StacType=120;
  749.      HpaType=121;
  750.      LgType=122;
  751.      Exp1Type=123;
  752.      ImpType=124;
  753.      BmfType=125;
  754.      NrvType=126;
  755.      PddType=127;
  756.      SqType=128;
  757.      ParType=129;
  758.      HitType=130;
  759.      SbxType=131;
  760.      NskType=132;
  761.      DstType=133;
  762.      AsdType=134;
  763.      IscType=135;
  764.      T4Type=136;
  765.      BtmType=137;
  766.      BhType=138;
  767.      BixType=139;
  768.      LzaType=140;
  769.      BliType=141;
  770.      CarType=142;
  771.      SArjType=143;
  772.      CpkType=144;
  773.      LgCType=145;
  774.      ArsType=146;
  775.      AktType=147;
  776.      FlhType=148;
  777.      PC3Type=149;
  778.      NpaType=150;
  779.      PftType=151;
  780.      XTType=152;
  781.      SemType=153;
  782.      A32Type=154;
  783.      IiType=155;
  784.      PpmType=156;
  785.      SwgType=157;
  786.      FizType=158;
  787.      BaType=159;
  788.      Xpa32Type=160;
  789.      RKType=161;
  790.      RpmType=162;
  791.      DfType=163;
  792.      ZZType=164;
  793.      DCType=165;
  794.      TpcType=166;
  795.      AiType=167;
  796.      YbsType=168;
  797.      Ai32Type=169;
  798.      SbcType=170;
  799.      DitType=171;
  800.      DmsType=172;
  801.      EpcType=173;
  802.      VsaType=174;
  803.      PdzType=175;
  804.      PfwType=176;
  805.  
  806.      Invalid=251;
  807.      FileNotFound=255;
  808.  
  809. CONST mv: Boolean=false;    (* Multiple volume file? *)
  810.       av: Boolean=false;    (* AV-Envelope/Locked? *)
  811.       NewIsc: Boolean=true; (* New InstallShield CAB (> 5.00.200)? *)
  812.       IDStr: String='';     (* Archive ID *)
  813.  
  814. VAR CrushPacked: Boolean;
  815.  
  816. FUNCTION ArchiveType(ArcName: PathStr): Byte;
  817. FUNCTION ExeSize(FName: PathStr): LongInt;
  818. FUNCTION IsExe(FName: PathStr): Boolean;
  819.  
  820. IMPLEMENTATION
  821.  
  822. TYPE FileStr=String[12];
  823.  
  824. CONST IsEx: Boolean=false;
  825.  
  826. (* Die FUNKTION CapStr wandelt einen String in Großbuchstaben um, wobei die
  827.   deutschen Umlaute berücksichtigt werden. Beispiel:
  828.  
  829.   The FUNCTION CapStr changes a string to uppercase, German "Umlauts" are
  830.   being taken into consideration. Example:
  831.  
  832.              Name := CapStr('Düsseldorf'); (ergibt 'DÜSSELDORF') *)
  833.  
  834. FUNCTION CapStr(St: String): String;
  835.  VAR SLen     : Byte absolute St;
  836.     i         : Byte;
  837.  BEGIN
  838.  For i := 1 to SLen Do
  839.   BEGIN
  840.    CASE St[i] of
  841.     'ä' : St[i] := 'Ä';
  842.     'ö' : St[i] := 'Ö';
  843.     'ü' : St[i] := 'Ü';
  844.     ELSE St[i] := Upcase(St[i]);
  845.    END;
  846.   END;
  847.  CapStr := St;
  848.  END;
  849.  
  850. (* Die Funktion Strip kürzt einen String um ein angegebenes Zeichen.
  851.   The function Strip deletes a given character from a string. *)
  852.  
  853. FUNCTION Strip(L,C: Char; S: String): String;
  854. (* L = links, rechts, beide Enden oder alle Vorkommen.
  855.   L = left, right, both ends or all occurances. *)
  856.  
  857. VAR I: Byte;
  858. BEGIN
  859.    Case Upcase(L) of
  860.    'L' : BEGIN       {Left}
  861.              While (S[1] = C) and (length(S) > 0) do
  862.                    Delete(S,1,1);
  863.          END;
  864.    'R' : BEGIN       {Right}
  865.              While (S[length(S)] = C) and (length(S) > 0) do
  866.                    Delete(S,length(S),1);
  867.          END;
  868.    'B' : BEGIN       {Both left and right}
  869.              While (S[1] = C) and (length(S) > 0) do
  870.                    Delete(S,1,1);
  871.              While (S[length(S)] = C) and (length(S) > 0)  do
  872.                    Delete(S,length(S),1);
  873.          END;
  874.    'A' : BEGIN       {All}
  875.              I := 1;
  876.              Repeat
  877.                   If (S[I] = C) and (length(S) > 0) then
  878.                      Delete(S,I,1)
  879.                   else
  880.                      Inc(I);
  881.              Until (I > length(S)) or (S = '');
  882.          END;
  883.    END;
  884.    Strip := S;
  885. END; {Function Strip}
  886.  
  887. (* Existiert die Datei?
  888.   Does the file exist? *)
  889.  
  890. FUNCTION Exist(Filename: PathStr): Boolean;
  891.  VAR f    : File;
  892.     FMode : Byte;
  893.     IO    : Word;
  894.  BEGIN
  895.  If FileName='' then Exist := false ELSE
  896.   BEGIN
  897.    FMode := FileMode;
  898.    FileMode := 0;
  899.    {$IFDEF LONGNAME}
  900.    Filename := Strip('B','"',Filename);
  901.    {$ENDIF}
  902.    Assign(f,Filename);
  903.    Reset(f); IO := IOResult; If IO=0 then
  904.     BEGIN
  905.      Exist := true;
  906.      Close(f);
  907.     END ELSE Exist := false;
  908.    FileMode := FMode;
  909.   END;
  910.  END;
  911.  
  912. (* Alte Assembler-Variante von Exist; nicht LFN-fähig.
  913.  
  914. FUNCTION Exist(Filename: String): Boolean; Assembler;
  915.  VAR ZStr: String;
  916.  ASM
  917.  PUSH DS
  918.  LDS  SI, Filename        { make ASCIIZ }
  919.  MOV  AX, SS
  920.  MOV  ES, AX
  921.  LEA  DI, ZStr
  922.  MOV  DX, DI
  923.  XOR  CH, CH
  924.  MOV  CL, BYTE PTR [SI]
  925.  INC  SI
  926.  REP  MOVSB
  927.  MOV  BYTE PTR ES:[DI], 0
  928.  MOV  DS, AX
  929.  MOV  AX, 4371h           { get file attributes }
  930.  XOR  BL, BL
  931.  INT  21h
  932.  MOV  AL, FALSE
  933.  JC   @Exit               { fail? }
  934.  AND  CX, 24
  935.  JNZ  @Exit
  936.  INC  AL
  937.  @Exit: POP DS
  938.  END; *)
  939.  
  940. (* LastPos gibt die Stelle des letzten Vorkommens eines Zeichens im String
  941.   zurück.
  942.  
  943.   LastPos returns the last occurance of a char in a string. *)
  944.  
  945. FUNCTION LastPos(c:Char; Str: String): Byte;
  946.  Var i: Byte;
  947.  BEGIN
  948.  i := Length(Str)+1;
  949.  Repeat
  950.   Dec(i);
  951.  Until (i=0) or (Str[i]=c);
  952.  LastPos := i;
  953.  END;
  954.  
  955. (* Die FUNKTION GetFName extrahiert aus einem ihr übergebenen Pfadnamen (Typ
  956.   PathStr) den eigentlichen Dateinamen (Typ FileStr (≡ String[12]), Wildcards
  957.   sind nicht erlaubt. Beispiel:
  958.  
  959.   The FUNCTION GetFName extracts a filename from a complete pathname.
  960.   Wildcards are not allowed. Example:
  961.  
  962.   s := GetFName('C:\DOS\FORMAT.COM'); liefert s = 'FORMAT.COM' *)
  963.  
  964. FUNCTION GetFName(Datei: PathStr): FileStr;
  965.  VAR k                       : Byte;
  966.     s                        : PathStr;
  967.  BEGIN
  968.  s := '';
  969.  k := Length(Datei);
  970.  While ((Datei[k] <> '\') and (Datei[k] <> ':') and (k > 0)) Do
  971.   BEGIN
  972.    s := Datei[k]+s;
  973.    Dec(k);
  974.   END;
  975.  GetFName := s;
  976.  END;
  977.  
  978. (* Die FUNKTION GetExt extrahiert aus einem ihr übergebenen Pfadnamen (Typ
  979.   PathStr) die Dateiextension (Typ ExtStr (≡ String[4]), Wildcards sind
  980.   nicht erlaubt. Beispiel:
  981.  
  982.   The FUNCTION GetExt extracts the file extension from a complete pathname.
  983.   Wildcards are not allowed. Example:
  984.  
  985.   s := GetExt('C:\DOS\FORMAT.COM'); liefert s = '.COM' *)
  986.  
  987. FUNCTION GetExt(Datei: PathStr): ExtStr;
  988.  VAR s : PathStr;
  989.     i : Byte;
  990.  BEGIN
  991.  s := GetFName(Datei);
  992.  i := LastPos('.',s);
  993.  If i <> 0 then
  994.   BEGIN
  995.    Delete(s,1,i-1);
  996.    GetExt := s;
  997.   END ELSE GetExt := '';
  998.  END;
  999.  
  1000. (* Die FUNKTION FSize ermittelt die Dateigröße in Bytes und gibt -1 zurück,
  1001.   wenn die Datei nicht existiert.
  1002.  
  1003.   The FUNCTION FSize detects the filesize in bytes and returns -1, if
  1004.   the file does not exist. *)
  1005.  
  1006. FUNCTION FSize(Filename: PathStr): LongInt;
  1007.  VAR f : File of Byte;
  1008.     IO: Word;
  1009.     { FMode: Byte; }
  1010.  BEGIN
  1011.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1012.  {$IFDEF LONGNAME}
  1013.  Filename := Strip('B','"',Filename);
  1014.  {$ENDIF}
  1015.  Assign(f,Filename);
  1016.  Reset(f); IO := IOResult;
  1017.  If (IO=0) or (IO=100) then
  1018.   BEGIN
  1019.    FSize := FileSize(f);
  1020.    Close(f);
  1021.   END ELSE FSize := -1;
  1022.  { FileMode := FMode; }
  1023.  END;
  1024.  
  1025. (* Die FUNKTION EXESize ermittelt die Größe einer EXE-Datei aus ihrem Header.
  1026.  
  1027.   The FUNCTION EXESize detects the size of an EXE-file from its header. *)
  1028.  
  1029. FUNCTION ExeSize(FName: PathStr): LongInt;
  1030.  VAR f           : File of Word;
  1031.      S,R,IO      : Word;
  1032.      Size,Rest   : LongInt;
  1033.      { FMode       : Byte; }
  1034.  BEGIN
  1035.   ExeSize := 0;
  1036.   { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1037.   {$IFDEF LONGNAME}
  1038.   FName := Strip('B','"',FName);
  1039.   {$ENDIF}
  1040.   Assign(f,FName);
  1041.   Reset(f); IO := IOResult;
  1042.   If (IO=0) or (IO=100) then
  1043.    BEGIN
  1044.     Seek(f,1);
  1045.     Read(f,R);
  1046.     Read(f,S);
  1047.     Close(f);
  1048.     Size := LongInt(S);
  1049.     Rest := LongInt(R);
  1050.     ExeSize := ((Size-1) mod 512) shl 9 + Rest;
  1051.    END ELSE ExeSize := -1;
  1052.    { FileMode := FMode; }
  1053.  END;
  1054.  
  1055. (* Handelt es sich bei der Datei um ein EXE-File?
  1056.   Is the file an EXE-file? *)
  1057.  
  1058. FUNCTION IsExe(FName: PathStr): Boolean;
  1059.  VAR f: File of Word;
  1060.     { FMode: Byte; }
  1061.     MZ,IO: Word;
  1062.  BEGIN
  1063.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1064.  {$IFDEF LONGNAME}
  1065.  FName := Strip('B','"',FName);
  1066.  {$ENDIF}
  1067.  Assign(f,FName);
  1068.  Reset(f);
  1069.  IO := IOResult; If (IO=0) or (IO=100) then
  1070.   BEGIN
  1071.    Read(f,MZ);
  1072.    Close(f);
  1073.    IsExe := ((MZ=$5A4D) or (MZ=$4D5A)) and (ExeSize(FName)>0);
  1074.   END ELSE IsExe := false;
  1075.  { FileMode := FMode; }
  1076.  END;
  1077.  
  1078. (* Die FUNKTION Bit ergibt den Zustand von Bit b der Zahl n und dient zur
  1079.   Abfrage Bit-codierter Statusinformationen.
  1080.  
  1081.   The function Bit returns if bit b of the number n is set. *)
  1082.  
  1083. FUNCTION Bit(b: Byte; n: Word): Boolean;
  1084.  BEGIN
  1085.  b := b and 15;
  1086.  Bit := ((n SHR b) and 1) = 1;
  1087.  END;
  1088.  
  1089. (* Handelt es sich um ein Multiple volume-Archiv (gängigste Packer)?
  1090.   Is the file a multiple volume archive (only most common packers)? *)
  1091.  
  1092. FUNCTION VolumeFlag(c: Char; Packer: Byte): Boolean;
  1093.  VAR VFlag: Byte;
  1094.     Code: Integer;
  1095.  BEGIN
  1096.  VolumeFlag := false;
  1097.  VFlag := Byte(c);
  1098.  CASE Packer of
  1099.   ARJType: If Bit(2,VFlag) then VolumeFlag := true;
  1100.   RARType: If Bit(0,VFlag) then VolumeFlag := true;
  1101.   ACEType: If Bit(3,VFlag) then VolumeFlag := true;
  1102.  END;
  1103.  END;
  1104.  
  1105. (* Hat das Archiv einen "Security envelope" (gängigste Packer)?
  1106.   Has the archive a security envelope (only most common packers)? *)
  1107.  
  1108. FUNCTION AVFlag(c: Char; Packer: Byte): Boolean;
  1109.  VAR AFlag: Byte;
  1110.     Code: Integer;
  1111.  BEGIN
  1112.  AVFlag := false;
  1113.  AFlag := Byte(c);
  1114.  CASE Packer of
  1115.   ARJType: If Bit(6,AFlag) or Bit(1,AFlag) then AVFlag := true; (* Bit 1 = alter Security Envelope *)
  1116.   RARType: If Bit(5,AFlag) or Bit(2,AFlag) then AVFlag := true; (* Bit 2 = locked *)
  1117.   ACEType: If Bit(4,AFlag) or Bit(6,AFlag) then AVFlag := true; (* Bit 6 = locked *)
  1118.  END;
  1119.  END;
  1120.  
  1121. (* Ist die Datei mit AINEXE gepackt?
  1122.   Is the file AINEXE-packed? *)
  1123.  
  1124. FUNCTION AINEXEPacked(ArcName: PathStr): Boolean;
  1125.  VAR f: File;
  1126.     s: String[35];
  1127.     Size: LongInt;
  1128.     { FMode: Byte; }
  1129.  BEGIN
  1130.  AINEXEPacked := false;
  1131.  s := '';
  1132.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1133.  {$IFDEF LONGNAME}
  1134.  ArcName := Strip('B','"',ArcName);
  1135.  {$ENDIF}
  1136.  Assign(f,ArcName);
  1137.  Reset(f,1);
  1138.  Size := FileSize(f);
  1139.  If Size>=Length(s) then
  1140.   BEGIN
  1141.    BlockRead(f,s[1],SizeOf(s)-1);
  1142.    s[0] := #35;
  1143.    AINEXEPacked := Pos('AIN',s)=33;
  1144.   END;
  1145.  Close(f);
  1146.  { FileMode := FMode; }
  1147.  END;
  1148.  
  1149. (* Ist die Datei mit UCEXE gepackt?
  1150.   Is the file UCEXE-packed? *)
  1151.  
  1152. FUNCTION UCEXEPacked(ArcName: PathStr): Boolean;
  1153.  VAR f: File;
  1154.     s: String[32];
  1155.     Size: LongInt;
  1156.     { FMode: Byte; }
  1157.  BEGIN
  1158.  UCEXEPacked := false;
  1159.  s := '';
  1160.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1161.  {$IFDEF LONGNAME}
  1162.  ArcName := Strip('B','"',ArcName);
  1163.  {$ENDIF}
  1164.  Assign(f,ArcName);
  1165.  Reset(f,1);
  1166.  Size := FileSize(f);
  1167.  If Size>=Length(s) then
  1168.   BEGIN
  1169.    BlockRead(f,s[1],SizeOf(s)-1);
  1170.    s[0] := #32;
  1171.    UCEXEPacked := Pos('UC2X',s)=29;
  1172.   END;
  1173.  Close(f);
  1174.  { FileMode := FMode; }
  1175.  END;
  1176.  
  1177. (* Ist die Datei ein ARJ-Win32-Sfx?
  1178.   Is the file an ARJ Win32 sfx? *)
  1179.  
  1180. FUNCTION ArjWinSfxPacked(ArcName: PathStr): Boolean;
  1181.  VAR f: File;
  1182.     s: String[6];
  1183.     Size: LongInt;
  1184.     Sfx: Boolean;
  1185.     { FMode: Byte; }
  1186.  BEGIN
  1187.  ArjWinSfxPacked := false;
  1188.  s := '';
  1189.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1190.  {$IFDEF LONGNAME}
  1191.  ArcName := Strip('B','"',ArcName);
  1192.  {$ENDIF}
  1193.  Assign(f,ArcName);
  1194.  Reset(f,1);
  1195.  Size := FileSize(f);
  1196.  If Size>=Length(s) then
  1197.   BEGIN
  1198.    Seek(f,900);
  1199.    BlockRead(f,s[1],6);
  1200.    s[0] := #6;
  1201.    Sfx := CapStr(s)='ARJSFX';
  1202.    ArjWinSfxPacked := Sfx;
  1203.    If Sfx then
  1204.     BEGIN
  1205.      Seek(f,15006);
  1206.      BlockRead(f,IDStr[1],SizeOf(IDStr)-1);
  1207.      IDStr[0] := #255;
  1208.     END;
  1209.   END;
  1210.  Close(f);
  1211.  { FileMode := FMode; }
  1212.  END;
  1213.  
  1214. (* Ist die Datei ein ARJ-DOS- oder OS/2-Sfx?
  1215.    Is the file an ARJ DOS or OS/2 sfx? *)
  1216.  
  1217. FUNCTION ArjDOSSfxPacked(ArcName: PathStr): Boolean;
  1218.  VAR f: File;
  1219.     s: String[6];
  1220.     Size: LongInt;
  1221.     Sfx: Boolean;
  1222.     { FMode: Byte; }
  1223.  BEGIN
  1224.  ArjDOSSfxPacked := false;
  1225.  s := '';
  1226.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1227.  {$IFDEF LONGNAME}
  1228.  ArcName := Strip('B','"',ArcName);
  1229.  {$ENDIF}
  1230.  Assign(f,ArcName);
  1231.  Reset(f,1);
  1232.  Size := FileSize(f);
  1233.  If Size>=Length(s) then
  1234.   BEGIN
  1235.    Seek(f,225);
  1236.    BlockRead(f,s[1],6);
  1237.    s[0] := #6;
  1238.    Sfx := CapStr(s)='ARJSFX';
  1239.    ArjDosSfxPacked := Sfx;
  1240.    If not Sfx then
  1241.     BEGIN
  1242.      Seek(f,567);
  1243.      BlockRead(f,s[1],6);
  1244.      s[0] := #6;
  1245.      Sfx := CapStr(s)='ARJSFX';
  1246.      ArjDosSfxPacked := Sfx;
  1247.      If not Sfx then
  1248.       BEGIN
  1249.        Seek(f,663);
  1250.        BlockRead(f,s[1],6);
  1251.        s[0] := #6;
  1252.        Sfx := CapStr(s)='ARJSFX';
  1253.        ArjDosSfxPacked := Sfx;
  1254.        If not Sfx then
  1255.         BEGIN
  1256.          Seek(f,664);
  1257.          BlockRead(f,s[1],6);
  1258.          s[0] := #6;
  1259.          Sfx := CapStr(s)='ARJSFX';
  1260.          ArjDosSfxPacked := Sfx;
  1261.          If not Sfx then
  1262.           BEGIN
  1263.            Seek(f,900);
  1264.            BlockRead(f,s[1],6);
  1265.            s[0] := #6;
  1266.            Sfx := CapStr(s)='ARJSFX';
  1267.            ArjDosSfxPacked := Sfx;
  1268.            If not Sfx then
  1269.             BEGIN
  1270.              Seek(f,208);
  1271.              BlockRead(f,s[1],6);
  1272.              s[0] := #6;
  1273.              Sfx := CapStr(s)='ARJSFX';
  1274.              ArjDosSfxPacked := Sfx;
  1275.              If not Sfx then
  1276.               BEGIN
  1277.                Seek(f,262);
  1278.                BlockRead(f,s[1],6);
  1279.                s[0] := #6;
  1280.                Sfx := CapStr(s)='ARJSFX';
  1281.                ArjDosSfxPacked := Sfx;
  1282.               END;
  1283.              If not Sfx then
  1284.               BEGIN
  1285.                Seek(f,85);
  1286.                BlockRead(f,s[1],6);
  1287.                s[0] := #6;
  1288.                Sfx := CapStr(s)='ARJSFX';
  1289.                ArjDosSfxPacked := Sfx;
  1290.               END;
  1291.             END;
  1292.           END;
  1293.         END;
  1294.       END;
  1295.     END;
  1296.   END;
  1297.  Close(f);
  1298.  { FileMode := FMode; }
  1299.  END;
  1300.  
  1301.  
  1302. (* Ist die Datei ein ACE-DOS-, Win- oder OS/2-Sfx?
  1303.    Is the file an ACE DOS, Win or OS/2 sfx?
  1304.  
  1305.    Funktion optimiert von Snow Panther, danke!
  1306.    Function optimized by Snow Panther, thanks! *)
  1307.  
  1308. FUNCTION ACESfxPacked(ArcName: PathStr): Boolean;
  1309.  Label THE_END;
  1310.  VAR f     : File;
  1311.      Size  : LongInt;
  1312.      zs    : String[5];
  1313.    { FMode : Byte; }
  1314.  
  1315.   FUNCTION CheckSignAtPos(fpos:Longint):Boolean;
  1316.    BEGIN
  1317.     CheckSignAtPos:=false;
  1318.     If fpos<=size then
  1319.      BEGIN
  1320.       Seek(f,fpos);
  1321.       BlockRead(f,zs[1],5);
  1322.       zs[0]:=#5;
  1323.       If zs='**ACE'then CheckSignAtPos:=true;
  1324.      END;
  1325.    END;
  1326.  
  1327. BEGIN
  1328.  ACESfxPacked := false;
  1329.  zs := '';
  1330.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1331.  {$IFDEF LONGNAME}
  1332.  ArcName := Strip('B','"',ArcName);
  1333.  {$ENDIF}
  1334.  Assign(f,ArcName);
  1335.  Reset(f,1);
  1336.  Size := FileSize(f)-5; {5 = length}
  1337.  If CheckSignAtPos(7507)   then goto THE_END;
  1338.  If CheckSignAtPos(7607)   then goto THE_END;
  1339.  If CheckSignAtPos(14037)  then goto THE_END;
  1340.  If CheckSignAtPos(15050)  then goto THE_END;
  1341.  If CheckSignAtPos(15607)  then goto THE_END;
  1342.  If CheckSignAtPos(15807)  then goto THE_END;
  1343.  If CheckSignAtPos(16807)  then goto THE_END;
  1344.  If CheckSignAtPos(21807)  then goto THE_END;
  1345.  If CheckSignAtPos(21907)  then goto THE_END;
  1346.  If CheckSignAtPos(22007)  then goto THE_END;
  1347.  If CheckSignAtPos(22607)  then goto THE_END;
  1348.  If CheckSignAtPos(40967)  then goto THE_END;
  1349.  If CheckSignAtPos(42503)  then goto THE_END;
  1350.  If CheckSignAtPos(43015)  then goto THE_END;
  1351.  If CheckSignAtPos(44039)  then goto THE_END;
  1352.  If CheckSignAtPos(44551)  then goto THE_END;
  1353.  If CheckSignAtPos(57162)  then goto THE_END;
  1354.  If CheckSignAtPos(57174)  then goto THE_END;
  1355.  If CheckSignAtPos(57274)  then goto THE_END;
  1356.  If CheckSignAtPos(57290)  then goto THE_END;
  1357.  If CheckSignAtPos(57646)  then goto THE_END;
  1358.  If CheckSignAtPos(57746)  then goto THE_END;
  1359.  If CheckSignAtPos(57770)  then goto THE_END;
  1360.  If CheckSignAtPos(58609)  then goto THE_END;
  1361.  If CheckSignAtPos(58610)  then goto THE_END;
  1362.  If CheckSignAtPos(58756)  then goto THE_END;
  1363.  If CheckSignAtPos(58837)  then goto THE_END;
  1364.  If CheckSignAtPos(58848)  then goto THE_END;
  1365.  If CheckSignAtPos(58850)  then goto THE_END;
  1366.  If CheckSignAtPos(59122)  then goto THE_END;
  1367.  If CheckSignAtPos(59360)  then goto THE_END;
  1368.  If CheckSignAtPos(61110)  then goto THE_END;
  1369.  If CheckSignAtPos(61134)  then goto THE_END;
  1370.  If CheckSignAtPos(61146)  then goto THE_END;
  1371.  If CheckSignAtPos(61150)  then goto THE_END;
  1372.  If CheckSignAtPos(61170)  then goto THE_END;
  1373.  If CheckSignAtPos(61270)  then goto THE_END;
  1374.  If CheckSignAtPos(61341)  then goto THE_END;
  1375.  If CheckSignAtPos(61409)  then goto THE_END;
  1376.  If CheckSignAtPos(61580)  then goto THE_END;
  1377.  If CheckSignAtPos(68261)  then goto THE_END;
  1378.  If CheckSignAtPos(68614)  then goto THE_END;
  1379.  If CheckSignAtPos(68739)  then goto THE_END;
  1380.  If CheckSignAtPos(71192)  then goto THE_END;
  1381.  If CheckSignAtPos(71714)  then goto THE_END;
  1382.  If CheckSignAtPos(73505)  then goto THE_END;
  1383.  If CheckSignAtPos(77619)  then goto THE_END;
  1384.  If CheckSignAtPos(77763)  then goto THE_END;
  1385.  If CheckSignAtPos(90755)  then goto THE_END;
  1386.  If CheckSignAtPos(91010)  then goto THE_END;
  1387.  If CheckSignAtPos(91865)  then goto THE_END;
  1388.  If CheckSignAtPos(92531)  then goto THE_END;
  1389.  If CheckSignAtPos(92996)  then goto THE_END;
  1390.  If CheckSignAtPos(92997)  then goto THE_END;
  1391.  If CheckSignAtPos(95239)  then goto THE_END;
  1392.  If CheckSignAtPos(102801) then goto THE_END;
  1393.  If CheckSignAtPos(103924) then goto THE_END;
  1394.  If CheckSignAtPos(104537) then goto THE_END;
  1395.  If CheckSignAtPos(106488) then goto THE_END;
  1396.  If CheckSignAtPos(149080) then goto THE_END;
  1397.  Close(f);
  1398.  Exit;
  1399.  
  1400. THE_END:
  1401.  
  1402.  ACESfxPacked:=true;
  1403.  Close(f);
  1404.  { FileMode := FMode; }
  1405. END;
  1406.  
  1407. (* Ist die Datei ein ZIP-DOS-, Win- oder OS/2-Sfx?
  1408.    Is the file a ZIP DOS, Win or OS/2 sfx?
  1409.  
  1410.    Funktion optimiert von Snow Panther, danke!
  1411.    Function optimized by Snow Panther, thanks! *)
  1412.  
  1413. FUNCTION PKWinOS2SfxPacked(ArcName: PathStr): Boolean;
  1414. Label THE_END;
  1415. VAR f: File;
  1416.     s: String[34];
  1417.     Size: LongInt;
  1418.     { FMode: Byte; }
  1419.  
  1420.   FUNCTION CheckZIPSignAtPos(fpos: Longint; sub: String; lsub: Byte): Boolean;
  1421.    BEGIN
  1422.     CheckZIPSignAtPos := false;
  1423.     If fpos<=size then
  1424.      BEGIN
  1425.       Seek(f,fpos);
  1426.       BlockRead(f,s[1],lsub);
  1427.       s[0]:=Chr(lsub);
  1428.       If s=sub then CheckZIPSignAtPos := true;
  1429.      END;
  1430.    END;
  1431.  
  1432.  BEGIN
  1433.   PKWinOS2SfxPacked := false;
  1434.   s := '';
  1435.   { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1436.   {$IFDEF LONGNAME}
  1437.   ArcName := Strip('B','"',ArcName);
  1438.   {$ENDIF}
  1439.   Assign(f,ArcName);
  1440.   Reset(f,1);
  1441.   Size := FileSize(f);
  1442.   If CheckZIPSignAtPos(50,'PKWARE Inc. All Rights Reserved',31) then goto THE_END;
  1443.   If CheckZIPSignAtPos(126,'WinZip Self-Extractor',21) then goto THE_END;
  1444.   If CheckZIPSignAtPos(464,'GWinZip',7) then goto THE_END;
  1445.   If CheckZIPSignAtPos(512,'GWinZip',7) then goto THE_END;
  1446.   If CheckZIPSignAtPos(526,'PKSFX',5) then goto THE_END;
  1447.   If CheckZIPSignAtPos(590,'PKSFX',5) then goto THE_END;
  1448.   If CheckZIPSignAtPos(780,#3'SFX',4) then goto THE_END;
  1449.   If CheckZIPSignAtPos(11712,'PKSFX',5) then goto THE_END;
  1450.   If CheckZIPSignAtPos(12688,'WinZip Self',11) then goto THE_END;
  1451.   If CheckZIPSignAtPos(14352,'WinZip(R) Self',14) then goto THE_END;
  1452.   If CheckZIPSignAtPos(15720,'WinZip Self',11) then goto THE_END;
  1453.   If CheckZIPSignAtPos(15750,'WinZip Self',11) then goto THE_END;
  1454.   If CheckZIPSignAtPos(15888,'WinZip(R) Self',14) then goto THE_END;
  1455.   If CheckZIPSignAtPos(16058,'WinZip',6) then goto THE_END;
  1456.   If CheckZIPSignAtPos(16112,'WinZip Self',11) then goto THE_END;
  1457.   If CheckZIPSignAtPos(16114,'WinZip Self',11) then goto THE_END;
  1458.   If CheckZIPSignAtPos(17424,'WinZip',6) then goto THE_END;
  1459.   If CheckZIPSignAtPos(17688,'GWinZip',7) then goto THE_END;
  1460.   If CheckZIPSignAtPos(20080,'WinZip Self',11) then goto THE_END;
  1461.   If CheckZIPSignAtPos(21008,'WinZip(R) Self',14) then goto THE_END;
  1462.   If CheckZIPSignAtPos(30302,'PK'#3#4,4) then goto THE_END;
  1463.   If CheckZIPSignAtPos(30867,'PK'#3#4,4) then goto THE_END;
  1464.   If CheckZIPSignAtPos(38483,'PK'#3#4,4) then goto THE_END;
  1465.   If CheckZIPSignAtPos(51200,'PK'#3#4,4) then goto THE_END;
  1466.   If CheckZIPSignAtPos(84992,'PK'#3#4,4) then goto THE_END;
  1467.   If CheckZIPSignAtPos(86016,'PK'#3#4,4) then goto THE_END;
  1468.   If CheckZIPSignAtPos(93747,'PK'#3#4,4) then goto THE_END;
  1469.   If CheckZIPSignAtPos(94771,'PK'#3#4,4) then goto THE_END;
  1470.   If CheckZIPSignAtPos(96832,'PK'#3#4,4) then goto THE_END;
  1471.   If CheckZIPSignAtPos(123276,'PK'#3#4,4) then goto THE_END;
  1472.   If CheckZIPSignAtPos(132096,'PK'#3#4,4) then goto THE_END;
  1473.   If CheckZIPSignAtPos(151704,'PK'#3#4,4) then goto THE_END;
  1474.   If CheckZIPSignAtPos(154466,'PK'#3#4,4) then goto THE_END;
  1475.   If CheckZIPSignAtPos(161584,'PK'#3#4,4) then goto THE_END;
  1476.   If CheckZIPSignAtPos(162816,'PK'#3#4,4) then goto THE_END;
  1477.   If CheckZIPSignAtPos(Size-34,'Windows Self-Installing Executable',34) then goto THE_END;
  1478.  
  1479.   Close(f);
  1480.   Exit;
  1481.  
  1482. THE_END:
  1483.  
  1484.  Close(f);
  1485.  PKWinOS2SfxPacked:=true;
  1486.  { FileMode := FMode; }
  1487.  END;
  1488.  
  1489. (* Ist die Datei im "Package for the Web"-Format?
  1490.    Is the file in "Package for the Web" format? *)
  1491.  
  1492. FUNCTION PfWPacked(ArcName: PathStr): Boolean;
  1493.  VAR f: File;
  1494.     s: String[4];
  1495.     Size: LongInt;
  1496.     { FMode: Byte; }
  1497.  BEGIN
  1498.  PfWPacked := false;
  1499.  s := '';
  1500.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1501.  {$IFDEF LONGNAME}
  1502.  ArcName := Strip('B','"',ArcName);
  1503.  {$ENDIF}
  1504.  Assign(f,ArcName);
  1505.  Reset(f,1);
  1506.  Size := FileSize(f);
  1507.  If Size>=Length(s) then
  1508.   BEGIN
  1509.    Seek(f,140546);
  1510.    BlockRead(f,s[1],4);
  1511.    s[0] := #4;
  1512.    PfWPacked := s='MSCF';
  1513.   END;
  1514.  Close(f);
  1515.  { FileMode := FMode; }
  1516.  END;
  1517.  
  1518. (* Ist die Datei mit LZEXE gepackt?
  1519.   Is the file LZEXE-packed? *)
  1520.  
  1521.  FUNCTION LZExed(ArcName: PathStr): Boolean;
  1522.  CONST BufSize=30;
  1523.  VAR   b: Array[0..BufSize] of Byte;
  1524.        f: File;
  1525.        x {, FMode }: Byte;
  1526.  BEGIN
  1527.   LZExed := false;
  1528.   If FSize(ArcName)>330 then
  1529.    BEGIN
  1530.     If Exist(ArcName) then
  1531.      BEGIN
  1532.       { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1533.       {$IFDEF LONGNAME}
  1534.       ArcName := Strip('B','"',ArcName);
  1535.       {$ENDIF}
  1536.       Assign(f,ArcName);
  1537.       Reset(f,1);
  1538.       BlockRead(f,b,BufSize);
  1539.       Close(f);
  1540.       { FileMode := FMode; }
  1541.       x := b[28]; (* Nach String 'LZ' an Offset 28 suchen *)
  1542.       If x=76 then
  1543.        BEGIN
  1544.         x := b[29]; (* Char 28=L?; dann weiter *)
  1545.         LZExed := x=90;
  1546.        END;
  1547.      END;
  1548.    END;
  1549.  END;
  1550.  
  1551. (* Ist die Datei mit PKLite gepackt?
  1552.   Is the file PKLite-packed? *)
  1553.  
  1554.  FUNCTION PKExed(ArcName: PathStr): Boolean;
  1555.  CONST BufSize=48;
  1556.  VAR   b: Array[0..BufSize] of Byte;
  1557.        f: File;
  1558.        x {, FMode}: Byte;
  1559.  BEGIN
  1560.   PKExed := false;
  1561.   If FSize(ArcName)>330 then
  1562.    BEGIN
  1563.     If Exist(ArcName) then
  1564.      BEGIN
  1565.       { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1566.       {$IFDEF LONGNAME}
  1567.       ArcName := Strip('B','"',ArcName);
  1568.       {$ENDIF}
  1569.       Assign(f,ArcName);
  1570.       Reset(f,1);
  1571.       BlockRead(f,b,BufSize);
  1572.       Close(f);
  1573.       { FileMode := FMode; }
  1574.       x := b[30]; (* Nach String 'PK' an Offset 30 suchen *)
  1575.       If x=80 then
  1576.        BEGIN
  1577.         x := b[31]; (* Char 30=P?; dann weiter *)
  1578.         If x=75 then
  1579.          BEGIN
  1580.           PKExed := true;
  1581.           Exit;
  1582.          END;
  1583.        END;
  1584.       x := b[46]; (* Nach String 'PK' an Offset 46 suchen *)
  1585.       If x=80 then
  1586.        BEGIN
  1587.         x := b[47]; (* Char 46=P?; dann weiter *)
  1588.         PKExed := x=75;
  1589.        END;
  1590.      END;
  1591.    END;
  1592.  END;
  1593.  
  1594. (* Ist die Datei mit Diet gepackt?
  1595.   Is the file Diet-packed? *)
  1596.  
  1597.  FUNCTION Dieted(ArcName: PathStr): Boolean;
  1598.  CONST BufSize=$6F;
  1599.  VAR   b: Array[0..BufSize] of Byte;
  1600.        f: File;
  1601.        x1,x2{ ,FMode }: Byte;
  1602.        dlz: String[3];
  1603.  BEGIN
  1604.   Dieted := false;
  1605.   If FSize(ArcName)>330 then
  1606.    BEGIN
  1607.     If Exist(ArcName) then
  1608.      BEGIN
  1609.       { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1610.       {$IFDEF LONGNAME}
  1611.       ArcName := Strip('B','"',ArcName);
  1612.       {$ENDIF}
  1613.       Assign(f,ArcName);
  1614.       Reset(f,1);
  1615.       BlockRead(f,b,BufSize);
  1616.       Close(f);
  1617.       { FileMode := FMode; }
  1618.       dlz := '';
  1619.       x1 := b[0];
  1620.       x2 := b[1];
  1621.       System.Move(b[$23],dlz[1],3); (* Nach String 'dlz' an Offset 23h suchen *)
  1622.       dlz[0] := #3;
  1623.       If (dlz='dlz') and (x1=$B) and (x2=$E) then
  1624.        BEGIN
  1625.         Dieted := true;
  1626.         Exit;
  1627.        END;
  1628.       dlz := '';
  1629.       System.Move(b[$41],dlz[1],3); (* Nach String 'dlz' an Offset 41h suchen *)
  1630.       dlz[0] := #3;
  1631.       If (dlz='dlz') and (x1=$F9) and (x2=$9C) then
  1632.        BEGIN
  1633.         Dieted := true;
  1634.         Exit;
  1635.        END;
  1636.       dlz := '';
  1637.       x1 := b[$12];
  1638.       x2 := b[$13];
  1639.       System.Move(b[$57],dlz[1],3); (* Nach String 'dlz' an Offset 57h suchen *)
  1640.       dlz[0] := #3;
  1641.       If (dlz='dlz') and (x1=$9D) and (x2=$89) then
  1642.        BEGIN
  1643.         Dieted := true;
  1644.         Exit;
  1645.        END;
  1646.       dlz := '';
  1647.       x1 := b[0];
  1648.       x2 := b[1];
  1649.       System.Move(b[$57],dlz[1],3); (* Nach String 'dlz' an Offset 57h suchen *)
  1650.       dlz[0] := #3;
  1651.       If (dlz='dlz') and (x1=$9D) and (x2=$89) then
  1652.        BEGIN
  1653.         Dieted := true;
  1654.         Exit;
  1655.        END;
  1656.       dlz := '';
  1657.       x1 := b[$12];
  1658.       x2 := b[$13];
  1659.       System.Move(b[$6B],dlz[1],3); (* Nach String 'dlz' an Offset 6Bh suchen *)
  1660.       dlz[0] := #3;
  1661.       If (dlz='dlz') and (x1=$9D) and (x2=$89) then
  1662.        BEGIN
  1663.         Dieted := true;
  1664.         Exit;
  1665.        END;
  1666.       dlz := '';
  1667.       System.Move(b[$6C],dlz[1],3); (* Nach String 'dlz' an Offset 6Ch suchen *)
  1668.       dlz[0] := #3;
  1669.       Dieted := (dlz='dlz') and (x1=$9D) and (x2=$89);
  1670.      END;
  1671.    END;
  1672.  END;
  1673.  
  1674. (* Ist die Datei mit TinyProg gepackt?
  1675.   Is the file TinyProg-packed? *)
  1676.  
  1677.  FUNCTION TPExed(ArcName: PathStr): Boolean;
  1678.  CONST BufSize=30;
  1679.  VAR   b: Array[0..BufSize] of Byte;
  1680.        f: File;
  1681.        x {, FMode}: Byte;
  1682.  BEGIN
  1683.   TPExed := false;
  1684.   If FSize(ArcName)>330 then
  1685.    BEGIN
  1686.     If Exist(ArcName) then
  1687.      BEGIN
  1688.       { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1689.       {$IFDEF LONGNAME}
  1690.       ArcName := Strip('B','"',ArcName);
  1691.       {$ENDIF}
  1692.       Assign(f,ArcName);
  1693.       Reset(f,1);
  1694.       BlockRead(f,b,BufSize);
  1695.       Close(f);
  1696.       { FileMode := FMode; }
  1697.       x := b[28]; (* Nach String 'tz' an Offset 28 suchen *)
  1698.       If x=116 then
  1699.        BEGIN
  1700.         x := b[29]; (* Char 28=t?; dann weiter *)
  1701.         TPExed := x=122;
  1702.        END;
  1703.      END;
  1704.    END;
  1705.  END;
  1706.  
  1707. FUNCTION EXEPacked(ArcName: PathStr): Boolean;
  1708.  BEGIN
  1709.  EXEPacked := LZExed(ArcName) or PKExed(ArcName) or Dieted(ArcName) or TPExed(ArcName);
  1710.  END;
  1711.  
  1712. FUNCTION WWPackPacked(ArcName: PathStr): Boolean;
  1713.  VAR f: File;
  1714.     s: String[31];
  1715.     Size: LongInt;
  1716.     { FMode: Byte; }
  1717.  BEGIN
  1718.  WWPackPacked := false;
  1719.  s := '';
  1720.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1721.  {$IFDEF LONGNAME}
  1722.  ArcName := Strip('B','"',ArcName);
  1723.  {$ENDIF}
  1724.  Assign(f,ArcName);
  1725.  Reset(f,1);
  1726.  Size := FileSize(f);
  1727.  If Size>=Length(s) then
  1728.   BEGIN
  1729.    BlockRead(f,s[1],SizeOf(s)-1);
  1730.    s[0] := #31;
  1731.    WWPackPacked := (Pos('WWP',s)=29);
  1732.   END;
  1733.  Close(f);
  1734.  { FileMode := FMode; }
  1735.  END;
  1736.  
  1737. FUNCTION ARXSfxPacked(ArcName: PathStr): Boolean;
  1738.  VAR f: File;
  1739.     s: String[41];
  1740.     Size: LongInt;
  1741.     { FMode: Byte; }
  1742.  BEGIN
  1743.  ARXSfxPacked := false;
  1744.  s := '';
  1745.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1746.  {$IFDEF LONGNAME}
  1747.  ArcName := Strip('B','"',ArcName);
  1748.  {$ENDIF}
  1749.  Assign(f,ArcName);
  1750.  Reset(f,1);
  1751.  Size := FileSize(f);
  1752.  If Size>=Length(s) then
  1753.   BEGIN
  1754.    BlockRead(f,s[1],SizeOf(s)-1);
  1755.    s[0] := #41;
  1756.    ARXSfxPacked := (Pos('$ARX',s)=6) or (Pos('$ARX',s)=38);
  1757.   END;
  1758.  Close(f);
  1759.  { FileMode := FMode; }
  1760.  END;
  1761.  
  1762. FUNCTION LHArcSfxPacked(ArcName: PathStr): Boolean;
  1763.  VAR f: File;
  1764.     s: String[49];
  1765.     Size: LongInt;
  1766.     { FMode: Byte; }
  1767.  BEGIN
  1768.  LHArcSfxPacked := false;
  1769.  s := '';
  1770.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1771.  {$IFDEF LONGNAME}
  1772.  ArcName := Strip('B','"',ArcName);
  1773.  {$ENDIF}
  1774.  Assign(f,ArcName);
  1775.  Reset(f,1);
  1776.  Size := FileSize(f);
  1777.  If Size>=Length(s) then
  1778.   BEGIN
  1779.    BlockRead(f,s[1],SizeOf(s)-1);
  1780.    s[0] := #49;
  1781.    LHarcSfxPacked := (Pos('LHarc''s SFX',s)=7) or (Pos('LHarc''s SFX',s)=39);
  1782.   END;
  1783.  Close(f);
  1784.  { FileMode := FMode; }
  1785.  END;
  1786.  
  1787. FUNCTION LZSSfxPacked(ArcName: PathStr): Boolean;
  1788.  VAR f: File;
  1789.     s: String[43];
  1790.     Size: LongInt;
  1791.     { FMode: Byte; }
  1792.  BEGIN
  1793.  LZSSfxPacked := false;
  1794.  s := '';
  1795.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1796.  {$IFDEF LONGNAME}
  1797.  ArcName := Strip('B','"',ArcName);
  1798.  {$ENDIF}
  1799.  Assign(f,ArcName);
  1800.  Reset(f,1);
  1801.  Size := FileSize(f);
  1802.  If Size>=Length(s) then
  1803.   BEGIN
  1804.    BlockRead(f,s[1],SizeOf(s)-1);
  1805.    s[0] := #43;
  1806.    LZSSfxPacked := (Pos('SFX by LARC',s)=33);
  1807.   END;
  1808.  Close(f);
  1809.  { FileMode := FMode; }
  1810.  END;
  1811.  
  1812. FUNCTION CompackSfxPacked(ArcName: PathStr): Boolean;
  1813.  VAR f: File;
  1814.     s: String[11];
  1815.     Size: LongInt;
  1816.     { FMode: Byte; }
  1817.  BEGIN
  1818.  CompackSfxPacked := false;
  1819.  s := '';
  1820.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1821.  {$IFDEF LONGNAME}
  1822.  ArcName := Strip('B','"',ArcName);
  1823.  {$ENDIF}
  1824.  Assign(f,ArcName);
  1825.  Reset(f,1);
  1826.  Size := FileSize(f);
  1827.  If Size>=Length(s) then
  1828.   BEGIN
  1829.    Seek(f,100);
  1830.    BlockRead(f,s[1],SizeOf(s)-1);
  1831.    s[0] := #11;
  1832.    CompackSfxPacked := (Pos('Collis'#0#0'SFX',s)=1);
  1833.   END;
  1834.  Close(f);
  1835.  { FileMode := FMode; }
  1836.  END;
  1837.  
  1838. (* Ist die Datei ein Windows-InstallShield-Sfx?
  1839.   Is the file a Windows InstallShield sfx? *)
  1840.  
  1841. FUNCTION InstallShieldPacked(ArcName: PathStr): Boolean;
  1842.  VAR f: File;
  1843.     s: String[18];
  1844.     Size: LongInt;
  1845.     { FMode: Byte; }
  1846.  BEGIN
  1847.  InstallShieldPacked := false;
  1848.  If IsEXE(ArcName) then
  1849.   BEGIN
  1850.    s := '';
  1851.    { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1852.    {$IFDEF LONGNAME}
  1853.    ArcName := Strip('B','"',ArcName);
  1854.    {$ENDIF}
  1855.    Assign(f,ArcName);
  1856.    Reset(f,1);
  1857.    Size := FileSize(f);
  1858.    If Size>=Length(s) then
  1859.    If Size>=Length(s)+$3AF then
  1860.     BEGIN
  1861.      Seek(f,$3AF);
  1862.      BlockRead(f,s[1],SizeOf(s)-1);
  1863.      s[0] := #18;
  1864.      InstallShieldPacked := s='InstallShield Self';
  1865.     END;
  1866.    Close(f);
  1867.    { FileMode := FMode; }
  1868.   END;
  1869.  END;
  1870.  
  1871. FUNCTION ID_at_end(ArcName: PathStr; ID: Byte): Boolean;
  1872.  VAR f: File of Byte;
  1873.     s: String[5];
  1874.     c,i {,FMode}: Byte;
  1875.     Size: LongInt;
  1876.  BEGIN
  1877.  ID_at_end := false;
  1878.  s := '';
  1879.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  1880.  {$IFDEF LONGNAME}
  1881.  ArcName := Strip('B','"',ArcName);
  1882.  {$ENDIF}
  1883.  Assign(f,ArcName);
  1884.  Reset(f);
  1885.  Size := FileSize(f);
  1886.  If Size>=Length(s) then
  1887.   BEGIN
  1888.    Seek(f,FileSize(f)-5);
  1889.    For i := 1 to 5 do
  1890.     BEGIN
  1891.      Read(f,c);
  1892.      s[i] := Char(c);
  1893.     END;
  1894.    s[0] := #5;
  1895.    If ID=ARJType then ID_at_end := Copy(s,2,4)=#$60#$EA#0#0 ELSE
  1896.    If ID=DWCType then ID_at_end := Copy(s,3,3)='DWC' ELSE
  1897.    If ID=ZARType then ID_at_end := Copy(s,3,2)='PT' ELSE
  1898.    If ID=ARGType then ID_at_end := Copy(s,5,1)=#1 ELSE
  1899.    If ID=PC3Type then ID_at_end := Copy(s,4,2)=#$E0#$E0 ELSE
  1900.    If ID=IiType  then ID_at_end := Copy(s,1,5)='xxx32' ELSE
  1901.    If (ID=XDIType) or (ID=XpdType) then ID_at_end := Copy(s,4,2)='jm' ELSE
  1902.    If ID=RKType  then ID_at_end := ((s[1]=#129) and (Copy(s,4,2)='RK')) ELSE
  1903.    If ID=PAKType then ID_at_end := Copy(s,4,1)=#$FE ELSE
  1904.    If ID=RKVType then if (((Copy(s,3,2)=#0#0) and (s[5] in [#$30..#$7A]))) or
  1905.                            (Copy(s,4,2)='RK') then ID_at_end := true;
  1906.   END;
  1907.  Close(f);
  1908.  { FileMode := FMode; }
  1909.  END;
  1910.  
  1911. (* Ist die Datei ein RAR-DOS-, Win- oder OS/2-Sfx?
  1912.    Is the file a RAR DOS, Win or OS/2 sfx?
  1913.  
  1914.    Funktion optimiert von Snow Panther, danke!
  1915.    Function optimized by Snow Panther, thanks! *)
  1916.  
  1917. FUNCTION RARSfxPacked(ArcName: PathStr): Boolean;
  1918.  Label THE_END;
  1919.  VAR f: File;
  1920.     s: String[32];
  1921.     Size: LongInt;
  1922.     { FMode: Byte; }
  1923.  
  1924.   FUNCTION CheckSignAtPos(fpos:Longint):Boolean;
  1925.    BEGIN
  1926.     CheckSignAtPos:=false;
  1927.     If fpos<=size then
  1928.      BEGIN
  1929.       Seek(f,fpos);
  1930.       BlockRead(f,s[1],4);
  1931.       s[0]:=#4;
  1932.       If s='Rar!'then CheckSignAtPos:=true;
  1933.      END;
  1934.    END;
  1935.  
  1936.  BEGIN
  1937.   RARSfxPacked := false;
  1938.   s := '';
  1939.   { FMode := FileMode; FileMode := 0 OR 1 SH6; }
  1940.   {$IFDEF LONGNAME}
  1941.   ArcName := Strip('B','"',ArcName);
  1942.   {$ENDIF}
  1943.   Assign(f,ArcName);
  1944.   Reset(f,1);
  1945.   Size := FileSize(f);
  1946.   If size>=32 then
  1947.     BEGIN
  1948.     BlockRead(f,s[1],32);
  1949.     s[0] := #32;
  1950.     If Pos('RSFX',s)=29 then goto THE_END;
  1951.     end;
  1952.   If CheckSignAtPos(12960) then goto THE_END;
  1953.   If CheckSignAtPos(13312) then goto THE_END;
  1954.   If CheckSignAtPos(13824) then goto THE_END;
  1955.   If CheckSignAtPos(17678) then goto THE_END;
  1956.   If CheckSignAtPos(17721) then goto THE_END;
  1957.   If CheckSignAtPos(17952) then goto THE_END;
  1958.   If CheckSignAtPos(18274) then goto THE_END;
  1959.   If CheckSignAtPos(23040) then goto THE_END;
  1960.   If CheckSignAtPos(24074) then goto THE_END;
  1961.   If CheckSignAtPos(24132) then goto THE_END;
  1962.   If CheckSignAtPos(24788) then goto THE_END;
  1963.   If CheckSignAtPos(25044) then goto THE_END;
  1964.   If CheckSignAtPos(28160) then goto THE_END;
  1965.   If CheckSignAtPos(36864) then goto THE_END;
  1966.   If CheckSignAtPos(40456) then goto THE_END;
  1967.   If CheckSignAtPos(46080) then goto THE_END;
  1968.   If CheckSignAtPos(49355) then goto THE_END;
  1969.   If CheckSignAtPos(49576) then goto THE_END;
  1970.   If CheckSignAtPos(49664) then goto THE_END;
  1971.   If CheckSignAtPos(50176) then goto THE_END;
  1972.   If CheckSignAtPos(54784) then goto THE_END;
  1973.   If CheckSignAtPos(55808) then goto THE_END;
  1974.   If CheckSignAtPos(58773) then goto THE_END;
  1975.   If CheckSignAtPos(61440) then goto THE_END;
  1976.   If CheckSignAtPos(64000) then goto THE_END;
  1977.   If CheckSignAtPos(66560) then goto THE_END;
  1978.   If CheckSignAtPos(69120) then goto THE_END;
  1979.   If CheckSignAtPos(69632) then goto THE_END;
  1980.   If CheckSignAtPos(71168) then goto THE_END;
  1981.   If CheckSignAtPos(71680) then goto THE_END;
  1982.   If CheckSignAtPos(57856) then goto THE_END;
  1983.   If CheckSignAtPos(13905) then goto THE_END;
  1984.  
  1985.   Close(f);
  1986.   Exit;
  1987.  
  1988. THE_END:
  1989.  
  1990.  Close(f);
  1991.  RARSfxPacked := true;
  1992.  { FileMode := FMode; }
  1993.  END;
  1994.  
  1995. (* Ist die Datei ein ZZip-Sfx?
  1996.    Is the file a ZZip sfx?
  1997.  
  1998.    Funktion optimiert von Snow Panther, danke!
  1999.    Function optimized by Snow Panther, thanks! *)
  2000.  
  2001. FUNCTION ZZipSfxPacked(ArcName: PathStr): Boolean;
  2002.  Label THE_END;
  2003.  VAR f     : File;
  2004.      Size  : LongInt;
  2005.      s     : String[3];
  2006.    { FMode : Byte; }
  2007.  
  2008.   FUNCTION CheckSignAtPos(fpos:Longint):Boolean;
  2009.    BEGIN
  2010.     CheckSignAtPos:=false;
  2011.     If fpos<=size then
  2012.      BEGIN
  2013.       Seek(f,fpos);
  2014.       BlockRead(f,s[1],3);
  2015.       s[0]:=#3;
  2016.       If s='ZZ0'then CheckSignAtPos:=true;
  2017.      END;
  2018.    END;
  2019.  
  2020. BEGIN
  2021.  ZZipSfxPacked := false;
  2022.  s := '';
  2023.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  2024.  {$IFDEF LONGNAME}
  2025.  ArcName := Strip('B','"',ArcName);
  2026.  {$ENDIF}
  2027.  Assign(f,ArcName);
  2028.  Reset(f,1);
  2029.  Size := FileSize(f)-5; {5 = length}
  2030.  If CheckSignAtPos(19968) then goto THE_END;
  2031.  Close(f);
  2032.  Exit;
  2033.  
  2034. THE_END:
  2035.  
  2036.  ZZipSfxPacked:=true;
  2037.  Close(f);
  2038.  { FileMode := FMode; }
  2039. END;
  2040.  
  2041.  
  2042. FUNCTION PakDDPacked(ArcName: PathStr): Boolean;
  2043.  VAR f: File of Word;
  2044.     Size: LongInt;
  2045.     w1,w2,w3,w4: Word;
  2046.     w: LongInt;
  2047.     { FMode: Byte; }
  2048.  BEGIN
  2049.  PakDDPacked := false;
  2050.  {$IFDEF LONGNAME}
  2051.  ArcName := Strip('B','"',ArcName);
  2052.  {$ENDIF}
  2053.  Assign(f,ArcName);
  2054.  Reset(f);
  2055.  Size := FileSize(f);
  2056.  If Size>=8 then
  2057.   BEGIN
  2058.    Read(f,w1);
  2059.    Read(f,w2);
  2060.    Read(f,w3);
  2061.    Read(f,w4);
  2062.    w := w1+w2+w3+w4;
  2063.    PakDDPacked := w=$AAAA;
  2064.   END;
  2065.  Close(f);
  2066.  { FileMode := FMode; }
  2067.  END;
  2068.  
  2069. FUNCTION ArcMethod(ArcName: PathStr): Byte;
  2070.  CONST PAKId=$0A;
  2071.       HYPId=$48;
  2072.       ARPId=$14;
  2073.       ARCId=$1A;
  2074.  VAR ArcHeader : Record
  2075.                  Marker: Byte;
  2076.                  Method: Byte;
  2077.                  Name  : Array[1..13] of Char;
  2078.                  Size  : LongInt;
  2079.                  Stamp : LongInt;
  2080.                  CRC   : Word;
  2081.                  Length: LongInt;
  2082.                 END;
  2083.     NotOK,IsEx: Boolean;
  2084.     f         : File;
  2085.     ArcTyp,
  2086.     { FMode     : Byte; }
  2087.     ExeLen    : LongInt;
  2088.  BEGIN
  2089.  If IsExe(ArcName) then
  2090.   BEGIN
  2091.    IsEx := true;
  2092.    ExeLen := ExeSize(ArcName);
  2093.   END ELSE IsEx := false;
  2094.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  2095.  {$IFDEF LONGNAME}
  2096.  ArcName := Strip('B','"',ArcName);
  2097.  {$ENDIF}
  2098.  Assign(f,ArcName);
  2099.  Reset(f,1);
  2100.  NotOK := false;
  2101.  ArcTyp := Invalid;
  2102.  If IsEx then Seek(f,ExeLen);
  2103.  Repeat
  2104.   Blockread(f,ArcHeader,SizeOf(ArcHeader));
  2105.   If (IOResult=0) or (IOResult=100) then
  2106.    BEGIN
  2107.     If ArcHeader.Marker=ARCId then
  2108.      BEGIN
  2109.       ArcTyp := ARCType;
  2110.       If ArcHeader.Method>=PAKid then
  2111.        BEGIN
  2112.         NotOK:=true;
  2113.         If (ArcHeader.Name[11]=#$14) and (ArcHeader.Name[12]=#$15) and
  2114.            (ArcHeader.Name[13]=#$13) or (ID_at_End(ArcName,PakType)) then ArcTyp := PAKType;
  2115.         If ArcHeader.Method >= HYPid then
  2116.         ArcTyp := HYPType ELSE
  2117.         If ArcHeader.Method=ARPid then ArcTyp := ARCPlusType;
  2118.        END;
  2119.      END ELSE NotOK := true;
  2120.    END ELSE NotOK := true;
  2121.   Until NotOK;
  2122.  Close(f);
  2123.  { FileMode := FMode; }
  2124.  ArcMethod := ArcTyp;
  2125.  END;
  2126.  
  2127. FUNCTION OpenArchive(ArcName: PathStr): Boolean;
  2128.  CONST MinSize=20;
  2129.  VAR f: File;
  2130.     IO: Word;
  2131.     { FMode, }BufLen: Byte;
  2132.     Offset,ExeLen,Size: LongInt;
  2133.  BEGIN
  2134.  { FMode := FileMode; FileMode := 0 OR 1 SHL 6; }
  2135.  {$IFDEF LONGNAME}
  2136.  ArcName := Strip('B','"',ArcName);
  2137.  {$ENDIF}
  2138.  Assign(f,ArcName); Reset(f,1);
  2139.  Size := FileSize(f);
  2140.  Close(f);
  2141.  OpenArchive := false;
  2142.  If Size>=MinSize then
  2143.  BEGIN
  2144.   Offset := 0; ExeLen := 0;
  2145.   If IsExe(ArcName) then
  2146.    BEGIN
  2147.     IsEx := true;
  2148.     ExeLen := ExeSize(ArcName);
  2149.     Inc(Offset,ExeLen);
  2150.    END ELSE IsEx := false;
  2151.   If ExeLen=Size then
  2152.    BEGIN
  2153.     IDStr := '';
  2154.     OpenArchive := true;
  2155.     Exit;
  2156.    END;
  2157.   Assign(f,ArcName);
  2158.   Reset(f,1);
  2159.   BufLen := SizeOf(IDStr)-1;
  2160.   If Size<BufLen then Buflen := Size;
  2161.   IO := IOResult;
  2162.   If Size>=MinSize then
  2163.    If (IO=0) or (IO=100) then
  2164.     BEGIN
  2165.      If (Offset<>0) and (Offset>=ExeLen) then Seek(f,Offset);
  2166.      Blockread(f,IDStr[1],BufLen);
  2167.      IDStr[0] := Char(BufLen);
  2168.      Close(f);
  2169.      OpenArchive := true;
  2170.     END;
  2171.   { FileMode := FMode; }
  2172.  END;
  2173.  END;
  2174.  
  2175. FUNCTION ArchiveType(ArcName: PathStr): Byte;
  2176.  VAR o,p,q,r: Byte;
  2177.     w1,w2,w3,w4: Word;
  2178.     w: LongInt;
  2179.  BEGIN
  2180.  ArchiveType := Invalid;
  2181.  If not Exist(ArcName) then ArchiveType := FileNotFound ELSE
  2182.   BEGIN
  2183.    If not OpenArchive(ArcName) then Exit ELSE
  2184.     BEGIN
  2185.      p := Pos('CRUSH$',IDStr); q := Pos('.CRU',IDStr); r := Pos('.cru',IDStr); o := Pos('CRUSH',IDStr);
  2186.      If (p=35) or (q in [24..39]) or (r in [24..31,82..89]) or (o=1) then
  2187.       BEGIN
  2188.        CrushPacked := true;
  2189.        If o=1 then ArchiveType := CruType ELSE
  2190.        If Pos('PK'#3#4,IDStr)=1 then ArchiveType := CruPType ELSE
  2191.        If (Pos(#$60#$EA,IDStr)=1) or (Pos(#$60#$EA,IDStr)=3) or (Pos('.ARJ',IDStr)=41) then
  2192.         ArchiveType := CruJType ELSE
  2193.        If Pos('-lh',IDStr)=3 then ArchiveType := CruLType ELSE
  2194.        If Pos('ZOO',IDStr)=1 then ArchiveType := CruZType ELSE
  2195.        If Pos('HA',IDStr)=1 then ArchiveType := CruHType;
  2196.        Exit;
  2197.       END;
  2198.      If (Pos('PK'#3#4,IDStr)=1) or (Pos('PK00PK',IDStr)=1) then
  2199.       BEGIN
  2200.        ArchiveType := ZIPType;
  2201.        Exit;
  2202.       END ELSE If PKWinOS2SfxPacked(ArcName) then
  2203.       BEGIN
  2204.        ArchiveType := ZIPType;
  2205.        Exit;
  2206.       END;
  2207.      If (Pos(#31#139#8#8,IDStr)=1) or (Pos(#$1F#$9D#$90,IDStr)=1) then
  2208.       BEGIN
  2209.        ArchiveType := GZIPType;
  2210.        Exit;
  2211.       END;
  2212.      If (Pos(#$60#$EA,IDStr)=1) or (Pos(#$60#$EA,IDStr)=3) or
  2213.         ArjWinSfxPacked(ArcName) or ArjDOSSfxPacked(ArcName) or
  2214.         ID_at_end(Arcname,ARJType) then
  2215.       BEGIN
  2216.        ArchiveType := ARJType;
  2217.        mv := (VolumeFlag(IDStr[9],ARJType) or VolumeFlag(IDStr[11],ARJType));
  2218.        If Pos(#$60#$EA,IDStr)=1 then av := AVFlag(IDStr[9],ARJType) ELSE
  2219.        If (Pos(#$60#$EA,IDStr)=3) then av := AVFlag(IDStr[11],ARJType);
  2220.        If Pos('.SRJ',CapStr(ArcName))<>0 then ArchiveType := SARJType;
  2221.        Exit;
  2222.       END;
  2223.      If (Pos(#26'Jar'#27#0,IDStr)=15) then
  2224.       BEGIN
  2225.        ArchiveType := JRType;
  2226.        Exit;
  2227.       END;
  2228.      If (Pos('RE'#$7E#$5E,IDStr)=1) or (Pos('Rar',IDStr)=1) or
  2229.        RARSfxPacked(ArcName) then
  2230.       BEGIN
  2231.        ArchiveType := RARType;
  2232.        mv := VolumeFlag(IDStr[11],RARType);
  2233.        av := AVFlag(IDStr[11],RARType);
  2234.        Exit;
  2235.       END;
  2236.      If Pos('**ACE**',IDStr)=8 then
  2237.       BEGIN
  2238.        ArchiveType := AceType;
  2239.        mv := VolumeFlag(IDStr[7],ACEType);
  2240.        av := AVFlag(IDStr[7],ACEType);
  2241.        Exit;
  2242.       END;
  2243.      If AceSfxPacked(ArcName) then
  2244.       BEGIN
  2245.        ArchiveType := AceType;
  2246.        Exit;
  2247.       END;
  2248.      If Pos('HLSQZ',IDStr)=1 then
  2249.       BEGIN
  2250.        ArchiveType := SQZType;
  2251.        Exit;
  2252.       END;
  2253.      If Pos('SQWEZ',IDStr)=1 then
  2254.       BEGIN
  2255.        ArchiveType := SQWEZType;
  2256.        Exit;
  2257.       END;
  2258.      If Pos('HPAK',IDStr)=1 then
  2259.       BEGIN
  2260.        ArchiveType := HPKType;
  2261.        Exit;
  2262.       END;
  2263.      If Pos('æ3HF',IDStr)=1 then
  2264.       BEGIN
  2265.        ArchiveType := HAPType;
  2266.        Exit;
  2267.       END;
  2268.      If Pos(#$DC#$A7#$C4#$FD,IDStr)=21 then
  2269.       BEGIN
  2270.        ArchiveType := ZOOType;
  2271.        Exit;
  2272.       END;
  2273.      If Pos('HA',IDStr)=1 then
  2274.       BEGIN
  2275.        ArchiveType := HAType;
  2276.        Exit;
  2277.       END;
  2278.      If Pos('MDmd',IDStr)=1 then
  2279.       BEGIN
  2280.        ArchiveType := MDType;
  2281.        Exit;
  2282.       END;
  2283.      If (Pos('LM'#$1A#8#0,IDStr)=1) or (Pos('LM'#$1A#7#0,IDStr)=1) then
  2284.       BEGIN
  2285.        ArchiveType := LIMType;
  2286.        Exit;
  2287.       END;
  2288.      If Pos('LH5',IDStr)=4 then
  2289.       BEGIN
  2290.        ArchiveType := SARType;
  2291.        Exit;
  2292.       END;
  2293.      If Pos(#212#3'SB '#0,IDStr)=1 then
  2294.       BEGIN
  2295.        ArchiveType := BS2Type;
  2296.        Exit;
  2297.       END;
  2298.      If ((Pos('-ah',IDStr)=3) and (IDStr[7]='-')) then
  2299.       BEGIN
  2300.        ArchiveType := MARType;
  2301.        Exit;
  2302.       END;
  2303.      If ((Pos(#$80,IDStr)=2) or (Pos(#$81,IDStr)=2) or
  2304.          (Pos(#$82,IDStr)=2) or (Pos(#$83,IDStr)=2) or
  2305.          (Pos(#$84,IDStr)=2)) and
  2306.        (Pos(#0,IDStr)=4) then
  2307.       BEGIN
  2308.        ArchiveType := ACBType;
  2309.        Exit;
  2310.       END;
  2311.      If (Pos(#0#0#0,IDStr)=2) and (GetExt(CapStr(ArcName))='.CPZ') then
  2312.       BEGIN
  2313.        ArchiveType := CPZType;
  2314.        Exit;
  2315.       END;
  2316.      If Pos('JRchive',IDStr)=1 then
  2317.       BEGIN
  2318.        ArchiveType := JRCType;
  2319.        Exit;
  2320.       END;
  2321.      If Pos('JARCS',IDStr)=1 then
  2322.       BEGIN
  2323.        ArchiveType := JARType;
  2324.        Exit;
  2325.       END;
  2326.      If Pos('DS'#0,IDStr)=1 then
  2327.       BEGIN
  2328.        ArchiveType := QType;
  2329.        Exit;
  2330.       END;
  2331.      If Pos('PK'#3#6,IDStr)=1 then
  2332.       BEGIN
  2333.        ArchiveType := SOFType;
  2334.        Exit;
  2335.       END;
  2336.      If Pos('7'#04,IDStr)=1 then
  2337.       BEGIN
  2338.        ArchiveType := QARKType;
  2339.        Exit;
  2340.       END;
  2341.      If Pos('YC',IDStr)=15 then
  2342.       BEGIN
  2343.        ArchiveType := YACType;
  2344.        Exit;
  2345.       END;
  2346.      If (Pos('X1',IDStr)=1) or (Pos('XhDr',IDStr)=1) then
  2347.       BEGIN
  2348.        ArchiveType := X1Type;
  2349.        Exit;
  2350.       END;
  2351.      If ((Pos(#$76#$FF,IDStr)=1) or (Pos(#$76#$FF,IDStr)=5)) and
  2352.         ((IDStr[3] in [#$20..#$3F]) or (IDStr[7] in [#$20..#$3F])) and
  2353.         (Pos('.DQT',ArcName)=0) then
  2354.       BEGIN
  2355.        ArchiveType := CDCType;
  2356.        Exit;
  2357.       END;
  2358.      If Pos(#$AD'6"',IDStr)=1 then
  2359.       BEGIN
  2360.        ArchiveType := AMGType;
  2361.        Exit;
  2362.       END;
  2363.      If Pos('N⌡FΘlσ',IDStr)=1 then
  2364.       BEGIN
  2365.        ArchiveType := NLIType;
  2366.        Exit;
  2367.       END;
  2368.      If Pos('LEOLZW',IDStr)=1 then
  2369.       BEGIN
  2370.        ArchiveType := PLLType;
  2371.        Exit;
  2372.       END;
  2373.      If Pos(#$1F#$8B#$08,IDStr)=1 then
  2374.       BEGIN
  2375.        ArchiveType := TGZType;
  2376.        Exit;
  2377.       END;
  2378.      If Pos('SChF',IDStr)=1 then
  2379.       BEGIN
  2380.        ArchiveType := CHZType;
  2381.        Exit;
  2382.       END;
  2383.      If Pos('PSA',IDStr)=1 then
  2384.       BEGIN
  2385.        ArchiveType := PSAType;
  2386.        Exit;
  2387.       END;
  2388.      If Pos('DSIGDCC',IDStr)=1 then
  2389.       BEGIN
  2390.        ArchiveType := PACType;
  2391.        Exit;
  2392.       END;
  2393.      If Pos(#$1F#$9F#$4A#$10#$0A,IDStr)=1 then
  2394.       BEGIN
  2395.        ArchiveType := XFType;
  2396.        Exit;
  2397.       END;
  2398.      If Pos('¿MP¿',IDStr)=1 then
  2399.       BEGIN
  2400.        ArchiveType := KBOType;
  2401.        Exit;
  2402.       END;
  2403.      If Pos(#$76#$FF,IDStr)=1 then
  2404.       BEGIN
  2405.        ArchiveType := NSQType;  (* Muss _nach_ CdcType geprueft werden. *)
  2406.        Exit;                    (* Has to be tested _after_ CdcType.    *)
  2407.       END;
  2408.      If Pos('Dirk Paehl',IDStr)=1 then
  2409.       BEGIN
  2410.        ArchiveType := DPAType;
  2411.        Exit;
  2412.       END;
  2413.      If (not IsEXE(ArcName)) and (IDStr<>'') and (IDStr[1]=#0) and (IDStr[4]=#0) and (Copy(IDStr,2,2)=Copy(IDStr,5,2)) then
  2414.       BEGIN
  2415.        ArchiveType := BaType;
  2416.        Exit;
  2417.       END;
  2418.      If (Pos(#0#6,IDStr)=1) and (not ID_at_end(ArcName,ZARType)) then
  2419.       BEGIN
  2420.        ArchiveType := TTCType;
  2421.        Exit;
  2422.       END;
  2423.      If Pos('ESP',IDStr)=1 then
  2424.       BEGIN
  2425.        ArchiveType := ESPType;
  2426.        Exit;
  2427.       END;
  2428.      If Pos(#1'ZPK'#1,IDStr)=1 then
  2429.       BEGIN
  2430.        ArchiveType := ZPKType;
  2431.        Exit;
  2432.       END;
  2433.      If Pos(#$BC#$40,IDStr)=1 then
  2434.       BEGIN
  2435.        ArchiveType := SkyType;
  2436.        Exit;
  2437.       END;
  2438.      If Pos('UFA',IDStr)=1 then
  2439.       BEGIN
  2440.        ArchiveType := UfaType;
  2441.        Exit;
  2442.       END;
  2443.      If Pos('-H2O',IDStr)=1 then
  2444.       BEGIN
  2445.        ArchiveType := DRYType;
  2446.        Exit;
  2447.       END;
  2448.      If Pos('MSCF',IDStr)=1 then
  2449.       BEGIN
  2450.        ArchiveType := CABType;
  2451.        Exit;
  2452.       END;
  2453.      If Pos('FOXSQZ',IDStr)=1 then
  2454.       BEGIN
  2455.        ArchiveType := FSqzType;
  2456.        Exit;
  2457.       END;
  2458.      If Pos(',AR7',IDStr)=1 then
  2459.       BEGIN
  2460.        ArchiveType := AR7Type;
  2461.        Exit;
  2462.       END;
  2463.      If Pos('PPMZ',IDStr)=1 then
  2464.       BEGIN
  2465.        ArchiveType := PPMZType;
  2466.        Exit;
  2467.       END;
  2468.      If Pos(#$88#$F0#$27,IDStr)=5 then
  2469.       BEGIN
  2470.        ArchiveType := ExpType;
  2471.        Exit;
  2472.       END;
  2473.      If Pos('MP3'#$1A,IDStr)=1 then
  2474.       BEGIN
  2475.        ArchiveType := MP3Type;
  2476.        Exit;
  2477.       END;
  2478.      If Pos('OZ▌',IDStr)=1 then
  2479.       BEGIN
  2480.        ArchiveType := ZetType;
  2481.        Exit;
  2482.       END;
  2483.      If Pos(#$65#$5D#$13#$8C#$08#$01#$03#$00,IDStr)=1 then
  2484.       BEGIN
  2485.        ArchiveType := TSCType;
  2486.        Exit;
  2487.       END;
  2488.      If Pos('gW'#4#1,IDStr)=1 then
  2489.       BEGIN
  2490.        ArchiveType := ArqType;
  2491.        Exit;
  2492.       END;
  2493.      If Pos('OctSqu',IDStr)=4 then
  2494.       BEGIN
  2495.        ArchiveType := ArhType;
  2496.        Exit;
  2497.       END;
  2498.      If Pos(#5#1#1#0,IDStr)=1 then
  2499.       BEGIN
  2500.        ArchiveType := TerType;
  2501.        Exit;
  2502.       END;
  2503.      If Pos('SIT!',IDStr)=1 then
  2504.       BEGIN
  2505.        ArchiveType := SitType;
  2506.        Exit;
  2507.       END;
  2508.      If Pos(#$01#$08#$0B#$08#$EF#$00#$9E#$32#$30#$36#$31,IDStr)=1 then
  2509.       BEGIN
  2510.        ArchiveType := PucType;
  2511.        Exit;
  2512.       END;
  2513.      If Pos('UHA',IDStr)=1 then
  2514.       BEGIN
  2515.        ArchiveType := UHaType;
  2516.        Exit;
  2517.       END;
  2518.      If (Pos(#2'AB',IDStr)=1) or (Pos(#3'AB2',IDStr)=1) then
  2519.       BEGIN
  2520.        ArchiveType := AbcType;
  2521.        Exit;
  2522.       END;
  2523.      If Pos('CO'#0,IDStr)=1 then
  2524.       BEGIN
  2525.        ArchiveType := CmpType;
  2526.        Exit;
  2527.       END;
  2528.      If Pos('ëLZO',IDStr)=1 then
  2529.       BEGIN
  2530.        ArchiveType := LZOType;
  2531.        Exit;
  2532.       END;
  2533.      If Pos(#$93#$B9#$06,IDStr)=1 then
  2534.       BEGIN
  2535.        ArchiveType := SplType;
  2536.        Exit;
  2537.       END;
  2538.      If Pos(#$13#$5D#$65#$8C,IDStr)=1 then
  2539.       BEGIN
  2540.        ArchiveType := IShZType;
  2541.        Exit;
  2542.       END;
  2543.      If Pos('GTH',IDStr)=2 then
  2544.       BEGIN
  2545.        ArchiveType := GthType;
  2546.        Exit;
  2547.       END;
  2548.      If Pos('BOA',IDStr)=1 then
  2549.       BEGIN
  2550.        ArchiveType := BoaType;
  2551.        Exit;
  2552.       END;
  2553.      If Pos('ULEB'#$A,IDStr)=1 then
  2554.       BEGIN
  2555.        ArchiveType := RaxType;
  2556.        Exit;
  2557.       END;
  2558.      If Pos('ULEB'#0,IDStr)=1 then
  2559.       BEGIN
  2560.        ArchiveType := XTType;
  2561.        Exit;
  2562.       END;
  2563.      If (Pos('BZ',IDStr)=1) and (IDStr[3] in ['0'..'9']) and (IDStr[4] in ['0'..'9']) then
  2564.       BEGIN
  2565.        ArchiveType := BZipType;
  2566.        Exit;
  2567.       END;
  2568.      If (Pos('BZ',IDStr)=1) and (IDStr[3]='h') and (IDStr[4] in ['0'..'9']) then
  2569.       BEGIN
  2570.        ArchiveType := BZip2Type;
  2571.        Exit;
  2572.       END;
  2573.      If Pos('@Γ'#1#0,IDStr)=1 then
  2574.       BEGIN
  2575.        ArchiveType := PckType;
  2576.        Exit;
  2577.       END;
  2578.      If (IDStr[1] in [#$1A..#$1B]) and (Pos(#3'Descript',IDStr)=2) then
  2579.       BEGIN
  2580.        ArchiveType := BtsType;
  2581.        Exit;
  2582.       END;
  2583.      If Pos('Ora ',IDStr)=1 then
  2584.       BEGIN
  2585.        ArchiveType := EliType;
  2586.        Exit;
  2587.       END;
  2588.      If (Pos(#$1A'FC'#$1A,IDStr)=1) or (Pos(#$1A'QF'#$1A,IDStr)=1)  then
  2589.       BEGIN
  2590.        ArchiveType := QfcType;
  2591.        Exit;
  2592.       END;
  2593.      If Pos('RNC',IDStr)=1 then
  2594.       BEGIN
  2595.        ArchiveType := RncType;
  2596.        Exit;
  2597.       END;
  2598.      If Pos('777',IDStr)=1 then
  2599.       BEGIN
  2600.        ArchiveType := _777Type;
  2601.        Exit;
  2602.       END;
  2603.      If Pos('sTaC',IDStr)=1 then
  2604.       BEGIN
  2605.        ArchiveType := StacType;
  2606.        Exit;
  2607.       END;
  2608.      If Pos('HPA',IDStr)=1 then
  2609.       BEGIN
  2610.        ArchiveType := HpaType;
  2611.        Exit;
  2612.       END;
  2613.      If Pos('LG',IDStr)=1 then
  2614.       BEGIN
  2615.        ArchiveType := LgType;
  2616.        Exit;
  2617.       END;
  2618.      If Pos('0123456789012345BZh91AY&SY',IDStr)=1 then
  2619.       BEGIN
  2620.        ArchiveType := Exp1Type;
  2621.        Exit;
  2622.       END;
  2623.      If Pos('IMP'#$A,IDStr)=1 then
  2624.       BEGIN
  2625.        ArchiveType := ImpType;
  2626.        Exit;
  2627.       END;
  2628.      If Pos(#0#$9E#$6E#$72#$76#$FF,IDStr)=1 then
  2629.       BEGIN
  2630.        ArchiveType := NrvType;
  2631.        Exit;
  2632.       END;
  2633.      If PakDDPacked(ArcName) then
  2634.       BEGIN
  2635.        ArchiveType := PddType;
  2636.        Exit;
  2637.       END;
  2638.      If Pos(#$73#$B2#$90#$F4,IDStr)=1 then
  2639.       BEGIN
  2640.        ArchiveType := SqType;
  2641.        Exit;
  2642.       END;
  2643.      If (Pos('PHILIPP',IDStr)=1) or (Pos('PAR',IDStr)=1) then
  2644.       BEGIN
  2645.        ArchiveType := ParType;
  2646.        Exit;
  2647.       END;
  2648.      If Pos('UB',IDStr)=1 then
  2649.       BEGIN
  2650.        ArchiveType := HitType;
  2651.        Exit;
  2652.       END;
  2653.      If (Pos('SB',IDStr)=1) and (IDStr[3] in ['1'..'9']) then
  2654.       BEGIN
  2655.        ArchiveType := SbxType;
  2656.        Exit;
  2657.       END;
  2658.      If Pos('NSK',IDStr)=1 then
  2659.       BEGIN
  2660.        ArchiveType := NskType;
  2661.        Exit;
  2662.       END;
  2663.      If Pos('DST',IDStr)=1 then
  2664.       BEGIN
  2665.        ArchiveType := DstType;
  2666.        Exit;
  2667.       END;
  2668.      If Pos('ASD',IDStr)=1 then
  2669.       BEGIN
  2670.        ArchiveType := AsdType;
  2671.        Exit;
  2672.       END;
  2673.      If Pos('ISc(',IDStr)=1 then
  2674.       BEGIN
  2675.        ArchiveType := IscType;
  2676.        If Pos(#4,IDStr)=5 then NewIsc := false;
  2677.        Exit;
  2678.       END;
  2679.      If Pos('T4'#$1A,IDStr)=1 then
  2680.       BEGIN
  2681.        ArchiveType := T4Type;
  2682.        Exit;
  2683.       END;
  2684.      If (Pos(#$EB#$BE,IDStr)=1) or (Pos(#$BE#$EB,IDStr)=1) then
  2685.       BEGIN
  2686.        ArchiveType := BtmType;
  2687.        Exit;
  2688.       END;
  2689.      If Pos('BH'#5#7,IDStr)=1 then
  2690.       BEGIN
  2691.        ArchiveType := BhType;
  2692.        Exit;
  2693.       END;
  2694.      If Pos('BIX0',IDStr)=1 then
  2695.       BEGIN
  2696.        ArchiveType := BixType;
  2697.        Exit;
  2698.       END;
  2699.      If Pos('ChfLZ',IDStr)=4 then
  2700.       BEGIN
  2701.        ArchiveType := LzaType;
  2702.        Exit;
  2703.       END;
  2704.      If Pos('Blink',IDStr)=1 then
  2705.       BEGIN
  2706.        ArchiveType := BliType;
  2707.        Exit;
  2708.       END;
  2709.      If Pos(#$DA#$FA,IDStr)=1 then
  2710.       BEGIN
  2711.        ArchiveType := LgCType;
  2712.        Exit;
  2713.       END;
  2714.      If Pos('(C) STEPANYUK',IDStr)=2 then
  2715.       BEGIN
  2716.        ArchiveType := ArsType;
  2717.        Exit;
  2718.       END;
  2719.      If Pos('AKT32',IDStr)=1 then
  2720.       BEGIN
  2721.        ArchiveType := A32Type;
  2722.        Exit;
  2723.       END;
  2724.      If Pos('AKT',IDStr)=1 then
  2725.       BEGIN
  2726.        ArchiveType := AktType;
  2727.        Exit;
  2728.       END;
  2729.      If Pos('MSTSM',IDStr)=1 then
  2730.       BEGIN
  2731.        ArchiveType := NpaType;
  2732.        Exit;
  2733.       END;
  2734.      If Pos(#0#$50#0#$14,IDStr)=1 then
  2735.       BEGIN
  2736.        ArchiveType := PftType;
  2737.        Exit;
  2738.       END;
  2739.      If Pos('SEM',IDStr)=1 then
  2740.       BEGIN
  2741.        ArchiveType := SemType;
  2742.        Exit;
  2743.       END;
  2744.      If Pos('Å»¼ä',IDStr)=1 then
  2745.       BEGIN
  2746.        ArchiveType := PpmType;
  2747.        Exit;
  2748.       END;
  2749.      If Pos('FIZ',IDStr)=1 then
  2750.       BEGIN
  2751.        ArchiveType := FizType;
  2752.        Exit;
  2753.       END;
  2754.      If (Pos('MS',IDStr)=1) and (IDStr[3] in [#0..#15]) and (IDStr[4] in [#0..#9]) then
  2755.       BEGIN
  2756.        ArchiveType := XieType;
  2757.        Exit;
  2758.       END;
  2759.      If Pos(#$ED#$AB#$EE#$DB,IDStr)=1 then
  2760.       BEGIN
  2761.        ArchiveType := RpmType;
  2762.        Exit;
  2763.       END;
  2764.      If (Pos('yz0',IDStr)=1) and (IDStr[4] in ['1'..'9']) and (IDStr[5] in ['0'..'9']) then
  2765.       BEGIN
  2766.        ArchiveType := DfType;
  2767.        Exit;
  2768.       END;
  2769.      If (Pos('ZZ '#0#0,IDStr)=1) or (Pos('ZZ0',IDStr)=1) or ZZipSfxPacked(ArcName) then
  2770.       BEGIN
  2771.        ArchiveType := ZZType;
  2772.        Exit;
  2773.       END;
  2774.      If (Pos('<DC-',IDStr)=1) and (Pos('>',IDStr)=9) then
  2775.       BEGIN
  2776.        ArchiveType := DCType;
  2777.        Exit;
  2778.       END;
  2779.      If Pos(#4'TPAC'#3,IDStr)=1 then
  2780.       BEGIN
  2781.        ArchiveType := TpcType;
  2782.        Exit;
  2783.       END;
  2784.      If (Pos('Ai'#1#1#0,IDStr)=1) or (Pos('Ai'#1#0#0,IDStr)=1) then
  2785.       BEGIN
  2786.        ArchiveType := AiType;
  2787.        Exit;
  2788.       END;
  2789.      If (Pos('Ai'#2#0,IDStr)=1) or (Pos('Ai'#2#1,IDStr)=1) then
  2790.       BEGIN
  2791.        ArchiveType := Ai32Type;
  2792.        Exit;
  2793.       END;
  2794.      If Pos('SBC',IDStr)=1 then
  2795.       BEGIN
  2796.        ArchiveType := SbcType;
  2797.        Exit;
  2798.       END;
  2799.      If Pos('YBS',IDStr)=1 then
  2800.       BEGIN
  2801.        ArchiveType := YbsType;
  2802.        Exit;
  2803.       END;
  2804.      If Pos(#$9E#0#0,IDStr)=1 then
  2805.       BEGIN
  2806.        ArchiveType := DitType;
  2807.        Exit;
  2808.       END;
  2809.      If Pos('DMS!',IDStr)=1 then
  2810.       BEGIN
  2811.        ArchiveType := DmsType;
  2812.        Exit;
  2813.       END;
  2814.      If Pos(#$8F#$AF#$AC#$8C,IDStr)=1 then
  2815.       BEGIN
  2816.        ArchiveType := EpcType;
  2817.        Exit;
  2818.       END;
  2819.      If Pos('VS'#$1A,IDStr)=1 then
  2820.       BEGIN
  2821.        ArchiveType := VsaType;
  2822.        Exit;
  2823.       END;
  2824.      If Pos('PDZ',IDStr)=2 then
  2825.       BEGIN
  2826.        ArchiveType := PdzType;
  2827.        Exit;
  2828.       END;
  2829.      If PfWPacked(ArcName) then
  2830.       BEGIN
  2831.        ArchiveType := PfWType;
  2832.        Exit;
  2833.       END;
  2834.      If Pos('WIC',IDStr)=1 then
  2835.       BEGIN
  2836.        ArchiveType := WICType;  (* Achtung: Fake-Packer *)
  2837.        Exit;
  2838.       END;
  2839.      If Pos('OWS ',IDStr)=1 then
  2840.       BEGIN
  2841.        ArchiveType := OWSType;  (* Achtung: Fake-Packer *)
  2842.        Exit;
  2843.       END;
  2844.      If Pos('WWP',IDStr)=1 then
  2845.       BEGIN
  2846.        ArchiveType := WWDType;
  2847.        Exit;
  2848.       END;
  2849.      If Pos('GIF',IDStr)=1 then
  2850.       BEGIN
  2851.        ArchiveType := GIFType;
  2852.        Exit;
  2853.       END;
  2854.      If Pos('JFIF',IDStr)=7 then
  2855.       BEGIN
  2856.        ArchiveType := JFIFType;
  2857.        Exit;
  2858.       END;
  2859.      If Pos('hsi',IDStr)=1 then
  2860.       BEGIN
  2861.        ArchiveType := JHSIType;
  2862.        Exit;
  2863.       END;
  2864.      If Pos(#$81#$8A,IDStr)=1 then
  2865.       BEGIN
  2866.        ArchiveType := BMFType;
  2867.        Exit;
  2868.       END;
  2869.      p := Pos(#$FF'BSG',IDStr);
  2870.      If (p=1) or (p=2) or (p=4) or (Pos(#0#174#2,IDStr)=2) or
  2871.                                    (Pos(#0#174#3,IDStr)=2) or
  2872.                                    (Pos(#0#174#7,IDStr)=2) then
  2873.       BEGIN
  2874.        ArchiveType := BSNType;
  2875.        Exit;
  2876.       END;
  2877.      If ((Pos('-l',IDStr)=3) and (IDStr[7]='-')) or
  2878.         ((Pos('-l',IDStr)=4) and (IDStr[8]='-')) or
  2879.         ((Pos('-l',IDStr)=12) and (IDStr[16]='-')) or
  2880.         ((Pos('-TK1-',IDStr)=3)) or LHarcSfxPacked(ArcName) or LZSSfxPacked(ArcName) then
  2881.       BEGIN
  2882.        If (Pos('-lZ',IDStr)=3) and (IDStr[7]='-') then
  2883.         ArchiveType := PUTType ELSE
  2884.          If ((Pos('-lz',IDStr)=3) and (IDStr[7]='-')) or LZSSfxPacked(ArcName) then
  2885.           ArchiveType := LzsType ELSE
  2886.          BEGIN
  2887.           If (((Pos('-lh0-',IDStr)=3) or (Pos('-lh1-',IDStr)=3)) and
  2888.              (GetExt(CapStr(ArcName))='.ARX')) then
  2889.            BEGIN
  2890.             ArchiveType := ARXType;
  2891.             Exit;
  2892.            END ELSE
  2893.            BEGIN
  2894.             If Pos('-lh7-',IDStr)=3 then
  2895.              BEGIN
  2896.               ArchiveType := LHKType;
  2897.               Exit;
  2898.              END ELSE
  2899.              BEGIN
  2900.               If Pos('.CAR',CapStr(ArcName))<>0 then
  2901.                BEGIN
  2902.                 ArchiveType := CarType;
  2903.                 Exit;
  2904.                END;
  2905.               ArchiveType := LZHType;
  2906.               Exit;
  2907.              END;
  2908.            END
  2909.          END;
  2910.        Exit;
  2911.       END;
  2912.      If Pos('-sw1-',IDStr)=3 then
  2913.       BEGIN
  2914.        ArchiveType := SwgType;
  2915.        Exit;
  2916.       END;
  2917.      If ComPackSfxPacked(ArcName) then
  2918.       BEGIN
  2919.        ArchiveType := CpkType;
  2920.        Exit;
  2921.       END;
  2922.      If (Pos(#33#18,IDStr)=1) or (Pos(#33#17,IDStr)=1) then
  2923.       BEGIN
  2924.        ArchiveType := AINType;
  2925.        Exit;
  2926.       END;
  2927.      If (Pos('UC2',IDStr)=1) or (Pos('UC2SFX Header',IDStr)=1) then
  2928.       BEGIN
  2929.        ArchiveType := UC2Type;
  2930.        Exit;
  2931.       END;
  2932.      If UCEXEPacked(ArcName) then
  2933.       BEGIN
  2934.        If not ACESfxPacked(ArcName) then ArchiveType := UCEXEType ELSE
  2935.         ArchiveType := AceType;
  2936.        Exit;
  2937.       END;
  2938.      If AINEXEPacked(ArcName) then
  2939.       BEGIN
  2940.        ArchiveType := AINEXEType;
  2941.        Exit;
  2942.       END;
  2943.      If LZEXEd(ArcName) then
  2944.       BEGIN
  2945.        ArchiveType := LZEXEType;
  2946.        Exit;
  2947.       END;
  2948.      If Dieted(ArcName) then
  2949.       BEGIN
  2950.        ArchiveType := DietType;
  2951.        Exit;
  2952.       END;
  2953.      If PKExed(ArcName) then
  2954.       BEGIN
  2955.        ArchiveType := PKLiteType;
  2956.        Exit;
  2957.       END;
  2958.      If TPExed(ArcName) then
  2959.       BEGIN
  2960.        ArchiveType := TinyProgType;
  2961.        Exit;
  2962.       END;
  2963.      If WWPackPacked(ArcName) then
  2964.       BEGIN
  2965.        If not ACESfxPacked(ArcName) then ArchiveType := WWPType ELSE
  2966.         ArchiveType := ACEType;
  2967.        Exit;
  2968.       END;
  2969.      If ARXSfxPacked(ArcName) then
  2970.       BEGIN
  2971.        ArchiveType := ARXType;
  2972.        Exit;
  2973.       END;
  2974.      If InstallShieldPacked(ArcName) then
  2975.       BEGIN
  2976.        ArchiveType := IShType;
  2977.        Exit;
  2978.       END;
  2979.      If ID_at_end(ArcName,DwcType) then
  2980.       BEGIN
  2981.        ArchiveType := DwcType;
  2982.        Exit;
  2983.       END;
  2984.      If (Pos(#0,IDStr)=1) and ID_at_end(ArcName,ArgType) then
  2985.       BEGIN
  2986.        ArchiveType := ArgType;
  2987.        Exit;
  2988.       END;
  2989.      If ID_at_end(ArcName,ZARType) then
  2990.       BEGIN
  2991.        ArchiveType := ZARType;
  2992.        Exit;
  2993.       END;
  2994.      If ID_at_end(ArcName,PC3Type) then
  2995.       BEGIN
  2996.        ArchiveType := PC3Type;
  2997.        Exit;
  2998.       END;
  2999.      If ID_at_end(ArcName,IiType) then
  3000.       BEGIN
  3001.        ArchiveType := IiType;
  3002.        Exit;
  3003.       END;
  3004.      If ID_at_end(ArcName,RKVType) then
  3005.       BEGIN
  3006.        (* If (Pos('≡',IDStr)=2) or (Pos('Ç',IDStr)=2) or (Pos('ï',IDStr)=2) or
  3007.          (Pos('à',IDStr)=2) or (Pos('ë',IDStr)=2) then *)
  3008.        If IDStr[3] in [#0..#15] then
  3009.         BEGIN
  3010.          ArchiveType := RKVType;
  3011.          Exit;
  3012.         END;
  3013.       END;
  3014.      If ID_at_end(ArcName,RKType) then
  3015.       BEGIN
  3016.        ArchiveType := RKType;
  3017.        Exit;
  3018.       END;
  3019.      If ID_at_end(ArcName,XdiType) then
  3020.       BEGIN
  3021.        If Pos('jm',IDStr)=1 then ArchiveType := XdiType ELSE
  3022.        If Pos('xpa',IDStr)=1 then ArchiveType := XpaType ELSE
  3023.        If Pos('═ jm',IDStr)=1 then ArchiveType := XpdType;
  3024.        Exit;
  3025.       END;
  3026.      If Pos('xpa'#0#1,IDStr)=1 then
  3027.       BEGIN
  3028.        ArchiveType := Xpa32Type;
  3029.        Exit;
  3030.       END;
  3031.      If Pos(#26#0#0#0,IDStr)=19 then
  3032.       BEGIN
  3033.        ArchiveType := FlhType;
  3034.        Exit;
  3035.       END;
  3036.      If Pos('.ARI',CapStr(ArcName))<>0 then
  3037.       BEGIN
  3038.        ArchiveType := AriType;
  3039.        Exit;
  3040.       END;
  3041.      If Pos('.TAR',CapStr(ArcName))<>0 then
  3042.       BEGIN
  3043.        ArchiveType := TarType;
  3044.        Exit;
  3045.       END;
  3046.      If Pos('.CAR',CapStr(ArcName))<>0 then
  3047.       BEGIN
  3048.        ArchiveType := CaCType;
  3049.        Exit;
  3050.       END;
  3051.      If (Pos('SZ'#10#4,IDStr)=1) or (* szip ab 1.10 *)
  3052.         (((Pos(#0,IDStr)=2) and (IDStr[1] in [#0..#21])) or  (* szip 1.04 *)
  3053.         ((IDStr[1] in [#0..#41]) and (IDStr[2] in [#0,#3..#255]) and (IDStr[4]=#0))) and (* szip 1.05 *)
  3054.         (Pos('.EXE',CapStr(ArcName))=0) then
  3055.       BEGIN
  3056.        ArchiveType := SzipType;
  3057.        Exit;
  3058.       END;
  3059.      If Pos('.LBR',CapStr(ArcName))<>0 then
  3060.       BEGIN
  3061.        ArchiveType := LBRType;
  3062.        Exit;
  3063.       END;
  3064.      ArchiveType := ArcMethod(ArcName);
  3065.     END;
  3066.   END;
  3067.  END;
  3068.  
  3069. END.
  3070.