seven_zip_ruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (732) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/.travis.yml +10 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +39 -0
  6. data/README.md +176 -0
  7. data/Rakefile +47 -0
  8. data/ext/C/Types.h +254 -0
  9. data/ext/CPP/7zip/Archive/IArchive.h +234 -0
  10. data/ext/CPP/7zip/IDecl.h +15 -0
  11. data/ext/CPP/7zip/IPassword.h +24 -0
  12. data/ext/CPP/7zip/IProgress.h +33 -0
  13. data/ext/CPP/7zip/IStream.h +58 -0
  14. data/ext/CPP/7zip/PropID.h +76 -0
  15. data/ext/CPP/Common/MyCom.h +225 -0
  16. data/ext/CPP/Common/MyGuidDef.h +54 -0
  17. data/ext/CPP/Common/MyInitGuid.h +22 -0
  18. data/ext/CPP/Common/MyUnknown.h +13 -0
  19. data/ext/CPP/Common/MyWindows.h +204 -0
  20. data/ext/CPP/Common/Types.h +11 -0
  21. data/ext/CPP/Windows/PropVariant.h +56 -0
  22. data/ext/CPP/include_windows/basetyps.h +19 -0
  23. data/ext/CPP/include_windows/tchar.h +89 -0
  24. data/ext/CPP/include_windows/windows.h +194 -0
  25. data/ext/p7zip/Asm/x64/7zCrcT8U.asm +103 -0
  26. data/ext/p7zip/Asm/x86/7zCrcT8U.asm +101 -0
  27. data/ext/p7zip/C/7zBuf.h +39 -0
  28. data/ext/p7zip/C/7zBuf2.c +45 -0
  29. data/ext/p7zip/C/7zCrc.c +76 -0
  30. data/ext/p7zip/C/7zCrc.h +25 -0
  31. data/ext/p7zip/C/7zCrcOpt.c +34 -0
  32. data/ext/p7zip/C/7zCrcT8.c +43 -0
  33. data/ext/p7zip/C/7zStream.c +169 -0
  34. data/ext/p7zip/C/7zVersion.h +7 -0
  35. data/ext/p7zip/C/Aes.c +284 -0
  36. data/ext/p7zip/C/Aes.h +38 -0
  37. data/ext/p7zip/C/Alloc.back3 +238 -0
  38. data/ext/p7zip/C/Alloc.c +280 -0
  39. data/ext/p7zip/C/Alloc.c.back +243 -0
  40. data/ext/p7zip/C/Alloc.c.back2 +222 -0
  41. data/ext/p7zip/C/Alloc.h +27 -0
  42. data/ext/p7zip/C/Bra.c +133 -0
  43. data/ext/p7zip/C/Bra.h +68 -0
  44. data/ext/p7zip/C/Bra86.c +85 -0
  45. data/ext/p7zip/C/BraIA64.c +67 -0
  46. data/ext/p7zip/C/BwtSort.c +516 -0
  47. data/ext/p7zip/C/BwtSort.h +30 -0
  48. data/ext/p7zip/C/CpuArch.c +168 -0
  49. data/ext/p7zip/C/CpuArch.h +155 -0
  50. data/ext/p7zip/C/Delta.c +62 -0
  51. data/ext/p7zip/C/Delta.h +23 -0
  52. data/ext/p7zip/C/HuffEnc.c +146 -0
  53. data/ext/p7zip/C/HuffEnc.h +27 -0
  54. data/ext/p7zip/C/LzFind.c +761 -0
  55. data/ext/p7zip/C/LzFind.h +115 -0
  56. data/ext/p7zip/C/LzFindMt.c +793 -0
  57. data/ext/p7zip/C/LzFindMt.h +105 -0
  58. data/ext/p7zip/C/LzHash.h +54 -0
  59. data/ext/p7zip/C/Lzma2Dec.c +356 -0
  60. data/ext/p7zip/C/Lzma2Dec.h +84 -0
  61. data/ext/p7zip/C/Lzma2Enc.c +477 -0
  62. data/ext/p7zip/C/Lzma2Enc.h +66 -0
  63. data/ext/p7zip/C/LzmaDec.c +999 -0
  64. data/ext/p7zip/C/LzmaDec.h +231 -0
  65. data/ext/p7zip/C/LzmaEnc.c +2268 -0
  66. data/ext/p7zip/C/LzmaEnc.h +80 -0
  67. data/ext/p7zip/C/LzmaUtil/Lzma86Dec.c +61 -0
  68. data/ext/p7zip/C/LzmaUtil/Lzma86Dec.h +51 -0
  69. data/ext/p7zip/C/LzmaUtil/Lzma86Enc.c +113 -0
  70. data/ext/p7zip/C/LzmaUtil/Lzma86Enc.h +78 -0
  71. data/ext/p7zip/C/MtCoder.c +327 -0
  72. data/ext/p7zip/C/MtCoder.h +98 -0
  73. data/ext/p7zip/C/Ppmd.h +85 -0
  74. data/ext/p7zip/C/Ppmd7.c +708 -0
  75. data/ext/p7zip/C/Ppmd7.h +140 -0
  76. data/ext/p7zip/C/Ppmd7Dec.c +187 -0
  77. data/ext/p7zip/C/Ppmd7Enc.c +185 -0
  78. data/ext/p7zip/C/Ppmd8.c +1120 -0
  79. data/ext/p7zip/C/Ppmd8.h +133 -0
  80. data/ext/p7zip/C/Ppmd8Dec.c +155 -0
  81. data/ext/p7zip/C/Ppmd8Enc.c +161 -0
  82. data/ext/p7zip/C/RotateDefs.h +20 -0
  83. data/ext/p7zip/C/Sha256.c +204 -0
  84. data/ext/p7zip/C/Sha256.h +26 -0
  85. data/ext/p7zip/C/Sort.c +93 -0
  86. data/ext/p7zip/C/Sort.h +20 -0
  87. data/ext/p7zip/C/Threads.c +582 -0
  88. data/ext/p7zip/C/Threads.h +123 -0
  89. data/ext/p7zip/C/Types.h +254 -0
  90. data/ext/p7zip/C/Xz.c +88 -0
  91. data/ext/p7zip/C/Xz.h +252 -0
  92. data/ext/p7zip/C/XzCrc64.c +33 -0
  93. data/ext/p7zip/C/XzCrc64.h +26 -0
  94. data/ext/p7zip/C/XzDec.c +875 -0
  95. data/ext/p7zip/C/XzEnc.c +497 -0
  96. data/ext/p7zip/C/XzEnc.h +25 -0
  97. data/ext/p7zip/C/XzIn.c +306 -0
  98. data/ext/p7zip/CPP/7zip/Archive/7z/7zCompressionMode.cpp +3 -0
  99. data/ext/p7zip/CPP/7zip/Archive/7z/7zCompressionMode.h +50 -0
  100. data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.cpp +332 -0
  101. data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.h +68 -0
  102. data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.cpp +444 -0
  103. data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.h +55 -0
  104. data/ext/p7zip/CPP/7zip/Archive/7z/7zExtract.cpp +270 -0
  105. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.cpp +123 -0
  106. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.h +58 -0
  107. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.cpp +149 -0
  108. data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.h +58 -0
  109. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.cpp +482 -0
  110. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.h +119 -0
  111. data/ext/p7zip/CPP/7zip/Archive/7z/7zHandlerOut.cpp +483 -0
  112. data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.cpp +14 -0
  113. data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.h +97 -0
  114. data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.cpp +1276 -0
  115. data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.h +245 -0
  116. data/ext/p7zip/CPP/7zip/Archive/7z/7zItem.h +268 -0
  117. data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.cpp +866 -0
  118. data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.h +152 -0
  119. data/ext/p7zip/CPP/7zip/Archive/7z/7zProperties.cpp +164 -0
  120. data/ext/p7zip/CPP/7zip/Archive/7z/7zProperties.h +22 -0
  121. data/ext/p7zip/CPP/7zip/Archive/7z/7zRegister.cpp +18 -0
  122. data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.cpp +24 -0
  123. data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.h +35 -0
  124. data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.cpp +1216 -0
  125. data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.h +88 -0
  126. data/ext/p7zip/CPP/7zip/Archive/ApmHandler.cpp +356 -0
  127. data/ext/p7zip/CPP/7zip/Archive/ArchiveExports.cpp +135 -0
  128. data/ext/p7zip/CPP/7zip/Archive/ArjHandler.cpp +798 -0
  129. data/ext/p7zip/CPP/7zip/Archive/Bz2Handler.cpp +423 -0
  130. data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.cpp +189 -0
  131. data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.h +44 -0
  132. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.cpp +929 -0
  133. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.h +28 -0
  134. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.cpp +15 -0
  135. data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.h +44 -0
  136. data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.cpp +272 -0
  137. data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.h +161 -0
  138. data/ext/p7zip/CPP/7zip/Archive/Cab/CabItem.h +63 -0
  139. data/ext/p7zip/CPP/7zip/Archive/Cab/CabRegister.cpp +13 -0
  140. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.cpp +721 -0
  141. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.h +29 -0
  142. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.cpp +24 -0
  143. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.h +28 -0
  144. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.cpp +937 -0
  145. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.h +244 -0
  146. data/ext/p7zip/CPP/7zip/Archive/Chm/ChmRegister.cpp +13 -0
  147. data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.cpp +239 -0
  148. data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.h +28 -0
  149. data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.cpp +389 -0
  150. data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.h +119 -0
  151. data/ext/p7zip/CPP/7zip/Archive/Com/ComRegister.cpp +13 -0
  152. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.cpp +121 -0
  153. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.h +174 -0
  154. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.cpp +240 -0
  155. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.h +80 -0
  156. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.cpp +239 -0
  157. data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.h +88 -0
  158. data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.cpp +15 -0
  159. data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.h +37 -0
  160. data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.cpp +22 -0
  161. data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.h +24 -0
  162. data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.cpp +62 -0
  163. data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.h +12 -0
  164. data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.cpp +623 -0
  165. data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.h +87 -0
  166. data/ext/p7zip/CPP/7zip/Archive/Common/InStreamWithCRC.cpp +42 -0
  167. data/ext/p7zip/CPP/7zip/Archive/Common/InStreamWithCRC.h +67 -0
  168. data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.cpp +61 -0
  169. data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.h +24 -0
  170. data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.cpp +190 -0
  171. data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.h +84 -0
  172. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp +18 -0
  173. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithCRC.h +36 -0
  174. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp +18 -0
  175. data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.h +36 -0
  176. data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.cpp +177 -0
  177. data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.h +18 -0
  178. data/ext/p7zip/CPP/7zip/Archive/CpioHandler.cpp +624 -0
  179. data/ext/p7zip/CPP/7zip/Archive/CramfsHandler.cpp +644 -0
  180. data/ext/p7zip/CPP/7zip/Archive/DebHandler.cpp +413 -0
  181. data/ext/p7zip/CPP/7zip/Archive/DeflateProps.cpp +118 -0
  182. data/ext/p7zip/CPP/7zip/Archive/DeflateProps.h +35 -0
  183. data/ext/p7zip/CPP/7zip/Archive/DllExports2.cpp +76 -0
  184. data/ext/p7zip/CPP/7zip/Archive/DmgHandler.cpp +918 -0
  185. data/ext/p7zip/CPP/7zip/Archive/ElfHandler.cpp +534 -0
  186. data/ext/p7zip/CPP/7zip/Archive/FatHandler.cpp +996 -0
  187. data/ext/p7zip/CPP/7zip/Archive/FlvHandler.cpp +544 -0
  188. data/ext/p7zip/CPP/7zip/Archive/GzHandler.cpp +698 -0
  189. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.cpp +243 -0
  190. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.h +26 -0
  191. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.cpp +480 -0
  192. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.h +154 -0
  193. data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsRegister.cpp +13 -0
  194. data/ext/p7zip/CPP/7zip/Archive/IArchive.h +234 -0
  195. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.cpp +326 -0
  196. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.h +30 -0
  197. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.cpp +21 -0
  198. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.h +61 -0
  199. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.cpp +453 -0
  200. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.h +315 -0
  201. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoItem.h +141 -0
  202. data/ext/p7zip/CPP/7zip/Archive/Iso/IsoRegister.cpp +13 -0
  203. data/ext/p7zip/CPP/7zip/Archive/LzhHandler.cpp +775 -0
  204. data/ext/p7zip/CPP/7zip/Archive/LzmaHandler.cpp +430 -0
  205. data/ext/p7zip/CPP/7zip/Archive/MachoHandler.cpp +500 -0
  206. data/ext/p7zip/CPP/7zip/Archive/MbrHandler.cpp +507 -0
  207. data/ext/p7zip/CPP/7zip/Archive/MslzHandler.cpp +257 -0
  208. data/ext/p7zip/CPP/7zip/Archive/MubHandler.cpp +266 -0
  209. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.cpp +130 -0
  210. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.h +47 -0
  211. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.cpp +510 -0
  212. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.h +43 -0
  213. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.cpp +1461 -0
  214. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.h +181 -0
  215. data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisRegister.cpp +13 -0
  216. data/ext/p7zip/CPP/7zip/Archive/NtfsHandler.cpp +1764 -0
  217. data/ext/p7zip/CPP/7zip/Archive/PeHandler.cpp +1752 -0
  218. data/ext/p7zip/CPP/7zip/Archive/PpmdHandler.cpp +456 -0
  219. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.cpp +869 -0
  220. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.h +66 -0
  221. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.cpp +21 -0
  222. data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.h +205 -0
  223. data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.cpp +478 -0
  224. data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.h +123 -0
  225. data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.cpp +55 -0
  226. data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.h +79 -0
  227. data/ext/p7zip/CPP/7zip/Archive/Rar/RarRegister.cpp +13 -0
  228. data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp +78 -0
  229. data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.h +49 -0
  230. data/ext/p7zip/CPP/7zip/Archive/RpmHandler.cpp +292 -0
  231. data/ext/p7zip/CPP/7zip/Archive/SplitHandler.cpp +366 -0
  232. data/ext/p7zip/CPP/7zip/Archive/SquashfsHandler.cpp +2155 -0
  233. data/ext/p7zip/CPP/7zip/Archive/SwfHandler.cpp +706 -0
  234. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.cpp +386 -0
  235. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.h +61 -0
  236. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandlerOut.cpp +122 -0
  237. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.cpp +25 -0
  238. data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.h +108 -0
  239. data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.cpp +207 -0
  240. data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.h +17 -0
  241. data/ext/p7zip/CPP/7zip/Archive/Tar/TarItem.h +72 -0
  242. data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.cpp +187 -0
  243. data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.h +28 -0
  244. data/ext/p7zip/CPP/7zip/Archive/Tar/TarRegister.cpp +18 -0
  245. data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.cpp +139 -0
  246. data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.h +34 -0
  247. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.cpp +451 -0
  248. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.h +37 -0
  249. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.cpp +876 -0
  250. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.h +375 -0
  251. data/ext/p7zip/CPP/7zip/Archive/Udf/UdfRegister.cpp +13 -0
  252. data/ext/p7zip/CPP/7zip/Archive/VhdHandler.cpp +734 -0
  253. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.cpp +660 -0
  254. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.h +77 -0
  255. data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandlerOut.cpp +639 -0
  256. data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.cpp +855 -0
  257. data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.h +297 -0
  258. data/ext/p7zip/CPP/7zip/Archive/Wim/WimRegister.cpp +18 -0
  259. data/ext/p7zip/CPP/7zip/Archive/XarHandler.cpp +588 -0
  260. data/ext/p7zip/CPP/7zip/Archive/XzHandler.cpp +707 -0
  261. data/ext/p7zip/CPP/7zip/Archive/ZHandler.cpp +161 -0
  262. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.cpp +379 -0
  263. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.h +56 -0
  264. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipCompressionMode.h +42 -0
  265. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.cpp +822 -0
  266. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.h +101 -0
  267. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp +537 -0
  268. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.cpp +36 -0
  269. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.h +284 -0
  270. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.cpp +893 -0
  271. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.h +125 -0
  272. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.cpp +181 -0
  273. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.h +281 -0
  274. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItemEx.h +34 -0
  275. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.cpp +289 -0
  276. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.h +56 -0
  277. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipRegister.cpp +18 -0
  278. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.cpp +1076 -0
  279. data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.h +58 -0
  280. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile +328 -0
  281. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.depend +4962 -0
  282. data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.list +265 -0
  283. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zFM.txt +163 -0
  284. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zG.txt +131 -0
  285. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7za.txt +253 -0
  286. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_ALL.txt +32 -0
  287. data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_Format7zFree.txt +290 -0
  288. data/ext/p7zip/CPP/7zip/CMAKE/generate.sh +37 -0
  289. data/ext/p7zip/CPP/7zip/CMAKE/generate_xcode.sh +32 -0
  290. data/ext/p7zip/CPP/7zip/Common/CWrappers.cpp +226 -0
  291. data/ext/p7zip/CPP/7zip/Common/CWrappers.h +109 -0
  292. data/ext/p7zip/CPP/7zip/Common/CreateCoder.cpp +293 -0
  293. data/ext/p7zip/CPP/7zip/Common/CreateCoder.h +98 -0
  294. data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.cpp +55 -0
  295. data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.h +10 -0
  296. data/ext/p7zip/CPP/7zip/Common/FileStreams.cpp +273 -0
  297. data/ext/p7zip/CPP/7zip/Common/FileStreams.h +134 -0
  298. data/ext/p7zip/CPP/7zip/Common/FilterCoder.cpp +247 -0
  299. data/ext/p7zip/CPP/7zip/Common/FilterCoder.h +128 -0
  300. data/ext/p7zip/CPP/7zip/Common/InBuffer.cpp +83 -0
  301. data/ext/p7zip/CPP/7zip/Common/InBuffer.h +81 -0
  302. data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.cpp +122 -0
  303. data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.h +48 -0
  304. data/ext/p7zip/CPP/7zip/Common/LimitedStreams.cpp +154 -0
  305. data/ext/p7zip/CPP/7zip/Common/LimitedStreams.h +125 -0
  306. data/ext/p7zip/CPP/7zip/Common/LockedStream.cpp +23 -0
  307. data/ext/p7zip/CPP/7zip/Common/LockedStream.h +38 -0
  308. data/ext/p7zip/CPP/7zip/Common/MemBlocks.cpp +183 -0
  309. data/ext/p7zip/CPP/7zip/Common/MemBlocks.h +71 -0
  310. data/ext/p7zip/CPP/7zip/Common/MethodId.cpp +27 -0
  311. data/ext/p7zip/CPP/7zip/Common/MethodId.h +10 -0
  312. data/ext/p7zip/CPP/7zip/Common/MethodProps.cpp +99 -0
  313. data/ext/p7zip/CPP/7zip/Common/MethodProps.h +41 -0
  314. data/ext/p7zip/CPP/7zip/Common/OffsetStream.cpp +35 -0
  315. data/ext/p7zip/CPP/7zip/Common/OffsetStream.h +25 -0
  316. data/ext/p7zip/CPP/7zip/Common/OutBuffer.cpp +116 -0
  317. data/ext/p7zip/CPP/7zip/Common/OutBuffer.h +64 -0
  318. data/ext/p7zip/CPP/7zip/Common/OutMemStream.cpp +142 -0
  319. data/ext/p7zip/CPP/7zip/Common/OutMemStream.h +96 -0
  320. data/ext/p7zip/CPP/7zip/Common/ProgressMt.cpp +53 -0
  321. data/ext/p7zip/CPP/7zip/Common/ProgressMt.h +46 -0
  322. data/ext/p7zip/CPP/7zip/Common/ProgressUtils.cpp +42 -0
  323. data/ext/p7zip/CPP/7zip/Common/ProgressUtils.h +34 -0
  324. data/ext/p7zip/CPP/7zip/Common/RegisterArc.h +32 -0
  325. data/ext/p7zip/CPP/7zip/Common/RegisterCodec.h +33 -0
  326. data/ext/p7zip/CPP/7zip/Common/StreamBinder.cpp +152 -0
  327. data/ext/p7zip/CPP/7zip/Common/StreamBinder.h +38 -0
  328. data/ext/p7zip/CPP/7zip/Common/StreamObjects.cpp +221 -0
  329. data/ext/p7zip/CPP/7zip/Common/StreamObjects.h +135 -0
  330. data/ext/p7zip/CPP/7zip/Common/StreamUtils.cpp +56 -0
  331. data/ext/p7zip/CPP/7zip/Common/StreamUtils.h +13 -0
  332. data/ext/p7zip/CPP/7zip/Common/VirtThread.cpp +46 -0
  333. data/ext/p7zip/CPP/7zip/Common/VirtThread.h +23 -0
  334. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.cpp +309 -0
  335. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.h +98 -0
  336. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.cpp +90 -0
  337. data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.h +59 -0
  338. data/ext/p7zip/CPP/7zip/Compress/BZip2Const.h +54 -0
  339. data/ext/p7zip/CPP/7zip/Compress/BZip2Crc.cpp +26 -0
  340. data/ext/p7zip/CPP/7zip/Compress/BZip2Crc.h +31 -0
  341. data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.cpp +943 -0
  342. data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.h +205 -0
  343. data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.cpp +895 -0
  344. data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.h +245 -0
  345. data/ext/p7zip/CPP/7zip/Compress/BZip2Register.cpp +20 -0
  346. data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.cpp +386 -0
  347. data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.h +115 -0
  348. data/ext/p7zip/CPP/7zip/Compress/Bcj2Register.cpp +19 -0
  349. data/ext/p7zip/CPP/7zip/Compress/BcjCoder.cpp +15 -0
  350. data/ext/p7zip/CPP/7zip/Compress/BcjCoder.h +19 -0
  351. data/ext/p7zip/CPP/7zip/Compress/BcjRegister.cpp +19 -0
  352. data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.cpp +24 -0
  353. data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.h +141 -0
  354. data/ext/p7zip/CPP/7zip/Compress/BitlEncoder.h +57 -0
  355. data/ext/p7zip/CPP/7zip/Compress/BitmDecoder.h +66 -0
  356. data/ext/p7zip/CPP/7zip/Compress/BitmEncoder.h +50 -0
  357. data/ext/p7zip/CPP/7zip/Compress/BranchCoder.cpp +19 -0
  358. data/ext/p7zip/CPP/7zip/Compress/BranchCoder.h +44 -0
  359. data/ext/p7zip/CPP/7zip/Compress/BranchMisc.cpp +37 -0
  360. data/ext/p7zip/CPP/7zip/Compress/BranchMisc.h +14 -0
  361. data/ext/p7zip/CPP/7zip/Compress/BranchRegister.cpp +30 -0
  362. data/ext/p7zip/CPP/7zip/Compress/ByteSwap.cpp +73 -0
  363. data/ext/p7zip/CPP/7zip/Compress/CodecExports.cpp +160 -0
  364. data/ext/p7zip/CPP/7zip/Compress/CopyCoder.cpp +67 -0
  365. data/ext/p7zip/CPP/7zip/Compress/CopyCoder.h +34 -0
  366. data/ext/p7zip/CPP/7zip/Compress/CopyRegister.cpp +14 -0
  367. data/ext/p7zip/CPP/7zip/Compress/Deflate64Register.cpp +20 -0
  368. data/ext/p7zip/CPP/7zip/Compress/DeflateConst.h +134 -0
  369. data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.cpp +353 -0
  370. data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.h +157 -0
  371. data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.cpp +986 -0
  372. data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.h +211 -0
  373. data/ext/p7zip/CPP/7zip/Compress/DeflateRegister.cpp +21 -0
  374. data/ext/p7zip/CPP/7zip/Compress/DeltaFilter.cpp +112 -0
  375. data/ext/p7zip/CPP/7zip/Compress/DllExports.cpp +39 -0
  376. data/ext/p7zip/CPP/7zip/Compress/DllExports2.cpp +28 -0
  377. data/ext/p7zip/CPP/7zip/Compress/HuffmanDecoder.h +89 -0
  378. data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.cpp +219 -0
  379. data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.h +57 -0
  380. data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp +89 -0
  381. data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.h +34 -0
  382. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp +531 -0
  383. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp +1018 -0
  384. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h +48 -0
  385. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp +311 -0
  386. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h +20 -0
  387. data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/makefile +173 -0
  388. data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.cpp +14 -0
  389. data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.h +66 -0
  390. data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.cpp +220 -0
  391. data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.h +106 -0
  392. data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.cpp +189 -0
  393. data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.h +73 -0
  394. data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.cpp +94 -0
  395. data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.h +36 -0
  396. data/ext/p7zip/CPP/7zip/Compress/Lzma2Register.cpp +20 -0
  397. data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.cpp +252 -0
  398. data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.h +84 -0
  399. data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.cpp +149 -0
  400. data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.h +36 -0
  401. data/ext/p7zip/CPP/7zip/Compress/LzmaRegister.cpp +20 -0
  402. data/ext/p7zip/CPP/7zip/Compress/Lzx.h +61 -0
  403. data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.cpp +90 -0
  404. data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.h +46 -0
  405. data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.cpp +387 -0
  406. data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.h +159 -0
  407. data/ext/p7zip/CPP/7zip/Compress/Mtf8.h +193 -0
  408. data/ext/p7zip/CPP/7zip/Compress/PpmdDecoder.cpp +167 -0
  409. data/ext/p7zip/CPP/7zip/Compress/PpmdDecoder.h +78 -0
  410. data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.cpp +119 -0
  411. data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.h +48 -0
  412. data/ext/p7zip/CPP/7zip/Compress/PpmdRegister.cpp +21 -0
  413. data/ext/p7zip/CPP/7zip/Compress/PpmdZip.cpp +223 -0
  414. data/ext/p7zip/CPP/7zip/Compress/PpmdZip.h +72 -0
  415. data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.cpp +175 -0
  416. data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.h +264 -0
  417. data/ext/p7zip/CPP/7zip/Compress/RangeCoder.h +205 -0
  418. data/ext/p7zip/CPP/7zip/Compress/RangeCoderBit.h +114 -0
  419. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile +34 -0
  420. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.depend +158 -0
  421. data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.list +64 -0
  422. data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.cpp +480 -0
  423. data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.h +88 -0
  424. data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.cpp +391 -0
  425. data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.h +174 -0
  426. data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.cpp +897 -0
  427. data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.h +267 -0
  428. data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.cpp +1091 -0
  429. data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.h +179 -0
  430. data/ext/p7zip/CPP/7zip/Compress/RarCodecsRegister.cpp +26 -0
  431. data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.cpp +145 -0
  432. data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.h +38 -0
  433. data/ext/p7zip/CPP/7zip/Compress/ZDecoder.cpp +159 -0
  434. data/ext/p7zip/CPP/7zip/Compress/ZDecoder.h +42 -0
  435. data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.cpp +89 -0
  436. data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.h +48 -0
  437. data/ext/p7zip/CPP/7zip/Compress/ZlibEncoder.cpp +61 -0
  438. data/ext/p7zip/CPP/7zip/Compress/ZlibEncoder.h +48 -0
  439. data/ext/p7zip/CPP/7zip/Crypto/7zAes.cpp +244 -0
  440. data/ext/p7zip/CPP/7zip/Crypto/7zAes.h +117 -0
  441. data/ext/p7zip/CPP/7zip/Crypto/7zAesRegister.cpp +18 -0
  442. data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.cpp +109 -0
  443. data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.h +39 -0
  444. data/ext/p7zip/CPP/7zip/Crypto/MyAes.cpp +48 -0
  445. data/ext/p7zip/CPP/7zip/Crypto/MyAes.h +38 -0
  446. data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp +83 -0
  447. data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.h +21 -0
  448. data/ext/p7zip/CPP/7zip/Crypto/RandGen.cpp +107 -0
  449. data/ext/p7zip/CPP/7zip/Crypto/RandGen.h +21 -0
  450. data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.cpp +133 -0
  451. data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.h +50 -0
  452. data/ext/p7zip/CPP/7zip/Crypto/RarAes.cpp +134 -0
  453. data/ext/p7zip/CPP/7zip/Crypto/RarAes.h +47 -0
  454. data/ext/p7zip/CPP/7zip/Crypto/Sha1.cpp +229 -0
  455. data/ext/p7zip/CPP/7zip/Crypto/Sha1.h +68 -0
  456. data/ext/p7zip/CPP/7zip/Crypto/WzAes.cpp +221 -0
  457. data/ext/p7zip/CPP/7zip/Crypto/WzAes.h +125 -0
  458. data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.cpp +88 -0
  459. data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.h +56 -0
  460. data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.cpp +164 -0
  461. data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.h +47 -0
  462. data/ext/p7zip/CPP/7zip/Guid.txt +170 -0
  463. data/ext/p7zip/CPP/7zip/ICoder.h +186 -0
  464. data/ext/p7zip/CPP/7zip/IDecl.h +15 -0
  465. data/ext/p7zip/CPP/7zip/IPassword.h +24 -0
  466. data/ext/p7zip/CPP/7zip/IProgress.h +33 -0
  467. data/ext/p7zip/CPP/7zip/IStream.h +58 -0
  468. data/ext/p7zip/CPP/7zip/MyVersion.h +11 -0
  469. data/ext/p7zip/CPP/7zip/PREMAKE/generate.sh +18 -0
  470. data/ext/p7zip/CPP/7zip/PREMAKE/premake4.lua +263 -0
  471. data/ext/p7zip/CPP/7zip/PropID.h +76 -0
  472. data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA.pro +228 -0
  473. data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA_osx.pro +228 -0
  474. data/ext/p7zip/CPP/7zip/QMAKE/test_emul/test_emul.pro +26 -0
  475. data/ext/p7zip/CPP/7zip/TEST/TestUI/TestUI.cpp +560 -0
  476. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile +33 -0
  477. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.depend +577 -0
  478. data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.list +16 -0
  479. data/ext/p7zip/CPP/Common/AutoPtr.h +35 -0
  480. data/ext/p7zip/CPP/Common/Buffer.h +77 -0
  481. data/ext/p7zip/CPP/Common/CRC.cpp +7 -0
  482. data/ext/p7zip/CPP/Common/C_FileIO.cpp +88 -0
  483. data/ext/p7zip/CPP/Common/C_FileIO.h +47 -0
  484. data/ext/p7zip/CPP/Common/ComTry.h +18 -0
  485. data/ext/p7zip/CPP/Common/CommandLineParser.cpp +230 -0
  486. data/ext/p7zip/CPP/Common/CommandLineParser.h +72 -0
  487. data/ext/p7zip/CPP/Common/Defs.h +20 -0
  488. data/ext/p7zip/CPP/Common/DynamicBuffer.h +50 -0
  489. data/ext/p7zip/CPP/Common/IntToString.cpp +77 -0
  490. data/ext/p7zip/CPP/Common/IntToString.h +19 -0
  491. data/ext/p7zip/CPP/Common/Lang.cpp +130 -0
  492. data/ext/p7zip/CPP/Common/Lang.h +28 -0
  493. data/ext/p7zip/CPP/Common/ListFileUtils.cpp +75 -0
  494. data/ext/p7zip/CPP/Common/ListFileUtils.h +11 -0
  495. data/ext/p7zip/CPP/Common/MyCom.h +225 -0
  496. data/ext/p7zip/CPP/Common/MyException.h +14 -0
  497. data/ext/p7zip/CPP/Common/MyGuidDef.h +54 -0
  498. data/ext/p7zip/CPP/Common/MyInitGuid.h +22 -0
  499. data/ext/p7zip/CPP/Common/MyMap.cpp +140 -0
  500. data/ext/p7zip/CPP/Common/MyMap.h +28 -0
  501. data/ext/p7zip/CPP/Common/MyString.cpp +206 -0
  502. data/ext/p7zip/CPP/Common/MyString.h +601 -0
  503. data/ext/p7zip/CPP/Common/MyUnknown.h +13 -0
  504. data/ext/p7zip/CPP/Common/MyVector.cpp +87 -0
  505. data/ext/p7zip/CPP/Common/MyVector.h +266 -0
  506. data/ext/p7zip/CPP/Common/MyWindows.cpp +111 -0
  507. data/ext/p7zip/CPP/Common/MyWindows.h +218 -0
  508. data/ext/p7zip/CPP/Common/MyXml.cpp +209 -0
  509. data/ext/p7zip/CPP/Common/MyXml.h +40 -0
  510. data/ext/p7zip/CPP/Common/NewHandler.h +16 -0
  511. data/ext/p7zip/CPP/Common/StdInStream.cpp +100 -0
  512. data/ext/p7zip/CPP/Common/StdInStream.h +32 -0
  513. data/ext/p7zip/CPP/Common/StdOutStream.cpp +93 -0
  514. data/ext/p7zip/CPP/Common/StdOutStream.h +35 -0
  515. data/ext/p7zip/CPP/Common/StringConvert.cpp +181 -0
  516. data/ext/p7zip/CPP/Common/StringConvert.h +73 -0
  517. data/ext/p7zip/CPP/Common/StringToInt.cpp +90 -0
  518. data/ext/p7zip/CPP/Common/StringToInt.h +18 -0
  519. data/ext/p7zip/CPP/Common/TextConfig.cpp +138 -0
  520. data/ext/p7zip/CPP/Common/TextConfig.h +22 -0
  521. data/ext/p7zip/CPP/Common/Types.h +11 -0
  522. data/ext/p7zip/CPP/Common/UTFConvert.cpp +145 -0
  523. data/ext/p7zip/CPP/Common/UTFConvert.h +11 -0
  524. data/ext/p7zip/CPP/Common/Wildcard.cpp +462 -0
  525. data/ext/p7zip/CPP/Common/Wildcard.h +80 -0
  526. data/ext/p7zip/CPP/Windows/COM.cpp +37 -0
  527. data/ext/p7zip/CPP/Windows/COM.h +69 -0
  528. data/ext/p7zip/CPP/Windows/Clipboard.cpp +160 -0
  529. data/ext/p7zip/CPP/Windows/Clipboard.h +28 -0
  530. data/ext/p7zip/CPP/Windows/CommonDialog.h +19 -0
  531. data/ext/p7zip/CPP/Windows/Control/ComboBox.h +82 -0
  532. data/ext/p7zip/CPP/Windows/Control/Controls.cpp +515 -0
  533. data/ext/p7zip/CPP/Windows/Control/Dialog.cpp +560 -0
  534. data/ext/p7zip/CPP/Windows/Control/Dialog.h +179 -0
  535. data/ext/p7zip/CPP/Windows/Control/DialogImpl.h +73 -0
  536. data/ext/p7zip/CPP/Windows/Control/Edit.h +24 -0
  537. data/ext/p7zip/CPP/Windows/Control/ListView.h +164 -0
  538. data/ext/p7zip/CPP/Windows/Control/ProgressBar.h +34 -0
  539. data/ext/p7zip/CPP/Windows/Control/Static.h +23 -0
  540. data/ext/p7zip/CPP/Windows/Control/StatusBar.h +56 -0
  541. data/ext/p7zip/CPP/Windows/Control/Window2.cpp +211 -0
  542. data/ext/p7zip/CPP/Windows/Control/Window2.h +111 -0
  543. data/ext/p7zip/CPP/Windows/DLL.cpp +193 -0
  544. data/ext/p7zip/CPP/Windows/DLL.h +48 -0
  545. data/ext/p7zip/CPP/Windows/Defs.h +17 -0
  546. data/ext/p7zip/CPP/Windows/Error.cpp +58 -0
  547. data/ext/p7zip/CPP/Windows/Error.h +33 -0
  548. data/ext/p7zip/CPP/Windows/FileDir.cpp +927 -0
  549. data/ext/p7zip/CPP/Windows/FileDir.h +115 -0
  550. data/ext/p7zip/CPP/Windows/FileFind.cpp +604 -0
  551. data/ext/p7zip/CPP/Windows/FileFind.h +126 -0
  552. data/ext/p7zip/CPP/Windows/FileIO.cpp +475 -0
  553. data/ext/p7zip/CPP/Windows/FileIO.h +110 -0
  554. data/ext/p7zip/CPP/Windows/FileName.cpp +50 -0
  555. data/ext/p7zip/CPP/Windows/FileName.h +27 -0
  556. data/ext/p7zip/CPP/Windows/Menu.h +4 -0
  557. data/ext/p7zip/CPP/Windows/NtCheck.h +44 -0
  558. data/ext/p7zip/CPP/Windows/PropVariant.cpp +243 -0
  559. data/ext/p7zip/CPP/Windows/PropVariant.h +56 -0
  560. data/ext/p7zip/CPP/Windows/PropVariantConversions.cpp +142 -0
  561. data/ext/p7zip/CPP/Windows/PropVariantConversions.h +14 -0
  562. data/ext/p7zip/CPP/Windows/PropVariantUtils.cpp +78 -0
  563. data/ext/p7zip/CPP/Windows/PropVariantUtils.h +28 -0
  564. data/ext/p7zip/CPP/Windows/Registry.cpp +313 -0
  565. data/ext/p7zip/CPP/Windows/Registry.h +113 -0
  566. data/ext/p7zip/CPP/Windows/ResourceString.h +22 -0
  567. data/ext/p7zip/CPP/Windows/Shell.h +21 -0
  568. data/ext/p7zip/CPP/Windows/Synchronization.cpp +157 -0
  569. data/ext/p7zip/CPP/Windows/Synchronization.h +187 -0
  570. data/ext/p7zip/CPP/Windows/Synchronization2.h +218 -0
  571. data/ext/p7zip/CPP/Windows/System.cpp +166 -0
  572. data/ext/p7zip/CPP/Windows/System.h +16 -0
  573. data/ext/p7zip/CPP/Windows/Thread.h +41 -0
  574. data/ext/p7zip/CPP/Windows/Time.cpp +88 -0
  575. data/ext/p7zip/CPP/Windows/Time.h +21 -0
  576. data/ext/p7zip/CPP/Windows/Window.cpp +101 -0
  577. data/ext/p7zip/CPP/Windows/Window.h +43 -0
  578. data/ext/p7zip/CPP/include_windows/basetyps.h +19 -0
  579. data/ext/p7zip/CPP/include_windows/tchar.h +89 -0
  580. data/ext/p7zip/CPP/include_windows/windows.h +194 -0
  581. data/ext/p7zip/CPP/myWindows/StdAfx.h +124 -0
  582. data/ext/p7zip/CPP/myWindows/config.h +67 -0
  583. data/ext/p7zip/CPP/myWindows/initguid.h +4 -0
  584. data/ext/p7zip/CPP/myWindows/makefile +21 -0
  585. data/ext/p7zip/CPP/myWindows/makefile.depend +32 -0
  586. data/ext/p7zip/CPP/myWindows/makefile.list +28 -0
  587. data/ext/p7zip/CPP/myWindows/myAddExeFlag.cpp +20 -0
  588. data/ext/p7zip/CPP/myWindows/myGetTickCount.cpp +8 -0
  589. data/ext/p7zip/CPP/myWindows/myPrivate.h +17 -0
  590. data/ext/p7zip/CPP/myWindows/mySplitCommandLine.cpp +82 -0
  591. data/ext/p7zip/CPP/myWindows/test_emul.cpp +745 -0
  592. data/ext/p7zip/CPP/myWindows/wine_GetXXXDefaultLangID.cpp +741 -0
  593. data/ext/p7zip/CPP/myWindows/wine_date_and_time.cpp +434 -0
  594. data/ext/p7zip/ChangeLog +914 -0
  595. data/ext/p7zip/DOCS/7zC.txt +194 -0
  596. data/ext/p7zip/DOCS/7zFormat.txt +469 -0
  597. data/ext/p7zip/DOCS/License.txt +52 -0
  598. data/ext/p7zip/DOCS/MANUAL/commands/add.htm +87 -0
  599. data/ext/p7zip/DOCS/MANUAL/commands/bench.htm +79 -0
  600. data/ext/p7zip/DOCS/MANUAL/commands/delete.htm +59 -0
  601. data/ext/p7zip/DOCS/MANUAL/commands/extract.htm +91 -0
  602. data/ext/p7zip/DOCS/MANUAL/commands/extract_full.htm +68 -0
  603. data/ext/p7zip/DOCS/MANUAL/commands/index.htm +33 -0
  604. data/ext/p7zip/DOCS/MANUAL/commands/list.htm +77 -0
  605. data/ext/p7zip/DOCS/MANUAL/commands/style.css +232 -0
  606. data/ext/p7zip/DOCS/MANUAL/commands/test.htm +46 -0
  607. data/ext/p7zip/DOCS/MANUAL/commands/update.htm +66 -0
  608. data/ext/p7zip/DOCS/MANUAL/exit_codes.htm +27 -0
  609. data/ext/p7zip/DOCS/MANUAL/index.htm +29 -0
  610. data/ext/p7zip/DOCS/MANUAL/style.css +232 -0
  611. data/ext/p7zip/DOCS/MANUAL/switches/ar_exclude.htm +56 -0
  612. data/ext/p7zip/DOCS/MANUAL/switches/ar_include.htm +83 -0
  613. data/ext/p7zip/DOCS/MANUAL/switches/ar_no.htm +52 -0
  614. data/ext/p7zip/DOCS/MANUAL/switches/charset.htm +49 -0
  615. data/ext/p7zip/DOCS/MANUAL/switches/exclude.htm +60 -0
  616. data/ext/p7zip/DOCS/MANUAL/switches/include.htm +87 -0
  617. data/ext/p7zip/DOCS/MANUAL/switches/index.htm +64 -0
  618. data/ext/p7zip/DOCS/MANUAL/switches/large_pages.htm +50 -0
  619. data/ext/p7zip/DOCS/MANUAL/switches/list_tech.htm +36 -0
  620. data/ext/p7zip/DOCS/MANUAL/switches/method.htm +625 -0
  621. data/ext/p7zip/DOCS/MANUAL/switches/output_dir.htm +53 -0
  622. data/ext/p7zip/DOCS/MANUAL/switches/overwrite.htm +56 -0
  623. data/ext/p7zip/DOCS/MANUAL/switches/password.htm +54 -0
  624. data/ext/p7zip/DOCS/MANUAL/switches/recurse.htm +83 -0
  625. data/ext/p7zip/DOCS/MANUAL/switches/sfx.htm +156 -0
  626. data/ext/p7zip/DOCS/MANUAL/switches/ssc.htm +50 -0
  627. data/ext/p7zip/DOCS/MANUAL/switches/stdin.htm +55 -0
  628. data/ext/p7zip/DOCS/MANUAL/switches/stdout.htm +50 -0
  629. data/ext/p7zip/DOCS/MANUAL/switches/stop_switch.htm +31 -0
  630. data/ext/p7zip/DOCS/MANUAL/switches/style.css +232 -0
  631. data/ext/p7zip/DOCS/MANUAL/switches/type.htm +83 -0
  632. data/ext/p7zip/DOCS/MANUAL/switches/update.htm +176 -0
  633. data/ext/p7zip/DOCS/MANUAL/switches/volume.htm +49 -0
  634. data/ext/p7zip/DOCS/MANUAL/switches/working_dir.htm +55 -0
  635. data/ext/p7zip/DOCS/MANUAL/switches/yes.htm +48 -0
  636. data/ext/p7zip/DOCS/MANUAL/syntax.htm +120 -0
  637. data/ext/p7zip/DOCS/Methods.txt +152 -0
  638. data/ext/p7zip/DOCS/copying.txt +504 -0
  639. data/ext/p7zip/DOCS/history.txt +456 -0
  640. data/ext/p7zip/DOCS/lzma.txt +598 -0
  641. data/ext/p7zip/DOCS/readme.txt +181 -0
  642. data/ext/p7zip/DOCS/unRarLicense.txt +41 -0
  643. data/ext/p7zip/README +358 -0
  644. data/ext/p7zip/TODO +39 -0
  645. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/ChangeLog +41 -0
  646. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme +21 -0
  647. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme.u7z +30 -0
  648. data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/u7z +133 -0
  649. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/README +21 -0
  650. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/check.sh +117 -0
  651. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/files.tar +0 -0
  652. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1 +33 -0
  653. data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/p7zip +144 -0
  654. data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-shared +14 -0
  655. data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-static +10 -0
  656. data/ext/p7zip/install.sh +206 -0
  657. data/ext/p7zip/install_local_context_menu.sh +18 -0
  658. data/ext/p7zip/integration_context_menu.txt +51 -0
  659. data/ext/p7zip/makefile +181 -0
  660. data/ext/p7zip/makefile.aix_gcc +22 -0
  661. data/ext/p7zip/makefile.beos +18 -0
  662. data/ext/p7zip/makefile.crc32 +8 -0
  663. data/ext/p7zip/makefile.cygwin +20 -0
  664. data/ext/p7zip/makefile.cygwin_asm +21 -0
  665. data/ext/p7zip/makefile.djgpp_old +21 -0
  666. data/ext/p7zip/makefile.djgpp_watt +47 -0
  667. data/ext/p7zip/makefile.freebsd5 +20 -0
  668. data/ext/p7zip/makefile.freebsd6 +20 -0
  669. data/ext/p7zip/makefile.glb +39 -0
  670. data/ext/p7zip/makefile.gprof +18 -0
  671. data/ext/p7zip/makefile.hpux-acc +17 -0
  672. data/ext/p7zip/makefile.hpux-acc_64 +19 -0
  673. data/ext/p7zip/makefile.hpux-gcc +21 -0
  674. data/ext/p7zip/makefile.linux_amd64 +22 -0
  675. data/ext/p7zip/makefile.linux_amd64_asm +24 -0
  676. data/ext/p7zip/makefile.linux_amd64_asm_icc +27 -0
  677. data/ext/p7zip/makefile.linux_any_cpu +22 -0
  678. data/ext/p7zip/makefile.linux_any_cpu_gcc_4.X +24 -0
  679. data/ext/p7zip/makefile.linux_clang_amd64 +22 -0
  680. data/ext/p7zip/makefile.linux_cross_arm +22 -0
  681. data/ext/p7zip/makefile.linux_gcc_2.95_no_need_for_libstdc +20 -0
  682. data/ext/p7zip/makefile.linux_other +23 -0
  683. data/ext/p7zip/makefile.linux_s390x +23 -0
  684. data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X +26 -0
  685. data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X_fltk +26 -0
  686. data/ext/p7zip/makefile.linux_x86_asm_gcc_mudflap_4.X +26 -0
  687. data/ext/p7zip/makefile.linux_x86_asm_icc +25 -0
  688. data/ext/p7zip/makefile.linux_x86_icc +24 -0
  689. data/ext/p7zip/makefile.machine_base +22 -0
  690. data/ext/p7zip/makefile.macosx_32bits +20 -0
  691. data/ext/p7zip/makefile.macosx_32bits_asm +23 -0
  692. data/ext/p7zip/makefile.macosx_32bits_ppc +21 -0
  693. data/ext/p7zip/makefile.macosx_64bits +20 -0
  694. data/ext/p7zip/makefile.macosx_llvm_64bits +20 -0
  695. data/ext/p7zip/makefile.netbsd +21 -0
  696. data/ext/p7zip/makefile.netware_asm_gcc_3.X +41 -0
  697. data/ext/p7zip/makefile.oldmake +174 -0
  698. data/ext/p7zip/makefile.openbsd +20 -0
  699. data/ext/p7zip/makefile.openbsd_no_port +20 -0
  700. data/ext/p7zip/makefile.qnx_shared.bin +21 -0
  701. data/ext/p7zip/makefile.qnx_static +21 -0
  702. data/ext/p7zip/makefile.rules +661 -0
  703. data/ext/p7zip/makefile.solaris_sparc_CC_32 +21 -0
  704. data/ext/p7zip/makefile.solaris_sparc_CC_64 +23 -0
  705. data/ext/p7zip/makefile.solaris_sparc_gcc +21 -0
  706. data/ext/p7zip/makefile.solaris_x86 +19 -0
  707. data/ext/p7zip/makefile.tru64 +22 -0
  708. data/ext/seven_zip_ruby/depend +5 -0
  709. data/ext/seven_zip_ruby/extconf.rb +131 -0
  710. data/ext/seven_zip_ruby/guid_defs.h +29 -0
  711. data/ext/seven_zip_ruby/mutex.h +10 -0
  712. data/ext/seven_zip_ruby/posix/mutex.h +94 -0
  713. data/ext/seven_zip_ruby/seven_zip_archive.cpp +1614 -0
  714. data/ext/seven_zip_ruby/seven_zip_archive.h +515 -0
  715. data/ext/seven_zip_ruby/util_common.h +444 -0
  716. data/ext/seven_zip_ruby/utils.cpp +576 -0
  717. data/ext/seven_zip_ruby/utils.h +25 -0
  718. data/ext/seven_zip_ruby/win32/mutex.h +130 -0
  719. data/lib/seven_zip_ruby.rb +16 -0
  720. data/lib/seven_zip_ruby/7z.dll +0 -0
  721. data/lib/seven_zip_ruby/7z64.dll +0 -0
  722. data/lib/seven_zip_ruby/archive_info.rb +21 -0
  723. data/lib/seven_zip_ruby/entry_info.rb +45 -0
  724. data/lib/seven_zip_ruby/exception.rb +7 -0
  725. data/lib/seven_zip_ruby/seven_zip_reader.rb +180 -0
  726. data/lib/seven_zip_ruby/seven_zip_writer.rb +143 -0
  727. data/lib/seven_zip_ruby/update_info.rb +116 -0
  728. data/lib/seven_zip_ruby/version.rb +3 -0
  729. data/seven_zip_ruby.gemspec +26 -0
  730. data/spec/seven_zip_ruby_spec.rb +490 -0
  731. data/spec/seven_zip_ruby_spec_helper.rb +122 -0
  732. metadata +820 -0
