//检测标志值判断是否应该输出文件名而不是单独的原点 if ((strstr(FileName,\)!=NULL) ||
(strstr(FileName,\)!=NULL)) { BlOutputDots=FALSE; }
FileName=strstr(BlLoaderBlock->LoadOptions,\); if (FileName) {
for (i=0; i } HalFileName[i]=FileName[4+i]; } } HalFileName[sizeof(HalFileName)-1]='\\0'; FileName=strstr(BlLoaderBlock->LoadOptions,\); if (FileName) { for (i=0; i } KernelFileName[i]=FileName[7+i]; } } KernelFileName[sizeof(KernelFileName)-1]='\\0'; } else { BlLoaderBlock->LoadOptions = NULL; } // 获取加载设备的名称以及读取的权限. LoadDevice = BlGetArgumentValue(Argc, Argv, \); if (LoadDevice == NULL) { Status = ENODEV; BlFatalError(LOAD_HW_FW_CFG_CLASS, DIAG_BL_FW_GET_BOOT_DEVICE, LOAD_HW_FW_CFG_ACT); gotoLoadFailed; } Status = ArcOpen(LoadDevice, ArcOpenReadOnly, &LoadDeviceId); if (Status != ESUCCESS) { BlFatalError(LOAD_HW_DISK_CLASS, DIAG_BL_OPEN_BOOT_DEVICE, LOAD_HW_DISK_ACT); gotoLoadFailed; } // 获取系统设备的名称以及读取的权限. SystemDevice = BlGetArgumentValue(Argc, Argv, \); if (SystemDevice == NULL) { Status = ENODEV; BlFatalError(LOAD_HW_FW_CFG_CLASS, DIAG_BL_FW_GET_SYSTEM_DEVICE, LOAD_HW_FW_CFG_ACT); gotoLoadFailed; } Status = ArcOpen(SystemDevice, ArcOpenReadOnly, &SystemDeviceId); if (Status != ESUCCESS) { BlFatalError(LOAD_HW_FW_CFG_CLASS, DIAG_BL_FW_OPEN_SYSTEM_DEVICE, LOAD_HW_FW_CFG_ACT); gotoLoadFailed; } // 初始化调试系统 BlLogInitialize(SystemDeviceId); //显示系统提示符,给用户更多的准备时间 BlStartConfigPrompt(); #ifdefined(_PPC_) Status = BlPpcInitialize(); if (Status != ESUCCESS) { gotoLoadFailed; } #endif// defined(_PPC_) // 获取系统根目录的路径名称. LoadFileName = BlGetArgumentValue(Argc, Argv, \); if (LoadFileName == NULL) { Status = ENOENT; BlFatalError(LOAD_HW_FW_CFG_CLASS, DIAG_BL_FW_GET_BOOT_DEVICE, LOAD_HW_FW_CFG_ACT); gotoLoadFailed; } // 生成SYSTEM32目录名称 strcpy(BootDirectoryPath, LoadFileName); strcat(BootDirectoryPath, \); // 生成ntoskrnl.exe的全路径 // \strcpy(KernelDirectoryPath, BootDirectoryPath); strcat(KernelDirectoryPath, KernelFileName); // 加载内核模块映像文件. BlOutputLoadMessage(LoadDevice, KernelDirectoryPath); Status = BlLoadImage(LoadDeviceId, LoaderSystemCode, KernelDirectoryPath, TARGET_IMAGE, &SystemBase); if (Status != ESUCCESS) { BlFatalError(LOAD_SW_MIS_FILE_CLASS, DIAG_BL_LOAD_SYSTEM_IMAGE, LOAD_SW_FILE_REINST_ACT); gotoLoadFailed; } // 无论文件系统是什么,都需要与引导驱动一起加载 FsInfo = BlGetFsInfo(LoadDeviceId); if (FsInfo != NULL) { BootFileSystem = FsInfo->DriverName; } else { BlFatalError(LOAD_SW_MIS_FILE_CLASS, DIAG_BL_LOAD_SYSTEM_IMAGE, LOAD_SW_FILE_REINST_ACT); gotoLoadFailed; } // 获取OS loader文件的路径名称,并除去目录名称,用来加载HAL.DLL FileName = BlGetArgumentValue(Argc, Argv, \); if (FileName == NULL) { Status = ENOENT; BlFatalError(LOAD_HW_FW_CFG_CLASS, DIAG_BL_FIND_HAL_IMAGE, LOAD_HW_FW_CFG_ACT); gotoLoadFailed; } DirectoryEnd = strrchr(FileName, '\\\\'); FileName = strchr(FileName, '\\\\'); HalDirectoryPath[0] = 0; if (DirectoryEnd != NULL) { Limit = (ULONG)DirectoryEnd - (ULONG)FileName + 1; for (Index = 0; Index HalDirectoryPath[Index] = 0; } // 生成完整的路径名称并将HAL加载入系统内存中去. strcpy(&DllName[0], &HalDirectoryPath[0]); strcat(&DllName[0], HalFileName); BlOutputLoadMessage(SystemDevice, &DllName[0]); Status = BlLoadImage(SystemDeviceId, LoaderHalCode, &DllName[0], TARGET_IMAGE, &HalBase); if (Status != ESUCCESS) { BlFatalError(LOAD_SW_MIS_FILE_CLASS, DIAG_BL_LOAD_HAL_IMAGE, LOAD_SW_FILE_REINST_ACT); gotoLoadFailed; } // 为ntoskrnl.exe生成数据表入口. Status = BlAllocateDataTableEntry(\, KernelDirectoryPath, SystemBase, &SystemDataTableEntry); if (Status != ESUCCESS) { BlFatalError(LOAD_SW_INT_ERR_CLASS, DIAG_BL_LOAD_SYSTEM_IMAGE, LOAD_SW_INT_ERR_ACT); gotoLoadFailed; } // 为hal.dll生成数据表入口. Status = BlAllocateDataTableEntry(\, &DllName[0], HalBase, &HalDataTableEntry); if (Status != ESUCCESS) { BlFatalError(LOAD_SW_INT_ERR_CLASS, DIAG_BL_LOAD_HAL_IMAGE, LOAD_SW_INT_ERR_ACT); gotoLoadFailed; } #ifdefined(_ALPHA_) Status = BlLoadPal(SystemDeviceId, LoaderSystemCode, &HalDirectoryPath[0], TARGET_IMAGE, &BlLoaderBlock->u.Alpha.PalBaseAddress, SystemDevice); if (Status != ESUCCESS) { BlFatalError(LOAD_SW_MIS_FILE_CLASS, DIAG_BL_LOAD_SYSTEM_DLLS, LOAD_SW_FILE_REINST_ACT); gotoLoadFailed; } #endif// _ALPHA_ // 扫描系统映像的导入表以及加载相关的dll Status = BlScanImportDescriptorTable(LoadDeviceId, LoadDevice, &BootDirectoryPath[0], SystemDataTableEntry); if (Status != ESUCCESS) { BlFatalError(LOAD_SW_INT_ERR_CLASS, DIAG_BL_LOAD_SYSTEM_DLLS, LOAD_SW_INT_ERR_ACT); gotoLoadFailed; } // 扫描HAL.dll的导入表以及加载相关的dll Status = BlScanImportDescriptorTable(SystemDeviceId, SystemDevice, &HalDirectoryPath[0], HalDataTableEntry); if (Status != ESUCCESS) { BlFatalError(LOAD_SW_INT_ERR_CLASS, DIAG_BL_LOAD_HAL_DLLS, LOAD_SW_INT_ERR_ACT); gotoLoadFailed; } // 重定位系统入口点并设置系统指定的信息 NtHeaders = RtlImageNtHeader(SystemBase); SystemEntry = (PTRANSFER_ROUTINE)((ULONG)SystemBase + NtHeaders->OptionalHeader.AddressOfEntryPoint); #ifdefMIPS BlLoaderBlock->u.Mips.GpBase = (ULONG)SystemBase + NtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].VirtualAddress; #endif #ifdefined(_ALPHA_) BlLoaderBlock->u.Alpha.GpBase = (ULONG)SystemBase + NtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].VirtualAddress; #endif // 复制所有的设备驱动的目录路径 strcpy(&DriverDirectoryPath[0], &BootDirectoryPath[0]); strcat(&DriverDirectoryPath[0], \); // 为NLS数据分配结构体. 这将通过BlLoadAndScanSystemHive函数填充并加载. BlLoaderBlock->NlsData = BlAllocateHeap(sizeof(NLS_DATA_BLOCK)); if (BlLoaderBlock->NlsData == NULL) { Status = ENOMEM; BlFatalError(LOAD_HW_MEM_CLASS, DIAG_BL_LOAD_SYSTEM_HIVE, LOAD_HW_MEM_ACT); gotoLoadFailed; } // 加载注册表的SYSTEM储巢 Status = BlLoadAndScanSystemHive(LoadDeviceId, LoadDevice, LoadFileName, BootFileSystem, BadFileName); if (Status != ESUCCESS) { if (BlRebootSystem) { Status = ESUCCESS; } else { BlBadFileMessage(BadFileName); } gotoLoadFailed; } // 生成符合ARC命名规范的引导设备名称以及NT路径名. Status = BlGenerateDeviceNames(LoadDevice, &DeviceName[0], &DevicePrefix[0]); if (Status != ESUCCESS) { BlFatalError(LOAD_HW_FW_CFG_CLASS, DIAG_BL_ARC_BOOT_DEV_NAME, LOAD_HW_FW_CFG_ACT); gotoLoadFailed; } FileSize = strlen(&DeviceName[0]) + 1; FileName = (PCHAR)BlAllocateHeap(FileSize); strcpy(FileName, &DeviceName[0]); BlLoaderBlock->ArcBootDeviceName = FileName; FileSize = strlen(LoadFileName) + 2; FileName = (PCHAR)BlAllocateHeap( FileSize); strcpy(FileName, LoadFileName); strcat(FileName, \); BlLoaderBlock->NtBootPathName = FileName; // 生成符合ARC命名规范的HAL设备名称以及NT路径名. #ifdefi386 strcpy(&DeviceName[0], BlGetArgumentValue(Argc, Argv, \)); #else Status = BlGenerateDeviceNames(SystemDevice, &DeviceName[0], &DevicePrefix[0]); if (Status != ESUCCESS) { BlFatalError(LOAD_HW_FW_CFG_CLASS, DIAG_BL_ARC_BOOT_DEV_NAME, LOAD_HW_FW_CFG_ACT); gotoLoadFailed; } #endif//i386 FileSize = strlen(&DeviceName[0]) + 1; FileName = (PCHAR)BlAllocateHeap(FileSize); strcpy(FileName, &DeviceName[0]); BlLoaderBlock->ArcHalDeviceName = FileName;