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

📄 readdiskinfo.c

📁 windows下识别usb逻辑盘的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -