reman3/Rayman_X/cpa/tempgrp/CRB/CRB_Load.c

210 lines
5.3 KiB
C

#include "stdio.h"
#include "stdlib.h"
#include "CRB_Main.h"
#include "windows.h"
#define __CRB_Includes_SNA__
#include "SNA/snafile.h"
#include "sna/snammg.h"
#undef __CRB_Includes_SNA__
/*
unsigned long fn_ulGetFileSize( FILE *_p_xFile )
{
long lFilePosition;
long lFileSize;
lFilePosition = ftell( _p_xFile );
fseek( _p_xFile, 0, SEEK_END );
if( (lFileSize = ftell( _p_xFile )) == -1 )
lFileSize = 0;
fseek( _p_xFile, lFilePosition, SEEK_SET );
return (unsigned long)lFileSize;
}
*/
unsigned long fn_ulGetFileSize( HANDLE hFile )
{
DWORD dwResult;
dwResult = GetFileSize (hFile,NULL);
return ( (dwResult == 0xFFFFFFFF) ? 0 : dwResult);
}
// Read a pointer file.
unsigned long CRB_fn_bReadPtrBlocks(char *szFilename ,struct tdstBloc_** p_stMemory, char *szFileTypeName )
{
HANDLE hFile;
unsigned long ulSizeOfBloc;
DWORD dwBytesRead;
hFile = CreateFile(szFilename , GENERIC_READ, 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
printf("Warning - %s Pointer File not found : %s !\n", szFileTypeName, szFilename);
// getchar();
// exit(0);
return 0;
}
ulSizeOfBloc = fn_ulGetFileSize( hFile );
ulSizeOfBloc &= 0xfffffffc;
p_stMemory[0]=(struct tdstBloc_ *)malloc(sizeof(struct tdstBloc_));
p_stMemory[0]->cMemory=(unsigned long *)malloc(ulSizeOfBloc);
p_stMemory[0]->ulSize = ulSizeOfBloc;
if (ReadFile (hFile , p_stMemory[0]->cMemory , ulSizeOfBloc , &dwBytesRead , NULL) && (dwBytesRead != ulSizeOfBloc))
{
printf("Error reading %s Pointer File (%s) !\n", szFileTypeName, szFilename);
getchar();
exit(1);
}
CloseHandle (hFile);
return 1;
}
// Search a block in the memory table.
// Returns a pointer to the block entry
struct tdstBloc_ * CRB_fn_p_stSearchBlock(
struct tdstBloc_ *_p_stMemory[], unsigned long _ulNbBlocks,
unsigned char _ucModule, unsigned char _ucBlock )
{
struct tdstBloc_ *p_stCurMemory;
unsigned long i;
for( i=0; i<_ulNbBlocks; i++ )
{
p_stCurMemory = _p_stMemory[i];
if( p_stCurMemory->ulModuleNumber == _ucModule
&& p_stCurMemory->ulBlocNumber == _ucBlock )
{
return p_stCurMemory;
}
}
return NULL;
}
// Read SNA file
unsigned long CRB_fn_bReadAllMemoryBlocks(char *szFilename,struct tdstBloc_** p_stMemory,unsigned char ucMode)
{
struct SNA_tdstFile_ stFile;
// FILE *p_xFile;
unsigned char ucModule,ucBlock;
unsigned long ulNbOfBloc;
struct tdstBloc_ *p_stCurrentBlock;
struct tdstBloc_ stTmpBlock;
unsigned char ucUpdateBlock;
DWORD dwBytesRead;
if(ucMode==C_CRB_NEW)
{
ulNbOfBloc=0;
}
else
{
ulNbOfBloc=g_ulNbBloc;
}
SNA_fn_bFOpen( szFilename, SNA_C_ucRead, SNA_C_ucUseEncryption, &stFile );
//if (! stFile.p_xFile )
if (stFile.hFile == INVALID_HANDLE_VALUE)
{
printf("\nError - SNA File not found : %s !",szFilename);
getchar();
exit(2);
}
stFile.bReadSuccess = ReadFile(stFile.hFile,&stFile.ulCryptKey,sizeof(stFile.ulCryptKey),&dwBytesRead,NULL);
if( stFile.ulCryptKey == 0 )
{
stFile.ucOptions &= ~SNA_C_ucUseEncryption;
}
while(stFile.bReadSuccess)
{
memset( &stTmpBlock, 0, sizeof(struct tdstBloc_) );
// Read module ID and block ID.
if(SNA_fn_ulFRead(&ucModule,1,1,&stFile)==0)
break;
SNA_fn_ulFRead(&ucBlock,1,1,&stFile);
// Tells if block has already been loaded
p_stCurrentBlock = CRB_fn_p_stSearchBlock( p_stMemory, ulNbOfBloc, ucModule, ucBlock );
if( p_stCurrentBlock == NULL )
{
// If block not loaded, add it.
ucUpdateBlock = 1;
p_stCurrentBlock = p_stMemory[ulNbOfBloc++] = (struct tdstBloc_ *)malloc(sizeof(struct tdstBloc_));
}
else if( p_stCurrentBlock->cMemory == NULL )
// If only blocks infos have been loaded, update them
ucUpdateBlock = 1;
else
// Block info AND content have been loaded, do not update them.
ucUpdateBlock = 0;
stTmpBlock.ulModuleNumber=ucModule;
stTmpBlock.ulBlocNumber=ucBlock;
// Read location of the block (fix or level)
// SNA_fn_ulFRead( &ucModuleBlocLocation[ucModule][ucBlock], 1, 1, &stFile);
SNA_fn_ulFRead( &stTmpBlock.ucLocation, 1, 1, &stFile);
SNA_fn_ulFRead( &stTmpBlock.ulBeginBloc, 4, 1, &stFile );
if( stTmpBlock.ulBeginBloc == 0XFFFFFFFF )
{
if( ucUpdateBlock )
memcpy( p_stCurrentBlock, &stTmpBlock, sizeof(struct tdstBloc_) );
continue;
}
SNA_fn_ulFRead(&(stTmpBlock.ulEndBloc),4,1,&stFile);
SNA_fn_ulFRead(&(stTmpBlock.ulFreeSpace),4,1,&stFile);
SNA_fn_ulFRead(&(stTmpBlock.ulMaxSpace),4,1,&stFile);
SNA_fn_ulFRead(&stTmpBlock.ulSize,4,1,&stFile);
// Size of block is not null, the block's content follows.
if(stTmpBlock.ulSize !=0 )
{
if( ucUpdateBlock )
{
// Allocate the memory for the block's content and read it.
stTmpBlock.cMemory = (unsigned long *)malloc( stTmpBlock.ulSize );
SNA_fn_ulFRead( stTmpBlock.cMemory, 1, stTmpBlock.ulSize, &stFile );
}
else
{
// We already have loaded this block, print a warning and continue.
printf( "Warning - Module %i block %i is loaded more than once.\n\tKeeping only first version...\n",
ucModule, ucBlock );
SNA_fn_bFseek( &stFile, stTmpBlock.ulSize, SEEK_CUR );
}
}
else
{
// This was only a block header, no content to load.
stTmpBlock.cMemory = NULL;
}
// Update block infos if necessary.
if( ucUpdateBlock )
{
memcpy( p_stCurrentBlock, &stTmpBlock, sizeof(struct tdstBloc_) );
}
}
SNA_fn_bFClose(&stFile);
return ulNbOfBloc;
}