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

📄 cpp1.cpp

📁 计算机操作系统
💻 CPP
字号:
#include<windows.h>
#include<iostream.h>
#include<winioctl.h>
#include<string.h>
struct  Disk       //关于Disk结构的定义
{
    HANDLE  handle;
    DISK_GEOMETRY disk_info;
};

Disk  disk;
HANDLE  Floppy;
static _int64 sector;
bool  flag;
Disk  physicDisk(char  driverLetter);                                  //函数声明
bool  sectorRead(Disk  theDisk,unsigned  logicSectorNumber,char* buffer); //函数声明
void  sectorDump(Disk  theDisk,int logicSectorNumber);               //函数声明

void  main(void)
{
    int  secNum;
char  choise;
disk=physicDisk('f');  //选择要查看的磁盘
if(flag){
     while(1)
     {
         cout<<"**************************************"<<endl;
         cout<<"*         0. 查看指定目录信息:      *"<<endl;
         cout<<"*         1. 退出:                   *"<<endl;
		 cout<<"**************************************"<<endl;
         cin>>choise;
         switch(choise)
         {
             case '0':           //查看指定扇区
             cout<<"总共有"<<(long)sector<<"个扇区!"<<endl;
cout<<"请输入要查看的扇区号码:";
cin>>secNum;
if(secNum<sector && secNum>=0)
   sectorDump(disk,secNum);
   else
   cout<<"没有这个扇区!!!" <<endl;
//exit(0);
break;
case  '1':         //退出
    exit(0);
    break;
default:
cout<<"输入错误!!!请重新输入!!!" <<endl;
cout<<endl;
}
        }
    }
}
Disk  physicDisk(char  driverLetter)    //创建磁盘句柄,并打开磁盘,返回disk
{
flag = true;
DISK_GEOMETRY*  temp=new DISK_GEOMETRY;
char device[9]="\\\\.\\c:";
device[4]=driverLetter;
Floppy=CreateFile(  device,                   //将要打开的驱动器名
                 GENERIC_READ,         //存取的权限
                 FILE_SHARE_READ|FILE_SHARE_WRITE,  //共享的权限
                 NULL,                  //默认属性值
                 OPEN_EXISTING,        //创建驱动器的方式
                 0,                      //所创建的驱动器的属性
                 NULL);                 //指向模板文件的句柄
if (GetLastError()==ERROR_ALREADY_EXISTS)  //打开失败,则返回错误代码
{
    cout<<"不能打开磁盘" <<endl;
cout<<GetLastError()<<endl;
      flag=false;
    return  disk;
}
DWORD  bytereturned;
int  Result;
disk.handle = Floppy;
//获取物理磁盘几何信息
Result=DeviceIoControl(Floppy,IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,
0,
temp,
sizeof(*temp),
&bytereturned,
(LPOVERLAPPED)
NULL);
if(!Result)         //如果失败,返回错误代码
{
cout<<"打开失败"<<endl;
cout<<"错误代码为:"<<GetLastError( )<<endl;
flag=false;
return  disk;
}
disk.disk_info=*temp;
//输出的是整个物理磁盘的信息
cout<<"柱面数为:"<<(unsigned  long)disk.disk_info.Cylinders.QuadPart<<endl<<endl;
cout<<"每柱面的磁道数为:"<<disk.disk_info.TracksPerCylinder<<endl<<endl;
cout<<"每磁道的扇区数为:"<<disk.disk_info.SectorsPerTrack<<endl<<endl;
cout<<"每扇区的字节数为:"<<disk.disk_info.BytesPerSector<<endl<<endl;
sector=disk.disk_info.Cylinders.QuadPart*(disk.disk_info.TracksPerCylinder)*(disk.disk_info.SectorsPerTrack);
double  DiskSize=(double)disk.disk_info.Cylinders.QuadPart*(disk.disk_info.TracksPerCylinder)*(disk.disk_info.SectorsPerTrack)*(disk.disk_info.BytesPerSector);       
           //相乘获得磁盘大小
cout<<"磁盘大小为:"<<DiskSize/(1024*1024)<<"MB。"<<endl;
cout<<driverLetter<<"盘所在磁盘总共有"<<(long)sector<<"个扇区"<<endl;
delete  temp;
return  disk;
}
void  sectorDump(Disk  theDisk,int  logicSectorNumber)     //如果读成功,输出读的结果
{
bool sDresult;
char*  buffer=new  char[theDisk.disk_info.BytesPerSector];
sDresult=sectorRead(disk,logicSectorNumber,buffer);
if(sDresult)                                        //读扇区成功,打印扇区信息
{
for(int  i=0;i<int(theDisk.disk_info.BytesPerSector);i++)
cout<<buffer[i];
cout<<endl;                               //换行
cout<<endl;
cout<<endl;
}
delete  buffer;
}
bool  sectorRead(Disk  theDisk,unsigned logicSectorNumber,char* buffer)//读指定扇区
{
HANDLE  handle1=theDisk.handle;
int  sDresult,Result;
DWORD  numberofread;
//定位读扇区的位置
sDresult=SetFilePointer(handle1,
                    theDisk.disk_info.BytesPerSector* logicSectorNumber,
                    NULL,
                    FILE_BEGIN);
//读扇区,并返回读的结果
Result=ReadFile(handle1,
              buffer,
              theDisk.disk_info.BytesPerSector,
              &numberofread,
              NULL);
if(Result)    //如果读扇区成功
return  true;
else    //如果失败,返回错误代码
{
    cout<<"读指定扇区失败"<<endl;
    cout<<"错误代码为:"<<GetLastError()<<endl;
    return  false;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -