📄 readdiskinfo.c
字号:
#include "windows.h"
#include "Readdiskinfo.h"
#include "stdio.h"
void main()
{
BYTE Buffer[MAX_LEN]={0};
DWORD dwRet;
__int64 MoveRange=0;
__int64 tempRange=0;
__int64 LuojiRange=0;
int i,j,jj;//,jjj;
DWORD MoveLow=0;
DWORD MoveHigh=0;
char DeviceName[256];
DWORD Ceshi=0;
IDE_Num=0;
GetIDENum();//获取IDE设备数目
GetDriverInfomation();
if(Drv_Num==0)
return;
for(i=0;i<IDE_Num;i++)//对IDE设备进行测试
{
//对主分区进行测试
//printf("=========================DISK%d==========================\n",i+1);
hDevice=NULL;
memset(Buffer,0,MAX_LEN);
memset(DeviceName,0,256);
MoveRange=0;
LuojiRange=0;
sprintf(DeviceName,"\\\\.\\PHYSICALDRIVE%d",i);
OpenDevice(DeviceName);
if(hDevice==NULL)
{
// printf("======================================================\n");
continue;
}
else
{
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
//Output_Data(Buffer,512);
memset(Section,0,64);
memcpy(Section,Buffer+510,2);
if(Section[0]!=0x55 || Section[1]!=0xAA)//读到的不是分区表的数据
{
CloseDevice(hDevice);
//printf("======================================================\n");
continue;
}
else
{
memset(Section,0,64);
memcpy(Section,Buffer+0x1be,64);//得到主分区的分区表(用于逻辑分区的测试)
///硬盘分区表
//printf("硬盘分区表\n");
//Output_Data(Section,64);
for(j=0;j<4;j++)
{
MoveRange=0;
MoveRange=(((((Section[j*16+11]<<8)+Section[j*16+10])<<8)+Section[j*16+9])<<8)+Section[j*16+8];
if(MoveRange==0)
{
continue;
}
MoveRange*=MAX_LEN;
tempRange=MoveRange;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
MoveHigh=(DWORD)(tempRange>>32);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
//printf("第%d个分区的引导扇区内容\n",j);
//Output_Data(Buffer,512);
//Output_Data(Buffer+0x1be,64);
if(Section[j*16+0]==0x80)//活动分区直接识别逻辑盘
{
MoveRange=(((((Section[j*16+11]<<8)+Section[j*16+10])<<8)+Section[j*16+9])<<8)+Section[j*16+8]+1;
MoveRange*=MAX_LEN;
tempRange=MoveRange;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
MoveHigh=(DWORD)(tempRange>>32);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
// Output_Data(Buffer,512);
// Output_Data(Buffer+0x1be,64);
RecogDiskInfo(Buffer,i);
}
else if(Section[j*16+0]==0x00)//非活动分区
{
Ceshi=0;
for(jj=32;jj<64;jj++) //0-400
{
Ceshi+=Buffer[jj+0x1be];
}
if(Ceshi==0)//扩展分区
{
// jjj=0;
// printf("第%d个逻辑盘的引导扇区内容\n",jjj);
//Output_Data(Buffer,512);
//Output_Data(Buffer+0x1be,64);
memset(Par_Section,0,64);
memcpy(Par_Section,Buffer+0x1be,64);
memset(luoji_Section,0,64);
memcpy(luoji_Section,Buffer+0x1be,64);
MoveRange=(((((Section[j*16+11]<<8)+Section[j*16+10])<<8)+Section[j*16+9])<<8)+Section[j*16+8];
MoveRange=MoveRange+(((((Par_Section[11]<<8)+Par_Section[10])<<8)+Par_Section[9])<<8)+Par_Section[8]+1;
MoveRange*=MAX_LEN;
tempRange=MoveRange;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
MoveHigh=(DWORD)(tempRange>>32);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
//Output_Data(Buffer,512);
//Output_Data(Buffer+0x1be,64);
RecogDiskInfo(Buffer,i);
Ceshi=0;
for(jj=16;jj<32;jj++)
{
Ceshi+=Par_Section[jj];
}
while(Ceshi!=0)
{
//jjj++;
MoveRange=(((((Section[j*16+11]<<8)+Section[j*16+10])<<8)+Section[j*16+9])<<8)+Section[j*16+8];
MoveRange=MoveRange+(((((luoji_Section[11+16]<<8)+luoji_Section[10+16])<<8)+luoji_Section[9+16])<<8)+luoji_Section[8+16];
// MoveRange*=MAX_LEN;
tempRange=MoveRange;
tempRange*=MAX_LEN;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
tempRange*=MAX_LEN;
MoveHigh=(DWORD)(tempRange>>32);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
//printf("第%d个逻辑盘的引导扇区内容\n",jjj);
//Output_Data(Buffer,512);
//Output_Data(Buffer+0x1be,64);
memset(luoji_Section,0,64);
memcpy(luoji_Section,Buffer+0x1be,64);
//MoveRange=MoveRange+(((((Par_Section[11+16]<<8)+Par_Section[10+16])<<8)+Par_Section[9+16])<<8)+Par_Section[8+16]+1;
MoveRange=MoveRange+(((((luoji_Section[11]<<8)+luoji_Section[10])<<8)+luoji_Section[9])<<8)+luoji_Section[8]+1;
//MoveRange*=MAX_LEN;
tempRange=MoveRange;
tempRange*=MAX_LEN;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
tempRange*=MAX_LEN;
MoveHigh=(DWORD)(tempRange>>32);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
// Output_Data(Buffer,512);
// Output_Data(Buffer+0x1be,64);
RecogDiskInfo(Buffer,i);
Ceshi=0;
for(jj=16;jj<32;jj++)
{
Ceshi+=luoji_Section[jj];
}
}
}
else//基本分区
{
MoveRange=(((((Section[j*16+11]<<8)+Section[j*16+10])<<8)+Section[j*16+9])<<8)+Section[j*16+8]+1;
MoveRange*=MAX_LEN;
tempRange=MoveRange;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
MoveHigh=(DWORD)(tempRange>>32);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
// Output_Data(Buffer,512);
// Output_Data(Buffer+0x1be,64);
RecogDiskInfo(Buffer,i);
}
}
}
}
}
//printf("======================================================\n");
CloseDevice(hDevice);
}
ReconDiskKind();
/*
MoveRange=64*MAX_LEN;
tempRange=MoveRange;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
MoveHigh=(DWORD)(tempRange>>32);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
printf("主分区逻辑盘-首扇区\n");
Output_Data(Buffer,512);
RecogDiskInfo(Buffer,i);
CloseDevice(hDevice);//读出主分区逻辑盘的512字节分区信息
}
//根据Section计算扩展分区
if(Section[27]==0 && Section[26]==0 && Section[25]==0 && Section[24]==0)
{
//该物理设备只有主分区
continue;
}
else
{
//读取分区的第一个逻辑盘的分区信息
MoveRange=0;
MoveRange=(((((Section[27]<<8)+Section[26])<<8)+Section[25])<<8)+Section[24];
MoveRange=MoveRange*MAX_LEN;
tempRange=MoveRange;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
MoveHigh=(DWORD)(tempRange>>32);
hDevice=NULL;
memset(Buffer,0,MAX_LEN);
OpenDevice(DeviceName);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
printf("扩展分区-逻辑盘信息\n");
Output_Data(Buffer,512);
memset(Section,0,64);
memcpy(Section,Buffer+510,2);
if(Section[0]!=0x55 || Section[1]!=0xAA)//读到的不是分区表的数据
{
CloseDevice(hDevice);
continue;
}
else
{
memset(Section,0,64);
////为了确定扩展分区是否是从0x1be开始而修改,2004-10-22
memcpy(Section,Buffer,512);//;+0x1be,64);
Ceshi=0;
for(j=32;j<64;j++)
{
Ceshi+=Section[j];
}
if(Ceshi!=0)
{
// CloseDevice(hDevice);
// continue;
}
MoveRange+=64*MAX_LEN;
tempRange=MoveRange;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
MoveHigh=(DWORD)(tempRange>>32);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
//Output_Data(Buffer);
RecogDiskInfo(Buffer,i);
CloseDevice(hDevice);
LuojiRange=MoveRange-64*MAX_LEN;
//读取分区中其他逻辑盘的分区信息
while(!(Section[27]==0 && Section[26]==0 && Section[25]==0 && Section[24]==0))
{
MoveRange=0;
MoveRange=(((((Section[27]<<8)+Section[26])<<8)+Section[25])<<8)+Section[24];
MoveRange=MoveRange*MAX_LEN;
MoveRange+=LuojiRange;
tempRange=MoveRange;
MoveLow=(DWORD)(tempRange&0x00000000FFFFFFFF);
tempRange=MoveRange;
MoveHigh=(DWORD)(tempRange>>32);
hDevice=NULL;
memset(Buffer,0,MAX_LEN);
OpenDevice(DeviceName);
SetFilePointer(hDevice,MoveLow,&MoveHigh,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
printf("扩展分区\n");
Output_Data(Buffer,512);
memset(Section,0,64);
memcpy(Section,Buffer+510,2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -