[Forensics-changes] [SCM] debian-forensics/guymager branch, debian, updated. debian/0.4.2-2-14-g83fa75a

Michael Prokop mika at debian.org
Wed Sep 22 11:41:01 UTC 2010


The following commit has been merged in the debian branch:
commit 13f08f778076e2f7abc522976bb86a4851bafe5e
Author: Michael Prokop <mika at debian.org>
Date:   Wed Sep 22 13:33:33 2010 +0200

    Merging upstream version 0.5.7beta1.

diff --git a/common.h b/common.h
index 1e19a66..9163936 100644
--- a/common.h
+++ b/common.h
@@ -57,6 +57,8 @@ typedef t_Device       *t_pDevice;   // all the time, it is easiest to declare i
 typedef t_Device const *t_pcDevice;  // like that style too much, but we won't change C++ at this time).
 
 #define EWF_MULTITHREADED_COMPRESSION_CHUNK_SIZE       32768
+#define EWF_MAX_SEGMENT_SIZE                            2047   // in MiB
+#define EWF_MIN_SEGMENT_SIZE                              20   // in MiB
 
 #define GETMAX(a,b) ((a)>(b)?(a):(b))
 #define GETMIN(a,b) ((a)<(b)?(a):(b))
diff --git a/config.cpp b/config.cpp
index dd9cf33..1a3550a 100644
--- a/config.cpp
+++ b/config.cpp
@@ -311,7 +311,6 @@ static t_ToolCfgParamDesc CfgParamDescArr[] =
    {CFGASSIGN_BOTH_MULTIPLE, NULL       , {"EwfCompression"                , CFGTYPE_SET    , ELT(EwfCompression)                ,                0,       0,       0, INIARR(SetArrEwfCompression)    }, CFG_FILLUP_FORLINT},
    {CFGASSIGN_BOTH_MULTIPLE, NULL       , {"AffCompression"                , CFGTYPE_INTEGER, ELT(AffCompression)                ,                0,       1,       9, NULL                            }, CFG_FILLUP_FORLINT},
    {CFGASSIGN_BOTH_MULTIPLE, NULL       , {"AffMarkBadSectors"             , CFGTYPE_SET    , ELT(AffMarkBadSectors)             ,                0,       0,       0, INIARR(SetArrBoolean)           }, CFG_FILLUP_FORLINT},
-   {CFGASSIGN_BOTH_MULTIPLE, NULL       , {"EwfSegmentSize"                , CFGTYPE_INTEGER, ELT(EwfSegmentSize)                ,                0,       1,    2047, NULL                            }, CFG_FILLUP_FORLINT},
    {CFGASSIGN_BOTH_MULTIPLE, NULL       , {"SpecialFilenameChars"          , CFGTYPE_STRING , ELT_SIZ(SpecialFilenameChars)      ,                         0,       0, NULL                            }, CFG_FILLUP_FORLINT},
 
    {CFGASSIGN_BOTH_MULTIPLE, NULL       , {"DeviceScanMethod"              , CFGTYPE_SET    , ELT(DeviceScanMethod)              ,                0,       0,       0, INIARR(SetArrDeviceScanMethod)  }, CFG_FILLUP_FORLINT},
@@ -927,6 +926,7 @@ static APIRET CfgInitializeDlgAcquireFieldNames (void)
 {
    if (CfgLocal.DlgAcquireFieldNames.count() == 0)
    {
+      CfgLocal.DlgAcquireFieldNames += CFG_DLGACQUIRE_SPLITFILESWITCH;
       CfgLocal.DlgAcquireFieldNames += CFG_DLGACQUIRE_SPLITFILESIZE;
       CfgLocal.DlgAcquireFieldNames += CFG_DLGACQUIRE_EWF_CASENUMBER;
       CfgLocal.DlgAcquireFieldNames += CFG_DLGACQUIRE_EWF_EVIDENCENUMBER;
diff --git a/config.h b/config.h
index 015d43a..cd05f72 100644
--- a/config.h
+++ b/config.h
@@ -115,7 +115,6 @@ typedef struct
    int                  EwfCompression;
    int                  AffCompression;
    int                  AffMarkBadSectors;
-   int                  EwfSegmentSize;
    char                 SpecialFilenameChars[CFG_MAX_MISC_LEN+1];
 
    int                  FifoBlockSizeDD;
@@ -178,6 +177,7 @@ typedef struct
 #define CFG_DLGACQUIRE_DST_FIELDID        "Dest"
 #define CFG_DLGACQUIRE_DIR_FIELDID        "Directory"
 
+#define CFG_DLGACQUIRE_SPLITFILESWITCH         QT_TRANSLATE_NOOP("t_DlgAcquire", "SplitFileSwitch"   )
 #define CFG_DLGACQUIRE_SPLITFILESIZE           QT_TRANSLATE_NOOP("t_DlgAcquire", "SplitFileSize"     )
 #define CFG_DLGACQUIRE_EWF_CASENUMBER          QT_TRANSLATE_NOOP("t_DlgAcquire", "EwfCaseNumber"     )
 #define CFG_DLGACQUIRE_EWF_EVIDENCENUMBER      QT_TRANSLATE_NOOP("t_DlgAcquire", "EwfEvidenceNumber" )
@@ -209,6 +209,7 @@ typedef struct
 } t_CfgBuffDlgAcquireRule, *t_pCfgBuffDlgAcquireRule;
 
 class QCheckBox;
+class QLabel;
 class t_DlgAcquireLineEdit;
 class t_CfgDlgAcquireField
 {
@@ -224,6 +225,7 @@ class t_CfgDlgAcquireField
       bool                   DirField;         // This is a directory field with a browse button
       t_DlgAcquireLineEdit *pLineEdit;
       QCheckBox            *pCheckBox;
+      QLabel               *pLabel;
 };
 typedef t_CfgDlgAcquireField       *t_pCfgDlgAcquireField;
 typedef QList<t_pCfgDlgAcquireField> t_CfgDlgAcquireFields;
diff --git a/device.cpp b/device.cpp
index f5cc82b..7094b23 100644
--- a/device.cpp
+++ b/device.cpp
@@ -103,6 +103,7 @@ void t_Device::Initialise (void)
    this->Acquisition.CalcSHA256    = false;
    this->Acquisition.VerifySrc     = false;
    this->Acquisition.VerifyDst     = false;
+   this->Acquisition.SplitFileSize = 0;
 //   this->Acquisition.CaseNumber    = QString();
 //   this->Acquisition.EvidenceNumber= QString();
 //   this->Acquisition.Examiner      = QString();
@@ -353,8 +354,8 @@ QVariant t_Device::GetHiddenAreas (t_pDevice pDevice)
 {
    QString Str;
 
-   if      ((pDevice->MediaInfo.HasHPA == t_MediaInfo::No     ) && (pDevice->MediaInfo.HasDCO == t_MediaInfo::No     )) Str = "none";
-   else if ((pDevice->MediaInfo.HasHPA == t_MediaInfo::Unknown) && (pDevice->MediaInfo.HasDCO == t_MediaInfo::Unknown)) Str = "unknown";
+   if      ((pDevice->MediaInfo.HasHPA == t_MediaInfo::No     ) && (pDevice->MediaInfo.HasDCO == t_MediaInfo::No     )) Str = t_MainWindow::tr("none"   , "column hidden areas");
+   else if ((pDevice->MediaInfo.HasHPA == t_MediaInfo::Unknown) && (pDevice->MediaInfo.HasDCO == t_MediaInfo::Unknown)) Str = t_MainWindow::tr("unknown", "column hidden areas");
    else
    {
       Str  = "HPA:"    + DeviceMediaInfoStr(pDevice->MediaInfo.HasHPA);
@@ -609,22 +610,21 @@ APIRET t_DeviceList::MatchDevice (t_pcDevice pDevCmp, t_pDevice &pDevMatch)
    for (i=0; (i<count()) && !Found; i++)
    {
       pDevMatch = at(i);
-      if ( pDevCmp  ->SpecialDevice &&
-          (pDevMatch->LinuxDevice == pDevCmp->LinuxDevice))
+      if (pDevCmp->SpecialDevice)  // Special device, we may only compare the LinuxDevice string
       {
-         Found = true;
-         break;
-      }
-
-      if (pDevMatch->SerialNumber.isEmpty())
-      {
-         Found = (pDevCmp->SerialNumber.isEmpty() && (pDevMatch->State != t_Device::AcquirePaused) &&
-                                                     (pDevMatch->State != t_Device::VerifyPaused ) &&
-                                                     (pDevMatch->Model == pDevCmp->Model         ) &&
-                                                     (pDevMatch->Size  == pDevCmp->Size          ));
-      }
-      else
+         Found = (pDevMatch->LinuxDevice == pDevCmp->LinuxDevice);
+      }         
+      else  // Not a special device, we can use normal matching
       {
+         if (pDevMatch->SerialNumber.isEmpty())
+         {
+            Found = (pDevCmp->SerialNumber.isEmpty() && (pDevMatch->State != t_Device::AcquirePaused) &&
+                                                        (pDevMatch->State != t_Device::VerifyPaused ) &&
+                                                        (pDevMatch->Model == pDevCmp->Model         ) &&
+                                                        (pDevMatch->Size  == pDevCmp->Size          ));
+         }
+         else
+         {
 //         Found = (pDevMatch->SerialNumber == pDevCmp->SerialNumber);
 //         if (Found)
 //         {                                                                                            // If the serial numbers match, the whole
@@ -632,14 +632,15 @@ APIRET t_DeviceList::MatchDevice (t_pcDevice pDevCmp, t_pDevice &pDevMatch)
 //            if (pDevMatch->Size  != pDevCmp->Size ) return ERROR_DEVICE_SERNR_MATCH_LENGTH_MISMATCH;  // something very strange is going on...
 //         }
 
-// The comparision above cannot be used, because there are certain devices, that behave as if 2 devices aer connected when
-// plugged in - with the same serial number!! Example: I once had a memory stick from Intuix, that reported 2 devices: The
-// memory stick itself and a CD-Rom memory stick itself and a CD-Rom containing device drivers for some strange OS. Both
-// devices had the same serial number. That's why the check now also includes the size and the model.
+// The comparision above cannot be used, because there are certain devices, that behave as if 2 devices are connected when
+// plugged in - with the same serial number!! Example: I once had a memory stick from Intuix that reported 2 devices: The
+// memory stick itself and a CD-Rom containing device drivers for some strange OS. Both devices had the same serial number. 
+// That's why the check now also includes the size and the model.
 
-         Found = ((pDevMatch->SerialNumber == pDevCmp->SerialNumber) &&
-                  (pDevMatch->Size         == pDevCmp->Size )        &&
-                  (pDevMatch->Model        == pDevCmp->Model));
+            Found = ((pDevMatch->SerialNumber == pDevCmp->SerialNumber) &&
+                     (pDevMatch->Size         == pDevCmp->Size )        &&
+                     (pDevMatch->Model        == pDevCmp->Model));
+         }
       }
    }
 
diff --git a/device.h b/device.h
index d245337..1200289 100644
--- a/device.h
+++ b/device.h
@@ -78,6 +78,7 @@ class t_Device
             QString        Examiner;
             QString        Description;
             QString        Notes;
+            quint64        SplitFileSize;    // 0 means do not split
       };
 
    public:
diff --git a/dlgacquire.cpp b/dlgacquire.cpp
index d8d4f58..c735d67 100644
--- a/dlgacquire.cpp
+++ b/dlgacquire.cpp
@@ -11,6 +11,9 @@
 
 #include <QtGui>
 #include <QDesktopWidget>
+#include <QX11Info>
+
+#include "toolconstants.h"
 
 #include "common.h"
 #include "compileinfo.h"
@@ -41,8 +44,6 @@ class t_DlgAcquireLocal
       QRadioButton    *pRadioButtonFormatEWF;
       QRadioButton    *pRadioButtonFormatAFF;
 
-      QCheckBox       *pCheckBoxSplit;
-
       QList<QWidget*>   EwfWidgetsList;                  // Used to comfortably enable / disable EWF related entry fields and labels
 
       QTableWidget    *pDeviceTable;                     // Only created and displayed when cloning a device
@@ -198,6 +199,10 @@ static bool DlgAcquireStrToBool (const QString &Set)
                             (Set.compare ("DEACTIVATED", Qt::CaseInsensitive) != 0);
 }
 
