📄 readdiskinfo.c
字号:
if(Section[0]!=0x55 || Section[1]!=0xAA)//读到的不是分区表的数据
{
CloseDevice(hDevice);
continue;
}
else
{
memset(Section,0,64);
memcpy(Section,Buffer+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);//读出其他逻辑盘的分区信息
}
}
}
}
}
}
ReconDiskKind();
*/
return;
}
HANDLE OpenDevice(LPCTSTR filename)
{
// 打开设备
hDevice = CreateFile(filename, // 文件名
GENERIC_READ | GENERIC_WRITE, // 读写方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件
return hDevice;
}
void CloseDevice()
{
CloseHandle(hDevice);
}
void Output_Data(BYTE *Buf,int ii)
{
BYTE *tempbuf;
int i;
//打印读到的数据
/*
tempbuf=Buf+0x1be;
i=0;
for(i=0;i<64;i++)
{
printf("%02x ",*tempbuf);
tempbuf++;
if((i+1)%16==0)
printf("\n");
}
tempbuf=Buf+510;
printf("%02x ",*tempbuf);
tempbuf++;
printf("%02x ",*tempbuf);
*/
tempbuf=Buf;
i=0;
for(i=0;i<ii;i++)
{
printf("%02x ",*tempbuf);
tempbuf++;
if((i+1)%16==0)
printf("\n");
}
printf("\n");
printf("\n");
}
void GetDriverInfomation()
{
DWORD LogicalNum=0;
DWORD StepNum=1;
DWORD Temp;
int Step_Time=0;
char Driver_Name[20];
UINT Driver_Type;
char Device_Str[256];
BYTE Buffer[MAX_LEN];
DWORD dwRet;
Drv_Num=0;
LogicalNum=GetLogicalDrives();
if(LogicalNum==0)
return;
while(Step_Time<27)
{
Temp=LogicalNum;
Temp&=StepNum;
if(Temp!=0)
{
memset(Driver_Name,0,20);
sprintf(Driver_Name,"%c:",('A'+Step_Time));
Driver_Type=GetDriveType(Driver_Name);
Drv_Num++;
Driver[Drv_Num-1].Drv_attach=-1;
strcpy(Driver[Drv_Num-1].Drv_Name,Driver_Name);
Driver[Drv_Num-1].Drv_Kind =Driver_Type;
if(Driver_Type==DRIVE_FIXED)
{
hDevice=NULL;
memset(Device_Str,0,256);
memset(Buffer,0,MAX_LEN);
sprintf(Device_Str,"\\\\.\\%c:",('A'+Step_Time));
OpenDevice(Device_Str);
SetFilePointer(hDevice,MAX_LEN,NULL,FILE_BEGIN);
ReadFile(hDevice,Buffer,MAX_LEN,&dwRet,0);
memcpy(Driver[Drv_Num-1].Drv_Info,Buffer+0x1be,64);
// printf(Device_Str);
// printf("\n");
// Output_Data(Buffer,512);
// printf("\n");
CloseDevice(hDevice);
}
}
StepNum*=2;
Step_Time++;
}
}
void RecogDiskInfo(BYTE *src,int HardDiskNO)
{
int i;
BYTE temp_buf[64];
memset(temp_buf,0,64);
memcpy(temp_buf,src+0x1be,64);
for(i=0;i<Drv_Num;i++)
{
if(Driver[i].Drv_Kind==DRIVE_FIXED)
{
if(!memcmp(temp_buf,Driver[i].Drv_Info,64))//分区表相同
{
if(Driver[i].Drv_attach<0)
{
Driver[i].Drv_attach =HardDiskNO;
return;
}
}
}
}
}
void ReconDiskKind()
{
int i;
//输出逻辑盘信息
for(i=0;i<Drv_Num;i++)
{
printf("%s ",Driver[i].Drv_Name);
printf("%d ",Driver[i].Drv_attach);
if(Driver[i].Drv_Kind==DRIVE_REMOVABLE)
printf("DRIVE_REMOVABLE\n");
if(Driver[i].Drv_Kind==DRIVE_FIXED)
printf("DRIVE_FIXED\n");
if(Driver[i].Drv_Kind==DRIVE_CDROM)
printf("DRIVE_CDROM\n");
if(Driver[i].Drv_Kind==DRIVE_REMOTE)
printf("DRIVE_REMOTE\n");
if(Driver[i].Drv_Kind==DRIVE_UNKNOWN)
printf("DRIVE_UNKNOWN\n");
}
printf("\n");
//对逻辑盘重新分类
for(i=0;i<Drv_Num;i++)
{
if(Driver[i].Drv_Kind ==DRIVE_FIXED)
{
if(Driver[i].Drv_attach<0)
{
Driver[i].Drv_Kind=DRIVE_REMOVABLE;
}
}
else if(Driver[i].Drv_Kind ==DRIVE_REMOVABLE)
{
if(!strcmp(Driver[i].Drv_Name,"A:") || !strcmp(Driver[i].Drv_Name,"B:"))
{
Driver[i].Drv_Kind=DRIVE_FIXED;
}
}
}
//输出改变后逻辑盘信息
for(i=0;i<Drv_Num;i++)
{
printf("%s ",Driver[i].Drv_Name);
printf("%d ",Driver[i].Drv_attach);
if(Driver[i].Drv_Kind==DRIVE_REMOVABLE)
printf("DRIVE_REMOVABLE\n");
if(Driver[i].Drv_Kind==DRIVE_FIXED)
printf("DRIVE_FIXED\n");
if(Driver[i].Drv_Kind==DRIVE_CDROM)
printf("DRIVE_CDROM\n");
if(Driver[i].Drv_Kind==DRIVE_REMOTE)
printf("DRIVE_REMOTE\n");
if(Driver[i].Drv_Kind==DRIVE_UNKNOWN)
printf("DRIVE_UNKNOWN\n");
}
printf("\n");
}
void GetIDENum()
{
HANDLE hDevice; // 设备句柄
BOOL bResult; // 返回结果
char szFileName[20]; // 文件名
int i;
PIDINFO pIdInfo=NULL;
for(i=0;i<4;i++)
{
sprintf(szFileName,"\\\\.\\PhysicalDrive%d", i);
hDevice = CreateFile(szFileName, // 文件名
GENERIC_READ | GENERIC_WRITE, // 读写方式
FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享方式
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件
if (hDevice == INVALID_HANDLE_VALUE)
{
return;
}
bResult = IdentifyDevice(hDevice, pIdInfo);
if (bResult)
{
IDE_Num++;
}
CloseHandle (hDevice);
}
}
BOOL IdentifyDevice(HANDLE hDevice, PIDINFO pIdInfo)
{
PSENDCMDINPARAMS pSCIP; // 输入数据结构指针
PSENDCMDOUTPARAMS pSCOP; // 输出数据结构指针
DWORD dwOutBytes; // IOCTL输出数据长度
BOOL bResult; // IOCTL返回值
// 申请输入/输出数据结构空间
pSCIP = (PSENDCMDINPARAMS)GlobalAlloc(LMEM_ZEROINIT, sizeof(SENDCMDINPARAMS) - 1);
pSCOP = (PSENDCMDOUTPARAMS)GlobalAlloc(LMEM_ZEROINIT, sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1);
// 指定ATA/ATAPI命令的寄存器值
// pSCIP->irDriveRegs.bFeaturesReg = 0;
// pSCIP->irDriveRegs.bSectorCountReg = 0;
// pSCIP->irDriveRegs.bSectorNumberReg = 0;
// pSCIP->irDriveRegs.bCylLowReg = 0;
// pSCIP->irDriveRegs.bCylHighReg = 0;
// pSCIP->irDriveRegs.bDriveHeadReg = 0;
pSCIP->irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
// 指定输入/输出数据缓冲区大小
pSCIP->cBufferSize = 0;
pSCOP->cBufferSize = sizeof(IDINFO);
// IDENTIFY DEVICE
bResult = DeviceIoControl(hDevice, // 设备句柄
DFP_RECEIVE_DRIVE_DATA, // 指定IOCTL
pSCIP, sizeof(SENDCMDINPARAMS) - 1, // 输入数据缓冲区
pSCOP, sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1, // 输出数据缓冲区
&dwOutBytes, // 输出数据长度
(LPOVERLAPPED)NULL); // 用同步I/O
// 复制设备参数结构
// memcpy(pIdInfo, pSCOP->bBuffer, sizeof(IDINFO));
// 释放输入/输出数据空间
GlobalFree(pSCOP);
GlobalFree(pSCIP);
return bResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -