#include "precomp.h"
#include "physicaldrive.h"
#include "assert.h"
#include "reiserfs.h"
#include "pdrivent.h"
BOOL PNtPhysicalDrive::GetDriveLayout( LPBYTE lpbMemory, DWORD dwSize )
{
DWORD junk;
return DeviceIoControl(m_hDevice, // the device we are querying
IOCTL_DISK_GET_DRIVE_LAYOUT, // operation to perform
NULL, 0, // no input buffer, so we pass zero
lpbMemory, dwSize, // the output buffer
&junk, // discard the count of bytes returned
NULL);
} // GetDriveLayout()
#ifdef SUPPORT_WINDOWS_XP_PARTITIONS
BOOL PNtPhysicalDrive::GetDriveLayoutEx( LPBYTE lpbMemory, DWORD dwSize )
{
DWORD junk;
return DeviceIoControl(m_hDevice, // the device we are querying
IOCTL_DISK_GET_DRIVE_LAYOUT_EX, // operation to perform
NULL, 0, // no input buffer, so we pass zero
lpbMemory, dwSize, // the output buffer
&junk, // discard the count of bytes returned
NULL);
} // GetDriveLayout()
BOOL PNtPhysicalDrive::GetDriveGeometryEx( DISK_GEOMETRY_EX* lpDG, DWORD dwSize )
{
DWORD junk;
return DeviceIoControl(m_hDevice, // the device we are querying
IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, // operation to perform
NULL, 0, // no input buffer, so we pass zero
lpDG, dwSize, // the output buffer
&junk, // discard the count of bytes returned
NULL);
} // GetDriveGeometry()
#endif
BOOL PNtPhysicalDrive::GetDriveGeometry( DISK_GEOMETRY* lpDG )
{
DWORD junk;
return DeviceIoControl(m_hDevice, // the device we are querying
IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
NULL, 0, // no input buffer, so we pass zero
lpDG, sizeof(DISK_GEOMETRY), // the output buffer
&junk, // discard the count of bytes returned
NULL);
} // GetDriveGeometry()
BOOL PNtPhysicalDrive::Open( int iDrive )
{
if(m_hDevice != INVALID_HANDLE_VALUE)
{
CloseHandle( m_hDevice );
m_hDevice = INVALID_HANDLE_VALUE;
}
CHAR szPath[256];
sprintf( szPath, "\\\\.\\PhysicalDrive%d", iDrive );
m_hDevice = CreateFile( szPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 );
return (m_hDevice != INVALID_HANDLE_VALUE);
}
void PNtPhysicalDrive::Close()
{
if(m_hDevice != INVALID_HANDLE_VALUE)
{
CloseHandle( m_hDevice );
m_hDevice = INVALID_HANDLE_VALUE;
}
}
BOOL PNtPhysicalDrive::ReadAbsolute( LPBYTE lpbMemory, DWORD dwSize, INT64 Sector )
{
LARGE_INTEGER li;
li.QuadPart = Sector;
SetFilePointer(m_hDevice, li.LowPart, &li.HighPart, FILE_BEGIN);
return ReadFile(m_hDevice, lpbMemory, dwSize, &li.LowPart, 0 );
} // ReadAbsolute()
PNtPhysicalDrive::PNtPhysicalDrive()
{
m_hDevice = INVALID_HANDLE_VALUE;
} // PNtPhysicalDrive()
PNtPhysicalDrive::~PNtPhysicalDrive()
{
if( m_hDevice != INVALID_HANDLE_VALUE )
{
CloseHandle( m_hDevice );
}
} // ~PNtPhysicalDrive()
syntax highlighted by Code2HTML, v. 0.9.1