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

📄 cdrom.cpp

📁 XOSL 多操作系统管理工具 源代码 多系统引导工具
💻 CPP
字号:

#include "cdrom.h"
#include <fs.h>
#include <mem.h>
    
class CExtDriveParams {
public:
	unsigned short BufferSize;
	unsigned short InfoFlags;
	unsigned long CylinderCount;
	unsigned long HeadCount;
	unsigned long SectorsPerTrack;
	unsigned long TotalSectorCount[2];
	unsigned short BytesPerSector;
	unsigned long EddConfigParams;
	unsigned short DevicePathSignature;
	unsigned char DevicePathInfoLength;
	unsigned char Reserved1[3];
	unsigned char HostBusName[4]; // "ISA" or "PCI"
	unsigned char InterfaceName[8]; // e.g. "ATAPI"
	unsigned char InterfacePath[8];
	unsigned char DevicePath[8];
	unsigned char Reserved2;
	unsigned char Checksum;
};

void printf(const char *,...);

const unsigned long cBaseMemSizeAddr = 0x00000413;
const int SIZE_OF_EDD30 = 8;  // my EDD3.0 and ATAPI driver need 6K mem
const char *cEdd30FileName = "EDD30   BIN";

	enum TBootExtFunc {
		funcInstInt13 = 0, funcUninstInt13, funcInitAtapi, 
		funcSwapDrives, funcSetIoPorts
	};


CCdRom::CCdRom(CFileSystem &FileSystemToUse):
	FileSystem(FileSystemToUse),
	BaseMemSize(*(unsigned short *)cBaseMemSizeAddr),
	BootExtensionAddr(0)
{
}

CCdRom::~CCdRom()
{
}

int CCdRom::Install(short IdePort1, short IdePort2)
{
	if (!BootExtensionAddr) {
		printf("AllocConvMem()\n");
		BootExtensionAddr = AllocConvMem(SIZE_OF_EDD30) << 16;
		printf("LoadBootExtension()\n");
		if (LoadBootExtension() == 0) {
			BootExtensionAddr = 0;
			return -1;
		}
		printf("SetIoPorts\n");
		CallBootExtension(BootExtensionAddr,funcSetIoPorts,IdePort1,IdePort2);
		printf("InitAtapi\n");
		CallBootExtension(BootExtensionAddr,funcInitAtapi,0,0);
		printf("InstInt13\n");
		CallBootExtension(BootExtensionAddr,funcInstInt13,0,0);
	}
	return 0;
}

void CCdRom::Uninstall()
{
	if (BootExtensionAddr) {
		CallBootExtension(BootExtensionAddr,funcUninstInt13,0,0);
		FreeConvMem(SIZE_OF_EDD30);
		BootExtensionAddr = 0;
	}
}


bool CCdRom::IsDriveCdRom(int Drive)
{
	if (!BootExtensionAddr) {
		return false;
	}
	CExtDriveParams ExtDriveParams;
	ExtDriveParams.BufferSize = sizeof(CExtDriveParams);
	if (GetExtDriveParams(Drive,ExtDriveParams) == -1) {
		return false;
	}

	if (ExtDriveParams.DevicePathSignature != 0xbedd) {
		return false;
	}
	if (ExtDriveParams.DevicePathInfoLength != 36) {
		return false;
	}
	
	if (memcmp(ExtDriveParams.InterfaceName,"ATAPI",5) != 0) {
		return false;
	}
	return true;
}

unsigned long CCdRom::AllocConvMem(int KbCount)
{
	BaseMemSize -= KbCount;
	return BaseMemSize << 6;
}

void CCdRom::FreeConvMem(int KbCount)
{
	BaseMemSize += KbCount;
}

int CCdRom::LoadBootExtension()
{
	// TODO: check if this is performed successfully!
	void *DestPtr = (void *)BootExtensionAddr;
	return FileSystem.ReadFile(cEdd30FileName,DestPtr);
}

⌨️ 快捷键说明

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