diff options
author | OctaneSnail <os@v12pwr.com> | 2012-01-22 00:49:58 +0400 |
---|---|---|
committer | OctaneSnail <os@v12pwr.com> | 2012-01-22 00:49:58 +0400 |
commit | 8946b80ea837e3a43dc6b6f74b6d2b6a12b8defb (patch) | |
tree | f0629a4bc9c1f3a33aef023291b9e1ffb745b859 | |
parent | 5cd8056584d21c7e56a3a67a9660f94c3691fe78 (diff) |
Don't rely to much on LONG_BLOCK, it's missing in some archives.
-rw-r--r-- | RAR.cpp | 25 | ||||
-rw-r--r-- | RAR.h | 1 |
2 files changed, 15 insertions, 11 deletions
@@ -45,17 +45,6 @@ DWORD ReadHeader (HANDLE file, rar_header_t *dest) dest->ch.flags = fh.flags; dest->ch.type = fh.type; - if (fh.flags & LONG_BLOCK) - { - READ_ITEM (dword); - dest->ch.size.QuadPart = (LONGLONG) dword + fh.size; - } - else - { - dest->ch.size.HighPart = 0; - dest->ch.size.LowPart = fh.size; - } - switch (fh.type) { case HEADER_TYPE_ARCHIVE: @@ -65,6 +54,7 @@ DWORD ReadHeader (HANDLE file, rar_header_t *dest) case HEADER_TYPE_FILE: READ_ITEM (ffh); + dest->ch.size.QuadPart = (LONGLONG) ffh.packedSize + fh.size; dest->fh.size.LowPart = ffh.size; dest->fh.os = ffh.os; dest->fh.crc = ffh.crc; @@ -120,6 +110,19 @@ DWORD ReadHeader (HANDLE file, rar_header_t *dest) } } } + break; + + default: + if (fh.flags & LONG_BLOCK) + { + READ_ITEM (dword); + dest->ch.size.QuadPart = (LONGLONG) dword + fh.size; + } + else + { + dest->ch.size.HighPart = 0; + dest->ch.size.LowPart = fh.size; + } } if (acc > dest->ch.size.QuadPart) @@ -41,6 +41,7 @@ typedef struct typedef struct { + DWORD packedSize; DWORD size; BYTE os; DWORD crc; |