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

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 }

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

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

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

相关推荐