+t_CfgEntryMode t_DlgAcquire::EntryMode (t_pCfgDlgAcquireField pField)
+{
+   return pOwn->Clone ? pField->EntryModeClone : pField->EntryModeImage;
+}
 
 APIRET t_DlgAcquire::AddField (t_pDevice pDevice, t_pCfgDlgAcquireField pField, QGridLayout *pLayout, int *pRow, int *pCol)
 {
@@ -208,13 +213,10 @@ APIRET t_DlgAcquire::AddField (t_pDevice pDevice, t_pCfgDlgAcquireField pField,
    QPushButton           *pButtonBrowse = NULL;
    QString                 Set;
    QSize                   MinButtonSize;
-   t_CfgEntryMode          EntryMode;
-
-   if (pOwn->Clone)
-        EntryMode = pField->EntryModeClone;
-   else EntryMode = pField->EntryModeImage;
 
-   if (pField->HashField)
+   // Create field
+   // ------------
+   if (pField->HashField || pField->FieldName == CFG_DLGACQUIRE_SPLITFILESWITCH)
    {
       pEntryWidget = pCheckBox = new QCheckBox (tr(QSTR_TO_PSZ(pField->FieldName)), this);
    }
@@ -224,12 +226,15 @@ APIRET t_DlgAcquire::AddField (t_pDevice pDevice, t_pCfgDlgAcquireField pField,
       pLabel       = new QLabel (tr(QSTR_TO_PSZ(pField->FieldName)), this);
    }
 
-   if ((pField->DirField) && (EntryMode != CFG_ENTRYMODE_HIDE))
+   if ((pField->DirField) && (EntryMode(pField) != CFG_ENTRYMODE_HIDE))
       pButtonBrowse = new QPushButton (tr("...", "The directory browse button"), this);
 
+   // Position field
+   // --------------
    pField->pLineEdit = pLineEdit;
    pField->pCheckBox = pCheckBox;
-   if (EntryMode == CFG_ENTRYMODE_HIDE)
+   pField->pLabel    = pLabel;
+   if (EntryMode(pField) == CFG_ENTRYMODE_HIDE)
    {
       if (pLabel)
          pLabel->hide();
@@ -237,43 +242,59 @@ APIRET t_DlgAcquire::AddField (t_pDevice pDevice, t_pCfgDlgAcquireField pField,
    }
    else
    {
-      if (pButtonBrowse)
-      {
-         pLayout->addWidget (pLabel       , *pRow, 0);
-         pLayout->addWidget (pButtonBrowse, *pRow, 1);
-         MinButtonSize = pButtonBrowse->minimumSize();
-         MinButtonSize.setWidth(20);
-         pButtonBrowse->setSizePolicy (QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred));   // Allow to shrink horizontal size below preferred minimum
-         pButtonBrowse->setMinimumSize(MinButtonSize);
-      }
-      else if (pLabel)
+      if (pField->FieldName == CFG_DLGACQUIRE_SPLITFILESIZE)
       {
-         pLayout->addWidget (pLabel, *pRow, 0, 1, 2);        // if there's no button then use the first 2 columns for the label
+         pLayout->addWidget (pLabel   , *pRow, *pCol  );
+         pLayout->addWidget (pLineEdit, *pRow, *pCol+1);
       }
-      if (pLineEdit)
+      else
       {
-         pLayout->addWidget (pLineEdit, *pRow, 2);
-         if (pField->EwfField)
+         if (pButtonBrowse)
          {
-            pOwn->EwfWidgetsList.append (pLabel   );
-            pOwn->EwfWidgetsList.append (pLineEdit);
+            pLayout->addWidget (pLabel       , *pRow, 0);
+            pLayout->addWidget (pButtonBrowse, *pRow, 1);
+            MinButtonSize = pButtonBrowse->minimumSize();
+            MinButtonSize.setWidth(20);
+            pButtonBrowse->setSizePolicy (QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred));   // Allow to shrink horizontal size below preferred minimum
+            pButtonBrowse->setMinimumSize(MinButtonSize);
          }
-         (*pRow)++;
-      }
-      if (pCheckBox)
-      {
-         if (pField->FieldName.startsWith (CFG_DLGACQUIRE_HASHCALC_FIELDID))
+         else if (pLabel)
          {
-            pLayout->addWidget (pCheckBox, 0, *pCol);  // Put all HashCalc field in the first row
-            (*pCol)++;
+            pLayout->addWidget (pLabel, *pRow, 0, 1, 2);        // if there's no button then use the first 2 columns for the label
          }
-         else
+         if (pLineEdit)
          {
-            pLayout->addWidget (pCheckBox, (*pRow)+1, 0, 1, 2); // Put each verification field in an own row below
+            pLayout->addWidget (pLineEdit, *pRow, 2);
+            if (pField->EwfField)
+            {
+               pOwn->EwfWidgetsList.append (pLabel   );
+               pOwn->EwfWidgetsList.append (pLineEdit);
+            }
             (*pRow)++;
          }
+         if (pCheckBox)
+         {
+	    if (pField->FieldName == CFG_DLGACQUIRE_SPLITFILESWITCH)
+	    {
+               pLayout->addWidget (pCheckBox, *pRow, *pCol, 1, 2);
+               (*pRow)++;
+	    }
+            else if (pField->FieldName.startsWith (CFG_DLGACQUIRE_HASHCALC_FIELDID))
+            {
+               pLayout->addWidget (pCheckBox, 0, *pCol);  // Put all HashCalc field in the first row
+               (*pCol)++;
+            }
+            else
+            {
+               pLayout->addWidget (pCheckBox, (*pRow)+1, 0, 1, 2); // Put each verification field in an own row below
+               (*pRow)++;
+            }
+         }
       }
    }
+
+   // Set field value
+   // ---------------
    CHK_EXIT (DlgAcquireGetFieldValue (pDevice, pOwn->Clone, pField, Set))
    if (pField->DirField)
    {
@@ -444,7 +465,7 @@ class t_DlgAcquireLayoutScroller: public QScrollArea // This class makes layouts
       virtual QSize minimumSizeHint () const                      // In hor. direction, the area must never be smaller then
       {                                                           // the minimum required by the layout inside (as we do not
          return QSize (sizeHint().width(),                        // want a hor. scrollbar and thus switched it off, see
-                       QScrollArea::minimumSizeHint().height());  // constructor above). Verticallym the default minimum
+                       QScrollArea::minimumSizeHint().height());  // constructor above). Vertically, the default minimum
       }                                                           // of QScrollArea is used (whatever this might be).
 };
 
@@ -461,7 +482,7 @@ t_DlgAcquire::t_DlgAcquire (t_pDevice pDevice, bool Clone, t_pDeviceList pDevice
    QLabel                     *pLabel;
    QString                      DefaultFilename;
    QString                      Path;
-   QString                      Str;
+   QString                      Str, StrAlt;
    QString                      ButtonTextDD;
    QString                      ButtonTextEWF;
    QString                      ButtonTextAFF;
@@ -516,23 +537,27 @@ t_DlgAcquire::t_DlgAcquire (t_pDevice pDevice, bool Clone, t_pDeviceList pDevice
       QGroupBox   *pGroupBoxFormat    = new QGroupBox (tr("File format"), this);
       QVBoxLayout *pLayoutGroupBox    = new QVBoxLayout;
       QHBoxLayout *pLayoutFormatSplit = new QHBoxLayout;
-      QVBoxLayout *pLayoutFormat      = new QVBoxLayout;
-      QVBoxLayout *pLayoutSplit       = new QVBoxLayout;
+      QGridLayout *pLayoutFormat      = new QGridLayout;
+      QGridLayout *pLayoutSplit       = new QGridLayout;
       QGridLayout *pLayoutEwf         = new QGridLayout;
+      QFrame      *pSeparator         = new QFrame(this); // vertical separator line between format and split fields
+      pSeparator->setFrameShape (QFrame::VLine);
 
       pLayout           ->addWidget (pGroupBoxFormat);
       pGroupBoxFormat   ->setLayout (pLayoutGroupBox);
       pLayoutGroupBox   ->addLayout (pLayoutFormatSplit);
       pLayoutFormatSplit->addLayout (pLayoutFormat);
-      pLayoutFormatSplit->addLayout (pLayoutSplit );
+      pLayoutFormatSplit->addWidget (pSeparator);
+      pLayoutFormatSplit->addLayout (pLayoutSplit);
       pLayoutGroupBox   ->addLayout (pLayoutEwf);
 
-      CHK_EXIT (t_File::GetFormatDescription (t_File::DD , false, Str))            ButtonTextDD  = "&" + Str;
-      CHK_EXIT (t_File::GetFormatDescription (t_File::EWF, false, Str))            ButtonTextEWF = "&" + Str;
-      CHK_EXIT (t_File::GetFormatDescription (t_File::AFF, false, Str))            ButtonTextAFF = "&" + Str;
-      CHK_EXIT (t_File::GetFormatExtension   (t_File::DD , false, NULL, &Str))     ButtonTextDD += " " + tr("(file extension %1)") .arg (Str);
-      CHK_EXIT (t_File::GetFormatExtension   (t_File::EWF, false, NULL, &Str))     ButtonTextEWF+= " " + tr("(file extension %1)") .arg (Str);
-      CHK_EXIT (t_File::GetFormatExtension   (t_File::AFF, false, NULL, &Str))     ButtonTextAFF+= " " + tr("(file extension %1)") .arg (Str);
+      CHK_EXIT (t_File::GetFormatDescription (t_File::DD , false, 0, Str))            ButtonTextDD  = "&" + Str;
+      CHK_EXIT (t_File::GetFormatDescription (t_File::EWF, false, 0, Str))            ButtonTextEWF = "&" + Str;
+      CHK_EXIT (t_File::GetFormatDescription (t_File::AFF, false, 0, Str))            ButtonTextAFF = "&" + Str;
+      CHK_EXIT (t_File::GetFormatExtension   (t_File::DD , false, 0, NULL, &Str))
+      CHK_EXIT (t_File::GetFormatExtension   (t_File::DD , false, 3, NULL, &StrAlt))  ButtonTextDD += " " + tr("(file extension %1 or %2)") .arg (Str) .arg (StrAlt);
+      CHK_EXIT (t_File::GetFormatExtension   (t_File::EWF, false, 0, NULL, &Str))     ButtonTextEWF+= " " + tr("(file extension %1)") .arg (Str);
+      CHK_EXIT (t_File::GetFormatExtension   (t_File::AFF, false, 0, NULL, &Str))     ButtonTextAFF+= " " + tr("(file extension %1)") .arg (Str);
 
       pOwn->pRadioButtonFormatDD  = new QRadioButton (ButtonTextDD , this);
       pOwn->pRadioButtonFormatEWF = new QRadioButton (ButtonTextEWF, this);
@@ -542,9 +567,19 @@ t_DlgAcquire::t_DlgAcquire (t_pDevice pDevice, bool Clone, t_pDeviceList pDevice
       pLayoutFormat->addWidget  (pOwn->pRadioButtonFormatEWF);
       pLayoutFormat->addWidget  (pOwn->pRadioButtonFormatAFF);
 
-//      pOwn->pCheckBoxSplit  = new QCheckBox (tr("Split image"), this);
-//      pOwn->pEntrySplitSize = new
-//      pLayoutSplit->addWidget(pOwn->pCheckBoxSplit);
+      // Split file controls
+      // -------------------
+      t_pCfgDlgAcquireField pFieldSplitSwitch = DlgAcquireGetField ("SplitFileSwitch");
+      t_pCfgDlgAcquireField pFieldSplitSize   = DlgAcquireGetField ("SplitFileSize"  );
+
+      if ((EntryMode(pFieldSplitSwitch) == CFG_ENTRYMODE_HIDE)  &&
+          (EntryMode(pFieldSplitSize  ) == CFG_ENTRYMODE_HIDE))
+	 pSeparator->hide();
+
+      Row = 0;
+      Col = 1;
+      CHK_EXIT (AddField (pDevice, pFieldSplitSwitch, pLayoutSplit, &Row, &Col))
+      CHK_EXIT (AddField (pDevice, pFieldSplitSize  , pLayoutSplit, &Row, &Col))
 
       Row = Col = 0;
       for (i=0; i<pDlgAcquireFields->count(); i++)
@@ -636,6 +671,24 @@ t_DlgAcquire::t_DlgAcquire (t_pDevice pDevice, bool Clone, t_pDeviceList pDevice
    UpdateHashState  ();
    UpdateDialogState();
 
+   // Adjust size
+   // -----------
+   // Qt limits dialogs to 2/3 of the screen height and width. That's why we adjust it with
+   //  the following code if the dialog is smaller then its size hint.
+   adjustSize();  // Let Qt calculate the size (limited to 2/3 of the screen)
+   QRect DialogRect = geometry ();
+   
+   if (DialogRect.height() < sizeHint().height())
+   {
+      QRect ScreenRect = QApplication::desktop()->screenGeometry(x11Info().screen());     
+      int   NewHeight  = GETMIN (ScreenRect.height()*0.9, sizeHint().height());
+      
+      DialogRect.setX      ((ScreenRect.width () - DialogRect.width())/2);
+      DialogRect.setY      ((ScreenRect.height() - NewHeight         )/2);
+      DialogRect.setHeight (NewHeight);  // Must be done after setY!
+      setGeometry(DialogRect);
+   }
+   
    // Connections
    // -----------
    if (!Clone)
@@ -643,6 +696,7 @@ t_DlgAcquire::t_DlgAcquire (t_pDevice pDevice, bool Clone, t_pDeviceList pDevice
       CHK_QT_EXIT (connect (pOwn->pRadioButtonFormatDD , SIGNAL (released()), this, SLOT(UpdateFieldState())))
       CHK_QT_EXIT (connect (pOwn->pRadioButtonFormatEWF, SIGNAL (released()), this, SLOT(UpdateFieldState())))
       CHK_QT_EXIT (connect (pOwn->pRadioButtonFormatAFF, SIGNAL (released()), this, SLOT(UpdateFieldState())))
+      CHK_QT_EXIT (connect (DlgAcquireGetField ("SplitFileSwitch")->pCheckBox, SIGNAL (released()), this, SLOT(UpdateFileSplitState())))
       UpdateFieldState();
    }
    CHK_QT_EXIT (connect (pOwn->pButtonOk    , SIGNAL (released()), this, SLOT(SlotAccept())))
@@ -674,14 +728,6 @@ void t_DlgAcquire::UpdateHashState (int /*State*/)
          pDlgAcquireField->pCheckBox->setEnabled (Hash);
       }
    }
-
-//   if (!Hash)
-//   {
-//      pOwn->pCheckBoxVerifySrc->setChecked (false);
-//      pOwn->pCheckBoxVerifyDst->setChecked (false);
-//   }
-//   pOwn->pCheckBoxVerifySrc->setEnabled (Hash);
-//   pOwn->pCheckBoxVerifyDst->setEnabled (Hash);
 }
 
 void t_DlgAcquire::UpdateDialogState (const QString & /*NewText*/)
@@ -752,6 +798,8 @@ void t_DlgAcquire::UpdateFieldState (void)
    bool      Enabled;
    int       i;
 
+   // EWF fields
+   // ----------
    Enabled = (pOwn->pRadioButtonFormatEWF->isChecked() ||
               pOwn->pRadioButtonFormatAFF->isChecked());
    for (i = 0;
@@ -761,6 +809,45 @@ void t_DlgAcquire::UpdateFieldState (void)
       pWidget = pOwn->EwfWidgetsList.at(i);
       pWidget->setEnabled (Enabled);
    }
+
+   // Split file fields
+   // -----------------
+   static bool OldSplitSwitch = false;  // should be replaced
+
+   t_pCfgDlgAcquireField pFieldSplitSwitch = DlgAcquireGetField (CFG_DLGACQUIRE_SPLITFILESWITCH);
+   t_pCfgDlgAcquireField pFieldSplitSize   = DlgAcquireGetField (CFG_DLGACQUIRE_SPLITFILESIZE  );
+   if (pOwn->pRadioButtonFormatDD->isChecked())
+   {
+      pFieldSplitSwitch->pCheckBox->setChecked (OldSplitSwitch);
+      pFieldSplitSwitch->pCheckBox->setEnabled (true);
+   }
+   else if (pOwn->pRadioButtonFormatEWF->isChecked())
+   {
+      if (pFieldSplitSwitch->pCheckBox->isEnabled())
+         OldSplitSwitch = pFieldSplitSwitch->pCheckBox->isChecked();
+      pFieldSplitSwitch->pCheckBox->setChecked (true);
+      pFieldSplitSwitch->pCheckBox->setEnabled (false);
+   }
+   else if (pOwn->pRadioButtonFormatAFF->isChecked())
+   {
+      if (pFieldSplitSwitch->pCheckBox->isEnabled())
+         OldSplitSwitch = pFieldSplitSwitch->pCheckBox->isChecked();
+      pFieldSplitSwitch->pCheckBox->setChecked (false);
+      pFieldSplitSwitch->pCheckBox->setEnabled (false);
+   }
+   Enabled = pFieldSplitSwitch->pCheckBox->isChecked();
+   pFieldSplitSize->pLineEdit->setEnabled (Enabled);
+   pFieldSplitSize->pLabel   ->setEnabled (Enabled);
+}
+
+void t_DlgAcquire::UpdateFileSplitState (void)
+{
+   t_pCfgDlgAcquireField pFieldSplitSwitch = DlgAcquireGetField (CFG_DLGACQUIRE_SPLITFILESWITCH);
+   t_pCfgDlgAcquireField pFieldSplitSize   = DlgAcquireGetField (CFG_DLGACQUIRE_SPLITFILESIZE  );
+
+   bool Enabled = pFieldSplitSwitch->pCheckBox->isChecked();
+   pFieldSplitSize->pLineEdit->setEnabled (Enabled);
+   pFieldSplitSize->pLabel   ->setEnabled (Enabled);
 }
 
 void t_DlgAcquire::SlotBrowse (void)
