#include "precomp.h"
#include "pdrivefile.h"
class KnownDriveSector : public PNode
{
public:
KnownDriveSector( INT64 OffsetInBytes, DWORD dwFileOffset );
INT64 m_OffsetInBytes; // offset on disk
DWORD m_dwFileOffset; // offset in file
};
PSimulatedDriveFromBackupFile::PSimulatedDriveFromBackupFile(LPCSTR lpszFilename)
: m_strFilename( lpszFilename )
{
}
PSimulatedDriveFromBackupFile::~PSimulatedDriveFromBackupFile()
{
}
#ifdef SUPPORT_WINDOWS_XP_PARTITIONS
BOOL PSimulatedDriveFromBackupFile::GetDriveGeometryEx( DISK_GEOMETRY_EX* lpDG, DWORD dwSize )
{
return FALSE;
}
BOOL PSimulatedDriveFromBackupFile::GetDriveLayoutEx( LPBYTE lpbMemory, DWORD dwSize )
{
return FALSE;
}
#endif
BOOL PSimulatedDriveFromBackupFile::Open( int iDrive )
{
return m_Metafile.Open( NULL, m_strFilename );
}
void PSimulatedDriveFromBackupFile::Close()
{
}
BOOL PSimulatedDriveFromBackupFile::GetDriveGeometry( DISK_GEOMETRY* lpDG )
{
memset(lpDG,0,sizeof(DISK_GEOMETRY));
lpDG->BytesPerSector = m_Metafile.m_dwBlocksize;
return TRUE;
}
BOOL PSimulatedDriveFromBackupFile::ReadAbsolute( LPBYTE lpbMemory, DWORD dwSize, INT64 OffsetInBytes )
{
if( OffsetInBytes == REISERFS_DISK_OFFSET_IN_BYTES )
{
memcpy(lpbMemory, &m_Metafile.m_Superblock, sizeof(m_Metafile.m_Superblock) );
return TRUE;
}
else
{
INT64 OffsetInBlocks = OffsetInBytes / m_Metafile.m_dwBlocksize;
return m_Metafile.Read( lpbMemory, dwSize, OffsetInBlocks );
}
}
BOOL PSimulatedDriveFromBackupFile::GetDriveLayout( LPBYTE lpbMemory, DWORD dwSize )
{
DWORD dwBytesRequired = sizeof(DRIVE_LAYOUT_INFORMATION) + sizeof(PARTITION_INFORMATION);
if( dwSize < dwBytesRequired )
return FALSE;
PDRIVE_LAYOUT_INFORMATION pli = (PDRIVE_LAYOUT_INFORMATION) lpbMemory;
memset(lpbMemory, 0, dwSize);
pli->PartitionCount = 1;
pli->Signature = 0;
return TRUE;
}
syntax highlighted by Code2HTML, v. 0.9.1