// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // #include "cfs_kboo.h" #include "autil.h" CKBoot::CKBoot() : CFs() { #ifdef _MEMORY_DUMP_ printf( "CKBoot constructed: %08X\n", this ); #endif } CKBoot::~CKBoot() { Dismount(); #ifdef _MEMORY_DUMP_ printf( "CKBoot destructed: %08X\n", this ); #endif } BOOL CKBoot::Mount( ADisk* pDisk ) { m_iFilesValid = 0; m_iFilesInvalid = 0; m_pDisk = pDisk; m_pRoot = NULL; if ( m_pDisk->GetSectorSize() != 0x80 ) { sprintf( m_szLastError, "KBOOT: Can't process DD disk!" ); return FALSE; } m_pRoot = CreateEntry(); return m_pRoot ? TRUE : FALSE; } void CKBoot::Dismount() { DeleteList( m_pRoot ); } CKBootDirEntry* CKBoot::CreateEntry() { CKBootDirEntry* pE = new CKBootDirEntry(); if ( !pE ) return NULL; BYTE abtSec[ 0x100 ]; if ( !m_pDisk->ReadSector( abtSec, 1 ) ) { sprintf( m_szLastError, "KBOOT: Can't read boot sector because\n%s", m_pDisk->GetLastError() ); delete pE; return NULL; } pE->m_dwFileLen = abtSec[ 9 ] + ( abtSec[ 10 ] << 8 ) + ( abtSec[ 11 ] << 16 ); if ( !m_pDisk->ReadSector( abtSec, 4 ) ) { sprintf( m_szLastError, "KBOOT: Can't read first post boot sector because\n%s", m_pDisk->GetLastError() ); delete pE; return NULL; } if ( ( abtSec[ 0 ] != 0xFF ) || ( abtSec[ 1 ] != 0xFF ) ) { sprintf( m_szLastError, "KBOOT: Not a KBoot image!" ); delete pE; return NULL; } int iSectors = 3 + ( ( pE->m_dwFileLen + 0x7F ) / 0x80 ); if ( iSectors > m_pDisk->GetSectorCount() ) { sprintf( m_szLastError, "KBOOT: Not a KBoot image or invalid! (%d<>%d)", iSectors, m_pDisk->GetSectorCount() ); delete pE; return NULL; } sprintf( pE->m_szAscData, "%06lX", pE->m_dwFileLen ); GuessBestFnameFromPC( pE->m_szFname, m_pDisk->GetImageName(), "axe" ); return pE; } BOOL CKBoot::ExportFile( char* szOutFile, CDirEntry* pDirE ) { int hOutfile = -1; if ( szOutFile ) { hOutfile = open( szOutFile, O_BINARY | O_CREAT | O_TRUNC | O_WRONLY, 0666 ); if ( -1 == hOutfile ) { sprintf( m_szLastError, "KBOOT: Unable to create file '%s'!", szOutFile ); return FALSE; } } DWORD dwFileLen = ((CKBootDirEntry*)pDirE) ->m_dwFileLen; BYTE abtBuff[ 0x80 ]; int iSector = 4; while( dwFileLen ) { WORD wToCopy = ( dwFileLen < 0x80 ) ? dwFileLen : 0x80; if ( !m_pDisk->ReadSector( abtBuff, iSector ) ) { sprintf( m_szLastError, "KBOOT: Can't read sector because\n%s", m_pDisk->GetLastError() ); return FALSE; } if ( -1 != hOutfile ) write( hOutfile, abtBuff, wToCopy ); dwFileLen -= wToCopy; iSector++; } if ( -1 != hOutfile ) close( hOutfile ); return TRUE; }