加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(60)

发布时间:2020-12-15 05:01:19 所属栏目:百科 来源:网络整理
导读:在拷贝文件到磁盘之前,需要把压缩包的文件解压,然后才能拷贝文件到安装目录里,它的代码如下: #001 static PAGE_NUMBER #002 PrepareCopyPage(PINPUT_RECORD Ir) #003 { #004 HINF InfHandle; #005 WCHAR PathBuffer[MAX_PATH]; #006 INFCONTEXT Cabinets

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

#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 }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读