Windows NT引导过程源代码分析(7)

2019-08-30 13:20

//检测标志值判断是否应该输出文件名而不是单独的原点 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;


Windows NT引导过程源代码分析(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:重庆一中高2009级(下)09年文科数学2月月考试题 doc

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: