📄 myview.cpp
字号:
str.Format ( "Backup Boot Sector : %d", bs32.BkUpBootSec ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "BIOS Drive Number: %d", bs32.bsDriveNumber ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Boot Signature: %u", bs32.bsBootSignature ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Volume ID: %u", bs32.bsVolumeID ) ;
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 = "" ;
if ( bs32.FSInfoSec != 0xffff )
file_sys_info( ) ;
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
void myview::file_sys_info( )
{
bigfatbootfsinfo *pfsinfo = NULL ;
BYTE *pbuf = new BYTE[512] ;
pds -> readabsolutesectors32 ( 3, bs32.FSInfoSec, 1, pbuf ) ;
BYTE *pend = pbuf ;
while ( TRUE )
{
DWORD *pdw = ( DWORD* ) pbuf ;
if ( *pdw == FSINFOSIG )
{
pfsinfo = ( bigfatbootfsinfo * ) pdw ;
break ;
}
pbuf += 4 ;
}
str.Format ( "Signature : %08lx", pfsinfo -> FSInf_Sig ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Free Clusters : %u", pfsinfo -> FSInf_free_clus_cnt ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str.Format ( "Next Free Cluster : %u", pfsinfo -> FSInf_next_free_clus ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
void myview::fat_info( )
{
DWORD first_fat, second_fat ;
if ( strncmp ( "FAT32", filetypestr, 5 ) == 0 )
{
first_fat = bs32.ReservedSectors ;
second_fat = bs32.ReservedSectors + ( bs32.BigSectorsPerFatHi << 16 ) + bs32.BigSectorsPerFat ;
}
else
{
first_fat = bs.reservedsec ;
second_fat = bs.reservedsec + bs.secperfat ;
}
str = filetypestr + "Fat Information" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "First FAT Information" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
read_fat_info ( first_fat ) ;
str = "" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
str = "Second FAT Information" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
read_fat_info ( second_fat ) ;
str = "-------------------------------" ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
void myview::read_fat_info ( DWORD fat_num )
{
int j, i ;
CString fattempstr, fatstr ;
BYTE *p ;
if ( strncmp ( "FAT12", filetypestr, 5 ) == 0 )
{
p = new BYTE[bs.bps] ;
pds -> readabsolutesectors ( 0, fat_num, 1, p ) ;
int k ;
for ( k = 2 ; k < 18 ; k++ )
{
fattempstr = pds -> getfat_12 ( p, k ) ;
str += " " + fattempstr ;
if ( k % 9 == 0 )
{
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
}
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
if ( strncmp ( "FAT16", filetypestr, 5 ) == 0 )
{
p = new BYTE[bs.bps] ;
pds -> readabsolutesectors ( 2, fat_num, 1, p ) ;
WORD* pfat = ( WORD * ) p ;
for ( j = 0 ; j < 2 ; j++ )
{
str.Format ( "%d ", j * 8 ) ;
for ( i = 0 ; i < 8 ; i++ )
{
fattempstr.Format ( "%04x ", *pfat++ ) ;
str += fattempstr ;
}
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
}
if ( strncmp ( "FAT32", filetypestr, 5 ) == 0 )
{
p = new BYTE[bs32.BytesPerSector] ;
pds -> readabsolutesectors32 ( 3, fat_num, 1, p ) ;
DWORD* pfat32 = (DWORD*) p ;
for ( j = 0 ; j < 8 ; j++ )
{
str.Format ( "%2d ", j * 8 ) ;
for ( i = 0 ; i < 8 ; i++ )
{
fattempstr.Format ( "%07x ", ( *pfat32++ ) & 0xfffffff ) ;
str += fattempstr ;
}
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
}
}
void myview::display_dir_info ( int isFAT32, int drv )
{
BYTE * pbuf ;
int bufsize ;
if ( isFAT32 == 0 )
{
unsigned short sect_cnt = ( ( 32 * bs.maxdirentries ) + bs.bps - 1 ) / bs.bps ;
DWORD dirsec = ( bs.reservedsec + bs.secperfat * 2 ) ;
bufsize = sect_cnt * bs.bps ;
pbuf = new BYTE[bufsize] ;
pds -> readabsolutesectors ( drv, dirsec, sect_cnt, pbuf ) ;
}
else
{
DWORD sector_size = bs32.BytesPerSector ;
DWORD sectors_per_fat = ( bs32.BigSectorsPerFatHi << 16 ) + bs32.BigSectorsPerFat ;
DWORD sectors_per_clus = bs32.SectorsPerCluster ;
DWORD rootdirstartclus = ( bs32.RootDirStrtClusHi << 16 ) + bs32.RootDirStrtClus ;
rootdirstartclus -= 2 ; // the first two clusters in the FAT are reserved
DWORD startsector = bs32.ReservedSectors + sectors_per_fat * 2 ;
DWORD rootdirstartsector = startsector + rootdirstartclus * bs32.SectorsPerCluster ;
bufsize = sectors_per_clus * sector_size ;
pbuf = new BYTE[bufsize] ;
pds -> readabsolutesectors32 ( drv + 1, rootdirstartsector, sectors_per_clus, pbuf ) ;
}
CString at, dirstr ;
CString datestr, timestr, lastdatestr ;
str.Format ( " %-16s %-9s %-19s %-10s %-9s %-6s %-5s", "Name", "Attrib", "Creation Date/Time", "Last Date", "St.Clust.","Size", "Chksum" ) ;
pdoc -> lines.AddTail ( str ) ;
str = "" ;
BYTE *epbuf, *spbuf ;
spbuf = pbuf ;
epbuf = spbuf + bufsize ;
while ( ( spbuf < epbuf ) && *spbuf )
{
if ( *spbuf == 0xe5 )
spbuf += sizeof ( directory ) ;
else
{
if ( * ( spbuf + 0x0b ) == 0xf && * ( spbuf + 0x0c ) == 0 )
{
int c ;
wchar_t szName[14] ;
longdirectory *pl = ( longdirectory * ) spbuf ;
if ( pl -> leSequence & 0x40 )
dirstr.Format ( "%c ", pl -> leSequence ) ;
else
dirstr.Format ( "%d ", pl -> leSequence ) ;
memset( szName, 0, sizeof( szName ) );
swprintf ( szName, L"%.5s", pl->leName ) ;
if ( pl -> leName2[0] != 0 && pl -> leName2[0] != 0xffff )
swprintf ( szName, L"%s%.6s", szName, pl -> leName2 ) ;
if ( pl -> leName3[0] != 0 && pl -> leName3[0] != 0xffff )
swprintf( szName, L"%s%.2s", szName, pl->leName3 );
c = wcslen( szName );
while ( c < 13 )
{
szName[c] = L' ' ;
c++ ;
}
wprintf( L"%s ", szName ) ;
dirstr += szName ;
at = ( pl -> leAttributes & 0x20 ) ? "a " : "- " ;
at += ( pl -> leAttributes & 0x10 ) ? "d " : "- " ;
at += ( pl -> leAttributes & 0x08 ) ? "v " : "- " ;
at += ( pl -> leAttributes & 0x04 ) ? "s " : "- " ;
at += ( pl -> leAttributes & 0x02 ) ? "h " : "- " ;
at += ( pl -> leAttributes & 0x01 ) ? "r " : "- " ;
str = dirstr ;
dirstr.Format ( "%02x", pl -> leChksum ) ;
spbuf += sizeof ( directory ) ;
CString temp ;
temp.Format ( "%65s", " " ) ;
str += temp + dirstr ;
}
else
{
if ( * ( spbuf + 0x0b ) == 0xf && *( spbuf + 0x0c ) != 0 )
{
str = "! " ;
for( int i = 0 ; i < 16 ; i++ )
{
dirstr.Format ( "%02x ", *spbuf++ ) ;
str += dirstr + " " ;
}
pdoc -> lines.AddTail ( str ) ;
str = "" ;
for( i = 0 ; i < 6 ; i++ )
{
dirstr.Format ( "%02x ",*spbuf++ );
str += " " + dirstr ;
}
pdoc -> lines.AddTail ( str ) ;
str = "" ;
spbuf += sizeof( directory );
}
// "Short" directory entry
else
{
directory *pd = ( directory * ) spbuf ;
str.Format ( " %.8s %.3s ", pd -> filename, pd -> extension ) ;
at = ( pd -> att & 0x20 ) ? "a " : "- " ;
at += ( pd -> att & 0x10 ) ? "d " : "- " ;
at += ( pd -> att & 0x08 ) ? "v " : "- " ;
at += ( pd -> att & 0x04 ) ? "s " : "- " ;
at += ( pd -> att & 0x02 ) ? "h " : "- " ;
at += ( pd -> att & 0x01 ) ? "r " : "- " ;
str += " " + at ;
//Date Of Creation
if ( pd -> createdate != 0 )
{
short int dd = ( pd -> createdate & 0x001f ) ;
short int mm = ( ( pd -> createdate & 0x01e0 ) >> 5) ;
short int yy = ( ( pd -> createdate & 0xfe00 ) >> 9 ) + 80;
datestr.Format ( "%2d-%2d-%2d", dd, mm, yy ) ;
}
else
datestr = "xx-xx-xx" ;
str += " " + datestr ;
if ( pd -> createtime != 0 )
{
short int hr = ( pd -> createtime & 0xf800 ) >> 11 ;
short int min = ( ( pd -> createtime & 0x07e0 ) >> 5 ) ;
short int sec = ( pd -> createtime & 0x001f ) * 2 ;
timestr.Format ( "%2d:%2d:%2d", hr, min, sec ) ;
}
else
timestr = "xx:xx:xx" ;
str += " " + timestr ;
//Last Access Date
if ( pd -> lastdate != 0 )
{
short int lastdd = ( pd -> lastdate & 0x001f ) ;
short int lastmm = ( ( pd -> lastdate & 0x01e0 ) >> 5) ;
short int lastyy = ( ( pd -> lastdate & 0xfe00 ) >> 9 ) + 80;
lastdatestr.Format ( " %2d-%2d-%2d", lastdd, lastmm, lastyy ) ;
}
else
lastdatestr = " xx-xx-xx" ;
str += " " + lastdatestr ;
if ( isFAT32 == 0 )
dirstr.Format ( " %-8d %-8lu ", pd -> startclus, pd-> size ) ;
else
dirstr.Format ( " %04x%04x %-8lu ", pd -> fat32handle, pd -> startclus, pd -> size ) ;
str += " " + dirstr ;
spbuf += sizeof( directory );
}
}
}
pdoc -> lines.AddTail ( str ) ;
str = "" ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -