INF安装信息文件④

㈥、[DestinationDirs] 节:指定硬盘上复制、删除或重命名节文件的位置(例如 \Windows 或 Windows\System)。

 

  .INF 文件通过 [DestinationDirs] 节来指定操作的目标路径,语法如下:

 

 

[DestinationDirs]
file-list-section =ldid[, subdir ]
DefaultDestDir=ldid[, subdir ]

  [DestinationDirs] 节定义了 [file-list-section] 节中指定的操作(可以是 CopyFilesRenFilesDelFiles 节)的目标目录。DefaultDestDir命令可以为 .INF 文件中的任何没有明确在 [DestinationDirs] 节中命名的CopyFilesRenFilesDelFiles节指定默认目标文件夹。

 

 


  在 .INF 文件中,使用逻辑磁盘标识符 (LDID) 来表示路径,如下表:

 

 

逻辑磁盘标识符 (LDID)

-1 绝对路径

00 Null LDID - 可用于创建新的 LDID
01 Source Drive:\pathname (inf文件所在目录的路径)
10 Windows 文件夹(等价于%windir%目录 )
11 System 文件夹 (98系统是%SystemRoot%\system,2000系统是%SystemRoot%\system32
12 IOSubsys 文件夹 (98系统是%SystemRoot%\system\Insubsys,2000系统%SystemRoot%\system32\Drivers
13 Command 文件夹
17 Inf 文件夹 (%SystemRoot%\inf目录
18 Help 文件夹 (帮助目录)
20 Fonts (字体目录)
21 Viewers (查看器目录)
22 VMM32
23 Color 文件夹 (颜色ICM)
24 包含 Windows 文件夹的驱动器根目录

25 共享目录
28 Host Winboot
30 启动盘(引导驱动器)的根文件夹
31 虚拟启动盘的主驱动器根文件夹

51 假脱机目录

52 假脱机驱动程序目录

53 用户配置文件目录

54 Windows 2000 引导目录

55 打印处理器目录

16406 All Users\Start\Menu

16407 All Users\Start\Menu\Program

16408 All Users\Start\Menu\Program\Startup

16409 All Users\Start\Desktop

16415 All Users\Start\Favorites

16419 All Users\Start\Application Data

16422 Program Files

16427 Program Files\Common

16429 All Users\Templates

16430 All Users\Documents

 

 

  如示例01中,这行语句“VM.XPTWAIN.CopyFiles = 10, twain_32\VM301b”表明VM.XPTWAIN.CopyFiles这个文件列表中文件的目标路径是%windir%\system32\twain_32\VM301b,其中 10 代表Windows所在的文件夹,也就是说VM.XPTWAIN.CopyFiles这个文件列表(请看示例03)中文件VM31bTXP.DS在安装驱动的时候将会被复制到%windir%\system32\twain_32\VM301b文件夹。而这行“VM.Config.CopyFiles = 10, inf”,意思是config.set这个文件将会被复制到 10 下的inf文件夹,也就是%windir%\inf文件夹中。当然,他也可以写成“VM.Config.CopyFiles = 17”,效果是一样的。 

 

 

;示例03 寒夜孤星 usbvm31b.inf华尔特F18型摄像头驱动

。。。。。。

[VM.XPTWAIN.CopyFiles]
VM31bTXP.DS

[VM.Config.CopyFiles]
config.set

。。。。。。

 

 

 

㈦、[Strings] 节:定义并列出上面所使用的可本地化字符串。


  如果某个特定的字符串会在 .INF 文件中频繁地出现,那么在此节中为它们定义一个字符串变量将会是个好选择。 

  尽管 [Strings] 节一般被放置在 .INF 文件的末尾,字符串宏可在 .INF 文件任何地方使用,安装引擎解释、展开字符串宏为给定的长字符串并做进一步处理。字符串宏在使用时需用百分号(%)括起。

[Strings] 节内语句的语法为:

strings-key=value
其中strings-key为由字母或数字等可打印字符组成的宏名。
Value为被双引号括起的长字符串,字符串可由字母、数字或其他可打印字符(意思是可以使用汉字哦)组成。

 

例如示例01中,在 [Strings] 节中定义了 HwMfg="VM" 。而在 [Manufacturer] 节中便使用了%HwMfg%=VM,NT 。同时,HwMfg变量被用%括了起来。

 

㈦、[FileCopy/Delete/RenameSection(s)]  节:列出要复制、删除或重命名的文件。节的名字是CopyFiles,DelFiles,RenFiles。

 

[CopyFiles]节,复制文件。

 

  .INF 文件的[CopyFiles]节有一个唯一的名字,并从[DDInstall]节的CopyFiles指令引用它。该节中的每个项采用如下形式:

destination – filename[,source- filename,temp-filename,flag]

  这里的destiantion-filename是最重要复制的目标文件名。如果源文件名不相同,必须规定source – filenameTemp-filename值不再适用(虽然 Windows 98仍然要求),它在系统再次引导之前规定新文件的临时文件名。对于Windows 2000等,忽略此值。

  Falg 值规定对新目标文件的处理,其描述见下表 CopyFiles标志定义 。可以对falg值中的各个为进行“或”运算,以使多个操作起作用。几种操作是互斥的(例如,WARN_IF_SKIP和NOSKIP),有疑问时应当查阅有关文档。

  因为[CopyFiles]节的项的语法没有包含一个可选项来规定源文件的磁盘或路径,必须使用其他 .INF[SourceDisksNames][SourceDisksFiles]。然而[CopyFiles]节中各项复制的文件由另一个.INF[DestiantionDirs]节指定。

CopyFiles标志定义

 位置 符号名称 说明
 0x0400 COPYFLG_REPLACEONLY 如果源文件存在则复制
 0x0800 COPYFLG_NODECOMP 不解压缩复制
 0x0008 COPYFLG_FORCE_FILE_IN_USE 对源文件执行延迟重命名,强制重新引导
 0x0010 COPYFLG_NO_OVERWRITE 不替换已有源文件
 0x1000 COPYFLG_REPLACE_BOOT_FILE 文件是系统装入程序的一部分,强制重新引导
 0x2000 COPYFLG_NOPRUNE 强制复制操作,即使安装者认为不必要也要复制
 0x0020 COPYFLG_NO_VERSION_DIALOG 不要覆盖较新的文件(如果安装包被数字签名则被忽略)
 0x0004 COPYFLG_NOVERSIONCHECK 总是覆盖目标文件
 0x0040 COPYFLG_OVERWRITE_OLDER_ONLY 覆盖较旧的目标文件
 0x0001 COPYFLG_WARN_IF_SKIP 用户跳过文件时发出警告
 0x0002 COPYFLG_NOSKIP 不允许用户跳过文件

 

 

[DelFiles]节,删除文件。

[RenFiles]节,重命令文件。


㈧、[RegistryUpdateSection(s)] 节:指定在注册表中添加或删除的项目。节的名字是AddReg,DelReg。

 

[addreg]节,指定新的键和值。

 

  一个INF文件的[AddReg]节被唯一命名,并从[DDInstall]节中的AddReg指令引用它。此节的目的是提供增加或者修改目标系统注册表中的项目。本节中每个项目采取如下形式:

 reg-root[,subkey,value- name,flags ,value]

  这里的reg- root是注册表库(hive)之一的缩写。

 

  说明
 HKCR HKEY_CLASSES_ROOT
 HKCU HKEY_CURRENT_USER
 HKLM HKEY_LOCAL_MACHINE
 HKU HKEY_USERS
 HKR 将被安装的设备的硬件子键

 

  值表示要被修改的注册表库。Subbkey值表示库底下的键名,在层次结构中子键用反斜线(\)字符隔开。例如,software\W2KdriverBook\Driver\SetingHKCU或者HKLM库的一个有效子键。

  Value-name指定要增加或修改的注册表值。每个注册表键包含一个或多个值,保存不同类型的数据。注册表编辑器(Registy Editor)在右边面板中列出子键的值。值名和值数据同时在该面板中出现,左边面板只列出子键。

  Flags指定数据保存的类型,flages可能的位置见下表所列:

 AddReg Flags 定义

 位值 符号名 说明
 0x00000 FLG_ADDREG_TYPE_SZ 空结束字符串
 0x00001 FLG_ADDREG_BINVALUETYPE 二进制数据
 0x00002 FLG_ADDREG_NOCLOBBER 不替换已有值
 0x00004 FLG_ADDREG_DELVALUE 删除子键或值名
 0x00010 FLG_ADDREG_KEYONLY 建立子键,忽略值
 0x00020 FLG_ADDREG_OVERWRITEONLY 如果值存在,则替换他,否则什么也不做
 0x10000 FLG_ADDREG_TYPE_MULTI_SZ REG__MULTI_SZ数据(数组)
 0x00008 FLG_ADDREG_APPEND 添加到已有的REG__MULTI_SZ数组
 0x20000 FLG_ADDREG_TYPE_EXPAND_SZ REG_EXPAND_SZ数据
 0x10001 FLG_ADDREG_TYPE_DWORD DWORD数据
 0x20001 FLG_ADDREG_TYPE_NONE REG_NONE数据

 

[Delreg]节,删除的键和值。

<think>我们正在实现一个校园地图导航系统,主要功能包括:1.地点和道路信息存储(使用文本文件)2.图结构构建(使用邻接矩阵)3.最短路径算法(我们选择Floyd算法,因为它可以求出任意两点间的最短路径,适合用邻接矩阵存储的图)4.游览所有地点的路线规划(即遍历所有景点,我们使用深度优先搜索DFS或广度优先搜索BFS来查找所有路径,但题目要求游览所有地点,这里我们可能需要考虑最短路径遍历所有点?实际上这是旅行商问题,但是考虑到校园景点数量不多,且不一定需要最短,我们可以采用DFS找到一条遍历所有景点的路径即可)步骤:1.定义数据结构:景点信息和图的邻接矩阵2.文件读取数据构建图(包括景点信息和道路信息)3.实现Floyd算法计算任意两点间的最短路径4.实现DFS遍历所有景点(注意:遍历所有景点且每个景点只访问一次,然后输出一条路径)5.实现文件存储和查询功能(将景点信息和图的信息写入文件,并能从文件中读取)数据结构设计:景点信息:包括编号、名称、简介图结构:使用邻接矩阵存储,矩阵元素表示两个景点间的距离(如果两个景点不直接相连,则用一个大数表示,如INF文件格式设计:我们设计两个文件:一个存储景点信息:每一行一个景点,包括编号、名称、简介(用逗号分隔)另一个存储道路信息(邻接矩阵):每一行是一个一维数组的一行,用空格分隔但是为了简单,也可以将整个邻接矩阵存储在一个文件中,另一个文件存储景点信息。考虑到文件读写方便,我们这样设计:景点信息文件:spot.txt格式:编号,名称,简介如:0,图书馆,藏书丰富1,教学楼,主教学楼道路信息(邻接矩阵)文件:map.txt格式:第一行是景点个数n,后面n行,每行n个整数(表示距离,若两点间没有直接道路,用-1表示,我们在程序中将其替换为INF)例如:30100200100050200500程序结构:1.定义常量,如最大景点数、INF(一个很大的数)2.定义景点结构体:Spot3.定义图的结构体:Graph(包含邻接矩阵和景点数组)4.函数:读取景点文件5.函数:读取地图文件(邻接矩阵)6.函数:将数据写入文件(可选)7.函数:初始化图(包括将邻接矩阵中-1替换为INF)8.函数:Floyd算法计算最短路径,并存储最短路径矩阵和路径前驱矩阵(用于回溯路径)9.函数:查询两个景点的最短路径(输入起点和终点编号,输出路径和距离)10.函数:DFS遍历所有景点(输出一条遍历所有景点的路径)11.主函数:读取文件,构建图,并实现一个简单的用户交互界面注意:DFS遍历所有景点,我们只需要找到一条路径即可,所以我们设置一个visited数组,然后从某个起点开始,深度优先遍历所有节点。由于旅行商问题(最短回路)是NP难的,这里我们只求出一条可行路径(不一定最短),如果要最短,则需要回溯法或动态规划,但校园景点数一般不多,也可以尝试。但是题目要求是“游览所有地点”,并没有要求最短,所以可行路径即可。但是注意,我们可能需要访问所有景点且每个景点只访问一次,最后回到起点(形成回路)?题目并没有要求回到起点,所以我们可以选择任意起点和终点(起点和终点不同),但常见的是要求从某个起点出发,访问所有景点后回到起点。但是题目要求不明确,我们这里按照不要求回路(即起点到终点访问所有点)来实现。具体步骤:1.读取景点信息,存储到Spot数组2.读取邻接矩阵文件,初始化图的邻接矩阵3.使用Floyd算法计算任意两点间最短路径,得到dist矩阵和path矩阵(path矩阵用于记录路径中间点)4.用户交互:可以选择查询两个景点的最短路径,也可以选择遍历所有景点的路径对于遍历所有景点的路径规划(即寻找一条路径,从起点开始,访问其他所有景点一次且仅一次,最后到达终点),这实际上是一个哈密顿通路。我们使用DFS来搜索:伪代码:voidDFS(intstart,intdepth,intn,int*visited,int*path){如果当前已经访问了所有景点(depth==n),则打印路径。否则,对于当前节点的每个邻接点(未被访问),进行访问。}但是注意,这个路径不一定是最短的,而且我们只找一条。如果图不是完全图,可能不存在这样的路径,所以我们需要判断。由于我们的图是无向网,且校园地图一般是连通的,所以我们可以找到一条路径。实现步骤:1.创建一个visited数组,初始化为02.创建一个path数组,用于记录当前路径3.从起点开始,调用DFS,深度depth=1(表示已经访问了一个节点)4.DFS函数:标记当前节点已访问,将当前节点加入路径。如果depth等于总景点数,则打印路径。否则,遍历当前节点的所有邻接点,如果邻接点未被访问且存在边(即邻接矩阵中不为INF),则递归访问。递归返回后,回溯:将邻接点标记为未访问。5.注意:我们只需要找到一条路径就返回,所以可以设置一个标志found,找到后就不再递归。但是,如果图比较大,递归深度太深可能会栈溢出,而且如果景点数较多(例如超过20),那么递归深度20,但是分支数量很多,可能会很慢。但校园景点一般不会太多(20个以内),所以DFS是可行的。另外,我们可以用非递归DFS(栈)来实现。下面我们用C语言具体实现:注意:我们只关注连通性,不关注边的权重(在DFS中,我们只关心有没有边,即邻接矩阵中值不是INF,我们才认为有边)。但是注意,我们存储的道路信息是用邻接矩阵,如果两个景点不直接相连,那么邻接矩阵中是INF(我们程序中用一个很大的数,如0x3f3f3f3f),那么DFS中,只要不是INF,就说明有边(即使边权很大,我们也不管,因为DFS只关心能否到达)。步骤概述:1.读取文件,构建图。2.Floyd算法计算任意两点间最短路径(并存储路径,便于查询最短路径)。3.实现DFS遍历所有景点。另外,我们还需要一个功能:将图的信息保存到文件(如果修改了图,可以保存回文件)。下面我们开始编写代码框架:</think> 我将全面指导你用C语言实现校园地图导航系统,包含图结构构建、最短路径算法和路线规划。以下是完整的实现方案: ### 数据结构设计 ```c #include <stdio.h> #include <stdlib.h> #include <limits.h> #define MAX_SIZE 50 #define INF 1000000 // 景点结构体 typedef struct { int id; // 景点ID char name[50]; // 景点名称 char desc[200]; // 景点简介 } Spot; // 图结构(邻接矩阵) typedef struct { int vertexNum; // 景点数量 int edgeNum; // 道路数量 int matrix[MAX_SIZE][MAX_SIZE]; // 邻接矩阵 Spot spots[MAX_SIZE]; // 景点数组 } Graph; ``` ### 文件存储设计 1. **景点信息文件(spots.txt)格式**: ``` 1,图书馆,"校内最大的知识宝库" 2,食堂,"提供各种美食" 3,教学楼,"主要教学区域" ``` 2. **道路信息文件(roads.txt)格式**: ``` 1,2,300 // 景点1到景点2的距离300米 2,3,150 1,3,450 ``` ### 图结构构建实现 ```c // 从文件加载景点信息 void loadSpots(Graph* graph, const char* filename) { FILE* file = fopen(filename, "r"); if (!file) return; while (!feof(file)) { Spot spot; if (fscanf(file, "%d,%[^,],\"%[^\"]\"\n", &spot.id, spot.name, spot.desc) == 3) { graph->spots[spot.id] = spot; } } fclose(file); } // 从文件加载道路信息 void loadRoads(Graph* graph, const char* filename) { FILE* file = fopen(filename, "r"); if (!file) return; while (!feof(file)) { int from, to, weight; if (fscanf(file, "%d,%d,%d\n", &from, &to, &weight) == 3) { graph->matrix[from][to] = weight; graph->matrix[to][from] = weight; // 无向图 graph->edgeNum++; } } fclose(file); } // 初始化图结构 void initGraph(Graph* graph) { graph->vertexNum = 0; graph->edgeNum = 0; // 初始化邻接矩阵 for (int i = 0; i < MAX_SIZE; i++) { for (int j = 0; j < MAX_SIZE; j++) { graph->matrix[i][j] = (i == j) ? 0 : INF; } } loadSpots(graph, "spots.txt"); loadRoads(graph, "roads.txt"); } ``` ### 最短路径算法实现 ```c // Dijkstra算法实现最短路径 void dijkstra(Graph* graph, int start, int dist[], int path[]) { int visited[MAX_SIZE] = {0}; // 初始化距离和路径 for (int i = 0; i < MAX_SIZE; i++) { dist[i] = graph->matrix[start][i]; path[i] = (graph->matrix[start][i] < INF) ? start : -1; } visited[start] = 1; for (int i = 0; i < graph->vertexNum - 1; i++) { int minDist = INF, minIndex = -1; // 选择当前最短路径顶点 for (int j = 0; j < graph->vertexNum; j++) { if (!visited[j] && dist[j] < minDist) { minDist = dist[j]; minIndex = j; } } if (minIndex == -1) break; visited[minIndex] = 1; // 更新相邻顶点距离 for (int k = 0; k < graph->vertexNum; k++) { if (!visited[k] && dist[minIndex] + graph->matrix[minIndex][k] < dist[k]) { dist[k] = dist[minIndex] + graph->matrix[minIndex][k]; path[k] = minIndex; } } } } // 打印最短路径 void printPath(int path[], int end) { if (path[end] != -1) { printPath(path, path[end]); printf("->%d", end); } else { printf("%d", end); } } ``` ### 游览所有景点规划(哈密顿路径近似解) ```c // DFS实现游览所有景点 void dfsAllPaths(Graph* graph, int start, int visited[], int path[], int count) { visited[start] = 1; path[count++] = start; // 所有景点已访问 if (count == graph->vertexNum) { for (int i = 0; i < count; i++) { printf("%s", graph->spots[path[i]].name); if (i < count - 1) printf("->"); } printf("\n"); } else { // 继续访问相邻景点 for (int i = 0; i < graph->vertexNum; i++) { if (!visited[i] && graph->matrix[start][i] < INF) { dfsAllPaths(graph, i, visited, path, count); } } } // 回溯 visited[start] = 0; count--; } ``` ### 主程序框架 ```c int main() { Graph campusMap; initGraph(&campusMap); int dist[MAX_SIZE], path[MAX_SIZE]; int visited[MAX_SIZE] = {0}, dfsPath[MAX_SIZE]; // 使用示例 dijkstra(&campusMap, 0, dist, path); printf("从图书馆到教学楼的最短路径:"); printPath(path, 2); printf("\n总距离:%d米\n", dist[2]); printf("\n游览所有景点路线:\n"); dfsAllPaths(&campusMap, 0, visited, dfsPath, 0); return 0; } ``` ### 关键实现说明 1. **图存储结构**:使用邻接矩阵存储无向网,适合频繁查询[^1] 2. **最短路径算法**:Dijkstra算法计算单源最短路径 3. **所有景点规划**:使用DFS回溯遍历所有景点,生成访问序列 4. **文件处理**:使用CSV格式存储景点和道路信息 5. **路径回溯**:通过路径数组记录访问路径实现回溯 ### 性能优化建议 1. 对于大型校园地图,可考虑使用Floyd算法预先计算所有点对最短路径 2. 添加路径缓存机制避免重复计算 3. 对于遍历所有景点的需求,当景点数较多(>15)时建议采用启发式搜索 [^1]: 图结构选择邻接矩阵有利于路径查询操作 [^2]: 最短路径算法是导航系统核心功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值