怎么写程序到U盘来形成一个引导扇区,使之可以在裸机上运行
如何写程序到U盘来形成一个引导扇区,使之可以在裸机上运行?
对于软盘来说可以把代码写到软盘的0面0磁道1扇区,并以0XAA55结束,这样BIOS就会认为它是一个引导扇区,从而执行这段代码。
那么对于U盘来说(假设主板支持U盘启动),那么是否可以同样的把代码写到U盘的0面0磁道1扇区,并以0XAA55结束,来形成一个引导扇区呢?如果不能应该是怎么样的思路来完成这个事情?谢谢!
------解决方案--------------------
如果通过mass storage driver与U盘交互我相信一定是有办法的,但涉及的东西可能就比较多。特别当我们需要一些不那么标准的IOCTL时,要研究的东西就更多了。SPTI是最简单直接的一种方法,以下这段代码就可以打开任何一个U盘的句柄:
BOOL OpenDevice()
{
char szDrive[] = "\\\\.\\C: ";
char driveLabel;
DWORD dwDrivesOnSystem = GetLogicalDrives();
UINT uDriveType;
for (driveLabel = 'C '; driveLabel <= 'Z ' && dwDrivesOnSystem > 0; driveLabel++, dwDrivesOnSystem > > = 1)
{
szDrive[4] = driveLabel;
uDriveType = GetDriveType ( &szDrive[4] );
if(uDriveType == DRIVE_REMOVABLE)
{
break;
}
}
m_driveLabel = szDrive[4] = driveLabel;
m_hDevHandle = CreateFile(szDrive,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (m_hDevHandle == INVALID_HANDLE_VALUE)
RetOpenDevice = FALSE;
else
RetOpenDevice = TRUE;
return RetOpenDevice;
}
以后用在这里得到的句柄,再组装适合你的U盘的SCSI命令就能用DeviceIoControl与其交互了。
具体的你就要自己摸索喽。
对于软盘来说可以把代码写到软盘的0面0磁道1扇区,并以0XAA55结束,这样BIOS就会认为它是一个引导扇区,从而执行这段代码。
那么对于U盘来说(假设主板支持U盘启动),那么是否可以同样的把代码写到U盘的0面0磁道1扇区,并以0XAA55结束,来形成一个引导扇区呢?如果不能应该是怎么样的思路来完成这个事情?谢谢!
------解决方案--------------------
如果通过mass storage driver与U盘交互我相信一定是有办法的,但涉及的东西可能就比较多。特别当我们需要一些不那么标准的IOCTL时,要研究的东西就更多了。SPTI是最简单直接的一种方法,以下这段代码就可以打开任何一个U盘的句柄:
BOOL OpenDevice()
{
char szDrive[] = "\\\\.\\C: ";
char driveLabel;
DWORD dwDrivesOnSystem = GetLogicalDrives();
UINT uDriveType;
for (driveLabel = 'C '; driveLabel <= 'Z ' && dwDrivesOnSystem > 0; driveLabel++, dwDrivesOnSystem > > = 1)
{
szDrive[4] = driveLabel;
uDriveType = GetDriveType ( &szDrive[4] );
if(uDriveType == DRIVE_REMOVABLE)
{
break;
}
}
m_driveLabel = szDrive[4] = driveLabel;
m_hDevHandle = CreateFile(szDrive,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (m_hDevHandle == INVALID_HANDLE_VALUE)
RetOpenDevice = FALSE;
else
RetOpenDevice = TRUE;
return RetOpenDevice;
}
以后用在这里得到的句柄,再组装适合你的U盘的SCSI命令就能用DeviceIoControl与其交互了。
具体的你就要自己摸索喽。