@@ -920,14 +1007,40 @@ void t_DlgAcquire::SlotAccept (void)
    bool                         ImageFilenameClean;
    bool                         InfoFilenameClean;
 
+   // Check split file size
+   // ---------------------
+   if (!pOwn->Clone)
+   {
+      if (DlgAcquireGetField(CFG_DLGACQUIRE_SPLITFILESWITCH)->pCheckBox->isChecked())
+      {
+         QString StrValue;
+         quint64 NumValue;
+         bool    Ok;
+
+         StrValue = DlgAcquireGetField(CFG_DLGACQUIRE_SPLITFILESIZE)->pLineEdit->text();
+         NumValue = StrValue.toULongLong(&Ok);
+         if (!Ok)
+         {
+            QMessageBox::information (this, tr ("Incorrect value", "Dialog title"),
+                                            tr ("The split file size \"%1\" is not valid. Only positive numbers can be entered.").arg(StrValue), QMessageBox::Ok);
+            return;
+         }
+         if (pOwn->pRadioButtonFormatEWF->isChecked() && ((NumValue > EWF_MAX_SEGMENT_SIZE) ||
+                                                          (NumValue < EWF_MIN_SEGMENT_SIZE)))
+         {
+            QMessageBox::information (this, tr ("Incorrect value", "Dialog title"),
+                                            tr ("The split size for EWF files must be in the range %1 - %2 MiB.")
+                                            .arg(EWF_MIN_SEGMENT_SIZE) .arg(EWF_MAX_SEGMENT_SIZE), QMessageBox::Ok);
+            return;
+         }
+      }
+   }
+
    // Check for strange characters in filenames
    // -----------------------------------------
-
    pLineEditDestImageFilename = DlgAcquireGetField (CFG_DLGACQUIRE_DEST_IMAGEFILENAME)->pLineEdit;
    pLineEditDestInfoFilename  = DlgAcquireGetField (CFG_DLGACQUIRE_DEST_INFOFILENAME )->pLineEdit;
 