@@ -0,0 +1,1752 @@
1
+ // PeHandler.cpp
2
+
3
+ #include "StdAfx.h"
4
+
5
+ #include "../../../C/CpuArch.h"
6
+
7
+ #include "Common/DynamicBuffer.h"
8
+ #include "Common/ComTry.h"
9
+ #include "Common/IntToString.h"
10
+ #include "Common/StringConvert.h"
11
+
12
+ #include "Windows/PropVariantUtils.h"
13
+ #include "Windows/Time.h"
14
+
15
+ #include "../Common/LimitedStreams.h"
16
+ #include "../Common/ProgressUtils.h"
17
+ #include "../Common/RegisterArc.h"
18
+ #include "../Common/StreamObjects.h"
19
+ #include "../Common/StreamUtils.h"
20
+
21
+ #include "../Compress/CopyCoder.h"
22
+
23
+ #define Get16(p) GetUi16(p)
24
+ #define Get32(p) GetUi32(p)
25
+ #define Get64(p) GetUi64(p)
26
+
27
+ using namespace NWindows;
28
+
29
+ namespace NArchive {
30
+ namespace NPe {
31
+
32
+ #define NUM_SCAN_SECTIONS_MAX (1 << 6)
33
+
34
+ #define PE_SIG 0x00004550
35
+ #define PE_OptHeader_Magic_32 0x10B
36
+ #define PE_OptHeader_Magic_64 0x20B
37
+
38
+ static AString GetDecString(UInt32 v)
39
+ {
40
+ char sz[32];
41
+ ConvertUInt64ToString(v, sz);
42
+ return sz;
43
+ }
44
+
45
+ struct CVersion
46
+ {
47
+ UInt16 Major;
48
+ UInt16 Minor;
49
+
50
+ void Parse(const Byte *buf);
51
+ AString GetString() const { return GetDecString(Major) + '.' + GetDecString(Minor); }
52
+ };
53
+
54
+ void CVersion::Parse(const Byte *p)
55
+ {
56
+ Major = Get16(p);
57
+ Minor = Get16(p + 2);
58
+ }
59
+
60
+ static const UInt32 kHeaderSize = 4 + 20;
61
+
62
+ struct CHeader
63
+ {
64
+ UInt16 NumSections;
65
+ UInt32 Time;
66
+ UInt32 PointerToSymbolTable;
67
+ UInt32 NumSymbols;
68
+ UInt16 OptHeaderSize;
69
+ UInt16 Flags;
70
+ UInt16 Machine;
71
+
72
+ bool Parse(const Byte *buf);
73
+ };
74
+
75
+ bool CHeader::Parse(const Byte *p)
76
+ {
77
+ if (Get32(p) != PE_SIG)
78
+ return false;
79
+ p += 4;
80
+ Machine = Get16(p + 0);
81
+ NumSections = Get16(p + 2);
82
+ Time = Get32(p + 4);
83
+ PointerToSymbolTable = Get32(p + 8);
84
+ NumSymbols = Get32(p + 12);
85
+ OptHeaderSize = Get16(p + 16);
86
+ Flags = Get16(p + 18);
87
+ return true;
88
+ }
89
+
90
+ struct CDirLink
91
+ {
92
+ UInt32 Va;
93
+ UInt32 Size;
94
+ void Parse(const Byte *p);
95
+ };
96
+
97
+ void CDirLink::Parse(const Byte *p)
98
+ {
99
+ Va = Get32(p);
100
+ Size = Get32(p + 4);
101
+ }
102
+
103
+ enum
104
+ {
105
+ kDirLink_Certificate = 4,
106
+ kDirLink_Debug = 6
107
+ };
108
+
109
+ struct CDebugEntry
110
+ {
111
+ UInt32 Flags;
112
+ UInt32 Time;
113
+ CVersion Ver;
114
+ UInt32 Type;
115
+ UInt32 Size;
116
+ UInt32 Va;
117
+ UInt32 Pa;
118
+
119
+ void Parse(const Byte *p);
120
+ };
121
+
122
+ void CDebugEntry::Parse(const Byte *p)
123
+ {
124
+ Flags = Get32(p);
125
+ Time = Get32(p + 4);
126
+ Ver.Parse(p + 8);
127
+ Type = Get32(p + 12);
128
+ Size = Get32(p + 16);
129
+ Va = Get32(p + 20);
130
+ Pa = Get32(p + 24);
131
+ }
132
+
133
+ static const UInt32 kNumDirItemsMax = 16;
134
+
135
+ struct COptHeader
136
+ {
137
+ UInt16 Magic;
138
+ Byte LinkerVerMajor;
139
+ Byte LinkerVerMinor;
140
+
141
+ UInt32 CodeSize;
142
+ UInt32 InitDataSize;
143
+ UInt32 UninitDataSize;
144
+
145
+ // UInt32 AddressOfEntryPoint;
146
+ // UInt32 BaseOfCode;
147
+ // UInt32 BaseOfData32;
148
+ UInt64 ImageBase;
149
+
150
+ UInt32 SectAlign;
151
+ UInt32 FileAlign;
152
+
153
+ CVersion OsVer;
154
+ CVersion ImageVer;
155
+ CVersion SubsysVer;
156
+
157
+ UInt32 ImageSize;
158
+ UInt32 HeadersSize;
159
+ UInt32 CheckSum;
160
+ UInt16 SubSystem;
161
+ UInt16 DllCharacts;
162
+
163
+ UInt64 StackReserve;
164
+ UInt64 StackCommit;
165
+ UInt64 HeapReserve;
166
+ UInt64 HeapCommit;
167
+
168
+ UInt32 NumDirItems;
169
+ CDirLink DirItems[kNumDirItemsMax];
170
+
171
+ bool Is64Bit() const { return Magic == PE_OptHeader_Magic_64; }
172
+ bool Parse(const Byte *p, UInt32 size);
173
+
174
+ int GetNumFileAlignBits() const
175
+ {
176
+ for (int i = 9; i <= 16; i++)
177
+ if (((UInt32)1 << i) == FileAlign)
178
+ return i;
179
+ return -1;
180
+ }
181
+ };
182
+
183
+ bool COptHeader::Parse(const Byte *p, UInt32 size)
184
+ {
185
+ Magic = Get16(p);
186
+ switch (Magic)
187
+ {
188
+ case PE_OptHeader_Magic_32:
189
+ case PE_OptHeader_Magic_64:
190
+ break;
191
+ default:
192
+ return false;
193
+ }
194
+ LinkerVerMajor = p[2];
195
+ LinkerVerMinor = p[3];
196
+
197
+ bool hdr64 = Is64Bit();
198
+
199
+ CodeSize = Get32(p + 4);
200
+ InitDataSize = Get32(p + 8);
201
+ UninitDataSize = Get32(p + 12);
202
+
203
+ // AddressOfEntryPoint = Get32(p + 16);
204
+ // BaseOfCode = Get32(p + 20);
205
+ // BaseOfData32 = hdr64 ? 0: Get32(p + 24);
206
+ ImageBase = hdr64 ? GetUi64(p + 24) : Get32(p + 28);
207
+
208
+ SectAlign = Get32(p + 32);
209
+ FileAlign = Get32(p + 36);
210
+
211
+ OsVer.Parse(p + 40);
212
+ ImageVer.Parse(p + 44);
213
+ SubsysVer.Parse(p + 48);
214
+
215
+ // reserved = Get32(p + 52);
216
+
217
+ ImageSize = Get32(p + 56);
218
+ HeadersSize = Get32(p + 60);
219
+ CheckSum = Get32(p + 64);
220
+ SubSystem = Get16(p + 68);
221
+ DllCharacts = Get16(p + 70);
222
+
223
+ if (hdr64)
224
+ {
225
+ StackReserve = Get64(p + 72);
226
+ StackCommit = Get64(p + 80);
227
+ HeapReserve = Get64(p + 88);
228
+ HeapCommit = Get64(p + 96);
229
+ }
230
+ else
231
+ {
232
+ StackReserve = Get32(p + 72);
233
+ StackCommit = Get32(p + 76);
234
+ HeapReserve = Get32(p + 80);
235
+ HeapCommit = Get32(p + 84);
236
+ }
237
+ UInt32 pos = (hdr64 ? 108 : 92);
238
+ NumDirItems = Get32(p + pos);
239
+ pos += 4;
240
+ if (pos + 8 * NumDirItems != size)
241
+ return false;
242
+ for (UInt32 i = 0; i < NumDirItems && i < kNumDirItemsMax; i++)
243
+ DirItems[i].Parse(p + pos + i * 8);
244
+ return true;
245
+ }
246
+
247
+ static const UInt32 kSectionSize = 40;
248
+
249
+ struct CSection
250
+ {
251
+ AString Name;
252
+
253
+ UInt32 VSize;
254
+ UInt32 Va;
255
+ UInt32 PSize;
256
+ UInt32 Pa;
257
+ UInt32 Flags;
258
+ UInt32 Time;
259
+ // UInt16 NumRelocs;
260
+ bool IsDebug;
261
+ bool IsRealSect;
262
+ bool IsAdditionalSection;
263
+
264
+ CSection(): IsRealSect(false), IsDebug(false), IsAdditionalSection(false) {}
265
+ UInt64 GetPackSize() const { return PSize; }
266
+
267
+ void UpdateTotalSize(UInt32 &totalSize)
268
+ {
269
+ UInt32 t = Pa + PSize;
270
+ if (t > totalSize)
271
+ totalSize = t;
272
+ }
273
+ void Parse(const Byte *p);
274
+ };
275
+
276
+ static bool operator <(const CSection &a1, const CSection &a2) { return (a1.Pa < a2.Pa) || ((a1.Pa == a2.Pa) && (a1.PSize < a2.PSize)) ; }
277
+ static bool operator ==(const CSection &a1, const CSection &a2) { return (a1.Pa == a2.Pa) && (a1.PSize == a2.PSize); }
278
+
279
+ static AString GetName(const Byte *name)
280
+ {
281
+ const int kNameSize = 8;
282
+ AString res;
283
+ char *p = res.GetBuffer(kNameSize);
284
+ memcpy(p, name, kNameSize);
285
+ p[kNameSize] = 0;
286
+ res.ReleaseBuffer();
287
+ return res;
288
+ }
289
+
290
+ void CSection::Parse(const Byte *p)
291
+ {
292
+ Name = GetName(p);
293
+ VSize = Get32(p + 8);
294
+ Va = Get32(p + 12);
295
+ PSize = Get32(p + 16);
296
+ Pa = Get32(p + 20);
297
+ // NumRelocs = Get16(p + 32);
298
+ Flags = Get32(p + 36);
299
+ }
300
+
301
+ static const CUInt32PCharPair g_HeaderCharacts[] =
302
+ {
303
+ { 1, "Executable" },
304
+ { 13, "DLL" },
305
+ { 8, "32-bit" },
306
+ { 5, "LargeAddress" },
307
+ { 0, "NoRelocs" },
308
+ { 2, "NoLineNums" },
309
+ { 3, "NoLocalSyms" },
310
+ { 4, "AggressiveWsTrim" },
311
+ { 9, "NoDebugInfo" },
312
+ { 10, "RemovableRun" },
313
+ { 11, "NetRun" },
314
+ { 12, "System" },
315
+ { 14, "UniCPU" },
316
+ { 7, "Little-Endian" },
317
+ { 15, "Big-Endian" }
318
+ };
319
+
320
+ static const CUInt32PCharPair g_DllCharacts[] =
321
+ {
322
+ { 6, "Relocated" },
323
+ { 7, "Integrity" },
324
+ { 8, "NX-Compatible" },
325
+ { 9, "NoIsolation" },
326
+ { 10, "NoSEH" },
327
+ { 11, "NoBind" },
328
+ { 13, "WDM" },
329
+ { 15, "TerminalServerAware" }
330
+ };
331
+
332
+ static const CUInt32PCharPair g_SectFlags[] =
333
+ {
334
+ { 3, "NoPad" },
335
+ { 5, "Code" },
336
+ { 6, "InitializedData" },
337
+ { 7, "UninitializedData" },
338
+ { 9, "Comments" },
339
+ { 11, "Remove" },
340
+ { 12, "COMDAT" },
341
+ { 15, "GP" },
342
+ { 24, "ExtendedRelocations" },
343
+ { 25, "Discardable" },
344
+ { 26, "NotCached" },
345
+ { 27, "NotPaged" },
346
+ { 28, "Shared" },
347
+ { 29, "Execute" },
348
+ { 30, "Read" },
349
+ { 31, "Write" }
350
+ };
351
+
352
+ static const CUInt32PCharPair g_MachinePairs[] =
353
+ {
354
+ { 0x014C, "x86" },
355
+ { 0x0162, "MIPS-R3000" },
356
+ { 0x0166, "MIPS-R4000" },
357
+ { 0x0168, "MIPS-R10000" },
358
+ { 0x0169, "MIPS-V2" },
359
+ { 0x0184, "Alpha" },
360
+ { 0x01A2, "SH3" },
361
+ { 0x01A3, "SH3-DSP" },
362
+ { 0x01A4, "SH3E" },
363
+ { 0x01A6, "SH4" },
364
+ { 0x01A8, "SH5" },
365
+ { 0x01C0, "ARM" },
366
+ { 0x01C2, "ARM-Thumb" },
367
+ { 0x01F0, "PPC" },
368
+ { 0x01F1, "PPC-FP" },
369
+ { 0x0200, "IA-64" },
370
+ { 0x0284, "Alpha-64" },
371
+ { 0x0200, "IA-64" },
372
+ { 0x0366, "MIPSFPU" },
373
+ { 0x8664, "x64" },
374
+ { 0x0EBC, "EFI" }
375
+ };
376
+
377
+ static const CUInt32PCharPair g_SubSystems[] =
378
+ {
379
+ { 0, "Unknown" },
380
+ { 1, "Native" },
381
+ { 2, "Windows GUI" },
382
+ { 3, "Windows CUI" },
383
+ { 7, "Posix" },
384
+ { 9, "Windows CE" },
385
+ { 10, "EFI" },
386
+ { 11, "EFI Boot" },
387
+ { 12, "EFI Runtime" },
388
+ { 13, "EFI ROM" },
389
+ { 14, "XBOX" }
390
+ };
391
+
392
+ static const wchar_t *g_ResTypes[] =
393
+ {
394
+ NULL,
395
+ L"CURSOR",
396
+ L"BITMAP",
397
+ L"ICON",
398
+ L"MENU",
399
+ L"DIALOG",
400
+ L"STRING",
401
+ L"FONTDIR",
402
+ L"FONT",
403
+ L"ACCELERATOR",
404
+ L"RCDATA",
405
+ L"MESSAGETABLE",
406
+ L"GROUP_CURSOR",
407
+ NULL,
408
+ L"GROUP_ICON",
409
+ NULL,
410
+ L"VERSION",
411
+ L"DLGINCLUDE",
412
+ NULL,
413
+ L"PLUGPLAY",
414
+ L"VXD",
415
+ L"ANICURSOR",
416
+ L"ANIICON",
417
+ L"HTML",
418
+ L"MANIFEST"
419
+ };
420
+
421
+ const UInt32 kFlag = (UInt32)1 << 31;
422
+ const UInt32 kMask = ~kFlag;
423
+
424
+ struct CTableItem
425
+ {
426
+ UInt32 Offset;
427
+ UInt32 ID;
428
+ };
429
+
430
+
431
+ const UInt32 kBmpHeaderSize = 14;
432
+ const UInt32 kIconHeaderSize = 22;
433
+
434
+ struct CResItem
435
+ {
436
+ UInt32 Type;
437
+ UInt32 ID;
438
+ UInt32 Lang;
439
+
440
+ UInt32 Size;
441
+ UInt32 Offset;
442
+
443
+ UInt32 HeaderSize;
444
+ Byte Header[kIconHeaderSize]; // it must be enough for max size header.
445
+ bool Enabled;
446
+
447
+ bool IsNameEqual(const CResItem &item) const { return Lang == item.Lang; }
448
+ UInt32 GetSize() const { return Size + HeaderSize; }
449
+ bool IsBmp() const { return Type == 2; }
450
+ bool IsIcon() const { return Type == 3; }
451
+ bool IsString() const { return Type == 6; }
452
+ bool IsRcData() const { return Type == 10; }
453
+ bool IsRcDataOrUnknown() const { return IsRcData() || Type > 64; }
454
+ };
455
+
456
+ struct CStringItem
457
+ {
458
+ UInt32 Lang;
459
+ UInt32 Size;
460
+ CByteDynamicBuffer Buf;
461
+
462
+ void AddChar(Byte c);
463
+ void AddWChar(UInt16 c);
464
+ };
465
+
466
+ void CStringItem::AddChar(Byte c)
467
+ {
468
+ Buf.EnsureCapacity(Size + 2);
469
+ Buf[Size++] = c;
470
+ Buf[Size++] = 0;
471
+ }
472
+
473
+ void CStringItem::AddWChar(UInt16 c)
474
+ {
475
+ if (c == '\n')
476
+ {
477
+ AddChar('\\');
478
+ c = 'n';
479
+ }
480
+ Buf.EnsureCapacity(Size + 2);
481
+ SetUi16(Buf + Size, c);
482
+ Size += 2;
483
+ }
484
+
485
+ struct CMixItem
486
+ {
487
+ int SectionIndex;
488
+ int ResourceIndex;
489
+ int StringIndex;
490
+
491
+ bool IsSectionItem() const { return ResourceIndex < 0 && StringIndex < 0; };
492
+ };
493
+
494
+ struct CUsedBitmap
495
+ {
496
+ CByteBuffer Buf;
497
+ public:
498
+ void Alloc(size_t size)
499
+ {
500
+ size = (size + 7) / 8;
501
+ Buf.SetCapacity(size);
502
+ memset(Buf, 0, size);
503
+ }
504
+ void Free()
505
+ {
506
+ Buf.SetCapacity(0);
507
+ }
508
+ bool SetRange(size_t from, int size)
509
+ {
510
+ for (int i = 0; i < size; i++)
511
+ {
512
+ size_t pos = (from + i) >> 3;
513
+ Byte mask = (Byte)(1 << ((from + i) & 7));
514
+ Byte b = Buf[pos];
515
+ if ((b & mask) != 0)
516
+ return false;
517
+ Buf[pos] = b | mask;
518
+ }
519
+ return true;
520
+ }
521
+ };
522
+
523
+
524
+ class CHandler:
525
+ public IInArchive,
526
+ public IInArchiveGetStream,
527
+ public CMyUnknownImp
528
+ {
529
+ CMyComPtr<IInStream> _stream;
530
+ CObjectVector<CSection> _sections;
531
+ UInt32 _peOffset;
532
+ CHeader _header;
533
+ COptHeader _optHeader;
534
+ UInt32 _totalSize;
535
+ UInt32 _totalSizeLimited;
536
+ Int32 _mainSubfile;
537
+
538
+ CRecordVector<CResItem> _items;
539
+ CObjectVector<CStringItem> _strings;
540
+
541
+ CByteBuffer _buf;
542
+ bool _oneLang;
543
+ UString _resourceFileName;
544
+ CUsedBitmap _usedRes;
545
+ bool _parseResources;
546
+
547
+ CRecordVector<CMixItem> _mixItems;
548
+
549
+ HRESULT LoadDebugSections(IInStream *stream, bool &thereIsSection);
550
+ HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback);
551
+ bool Parse(const Byte *buf, UInt32 size);
552
+
553
+ void AddResNameToString(UString &s, UInt32 id) const;
554
+ UString GetLangPrefix(UInt32 lang);
555
+ HRESULT ReadString(UInt32 offset, UString &dest) const;
556
+ HRESULT ReadTable(UInt32 offset, CRecordVector<CTableItem> &items);
557
+ bool ParseStringRes(UInt32 id, UInt32 lang, const Byte *src, UInt32 size);
558
+ HRESULT OpenResources(int sectIndex, IInStream *stream, IArchiveOpenCallback *callback);
559
+ void CloseResources();
560
+
561
+
562
+ bool CheckItem(const CSection &sect, const CResItem &item, size_t offset) const
563
+ {
564
+ return item.Offset >= sect.Va && offset <= _buf.GetCapacity() && _buf.GetCapacity() - offset >= item.Size;
565
+ }
566
+
567
+ public:
568
+ MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
569
+ INTERFACE_IInArchive(;)
570
+ STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
571
+ };
572
+
573
+ bool CHandler::Parse(const Byte *buf, UInt32 size)
574
+ {
575
+ UInt32 i;
576
+ if (size < 512)
577
+ return false;
578
+ _peOffset = Get32(buf + 0x3C);
579
+ if (_peOffset >= 0x1000 || _peOffset + 512 > size || (_peOffset & 7) != 0)
580
+ return false;
581
+
582
+ UInt32 pos = _peOffset;
583
+ if (!_header.Parse(buf + pos))
584
+ return false;
585
+ if (_header.OptHeaderSize > 512 || _header.NumSections > NUM_SCAN_SECTIONS_MAX)
586
+ return false;
587
+ pos += kHeaderSize;
588
+
589
+ if (!_optHeader.Parse(buf + pos, _header.OptHeaderSize))
590
+ return false;
591
+
592
+ pos += _header.OptHeaderSize;
593
+ _totalSize = pos;
594
+
595
+ for (i = 0; i < _header.NumSections; i++, pos += kSectionSize)
596
+ {
597
+ CSection sect;
598
+ if (pos + kSectionSize > size)
599
+ return false;
600
+ sect.Parse(buf + pos);
601
+ sect.IsRealSect = true;
602
+ sect.UpdateTotalSize(_totalSize);
603
+ _sections.Add(sect);
604
+ }
605
+
606
+ return true;
607
+ }
608
+
609
+ enum
610
+ {
611
+ kpidSectAlign = kpidUserDefined,
612
+ kpidFileAlign,
613
+ kpidLinkerVer,
614
+ kpidOsVer,
615
+ kpidImageVer,
616
+ kpidSubsysVer,
617
+ kpidCodeSize,
618
+ kpidImageSize,
619
+ kpidInitDataSize,
620
+ kpidUnInitDataSize,
621
+ kpidHeadersSizeUnInitDataSize,
622
+ kpidSubSystem,
623
+ kpidDllCharacts,
624
+ kpidStackReserve,
625
+ kpidStackCommit,
626
+ kpidHeapReserve,
627
+ kpidHeapCommit,
628
+ kpidImageBase
629
+ // kpidAddressOfEntryPoint,
630
+ // kpidBaseOfCode,
631
+ // kpidBaseOfData32,
632
+ };
633
+
634
+ STATPROPSTG kArcProps[] =
635
+ {
636
+ { NULL, kpidCpu, VT_BSTR},
637
+ { NULL, kpidBit64, VT_BOOL},
638
+ { NULL, kpidCharacts, VT_BSTR},
639
+ { NULL, kpidCTime, VT_FILETIME},
640
+ { NULL, kpidPhySize, VT_UI4},
641
+ { NULL, kpidHeadersSize, VT_UI4},
642
+ { NULL, kpidChecksum, VT_UI4},
643
+ { L"Image Size", kpidImageSize, VT_UI4},
644
+ { L"Section Alignment", kpidSectAlign, VT_UI4},
645
+ { L"File Alignment", kpidFileAlign, VT_UI4},
646
+ { L"Code Size", kpidCodeSize, VT_UI4},
647
+ { L"Initialized Data Size", kpidInitDataSize, VT_UI4},
648
+ { L"Uninitialized Data Size", kpidUnInitDataSize, VT_UI4},
649
+ { L"Linker Version", kpidLinkerVer, VT_BSTR},
650
+ { L"OS Version", kpidOsVer, VT_BSTR},
651
+ { L"Image Version", kpidImageVer, VT_BSTR},
652
+ { L"Subsystem Version", kpidSubsysVer, VT_BSTR},
653
+ { L"Subsystem", kpidSubSystem, VT_BSTR},
654
+ { L"DLL Characteristics", kpidDllCharacts, VT_BSTR},
655
+ { L"Stack Reserve", kpidStackReserve, VT_UI8},
656
+ { L"Stack Commit", kpidStackCommit, VT_UI8},
657
+ { L"Heap Reserve", kpidHeapReserve, VT_UI8},
658
+ { L"Heap Commit", kpidHeapCommit, VT_UI8},
659
+ { L"Image Base", kpidImageBase, VT_UI8}
660
+ // { L"Address Of Entry Point", kpidAddressOfEntryPoint, VT_UI8},
661
+ // { L"Base Of Code", kpidBaseOfCode, VT_UI8},
662
+ // { L"Base Of Data", kpidBaseOfData32, VT_UI8},
663
+ };
664
+
665
+ STATPROPSTG kProps[] =
666
+ {
667
+ { NULL, kpidPath, VT_BSTR},
668
+ { NULL, kpidSize, VT_UI8},
669
+ { NULL, kpidPackSize, VT_UI8},
670
+ { NULL, kpidCharacts, VT_BSTR},
671
+ { NULL, kpidOffset, VT_UI8},
672
+ { NULL, kpidVa, VT_UI8}
673
+ };
674
+
675
+ IMP_IInArchive_Props
676
+ IMP_IInArchive_ArcProps_WITH_NAME
677
+
678
+ static void VerToProp(const CVersion &v, NCOM::CPropVariant &prop)
679
+ {
680
+ StringToProp(v.GetString(), prop);
681
+ }
682
+
683
+ void TimeToProp(UInt32 unixTime, NCOM::CPropVariant &prop)
684
+ {
685
+ if (unixTime != 0)
686
+ {
687
+ FILETIME ft;
688
+ NTime::UnixTimeToFileTime(unixTime, ft);
689
+ prop = ft;
690
+ }
691
+ }
692
+
693
+ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
694
+ {
695
+ COM_TRY_BEGIN
696
+ NCOM::CPropVariant prop;
697
+ switch(propID)
698
+ {
699
+ case kpidSectAlign: prop = _optHeader.SectAlign; break;
700
+ case kpidFileAlign: prop = _optHeader.FileAlign; break;
701
+ case kpidLinkerVer:
702
+ {
703
+ CVersion v = { _optHeader.LinkerVerMajor, _optHeader.LinkerVerMinor };
704
+ VerToProp(v, prop);
705
+ break;
706
+ }
707
+
708
+ case kpidOsVer: VerToProp(_optHeader.OsVer, prop); break;
709
+ case kpidImageVer: VerToProp(_optHeader.ImageVer, prop); break;
710
+ case kpidSubsysVer: VerToProp(_optHeader.SubsysVer, prop); break;
711
+ case kpidCodeSize: prop = _optHeader.CodeSize; break;
712
+ case kpidInitDataSize: prop = _optHeader.InitDataSize; break;
713
+ case kpidUnInitDataSize: prop = _optHeader.UninitDataSize; break;
714
+ case kpidImageSize: prop = _optHeader.ImageSize; break;
715
+ case kpidPhySize: prop = _totalSize; break;
716
+ case kpidHeadersSize: prop = _optHeader.HeadersSize; break;
717
+ case kpidChecksum: prop = _optHeader.CheckSum; break;
718
+
719
+ case kpidCpu: PAIR_TO_PROP(g_MachinePairs, _header.Machine, prop); break;
720
+ case kpidBit64: if (_optHeader.Is64Bit()) prop = true; break;
721
+ case kpidSubSystem: PAIR_TO_PROP(g_SubSystems, _optHeader.SubSystem, prop); break;
722
+
723
+ case kpidMTime:
724
+ case kpidCTime: TimeToProp(_header.Time, prop); break;
725
+ case kpidCharacts: FLAGS_TO_PROP(g_HeaderCharacts, _header.Flags, prop); break;
726
+ case kpidDllCharacts: FLAGS_TO_PROP(g_DllCharacts, _optHeader.DllCharacts, prop); break;
727
+ case kpidStackReserve: prop = _optHeader.StackReserve; break;
728
+ case kpidStackCommit: prop = _optHeader.StackCommit; break;
729
+ case kpidHeapReserve: prop = _optHeader.HeapReserve; break;
730
+ case kpidHeapCommit: prop = _optHeader.HeapCommit; break;
731
+
732
+ case kpidImageBase: prop = _optHeader.ImageBase; break;
733
+ // case kpidAddressOfEntryPoint: prop = _optHeader.AddressOfEntryPoint; break;
734
+ // case kpidBaseOfCode: prop = _optHeader.BaseOfCode; break;
735
+ // case kpidBaseOfData32: if (!_optHeader.Is64Bit()) prop = _optHeader.BaseOfData32; break;
736
+
737
+ case kpidMainSubfile: if (_mainSubfile >= 0) prop = (UInt32)_mainSubfile; break;
738
+ }
739
+ prop.Detach(value);
740
+ return S_OK;
741
+ COM_TRY_END
742
+ }
743
+
744
+ void CHandler::AddResNameToString(UString &s, UInt32 id) const
745
+ {
746
+ if ((id & kFlag) != 0)
747
+ {
748
+ UString name;
749
+ if (ReadString(id & kMask, name) == S_OK)
750
+ {
751
+ if (name.IsEmpty())
752
+ s += L"[]";
753
+ else
754
+ {
755
+ if (name.Length() > 1 && name[0] == '"' && name.Back() == '"')
756
+ name = name.Mid(1, name.Length() - 2);
757
+ s += name;
758
+ }
759
+ return;
760
+ }
761
+ }
762
+ wchar_t sz[32];
763
+ ConvertUInt32ToString(id, sz);
764
+ s += sz;
765
+ }
766
+
767
+ UString CHandler::GetLangPrefix(UInt32 lang)
768
+ {
769
+ UString s = _resourceFileName;
770
+ s += WCHAR_PATH_SEPARATOR;
771
+ if (!_oneLang)
772
+ {
773
+ AddResNameToString(s, lang);
774
+ s += WCHAR_PATH_SEPARATOR;
775
+ }
776
+ return s;
777
+ }
778
+
779
+ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
780
+ {
781
+ COM_TRY_BEGIN
782
+ NCOM::CPropVariant prop;
783
+ const CMixItem &mixItem = _mixItems[index];
784
+ if (mixItem.StringIndex >= 0)
785
+ {
786
+ const CStringItem &item = _strings[mixItem.StringIndex];
787
+ switch(propID)
788
+ {
789
+ case kpidPath: prop = GetLangPrefix(item.Lang) + L"string.txt"; break;
790
+ case kpidSize:
791
+ case kpidPackSize:
792
+ prop = (UInt64)item.Size; break;
793
+ }
794
+ }
795
+ else if (mixItem.ResourceIndex < 0)
796
+ {
797
+ const CSection &item = _sections[mixItem.SectionIndex];
798
+ switch(propID)
799
+ {
800
+ case kpidPath: StringToProp(item.Name, prop); break;
801
+ case kpidSize: prop = (UInt64)item.VSize; break;
802
+ case kpidPackSize: prop = (UInt64)item.GetPackSize(); break;
803
+ case kpidOffset: prop = item.Pa; break;
804
+ case kpidVa: if (item.IsRealSect) prop = item.Va; break;
805
+ case kpidMTime:
806
+ case kpidCTime:
807
+ TimeToProp(item.IsDebug ? item.Time : _header.Time, prop); break;
808
+ case kpidCharacts: if (item.IsRealSect) FLAGS_TO_PROP(g_SectFlags, item.Flags, prop); break;
809
+ }
810
+ }
811
+ else
812
+ {
813
+ const CResItem &item = _items[mixItem.ResourceIndex];
814
+ switch(propID)
815
+ {
816
+ case kpidPath:
817
+ {
818
+ UString s = GetLangPrefix(item.Lang);
819
+ {
820
+ const wchar_t *p = NULL;
821
+ if (item.Type < sizeof(g_ResTypes) / sizeof(g_ResTypes[0]))
822
+ p = g_ResTypes[item.Type];
823
+ if (p != 0)
824
+ s += p;
825
+ else
826
+ AddResNameToString(s, item.Type);
827
+ }
828
+ s += WCHAR_PATH_SEPARATOR;
829
+ AddResNameToString(s, item.ID);
830
+ if (item.HeaderSize != 0)
831
+ {
832
+ if (item.IsBmp())
833
+ s += L".bmp";
834
+ else if (item.IsIcon())
835
+ s += L".ico";
836
+ }
837
+ prop = s;
838
+ break;
839
+ }
840
+ case kpidSize: prop = (UInt64)item.GetSize(); break;
841
+ case kpidPackSize: prop = (UInt64)item.Size; break;
842
+ }
843
+ }
844
+ prop.Detach(value);
845
+ return S_OK;
846
+ COM_TRY_END
847
+ }
848
+
849
+ HRESULT CHandler::LoadDebugSections(IInStream *stream, bool &thereIsSection)
850
+ {
851
+ thereIsSection = false;
852
+ const CDirLink &debugLink = _optHeader.DirItems[kDirLink_Debug];
853
+ if (debugLink.Size == 0)
854
+ return S_OK;
855
+ const unsigned kEntrySize = 28;
856
+ UInt32 numItems = debugLink.Size / kEntrySize;
857
+ if (numItems * kEntrySize != debugLink.Size || numItems > 16)
858
+ return S_FALSE;
859
+
860
+ UInt64 pa = 0;
861
+ int i;
862
+ for (i = 0; i < _sections.Size(); i++)
863
+ {
864
+ const CSection &sect = _sections[i];
865
+ if (sect.Va < debugLink.Va && debugLink.Va + debugLink.Size <= sect.Va + sect.PSize)
866
+ {
867
+ pa = sect.Pa + (debugLink.Va - sect.Va);
868
+ break;
869
+ }
870
+ }
871
+ if (i == _sections.Size())
872
+ {
873
+ return S_OK;
874
+ // Exe for ARM requires S_OK
875
+ // return S_FALSE;
876
+ }
877
+
878
+ CByteBuffer buffer;
879
+ buffer.SetCapacity(debugLink.Size);
880
+ Byte *buf = buffer;
881
+
882
+ RINOK(stream->Seek(pa, STREAM_SEEK_SET, NULL));
883
+ RINOK(ReadStream_FALSE(stream, buf, debugLink.Size));
884
+
885
+ for (i = 0; i < (int)numItems; i++)
886
+ {
887
+ CDebugEntry de;
888
+ de.Parse(buf);
889
+
890
+ if (de.Size == 0)
891
+ continue;
892
+
893
+ CSection sect;
894
+ sect.Name = ".debug" + GetDecString(i);
895
+
896
+ sect.IsDebug = true;
897
+ sect.Time = de.Time;
898
+ sect.Va = de.Va;
899
+ sect.Pa = de.Pa;
900
+ sect.PSize = sect.VSize = de.Size;
901
+ UInt32 totalSize = sect.Pa + sect.PSize;
902
+ if (totalSize > _totalSize)
903
+ {
904
+ _totalSize = totalSize;
905
+ _sections.Add(sect);
906
+ thereIsSection = true;
907
+ }
908
+ buf += kEntrySize;
909
+ }
910
+
911
+ return S_OK;
912
+ }
913
+
914
+ HRESULT CHandler::ReadString(UInt32 offset, UString &dest) const
915
+ {
916
+ if ((offset & 1) != 0 || offset >= _buf.GetCapacity())
917
+ return S_FALSE;
918
+ size_t rem = _buf.GetCapacity() - offset;
919
+ if (rem < 2)
920
+ return S_FALSE;
921
+ unsigned length = Get16(_buf + offset);
922
+ if ((rem - 2) / 2 < length)
923
+ return S_FALSE;
924
+ dest.Empty();
925
+ offset += 2;
926
+ for (unsigned i = 0; i < length; i++)
927
+ dest += (wchar_t)Get16(_buf + offset + i * 2);
928
+ return S_OK;
929
+ }
930
+
931
+ HRESULT CHandler::ReadTable(UInt32 offset, CRecordVector<CTableItem> &items)
932
+ {
933
+ if ((offset & 3) != 0 || offset >= _buf.GetCapacity())
934
+ return S_FALSE;
935
+ size_t rem = _buf.GetCapacity() - offset;
936
+ if (rem < 16)
937
+ return S_FALSE;
938
+ items.Clear();
939
+ unsigned numNameItems = Get16(_buf + offset + 12);
940
+ unsigned numIdItems = Get16(_buf + offset + 14);
941
+ unsigned numItems = numNameItems + numIdItems;
942
+ if ((rem - 16) / 8 < numItems)
943
+ return S_FALSE;
944
+ if (!_usedRes.SetRange(offset, 16 + numItems * 8))
945
+ return S_FALSE;
946
+ offset += 16;
947
+ _oneLang = true;
948
+ unsigned i;
949
+ for (i = 0; i < numItems; i++)
950
+ {
951
+ CTableItem item;
952
+ const Byte *buf = _buf + offset;
953
+ offset += 8;
954
+ item.ID = Get32(buf + 0);
955
+ if (((item.ID & kFlag) != 0) != (i < numNameItems))
956
+ return S_FALSE;
957
+ item.Offset = Get32(buf + 4);
958
+ items.Add(item);
959
+ }
960
+ return S_OK;
961
+ }
962
+
963
+ static const UInt32 kFileSizeMax = (UInt32)1 << 30;
964
+ static const int kNumResItemsMax = (UInt32)1 << 23;
965
+ static const int kNumStringLangsMax = 128;
966
+
967
+ // BITMAPINFOHEADER
968
+ struct CBitmapInfoHeader
969
+ {
970
+ // UInt32 HeaderSize;
971
+ UInt32 XSize;
972
+ Int32 YSize;
973
+ UInt16 Planes;
974
+ UInt16 BitCount;
975
+ UInt32 Compression;
976
+ UInt32 SizeImage;
977
+
978
+ bool Parse(const Byte *p, size_t size);
979
+ };
980
+
981
+ static const UInt32 kBitmapInfoHeader_Size = 0x28;
982
+
983
+ bool CBitmapInfoHeader::Parse(const Byte *p, size_t size)
984
+ {
985
+ if (size < kBitmapInfoHeader_Size || Get32(p) != kBitmapInfoHeader_Size)
986
+ return false;
987
+ XSize = Get32(p + 4);
988
+ YSize = (Int32)Get32(p + 8);
989
+ Planes = Get16(p + 12);
990
+ BitCount = Get16(p + 14);
991
+ Compression = Get32(p + 16);
992
+ SizeImage = Get32(p + 20);
993
+ return true;
994
+ }
995
+
996
+ static UInt32 GetImageSize(UInt32 xSize, UInt32 ySize, UInt32 bitCount)
997
+ {
998
+ return ((xSize * bitCount + 7) / 8 + 3) / 4 * 4 * ySize;
999
+ }
1000
+
1001
+ static UInt32 SetBitmapHeader(Byte *dest, const Byte *src, UInt32 size)
1002
+ {
1003
+ CBitmapInfoHeader h;
1004
+ if (!h.Parse(src, size))
1005
+ return 0;
1006
+ if (h.YSize < 0)
1007
+ h.YSize = -h.YSize;
1008
+ if (h.XSize > (1 << 26) || h.YSize > (1 << 26) || h.Planes != 1 || h.BitCount > 32 ||
1009
+ h.Compression != 0) // BI_RGB
1010
+ return 0;
1011
+ if (h.SizeImage == 0)
1012
+ h.SizeImage = GetImageSize(h.XSize, h.YSize, h.BitCount);
1013
+ UInt32 totalSize = kBmpHeaderSize + size;
1014
+ UInt32 offBits = totalSize - h.SizeImage;
1015
+ // BITMAPFILEHEADER
1016
+ SetUi16(dest, 0x4D42);
1017
+ SetUi32(dest + 2, totalSize);
1018
+ SetUi32(dest + 6, 0);
1019
+ SetUi32(dest + 10, offBits);
1020
+ return kBmpHeaderSize;
1021
+ }
1022
+
1023
+ static UInt32 SetIconHeader(Byte *dest, const Byte *src, UInt32 size)
1024
+ {
1025
+ CBitmapInfoHeader h;
1026
+ if (!h.Parse(src, size))
1027
+ return 0;
1028
+ if (h.YSize < 0)
1029
+ h.YSize = -h.YSize;
1030
+ if (h.XSize > (1 << 26) || h.YSize > (1 << 26) || h.Planes != 1 ||
1031
+ h.Compression != 0) // BI_RGB
1032
+ return 0;
1033
+
1034
+ UInt32 numBitCount = h.BitCount;
1035
+ if (numBitCount != 1 &&
1036
+ numBitCount != 4 &&
1037
+ numBitCount != 8 &&
1038
+ numBitCount != 24 &&
1039
+ numBitCount != 32)
1040
+ return 0;
1041
+
1042
+ if ((h.YSize & 1) != 0)
1043
+ return 0;
1044
+ h.YSize /= 2;
1045
+ if (h.XSize > 0x100 || h.YSize > 0x100)
1046
+ return 0;
1047
+
1048
+ UInt32 imageSize;
1049
+ // imageSize is not correct if AND mask array contains zeros
1050
+ // in this case it is equal image1Size
1051
+
1052
+ // UInt32 imageSize = h.SizeImage;
1053
+ // if (imageSize == 0)
1054
+ // {
1055
+ UInt32 image1Size = GetImageSize(h.XSize, h.YSize, h.BitCount);
1056
+ UInt32 image2Size = GetImageSize(h.XSize, h.YSize, 1);
1057
+ imageSize = image1Size + image2Size;
1058
+ // }
1059
+ UInt32 numColors = 0;
1060
+ if (numBitCount < 16)
1061
+ numColors = 1 << numBitCount;
1062
+
1063
+ SetUi16(dest, 0); // Reserved
1064
+ SetUi16(dest + 2, 1); // RES_ICON
1065
+ SetUi16(dest + 4, 1); // ResCount
1066
+
1067
+ dest[6] = (Byte)h.XSize; // Width
1068
+ dest[7] = (Byte)h.YSize; // Height
1069
+ dest[8] = (Byte)numColors; // ColorCount
1070
+ dest[9] = 0; // Reserved
1071
+
1072
+ SetUi32(dest + 10, 0); // Reserved1 / Reserved2
1073
+
1074
+ UInt32 numQuadsBytes = numColors * 4;
1075
+ UInt32 BytesInRes = kBitmapInfoHeader_Size + numQuadsBytes + imageSize;
1076
+ SetUi32(dest + 14, BytesInRes);
1077
+ SetUi32(dest + 18, kIconHeaderSize);
1078
+
1079
+ /*
1080
+ Description = DWORDToString(xSize) +
1081
+ kDelimiterChar + DWORDToString(ySize) +
1082
+ kDelimiterChar + DWORDToString(numBitCount);
1083
+ */
1084
+ return kIconHeaderSize;
1085
+ }
1086
+
1087
+ bool CHandler::ParseStringRes(UInt32 id, UInt32 lang, const Byte *src, UInt32 size)
1088
+ {
1089
+ if ((size & 1) != 0)
1090
+ return false;
1091
+
1092
+ int i;
1093
+ for (i = 0; i < _strings.Size(); i++)
1094
+ if (_strings[i].Lang == lang)
1095
+ break;
1096
+ if (i == _strings.Size())
1097
+ {
1098
+ if (_strings.Size() >= kNumStringLangsMax)
1099
+ return false;
1100
+ CStringItem item;
1101
+ item.Size = 0;
1102
+ item.Lang = lang;
1103
+ i = _strings.Add(item);
1104
+ }
1105
+
1106
+ CStringItem &item = _strings[i];
1107
+ id = (id - 1) << 4;
1108
+ UInt32 pos = 0;
1109
+ for (i = 0; i < 16; i++)
1110
+ {
1111
+ if (size - pos < 2)
1112
+ return false;
1113
+ UInt32 len = Get16(src + pos);
1114
+ pos += 2;
1115
+ if (len != 0)
1116
+ {
1117
+ if (size - pos < len * 2)
1118
+ return false;
1119
+ char temp[32];
1120
+ ConvertUInt32ToString(id + i, temp);
1121
+ size_t tempLen = strlen(temp);
1122
+ size_t j;
1123
+ for (j = 0; j < tempLen; j++)
1124
+ item.AddChar(temp[j]);
1125
+ item.AddChar('\t');
1126
+ for (j = 0; j < len; j++, pos += 2)
1127
+ item.AddWChar(Get16(src + pos));
1128
+ item.AddChar(0x0D);
1129
+ item.AddChar(0x0A);
1130
+ }
1131
+ }
1132
+ return (size == pos);
1133
+ }
1134
+
1135
+ HRESULT CHandler::OpenResources(int sectionIndex, IInStream *stream, IArchiveOpenCallback *callback)
1136
+ {
1137
+ const CSection &sect = _sections[sectionIndex];
1138
+ size_t fileSize = sect.PSize; // Maybe we need sect.VSize here !!!
1139
+ if (fileSize > kFileSizeMax)
1140
+ return S_FALSE;
1141
+ {
1142
+ UInt64 fileSize64 = fileSize;
1143
+ if (callback)
1144
+ RINOK(callback->SetTotal(NULL, &fileSize64));
1145
+ RINOK(stream->Seek(sect.Pa, STREAM_SEEK_SET, NULL));
1146
+ _buf.SetCapacity(fileSize);
1147
+ for (size_t pos = 0; pos < fileSize;)
1148
+ {
1149
+ UInt64 offset64 = pos;
1150
+ if (callback)
1151
+ RINOK(callback->SetCompleted(NULL, &offset64))
1152
+ size_t rem = MyMin(fileSize - pos, (size_t)(1 << 20));
1153
+ RINOK(ReadStream_FALSE(stream, _buf + pos, rem));
1154
+ pos += rem;
1155
+ }
1156
+ }
1157
+
1158
+ _usedRes.Alloc(fileSize);
1159
+ CRecordVector<CTableItem> specItems;
1160
+ RINOK(ReadTable(0, specItems));
1161
+
1162
+ _oneLang = true;
1163
+ bool stringsOk = true;
1164
+ size_t maxOffset = 0;
1165
+ for (int i = 0; i < specItems.Size(); i++)
1166
+ {
1167
+ const CTableItem &item1 = specItems[i];
1168
+ if ((item1.Offset & kFlag) == 0)
1169
+ return S_FALSE;
1170
+
1171
+ CRecordVector<CTableItem> specItems2;
1172
+ RINOK(ReadTable(item1.Offset & kMask, specItems2));
1173
+
1174
+ for (int j = 0; j < specItems2.Size(); j++)
1175
+ {
1176
+ const CTableItem &item2 = specItems2[j];
1177
+ if ((item2.Offset & kFlag) == 0)
1178
+ return S_FALSE;
1179
+
1180
+ CRecordVector<CTableItem> specItems3;
1181
+ RINOK(ReadTable(item2.Offset & kMask, specItems3));
1182
+
1183
+ CResItem item;
1184
+ item.Type = item1.ID;
1185
+ item.ID = item2.ID;
1186
+
1187
+ for (int k = 0; k < specItems3.Size(); k++)
1188
+ {
1189
+ if (_items.Size() >= kNumResItemsMax)
1190
+ return S_FALSE;
1191
+ const CTableItem &item3 = specItems3[k];
1192
+ if ((item3.Offset & kFlag) != 0)
1193
+ return S_FALSE;
1194
+ if (item3.Offset >= _buf.GetCapacity() || _buf.GetCapacity() - item3.Offset < 16)
1195
+ return S_FALSE;
1196
+ const Byte *buf = _buf + item3.Offset;
1197
+ item.Lang = item3.ID;
1198
+ item.Offset = Get32(buf + 0);
1199
+ item.Size = Get32(buf + 4);
1200
+ // UInt32 codePage = Get32(buf + 8);
1201
+ if (Get32(buf + 12) != 0)
1202
+ return S_FALSE;
1203
+ if (!_items.IsEmpty() && _oneLang && !item.IsNameEqual(_items.Back()))
1204
+ _oneLang = false;
1205
+
1206
+ item.HeaderSize = 0;
1207
+
1208
+ size_t offset = item.Offset - sect.Va;
1209
+ if (offset > maxOffset)
1210
+ maxOffset = offset;
1211
+ if (offset + item.Size > maxOffset)
1212
+ maxOffset = offset + item.Size;
1213
+
1214
+ if (CheckItem(sect, item, offset))
1215
+ {
1216
+ const Byte *data = _buf + offset;
1217
+ if (item.IsBmp())
1218
+ item.HeaderSize = SetBitmapHeader(item.Header, data, item.Size);
1219
+ else if (item.IsIcon())
1220
+ item.HeaderSize = SetIconHeader(item.Header, data, item.Size);
1221
+ else if (item.IsString())
1222
+ {
1223
+ if (stringsOk)
1224
+ stringsOk = ParseStringRes(item.ID, item.Lang, data, item.Size);
1225
+ }
1226
+ }
1227
+
1228
+ item.Enabled = true;
1229
+ _items.Add(item);
1230
+ }
1231
+ }
1232
+ }
1233
+
1234
+ if (stringsOk && !_strings.IsEmpty())
1235
+ {
1236
+ int i;
1237
+ for (i = 0; i < _items.Size(); i++)
1238
+ {
1239
+ CResItem &item = _items[i];
1240
+ if (item.IsString())
1241
+ item.Enabled = false;
1242
+ }
1243
+ for (i = 0; i < _strings.Size(); i++)
1244
+ {
1245
+ if (_strings[i].Size == 0)
1246
+ continue;
1247
+ CMixItem mixItem;
1248
+ mixItem.ResourceIndex = -1;
1249
+ mixItem.StringIndex = i;
1250
+ mixItem.SectionIndex = sectionIndex;
1251
+ _mixItems.Add(mixItem);
1252
+ }
1253
+ }
1254
+
1255
+ _usedRes.Free();
1256
+
1257
+ int numBits = _optHeader.GetNumFileAlignBits();
1258
+ if (numBits >= 0)
1259
+ {
1260
+ UInt32 mask = (1 << numBits) - 1;
1261
+ size_t end = ((maxOffset + mask) & ~mask);
1262
+ if (end < sect.VSize && end <= sect.PSize)
1263
+ {
1264
+ CSection sect2;
1265
+ sect2.Flags = 0;
1266
+
1267
+ // we skip Zeros to start of aligned block
1268
+ size_t i;
1269
+ for (i = maxOffset; i < end; i++)
1270
+ if (_buf[i] != 0)
1271
+ break;
1272
+ if (i == end)
1273
+ maxOffset = end;
1274
+
1275
+ sect2.Pa = sect.Pa + (UInt32)maxOffset;
1276
+ sect2.Va = sect.Va + (UInt32)maxOffset;
1277
+ sect2.PSize = sect.VSize - (UInt32)maxOffset;
1278
+ sect2.VSize = sect2.PSize;
1279
+ sect2.Name = ".rsrc_1";
1280
+ sect2.Time = 0;
1281
+ sect2.IsAdditionalSection = true;
1282
+ _sections.Add(sect2);
1283
+ }
1284
+ }
1285
+
1286
+ return S_OK;
1287
+ }
1288
+
1289
+ HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback)
1290
+ {
1291
+ const UInt32 kBufSize = 1 << 18;
1292
+ const UInt32 kSigSize = 2;
1293
+
1294
+ _mainSubfile = -1;
1295
+
1296
+ CByteBuffer buffer;
1297
+ buffer.SetCapacity(kBufSize);
1298
+ Byte *buf = buffer;
1299
+
1300
+ size_t processed = kSigSize;
1301
+ RINOK(ReadStream_FALSE(stream, buf, processed));
1302
+ if (buf[0] != 'M' || buf[1] != 'Z')
1303
+ return S_FALSE;
1304
+ processed = kBufSize - kSigSize;
1305
+ RINOK(ReadStream(stream, buf + kSigSize, &processed));
1306
+ processed += kSigSize;
1307
+ if (!Parse(buf, (UInt32)processed))
1308
+ return S_FALSE;
1309
+ bool thereISDebug;
1310
+ RINOK(LoadDebugSections(stream, thereISDebug));
1311
+
1312
+ const CDirLink &certLink = _optHeader.DirItems[kDirLink_Certificate];
1313
+ if (certLink.Size != 0)
1314
+ {
1315
+ CSection sect;
1316
+ sect.Name = "CERTIFICATE";
1317
+ sect.Va = 0;
1318
+ sect.Pa = certLink.Va;
1319
+ sect.PSize = sect.VSize = certLink.Size;
1320
+ sect.UpdateTotalSize(_totalSize);
1321
+ _sections.Add(sect);
1322
+ }
1323
+
1324
+ if (thereISDebug)
1325
+ {
1326
+ const UInt32 kAlign = 1 << 12;
1327
+ UInt32 alignPos = _totalSize & (kAlign - 1);
1328
+ if (alignPos != 0)
1329
+ {
1330
+ UInt32 size = kAlign - alignPos;
1331
+ RINOK(stream->Seek(_totalSize, STREAM_SEEK_SET, NULL));
1332
+ buffer.Free();
1333
+ buffer.SetCapacity(kAlign);
1334
+ Byte *buf = buffer;
1335
+ size_t processed = size;
1336
+ RINOK(ReadStream(stream, buf, &processed));
1337
+ size_t i;
1338
+ for (i = 0; i < processed; i++)
1339
+ {
1340
+ if (buf[i] != 0)
1341
+ break;
1342
+ }
1343
+ if (processed < size && processed < 100)
1344
+ _totalSize += (UInt32)processed;
1345
+ else if (((_totalSize + i) & 0x1FF) == 0 || processed < size)
1346
+ _totalSize += (UInt32)i;
1347
+ }
1348
+ }
1349
+
1350
+ if (_header.NumSymbols > 0 && _header.PointerToSymbolTable >= 512)
1351
+ {
1352
+ if (_header.NumSymbols >= (1 << 24))
1353
+ return S_FALSE;
1354
+ CSection sect;
1355
+ sect.Name = "COFF_SYMBOLS";
1356
+ UInt32 size = _header.NumSymbols * 18;
1357
+ RINOK(stream->Seek((UInt64)_header.PointerToSymbolTable + size, STREAM_SEEK_SET, NULL));
1358
+ Byte buf[4];
1359
+ RINOK(ReadStream_FALSE(stream, buf, 4));
1360
+ UInt32 size2 = Get32(buf);
1361
+ if (size2 >= (1 << 28))
1362
+ return S_FALSE;
1363
+ size += size2;
1364
+
1365
+ sect.Va = 0;
1366
+ sect.Pa = _header.PointerToSymbolTable;
1367
+ sect.PSize = sect.VSize = size;
1368
+ sect.UpdateTotalSize(_totalSize);
1369
+ _sections.Add(sect);
1370
+ }
1371
+
1372
+ UInt64 fileSize;
1373
+ RINOK(stream->Seek(0, STREAM_SEEK_END, &fileSize));
1374
+ if (fileSize > _totalSize)
1375
+ return S_FALSE;
1376
+ _totalSizeLimited = (_totalSize < fileSize) ? _totalSize : (UInt32)fileSize;
1377
+
1378
+ {
1379
+ CObjectVector<CSection> sections = _sections;
1380
+ sections.Sort();
1381
+ UInt32 limit = (1 << 12);
1382
+ int num = 0;
1383
+ int numSections = sections.Size();
1384
+ for (int i = 0; i < numSections; i++)
1385
+ {
1386
+ const CSection &s = sections[i];
1387
+ if (s.Pa > limit)
1388
+ {
1389
+ CSection s2;
1390
+ s2.Pa = s2.Va = limit;
1391
+ s2.PSize = s2.VSize = s.Pa - limit;
1392
+ s2.IsAdditionalSection = true;
1393
+ s2.Name = '[';
1394
+ s2.Name += GetDecString(num++);
1395
+ s2.Name += ']';
1396
+ _sections.Add(s2);
1397
+ limit = s.Pa;
1398
+ }
1399
+ UInt32 next = s.Pa + s.PSize;
1400
+ if (next < s.Pa)
1401
+ break;
1402
+ if (next >= limit)
1403
+ limit = next;
1404
+ }
1405
+ }
1406
+
1407
+ _parseResources = true;
1408
+
1409
+ UInt64 mainSize = 0, mainSize2 = 0;
1410
+ int i;
1411
+ for (i = 0; i < _sections.Size(); i++)
1412
+ {
1413
+ const CSection &sect = _sections[i];
1414
+ CMixItem mixItem;
1415
+ mixItem.SectionIndex = i;
1416
+ if (_parseResources && sect.Name == ".rsrc" && _items.IsEmpty())
1417
+ {
1418
+ HRESULT res = OpenResources(i, stream, callback);
1419
+ if (res == S_OK)
1420
+ {
1421
+ _resourceFileName = GetUnicodeString(sect.Name);
1422
+ for (int j = 0; j < _items.Size(); j++)
1423
+ {
1424
+ const CResItem &item = _items[j];
1425
+ if (item.Enabled)
1426
+ {
1427
+ mixItem.ResourceIndex = j;
1428
+ mixItem.StringIndex = -1;
1429
+ if (item.IsRcDataOrUnknown())
1430
+ {
1431
+ if (item.Size >= mainSize)
1432
+ {
1433
+ mainSize2 = mainSize;
1434
+ mainSize = item.Size;
1435
+ _mainSubfile = _mixItems.Size();
1436
+ }
1437
+ else if (item.Size >= mainSize2)
1438
+ mainSize2 = item.Size;
1439
+ }
1440
+ _mixItems.Add(mixItem);
1441
+ }
1442
+ }
1443
+ if (sect.PSize > sect.VSize)
1444
+ {
1445
+ int numBits = _optHeader.GetNumFileAlignBits();
1446
+ if (numBits >= 0)
1447
+ {
1448
+ UInt32 mask = (1 << numBits) - 1;
1449
+ UInt32 end = ((sect.VSize + mask) & ~mask);
1450
+
1451
+ if (sect.PSize > end)
1452
+ {
1453
+ CSection sect2;
1454
+ sect2.Flags = 0;
1455
+ sect2.Pa = sect.Pa + end;
1456
+ sect2.Va = sect.Va + end;
1457
+ sect2.PSize = sect.PSize - end;
1458
+ sect2.VSize = sect2.PSize;
1459
+ sect2.Name = ".rsrc_2";
1460
+ sect2.Time = 0;
1461
+ sect2.IsAdditionalSection = true;
1462
+ _sections.Add(sect2);
1463
+ }
1464
+ }
1465
+ }
1466
+ continue;
1467
+ }
1468
+ if (res != S_FALSE)
1469
+ return res;
1470
+ CloseResources();
1471
+ }
1472
+ mixItem.StringIndex = -1;
1473
+ mixItem.ResourceIndex = -1;
1474
+ if (sect.IsAdditionalSection)
1475
+ {
1476
+ if (sect.PSize >= mainSize)
1477
+ {
1478
+ mainSize2 = mainSize;
1479
+ mainSize = sect.PSize;
1480
+ _mainSubfile = _mixItems.Size();
1481
+ }
1482
+ else
1483
+ mainSize2 = sect.PSize;
1484
+ }
1485
+ _mixItems.Add(mixItem);
1486
+ }
1487
+
1488
+ if (mainSize2 >= (1 << 20) && mainSize < mainSize2 * 2)
1489
+ _mainSubfile = -1;
1490
+
1491
+ for (i = 0; i < _mixItems.Size(); i++)
1492
+ {
1493
+ const CMixItem &mixItem = _mixItems[i];
1494
+ if (mixItem.StringIndex < 0 && mixItem.ResourceIndex < 0 && _sections[mixItem.SectionIndex].Name == "_winzip_")
1495
+ {
1496
+ _mainSubfile = i;
1497
+ break;
1498
+ }
1499
+ }
1500
+
1501
+ return S_OK;
1502
+ }
1503
+
1504
+ HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos, UInt32 &res)
1505
+ {
1506
+ // size &= ~1;
1507
+ const UInt32 kBufSize = 1 << 23;
1508
+ CByteBuffer buffer;
1509
+ buffer.SetCapacity(kBufSize);
1510
+ Byte *buf = buffer;
1511
+
1512
+ UInt32 sum = 0;
1513
+ UInt32 pos = 0;
1514
+ for (;;)
1515
+ {
1516
+ UInt32 rem = size - pos;
1517
+ if (rem > kBufSize)
1518
+ rem = kBufSize;
1519
+ if (rem == 0)
1520
+ break;
1521
+ size_t processed = rem;
1522
+ RINOK(ReadStream(stream, buf, &processed));
1523
+
1524
+ /*
1525
+ for (; processed < rem; processed++)
1526
+ buf[processed] = 0;
1527
+ */
1528
+
1529
+ if ((processed & 1) != 0)
1530
+ buf[processed] = 0;
1531
+
1532
+ for (int j = 0; j < 4; j++)
1533
+ {
1534
+ UInt32 p = excludePos + j;
1535
+ if (pos <= p && p < pos + processed)
1536
+ buf[p - pos] = 0;
1537
+ }
1538
+
1539
+ for (size_t i = 0; i < processed; i += 2)
1540
+ {
1541
+ sum += Get16(buf + i);
1542
+ sum = (sum + (sum >> 16)) & 0xFFFF;
1543
+ }
1544
+ pos += (UInt32)processed;
1545
+ if (rem != processed)
1546
+ break;
1547
+ }
1548
+ sum += pos;
1549
+ res = sum;
1550
+ return S_OK;
1551
+ }
1552
+
1553
+ STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback)
1554
+ {
1555
+ COM_TRY_BEGIN
1556
+ Close();
1557
+ RINOK(Open2(inStream, callback));
1558
+ _stream = inStream;
1559
+ return S_OK;
1560
+ COM_TRY_END
1561
+ }
1562
+
1563
+ void CHandler::CloseResources()
1564
+ {
1565
+ _usedRes.Free();
1566
+ _items.Clear();
1567
+ _strings.Clear();
1568
+ _buf.SetCapacity(0);
1569
+ }
1570
+
1571
+ STDMETHODIMP CHandler::Close()
1572
+ {
1573
+ _stream.Release();
1574
+ _sections.Clear();
1575
+ _mixItems.Clear();
1576
+ CloseResources();
1577
+ return S_OK;
1578
+ }
1579
+
1580
+ STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
1581
+ {
1582
+ *numItems = _mixItems.Size();
1583
+ return S_OK;
1584
+ }
1585
+
1586
+ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
1587
+ Int32 testMode, IArchiveExtractCallback *extractCallback)
1588
+ {
1589
+ COM_TRY_BEGIN
1590
+ bool allFilesMode = (numItems == (UInt32)-1);
1591
+ if (allFilesMode)
1592
+ numItems = _mixItems.Size();
1593
+ if (numItems == 0)
1594
+ return S_OK;
1595
+ UInt64 totalSize = 0;
1596
+ UInt32 i;
1597
+ for (i = 0; i < numItems; i++)
1598
+ {
1599
+ const CMixItem &mixItem = _mixItems[allFilesMode ? i : indices[i]];
1600
+ if (mixItem.StringIndex >= 0)
1601
+ totalSize += _strings[mixItem.StringIndex].Size;
1602
+ else if (mixItem.ResourceIndex < 0)
1603
+ totalSize += _sections[mixItem.SectionIndex].GetPackSize();
1604
+ else
1605
+ totalSize += _items[mixItem.ResourceIndex].GetSize();
1606
+ }
1607
+ extractCallback->SetTotal(totalSize);
1608
+
1609
+ UInt64 currentTotalSize = 0;
1610
+ UInt64 currentItemSize;
1611
+
1612
+ NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
1613
+ CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
1614
+
1615
+ CLocalProgress *lps = new CLocalProgress;
1616
+ CMyComPtr<ICompressProgressInfo> progress = lps;
1617
+ lps->Init(extractCallback, false);
1618
+
1619
+ bool checkSumOK = true;
1620
+ if (_optHeader.CheckSum != 0 && (int)numItems == _mixItems.Size())
1621
+ {
1622
+ UInt32 checkSum = 0;
1623
+ RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL));
1624
+ CalcCheckSum(_stream, _totalSizeLimited, _peOffset + kHeaderSize + 64, checkSum);
1625
+ checkSumOK = (checkSum == _optHeader.CheckSum);
1626
+ }
1627
+
1628
+ CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream;
1629
+ CMyComPtr<ISequentialInStream> inStream(streamSpec);
1630
+ streamSpec->SetStream(_stream);
1631
+
1632
+ for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize)
1633
+ {
1634
+ lps->InSize = lps->OutSize = currentTotalSize;
1635
+ RINOK(lps->SetCur());
1636
+ Int32 askMode = testMode ?
1637
+ NExtract::NAskMode::kTest :
1638
+ NExtract::NAskMode::kExtract;
1639
+ UInt32 index = allFilesMode ? i : indices[i];
1640
+
1641
+ CMyComPtr<ISequentialOutStream> outStream;
1642
+ RINOK(extractCallback->GetStream(index, &outStream, askMode));
1643
+ const CMixItem &mixItem = _mixItems[index];
1644
+
1645
+ const CSection &sect = _sections[mixItem.SectionIndex];
1646
+ bool isOk = true;
1647
+ if (mixItem.StringIndex >= 0)
1648
+ {
1649
+ const CStringItem &item = _strings[mixItem.StringIndex];
1650
+ currentItemSize = item.Size;
1651
+ if (!testMode && !outStream)
1652
+ continue;
1653
+
1654
+ RINOK(extractCallback->PrepareOperation(askMode));
1655
+ if (outStream)
1656
+ RINOK(WriteStream(outStream, item.Buf, item.Size));
1657
+ }
1658
+ else if (mixItem.ResourceIndex < 0)
1659
+ {
1660
+ currentItemSize = sect.GetPackSize();
1661
+ if (!testMode && !outStream)
1662
+ continue;
1663
+
1664
+ RINOK(extractCallback->PrepareOperation(askMode));
1665
+ RINOK(_stream->Seek(sect.Pa, STREAM_SEEK_SET, NULL));
1666
+ streamSpec->Init(currentItemSize);
1667
+ RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress));
1668
+ isOk = (copyCoderSpec->TotalSize == currentItemSize);
1669
+ }
1670
+ else
1671
+ {
1672
+ const CResItem &item = _items[mixItem.ResourceIndex];
1673
+ currentItemSize = item.GetSize();
1674
+ if (!testMode && !outStream)
1675
+ continue;
1676
+
1677
+ RINOK(extractCallback->PrepareOperation(askMode));
1678
+ size_t offset = item.Offset - sect.Va;
1679
+ if (!CheckItem(sect, item, offset))
1680
+ isOk = false;
1681
+ else if (outStream)
1682
+ {
1683
+ if (item.HeaderSize != 0)
1684
+ RINOK(WriteStream(outStream, item.Header, item.HeaderSize));
1685
+ RINOK(WriteStream(outStream, _buf + offset, item.Size));
1686
+ }
1687
+ }
1688
+
1689
+ outStream.Release();
1690
+ RINOK(extractCallback->SetOperationResult(isOk ?
1691
+ checkSumOK ?
1692
+ NExtract::NOperationResult::kOK:
1693
+ NExtract::NOperationResult::kCRCError:
1694
+ NExtract::NOperationResult::kDataError));
1695
+ }
1696
+ return S_OK;
1697
+ COM_TRY_END
1698
+ }
1699
+
1700
+ STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
1701
+ {
1702
+ COM_TRY_BEGIN
1703
+ *stream = 0;
1704
+
1705
+ const CMixItem &mixItem = _mixItems[index];
1706
+ const CSection &sect = _sections[mixItem.SectionIndex];
1707
+ if (mixItem.IsSectionItem())
1708
+ return CreateLimitedInStream(_stream, sect.Pa, sect.PSize, stream);
1709
+
1710
+ CBufInStream *inStreamSpec = new CBufInStream;
1711
+ CMyComPtr<ISequentialInStream> streamTemp = inStreamSpec;
1712
+ CReferenceBuf *referenceBuf = new CReferenceBuf;
1713
+ CMyComPtr<IUnknown> ref = referenceBuf;
1714
+ if (mixItem.StringIndex >= 0)
1715
+ {
1716
+ const CStringItem &item = _strings[mixItem.StringIndex];
1717
+ referenceBuf->Buf.SetCapacity(item.Size);
1718
+ memcpy(referenceBuf->Buf, item.Buf, item.Size);
1719
+ }
1720
+ else
1721
+ {
1722
+ const CResItem &item = _items[mixItem.ResourceIndex];
1723
+ size_t offset = item.Offset - sect.Va;
1724
+ if (!CheckItem(sect, item, offset))
1725
+ return S_FALSE;
1726
+ if (item.HeaderSize == 0)
1727
+ {
1728
+ CBufInStream *streamSpec = new CBufInStream;
1729
+ CMyComPtr<IInStream> streamTemp2 = streamSpec;
1730
+ streamSpec->Init(_buf + offset, item.Size, (IInArchive *)this);
1731
+ *stream = streamTemp2.Detach();
1732
+ return S_OK;
1733
+ }
1734
+ referenceBuf->Buf.SetCapacity(item.HeaderSize + item.Size);
1735
+ memcpy(referenceBuf->Buf, item.Header, item.HeaderSize);
1736
+ memcpy(referenceBuf->Buf + item.HeaderSize, _buf + offset, item.Size);
1737
+ }
1738
+ inStreamSpec->Init(referenceBuf);
1739
+
1740
+ *stream = streamTemp.Detach();
1741
+ return S_OK;
1742
+ COM_TRY_END
1743
+ }
1744
+
1745
+ static IInArchive *CreateArc() { return new CHandler; }
1746
+
1747
+ static CArcInfo g_ArcInfo =
1748
+ { L"PE", L"exe dll sys", 0, 0xDD, { 'P', 'E', 0, 0 }, 4, false, CreateArc, 0 };
1749
+
1750
+ REGISTER_ARC(Pe)
1751
+
1752
+ }}