📄 myview.cpp
字号:
#include <afxwin.h>
#include <afxext.h>
#include "disk.h"
#include "mydoc.h"
#include "myview.h"
#include "resource.h"
#define VWIN32_DIOC_DOS_IOCTL 1
#define VWIN32_DIOC_DOS_INT25 2
#define VWIN32_DIOC_DOS_DRIVEINFO 6
#define FSINFOSIG 0x61417272L
IMPLEMENT_DYNCREATE ( myview, CScrollView )
BEGIN_MESSAGE_MAP ( myview, CScrollView )
ON_COMMAND_RANGE ( ID_DRIVE_A, ID_DRIVE_C,drive )
END_MESSAGE_MAP( )
void myview::OnInitialUpdate( )
{
CScrollView::OnInitialUpdate( ) ;
pdoc = ( mydoc * ) GetDocument( ) ;
pds = pdoc -> getdiskobject( ) ;
CClientDC d ( this ) ;
d.SetMapMode ( MM_LOENGLISH ) ;
int h = - ( ( d.GetDeviceCaps ( LOGPIXELSY ) * 10 ) / 72 ) ;
if ( scr_font.m_hObject != NULL )
scr_font.DeleteObject( ) ;
scr_font.CreateFont ( h, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Courier New" ) ;
CFont *prevfont = d.SelectObject ( &scr_font ) ;
TEXTMETRIC tm ;
d.GetTextMetrics ( &tm) ;
scr_ht = tm.tmHeight + tm.tmExternalLeading ;
d.SelectObject ( prevfont ) ;
setview( ) ;
}
void myview::setview( )
{
SetScrollSizes ( MM_LOENGLISH, CSize ( 827, pdoc -> lines.GetCount( ) * scr_ht + 5 * scr_ht ) ) ;
}
void myview::OnDraw ( CDC *p )
{
CFont* prevfont = p -> SelectObject ( &scr_font ) ;
int count = pdoc -> lines.GetCount( ) ;
POSITION pos = pdoc -> lines.GetHeadPosition( ) ;
for ( int i = 0, y = 0 ; i < count ; i++ )
{
str = pdoc -> lines.GetNext ( pos ) ;
p -> TextOut ( 5, y, str, str.GetLength( ) ) ;
y -= scr_ht ;
}
str = "" ;
p -> SelectObject ( prevfont ) ;
}
void myview::drive ( int id )
{
switch ( id )
{
case ID_DRIVE_A :
pdoc -> lines.RemoveAll( ) ;
media_id_info ( 1 ) ; // reads and displays media ID information
boot_info ( 0 ) ; // reads and displays FAT 12 boot sector information
fat_info( ) ; // reads and displays File Allocation Table
display_dir_info ( 0, 0 ) ; // reads and displays directory structure
//0 - !FAT32
setview( ) ;
break ;
case ID_DRIVE_C :
pdoc -> lines.RemoveAll( ) ;
media_id_info ( 3 ) ; // reads and displays media ID information
if ( strncmp ( "FAT32", filetypestr, 5 ) )
{
boot_info ( 2 ) ; // reads and displays FAT 12/16 boot sector information
fat_info( ) ; // reads and displays File Allocation Table
display_dir_info ( 0, 2 ) ; //reads and displays directory structure
//0 - !FAT32
}
else
{
boot_info_32 ( 3 ) ; // reads and displays FAT 32 boot sector information
fat_info( ) ;
display_dir_info ( 1, 2 ) ; //reads and displays directory structure
// 1 - FAT32
}
setview( ) ;
break ;
}
Invalidate( ) ;
}
void myview::media_id_info ( int drive_1 ) // one-based drive
{
pds -> getmediaid ( drive_1, &m ) ;
display_media_id( ) ;
}
void myview::display_media_id( )
{
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "Media ID" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Serial Number = %u", m.serialnumber ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
CString volstr ;
for ( int i = 0 ; i <= 10 ; i++ )
volstr += m.vollabel[i] ;
str = "Volume Label = " + volstr ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
filetypestr = "" ;
for ( i = 0 ; i <= 7 ; i++ )
filetypestr += m.filesystype[i] ; // private - filetypestr
str = "File System Type = " + filetypestr ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
void myview::boot_info ( int drive_0 )
{
pds -> readabsolutesectors ( drive_0, 0, 1, &bs ) ; // zero-based drive
display_boot_info( ) ;
}
void myview::display_boot_info( )
{
CString totalhiddenstr ;
CString totalsectorsstr ;
str = filetypestr + " BOOT Sector" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Jump Instruction : %X%X%X", ( BYTE ) bs.jump[0], ( BYTE ) bs.jump[1], ( BYTE ) bs.jump[2] ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "OEM Name : %s", bs.OEMname ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Bytes Per Sector : %u",bs.bps ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Sectors Per Cluster : %u",bs.spc ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Number of Sectors in Reserved Area : %u", bs.reservedsec ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Number of Copies of FAT : %u", bs.fatcopies ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Maximum Directory Entries : %u", bs.maxdirentries ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
if ( bs.totalsec == 0 )
{
CString hugesecstr ;
hugesecstr.Format ( "Huge Sectors = %u", bs.hugesec ) ;
str = hugesecstr ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
else
{
str.Format ( "Total Number of Sectors : %u", bs.totalsec ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
str.Format ( "Media Descriptor : %X", bs.mediadesc ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Sectors Per FAT : %u", bs.secperfat ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Sectors Per Track : %u", bs.secpertrack ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Number of Sides : %u", bs.noofsides ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Number of Hidden Sectors: %u", bs.hidden ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Drive Number: %d", bs.drivenumber ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Boot Signature: %u", bs.bootsignature ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Volume ID: %u", bs.volumeid ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
CString volstr ;
for ( int i = 0 ; i <= 10 ; i++ )
volstr += m.vollabel[i] ;
str = "Volume Label = " + volstr ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "File System Type = " + filetypestr ; // private - filetypestr
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
void myview::boot_info_32 ( int drive_1 )
{
pds -> readabsolutesectors32 ( drive_1, 0, 1, &bs32 ) ; // one-based drive
display_boot_info_32( ) ;
}
void myview::display_boot_info_32( )
{
str = filetypestr + "Boot Sector" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Jump Instruction : %X%X%X", ( BYTE ) bs32.jump[0], ( BYTE ) bs32.jump[1], ( BYTE ) bs32.jump[2] ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "OEM Name : %s", bs32.bsOemName ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Bytes Per Sector : %u", bs32.BytesPerSector ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Sectors Per Cluster : %u", bs32.SectorsPerCluster ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Number of Sectors in Reserved Area : %d", bs32.ReservedSectors ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Number of Copies of FAT : %d", bs32.NumberOfFATs ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Maximum Directory Entries : %d", bs32.RootEntries ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
if ( bs32.TotalSectors == 0 )
{
CString hugesecstr ;
hugesecstr.Format ( "Huge Sectors = %u", ( bs32.BigTotalSectorsHigh << 16) + bs32.BigTotalSectors ) ;
str = hugesecstr ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
else
{
str.Format ( "Total Number of Sectors : %d", bs32.TotalSectors ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
str.Format ( "Media Descriptor : %X", bs32.MediaDescriptor ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
if ( bs32.SectorsPerFAT == 0 )
{
str.Format ( "Big Sectors Per FAT : %d", (bs32.BigSectorsPerFatHi << 16) + bs32.BigSectorsPerFat ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
else
{
str.Format ( "Sectors Per FAT : %d", bs32.SectorsPerFAT ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
str.Format ( "Sectors Per Track : %d", bs32.SectorsPerTrack ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Number of Sides : %d", bs32.Heads ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
DWORD totalhidden = ( bs32.HiddenSectorsHigh << 16 ) + bs32.HiddenSectors ;
str.Format ( "Number of Hidden Sectors: %d", totalhidden ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Extended flags : %d", bs32.ExtFlags ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "File System Version : %d", bs32.FS_Version ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Root Dir Start Cluster : %d", ( bs32.RootDirStrtClusHi << 16 ) + bs32.RootDirStrtClus ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "File System Info Sector : %d", bs32.FSInfoSec ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -