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

📄 main.cpp

📁 很好的一个微型操作系统源码
💻 CPP
字号:
#include <windows.h>
#include <stdio.h>

BYTE* image;
char filename[256];
char filepath[256];

IMAGE_DOS_HEADER dos_header;
DWORD signature;

DWORD fileheaderoffset;
IMAGE_FILE_HEADER file_header;

DWORD optionalheaderoffset;
IMAGE_OPTIONAL_HEADER optional_header;

DWORD section_number;
DWORD sectiontableoffset;
IMAGE_SECTION_HEADER section[16];

BOOL fLoad;

DWORD LoadImage(char*file)
{
	FILE *fp=fopen(file,"rb");										//Read Dos Header

	if(fp==0)
		return 0;

	fread(&dos_header,sizeof(IMAGE_DOS_HEADER),1,fp);

	fseek(fp,dos_header.e_lfanew,SEEK_SET);						//ReadSignature
	DWORD sig;
	fread(&sig,4,1,fp);

	if(LOWORD(sig)==IMAGE_OS2_SIGNATURE || LOWORD(sig)==IMAGE_OS2_SIGNATURE_LE) 
	{
		fseek(fp,dos_header.e_lfanew+2,SEEK_SET);					//Locate at FileHeader
		signature=LOWORD(sig);
		fileheaderoffset=dos_header.e_lfanew+2;
	}else if(sig==IMAGE_NT_SIGNATURE)
	{
		fseek(fp,dos_header.e_lfanew+4,SEEK_SET);					//Locate at FileHeader
		signature=sig;
		fileheaderoffset=dos_header.e_lfanew+4;
	}else
	{
		fclose(fp);
		return S_FALSE;
	}

	fread(&file_header, sizeof(IMAGE_FILE_HEADER),1,fp);			//Read File Header
	
	optionalheaderoffset=fileheaderoffset+sizeof(IMAGE_FILE_HEADER);	//Read Optional Header
	fread(&optional_header,file_header.SizeOfOptionalHeader,1,fp);

	section_number=file_header.NumberOfSections;				//Read Section Table
	sectiontableoffset=optionalheaderoffset+file_header.SizeOfOptionalHeader;
	if(section_number>16)
		return S_FALSE;
	fread(section, sizeof(IMAGE_SECTION_HEADER),section_number,fp);

	image=(BYTE*)malloc(optional_header.SizeOfImage);
	fseek(fp,0,SEEK_SET);
	fread(image, 0x1000, 1, fp);								// Read Headers
	for(DWORD i=0;i<section_number;i++)
	{
		fseek(fp,section[i].PointerToRawData,SEEK_SET);			// Locate at a section
		fread(image+section[i].VirtualAddress, section[i].SizeOfRawData, 1, fp);
	}

	fclose(fp);
	fLoad=TRUE;
	return TRUE;
}

void Relocate(DWORD NewBase)
{
	DWORD Delta = (DWORD)NewBase - optional_header.ImageBase;

	PIMAGE_BASE_RELOCATION pLoc = (PIMAGE_BASE_RELOCATION)((unsigned long)image
	+ optional_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
	while((pLoc->VirtualAddress + pLoc->SizeOfBlock) != 0)
	{
		WORD *pLocData = (WORD *)((int)pLoc + sizeof(IMAGE_BASE_RELOCATION));
		int NumberOfReloc = (pLoc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION))/sizeof(WORD);
		for( int i=0 ; i < NumberOfReloc; i++)
		{
			if( (DWORD)(pLocData[i] & 0xF000) == 0x00003000)
			{
				DWORD * pAddress = (DWORD *)((unsigned long)image + pLoc->VirtualAddress + (pLocData[i] & 0x0FFF));
				*pAddress += Delta;
			}
		}
		pLoc = (PIMAGE_BASE_RELOCATION)((DWORD)pLoc + pLoc->SizeOfBlock);
	}
}

void makedllbin(char *dllfile, char *bootfile, char *binfile, DWORD base)
{
	char bootsector[512];
	FILE *boot=fopen(bootfile, "rb");
	fread(bootsector, 512, 1, boot);
	fclose(boot);
	
	printf("Relocate %s at 0x20000\n", dllfile);

	LoadImage(dllfile);
	unsigned int i;
	for(i=0;i<section_number;i++)
		if(strcmp((char*)section[i].Name,".text")==0)
			break;
	if(i==section_number)
		return;

	Relocate(base-section[i].VirtualAddress);
	printf("Linking with %s\n", bootfile);
	DWORD entrypoint = optional_header.AddressOfEntryPoint-section[i].VirtualAddress+base;
	*(DWORD*)(&bootsector[506])=entrypoint;

	DWORD r;
	HANDLE fp=CreateFile(binfile,GENERIC_READ|GENERIC_WRITE,0, NULL, OPEN_ALWAYS, 0, NULL);
	WriteFile(fp, bootsector, 512, &r, NULL);
	WriteFile(fp, image+section[i].VirtualAddress, section[i].SizeOfRawData, &r, NULL);
	CloseHandle(fp);
/*
	FILE *fp =fopen(binfile, "rwb");
	fwrite(bootsector, 512, 1, fp);
	fwrite(image+section[i].VirtualAddress, section[i].SizeOfRawData, 1, fp);
	fclose(fp);
*/
/*	
	char jmp = 0xe9;
	fwrite(&jmp, 1,1,fp);
	entrypoint=entrypoint-section[i].VirtualAddress+3;
	fwrite(&entrypoint, 4,1,fp);
	fseek(fp, 8, SEEK_SET);
*/

	printf("The Bootable Image at %s\n", binfile);

	return;
}


int main( int argc, char *argv[ ])
{
	if(argc<4)
		makedllbin("minios.dll", "bootsector", "minios.vhd", 0x20000);
	else
		makedllbin(argv[1], argv[2], argv[3], 0x20000);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -