reactos操作系统实现(54)
从函数RunUSetup的循环处理里,可以看到第一个应处理,就是启动页面,也就是调用函数SetupStartPage,它的代码如下: #001 /* #002 * Start page #003 * RETURNS #004 * Number of the next page. #005 */ #006 static PAGE_NUMBER #007 SetupStartPage(PINPUT_RECORD Ir) #008 { #009 SYSTEM_DEVICE_INFORMATION Sdi; #010 NTSTATUS Status; #011 WCHAR FileNameBuffer[MAX_PATH]; #012 INFCONTEXT Context; #013 PWCHAR Value; #014 UINT ErrorLine; #015 ULONG ReturnSize; #016 PGENERIC_LIST_ENTRY ListEntry; #017
在显示器上显示等待字符串。 #018 CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT)); #019 #020
检查是否有一个硬盘可以使用。 #021 /* Check whether a harddisk is available */ #022 Status = NtQuerySystemInformation (SystemDeviceInformation, #023 &Sdi, #024 sizeof(SYSTEM_DEVICE_INFORMATION), #025 &ReturnSize); #026
如果没有硬盘可以使用,就返回出错。 #027 if (!NT_SUCCESS (Status)) #028 { #029 CONSOLE_PrintTextXY(6,15,"NtQuerySystemInformation() failed (Status 0x%08lx)",Status); #030 MUIDisplayError(ERROR_DRIVE_INFORMATION,Ir,POPUP_WAIT_ENTER); #031 return QUIT_PAGE; #032 } #033 #034 if (Sdi.NumberOfDisks == 0) #035 { #036 MUIDisplayError(ERROR_NO_HDD,POPUP_WAIT_ENTER); #037 return QUIT_PAGE; #038 } #039
获取源安装目录和根目录路径。 #040 /* Get the source path and source root path */ #041 Status = GetSourcePaths(&SourcePath, #042 &SourceRootPath, #043 &SourceRootDir); #044 #045 if (!NT_SUCCESS(Status)) #046 { #047 CONSOLE_PrintTextXY(6,"GetSourcePaths() failed (Status 0x%08lx)",Status); #048 MUIDisplayError(ERROR_NO_SOURCE_DRIVE,POPUP_WAIT_ENTER); #049 return QUIT_PAGE; #050 } #051 #if 0 #052 else #053 { #054 CONSOLE_PrintTextXY(6,"SourcePath: '%wZ'",&SourcePath); #055 CONSOLE_PrintTextXY(6,16,"SourceRootPath: '%wZ'",&SourceRootPath); #056 CONSOLE_PrintTextXY(6,17,"SourceRootDir: '%wZ'",&SourceRootDir); #057 } #058 #endif #059
准备txtsetup.sif文件路径,以便加载它到内存。txtsetup.sif是一个安装信息文件(sif),主要用于 Reactos 的文本安装模式。 #060 /* Load txtsetup.sif from install media. */ #061 wcscpy(FileNameBuffer,SourcePath.Buffer); #062 wcscat(FileNameBuffer,L"//txtsetup.sif"); #063 #064 SetupInf = SetupOpenInfFileW(FileNameBuffer, #065 NULL, #066 INF_STYLE_WIN4, #067 &ErrorLine); #068 #069 if (SetupInf == INVALID_HANDLE_VALUE) #070 { #071 MUIDisplayError(ERROR_LOAD_TXTSETUPSIF,POPUP_WAIT_ENTER); #072 return QUIT_PAGE; #073 } #074
查找安装信息文件的版本信息。 #075 /* Open 'Version' section */ #076 if (!SetupFindFirstLineW (SetupInf,L"Version",L"Signature",&Context)) #077 { #078 MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF,POPUP_WAIT_ENTER); #079 return QUIT_PAGE; #080 } #081 #082 /* Get pointer 'Signature' key */ #083 if (!INF_GetData (&Context,NULL,&Value)) #084 { #085 MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF,POPUP_WAIT_ENTER); #086 return QUIT_PAGE; #087 } #088
检查版本标志是否为ReactOS。 #089 /* Check 'Signature' string */ #090 if (_wcsicmp(Value,L"$ReactOS$") != 0) #091 { #092 MUIDisplayError(ERROR_SIGNATURE_TXTSETUPSIF,POPUP_WAIT_ENTER); #093 return QUIT_PAGE; #094 } #095
启动即插即用事件处理线程。 #096 /* Start PnP thread */ #097 if (hPnpThread != INVALID_HANDLE_VALUE) #098 { #099 NtResumeThread(hPnpThread,NULL); #100 hPnpThread = INVALID_HANDLE_VALUE; #101 } #102
检查是否需要自动安装,也就是不需要人为地关注的安装。 #103 CheckUnattendedSetup(); #104
如果自动安装启用,就进行系统默认的配置安装,否则就需要人工地选择后面的安装功能。 #105 if (IsUnattendedSetup) #106 { #107 //TODO #108 //read options from inf #109 ComputerList = CreateComputerTypeList(SetupInf); #110 DisplayList = CreateDisplayDriverList(SetupInf); #111 KeyboardList = CreateKeyboardDriverList(SetupInf); #112 LayoutList = CreateKeyboardLayoutList(SetupInf,DefaultKBLayout); #113 LanguageList = CreateLanguageList(SetupInf,DefaultLanguage); #114 #115 /* new part */ #116 #117 wcscpy(SelectedLanguageId,LocaleID); #118 #119 #120 /* first we hack LanguageList */ #121 ListEntry = GetFirstListEntry(LanguageList); #122 #123 while (ListEntry != NULL) #124 { #125 if (!wcscmp(LocaleID,GetListEntryUserData(ListEntry))) #126 { #127 DPRINT("found %S in LanguageList/n",GetListEntryUserData(ListEntry)); #128 SetCurrentListEntry(LanguageList,ListEntry); #129 break; #130 } #131 #132 ListEntry = GetNextListEntry(ListEntry); #133 } #134 /* now LayoutList */ #135 ListEntry = GetFirstListEntry(LayoutList); #136 #137 while (ListEntry != NULL) #138 { #139 if (!wcscmp(LocaleID,GetListEntryUserData(ListEntry))) #140 { #141 DPRINT("found %S in LayoutList/n",GetListEntryUserData(ListEntry)); #142 SetCurrentListEntry(LayoutList,ListEntry); #143 break; #144 } #145 #146 ListEntry = GetNextListEntry(ListEntry); #147 } #148 SetConsoleCodePage(); #149 #150 return INSTALL_INTRO_PAGE; #151 } #152
在这里返回人工安装的下一个功能页面,就是语言选择。 #153 return LANGUAGE_PAGE; #154 } #155
通过上面这个函数,就可以打开安装信息文件,然后判断是否自动安装系统,如果是就进入自动安装过程。如果不是自动安装,就进入下一步的人工选项。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |