reman3/Rayman_X/cpa/Appli/BigFileTool/BigFileToolDlg.cpp

1975 lines
60 KiB
C++

// BigFileToolDlg.cpp : implementation file
//
#include "stdafx.h"
#include "BigFileTool.h"
#include "BigFileToolDlg.h"
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include <shlobj.h>
#include "Scripts.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include <math.h>
#define C_szBigFileName "data.000"
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
long PTC_g_lCurrentRandom;
//------------------------------------------------------------------------
//
// Author Marc Trabucato
// Date 26 mars 1999
//
// Prototype PTC_fn_lGetCryptKey
// Parameters _lValue :
// Return Type DWORD
//
// Description Get the key used to crypt the file
//
//------------------------------------------------------------------------
DWORD PTC_fn_lGetCryptKey(DWORD _lValue)
{
DWORD lTmp;
_lValue ^= 123459876;
lTmp = _lValue / 127773;
_lValue = 16807 * (_lValue - lTmp * 127773) - 2836 * lTmp;
if (_lValue < 0) _lValue += 2147483647;
return _lValue;
}
//------------------------------------------------------------------------
long PTC_fn_lGetRandom()
{
long lTmp;
PTC_g_lCurrentRandom ^= 123459876;
lTmp = PTC_g_lCurrentRandom / 127773;
PTC_g_lCurrentRandom = 16807 * (PTC_g_lCurrentRandom - lTmp * 127773) - 2836 * lTmp;
if (PTC_g_lCurrentRandom < 0) PTC_g_lCurrentRandom += 2147483647;
return PTC_g_lCurrentRandom;
}
//------------------------------------------------------------------------
//
// Author Marc Trabucato
// Date 26 mars 1999
//
// Prototype PTC_fn_lGetProtectionKey
// Parameters _lValue :
// Return Type DWORD
//
// Description Get the key added to the file
//
//------------------------------------------------------------------------
DWORD PTC_fn_lGetProtectionKey(DWORD _lValue)
{
DWORD lTmp;
_lValue ^= 123459876;
lTmp = _lValue / 44488;
_lValue = 48271 * (_lValue - lTmp * 44488) - 3399 * lTmp;
if (_lValue < 0) _lValue += 2147483647;
return _lValue;
}
//------------------------------------------------------------------------
long PTC_fn_lGetRandomRange(long _lMin , long _lMax)
{
return (_lMin + (PTC_fn_lGetRandom() % (_lMax - _lMin)));
}
//------------------------------------------------------------------------
DWORD fn_dwAlignToSectorSize(DWORD dwSize, DWORD dwSectorSize)
{
return ((1 + (dwSize / dwSectorSize)) * dwSectorSize);
}
//------------------------------------------------------------------------
DWORD fn_dwGetTotalHeaderSize(DWORD dwFileNumber, DWORD dwOccur, DWORD dwSectorSize)
{
// Keys (4 DWORD) + MapNumber (DWORD) + OccurNumber (DOWRD) + Offset (DWORD)
return fn_dwAlignToSectorSize(16 + 4 + 4 + (dwOccur* dwFileNumber) * 4 , dwSectorSize);
}
//------------------------------------------------------------------------
DWORD fn_dwGetHeaderSizeForAFile(DWORD dwOccur, DWORD dwSectorSize)
{
// Keys (4 DWORD) + Offset
return fn_dwAlignToSectorSize(16 + dwOccur * 4 , dwSectorSize);
}
//------------------------------------------------------------------------
DWORD fn_dwGetHeaderSizeforAnOccur(DWORD dwFileNumber, DWORD dwSectorSize)
{
// Keys (4 DWORD) + Offset
return fn_dwAlignToSectorSize(16 + dwFileNumber * 4 , dwSectorSize);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBigFileToolDlg dialog
#define M_SPIN(nID) ((CSpinButtonCtrl*) GetDlgItem (nID))
#define M_EDIT(nID) ((CEdit*)GetDlgItem(nID))
#define M_LIST(nID) ((CListBox*)GetDlgItem(nID))
#define M_BT(nID) ((CButton*)GetDlgItem(nID))
CBigFileToolDlg::CBigFileToolDlg(CWnd* pParent /*=NULL*/)
: CDialog(CBigFileToolDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CBigFileToolDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CBigFileToolDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBigFileToolDlg)
DDX_Control(pDX, IDC_PROGRESS, m_Ctrl_ProgressBar);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBigFileToolDlg, CDialog)
//{{AFX_MSG_MAP(CBigFileToolDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_BN_CLICKED(IDC_BUTTON_RUN, OnButtonRun)
ON_BN_CLICKED(IDC_BUTTON_BROWSESCRIPT, OnButtonBrowsescript)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBigFileToolDlg message handlers
BOOL CBigFileToolDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// Init Scripts
fn_vInitScr();
// Init Controls
M_SPIN(IDC_SPIN_SIZE) -> SetRange (1 , 500);
M_LIST(IDC_LIST_WORK) -> ResetContent ();
M_BT(IDC_CHECK_DELETEFILES) -> SetCheck (FALSE);
if (AfxGetApp () -> m_lpCmdLine[0] == '\0')
{
ReadINIFile ();
}
else
{
InitWithCommandLine ();
}
if (m_bAutoRun)
{
PostMessage(WM_COMMAND , MAKEWPARAM(IDC_BUTTON_RUN,BN_CLICKED) , (LPARAM)GetDlgItem (IDC_BUTTON_RUN) -> m_hWnd);
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CBigFileToolDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CBigFileToolDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CBigFileToolDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
/*=======================================================================================
* Description BN_CLICKED message handles : button "Run"
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
void CBigFileToolDlg::OnButtonRun()
{
BOOL bResult;
// Disables buttons
GetDlgItem (IDC_BUTTON_RUN) -> EnableWindow (FALSE);
GetDlgItem (IDOK) -> EnableWindow (FALSE);
m_bGenerateInfoFiles = M_BT(IDC_CHECK_INFO) -> GetCheck ();
// Save choices
WriteINIFile ();
// Run process
bResult = Run();
// Restore buttons
GetDlgItem (IDC_BUTTON_RUN) -> EnableWindow (TRUE);
GetDlgItem (IDOK) -> EnableWindow (TRUE);
if (m_bAutoRun)
{
if (bResult) OnOK ();
else OnCancel();
}
}
/*=======================================================================================
* Description BN_CLICKED message handles : button "Browse Script"
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
void CBigFileToolDlg::OnButtonBrowsescript()
{
OnBrowse (IDC_EDIT_SCRIPTDATAPATH);
}
/*=======================================================================================
* Description BN_CLICKED message handles : button "Browse Binary"
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
void CBigFileToolDlg::OnButtonBrowse()
{
OnBrowse (IDC_EDIT_DATAPATH);
}
/*=======================================================================================
* Description Open a Browse dialog and update nID control with result
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
void CBigFileToolDlg::OnBrowse(UINT nID)
{
BROWSEINFO bi;
LPSTR lpBuffer = (LPSTR)malloc(_MAX_PATH);
LPITEMIDLIST pidlBrowse; // PIDL selected by user
// Fill in the BROWSEINFO structure.
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = lpBuffer;
bi.lpszTitle = "Choose a Path";
bi.ulFlags = 0;
bi.lpfn = NULL;
bi.lParam = 0;
// Browse for a folder and return its PIDL.
pidlBrowse = SHBrowseForFolder(&bi);
if (pidlBrowse != NULL)
{
if (SHGetPathFromIDList(pidlBrowse, lpBuffer))
{
M_EDIT(nID) -> SetWindowText(lpBuffer);
}
}
// Clean up.
free(lpBuffer);
}
/*=======================================================================================
* Description BN_CLICKED message handles : button "Cancel"
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
void CBigFileToolDlg::OnCancel()
{
fn_vDesinitScr();
CDialog::OnCancel();
}
/*=======================================================================================
* Description BN_CLICKED message handles : button "OK"
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
void CBigFileToolDlg::OnOK()
{
fn_vDesinitScr();
CDialog::OnOK();
}
#define M_Run_Assert(bTest,szTitle,szMessage) \
if(!(bTest)) \
{ \
MessageBox (szMessage,szTitle,MB_OK + MB_ICONERROR); \
return FALSE; \
}
/*=======================================================================================
* Description Run process
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
BOOL CBigFileToolDlg::Run()
{
char szDataPath[MAX_PATH];
char szScriptDataPath[MAX_PATH];
CListOfFileInfo oFIList;
tdstMixUpInfo *_a_MUITab;
DWORD dwBigFileSize;
char szText[128];
char szBigFileName[MAX_PATH];
CStringList oListOfMaps;
tdstHeaderInfo *_a_HITab;
tdstBigFileInfo stBFI;
BOOL bResult;
// Get script data path
M_EDIT(IDC_EDIT_SCRIPTDATAPATH) -> GetWindowText (szScriptDataPath , MAX_PATH);
if(szScriptDataPath[strlen (szScriptDataPath) - 1] != '\\')
{
strcat (szScriptDataPath , "\\");
}
M_LIST(IDC_LIST_WORK) -> AddString ("Read Game.dsc");
M_LIST(IDC_LIST_WORK) -> AddString ("");
// read Game.dsc to get list of maps
bResult = fn_bReadGameDsc (szScriptDataPath , &oListOfMaps);
M_Run_Assert(bResult,"ERROR","Can't find Game.dsc file");
sprintf (szText , "\t%d maps in Game.dsc" , oListOfMaps . GetCount ());
M_LIST(IDC_LIST_WORK) -> AddString (szText);
// Message Pump
PeekAndPump ();
// Get Data Path
M_EDIT(IDC_EDIT_DATAPATH) -> GetWindowText (szDataPath , MAX_PATH);
if(szDataPath[strlen (szDataPath) - 1] != '\\')
{
strcat (szDataPath , "\\");
}
strcat (szDataPath , "World\\Levels\\");
// Get BigfileSize;
M_EDIT(IDC_EDIT_SIZE) -> GetWindowText (szText , 10);
dwBigFileSize = 1024 * 1024 * atol (szText);
// get list of rt* files and total size
ReadListOfFiles (szDataPath , &oListOfMaps , &oFIList);
// Message Pump
PeekAndPump ();
/*
// mix up files
bResult = MixUpFiles (dwBigFileSize , &oFIList , &_a_MUITab, &stBFI);
// Message Pump
PeekAndPump ();
// create Big File
strcpy (szBigFileName , szDataPath);
strcat (szBigFileName , C_szBigFileName);
HANDLE hFile = CreateFile (szBigFileName , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
// Message Pump
PeekAndPump ();
// Write Header
bResult = WriteHeader (hFile , &oFIList , _a_MUITab , &stBFI);
// Write rt* Files
bResult = WriteFiles (szDataPath , hFile , &oFIList , _a_MUITab , &stBFI);
*/
// mix up files
bResult = MixUpFilesWithExplodedHeader(dwBigFileSize , &oFIList , &_a_MUITab, &stBFI , &_a_HITab);
M_Run_Assert(bResult,"Error",m_csErrorMessage);
// Message Pump
PeekAndPump ();
// create Big File
strcpy (szBigFileName , szDataPath);
strcat (szBigFileName , C_szBigFileName);
HANDLE hFile = CreateFile (szBigFileName , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
M_Run_Assert(hFile != INVALID_HANDLE_VALUE,"Error","Can't create data.000 file");
// Message Pump
PeekAndPump ();
// Write file
bResult = WriteBigFileWithExplodedHeader(szDataPath , hFile, &oFIList, _a_MUITab, &stBFI , _a_HITab);
M_Run_Assert(bResult,"Error",m_csErrorMessage);
{
CString csText;
csText . Format ("\tSize of Big File : %ld" , GetFileSize (hFile , NULL));
M_LIST(IDC_LIST_WORK) -> AddString (csText);
}
// Close Big File
CloseHandle (hFile);
if (M_BT(IDC_CHECK_DELETEFILES) -> GetCheck ())
{
DeleteFiles (szScriptDataPath , &oFIList);
}
if (M_BT(IDC_CHECK_STARTPRG) -> GetCheck ())
{
UpdateStartPrg ();
}
// free
while (oFIList . GetCount ()) free (oFIList . RemoveHead ());
free (_a_MUITab);
M_LIST(IDC_LIST_WORK) -> AddString ("=================================================");
M_LIST(IDC_LIST_WORK) -> AddString ("BigFile Generated");
M_LIST(IDC_LIST_WORK) -> AddString ("=================================================");
return TRUE;
}
//------------------------------------------------------------------------
//
// Author Marc Trabucato
// Date 24 mars 1999
//
// Prototype CBigFileToolDlg::PeekAndPump
// Return Type void
//
// Description
//
//------------------------------------------------------------------------
void CBigFileToolDlg::PeekAndPump()
{
MSG msg;
LONG lIdle = 0;
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if (!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return;
}
}
while(AfxGetApp()->OnIdle(lIdle++));
}
/*=======================================================================================
* Description Read default values on INI file
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
void CBigFileToolDlg::ReadINIFile()
{
CString csText;
// Script Data Path
csText = AfxGetApp () -> GetProfileString("Default" , "ScriptDataPath");
M_EDIT(IDC_EDIT_SCRIPTDATAPATH) -> SetWindowText (csText);
// Binary Data Path
csText = AfxGetApp () -> GetProfileString("Default" , "BinaryDataPath");
M_EDIT(IDC_EDIT_DATAPATH) -> SetWindowText (csText);
// BigFile Size
csText = AfxGetApp () -> GetProfileString("Default" , "BigFileSize");
M_EDIT(IDC_EDIT_SIZE) -> SetWindowText (csText);
M_SPIN(IDC_SPIN_SIZE) -> SetPos (atol ((char*)(LPCTSTR)csText));
// Generate Info
M_BT(IDC_CHECK_INFO) -> SetCheck (AfxGetApp () -> GetProfileInt("Default" , "GenerateInfo" , 0));
// Delete File
M_BT(IDC_CHECK_DELETEFILES) -> SetCheck (AfxGetApp () -> GetProfileInt("Default" , "DeleteFiles" , 0));
// AutoRun
m_bAutoRun = FALSE;
// Update StartPrg.ini
M_BT(IDC_CHECK_STARTPRG) -> SetCheck (AfxGetApp () -> GetProfileInt("Default" , "UpdateStartPrg" , 0));
}
/*=======================================================================================
* Description Save current values on INI file
*
* Creation date 23/03/99
* Author Marc Trabucato
*=====================================================================================*/
void CBigFileToolDlg::WriteINIFile()
{
CString csText;
// Script Data Path
M_EDIT(IDC_EDIT_SCRIPTDATAPATH) -> GetWindowText (csText);
AfxGetApp () -> WriteProfileString("Default" , "ScriptDataPath" , csText);
// Binary Data Path
M_EDIT(IDC_EDIT_DATAPATH) -> GetWindowText (csText);
AfxGetApp () -> WriteProfileString("Default" , "BinaryDataPath" , csText);
// BigFile Size
M_EDIT(IDC_EDIT_SIZE) -> GetWindowText (csText);
AfxGetApp () -> WriteProfileString("Default" , "BigFileSize" , csText);
// Generate Info
AfxGetApp () -> WriteProfileInt("Default" , "GenerateInfo" , M_BT(IDC_CHECK_INFO) -> GetCheck ());
// Delete File
AfxGetApp () -> WriteProfileInt("Default" , "DeleteFiles" , M_BT(IDC_CHECK_DELETEFILES) -> GetCheck ());
// Update StartPrg.ini
AfxGetApp () -> WriteProfileInt("Default" , "UpdateStartPrg" , M_BT(IDC_CHECK_STARTPRG) -> GetCheck ());
}
//------------------------------------------------------------------------
//
// Author Marc Trabucato
// Date 23 mars 1999
//
// Prototype CBigFileToolDlg::InitWithCommandLine
// Return Type void
//
// Description
//
//------------------------------------------------------------------------
void CBigFileToolDlg::InitWithCommandLine()
{
LPSTR lpCommandLine = AfxGetApp () -> m_lpCmdLine;
char szParam[MAX_PATH];
char *p_cScriptDataPath = strstr (lpCommandLine , "-scriptpath:");
char *p_cBinaryDataPath = strstr (lpCommandLine , "-binarypath:");
char *p_cBigFileSize = strstr (lpCommandLine , "-bigfilesize:");
char *p_cDeleteFile = strstr (lpCommandLine , "-deletefile");
char *p_cGenerateInfo = strstr (lpCommandLine , "-generateinfo");
char *p_cAutoRun = strstr (lpCommandLine , "-autorun");
char *p_cStartPrg = strstr (lpCommandLine , "-startprg");
// Script Data Path
if (p_cScriptDataPath)
{
sscanf(p_cScriptDataPath + 12 , "%s" , szParam);
M_EDIT(IDC_EDIT_SCRIPTDATAPATH) -> SetWindowText (szParam);
}
// Binary Data Path
if (p_cBinaryDataPath)
{
sscanf(p_cBinaryDataPath + 12 , "%s" , szParam);
M_EDIT(IDC_EDIT_DATAPATH) -> SetWindowText (szParam);
}
// Big File Size
if (p_cBigFileSize)
{
sscanf(p_cBigFileSize + 13 , "%s" , szParam);
M_EDIT(IDC_EDIT_SIZE) -> SetWindowText (szParam);
M_SPIN(IDC_SPIN_SIZE) -> SetPos (atol (szParam));
}
// Delete File
M_BT(IDC_CHECK_DELETEFILES) -> SetCheck (p_cDeleteFile != NULL);
// Generate Info
M_BT(IDC_CHECK_INFO) -> SetCheck (p_cGenerateInfo != NULL);
// AutoRun
m_bAutoRun = (p_cAutoRun != NULL);
// Update StartPrg.ini
M_BT(IDC_CHECK_STARTPRG) -> SetCheck (p_cStartPrg != NULL);
}
/*------------------------------------------------------------------------
*
* Author Marc Trabucato
* Date 14 avr. 1999
*
* Prototype CBigFileToolDlg::UpdateStartPrg
* Return Type void
*
* Description
*
*------------------------------------------------------------------------*/
void CBigFileToolDlg::UpdateStartPrg()
{
char szScriptDataPath[MAX_PATH];
M_LIST(IDC_LIST_WORK) -> AddString ("");
M_LIST(IDC_LIST_WORK) -> AddString ("Update StartPrg.ini");
M_LIST(IDC_LIST_WORK) -> AddString ("");
// Get script data path
M_EDIT(IDC_EDIT_SCRIPTDATAPATH) -> GetWindowText (szScriptDataPath , MAX_PATH);
if(szScriptDataPath[strlen (szScriptDataPath) - 1] == '\\')
{
szScriptDataPath[strlen (szScriptDataPath) - 1] = 0;
}
// compute StartPrg.ini FileName
char *p_cSeparator = strrchr (szScriptDataPath , '\\');
if (p_cSeparator)
{
p_cSeparator++;
sprintf (p_cSeparator , "%s" , "StartPrg.ini");
//
WritePrivateProfileString ("Start" , "UsesBigFile" , "Yes" , szScriptDataPath);
}
}
////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------
//
// Author Marc Trabucato
// Date 22 mars 1999
//
// Prototype CBigFileToolDlg::ReadListOfFiles
// Parameters _p_oList :
// Return Type void
//
// Description Read List of rt* files
//
//------------------------------------------------------------------------
void CBigFileToolDlg::ReadListOfFiles(char *_szDataPath , CStringList *_p_oMapList , CListOfFileInfo *_p_oList)
{
WIN32_FIND_DATA stWFDFile;
HANDLE hFDFile;
char szFileName[MAX_PATH];
DWORD dwMapNumber;
CListBox *pLB = M_LIST(IDC_LIST_WORK);
char szText[128];
pLB -> AddString ("");
pLB -> AddString ("Search rt* files");
pLB -> AddString ("");
m_Ctrl_ProgressBar . SetRange (0 , _p_oMapList -> GetCount ());
m_Ctrl_ProgressBar . SetPos (0);
m_Ctrl_ProgressBar . SetStep (1);
POSITION xPos = _p_oMapList -> GetHeadPosition ();
while (xPos)
{
char *p_cMapName = (char*)(LPCTSTR) _p_oMapList -> GetNext (xPos);
tdstFileInfo *p_stFI;
// rtb file
p_stFI = (tdstFileInfo*) malloc (sizeof tdstFileInfo);
sprintf (szFileName , "%s%s\\%s.rtb" , _szDataPath , p_cMapName , p_cMapName);
sprintf (p_stFI -> szFileName , "%s\\%s.rtb" , p_cMapName , p_cMapName);
hFDFile = FindFirstFile (szFileName, &stWFDFile);
p_stFI -> dwSize = (hFDFile != INVALID_HANDLE_VALUE ? stWFDFile . nFileSizeLow : 0);
_p_oList -> AddTail (p_stFI);
FindClose (hFDFile);
// rtp file
p_stFI = (tdstFileInfo*) malloc (sizeof tdstFileInfo);
sprintf (szFileName , "%s%s\\%s.rtp" , _szDataPath , p_cMapName , p_cMapName);
sprintf (p_stFI -> szFileName , "%s\\%s.rtp" , p_cMapName , p_cMapName);
hFDFile = FindFirstFile (szFileName, &stWFDFile);
p_stFI -> dwSize = (hFDFile != INVALID_HANDLE_VALUE ? stWFDFile . nFileSizeLow : 0);
_p_oList -> AddTail (p_stFI);
FindClose (hFDFile);
// rts file
p_stFI = (tdstFileInfo*) malloc (sizeof tdstFileInfo);
sprintf (szFileName , "%s%s\\%s.rts" , _szDataPath , p_cMapName , p_cMapName);
sprintf (p_stFI -> szFileName , "%s\\%s.rts" , p_cMapName , p_cMapName);
hFDFile = FindFirstFile (szFileName, &stWFDFile);
p_stFI -> dwSize = (hFDFile != INVALID_HANDLE_VALUE ? stWFDFile . nFileSizeLow : 0);
_p_oList -> AddTail (p_stFI);
FindClose (hFDFile);
// rtt file
p_stFI = (tdstFileInfo*) malloc (sizeof tdstFileInfo);
sprintf (szFileName , "%s%s\\%s.rtt" , _szDataPath , p_cMapName , p_cMapName);
sprintf (p_stFI -> szFileName , "%s\\%s.rtt" , p_cMapName , p_cMapName);
hFDFile = FindFirstFile (szFileName, &stWFDFile);
p_stFI -> dwSize = (hFDFile != INVALID_HANDLE_VALUE ? stWFDFile . nFileSizeLow : 0);
_p_oList -> AddTail (p_stFI);
FindClose (hFDFile);
m_Ctrl_ProgressBar . StepIt ();
}
//
dwMapNumber = 0;
xPos = _p_oList -> GetHeadPosition ();
while (xPos)
{
tdstFileInfo *p_stFI = _p_oList -> GetNext (xPos);
p_stFI -> dwMapNumber = dwMapNumber++;
}
sprintf (szText , "\t%d rt? files" , _p_oList -> GetCount ());
pLB -> AddString (szText);
}
#define M_SECTOR_SIZE 2048
//------------------------------------------------------------------------
//
// Author Marc Trabucato
// Date 22 mars 1999
//
// Prototype CBigFileToolDlg::MixUpFiles
// Parameters _p_oFIList :
// _p_oMUIList :
// Return Type void
//
// Description
//
//------------------------------------------------------------------------
BOOL CBigFileToolDlg::MixUpFiles(DWORD _dwBigFileSize , CListOfFileInfo *_p_oFIList , tdstMixUpInfo **_a_MUITab, tdstBigFileInfo *p_stBFI)
{
DWORD dwArraySize;
POSITION xPos;
tdstMixUpInfo *p_stMUI;
DWORD dwOffSet;
DWORD dwMaxSize = 0;
M_LIST(IDC_LIST_WORK) -> AddString ("");
M_LIST(IDC_LIST_WORK) -> AddString ("Mix up files");
M_LIST(IDC_LIST_WORK) -> AddString ("");
// compute total size
M_LIST(IDC_LIST_WORK) -> AddString ("\tCompute total size");
p_stBFI -> dwTotalSize = 0;
xPos = _p_oFIList -> GetHeadPosition ();
while (xPos)
{
DWORD dwSize = _p_oFIList -> GetNext (xPos) -> dwSize;
dwSize = fn_dwAlignToSectorSize(dwSize + 4, M_SECTOR_SIZE); // add protect-key to each file
p_stBFI -> dwTotalSize += dwSize;
}
p_stBFI -> dwNbFile = _p_oFIList -> GetCount ();
// compute number of occurrences
M_LIST(IDC_LIST_WORK) -> AddString ("\tCompute number of occurrences");
p_stBFI -> dwNbOccur = 1 + (_dwBigFileSize / p_stBFI -> dwTotalSize);
{
CString csText;
csText . Format ("\t%d occurrences of %d files" , p_stBFI -> dwNbOccur , p_stBFI -> dwNbFile);
M_LIST(IDC_LIST_WORK) -> AddString (csText);
}
//
LARGE_INTEGER PerformanceCount;
QueryPerformanceCounter (&PerformanceCount);
PTC_g_lCurrentRandom = PerformanceCount . LowPart;
// Create Array
dwArraySize = p_stBFI -> dwNbOccur * p_stBFI -> dwNbFile;
*_a_MUITab = (tdstMixUpInfo*) malloc (dwArraySize * sizeof(tdstMixUpInfo));
// Fill Array
p_stMUI = *_a_MUITab;
p_stBFI -> dwMaxFileSize = 0;
for (DWORD dwOccur = 0 ; dwOccur < p_stBFI -> dwNbOccur ; dwOccur++)
{
xPos = _p_oFIList -> GetHeadPosition ();
while (xPos)
{
tdstFileInfo *p_stFI = _p_oFIList -> GetAt (xPos);
p_stMUI -> xFileInfoPosition = xPos;
p_stMUI -> dwOccur = dwOccur;
p_stMUI -> dwOffSet = 0;
p_stMUI -> dwMapNumber = p_stFI -> dwMapNumber;
p_stMUI -> dwSize = fn_dwAlignToSectorSize(p_stFI -> dwSize + 4, M_SECTOR_SIZE); // add protect-key to each file
p_stMUI -> p_cFileName = p_stFI -> szFileName;
p_stBFI -> dwMaxFileSize = max (p_stBFI -> dwMaxFileSize, p_stMUI -> dwSize);
_p_oFIList -> GetNext (xPos);
p_stMUI++;
}
}
// MixUp Array
//
M_LIST(IDC_LIST_WORK) -> AddString ("\tMix up files and Compute OffSets");
// Init Offset
p_stBFI -> dwBigHeaderSize = fn_dwGetTotalHeaderSize(p_stBFI -> dwNbFile , p_stBFI -> dwNbOccur , M_SECTOR_SIZE);
dwOffSet = p_stBFI -> dwBigHeaderSize;
for (DWORD dwIndex = 0 ; dwIndex < dwArraySize-1 ; dwIndex++)
{
DWORD dwNewPosition = PTC_fn_lGetRandomRange (dwIndex+1 , dwArraySize);
// swap
tdstMixUpInfo stMUITmp;
stMUITmp = (*_a_MUITab)[dwIndex];
(*_a_MUITab)[dwIndex] = (*_a_MUITab)[dwNewPosition];
(*_a_MUITab)[dwNewPosition] = stMUITmp;
// compute OffSet
(*_a_MUITab)[dwIndex] . dwOffSet = dwOffSet;
// increase OffSet
dwOffSet += (*_a_MUITab)[dwIndex] . dwSize;
}
// compute OffSet of last one
(*_a_MUITab)[dwArraySize-1] . dwOffSet = dwOffSet;
return TRUE;
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
BOOL CBigFileToolDlg::WriteHeader(HANDLE hFile, CListOfFileInfo *_p_oFIList, tdstMixUpInfo *_a_MUITab, tdstBigFileInfo *p_stBFI)
{
DWORD dwNumberOfMUI = p_stBFI -> dwNbOccur * p_stBFI -> dwNbFile;
tdstMixUpInfo *p_stMUI = _a_MUITab;
tdstMixUpInfo *p_stMUIEnd = _a_MUITab + dwNumberOfMUI;
DWORD *a_OffSet;
DWORD dwWritten;
DWORD dwKeys[4];
DWORD dwCount;
DWORD *p_dwHeader,*p_dwCurrentPos,*p_dwBeginOfCryptHeader,*p_dwEndHeader;
M_LIST(IDC_LIST_WORK) -> AddString ("");
M_LIST(IDC_LIST_WORK) -> AddString ("Write Header");
M_LIST(IDC_LIST_WORK) -> AddString ("");
// Compute Header Size : Keys + MapNumber + OccurNumber + Offset
p_dwCurrentPos = p_dwHeader = (DWORD*) malloc (p_stBFI -> dwBigHeaderSize);
p_dwEndHeader = p_dwHeader + (p_stBFI -> dwBigHeaderSize>>2);
m_Ctrl_ProgressBar . SetRange (0 , p_stBFI -> dwBigHeaderSize << 2);
m_Ctrl_ProgressBar . SetPos (2);
{
CString csText;
csText . Format ("\tSize of header : %d" , p_stBFI -> dwBigHeaderSize);
M_LIST(IDC_LIST_WORK) -> AddString (csText);
}
// Compute and write keys
dwCount = 0;
M_LIST(IDC_LIST_WORK) -> AddString ("\tCompute keys");
for (int i=0 ; i<4 ; i++ )
{
dwKeys[i] = PTC_fn_lGetRandom();
*p_dwCurrentPos++ = dwKeys[i];
m_Ctrl_ProgressBar . SetStep (1);
dwCount++;
}
p_dwBeginOfCryptHeader = p_dwCurrentPos;
// Write Number of map
M_LIST(IDC_LIST_WORK) -> AddString ("\tWrite Number of files");
*p_dwCurrentPos++ = p_stBFI -> dwNbFile;
m_Ctrl_ProgressBar . SetStep (1);
dwCount++;
// Write number of occur
M_LIST(IDC_LIST_WORK) -> AddString ("\tWrite number of occur");
*p_dwCurrentPos++ = p_stBFI -> dwNbOccur;
m_Ctrl_ProgressBar . SetStep (1);
dwCount++;
// Compute OffSet
M_LIST(IDC_LIST_WORK) -> AddString ("\tCompute OffSet");
a_OffSet = p_dwCurrentPos;
while (p_stMUI != p_stMUIEnd)
{
//
DWORD dwIndex = p_stBFI -> dwNbOccur * p_stMUI -> dwMapNumber + p_stMUI -> dwOccur;
a_OffSet [ dwIndex ] = p_stMUI -> dwOffSet ;
// next
p_stMUI++;
m_Ctrl_ProgressBar . SetStep (1);
}
if (m_bGenerateInfoFiles)
{
char szText[255];
HANDLE hDebugFile = CreateFile ("BigFile.txt" , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
DWORD dwMap , dwOcc, dwW;
sprintf (szText , "Keys : 0x%08x - 0x%08x - 0x%08x - 0x%08x\x0D\x0A" , dwKeys[0] , dwKeys[1] , dwKeys[2] , dwKeys[3]);
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
for (dwOcc = 0 ; dwOcc < p_stBFI -> dwNbOccur ; dwOcc++)
{
sprintf (szText , "==============================================================================\x0D\x0A");
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
for (dwMap = 0 ; dwMap < p_stBFI -> dwNbMap ; dwMap+=4)
{
DWORD dwIndex = p_stBFI -> dwNbOccur * dwMap + dwOcc;
sprintf (szText , "Map : %02d : Occur %02d : 0x%08x - 0x%08x - 0x%08x - 0x%08x\x0D\x0A" , dwMap >> 2, dwOcc , a_OffSet [dwIndex] , a_OffSet [dwIndex + p_stBFI -> dwNbOccur] ,a_OffSet [dwIndex + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur] ,a_OffSet [dwIndex + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur]);
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
}
}
sprintf (szText , "==============================================================================\x0D\x0A");
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
CloseHandle (hDebugFile);
}
p_dwCurrentPos = a_OffSet + (p_stBFI -> dwNbOccur * p_stBFI -> dwNbFile);
dwCount += p_stBFI -> dwNbOccur * p_stBFI -> dwNbFile;
// fill to align to Sector Size
while (p_dwCurrentPos != p_dwEndHeader)
{
*p_dwCurrentPos++ = PTC_fn_lGetRandom();
m_Ctrl_ProgressBar . SetStep (1);
dwCount++;
}
ASSERT(dwCount == (p_stBFI -> dwBigHeaderSize>>2));
// crypt file
p_dwCurrentPos = p_dwBeginOfCryptHeader;
while (p_dwCurrentPos != p_dwEndHeader)
{
*p_dwCurrentPos = (*p_dwCurrentPos ^ dwKeys[1]) + dwKeys[0];
*p_dwCurrentPos++;
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
}
// Write File
WriteFile (hFile , p_dwHeader , p_stBFI -> dwBigHeaderSize , &dwWritten , NULL);
free (p_dwHeader);
return TRUE;
}
//------------------------------------------------------------------------
//
// Author Marc Trabucato
// Date 22 mars 1999
//
// Prototype CBigFileToolDlg::WriteFiles
// Parameters hFile :
// _p_oFIList :
// _p_oMUIList :
// Return Type void
//
// Description Write all files to Big File
//
//------------------------------------------------------------------------
BOOL CBigFileToolDlg::WriteFiles(char *_szDataPath , HANDLE hFile, CListOfFileInfo *_p_oFIList, tdstMixUpInfo *_a_MUITab, tdstBigFileInfo *p_stBFI)
{
DWORD dwNumberOfMUI = p_stBFI -> dwNbOccur * p_stBFI -> dwNbFile;
tdstMixUpInfo *p_stMUI = _a_MUITab;
tdstMixUpInfo *p_stMUIEnd = _a_MUITab + dwNumberOfMUI;
char szFileName[MAX_PATH];
char *p_cBeginFileName;
DWORD dwRead , dwWritten;
char szText[255];
HANDLE hDebugFile;
DWORD dwW,dwCount;
DWORD dwCurrentOffSet;
unsigned char a_ucKeys[4];
unsigned char a_ucCode[4];
unsigned char a_ucProtection[4];
DWORD *p_dwKey = (DWORD*)a_ucKeys;
DWORD *p_dwProtection = (DWORD*)a_ucProtection;
M_LIST(IDC_LIST_WORK) -> AddString ("");
M_LIST(IDC_LIST_WORK) -> AddString ("Write files");
M_LIST(IDC_LIST_WORK) -> AddString ("");
m_Ctrl_ProgressBar . SetRange (0 , dwNumberOfMUI);
m_Ctrl_ProgressBar . SetPos (0);
m_Ctrl_ProgressBar . SetStep (1);
strcpy (szFileName , _szDataPath);
p_cBeginFileName = szFileName + strlen (_szDataPath);
HGLOBAL hMem = GlobalAlloc (GHND , p_stBFI -> dwMaxFileSize + 4 + 4);
char *p_Buffer = (char*) GlobalLock (hMem);
char *p_Begin;
if (m_bGenerateInfoFiles)
{
hDebugFile = CreateFile ("BigFile.log" , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
dwCurrentOffSet = p_stBFI -> dwBigHeaderSize;
dwCount = 0;
}
while (p_stMUI != p_stMUIEnd)
{
tdstFileInfo *p_stFI = _p_oFIList -> GetAt (p_stMUI -> xFileInfoPosition);
// compute crypt int-key
a_ucCode[0] = (unsigned char) (p_stMUI -> dwMapNumber >> 2);
a_ucCode[1] = (unsigned char) (p_stMUI -> dwMapNumber % 4);
a_ucCode[2] = (unsigned char) (p_stMUI -> dwOccur & 0x000000FF);
a_ucCode[3] = ~a_ucCode[2];
// compute crypt key
*p_dwKey = PTC_fn_lGetCryptKey (*(DWORD*)a_ucCode);
// compute protection key
*p_dwProtection = PTC_fn_lGetProtectionKey (*(DWORD*)a_ucCode);
// fill Debug File
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE)
{
sprintf (szText , "%03d - OffSet : 0x%08x - init-key : 0x%02x%02x%02x%02x => crypt-key : 0x%08x => protect-key : 0x%08x - Map : %s\x0D\x0A"
, dwCount++ , dwCurrentOffSet , a_ucCode[0] , a_ucCode[1] , a_ucCode[2] , a_ucCode[3] , *p_dwKey , *p_dwProtection , p_cBeginFileName );
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
}
// copy Protect key to buffer
memcpy (p_Buffer , p_dwProtection , 4);
// open Source file
strcpy (p_cBeginFileName , p_stFI -> szFileName);
HANDLE hSourceFile = CreateFile ( szFileName, GENERIC_READ , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
// Copy File
// Read initial file
ReadFile (hSourceFile , p_Buffer + 4 , p_stFI -> dwSize + 1 , &dwRead , NULL);
CloseHandle (hSourceFile);
dwRead += 4; // protect key size
// crypt buffer
unsigned char *p_ucBeginBuffer = (unsigned char*)p_Buffer;
unsigned char *p_ucEndBuffer = (unsigned char*)p_Buffer + dwRead;
while (p_ucBeginBuffer != p_ucEndBuffer)
{
*p_ucBeginBuffer = (*p_ucBeginBuffer ^ a_ucKeys[1]) + a_ucKeys[0];
a_ucKeys[0] += a_ucKeys[2];
a_ucKeys[1] += a_ucKeys[3];
p_ucBeginBuffer++;
}
p_Begin = p_Buffer + dwRead;
// Fill to long alignment
while (dwRead % 4)
{
*p_Begin = (unsigned char) PTC_fn_lGetRandomRange (0, 255);
p_Begin++;
dwRead++;
}
// Fill to align to sector size
while (dwRead < p_stMUI -> dwSize)
{
DWORD dwRandom = PTC_fn_lGetRandom();
memcpy (p_Begin , &dwRandom , 4);
p_Begin += 4;
dwRead += 4;
}
// write buffer
WriteFile(hFile , p_Buffer , p_stMUI -> dwSize , &dwWritten , NULL);
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE) dwCurrentOffSet += dwWritten;
m_Ctrl_ProgressBar . StepIt ();
// next
p_stMUI++;
// Message Pump
PeekAndPump ();
}
GlobalUnlock (hMem);
GlobalFree (hMem);
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE) CloseHandle (hDebugFile);
m_Ctrl_ProgressBar . SetPos (0);
return TRUE;
}
//------------------------------------------------------------------------
//
// Author Marc Trabucato
// Date 23 mars 1999
//
// Prototype CBigFileToolDlg::DeleteFiles
// Parameters _szDataPath :
// _p_oList :
// Return Type void
//
// Description
//
//------------------------------------------------------------------------
void CBigFileToolDlg::DeleteFiles(char *_szDataPath , CListOfFileInfo * _p_oList)
{
POSITION xPos;
char szFileName[MAX_PATH];
char *p_cBeginFileName;
M_LIST(IDC_LIST_WORK) -> AddString ("");
M_LIST(IDC_LIST_WORK) -> AddString ("Delete files");
M_LIST(IDC_LIST_WORK) -> AddString ("");
m_Ctrl_ProgressBar . SetRange (0 , _p_oList -> GetCount ());
m_Ctrl_ProgressBar . SetPos (0);
m_Ctrl_ProgressBar . SetStep (1);
strcpy (szFileName , _szDataPath);
p_cBeginFileName = szFileName + strlen (_szDataPath);
xPos = _p_oList -> GetHeadPosition ();
while (xPos)
{
tdstFileInfo *p_stFI = _p_oList -> GetNext (xPos);
strcpy (p_cBeginFileName , p_stFI -> szFileName);
if (_access(szFileName , 00) == 0)
{
remove (szFileName);
}
m_Ctrl_ProgressBar . StepIt ();
}
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
int fn_iCompareHeaderInfo(const void *elem1, const void *elem2 )
{
tdstHeaderInfo *p_stHI1 = (tdstHeaderInfo*)elem1;
tdstHeaderInfo *p_stHI2 = (tdstHeaderInfo*)elem2;
if (p_stHI1 -> dwOffSet < p_stHI2 -> dwOffSet) return -1;
else if (p_stHI1 -> dwOffSet == p_stHI2 -> dwOffSet) return 0;
else return 1;
}
#define M_Arround(x) (floor(x * 1000000.0) / 1000000.0)
//------------------------------------------------------------------------
//------------------------------------------------------------------------
BOOL CBigFileToolDlg::MixUpFilesWithExplodedHeader(DWORD _dwBigFileSize , CListOfFileInfo *_p_oFIList , tdstMixUpInfo **_a_MUITab, tdstBigFileInfo *p_stBFI, tdstHeaderInfo **_a_HITab)
{
DWORD dwArraySize , dwNextHeaderPos , dwHeaderNumber;
POSITION xPos;
tdstMixUpInfo *p_stMUI;
DWORD dwOffSet;
DWORD dwMaxSize = 0;
DWORD dwCount = 0;
CString csText;
M_LIST(IDC_LIST_WORK) -> AddString ("");
M_LIST(IDC_LIST_WORK) -> AddString ("Mix up files");
M_LIST(IDC_LIST_WORK) -> AddString ("");
// compute total size
M_LIST(IDC_LIST_WORK) -> AddString ("\tCompute total size of rt? files");
p_stBFI -> dwTotalSize = 0;
xPos = _p_oFIList -> GetHeadPosition ();
while (xPos)
{
DWORD dwSize = _p_oFIList -> GetNext (xPos) -> dwSize;
dwSize = fn_dwAlignToSectorSize(dwSize + 4, M_SECTOR_SIZE); // add protect-key to each file
p_stBFI -> dwTotalSize += dwSize;
}
p_stBFI -> dwNbFile = _p_oFIList -> GetCount ();
p_stBFI -> dwNbMap = (p_stBFI -> dwNbFile >> 2);
p_stBFI -> dwFirstHeaderSize = fn_dwAlignToSectorSize(16 + 4 + 4 + 4 + 4 + 4 + 4, M_SECTOR_SIZE); // First Header : Keys (4) + MapNumber (1) + OccurNumber (1) + HeaderStep (1) + FirstHeaderSize (1) + FileStep (1) + SectorSize (1)
{
csText . Format ("\t\tTotal Size : %d" , p_stBFI -> dwTotalSize);
M_LIST(IDC_LIST_WORK) -> AddString (csText);
}
/* -------------------------------------------------------------------------------------------------------------- */
// compute number of occurrences
M_LIST(IDC_LIST_WORK) -> AddString ("\tCompute number of occurrences");
p_stBFI -> dwNbOccur = 1 + (_dwBigFileSize / p_stBFI -> dwTotalSize);
if (p_stBFI -> dwNbOccur > 30) p_stBFI -> dwNbOccur = 30;
{
csText . Format ("\t\t%d occurrences of %d files" , p_stBFI -> dwNbOccur , p_stBFI -> dwNbFile);
M_LIST(IDC_LIST_WORK) -> AddString (csText);
}
//
LARGE_INTEGER PerformanceCount;
QueryPerformanceCounter (&PerformanceCount);
PTC_g_lCurrentRandom = PerformanceCount . LowPart;
/* -------------------------------------------------------------------------------------------------------------- */
// Create Array
dwArraySize = p_stBFI -> dwNbOccur * p_stBFI -> dwNbFile;
*_a_MUITab = (tdstMixUpInfo*) malloc (dwArraySize * sizeof(tdstMixUpInfo));
// Fill Array
p_stMUI = *_a_MUITab;
for (DWORD dwOccur = 0 ; dwOccur < p_stBFI -> dwNbOccur ; dwOccur++)
{
xPos = _p_oFIList -> GetHeadPosition ();
while (xPos)
{
tdstFileInfo *p_stFI = _p_oFIList -> GetAt (xPos);
p_stMUI -> xFileInfoPosition = xPos;
p_stMUI -> dwOccur = dwOccur;
p_stMUI -> dwOffSet = 0;
p_stMUI -> dwMapNumber = p_stFI -> dwMapNumber;
p_stMUI -> dwSize = fn_dwAlignToSectorSize(p_stFI -> dwSize + 4, M_SECTOR_SIZE); // add protect-key to each file
p_stMUI -> p_cFileName = p_stFI -> szFileName;
p_stBFI -> dwMaxFileSize = max (p_stBFI -> dwMaxFileSize, p_stMUI -> dwSize);
_p_oFIList -> GetNext (xPos);
p_stMUI++;
}
}
/* -------------------------------------------------------------------------------------------------------------- */
p_stBFI -> dwHeaderSize = fn_dwGetHeaderSizeforAnOccur (p_stBFI -> dwNbOccur * 4, M_SECTOR_SIZE);
p_stBFI -> dwTotalSector = (p_stBFI -> dwNbOccur * p_stBFI -> dwTotalSize) / M_SECTOR_SIZE;
p_stBFI -> dwTotalSector = (p_stBFI -> dwNbOccur * p_stBFI -> dwTotalSize) / p_stBFI -> dwHeaderSize;
p_stBFI -> dwHeaderStep = p_stBFI -> dwTotalSector / (p_stBFI -> dwNbOccur + 1);
{
CString csText;
//csText . Format ("\tHeader Step : 0x%08x" , p_stBFI -> dwHeaderStep * M_SECTOR_SIZE);
//M_LIST(IDC_LIST_WORK) -> AddString (csText);
//csText . Format ("\tHeader Size : 0x%08x - %d" , p_stBFI -> dwHeaderSize , p_stBFI -> dwHeaderSize);
//M_LIST(IDC_LIST_WORK) -> AddString (csText);
csText . Format ("\tNb Total Sector : 0x%08x - %d" , p_stBFI -> dwTotalSector , p_stBFI -> dwTotalSector);
M_LIST(IDC_LIST_WORK) -> AddString (csText);
}
/* -------------------------------------------------------------------------------------------------------------- */
M_LIST(IDC_LIST_WORK) -> AddString ("\tCompute Headers positions");
*_a_HITab = (tdstHeaderInfo*) malloc (p_stBFI -> dwNbOccur * sizeof(tdstHeaderInfo));
{
DWORD dwN;
double fN , fValue , fA , fB , fC, fInteger;
//fA = M_Arround(log(2.0));
//fB = 1.0+fA;
//fC = M_Arround(log(fB));
//fN = M_Arround(log(fabs(fA)+fabs(fB)+fabs(fC)));
fA = 0.69314;
fB = 1.69314;
fC = 0.52658;
fN = 1.06913;
//csText . Format ("\tfA : %15.8f - fA : %15.8f - fC : %15.8f - f0 : %15.8f" , fA , fB , fC , fN);
//M_LIST(IDC_LIST_WORK) -> AddString (csText);
for (dwN = 0 ; dwN < p_stBFI -> dwNbOccur ; dwN++)
{
fValue = M_Arround(modf(fN , &fInteger));
//csText . Format ("\tOccur %03d : Value %15.8f - OffSet : 0x%08x" , dwN , fValue , M_SECTOR_SIZE * (DWORD)floor(fValue * p_stBFI -> dwTotalSector) );
//M_LIST(IDC_LIST_WORK) -> AddString (csText);
(*_a_HITab) [dwN] . dwOccur = dwN;
//(*_a_HITab) [dwN] . dwOffSet = M_SECTOR_SIZE * (DWORD)floor(fValue * p_stBFI -> dwTotalSector) + p_stBFI -> dwFirstHeaderSize;
(*_a_HITab) [dwN] . dwOffSet = p_stBFI -> dwHeaderSize * (DWORD)floor(fValue * p_stBFI -> dwTotalSector) + p_stBFI -> dwFirstHeaderSize;
fN = fN + fA * fabs(sin(fB * dwN * dwN)) + fC;
//fN = M_Arround(fN);
}
qsort((*_a_HITab) , p_stBFI -> dwNbOccur , sizeof(tdstHeaderInfo) , fn_iCompareHeaderInfo);
}
/*
{
for (DWORD dwN = 0 ; dwN < *_p_dwTotalOccur ; dwN++)
{
CString csText;
(*_a_HITab) [dwN] . dwOccur = dwN;
(*_a_HITab) [dwN] . dwOffSet = (dwN+1) * *_p_dwHeaderStep * M_SECTOR_SIZE;
}
}
*/
M_LIST(IDC_LIST_WORK) -> AddString ("\t\tVerify Headers positions");
{
for (DWORD dwN = 0 ; dwN < p_stBFI -> dwNbOccur - 1 ; dwN++)
{
//csText . Format ("\t%03d : Occur %03d - OffSet : 0x%08x" , dwN , (*_a_HITab) [dwN] . dwOccur , (*_a_HITab) [dwN] . dwOffSet );
//M_LIST(IDC_LIST_WORK) -> AddString (csText);
if( (*_a_HITab) [dwN] . dwOffSet + p_stBFI -> dwHeaderSize >= (*_a_HITab) [dwN+1] . dwOffSet)
{
m_csErrorMessage = "Recovering Header";
return FALSE;
}
}
}
M_LIST(IDC_LIST_WORK) -> AddString ("\t\tHeaders positions Ok");
/* -------------------------------------------------------------------------------------------------------------- */
M_LIST(IDC_LIST_WORK) -> AddString ("\tMixUp Files and Headers");
dwOffSet = p_stBFI -> dwFirstHeaderSize;
dwHeaderNumber = 0;
dwNextHeaderPos = (*_a_HITab) [dwHeaderNumber] . dwOffSet;
for (DWORD dwIndex = 0 ; dwIndex < dwArraySize-1 ; dwIndex++)
{
BOOL bContinue = TRUE;
while (bContinue)
{
DWORD dwRandomPosition = PTC_fn_lGetRandomRange (dwIndex+1 , dwArraySize);
DWORD dwNewPosition = dwRandomPosition;
// swap
tdstMixUpInfo stMUITmp;
// enough place ???
while ((dwNewPosition < dwArraySize) && (dwOffSet + (*_a_MUITab)[dwNewPosition] . dwSize > dwNextHeaderPos))
{
dwNewPosition++;
}
if(dwNewPosition == dwArraySize)
{
dwNewPosition = dwRandomPosition;
while ((dwNewPosition > dwIndex) && (dwOffSet + (*_a_MUITab)[dwNewPosition] . dwSize > dwNextHeaderPos))
{
dwNewPosition--;
}
}
if (dwNewPosition != dwArraySize && dwNewPosition != dwIndex)
{
// found one
stMUITmp = (*_a_MUITab)[dwIndex];
(*_a_MUITab)[dwIndex] = (*_a_MUITab)[dwNewPosition];
(*_a_MUITab)[dwNewPosition] = stMUITmp;
// compute OffSet
(*_a_MUITab)[dwIndex] . dwOffSet = dwOffSet;
//
// increase OffSet
dwOffSet += (*_a_MUITab)[dwIndex] . dwSize;
//
bContinue = FALSE;
}
else
{
// up to next Header;
dwOffSet = dwNextHeaderPos + p_stBFI -> dwHeaderSize;
dwHeaderNumber++;
if (dwHeaderNumber < p_stBFI -> dwNbOccur)
{
dwNextHeaderPos = (*_a_HITab) [dwHeaderNumber] . dwOffSet;
}
else
{
// no more header
dwNextHeaderPos = 0xFFFFFFFF;
}
}
}
}
// compute OffSet of last one
(*_a_MUITab)[dwArraySize-1] . dwOffSet = dwOffSet;
/////////////////////////////////
/////////////////////////////////
/////////////////////////////////
/////////////////////////////////
/////////////////////////////////
/*
if (m_bGenerateInfoFiles)
{
HANDLE hDebugFile = CreateFile ("BigFile.map" , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
DWORD dwW;
p_stMUI = *_a_MUITab;
tdstMixUpInfo *p_stMUIEnd = *_a_MUITab + dwArraySize;
dwCount = 0;
dwOffSet = p_stBFI -> dwFirstHeaderSize;
dwHeaderNumber = 0;
dwNextHeaderPos = (*_a_HITab) [dwHeaderNumber] . dwOffSet;
while (p_stMUI != p_stMUIEnd)
{
csText . Format ("%03d - OffSet : 0x%08x - Size : 0x%08x - End : 0x%08x - %s\x0D\x0A"
, dwCount , p_stMUI -> dwOffSet , p_stMUI -> dwSize , p_stMUI -> dwOffSet + p_stMUI -> dwSize , p_stMUI -> p_cFileName);
WriteFile (hDebugFile , (char*)(LPCTSTR)csText , csText . GetLength () , &dwW , NULL);
p_stMUI++;
dwCount++;
while (p_stMUI -> dwOffSet > dwNextHeaderPos)
{
csText . Format ("===== Gap : 0x%08x\x0D\x0A" , dwNextHeaderPos - ((p_stMUI-1) -> dwOffSet + (p_stMUI-1) -> dwSize));
WriteFile (hDebugFile , (char*)(LPCTSTR)csText , csText . GetLength () , &dwW , NULL);
csText . Format ("\tOffSet : 0x%08x - Size : 0x%08x - End : 0x%08x - Header : %d\x0D\x0A"
, (*_a_HITab) [dwHeaderNumber] . dwOffSet , p_stBFI -> dwHeaderSize , (*_a_HITab) [dwHeaderNumber] . dwOffSet + p_stBFI -> dwHeaderSize , (*_a_HITab) [dwHeaderNumber] .dwOccur);
WriteFile (hDebugFile , (char*)(LPCTSTR)csText , csText . GetLength () , &dwW , NULL);
dwHeaderNumber++;
if (dwHeaderNumber < p_stBFI -> dwNbOccur)
{
dwNextHeaderPos = (*_a_HITab) [dwHeaderNumber] . dwOffSet;
}
else
{
// no more header
dwNextHeaderPos = 0xFFFFFFFF;
}
}
}
CloseHandle (hDebugFile);
}
*/
/////////////////////////////////
/////////////////////////////////
/////////////////////////////////
/////////////////////////////////
/////////////////////////////////
return TRUE;
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------
BOOL CBigFileToolDlg::WriteBigFileWithExplodedHeader(char *_szDataPath , HANDLE hFile, CListOfFileInfo *_p_oFIList, tdstMixUpInfo *_a_MUITab, tdstBigFileInfo *p_stBFI, tdstHeaderInfo *_a_HITab)
{
DWORD dwNumberOfMUI = p_stBFI -> dwNbOccur * p_stBFI -> dwNbFile;
tdstMixUpInfo *p_stMUI = _a_MUITab;
tdstMixUpInfo *p_stMUIEnd = _a_MUITab + dwNumberOfMUI;
char szFileName[MAX_PATH];
char *p_cBeginFileName;
DWORD dwRead , dwWritten;
char szText[255];
HANDLE hDebugFile;
DWORD dwW,dwCount;
DWORD dwOffSet;
unsigned char a_ucKeys[4];
unsigned char a_ucCode[4];
unsigned char a_ucProtection[4];
DWORD *p_dwKey = (DWORD*)a_ucKeys;
DWORD *p_dwProtection = (DWORD*)a_ucProtection;
DWORD dwNextHeaderPos , dwHeaderNumber;
M_LIST(IDC_LIST_WORK) -> AddString ("");
M_LIST(IDC_LIST_WORK) -> AddString ("Write files");
M_LIST(IDC_LIST_WORK) -> AddString ("");
m_Ctrl_ProgressBar . SetRange (0 , dwNumberOfMUI + p_stBFI -> dwNbOccur);
m_Ctrl_ProgressBar . SetPos (0);
m_Ctrl_ProgressBar . SetStep (1);
strcpy (szFileName , _szDataPath);
p_cBeginFileName = szFileName + strlen (_szDataPath);
HGLOBAL hMem = GlobalAlloc (GHND , p_stBFI -> dwMaxFileSize + 4 + 4);
char *p_Buffer = (char*) GlobalLock (hMem);
char *p_Begin;
////////////////////////////////////////////////
// compute all headers
////////////////////////////////////////////////
DWORD *a_OffSet = (DWORD*) malloc (dwNumberOfMUI*4);
DWORD *p_dwEndHeader = a_OffSet + (dwNumberOfMUI);
while (p_stMUI != p_stMUIEnd)
{
//
DWORD dwIndex = p_stBFI -> dwNbOccur * p_stMUI -> dwMapNumber + p_stMUI -> dwOccur;
a_OffSet [ dwIndex ] = p_stMUI -> dwOffSet ;
// next
p_stMUI++;
}
if (m_bGenerateInfoFiles)
{
char szText[255];
HANDLE hDebugFile = CreateFile ("BigFile.txt" , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
DWORD dwMap , dwOcc, dwW;
for (dwOcc = 0 ; dwOcc < p_stBFI -> dwNbOccur ; dwOcc++)
{
sprintf (szText , "==============================================================================\x0D\x0A");
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
for (dwMap = 0 ; dwMap < p_stBFI -> dwNbFile ; dwMap+=4)
{
DWORD dwIndex = p_stBFI -> dwNbOccur * dwMap + dwOcc;
sprintf (szText , "Map : %02d : Occur %02d : 0x%08x - 0x%08x - 0x%08x - 0x%08x\x0D\x0A" , dwMap >> 2 , dwOcc , a_OffSet [dwIndex] , a_OffSet [dwIndex + p_stBFI -> dwNbOccur] ,a_OffSet [dwIndex + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur] ,a_OffSet [dwIndex + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur]);
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
}
}
sprintf (szText , "==============================================================================\x0D\x0A");
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
CloseHandle (hDebugFile);
}
////////////////////////////////////////////////
// Write First Header : Keys (4) + MapNumber (1) + OccurNumber (1) + HeaderStep (1) + FirstHeaderSize (1) + File Step (1) + SectorSize (1)
////////////////////////////////////////////////
if (m_bGenerateInfoFiles)
{
hDebugFile = CreateFile ("BigFile.log" , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
dwOffSet = 0;
dwCount = 0;
}
DWORD dwKeys[4];
DWORD *p_dwCurrentPos = (DWORD*)p_Buffer;
dwOffSet = 0;
// compute keys
for (int i=0 ; i<4 ; i++ )
{
dwKeys[i] = PTC_fn_lGetRandom();
*p_dwCurrentPos++ = dwKeys[i];
dwOffSet += 4;
}
// fill Debug File
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE)
{
sprintf (szText , "First Header : Crypt-key : 0x%08x - 0x%08x - 0x%08x - 0x%08x\x0D\x0A" , dwKeys[0] , dwKeys[1] , dwKeys[2] , dwKeys[3]);
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
sprintf (szText , "MapNumber : %d : OccurNumber : %d : Header Step : 0x%08x\x0D\x0A" , p_stBFI -> dwNbFile , p_stBFI -> dwNbOccur , p_stBFI -> dwHeaderStep * M_SECTOR_SIZE);
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
sprintf (szText , "First Header Size : 0x%08x - File Step : 0x%08x - Header Size : 0x%08x - Sector Number : 0x%08x\x0D\x0A"
, p_stBFI -> dwFirstHeaderSize , 0 , p_stBFI -> dwHeaderSize , p_stBFI -> dwTotalSector);
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
sprintf (szText , "==============================================================================\x0D\x0A");
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
}
// Add number of map
*p_dwCurrentPos++ = (p_stBFI -> dwNbFile ^ dwKeys[1]) + dwKeys[0];
dwOffSet += 4;
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
// Add number of Occur
*p_dwCurrentPos++ = (p_stBFI -> dwNbOccur ^ dwKeys[1]) + dwKeys[0];
dwOffSet += 4;
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
// Add Header Step
*p_dwCurrentPos++ = ((p_stBFI -> dwHeaderStep * M_SECTOR_SIZE) ^ dwKeys[1]) + dwKeys[0];
dwOffSet += 4;
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
// Add First Header Size
*p_dwCurrentPos++ = (p_stBFI -> dwFirstHeaderSize ^ dwKeys[1]) + dwKeys[0];
dwOffSet += 4;
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
// Add File Step
*p_dwCurrentPos++ = (0 ^ dwKeys[1]) + dwKeys[0];
dwOffSet += 4;
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
// Add Header size
*p_dwCurrentPos++ = (p_stBFI -> dwHeaderSize ^ dwKeys[1]) + dwKeys[0];
dwOffSet += 4;
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
// Add Sector Number
*p_dwCurrentPos++ = (p_stBFI -> dwTotalSector ^ dwKeys[1]) + dwKeys[0];
dwOffSet += 4;
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
// Fill to align to Sector Size
while (dwOffSet < p_stBFI -> dwFirstHeaderSize)
{
*p_dwCurrentPos++ = PTC_fn_lGetRandom();
dwOffSet += 4;
}
WriteFile (hFile , p_Buffer , p_stBFI -> dwFirstHeaderSize , &dwOffSet , NULL);
////////////////////////////////////////////////
// Write Files and Occur Header
////////////////////////////////////////////////
dwHeaderNumber = 0;
dwNextHeaderPos = _a_HITab [dwHeaderNumber] . dwOffSet;
p_stMUI = _a_MUITab;
while (p_stMUI != p_stMUIEnd)
{
tdstFileInfo *p_stFI = _p_oFIList -> GetAt (p_stMUI -> xFileInfoPosition);
if(p_stMUI -> dwOffSet != dwOffSet)
{
m_csErrorMessage = p_stMUI -> dwOffSet < dwOffSet ? "Recovering blocs" : "Unwanted gap";
return FALSE;
}
// compute crypt int-key
a_ucCode[0] = (unsigned char) (p_stMUI -> dwMapNumber >> 2);
a_ucCode[1] = (unsigned char) (p_stMUI -> dwMapNumber % 4);
a_ucCode[2] = (unsigned char) (p_stMUI -> dwOccur & 0x000000FF);
a_ucCode[3] = ~a_ucCode[2];
// compute crypt key
*p_dwKey = PTC_fn_lGetCryptKey (*(DWORD*)a_ucCode);
// compute protection key
*p_dwProtection = PTC_fn_lGetProtectionKey (*(DWORD*)a_ucCode);
// copy Protect key to buffer
memcpy (p_Buffer , p_dwProtection , 4);
// open Source file
strcpy (p_cBeginFileName , p_stFI -> szFileName);
// fill Debug File
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE)
{
sprintf (szText , "%03d - OffSet : 0x%08x - init-key : 0x%02x%02x%02x%02x => crypt-key : 0x%08x => protect-key : 0x%08x - Map : %s\x0D\x0A"
, dwCount++ , dwOffSet , a_ucCode[0] , a_ucCode[1] , a_ucCode[2] , a_ucCode[3] , *p_dwKey , *p_dwProtection , p_cBeginFileName );
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
}
HANDLE hSourceFile = CreateFile ( szFileName, GENERIC_READ , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
// Copy File
// Read initial file
ReadFile (hSourceFile , p_Buffer + 4 , p_stFI -> dwSize + 1 , &dwRead , NULL);
CloseHandle (hSourceFile);
dwRead += 4; // protect key size
// crypt buffer
unsigned char *p_ucBeginBuffer = (unsigned char*)p_Buffer;
unsigned char *p_ucEndBuffer = (unsigned char*)p_Buffer + dwRead;
while (p_ucBeginBuffer != p_ucEndBuffer)
{
*p_ucBeginBuffer = (*p_ucBeginBuffer ^ a_ucKeys[1]) + a_ucKeys[0];
a_ucKeys[0] += a_ucKeys[2];
a_ucKeys[1] += a_ucKeys[3];
p_ucBeginBuffer++;
}
p_Begin = p_Buffer + dwRead;
// Fill to long alignment
while (dwRead % 4)
{
*p_Begin = (unsigned char) PTC_fn_lGetRandomRange (0, 255);
p_Begin++;
dwRead++;
}
// Fill to align to sector size
while (dwRead < p_stMUI -> dwSize)
{
DWORD dwRandom = PTC_fn_lGetRandom();
memcpy (p_Begin , &dwRandom , 4);
p_Begin += 4;
dwRead += 4;
}
// write buffer
WriteFile(hFile , p_Buffer , p_stMUI -> dwSize , &dwWritten , NULL);
m_Ctrl_ProgressBar . StepIt ();
dwOffSet += p_stMUI -> dwSize;
// next
p_stMUI++;
// Message Pump
PeekAndPump ();
while (p_stMUI -> dwOffSet > dwNextHeaderPos)
{
// fill to next Header Position
DWORD dwSize = 0;
while (dwOffSet < dwNextHeaderPos)
{
DWORD dwValue = PTC_fn_lGetRandom();
WriteFile (hFile , &dwValue , 4 , &dwWritten , NULL);
dwOffSet += 4;
dwSize += 4;
}
// write next Header
DWORD dwKeys[4];
p_dwCurrentPos = (DWORD*)p_Buffer;
// compute keys
for (int i=0 ; i<4 ; i++ )
{
dwKeys[i] = PTC_fn_lGetRandom();
*p_dwCurrentPos++ = dwKeys[i];
}
// fill Debug File
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE)
{
sprintf (szText , "==============================================================================\x0D\x0A");
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
sprintf (szText , "OffSet : 0x%08x - Header %03d - crypt-key : 0x%08x - 0x%08x - 0x%08x - 0x%08x\x0D\x0A" , dwOffSet , _a_HITab [dwHeaderNumber] . dwOccur , dwKeys[0] , dwKeys[1] , dwKeys[2] , dwKeys[3]);
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
sprintf (szText , "==============================================================================\x0D\x0A");
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
}
// Write OffSet
DWORD dwIndex = _a_HITab [dwHeaderNumber] . dwOccur;
DWORD dwMyCount = 0;
while (dwIndex < dwNumberOfMUI)
{
*p_dwCurrentPos++ = (a_OffSet [dwIndex] ^ dwKeys[1]) + dwKeys[0];
dwKeys[0] += dwKeys[2];
dwKeys[1] += dwKeys[3];
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE && !(dwMyCount % 4))
{
sprintf (szText , "\t%03d - 0x%08x - 0x%08x - 0x%08x - 0x%08x\x0D\x0A" , dwMyCount / 4 , a_OffSet [dwIndex] , a_OffSet [dwIndex + p_stBFI -> dwNbOccur] , a_OffSet [dwIndex + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur] , a_OffSet [dwIndex + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur + p_stBFI -> dwNbOccur]);
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
}
dwIndex += p_stBFI -> dwNbOccur;
dwMyCount += 1;
}
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE)
{
sprintf (szText , "==============================================================================\x0D\x0A");
WriteFile (hDebugFile , szText , strlen(szText) , &dwW , NULL);
}
if (dwMyCount != p_stBFI -> dwNbFile)
{
m_csErrorMessage = "Bad Header Size";
return FALSE;
}
p_dwEndHeader = (DWORD*)(p_Buffer + p_stBFI -> dwHeaderSize);
// align to Sector Size
while (p_dwCurrentPos < p_dwEndHeader)
{
*p_dwCurrentPos++ = PTC_fn_lGetRandom();
}
// write on file
WriteFile (hFile , p_Buffer , p_stBFI -> dwHeaderSize , &dwWritten , NULL);
m_Ctrl_ProgressBar . StepIt ();
dwOffSet = dwNextHeaderPos + p_stBFI -> dwHeaderSize;
// compute next Header pos
dwHeaderNumber++;
if (dwHeaderNumber < p_stBFI -> dwNbOccur)
{
dwNextHeaderPos = _a_HITab [dwHeaderNumber] . dwOffSet;
}
else
{
// no more header
dwNextHeaderPos = 0xFFFFFFFF;
}
}
}
GlobalUnlock (hMem);
GlobalFree (hMem);
if (m_bGenerateInfoFiles && hDebugFile != INVALID_HANDLE_VALUE) CloseHandle (hDebugFile);
m_Ctrl_ProgressBar . SetPos (0);
free (a_OffSet);
return TRUE;
}