提交 2bfb5f79 创建 作者: 赵鹏翀's avatar 赵鹏翀

init template

上级
/*.img
/bochs/bios.bin-1.7.5
/bochs/bochs.exe
/bochs/bochsdbg.exe
/bochs/VGABIOS-lgpl-latest
/Debug
/Release
bochsout.txt
*.bak
\ No newline at end of file
#include <memory.h>
#include <stdio.h>
#include <windows.h>
#define BUFFER_SIZE 2048 // 4个扇区
#define BUFFER_SIZE2 4096 // 8个扇区
#define SECTOR_SIZE 512 // U盘扇区大小
#define OTHERSPACE_SIZE1 4095 // 用于占位,1个文件
#define OTHERSPACE_SIZE2 4091 // 用于占位,2个文件
#define OTHERSPACE_SIZE3 4087 // 用于占位.3个文件
unsigned char ucBuffer[BUFFER_SIZE];
unsigned char ucBuffer2[BUFFER_SIZE2];
int main(int argc, char* argv[])
{
//
// 当USBstick.img正被Bochs打开时,则生成失败。
//
char* character = NULL;
if(3 == argc)
{
character = argv[2]; // 取得文件名
}
else if(4 == argc)
{
character = argv[3];
}
else if(5 == argc)
{
character = argv[4];
}
else
{
printf("mkimage parameter error. \nUsage: mkimage.exe can not work.\n");
return 1;
}
// 尝试用写的方式读取U盘镜像文件
HANDLE hFile = CreateFile(character, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(INVALID_HANDLE_VALUE == hFile)
{
// 取得错误码
DWORD dwError = GetLastError();
if(ERROR_SHARING_VIOLATION == dwError)
{
printf("mkimage.exe 打开U盘镜像文件失败\nU盘镜像文件可能正在Bochs中正在运行,请先关闭Bochs后再重新生成\n");
}
else
{
printf("mkimage.exe 打开U盘镜像文件失败\n错误码:0x%x\n", dwError);
}
return 1;
}
// 关闭句柄
CloseHandle(hFile);
// 三个参数分别是mkimage.exe/boot.bin/USBstick.img
if(3 == argc)
{
//
// 打开软盘镜像
//
FILE *pFloppyFile = fopen(argv[2], "wb");
if (NULL == pFloppyFile)
{
printf("Createing %s failed\n", argv[2]);
return 1;
}
//
// 读取第一个文件 boot.bin,并写入U盘镜像的0号扇区
//
FILE *pBootSectFile = fopen(argv[1], "rb");
if (NULL == pBootSectFile)
{
printf("Unable to open %s file\n", argv[1]);
fclose(pFloppyFile);
return 1;
}
fread(ucBuffer, sizeof(unsigned char), SECTOR_SIZE, pBootSectFile);
int iNum1 = fwrite(ucBuffer, sizeof(unsigned char), SECTOR_SIZE, pFloppyFile);
printf("%s 被成功写入 %s! 一共写入 %d 字节 \n", argv[1], argv[2], iNum1);
fclose(pBootSectFile);
// 将缓冲区清空
memset(ucBuffer, 0, BUFFER_SIZE);
// 向U盘镜像文件中写入字符占位,使生成的镜像文件大小为2M,模拟一个正常的U盘
unsigned char s = 0;
int m = 0;
for(; m < OTHERSPACE_SIZE1; m++)
{
fwrite(&s, sizeof(unsigned char), SECTOR_SIZE, pFloppyFile);
}
fclose(pFloppyFile);
return 0;
}
// 四个参数分别是mkimage.exe/boot.bin/XXXX.bin/USBstick.img
else if(4 == argc)
{
//
// 打开软盘镜像文件
//
FILE *pFloppyFile = fopen(argv[3], "wb");
if (NULL == pFloppyFile)
{
printf("Createing %s failed\n", argv[3]);
return 1;
}
//
// 读取第一个文件 boot.bin,并写入U盘镜像的0号扇区
//
FILE *pBootSectFile = fopen(argv[1], "rb");
if (NULL == pBootSectFile)
{
printf("Unable to open %s file\n", argv[1]);
fclose(pFloppyFile);
return 1;
}
fread(ucBuffer, sizeof(unsigned char), SECTOR_SIZE, pBootSectFile);
int iNum2 = fwrite(ucBuffer, sizeof(unsigned char), SECTOR_SIZE, pFloppyFile);
printf("%s 被成功写入 %s! 一共写入 %d 字节 \n", argv[1], argv[3], iNum2);
fclose(pBootSectFile);
// 将缓冲区清空
memset(ucBuffer, 0, BUFFER_SIZE);
//
// 读取第二个文件 XXXX.bin,并写入U盘镜像的第 5 - 8 扇区
//
FILE *pSetupFile = fopen(argv[2], "rb");
if (NULL == pSetupFile)
{
printf("Unable to open file %s \n", argv[2]);
fclose(pFloppyFile);
return 1;
}
fread(ucBuffer, sizeof(unsigned char), BUFFER_SIZE, pSetupFile);
iNum2 = fwrite(ucBuffer, sizeof(unsigned char), BUFFER_SIZE, pFloppyFile);
printf("%s 被成功写入 %s! 一共写入 %d 字节\n", argv[2], argv[3], iNum2);
fclose(pSetupFile);
// 将缓冲区清空
memset(ucBuffer, 0, BUFFER_SIZE);
// 向U盘镜像文件中写入字符占位,使生成的镜像文件大小2M,模拟一个正常的U盘
unsigned char s = 0;
int n = 0;
for(; n < OTHERSPACE_SIZE2; n++)
{
fwrite(&s, sizeof(unsigned char), SECTOR_SIZE, pFloppyFile);
}
fclose(pFloppyFile);
return 0;
}
// 五个参数分别是mkimage.exe/boot.bin/XXXX.bin/YYYY.bin/USBstick.img
else if(5 == argc)
{
//
// 打开软盘镜像文件
//
FILE *pFloppyFile = fopen(argv[4], "wb");
if (NULL == pFloppyFile)
{
printf("Createing %s failed\n", argv[4]);
return 1;
}
//
// 读取第一个文件 boot.bin,并写入U盘镜像的0号扇区
//
FILE *pBootSectFile = fopen(argv[1], "rb");
if (NULL == pBootSectFile)
{
printf("Unable to open %s file\n", argv[1]);
fclose(pFloppyFile);
return 1;
}
fread(ucBuffer, sizeof(unsigned char), SECTOR_SIZE, pBootSectFile);
int iNum3 = fwrite(ucBuffer, sizeof(unsigned char), SECTOR_SIZE, pFloppyFile);
printf("%s 被成功写入 %s! 一共写入 %d 字节 \n", argv[1], argv[4], iNum3);
fclose(pBootSectFile);
// 将缓冲区清空
memset(ucBuffer, 0, BUFFER_SIZE);
//
// 读取第二个文件 XXXX.bin,并写入U盘镜像的第 2 - 5 扇区
//
FILE *pSetupFile = fopen(argv[2], "rb");
if (NULL == pSetupFile)
{
printf("Unable to open file %s \n", argv[2]);
fclose(pFloppyFile);
return 1;
}
fread(ucBuffer, sizeof(unsigned char), BUFFER_SIZE, pSetupFile);
iNum3 = fwrite(ucBuffer, sizeof(unsigned char), BUFFER_SIZE, pFloppyFile);
printf("%s 被成功写入 %s! 一共写入 %d 字节\n", argv[2], argv[4], iNum3);
fclose(pSetupFile);
// 将缓冲区清空
memset(ucBuffer, 0, BUFFER_SIZE);
//
// 读取第三个文件XXXX.bin,并写入U盘镜像的第 6 - 13扇区
//
FILE *pProtect = fopen(argv[3], "rb");
if (NULL == pSetupFile)
{
printf("Unable to open file %s \n", argv[3]);
fclose(pFloppyFile);
return 1;
}
fread(ucBuffer2, sizeof(unsigned char), BUFFER_SIZE2, pProtect);
iNum3 = fwrite(ucBuffer2, sizeof(unsigned char), BUFFER_SIZE2, pFloppyFile);
printf("%s 被成功写入 %s! 一共写入 %d 字节\n", argv[3], argv[4], iNum3);
fclose(pProtect);
// 将缓冲区清空
memset(ucBuffer2, 0, BUFFER_SIZE2);
// 向U盘镜像文件中写入字符占位,使生成的镜像文件大小为2M,模拟一个正常的U盘
unsigned char s = 0;
int j = 0;
for(; j < OTHERSPACE_SIZE3; j++)
{
fwrite(&s, sizeof(unsigned char), SECTOR_SIZE, pFloppyFile);
}
fclose(pFloppyFile);
return 0;
}
else
{
printf("mkimage parameter error. \nUsage: mkimage.exe can not work.\n");
return 1;
}
}
<?xml version="1.0" encoding="gb2312"?>
<ASMProject Version="1.00" Name="mkimage" ProjectID="91828e42-8627-4885-8ec3-029b80d08157" IsSubmitWork="0">
<Configurations>
<Configuration Name="Debug" DebuggerFlavor="0">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_DEBUG" GenerateDebugInformation="-1"/>
<Tool Name="JWASMAssemblerTool"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="JWlinkLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
<Configuration Name="Release" DebuggerFlavor="0">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="NDEBUG"/>
<Tool Name="JWASMAssemblerTool"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="JWlinkLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="ͷļ" Filter="h;hpp;hxx">
</Filter>
<Filter Name="Դļ" Filter="cpp;c;cc;cxx">
<File RelativePath=".\console.c">
</File>
</Filter>
</Files>
</ASMProject>
添加文件
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论