⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myview.cpp

📁 吐血了
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -