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

📄 readdiskinfo.c

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