-   ImageFilenameClean     = true;
-   ImageFilenameCorrected = pLineEditDestImageFilename->text();
    if (pOwn->Clone)
    {
       ImageFilenameClean     = true;
@@ -983,37 +1096,47 @@ void t_DlgAcquire::SlotAccept (void)
    // Check if image file already exists
    // ----------------------------------
 
-   QDir    Dir (Acquisition.ImagePath);
-   QString ExtensionImage;
-   bool    Empty;
-   QString NameFilter;
-
-   CHK_EXIT (t_File::GetFormatExtension (Acquisition.Format, Acquisition.Clone, &ExtensionImage))
-   NameFilter = Acquisition.ImageFilename + ExtensionImage;
-   Empty = Dir.entryInfoList (QStringList(NameFilter), QDir::Files, QDir::Name).isEmpty();
-   if (Empty)
-   {
-      Dir.setPath (Acquisition.InfoPath);
-      NameFilter = Acquisition.InfoFilename + t_File::pExtensionInfo;
-      Empty = Dir.entryInfoList (QStringList(NameFilter), QDir::Files, QDir::Name).isEmpty();
-   }
-
-   if (!Empty)
-   {
-      LOG_INFO ("Image file / info files already exist")
-      Button = QMessageBox::question (this, tr ("Files exist", "Dialog title"),
-                                            tr ("The image or info files already exist. Do you want to overwrite them?"),
-                                                QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
-      if (Button == QMessageBox::Yes)
+      QDir    Dir (Acquisition.ImagePath);
+      QString ExtensionImage;
+      bool    Empty;
+      QString NameFilter;
+      int     DdSplitDecimals=0;
+      
+      if (pOwn->Clone)
       {
-         LOG_INFO ("User accepts to overwrite existing image")
+         Empty = true;
       }
       else
       {
-         LOG_INFO ("User rejects to overwrite existing image")
-         return;
+         DdSplitDecimals = t_File::GetDdSplitNrDecimals (pOwn->pDevice->Size, Acquisition.SplitFileSize);
+         CHK_EXIT (t_File::GetFormatExtension (Acquisition.Format, Acquisition.Clone, DdSplitDecimals, &ExtensionImage))
+         NameFilter = Acquisition.ImageFilename + ExtensionImage;
+         Empty = Dir.entryInfoList (QStringList(NameFilter), QDir::Files, QDir::Name).isEmpty();
+      }
+      if (Empty)
+      {
+         Dir.setPath (Acquisition.InfoPath);
+         NameFilter = Acquisition.InfoFilename + t_File::pExtensionInfo;
+         Empty = Dir.entryInfoList (QStringList(NameFilter), QDir::Files, QDir::Name).isEmpty();
+      }
+
+      if (!Empty)
+      {
+         LOG_INFO ("Image file / info files already exist")
+         Button = QMessageBox::question (this, tr ("Files exist", "Dialog title"),
+                                               pOwn->Clone ? tr ("The info file already exists. Do you want to overwrite it?") :
+                                                             tr ("The image or info files already exist. Do you want to overwrite them?"),
+                                               QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
+         if (Button == QMessageBox::Yes)
+         {
+            LOG_INFO ("User accepts to overwrite existing image/info files")
+         }
+         else
+         {
+            LOG_INFO ("User rejects to overwrite existing image/info files")
+            return;
+         }
       }
-   }
    accept();
 }
 
@@ -1021,6 +1144,8 @@ void t_DlgAcquire::SlotAccept (void)
 APIRET t_DlgAcquire::GetParameters (t_Device::t_Acquisition &Acquisition, bool RememberLastUsedValues)
 {
    t_pCfgDlgAcquireField pDlgAcquireField;
+   bool                   SplitFileSwitch;
+   QString                SplitFileSize = "0";
 
    Acquisition.Clone = pOwn->Clone;
    if (pOwn->Clone)
@@ -1037,10 +1162,20 @@ APIRET t_DlgAcquire::GetParameters (t_Device::t_Acquisition &Acquisition, bool R
    }
 
    #define COPY_LINEENTRY(Acq, FieldName, Remember)      \
+   {                                                     \
       pDlgAcquireField = DlgAcquireGetField (FieldName); \
       Acq = pDlgAcquireField->pLineEdit->text();         \
       if (Remember)                                      \
-         pDlgAcquireField->LastEnteredValue = Acq;
+         pDlgAcquireField->LastEnteredValue = Acq;       \
+   }
+
+   #define COPY_CHECKBOX(Acq, FieldName)                 \
+   {                                                     \
+      pDlgAcquireField = DlgAcquireGetField (FieldName); \
+      Acq = pDlgAcquireField->pCheckBox->isChecked();    \
+      if (RememberLastUsedValues)                        \
+         pDlgAcquireField->LastEnteredValue = Acq  ? "1" : "0"; \
+   }
 
    if (!pOwn->Clone)
    {
@@ -1049,23 +1184,22 @@ APIRET t_DlgAcquire::GetParameters (t_Device::t_Acquisition &Acquisition, bool R
       COPY_LINEENTRY (Acquisition.Examiner      , CFG_DLGACQUIRE_EWF_EXAMINER       , RememberLastUsedValues)
       COPY_LINEENTRY (Acquisition.Description   , CFG_DLGACQUIRE_EWF_DESCRIPTION    , RememberLastUsedValues)
       COPY_LINEENTRY (Acquisition.Notes         , CFG_DLGACQUIRE_EWF_NOTES          , RememberLastUsedValues)
+      COPY_CHECKBOX (SplitFileSwitch, CFG_DLGACQUIRE_SPLITFILESWITCH )
+      if (SplitFileSwitch)
+         COPY_LINEENTRY (SplitFileSize, CFG_DLGACQUIRE_SPLITFILESIZE, RememberLastUsedValues)
+      Acquisition.SplitFileSize = SplitFileSize.toULongLong() * BYTES_PER_MEGABYTE;
    }
    COPY_LINEENTRY (Acquisition.ImagePath     , CFG_DLGACQUIRE_DEST_IMAGEDIRECTORY, pOwn->Clone ? false : RememberLastUsedValues)
    COPY_LINEENTRY (Acquisition.ImageFilename , CFG_DLGACQUIRE_DEST_IMAGEFILENAME , pOwn->Clone ? false : RememberLastUsedValues)
    COPY_LINEENTRY (Acquisition.InfoPath      , CFG_DLGACQUIRE_DEST_INFODIRECTORY , RememberLastUsedValues)
    COPY_LINEENTRY (Acquisition.InfoFilename  , CFG_DLGACQUIRE_DEST_INFOFILENAME  , RememberLastUsedValues)
-   #undef COPY_LINEENTRY
-
-   #define COPY_CHECKBOX(Acq, FieldName)                 \
-      pDlgAcquireField = DlgAcquireGetField (FieldName); \
-      Acq = pDlgAcquireField->pCheckBox->isChecked();    \
-      if (RememberLastUsedValues)                        \
-         pDlgAcquireField->LastEnteredValue = Acq  ? "1" : "0";
 
    COPY_CHECKBOX (Acquisition.CalcMD5   , CFG_DLGACQUIRE_HASH_CALC_MD5   )
    COPY_CHECKBOX (Acquisition.CalcSHA256, CFG_DLGACQUIRE_HASH_CALC_SHA256)
    COPY_CHECKBOX (Acquisition.VerifySrc , CFG_DLGACQUIRE_HASH_VERIFY_SRC )
    COPY_CHECKBOX (Acquisition.VerifyDst , CFG_DLGACQUIRE_HASH_VERIFY_DST )
+
+   #undef COPY_LINEENTRY
    #undef COPY_CHECKBOX
 
    return NO_ERROR;
diff --git a/dlgacquire.h b/dlgacquire.h
index b068099..cb4381d 100644
--- a/dlgacquire.h
+++ b/dlgacquire.h
@@ -24,6 +24,7 @@
 #endif
 
 #ifndef __CONFIG_H__
+   class   t_CfgEntryMode;
    class   t_CfgDlgAcquireField;
    typedef t_CfgDlgAcquireField *t_pCfgDlgAcquireField;
 #endif
@@ -42,15 +43,17 @@ class t_DlgAcquire: public QDialog
 
       APIRET GetParameters (t_Device::t_Acquisition &Acquisition, bool RememberLastUsedValues=true);
    private:
-      APIRET AddField             (t_pDevice pDevice, t_pCfgDlgAcquireField pField, QGridLayout *pLayout, int *pRow, int *pCol);
-      APIRET CheckWriteAccess     (const QString &Path, const QString &Filename, bool &Ok);
-      APIRET CreateDeviceTable    (t_pDeviceList pDeviceList, t_pDevice pDeviceSrc, QTableWidget **ppTable);
-      APIRET InsertDeviceTableRow (QTableWidget *pTable, int Row, t_pDeviceList pDeviceList, t_pDevice pDevSrc, t_pDevice pDev);
+      t_CfgEntryMode EntryMode            (t_pCfgDlgAcquireField pField);
+      APIRET         AddField             (t_pDevice pDevice, t_pCfgDlgAcquireField pField, QGridLayout *pLayout, int *pRow, int *pCol);
+      APIRET         CheckWriteAccess     (const QString &Path, const QString &Filename, bool &Ok);
+      APIRET         CreateDeviceTable    (t_pDeviceList pDeviceList, t_pDevice pDeviceSrc, QTableWidget **ppTable);
+      APIRET         InsertDeviceTableRow (QTableWidget *pTable, int Row, t_pDeviceList pDeviceList, t_pDevice pDevSrc, t_pDevice pDev);
 
    private slots:
       void UpdateHashState     (int State=0);
       void UpdateDialogState   (const QString & NewText = QString());
       void UpdateFieldState    (void);
+      void UpdateFileSplitState(void);
       void SlotBrowse          (void);
       void SlotAccept          (void);
       void SlotTextEdited      (t_DlgAcquireLineEdit *pLineEdit, const QString &NewVal);
diff --git a/dlgacquire_private.h b/dlgacquire_private.h
index 69278a0..c28ab22 100755
--- a/dlgacquire_private.h
+++ b/dlgacquire_private.h
@@ -26,7 +26,7 @@
 class   t_DlgAcquireLineEdit;
 typedef t_DlgAcquireLineEdit *t_pDlgAcquireLineEdit;
 
-class   t_DlgAcquireLineEdit: public QLineEdit
+class t_DlgAcquireLineEdit: public QLineEdit
 {
    Q_OBJECT
 
@@ -42,7 +42,7 @@ class   t_DlgAcquireLineEdit: public QLineEdit
          this->Name = Name;
          CHK_QT_EXIT (connect (this, SIGNAL (textEdited     (const QString &)),
                                this, SLOT   (SlotTextEdited (const QString &))))
-
+         setMinimumWidth(fontMetrics().averageCharWidth()*8);
       }
 
      ~t_DlgAcquireLineEdit() {}
diff --git a/file.cpp b/file.cpp
index 9ababe8..91243b3 100644
--- a/file.cpp
+++ b/file.cpp
@@ -17,6 +17,7 @@
 
 #include "libewf.h"
 
+#include "util.h"
 #include "device.h"
 #include "config.h"
 
@@ -40,15 +41,15 @@ APIRET t_File::Init (void)
    return NO_ERROR;
 }
 
-APIRET t_File::GetFormatDescription (t_Format Format, bool Clone, QString &Str)
+APIRET t_File::GetFormatDescription (t_Format Format, bool Clone, int DdSplitDecimals, QString &Str)
 {
    QString SubFormat;
    switch (Format)
    {
       case DD:
-         if (Clone)
-              Str = QObject::tr("Creation of a clone");
-         else Str = QObject::tr("Linux dd raw image");
+         if      (Clone)            Str = QObject::tr("Creation of a clone");
+         else if (DdSplitDecimals)  Str = QObject::tr("Linux split dd raw image");
+         else                       Str = QObject::tr("Linux dd raw image");
          break;
       case EWF:
          switch (CONFIG(EwfFormat))
@@ -75,7 +76,7 @@ APIRET t_File::GetFormatDescription (t_Format Format, bool Clone, QString &Str)
    return NO_ERROR;
 }
 
-APIRET t_File::GetFormatExtension (t_Format Format, bool Clone, QString *pExtWildCards, QString *pExtHumanReadable)
+APIRET t_File::GetFormatExtension (t_Format Format, bool Clone, int DdSplitDecimals, QString *pExtWildCards, QString *pExtHumanReadable)
 {
    QString Wild, Human;
 
@@ -83,7 +84,21 @@ APIRET t_File::GetFormatExtension (t_Format Format, bool Clone, QString *pExtWil
    {
       case DD:
          if (!Clone)
-            Human = Wild = ".dd";
+         {
+            if (DdSplitDecimals)
+            {
+               Human = Wild = ".";
+               while (DdSplitDecimals--)
+               {
+                  Human += "x";
+                  Wild  += "?";
+               }
+            }
+            else
+            {
+               Human = Wild = ".dd";
+            }
+         }
          break;
       case EWF:
          switch (CONFIG(EwfFormat))
@@ -113,3 +128,33 @@ APIRET t_File::GetFormatExtension (t_Format Format, bool Clone, QString *pExtWil
 
    return NO_ERROR;
 }
+
+int t_File::GetDdSplitNrDecimals (t_uint64 DeviceSize, t_uint64 SplitFileSize)
+{
+   int Decimals=0;
+   
+   if (SplitFileSize)
+   {
+      Decimals = UtilCalcDecimals (1 + DeviceSize / SplitFileSize);
+      Decimals = GETMAX (Decimals, 3);
+   }
+   return Decimals;
+}
+
+APIRET t_File::GetFormatDescription (t_pDevice pDevice, QString &Str)
+{
+   CHK (GetFormatDescription (pDevice->Acquisition.Format,
+                              pDevice->Acquisition.Clone,
+                              GetDdSplitNrDecimals (pDevice->Size, pDevice->Acquisition.SplitFileSize),
+                              Str))
+   return NO_ERROR;
+}
+
+APIRET t_File::GetFormatExtension (t_pDevice pDevice, QString *pExtWildCards, QString *pExtHumanReadable)
+{
+   CHK (GetFormatExtension (pDevice->Acquisition.Format,
+                            pDevice->Acquisition.Clone,
+                            GetDdSplitNrDecimals (pDevice->Size, pDevice->Acquisition.SplitFileSize),
+                            pExtWildCards, pExtHumanReadable))
+   return NO_ERROR;
+}
diff --git a/file.h b/file.h
index 87bb11a..74fb304 100644
--- a/file.h
+++ b/file.h
@@ -32,9 +32,13 @@ namespace t_File
 
    extern const char *pExtensionInfo;
 
+   int    GetDdSplitNrDecimals (t_uint64 DeviceSize, t_uint64 SplitFileSize);
+
+   APIRET GetFormatDescription (t_Format Format, bool Clone, int DdSplitDecimals, QString &Str);
+   APIRET GetFormatExtension   (t_Format Format, bool Clone, int DdSplitDecimals, QString *pExtWildcards, QString *pExtHumanReadable=NULL);
+   APIRET GetFormatDescription (t_pDevice pDevice, QString &Str);
+   APIRET GetFormatExtension   (t_pDevice pDevice, QString *pExtWildCards, QString *pExtHumanReadable=NULL);
 
-   APIRET GetFormatDescription (t_Format Format, bool Clone, QString &Str);
-   APIRET GetFormatExtension   (t_Format Format, bool Clone, QString *pExtWildcards, QString *pExtHumanReadable=NULL);
    APIRET Init                 (void);
 }
 
diff --git a/guymager.cfg b/guymager.cfg
index 7262499..d25a426 100644
--- a/guymager.cfg
+++ b/guymager.cfg
@@ -152,10 +152,6 @@ REM                       the image ("BAD SECTOR\0" followed by 501 random bytes
 REM                       then bad sectors are replaced by 512 zero bytes.
 REM                       This parameter only influences images in AFF format.
 REM
-REM EwfSegmentSize        The max. size of the segments in MB. 640MB is a good choice, as the segments
-REM                       fit good on CDs as well as on DVDs. See ewflib for more information. The maximum
-REM                       value is 2047.
-REM
 REM SpecialFilenameChars  By default, guymager only allows the characters a-z, A-Z, 0-9 and _ to figure
 REM                       in the image filenames. If you wannt to allow special chars and you are sure
 REM                       that your destination file system can handle them, you might add them to
@@ -166,7 +162,6 @@ EwfFormat             = Encase5
 EwfCompression        = FAST
 AffCompression        = 1
 AffMarkBadSectors     = TRUE
-EwfSegmentSize        = 640
 SpecialFilenameChars  = ''
 
 REM Acquisition dialog
@@ -180,7 +175,16 @@ REM                Possible values are DD, AFF and EWF.
 DefaultFormat = EWF
 
 REM The parameters below all refer to the acquisition dialog entry fields. Let us explain the different
-REM fields first. There are 5 fields defined by the EWF file format, their names are self-explaining:
+REM fields first. There are 2 fields related to image file fragmentation:
+REM SplitFileSwitch       Decides whether the image file fragmentation is on or off. For EWF images, it
+REM                       is always on and for AFF images always off. For DD images, the user may choose
+REM                       himself.
+REM SplitFileSize         The max. size of the fragments (sometimes called segments) in MiB. The maximum
+REM                       value for EWF images is 2047.
+REM                       2047 is a good choice. For EWF images, the number of files will be reduced to
+REM                       the minimum. For DD images, the fragments stay below the FAT limitation (2GiB).
+
+REM There are 5 fields defined by the EWF file format, their names are self-explaining:
 REM    EwfCaseNumber
 REM    EwfEvidenceNumber
 REM    EwfExaminer
@@ -286,7 +290,8 @@ TABLE DlgAcquireField NoName
    REM Field                Entry mode  Entry mode  Default
    REM name                 image       clone       value
    REM ------------------------------------------------------------------------------------
-       'SplitFileSize'      ShowLast    Hide        '-2047'
+       'SplitFileSwitch'    ShowLast    Hide        '1'
+       'SplitFileSize'      ShowLast    Hide        '2047'
        'EwfCaseNumber'      ShowLast    Hide        ''
        'EwfEvidenceNumber'  ShowDefault Hide        ''
        'EwfExaminer'        ShowLast    Hide        ''
diff --git a/guymager.pro b/guymager.pro
index 1f1b18f..8e26e50 100644
--- a/guymager.pro
+++ b/guymager.pro
@@ -115,6 +115,7 @@ QMAKE_CXXFLAGS_WARN_ON += -fmessage-length=0     # Tell g++ not to split message
 QMAKE_CXXFLAGS_WARN_ON += -fno-strict-aliasing   # Avoid strange error messages when using QVarLengthArray
 QMAKE_CXXFLAGS_RELEASE += -ggdb
 QMAKE_CFLAGS_RELEASE   += -ggdb
+QMAKE_LFLAGS_DEBUG     += -ggdb -rdynamic    # -rdynamic is necessary in order to have the backtrace handler in toolsignal show all information
 QMAKE_LFLAGS_RELEASE   += -ggdb -rdynamic    # -rdynamic is necessary in order to have the backtrace handler in toolsignal show all information
 
 # -----------------------------------------------------------------------------------------------------------------
diff --git a/guymager_de.ts b/guymager_de.ts
index 48ce646..ed95b7f 100644
--- a/guymager_de.ts
+++ b/guymager_de.ts
@@ -1,4 +1,6 @@
-<!DOCTYPE TS><TS>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de_DE" sourcelanguage="en">
 <context>
     <name>QObject</name>
     <message>
@@ -56,6 +58,10 @@ Trotzdem fortfahren?</translation>
         <source>Creation of a clone</source>
         <translation>Erstellen eines Klons</translation>
     </message>
+    <message>
+        <source>Linux split dd raw image</source>
+        <translation>Linux dd-Image, gesplittet</translation>
+    </message>
 </context>
 <context>
     <name>t_DeviceListModel</name>
@@ -206,12 +212,12 @@ Belegung
     </message>
     <message>
         <source>The filenames contain special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>Image filename: %1
-<byte value="x9"/>Info filename: %2
+	Image filename: %1
+	Info filename: %2
 Do you accept these changes?</source>
         <translation>Die Dateinamen enthalten unerlaubte Sonderzeichen. Guymager schlägt stattdessen folgende Namen vor:
-<byte value="x9"/>Image-Dateiname: %1
-<byte value="x9"/>Info-Dateiname: %2
+	Image-Dateiname: %1
+	Info-Dateiname: %2
 Sind Sie mit diesen Änderungen einverstanden?</translation>
     </message>
     <message>
@@ -263,9 +269,9 @@ Sind Sie mit diesen Änderungen einverstanden?</translation>
     </message>
     <message>
         <source>Guymager cannot write to the directory
-<byte value="x9"/>%1
+	%1
 This may be due to insufficient access rights or unsupported filename characters. Please choose another directory.</source>
-        <translation>Der Schreibzugriff auf das Verzeichnis<byte value="x9"/>%1schlug fehl. Dies könnte an unzureichenden Zugriffsrechten oder an Sonderzeichen im Dateinamen liegen. Bitte wählen Sie ein anderes Verzeichnis.</translation>
+        <translation>Der Schreibzugriff auf das Verzeichnis	%1schlug fehl. Dies könnte an unzureichenden Zugriffsrechten oder an Sonderzeichen im Dateinamen liegen. Bitte wählen Sie ein anderes Verzeichnis.</translation>
     </message>
     <message>
         <source>Local device, cannot be written</source>
@@ -285,9 +291,9 @@ This may be due to insufficient access rights or unsupported filename characters
     </message>
     <message>
         <source>The info filename contains special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>%1
+	%1
 Do you accept these changes?</source>
-        <translation>Der Info-Dateiname enthält unerlaubte Sonderzeichen. Guymager schlägt stattdessen folgenden Namen vor:<byte value="x9"/> %1
+        <translation>Der Info-Dateiname enthält unerlaubte Sonderzeichen. Guymager schlägt stattdessen folgenden Namen vor:	 %1
 Sind Sie mit diesen Änderungen einverstanden?</translation>
     </message>
     <message>
@@ -317,6 +323,35 @@ Sind Sie mit diesen Änderungen einverstanden?</translation>
         <source>Used in another clone operation</source>
         <translation>Durch andere Klon-Operation belegt</translation>
     </message>
+    <message>
+        <source>SplitFileSize</source>
+        <translation>Splitgröße (MiB)</translation>
+    </message>
+    <message>
+        <source>SplitFileSwitch</source>
+        <translation>Image splitten</translation>
+    </message>
+    <message>
+        <source>(file extension %1 or %2)</source>
+        <translation>(Datei-Endung %1 oder %2)</translation>
+    </message>
+    <message>
+        <source>Incorrect value</source>
+        <comment>Dialog title</comment>
+        <translation>Ungültiger Wert</translation>
+    </message>
+    <message>
+        <source>The split file size "%1" is not valid. Only positive numbers can be entered.</source>
+        <translation>Die Grösse %1 für die Split-Dateien ist ungültig. Bitte geben Sie einen positiven Wert ein.</translation>
+    </message>
+    <message>
+        <source>The info file already exists. Do you want to overwrite it?</source>
+        <translation>Die Info-Datei existiert bereits. Möchten Sie sie überschreiben?</translation>
+    </message>
+    <message>
+        <source>The split size for EWF files must be in the range %1 - %2 MiB.</source>
+        <translation>Die Split-Grösse von EWF-Dateien muss im Bereich %1 - %2 MiB liegen.</translation>
+    </message>
 </context>
 <context>
     <name>t_DlgDirSel</name>
@@ -496,7 +531,7 @@ Compilation timestamp: %2
 Compiled with gcc %3
 Using libewf %4
 Using libguytools %5</source>
-        <translation>GUYMAGER is ein Linux-basierter, forensischer Imager
+        <translation>GUYMAGER ist ein Linux-basierter, forensischer Imager
 
 Version: %1
 Zeitstempel der Kompilation: %2
@@ -633,6 +668,16 @@ Benutzt libguytools %5</translation>
         <source>Aborting...</source>
         <translation>Abbruch angefragt...</translation>
     </message>
+    <message>
+        <source>none</source>
+        <comment>column hidden areas</comment>
+        <translation>keine</translation>
+    </message>
+    <message>
+        <source>unknown</source>
+        <comment>column hidden areas</comment>
+        <translation>nicht feststellbar</translation>
+    </message>
 </context>
 <context>
     <name>t_Table</name>
diff --git a/guymager_en.ts b/guymager_en.ts
index 111eceb..69cfafe 100644
--- a/guymager_en.ts
+++ b/guymager_en.ts
@@ -1,4 +1,6 @@
-<!DOCTYPE TS><TS>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="en" sourcelanguage="en">
 <context>
     <name>QObject</name>
     <message>
@@ -55,6 +57,10 @@ Continue anyway?</source>
         <source>Creation of a clone</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Linux split dd raw image</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_DeviceListModel</name>
@@ -164,8 +170,8 @@ usage
     </message>
     <message>
         <source>The filenames contain special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>Image filename: %1
-<byte value="x9"/>Info filename: %2
+	Image filename: %1
+	Info filename: %2
 Do you accept these changes?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -251,7 +257,7 @@ Do you accept these changes?</source>
     </message>
     <message>
         <source>Guymager cannot write to the directory
-<byte value="x9"/>%1
+	%1
 This may be due to insufficient access rights or unsupported filename characters. Please choose another directory.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -273,7 +279,7 @@ This may be due to insufficient access rights or unsupported filename characters
     </message>
     <message>
         <source>The info filename contains special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>%1
+	%1
 Do you accept these changes?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -304,6 +310,35 @@ Do you accept these changes?</source>
         <source>Used in another clone operation</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>SplitFileSize</source>
+        <translation>Split size (MiB)</translation>
+    </message>
+    <message>
+        <source>SplitFileSwitch</source>
+        <translation>Split image files</translation>
+    </message>
+    <message>
+        <source>(file extension %1 or %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Incorrect value</source>
+        <comment>Dialog title</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The split file size "%1" is not valid. Only positive numbers can be entered.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The info file already exists. Do you want to overwrite it?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The split size for EWF files must be in the range %1 - %2 MiB.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_DlgDirSel</name>
@@ -614,6 +649,16 @@ Using libguytools %5</source>
         <source>Aborting...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>none</source>
+        <comment>column hidden areas</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>unknown</source>
+        <comment>column hidden areas</comment>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_Table</name>
diff --git a/guymager_fr.ts b/guymager_fr.ts
index d098616..2401fb8 100644
--- a/guymager_fr.ts
+++ b/guymager_fr.ts
@@ -1,80 +1,71 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS><TS version="1.1" language="fr">
+<!DOCTYPE TS>
+<TS version="2.0" language="fr">
 <context>
     <name>QObject</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Ok</source>
         <translation>Ok</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Cancel</source>
         <translation>Annuler</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Linux dd raw image</source>
-        <translation>Image brute Linux dd </translation>
+        <translation>Image brute Linux dd</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Expert Witness Format, sub-format %1</source>
         <translation>Format EWF, sous-format %1 </translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Missing root rights</source>
         <comment>Dialog title</comment>
         <translation>Droits «root»</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Guymager needs to be started with root rights in order to perform acquisitions. You are not root and thus won't be able to acquire devices.
 Continue anyway?</source>
         <translation>Guymager doit être lancé comme «root» pour pouvoir effectuer des acquisitions.
 Continuer quand-même?</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Deleting %1</source>
         <translation>Efface %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Advanced forensic image</source>
         <translation>Format AFF</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Guymager cannot scan the devices connected to this computer.</source>
         <translation>Guymager ne peut déterminer les médias connectés.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>The selected scan method ("%1") is not available. Do you want to try another scan method?</source>
         <translation>La méthode de recherche de médias sélectionnée ("%1") n'est pas accessible. Voulez vous en essayer une autre?</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Abort</source>
         <translation>Terminer</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Try method "%1"</source>
         <translation>Essayer la méthode "%1"</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Creation of a clone</source>
         <translation>Création d'un clone</translation>
     </message>
+    <message>
+        <source>Linux split dd raw image</source>
+        <translation>Image brute Linux dd, fragmentée</translation>
+    </message>
 </context>
 <context>
     <name>t_DeviceListModel</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Linux
 device</source>
         <comment>Column of device table</comment>
@@ -82,13 +73,11 @@ device</source>
 Linux</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Model</source>
         <comment>Column of device table</comment>
         <translation>Modèle</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Serial
 nr.</source>
         <comment>Column of device table</comment>
@@ -96,26 +85,22 @@ nr.</source>
 série</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Size</source>
         <comment>Column of device table</comment>
-        <translation type="unfinished">Capa-
+        <translation>Capa-
 cité</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Remarks</source>
         <comment>Column of device table</comment>
         <translation>Remarques</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>State</source>
         <comment>Column of device table</comment>
         <translation>Etat</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Hidden
 Areas</source>
         <comment>Column of device table</comment>
@@ -123,7 +108,6 @@ Areas</source>
 cachés</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Bad
 sectors</source>
         <comment>Column of device table</comment>
@@ -131,13 +115,11 @@ sectors</source>
 secteurs</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Progress</source>
         <comment>Column of device table</comment>
         <translation>Progrès</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Average
 Speed
 [MB/s]</source>
@@ -147,7 +129,6 @@ moyenne
 [MB/s]</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Time
 remaining</source>
         <comment>Column of device table</comment>
@@ -155,7 +136,6 @@ remaining</source>
 restant</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>FIFO queues
 usage
 [%]</source>
@@ -168,22 +148,18 @@ des FIFOs
 <context>
     <name>t_DlgAbort</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Do you want to abort the acquisition of %1?</source>
         <translation>Voulez vous abandonner l'acquisition de %1?</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Delete partial image files</source>
-        <translation>Effacer les images partiellement écrits?</translation>
+        <translation>Effacer les images partiellement écrites</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Do you want to abort the verification of %1?</source>
         <translation>Voulez vous abandonner la vérification de %1?</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Abort?</source>
         <comment>Dialog title</comment>
         <translation>Abandonner?</translation>
@@ -192,220 +168,211 @@ des FIFOs
 <context>
     <name>t_DlgAcquire</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>EwfCaseNumber</source>
         <translation>Numéro d'affaire</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>EwfEvidenceNumber</source>
         <translation>No. de pièce</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>EwfExaminer</source>
         <translation>Examinateur</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>EwfDescription</source>
         <translation>Description</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>EwfNotes</source>
         <translation>Notes</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>DestImageFilename</source>
         <translation>Nom du fichier image</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>DestInfoFilename</source>
         <translation>Nom du fichier info</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>File format</source>
         <translation>Format fichier</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>(file extension %1)</source>
         <translation>(extension %1)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Destination</source>
         <translation>Destination</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Configuration flag WriteToDevNull is set!</source>
         <translation>Paramètre de configuration WriteToDevNull activé!</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Select destination directory</source>
         <comment>Dialog title</comment>
         <translation>Sélectionner le répertoire de destination</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Special characters</source>
         <comment>Dialog title</comment>
         <translation>Charactères spéciaux</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>The filenames contain special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>Image filename: %1
-<byte value="x9"/>Info filename: %2
+	Image filename: %1
+	Info filename: %2
 Do you accept these changes?</source>
         <translation>Les noms de fichiers contiennent des charactères spéciaux qui ne peuvent être utilisés. Guymager vous propose de modifier les nom comme suit:
-<byte value="x9"/>Nom du fichier image: %1
-<byte value="x9"/>Nom du fichier info: %2
+	Nom du fichier image: %1
+	Nom du fichier info: %2
 Acceptez-vous ces changement?</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>DestImageDirectory</source>
         <translation>Répertoire image</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>DestInfoDirectory</source>
         <translation>Répertoire info</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>...</source>
         <comment>The directory browse button</comment>
         <translation>...</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Access denied</source>
         <comment>Dialog title</comment>
         <translation>Accès refusé</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>HashCalcMD5</source>
         <translation>Calculer MD5</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>HashCalcSHA256</source>
         <translation>Calculer SHA-256</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>HashVerifySrc</source>
         <translation>Vérifier (relire) le média source après acquisition (prend le double de temps)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>HashVerifyDst</source>
         <translation>Vérifier l'image après l'acquisition (prend le double de temps)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Hash calculation / verification</source>
         <translation>Calcul / vérification de valuers hash</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Guymager cannot write to the directory
-<byte value="x9"/>%1
+	%1
 This may be due to insufficient access rights or unsupported filename characters. Please choose another directory.</source>
         <translation>Guymager n'a pu écrire dans le répertoire
-<byte value="x9"/>%1,
+	%1,
 possiblement à cause de droits d'accès insuffisants. Veuillez choisir un autre répertoire.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Local device, cannot be written</source>
         <translation>Média local - ne peut être modifié</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Too small</source>
         <translation>Trop petit</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>In use</source>
         <translation>Occupé</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Ok for cloning</source>
         <translation>Bon pour clonage</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>The info filename contains special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>%1
+	%1
 Do you accept these changes?</source>
-        <translation>Les noms du fichier info contient des charactères spéciaux qui ne peuvent être utilisés. Guymager vous propose de modifier le nom comme suit:<byte value="x9"/>%2Acceptez-vous ces changement?</translation>
+        <translation>Le nom du fichier info contient des charactères spéciaux qui ne peuvent être utilisés. Guymager vous propose de modifier le nom comme suit:	%1
+Acceptez-vous ces changement?</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Files exist</source>
         <comment>Dialog title</comment>
         <translation>Fichier existe</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>The image or info files already exist. Do you want to overwrite them?</source>
         <translation>Les fichiers image ou info de ce nom existent déjà. Voulez vous les réécrire?</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Clone %1</source>
         <comment>Dialog title, %1 is the device (for instance /dev/hdc)</comment>
         <translation>Cloner %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Acquire image of %1</source>
         <comment>Dialog title, %1 is the device (for instance /dev/hdc)</comment>
         <translation>Acquérir image de %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Device to be cloned</source>
         <translation>Média à cloner</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Used in another clone operation</source>
         <translation>Occupé par un autre clonage</translation>
     </message>
+    <message>
+        <source>SplitFileSize</source>
+        <translation>Taille des fragments (MiB)</translation>
+    </message>
+    <message>
+        <source>SplitFileSwitch</source>
+        <translation>Fragmenter image</translation>
+    </message>
+    <message>
+        <source>(file extension %1 or %2)</source>
+        <translation>(extension %1 ou %2)</translation>
+    </message>
+    <message>
+        <source>Incorrect value</source>
+        <comment>Dialog title</comment>
+        <translation>Valeur non-valable</translation>
+    </message>
+    <message>
+        <source>The split file size "%1" is not valid. Only positive numbers can be entered.</source>
+        <translation>La valeur %1 pour la taille des fragments n'est pas valable. Veuillez entrer une valuer positive.</translation>
+    </message>
+    <message>
+        <source>The info file already exists. Do you want to overwrite it?</source>
+        <translation>Un fichier info de ce nom existe déjà. Voulez vous le réécrire?</translation>
+    </message>
+    <message>
+        <source>The split size for EWF files must be in the range %1 - %2 MiB.</source>
+        <translation>La taille des fragments d'une image EWF doit être comprise entre %1 - %2 MiB.</translation>
+    </message>
 </context>
 <context>
     <name>t_DlgDirSel</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Select destination directory</source>
         <comment>Dialog title</comment>
         <translation>Sélectionner le répertoire de destination</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>New directory</source>
         <translation>Nouveau répertoire</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Remove directory</source>
         <translation>Effacer répertoire</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>NewDirectory</source>
         <comment>Name of the new directory that will be created</comment>
         <translation>Nom du nouveau répertoire à créer</translation>
@@ -414,7 +381,6 @@ Do you accept these changes?</source>
 <context>
     <name>t_DlgMessage</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Close</source>
         <translation>Fermer</translation>
     </message>
@@ -422,17 +388,14 @@ Do you accept these changes?</source>
 <context>
     <name>t_Info</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Command executed: %1</source>
         <translation>Commande  exécutée: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>No information can be displayed as a timeout occured while executing the command.</source>
         <translation>Aucune information n'est disponible suite au dépassement du temps d'exécution maximal.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Information returned:</source>
         <translation>Information retournée:</translation>
     </message>
@@ -440,86 +403,70 @@ Do you accept these changes?</source>
 <context>
     <name>t_InfoField</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Size</source>
         <translation>Capacité</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Sector size</source>
         <translation>Capacité secteur</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Image file</source>
         <translation>Nom du fichier image</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Info file</source>
         <translation>Nom du fichier info</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Current speed</source>
         <translation>Vitesse actuelle</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>bytes</source>
         <translation>octets</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Hash calculation</source>
         <translation>Calculer valeurs «hash»</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Source verification</source>
         <translation>Relire et vérifier media</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Started</source>
         <comment>Start timestamp and running time</comment>
         <translation>Démarré</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>MD5 and SHA-256</source>
         <comment>Both hashes are calculated</comment>
         <translation>MD5 et SHA-256</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>MD5</source>
         <translation>MD5</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>SHA-256</source>
         <translation>SHA-256</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>off</source>
         <comment>Hash calculation is off</comment>
         <translation>non</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Image verification</source>
         <translation>Vérification image</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>on</source>
         <comment>Display that verification is on</comment>
         <translation>oui</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>off</source>
         <comment>Display that verification is off</comment>
         <translation>non</translation>
@@ -528,114 +475,93 @@ Do you accept these changes?</source>
 <context>
     <name>t_MainWindow</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Local device</source>
         <translation>Média local</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Idle</source>
         <translation>Libre</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Cleanup</source>
         <translation>Nettoyage</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Finished</source>
         <translation>Fini</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted - Error: Reason is 'none'</source>
         <translation>Abandon - raison «none»</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted by user</source>
         <translation>Abandonné par l'utilisateur</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted - Image file write error</source>
         <translation>Abandon - erreur d'écriture</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted - Device read error</source>
         <translation>Abandon - erreur grave de lecture </translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>&Rescan</source>
         <translation>&Actualiser</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>F5</source>
         <translation>F5</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>&Devices</source>
         <translation>&Médias</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>&Misc</source>
         <comment>Menu entry</comment>
         <translation>&Divers</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Debug</source>
         <comment>Menu entry</comment>
         <translation>Debug</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>&Help</source>
         <comment>Menu entry</comment>
         <translation>&Aide</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>About &GUYMAGER</source>
         <comment>Menu entry</comment>
         <translation>A propos de &GUYMAGER</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>About &Qt</source>
         <comment>Menu entry</comment>
         <translation>A propos de &Qt</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Exit GUYMAGER</source>
         <comment>Dialog title</comment>
         <translation>Quitter GUYMAGER</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>There are active acquisitions. Do you really want to abort them and quit?</source>
         <translation>Il y a toujours des acquisitions en cours. Voulez-vous vraiment quitter le programme?</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Debug information</source>
         <translation>Information «debug»</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>About GUYMAGER</source>
         <comment>Dialog title</comment>
         <translation>A propos de GUYMAGER</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>GUYMAGER is a Linux-based forensic imaging tool
 
 Version: %1
@@ -652,503 +578,426 @@ Utilise libewf %4
 Utilise libguytools %5</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>About Qt</source>
         <comment>Dialog title</comment>
         <translation>A propos de Qt</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Acquisition running</source>
         <translation>Acquisition en cours</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Verification running</source>
         <translation>Vérification en cours</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Device disconnected, acquisition paused</source>
         <translation>Média déconnecté, acquisition suspendue</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Device disconnected, verification paused</source>
         <translation>Média déconnecté, vérification suspendue</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Finished - Verified & ok</source>
         <translation>Fini - Vérification réussie</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Finished - Verification failed</source>
         <translation>Fini - Vérification échouée</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted - Image file verify error</source>
         <translation>Abandon - erreur d'écriture</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Unknown</source>
         <comment>Media info string for informing about hidden areas (HPA/DCO)</comment>
         <translation>Inconnu</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>No</source>
         <comment>Media info string for informing about hidden areas (HPA/DCO)</comment>
         <translation>Non</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Yes</source>
         <comment>Media info string for informing about hidden areas (HPA/DCO)</comment>
         <translation>Oui</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Rescan devices and update table</source>
         <translation>Actualiser la liste des médias connectés</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Add special device</source>
         <comment>Menu entry</comment>
         <translation>Ajouter média spécial</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Open File</source>
         <translation>Ouvrir fichier</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Invalid device</source>
         <comment>Dialog title</comment>
         <translation>Média non-utilisable</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Manually added special device</source>
         <translation>Média spécial ajouté manuellement</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Device alrady contained</source>
         <comment>Dialog title</comment>
         <translation>Média déjà existant</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>The selected file or device already is contained in the table.</source>
         <translation>Le fichier ou média sélectionné figure déja dans la liste.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>The device or file cannot be selected because its size is unknown.</source>
         <translation>Le fichier ou média ne peut être sélectionné parce que sa taille est inconnu.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>The device or file cannot be selected because it contains 0 bytes.</source>
         <translation>Le fichier ou média ne peut être sélectionné parce que sa taille est de 0 octets.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Used in clone operation</source>
         <translation>Occupé par clonage</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborting...</source>
         <translation>Abandon en cours...</translation>
     </message>
+    <message>
+        <source>none</source>
+        <comment>column hidden areas</comment>
+        <translation>aucune</translation>
+    </message>
+    <message>
+        <source>unknown</source>
+        <comment>column hidden areas</comment>
+        <translation>non-détectable</translation>
+    </message>
 </context>
 <context>
     <name>t_Table</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Info</source>
         <comment>Context menu</comment>
         <translation>Info</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Local Device - cannot be acquired</source>
         <translation>Média local - ne peut être acquéré</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Device info</source>
         <comment>Dialog title</comment>
         <translation>Info média</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>GUYMAGER ACQUISITION INFO FILE</source>
         <comment>Info file</comment>
         <translation>FICHIER D'INFORMATION POUR ACQUISITION GUYMAGER</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Guymager</source>
         <comment>Info file</comment>
         <translation>Guymager</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Device information</source>
         <comment>Info file</comment>
         <translation>Information média</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Finished successfully</source>
         <comment>Info file</comment>
         <translation>Fini avec succées</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>(with %1 bad sectors)</source>
         <comment>Info file, may be appended to 'finished successfully' message</comment>
         <translation>(avec %1 mauvais secteurs)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted by user</source>
         <comment>Info file</comment>
         <translation>Abandonné par l'utilisateur</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted because of image write error</source>
         <comment>Info file</comment>
         <translation>Abandonné à cause d'une erreur d'écriture</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted, strange reason (%1)</source>
         <comment>Info file</comment>
         <translation>Abandonné pour une raison inconnue (%1)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Strange state (%1)</source>
         <comment>Info file</comment>
         <translation>Etat inconnu (%1)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>State: %1</source>
         <comment>Info file</comment>
         <translation>Etat: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>During verification, %1 bad sectors have been encountered. The sector numbers are:</source>
         <comment>Info file</comment>
         <translation>Pendant la vérification, %1 mauvais secteurs ont été rencontrés. Leurs numéros sont les suivants:</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>During acquisition, %1 bad sectors have been encountered. They have been replaced by zeroed sectors. The sector numbers are:</source>
         <comment>Info file</comment>
         <translation>Pendant l'acquisition, %1 mauvais secteurs ont été rencontrés. Leurs numéros sont les suivants:</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>No bad sectors encountered during verification.</source>
         <comment>Info file</comment>
         <translation>Aucun mauvais secteur n'a été renconté pendant la vérification.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>No bad sectors encountered during acquisition.</source>
         <comment>Info file</comment>
         <translation>Aucun mauvais secteur n'a été renconté pendant l'acquisition.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>(during acquisition)</source>
         <comment>Info file</comment>
         <translation>(pendant l'acquisition)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>(ISO format YYYY-MM-DD HH:MM:SS)</source>
         <translation>(format ISO AAAA-MM-JJ HH:MM:SS)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Acquisition aborted before start of verification</source>
         <translation>Acquisition abandonnée avant de commencer vérification</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Linux device:: %1</source>
         <comment>Info file</comment>
         <translation>Média Linux:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Device size:: %1 (%2)</source>
         <comment>Info file</comment>
         <translation>Capacité:: %1 (%2)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Acquisition started:: %1</source>
         <comment>Info file</comment>
         <translation>Début de l'acquisition:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Verification started:: %1</source>
         <comment>Info file</comment>
         <translation>Début de la vérification:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Ended:: %1 (%2 hours, %3 minutes and %4 seconds)</source>
         <comment>Info file</comment>
         <translation>Fin:: %1 (%2 heures, %3 minutes et %4 secondes)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Acquisition speed:: %1 MByte/s (%2 hours, %3 minutes and %4 seconds)</source>
         <comment>Info file</comment>
         <translation>Vitesse de l'acquisition:: %1 MByte/s (%2 heures, %3 minutes et %4 secondes)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>--</source>
         <comment>Info file</comment>
         <translation>--</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>MD5 hash:: %1</source>
         <comment>Info file</comment>
         <translation>Hash MD5:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Version:: %1</source>
         <comment>Info file</comment>
         <translation>Version:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Compilation timestamp:: %1</source>
         <comment>Info file</comment>
         <translation>Date et heure de compilation:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Compiled with:: %1 %2</source>
         <comment>Info file</comment>
         <translation>Compilé avec gcc:: %1 %2</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>libewf version:: %1</source>
         <comment>Info file</comment>
         <translation>Version:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>libguytools version:: %1</source>
         <comment>Info file</comment>
         <translation>Version libguytools:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Verification speed:: %1 MByte/s (%2 hours, %3 minutes and %4 seconds)</source>
         <comment>Info file</comment>
         <translation>Vitesse de la vérification:: %1 MByte/s (%2 heures, %3 minutes et %4 secondes)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Hash calculation:: off</source>
         <comment>Info file</comment>
         <translation>Calculer valeurs hash:: non</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Source verification:: on</source>
         <comment>Info file</comment>
         <translation>Relire et vérifier media:: oui</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Source verification:: off</source>
         <comment>Info file</comment>
         <translation>Relire et vérifier media:: non</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>(during source verification)</source>
         <comment>Info file</comment>
         <translation>(pendant la vérification)</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>SHA256 hash:: %1</source>
         <comment>Info file</comment>
         <translation>SHA256 hash:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Hash calculation:: MD5 and SHA-256</source>
         <comment>Info file</comment>
         <translation>Calculer valeurs hash:: MD5 et SHA-256</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Hash calculation:: MD5</source>
         <comment>Info file</comment>
         <translation>Calculer valeurs hash:: MD5</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Hash calculation:: SHA-256</source>
         <comment>Info file</comment>
         <translation>Calculer valeurs hash:: SHA-256</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Image path and file name:: %1</source>
         <comment>Info file</comment>
         <translation>Répertoire et fichier image:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Info  path and file name:: %1</source>
         <comment>Info file</comment>
         <translation>Répertoire et fichier info:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Image verification:: on</source>
         <comment>Info file</comment>
         <translation>Vérification image:: oui</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Image verification:: off</source>
         <comment>Info file</comment>
         <translation>Vérification image:: non</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Aborted because of image read error during verification</source>
         <comment>Info file</comment>
         <translation></translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>MD5 hash verified source:: %1</source>
         <comment>Info file</comment>
         <translation>Hash MD5 source vérifié:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>MD5 hash verified image:: %1</source>
         <comment>Info file</comment>
         <translation>Hash MD5 image vérifié:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>SHA256 hash verified source:: %1</source>
         <comment>Info file</comment>
         <translation>Hash SHA256 source vérifié:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>SHA256 hash verified image:: %1</source>
         <comment>Info file</comment>
         <translation>Hash SHA256 image vérifié:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Source verification OK. The device delivered the same data during acquisition and verification.</source>
         <translation>Vérification source réussie. Les valeurs hash sont identiques. Le média fournissait les mêmes données pendant l'acquisition et la vérification.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Source verification FAILED. The device didn't deliver the same data during acquisition and verification. Check if the defect sector list was the same during acquisition and verification (see above).</source>
         <translation>Vérification source échouée. Les valeurs hash diffèrent. Le média ne fournissait pas les mêmes données pendant l'acquisition et la vérification. Vous aimeriez peut-être relancer l'acquisition. Veuillez aussi vérifier si la liste des mauvais secteurs est la même pour l'acquisition comme pour la vérification (voir en haut).</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Image verification OK. The image contains exactely the data that was written.</source>
         <translation>Vérification image réussie.  Le fichier image contient exactement les données qui ont été écrites lors de l'acquisition.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Image verification FAILED. The data in the image is different from what was written.</source>
         <translation>Vérification image échouée. le fichier image ne contient pas les données qui ont été écrites lors de l'acquisition.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Maybe you try to acquire the device again.</source>
         <translation>Vous pouvez essayer une nouvelle acquisition du média.</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Remove special device</source>
         <comment>Context menu</comment>
         <translation>Effacer média spécial</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Image meta data</source>
         <comment>Info file</comment>
         <translation>Méta-données du fichier image</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source> - file extension is %1</source>
         <comment>Info file</comment>
         <translation> - l'extension fichier est %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Acquire image</source>
         <comment>Context menu</comment>
         <translation>Acquérir image</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Clone device</source>
         <comment>Context menu</comment>
         <translation>Créer clone</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Abort</source>
         <comment>Context menu</comment>
         <translation>Abandonner</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Acquisition</source>
         <comment>Info file</comment>
         <translation>Acquisition</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Format:: %1</source>
         <comment>Info file</comment>
         <translation>Format:: %1</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>Device used for cloning - cannot be acquired</source>
         <translation>Occupé par opération de clonage - ne peut être  acquéré</translation>
     </message>
@@ -1156,13 +1005,11 @@ Utilise libguytools %5</translation>
 <context>
     <name>t_ThreadScan</name>
     <message>
-        <location filename="" line="137886436"/>
         <source>Cannot scan devices</source>
         <comment>Dialog title</comment>
         <translation>Recherche médias échouée</translation>
     </message>
     <message>
-        <location filename="" line="137886436"/>
         <source>None of the device scan methods worked. Exiting now.</source>
         <translation>Toutes les méthodes pour établir la liste médias ont échoués. Le programme sera terminé.</translation>
     </message>
diff --git a/guymager_it.ts b/guymager_it.ts
index e9470e9..1012f86 100644
--- a/guymager_it.ts
+++ b/guymager_it.ts
@@ -1,4 +1,6 @@
-<!DOCTYPE TS><TS>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
 <context>
     <name>QObject</name>
     <message>
@@ -55,6 +57,10 @@ Continue anyway?</source>
         <source>Creation of a clone</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Linux split dd raw image</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_DeviceListModel</name>
@@ -206,8 +212,8 @@ usage
     </message>
     <message>
         <source>The filenames contain special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>Image filename: %1
-<byte value="x9"/>Info filename: %2
+	Image filename: %1
+	Info filename: %2
 Do you accept these changes?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -251,7 +257,7 @@ Do you accept these changes?</source>
     </message>
     <message>
         <source>Guymager cannot write to the directory
-<byte value="x9"/>%1
+	%1
 This may be due to insufficient access rights or unsupported filename characters. Please choose another directory.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -273,7 +279,7 @@ This may be due to insufficient access rights or unsupported filename characters
     </message>
     <message>
         <source>The info filename contains special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>%1
+	%1
 Do you accept these changes?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -304,6 +310,35 @@ Do you accept these changes?</source>
         <source>Used in another clone operation</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>SplitFileSize</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SplitFileSwitch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(file extension %1 or %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Incorrect value</source>
+        <comment>Dialog title</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The split file size "%1" is not valid. Only positive numbers can be entered.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The info file already exists. Do you want to overwrite it?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The split size for EWF files must be in the range %1 - %2 MiB.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_DlgDirSel</name>
@@ -614,6 +649,16 @@ Using libguytools %5</source>
         <source>Aborting...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>none</source>
+        <comment>column hidden areas</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>unknown</source>
+        <comment>column hidden areas</comment>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_Table</name>
diff --git a/guymager_nl.ts b/guymager_nl.ts
index d62857f..5510106 100644
--- a/guymager_nl.ts
+++ b/guymager_nl.ts
@@ -1,4 +1,6 @@
-<!DOCTYPE TS><TS>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
 <context>
     <name>QObject</name>
     <message>
@@ -55,6 +57,10 @@ Continue anyway?</source>
         <source>Creation of a clone</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Linux split dd raw image</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_DeviceListModel</name>
@@ -219,8 +225,8 @@ usage
     </message>
     <message>
         <source>The filenames contain special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>Image filename: %1
-<byte value="x9"/>Info filename: %2
+	Image filename: %1
+	Info filename: %2
 Do you accept these changes?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -251,7 +257,7 @@ Do you accept these changes?</source>
     </message>
     <message>
         <source>Guymager cannot write to the directory
-<byte value="x9"/>%1
+	%1
 This may be due to insufficient access rights or unsupported filename characters. Please choose another directory.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -273,7 +279,7 @@ This may be due to insufficient access rights or unsupported filename characters
     </message>
     <message>
         <source>The info filename contains special characters which are not allowed. Guymager suggests the following changes:
-<byte value="x9"/>%1
+	%1
 Do you accept these changes?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -304,6 +310,35 @@ Do you accept these changes?</source>
         <source>Used in another clone operation</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>SplitFileSize</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SplitFileSwitch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(file extension %1 or %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Incorrect value</source>
+        <comment>Dialog title</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The split file size "%1" is not valid. Only positive numbers can be entered.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The info file already exists. Do you want to overwrite it?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The split size for EWF files must be in the range %1 - %2 MiB.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_DlgDirSel</name>
@@ -614,6 +649,16 @@ Using libguytools %5</source>
         <source>Aborting...</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>none</source>
+        <comment>column hidden areas</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>unknown</source>
+        <comment>column hidden areas</comment>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>t_Table</name>
diff --git a/infofield.cpp b/infofield.cpp
index cca2a26..fc59f6d 100644
--- a/infofield.cpp
+++ b/infofield.cpp
@@ -130,23 +130,33 @@ void t_InfoField::SlotShowInfo (t_pDevice pDevice)
 
       // Hash
       // ----
-      if     ((pDevice->Acquisition.CalcMD5) &&
-              (pDevice->Acquisition.CalcSHA256)) StrValue += "\n" + tr("MD5 and SHA-256" , "Both hashes are calculated");
-      else if (pDevice->Acquisition.CalcMD5)     StrValue += "\n" + tr("MD5"    );
-      else if (pDevice->Acquisition.CalcSHA256)  StrValue += "\n" + tr("SHA-256");
-      else                                       StrValue += "\n" + tr("off", "Hash calculation is off");
-
+      StrValue += "\n";
+      if (!pDevice->StartTimestamp.isNull())
+      {   
+         if     ((pDevice->Acquisition.CalcMD5) &&
+                 (pDevice->Acquisition.CalcSHA256)) StrValue += tr("MD5 and SHA-256" , "Both hashes are calculated");
+         else if (pDevice->Acquisition.CalcMD5)     StrValue += tr("MD5"    );
+         else if (pDevice->Acquisition.CalcSHA256)  StrValue += tr("SHA-256");
+         else                                       StrValue += tr("off", "Hash calculation is off");
+      }
       // Source verification
       // -------------------
-      if (pDevice->Acquisition.VerifySrc)
-           StrValue += "\n" + tr("on" , "Display that verification is on");
-      else StrValue += "\n" + tr("off", "Display that verification is off");
-
+      StrValue += "\n";
+      if (!pDevice->StartTimestamp.isNull())
+      {   
+         if (pDevice->Acquisition.VerifySrc)
+              StrValue += tr("on" , "Display that verification is on");
+         else StrValue += tr("off", "Display that verification is off");
+      }
       // Image verification
       // -------------------
-      if (pDevice->Acquisition.VerifyDst)
-           StrValue += "\n" + tr("on" , "Display that verification is on");
-      else StrValue += "\n" + tr("off", "Display that verification is off");
+      StrValue += "\n";
+      if (!pDevice->StartTimestamp.isNull())
+      {   
+         if (pDevice->Acquisition.VerifyDst)
+              StrValue += tr("on" , "Display that verification is on");
+         else StrValue += tr("off", "Display that verification is off");
+      }
 }
    pOwn->pLabelValues->setText (StrValue);
 }
diff --git a/main.cpp b/main.cpp
index d065f75..28c1ef8 100644
--- a/main.cpp
+++ b/main.cpp
@@ -71,6 +71,7 @@ enum
 #define MAIN_LANGUAGE_FILENAME_QT      "qt_"
 #define MAIN_DEFAULT_MISCFILES_DIR     "/usr/share/guymager/"
 #define MAIN_DEFAULT_LANGUAGE_DIR_QT   "/usr/share/qt4/translations/"
+#define SPLASH_DIR                     MAIN_DEFAULT_MISCFILES_DIR
 
 // ------------------------------------
 //   Application-wide global variables
@@ -258,7 +259,7 @@ static APIRET MainGo (int argc, char *argv[])
    LOG_INFO ("System: %s", QSTR_TO_PSZ(Uname))
 
    t_Log::GetLibGuyToolsVersion (&pLibGuyToolsVersionInstalled);
-   pLibEwfVersionInstalled = libewf_get_version();
+   pLibEwfVersionInstalled = (const char *) libewf_get_version();
    LOG_INFO ("Libguytools version installed on this PC: %s", pLibGuyToolsVersionInstalled)
    LOG_INFO ("Libewf      version installed on this PC: %s", pLibEwfVersionInstalled)
    meminfo();
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 42ec235..d7226c8 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -524,7 +524,7 @@ void t_MainWindow::SlotAboutGuymager (void)
 
    t_Log::GetLibGuyToolsVersion (&pLibGuyToolsVersionInstalled);
 
-   pLibEwfVersionInstalled = libewf_get_version ();
+   pLibEwfVersionInstalled = (const char *) libewf_get_version ();
 
    QMessageBox::about(this, tr("About GUYMAGER", "Dialog title"),
                             tr("GUYMAGER is a Linux-based forensic imaging tool\n\n"
diff --git a/package.sh b/package.sh
index 3405e59..48b5d1e 100755
--- a/package.sh
+++ b/package.sh
@@ -7,9 +7,9 @@
 # or similar instead
 
 if [ -e ../../scripts/package.sh ]; then
-   ../../scripts/package.sh guymager
+   ../../scripts/package.sh guymager-beta
 else
-   ../../../scripts/package.sh guymager # when called from the branches or tags directories
+   ../../../scripts/package.sh guymager-beta # when called from the branches or tags directories
 fi
 
 ./compileinfo.sh | grep Version | awk -F\" ' { print "Version "$2 } '
diff --git a/table.cpp b/table.cpp
index da08450..bf05caf 100644
--- a/table.cpp
+++ b/table.cpp
@@ -49,6 +49,8 @@ t_Table::t_Table ()
 t_Table::t_Table (QWidget *pParent, t_MainWindow *pMainWindow, t_pDeviceList pDeviceList)
    :QTableView (pParent)
 {
+//   setStyleSheet("QTableView {background-color: yellow;}");
+
    CHK_EXIT (TOOL_ERROR_REGISTER_CODE (ERROR_TABLE_INVALID_ACTION                ))
    CHK_EXIT (TOOL_ERROR_REGISTER_CODE (ERROR_TABLE_THREADREAD_ALREADY_RUNNING    ))
    CHK_EXIT (TOOL_ERROR_REGISTER_CODE (ERROR_TABLE_THREADHASH_ALREADY_RUNNING    ))
@@ -230,7 +232,7 @@ APIRET t_Table::InfoAcquisitionStart (t_pDevice pDevice)
    CHK (pDevice->Info.Title   (tr("GUYMAGER ACQUISITION INFO FILE", "Info file")))
 
    t_Log::GetLibGuyToolsVersion (&pLibGuyToolsVersionInstalled);
-   pLibEwfVersionInstalled = libewf_get_version ();
+   pLibEwfVersionInstalled = (const char *) libewf_get_version ();
 
    CHK (pDevice->Info.WriteLn ())
    CHK (pDevice->Info.Title   (tr("Guymager", "Info file")))
@@ -253,8 +255,8 @@ APIRET t_Table::InfoAcquisitionStart (t_pDevice pDevice)
    CHK (pDevice->Info.WriteLn ())
    CHK (pDevice->Info.Title   (tr("Acquisition", "Info file")))
    CHK (pDevice->Info.WriteLn ())
-   CHK (t_File::GetFormatDescription (pDevice->Acquisition.Format, pDevice->Acquisition.Clone,        FormatDescription))
-   CHK (t_File::GetFormatExtension   (pDevice->Acquisition.Format, pDevice->Acquisition.Clone, NULL, &FormatExtension))
+   CHK (t_File::GetFormatDescription (pDevice,        FormatDescription))
+   CHK (t_File::GetFormatExtension   (pDevice, NULL, &FormatExtension))
    CHK (pDevice->Info.AddRow (tr("Linux device:: %1"    , "Info file").arg(pDevice->LinuxDevice)))
    CHK (pDevice->Info.AddRow (tr("Device size:: %1 (%2)", "Info file").arg(pDevice->Size) .arg(t_Device::GetSizeHuman(pDevice).toString())))
    Str = tr("Format:: %1", "Info file") .arg(FormatDescription);
diff --git a/threadwrite.cpp b/threadwrite.cpp
index 11a64b2..cddec26 100644
--- a/threadwrite.cpp
+++ b/threadwrite.cpp
@@ -49,10 +49,12 @@ class t_OutputFileDD: public t_OutputFile
 {
    public:
       t_OutputFileDD (void) :
-          oFile       (-1),
-          oLastCheckT (0),
-         poVerifyBuff (NULL),
-         poDevice     (NULL)
+          oFile                (-1),
+          oLastCheckT          (0),
+         poVerifyBuff          (NULL),
+         poDevice              (NULL),
+          oSplitNr             (0),
+          oCurrentVerifyFileNr (0)
       {
       } //lint -esym(613, t_OutputFileDD::poFile)  Possible use of NULL pointer
         //lint -esym(668, fclose, fwrite)  Possibly passing NULL pointer
@@ -63,10 +65,9 @@ class t_OutputFileDD: public t_OutputFile
             (void) t_OutputFileDD::Close();
       } //lint !e1740
 
-      APIRET Open (t_pDevice pDevice, bool /* Verify */)
+      APIRET Open (t_pDevice pDevice, bool Verify)
       {
          QString Extension;
-         int     Flags;
 
          poDevice = pDevice;
          if (CONFIG (WriteToDevNull))
@@ -75,21 +76,18 @@ class t_OutputFileDD: public t_OutputFile
          }
          else
          {
-            CHK (t_File::GetFormatExtension (pDevice->Acquisition.Format, pDevice->Acquisition.Clone, &Extension))
-            oFilename = pDevice->Acquisition.ImagePath + pDevice->Acquisition.ImageFilename + Extension;
+            CHK (t_File::GetFormatExtension (pDevice, &Extension))
+            oFilename = pDevice->Acquisition.ImagePath + pDevice->Acquisition.ImageFilename;
+            if (pDevice->Acquisition.SplitFileSize == 0)
+                 oFilename += Extension;
+            else oSplitNrDecimals = t_File::GetDdSplitNrDecimals (pDevice->Size, pDevice->Acquisition.SplitFileSize);
          }
 
-//         Flags = O_NOATIME | Verify ? O_RDONLY : O_WRONLY; // Doesn't work... !??
-         Flags = O_NOATIME | O_RDWR;
-         if (!pDevice->Acquisition.Clone)
-            Flags |= O_CREAT;              // Create it if doesn't exist
+//       oFileFlags = O_NOATIME | Verify ? O_RDONLY : O_WRONLY; // Doesn't work... !??
+         oFileFlags = O_NOATIME | O_RDWR;
+         if (!pDevice->Acquisition.Clone && !Verify)
+            oFileFlags |= O_CREAT;              // Create it if doesn't exist
 
-         oFile = open64 (QSTR_TO_PSZ (oFilename), Flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
-         if (oFile < 0)
-         {
-            LOG_ERROR ("open64 on %s failed, errno=%d '%s'", QSTR_TO_PSZ (oFilename), errno, ToolErrorTranslateErrno (errno))
-            return ERROR_THREADWRITE_OPEN_FAILED;
-         }
          time (&oLastCheckT);
 
          return NO_ERROR;
@@ -97,24 +95,50 @@ class t_OutputFileDD: public t_OutputFile
 
       APIRET Write (t_pFifoBlock pFifoBlock)
       {
-         size_t  Remaining = pFifoBlock->DataSize;
-         size_t  Offset = 0;
-         ssize_t Written;
-         time_t  NowT;
+         size_t   RemainingData = pFifoBlock->DataSize;
+         size_t   Offset = 0;
+         ssize_t  Written;
+         time_t   NowT;
 
-         while (Remaining)
+         while (RemainingData)
          {
-            Written = write (oFile, &pFifoBlock->Buffer[Offset], Remaining);
+            if (!Opened())
+            {
+               QString Extension;
+               QString Filename;
+               if (poDevice->Acquisition.SplitFileSize)
+               {
+                  Extension = QString(".%1").arg(oSplitNr++, oSplitNrDecimals, 10, QChar('0'));
+                  oRemainingFileSize = poDevice->Acquisition.SplitFileSize;
+               }
+               else
+               {
+                  oRemainingFileSize = ULONG_LONG_MAX;
+               }
+               Filename = QSTR_TO_PSZ (oFilename+Extension); // Do a QSTR_TO_PSZ conversion here in order to work everywhere with exactly the same filename
+               oFilenameList += Filename;
+               oFile = open64 (QSTR_TO_PSZ (Filename), oFileFlags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+               if (oFile < 0)
+               {
+                  LOG_ERROR ("open64 on %s failed, errno=%d '%s'", QSTR_TO_PSZ (oFilename), errno, ToolErrorTranslateErrno (errno))
+                  return ERROR_THREADWRITE_OPEN_FAILED;
+               }
+            }
+
+            Written = write (oFile, &pFifoBlock->Buffer[Offset], GETMIN(RemainingData, oRemainingFileSize));
             if (Written < 0)
             {
                LOG_ERROR ("write failed, oFile %d, errno=%d '%s'", oFile, errno, ToolErrorTranslateErrno (errno))
                return ERROR_THREADWRITE_WRITE_FAILED;
             }
-            Remaining -= Written;
-            Offset    += Written;
+            RemainingData      -= Written;
+            oRemainingFileSize -= Written;
+            Offset             += Written;
+            if (oRemainingFileSize == 0)
+               Close();
          }
 
-         if (poDevice->Acquisition.Clone)    // It was observed, that the write or fwrite functions do not detect device removal! It is unknown
+         if (poDevice->Acquisition.Clone)    // It was observed that the write or fwrite functions do not detect device removal! It is unknown
          {                                   // how this is possible... Therefore, we check the existence of the device every 2 seconds by means
             time (&NowT);                    // of a seperate fopen/flclose.
             if ((NowT - oLastCheckT) >=2)
@@ -140,44 +164,52 @@ class t_OutputFileDD: public t_OutputFile
 
       APIRET Verify (t_pHashContextMD5 pHashContextMD5, t_pHashContextSHA256 pHashContextSHA256, quint64 *pPos)
       {
-         unsigned int ToRead;
-         unsigned int Remaining;
-         quint64      TotalRemaining;
-         off64_t      rc;
-         ssize_t      Read;
-         ssize_t      Offset=0;
+         ssize_t Read;
 
-         if (*pPos == 0)
+         if (*pPos == 0)       // First call of this function?
          {
-            rc = lseek64 (oFile, 0, SEEK_SET);
-            if (rc < 0)
-               return ERROR_THREADWRITE_VERIFY_FAILED;
             poVerifyBuff = UTIL_MEM_ALLOC (poDevice->FifoBlockSize);
             if (poVerifyBuff == NULL)
                CHK (ERROR_THREADWRITE_MALLOC_FAILED);
          }
-         TotalRemaining = poDevice->Size - *pPos;
-         Remaining = GETMIN (TotalRemaining, poDevice->FifoBlockSize);
-         ToRead    = Remaining;
 
-         while (Remaining)
+         if (!Opened())
          {
-            Read = read (oFile, (char*)poVerifyBuff + Offset, ToRead);
-            if (Read < 0)
-               return ERROR_THREADWRITE_VERIFY_FAILED;
-            Remaining -= Read;
-            Offset    += Read;
+            QString Filename = oFilenameList[oCurrentVerifyFileNr++];
+            oFile = open64 (QSTR_TO_PSZ (Filename), oFileFlags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+            off64_t FileSize;
+            bool    Err = (oFile < 0);
+            if (!Err) Err = ((FileSize = lseek64 (oFile,0,SEEK_END)) == -1);
+            if (!Err) Err = (lseek64 (oFile, 0, SEEK_SET) != 0);
+            if (Err)
+            {
+               LOG_ERROR ("Opening %s failed, errno=%d '%s'", QSTR_TO_PSZ (oFilename), errno, ToolErrorTranslateErrno (errno))
+               return ERROR_THREADWRITE_OPEN_FAILED;
+            }
+            oRemainingFileSize = (t_uint64) FileSize;
          }
 
-         if (pHashContextMD5)    CHK_EXIT (HashMD5Append    (pHashContextMD5   , poVerifyBuff, ToRead))
-         if (pHashContextSHA256) CHK_EXIT (HashSHA256Append (pHashContextSHA256, poVerifyBuff, ToRead))
+         Read = read (oFile, (char*)poVerifyBuff, GETMIN(poDevice->FifoBlockSize, oRemainingFileSize));
+         if (Read < 0)
+         {
+            QString Filename = oFilenameList[oCurrentVerifyFileNr-1];
+            LOG_ERROR ("read failed, oFile %d [%s], errno=%d '%s'", oFile, QSTR_TO_PSZ (Filename), errno, ToolErrorTranslateErrno (errno))
+            return ERROR_THREADWRITE_VERIFY_FAILED;
+         }
+         oRemainingFileSize -= Read;
 
-         *pPos += ToRead;
+         if (oRemainingFileSize == 0)
+            Close0 (false);
+
+         if (pHashContextMD5)    CHK_EXIT (HashMD5Append    (pHashContextMD5   , poVerifyBuff, Read))
+         if (pHashContextSHA256) CHK_EXIT (HashSHA256Append (pHashContextSHA256, poVerifyBuff, Read))
+
+         *pPos += Read;
 
          return NO_ERROR;
       }
 
-      APIRET Close (void)
+      APIRET Close0 (bool ReleaseMem)
       {
          int Res;
 
@@ -192,7 +224,7 @@ class t_OutputFileDD: public t_OutputFile
             return ERROR_THREADWRITE_CLOSE_FAILED;
          }
 
-         if (poVerifyBuff)
+         if (poVerifyBuff && ReleaseMem)
          {
             UTIL_MEM_FREE (poVerifyBuff);
             poVerifyBuff = NULL;
@@ -200,6 +232,11 @@ class t_OutputFileDD: public t_OutputFile
          return NO_ERROR;
       }
 
+      APIRET Close (void)
+      {
+         return Close0 (true);
+      }
+
       void * GetFileHandle (void)
       {
          if (oFile == -1)
@@ -207,17 +244,23 @@ class t_OutputFileDD: public t_OutputFile
          else return &oFile;
       }
 
-      bool Opened (void)
+      inline bool Opened (void)
       {
          return (oFile != -1);
       }
 
    private:
-      int        oFile;
-      time_t     oLastCheckT; // Only used when cloning, see above
-      QString    oFilename;
-      void     *poVerifyBuff;
-      t_pDevice poDevice;
+      QStringList oFilenameList;
+      int         oFile;
+      time_t      oLastCheckT; // Only used when cloning, see above
+      QString     oFilename;
+      void      *poVerifyBuff;
+      t_pDevice  poDevice;
+      int         oSplitNr;
+      int         oSplitNrDecimals;
+      int         oFileFlags;
+      t_uint64    oRemainingFileSize;
+      int         oCurrentVerifyFileNr;
 };
 
 #define CHK_LIBEWF(Fn)                                                 \
@@ -270,7 +313,7 @@ class t_OutputFileEWF: public t_OutputFile
             QDir          Dir(pDevice->Acquisition.ImagePath);
             int           i;
 
-            CHK (t_File::GetFormatExtension (pDevice->Acquisition.Format, pDevice->Acquisition.Clone, &ExtensionImage))
+            CHK (t_File::GetFormatExtension (pDevice, &ExtensionImage))
             FileInfoList = Dir.entryInfoList (QStringList(pDevice->Acquisition.ImageFilename + ExtensionImage), QDir::Files, QDir::Name);
             oImageFileCount = FileInfoList.count();
             poImageFilenameArr = (char **) malloc (oImageFileCount * sizeof (char*));
@@ -305,7 +348,7 @@ class t_OutputFileEWF: public t_OutputFile
             CHK_LIBEWF (libewf_set_media_size         (pFile, pDevice->Size))
             CHK_LIBEWF (libewf_set_bytes_per_sector   (pFile, pDevice->SectorSize))
             CHK_LIBEWF (libewf_set_sectors_per_chunk  (pFile, 64))
-            CHK_LIBEWF (libewf_set_segment_file_size  (pFile, (unsigned int) (CONFIG (EwfSegmentSize) * BYTES_PER_MEGABYTE)))
+            CHK_LIBEWF (libewf_set_segment_file_size  (pFile, (unsigned int) (pDevice->Acquisition.SplitFileSize)))
             CHK_LIBEWF (libewf_set_compression_values (pFile, CONFIG (EwfCompression), 1))
             CHK_LIBEWF (libewf_set_media_type         (pFile, pDevice->Removable ? LIBEWF_MEDIA_TYPE_REMOVABLE : LIBEWF_MEDIA_TYPE_FIXED))
             CHK_LIBEWF (libewf_set_volume_type        (pFile, LIBEWF_VOLUME_TYPE_PHYSICAL))
@@ -475,7 +518,7 @@ class t_OutputFileAFF: public t_OutputFile
          oVerification =  Verify;
          oHasCompressionThreads = pDevice->HasCompressionThreads();
 
-         CHK (t_File::GetFormatExtension (pDevice->Acquisition.Format, pDevice->Acquisition.Clone, &Extension))
+         CHK (t_File::GetFormatExtension (pDevice, &Extension))
          FileName = pDevice->Acquisition.ImagePath + pDevice->Acquisition.ImageFilename + Extension;
 
          if (oVerification)
@@ -813,9 +856,11 @@ void t_ThreadWrite::run (void)
          rc = pOwn->pOutputFile->Write (pFifoBlock);
 
          pDevice->IncCurrentWritePos (pFifoBlock->DataSize);
-         if (rc == ERROR_THREADWRITE_WRITE_FAILED)
+         if ((rc == ERROR_THREADWRITE_WRITE_FAILED) || 
+             (rc == ERROR_THREADWRITE_OPEN_FAILED))
          {
-            LOG_ERROR ("Could not write to destination file %s", QSTR_TO_PSZ (pOwn->pDevice->Acquisition.ImageFilename))
+            const char *pAction = (rc == ERROR_THREADWRITE_WRITE_FAILED) ? "write to" : "open";
+            LOG_ERROR ("Could not %s destination file %s", pAction, QSTR_TO_PSZ (pOwn->pDevice->Acquisition.ImageFilename))
             LOG_INFO ("Last block sizes: %d - %d - %zd ", pFifoBlock->BufferSize, pFifoBlock->DataSize, pFifoBlock->EwfDataSize)
             pDevice->AbortReason  = t_Device::ThreadWriteWriteError;
             pDevice->AbortRequest = true;
@@ -986,7 +1031,7 @@ APIRET t_ThreadWrite::DeleteImageFiles (bool AlsoDeleteInfoFile)
    if (!pDevice->Acquisition.Clone)
    {
       LOG_INFO ("Deleting existing image files of the same name")
-      CHK (t_File::GetFormatExtension (pDevice->Acquisition.Format, pDevice->Acquisition.Clone, &ExtensionImage))
+      CHK (t_File::GetFormatExtension (pDevice, &ExtensionImage))
       CHK (DeleteImageFiles0 (pDevice, DirImage, QStringList(pDevice->Acquisition.ImageFilename + ExtensionImage)))
    }
    if (AlsoDeleteInfoFile)
diff --git a/util.cpp b/util.cpp
index 3dec0c2..06e12cb 100644
--- a/util.cpp
+++ b/util.cpp
@@ -58,3 +58,13 @@ void UtilMemFree (void *pMem, const char *pFile, int Line)
    }
 }
 
+int UtilCalcDecimals (t_uint64 Value)
+{
+   QString Str;
+
+   Str.setNum (Value);
+   return Str.length();
+}
+
+
+
diff --git a/util.h b/util.h
index 03bd1de..37bdaa5 100644
--- a/util.h
+++ b/util.h
@@ -15,6 +15,8 @@
 void *UtilMemAlloc (size_t Size, const char *pFile, int Line);
 void  UtilMemFree  (void *pMem , const char *pFile, int Line);
 
+int UtilCalcDecimals (t_uint64 Value);
+
 #define UTIL_MEM_ALLOC(Size) UtilMemAlloc (Size, __FILE__, __LINE__)
 #define UTIL_MEM_FREE(pMem)  UtilMemFree  (pMem, __FILE__, __LINE__)
 

-- 
debian-forensics/guymager



More information about the forensics-changes mailing list