微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

通过上面这个函数,就可以打开安装信息文件,然后判断是否自动安装系统,如果是就进入自动安装过程。如果不是自动安装,就进入下一步的人工选项。

原文地址:https://www.jb51.cc/react/308479.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