reactos操作系统实现(60)

在拷贝文件到磁盘之前,需要把压缩包的文件解压,然后才能拷贝文件到安装目录里,它的代码如下:

#001 static PAGE_NUMBER

#002 PreparecopyPage(PINPUT_RECORD Ir)

#003 {

#004 HINF InfHandle;

#005 WCHAR PathBuffer[MAX_PATH];

#006 INFCONTEXT CabinetsContext;

#007 ULONG InfFileSize;

#008 PWCHAR keyvalue;

#009 UINT ErrorLine;

#010 PVOID InfFileData;

#011

#012 MUIdisplayPage(PREPARE_copY_PAGE);

#013

创建一个文件队列。

#014 /* Create the file queue */

#015 SetupFileQueue = SetupOpenFileQueue();

#016 if (SetupFileQueue == NULL)

#017 {

#018 MUIdisplayError(ERROR_copY_QUEUE,Ir,POPUP_WAIT_ENTER);

#019 return(QUIT_PAGE);

#020 }

#021

添加公共文件到安装INF文件,并且创建前面选择的目录,然后还需要创建目录下面所有的子目录。

#022 if (!PreparecopyPageInfFile(SetupInf,NULL,Ir))

#023 {

#024 return QUIT_PAGE;

#025 }

#026

查找Cabinets段的配置。

#027 /* Search for the 'Cabinets' section */

#028 if (!SetupFindFirstLineW (SetupInf,L"Cabinets",&CabinetsContext))

#029 {

#030 return FILE_copY_PAGE;

#031 }

#032

枚举目录里所有Cabinets段的文件

#033 /*

#034 * Enumerate the directory values in the 'Cabinets'

#035 * section and parse their inf files.

#036 */

#037 do

#038 {

#039 if (!INF_GetData (&CabinetsContext,&keyvalue))

#040 break;

#041

#042 wcscpy(PathBuffer,SourcePath.Buffer);

#043 wcscat(PathBuffer,L"//");

#044 wcscat(PathBuffer,keyvalue);

#045

#046 #ifdef __REACTOS__

#047 Cabinetinitialize();

#048 CabinetSetEventHandlers(NULL,NULL);

#049 CabinetSetCabinetName(PathBuffer);

#050

#051 if (Cabinetopen() == CAB_STATUS_SUCCESS)

#052 {

#053 DPRINT("Cabinet %s/n",CabinetGetCabinetName());

#054

#055 InfFileData = CabinetGetCabinetReservedArea(&InfFileSize);

#056 if (InfFileData == NULL)

#057 {

#058 MUIdisplayError(ERROR_CABINET_SCRIPT,POPUP_WAIT_ENTER);

#059 return QUIT_PAGE;

#060 }

#061 }

#062 else

#063 {

#064 DPRINT("Cannot open cabinet: %s./n",CabinetGetCabinetName());

#065 MUIdisplayError(ERROR_CABINET_MISSING,POPUP_WAIT_ENTER);

#066 return QUIT_PAGE;

#067 }

#068

#069 InfHandle = INF_OpenBufferedFileA((CHAR*) InfFileData,

#070 InfFileSize,

#071 (const CHAR*) NULL,

#072 INF_STYLE_WIN4,

#073 &ErrorLine);

#074

#075 if (InfHandle == INVALID_HANDLE_VALUE)

#076 {

#077 MUIdisplayError(ERROR_INVALID_CABINET_INF,POPUP_WAIT_ENTER);

#078 return QUIT_PAGE;

#079 }

#080

#081 CabinetCleanup();

#082

把需要拷贝的文件添加到安装列表。

#083 if (!PreparecopyPageInfFile(InfHandle,keyvalue,Ir))

#084 {

#085 return QUIT_PAGE;

#086 }

#087 #endif

#088 } while (SetupFindNextLine (&CabinetsContext,&CabinetsContext));

#089

#090 return FILE_copY_PAGE;

#091 }

上面这个函数,实现了安装文件列表的建立,也就是根据不同的机器,不同的选择条件来选择不同的文件安装。

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...