static long multiboot_LoadExtraDrivers(FileLoadDrivers_t FileLoadDrivers_p) { char extensionsSpec[1024]; int ramdiskUnit; for(ramdiskUnit = 0; ramdiskUnit < gMI->mi_mods_count; ++ramdiskUnit) { int partCount; // unused BVRef ramdiskChain = diskScanBootVolumes(0x100 + ramdiskUnit, &partCount); if(ramdiskChain == NULL) { verbose("Ramdisk contains no partitions\n"); continue; } for(; ramdiskChain != NULL; ramdiskChain = ramdiskChain->next) { sprintf(extensionsSpec, "rd(%d,%d)/Extra/", ramdiskUnit, ramdiskChain->part_no); struct dirstuff *extradir = opendir(extensionsSpec); closedir(extradir); if(extradir != NULL) { int ret = FileLoadDrivers_p(extensionsSpec, 0 /* this is a kext root dir, not a kext with plugins */); if(ret != 0) { verbose("FileLoadDrivers failed on a ramdisk\n"); return ret; } } } } return 0; }
void scanBootVolumes( int biosdev, int * count ) { BVRef bvr = 0; bvr = diskScanBootVolumes(biosdev, count); if (bvr == NULL) { bvr = nbpScanBootVolumes(biosdev, count); if (bvr != NULL) { gBootFileType = kNetworkDeviceType; } } else { gBootFileType = kBlockDeviceType; } }
int mountRAMDisk(const char * param) { int fh = 0, ramDiskSize; int error = 0; // Get file handle for ramdisk file. fh = open(param, 0); if (fh != -1) { printf("\nreading ramdisk image: %s", param); ramDiskSize = file_size(fh); if (ramDiskSize > 0) { // Unmount previously mounted image if exists. umountRAMDisk(); // Read new ramdisk image contents into PREBOOT_DATA area. if (read(fh, (char *)PREBOOT_DATA, ramDiskSize) != ramDiskSize) error = -1; } else error = -1; close(fh); } else error = -1; if (error == 0) { // Save filename in gRAMDiskFile to display information. strcpy(gRAMDiskFile, param); // Set gMI as well for the multiboot ramdisk driver hook. gMI = gRAMDiskMI = malloc(sizeof(multiboot_info)); struct multiboot_module * ramdisk_module = malloc(sizeof(multiboot_module)); // Fill in multiboot info and module structures. if (gRAMDiskMI != NULL && ramdisk_module != NULL) { gRAMDiskMI->mi_mods_count = 1; gRAMDiskMI->mi_mods_addr = (uint32_t)ramdisk_module; ramdisk_module->mm_mod_start = PREBOOT_DATA; ramdisk_module->mm_mod_end = PREBOOT_DATA + ramDiskSize; // Set ramdisk driver hooks. p_get_ramdisk_info = &multiboot_get_ramdisk_info; p_ramdiskReadBytes = &multibootRamdiskReadBytes; int partCount; // unused // Save bvr of the mounted image. gRAMDiskVolume = diskScanBootVolumes(0x100, &partCount); if(gRAMDiskVolume == NULL) { umountRAMDisk(); printf("\nRamdisk contains no partitions."); } else { char dirSpec[128]; // Reading ramdisk configuration. strcpy(dirSpec, RAMDISKCONFIG_FILENAME); if (loadConfigFile(dirSpec, &bootInfo->ramdiskConfig) == 0) { getBoolForKey("BTAlias", &gRAMDiskBTAliased, &bootInfo->ramdiskConfig); } else { printf("\nno ramdisk config...\n"); } printf("\nmounting: done"); } } } return error; }