32位应用程序到64位应用程序的迁移_第1页
32位应用程序到64位应用程序的迁移_第2页
32位应用程序到64位应用程序的迁移_第3页
32位应用程序到64位应用程序的迁移_第4页
32位应用程序到64位应用程序的迁移_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、将程序移植到 64 位 Windows雷立辉 整理简介:本文对如何将32位Windows程序平滑的支持和过渡到 64位Windows操作 系统做出了一个简单而系统的介绍。 包括对于 64位操作系统的版本, 编程模型, 一些移植原则甚至包括对驱动程序的移植原则的介绍。作者介绍:系统分析员,现在在北京工作。作者的 blog: .前言:或许大家还对32位的CPU及操作系统使用还是觉得非常的合乎日常需要,但Windows 64位已经悄悄的来到了各位的身边。 不少软件厂商也纷纷宣称自己的软 件已经支持 64位操作系统了。笔者在几个月之前就成功的实施了一个软件的 64位操作系统移植。 大致方案是, 上层应

2、用程序仍然使用 32位程序,但将该系统软件的驱动程序统统的变成了 64 位。这也是让应用程序支持 64位的最小代价。整个过程前后不到一个月 (两个人 月),就解决了大部分问题。而一些难啃的骨头都是因为以前的编码不太规范而 引起的。因为这不是本文的主题,所以就此打住。下面的内容就是我在工作过程中整理各种资料所得到的成果。为了文章的系统 性,中间转贴了一些 MSDN 中文网站的内容。希望能对大家的工作有所帮助。一最有可能受益于 64 位的应用l 需要大量的可寻址内存, 因而系统总体内存需求超过 4GB 的应用。例如那些采 用大型数据集的应用(金融和科学建模软件)和基于主机的桌面应用(在不 降低性能

3、的情况下同时运行多个线程);l 必须同时管理大量的用户或者应用线程,例如大规模的瘦客户端解决方案,大型数据库,以及用于客户关系管理(CRM)、供应链管理(SCM)、企业资 源规划(ERP)和数字版权管理(DRM)系统中的解决方案的数据仓库应用;l 需要通过实时加密和解密提高安全性的应用,包括电子商务应用和对专用或者分类数据的保护;l 需要数学精度和浮点性能的应用,包括建模、模拟、统计和金融分析、图像 / 视频/信号处理、物理、医学研究、远程通信、加密和压缩;l 需要大规模的、强大的数据库性能的应用,包括决策支持,搜索和索引,文档 和内容管理,以及语音识别;l需要64位计算的大内存寻址功能的应用

4、,包括很多高性能计算(HPC)群集应 用;l 需要提供数字内容创建功能,例如计算机辅助设计、制造和工程(CAD、CAM和CAE)、数字音乐制作和视频编辑,以及实时媒体流解决方案;l 需要通过最大限度的性能实现逼真的影院级消费者体验,包括计算机游戏、数 字视频和协作;l 需要将以前只限于 64 位工作站的功能移植到企业、消费者和计算机爱好者的 台式机中,包括 3D 建模、渲染、动画、模拟和软件开发。二 Windows XP的64位版分类微软在2003年3月28日发布了 64位的 Windows XP。64位的 Windows XP称 Windows XP 64-Bit Edition 其实就是

5、64 位版本的 Windows XP Professional 根据 不同的微处理器架构,它分为两个不同版本:1.IA-64 版的 Windows XP针对英特尔(Intel)的IA-64架构的安腾2(ltanium2纯64位微处理器的 Windows XP 64-Bit Edition Version 2003 for Itanium-based System它是拥有 64 位寻址能力的强 大的操作系统,主要面向顶级的高端IA-64架构的工作站,用在高端的科学运算, 石油探测工艺,立体绘图,复杂的动画制作等等,是一种用在高效能运算 (High Performa nee Computi n的强

6、大的操作系统。估计它可能会改名为Win dows XPProfessio nal Itani um-based Edition支持双处理器;最低支持 1GB的内存,最高支 持16GB的内存。2.X64 版的 Windows XP针对超微(AMD)的x64架构的皓龙(Opteron与速龙64(Athlon64所属的64位扩展 微处理器的 Windows XP 64-Bit Edition for 64-Bit Extended Systems由于英特尔也 发布了 x64架构的In tel EM64T技术的至强(Xeo n)与奔腾4(Pe ntium 4的 64位扩展 微处理器,故微软将该版本的的

7、 Windows XP 64-Bit Edition改为 Windows XPProfessio nal x64 Edition它支持AMD与In tel的x64架构。可以使用在一般 x64 架构的工作站,桌面电脑以及笔记本电脑,用途与32位Windows XP Professional一样,但具有64位寻址能力。支持双处理器;最低支持 256MB的内存,最高支 持16GB的内存。Windows XP Professional x64 Editic与 32 位版本很相像三 x64版的Windows操作系统的设计目标x64版有5大特征,即:1. 同时轻松支持32位Win32程序及64位程序;2.

8、 在64位运行的程序代码和32位运行的程序应该是同一份代码;3. 使现有程序具有企业级应用性能;(Enable existing即plications to scale toen terprise capacities4. 支持新的设计使之可以利用巨大地址空间及内存空间;5. 支持32位既有程序。x64位平台并没有出现 Win64 API,它仍然是熟悉的 Win32 API (现在更合适的 名称为 Windows AP)。但它出现了一些新的兼容 64位的数据类型,所以可能 需要对代码进行少量的更改。这就意味着开发者可以从单个代码库构建代码的 32位和64位版本,减少了由于维护两个代码库所带来的

9、维护开销。但是,在x64中,Microsoft已经去除了一些旧的组件,女口 Win16子系统。所以Windows 64位代码不支持16位的Windows程序。也不支持 POSIX和OS/2子 系统。又出现了一个新的子系统,称为WOW64。四 x64新出现的子系统一WOW64WOW64是 Windows-32-on-Windows-64的缩写。它为现有的 32位应用程序提供 了 32位的模拟环境,可以使大多数 32位应用程序在无需修改而直接运行在Win dows 64位版本上。它类似于旧的 WOW32子系统,负责在 Win dows 32位 版本下运行16位的代码。Direct 32-bit e

10、xecution on x64尽管x64 CPU本身具有32位兼容性模式,可以处理IA-32指令的实际执行, 但WOW层仍然必不可少。WOW子系统负责诸如在32位和64位模式之间进程 切换以及模拟32位系统的服务。例如,32位和64位程序具有不同的注册表配 置单元,还有一个用于 32位二进制文件的不同的系统目录,而且64位二进制文件仍然使用System32目录。因此,当32位应用程序安装到系统中时,WOW 层会确保将32位二进制文件置于一个新的目录SysWOW64中。这是通过如下方式实现的:根据应用程序是否运行在WOW下,截获对API的调用(如GetSystemDirector)并返回适当的目

11、录。类似的问题可能会存在于注册表中。因 为32位和64位的COM服务器都可以安装在系统上,并位于相同的类标识符 (CLSID)下,因此 WOW层需要将对注册表的调用重定向到适当的32位或64位配置单元中。WOW层也会处理注册表中某些区域之间的镜像更改,以便使其更简单地支持32位和64位代码之间的交互操作。WOW64非常重要,因为当不关注性能和可伸缩性的问题时,它使开发者可以利用大多数现有的32位代码。它是两种方法的最佳结合。开发者可以将应用程序 服务迁移到64位,同时将 Microsoft管理控制台(MMC)配置管理单元保留为 32位。Windows 64位版本包括 MMC的32位和64位的版

12、本。当选择保留管理 工具为32位时,进程间的通讯可能会遇到某些问题,但是只要接口设计正确, 诸如远程过程调用(RPC)的协议应该可以在32位和64位进程之间运行。有关WOW64 的另外一点需要牢记: 它并不是为要求高性能的应用程序而设计的。 至 少,WOW64子系统需要将32位参数扩展到64位,并且需要将64位的返回值截 断为 32位。在最糟糕的情况下, WOW64 子系统将需要进行内核调用,涉及到 的不仅仅是到内核的转换, 还有从处理器的 32位兼容性模式到其本机 64位模式 的转换。在 WOW64 下运行时,应用程序将无法妥当地进行调整。对于那些要 将其保留为32位的应用程序而言,必须在

13、WOW64下测试它们。如果性能不能 满足期望,则需要考虑将应用程序迁移到 64位。WOW64是在用户模式下实现的,作为 ntdll.dll和内核之间的层。WOW64及其支 持的一些DLL仅仅是可以加载到32位进程中的64位的DLL。对于所有其他情 况,进程保持为纯进程。32位的进程无法加载64位的DLL,反之亦然。所以, 请检查代码中的所有 ?LoadLibrary? 调用是否有效。有关 WOW64 的详细信息,请参阅 Microsoft_ Platform SDK 中的?64 -bit Windows Programming - Running 3b2i-t Applications? 。五

14、 64位windows内存地址空间映射默认情况下,Windows 32位版本的地址空间限制在 4GB,其中一半是为内核保留 的。这限制了普通的应用程序只能使用 2GB的有效虚拟内存。2 GB看起来好像 很多,但是由于错误的分配算法、大型文件映射甚至过多的使用DLL,地址空间很容易在应用程序中变得零碎。看一下任务管理器中的?VM Size?列,就会发现普通应用程序消耗的虚拟内存量。当然,就想过去的 DOS 时期(利用 XMS/EMS) 样,有很多种方法可以使 32位的应用程序访问多于 4 GB的物 理内存。进入物理地址扩展 (PAE) 和地址窗口扩展( Address Windowing Ext

15、ensions, AWE)。 PAE 通过将地址位的数量从 32 扩展到 36 来工作,这样 使应用程序可以寻址的空间达到 64 GB。 AWE 使应用程序可以将大于 4 GB 的 物理内存范围映射到虚拟地址空间中。 这两种方法都引入了开销并增加了代码的 复杂性。Windows 64 位版本提供 16 TB 的有效寻址空间,其中一半可用于用户模式的应 用程序。这意味着整个数据库可以移动到内存中, 显著地提高了性能, 或者整个 网站可以缓存到内存中。它还可以使代码保留并委托到巨型的邻近虚拟内存块 中,无需实际地担心虚拟内存碎片问题。 这也考虑到了巨型文件映射对象或共享 的内存部分。面是 64 位

16、体系结构和 32 位体系结构的比较表格:地址空间64 位 Windows32 位 Windows虚拟内存16 TB4 GB页面文件512 TB16 TB页面缓冲池128 GB470 MB非页面缓冲池128 GB256 MB系统缓存1 TB1 GBF面是Windows系列内存地址空间分配比较:分区Alrfnjtt"*4* irhl dAlphiin2皎】Mt II>1 rU %fiiiK kn KMX miw 和Mili»9MINRHniifiur 67 分 *"WM>I 卅 Fl I'IUMI| IIX巧 IH4无无无1|lbhi“和啪 <

17、;hlHl )|H1I IlJiicm u ir<KE£11 1 11 1 IIOVMHuxril 1 1 E ll Uli1 1 TUT卄耳升f-tiHhHk1 aKI t I ,jN IIIOUMNihimBI 1 1 1 t | 卅Ml讣无栽止班入ff i i ri i i rnuhmiMiirii 111 rn r无无无文件 MXlI i iS旅用十门1 11hmHI1iHUHmr+ii1 1 1 1 1 11H 1 T1Eu1111111 1 III 111rnlH til六 Windows 64位版本的 C/C+编程1 64位编码指导原则Windows 64位版本使

18、用LLP64数据模型。这意味着标准 C类型int和long 保持为32位整数。数据类型size_t将映射到处理器词大小(IA32为32位,IA64为64位),并且 _int64是64位整数。在协助迁移 32位代码时就会 完成上述操作。意义在于您可以对应用程序的 32位版本和64版本使用相同的 代码库。还有一个称为LP64的数据模型,它将标准的C类型long映射到64位整数, 并使int保持为32位的整数。这种数据模型常见于 Unix平台,但从单个代码 库同时创建应用程序的 32位和64位版本时可能有一些困难。您可能注意到了 此处的常见主题。32位平台与64位平台的思想就是应该能够从单个代码库中

19、构建两个版本的应用程序。 如果无法做到, 那么您可能要重新审视您的设计。 具 有单个代码库就是巨大的胜利,尤其是如果您计划发行两个版本。综合以上考虑,建议如下:l使用Windows64位或32位安全数据类型;l 检查所有的指针运算及使用指针的地方;改写所有嵌入的汇编代码;使用 intrinsics或者 native assembly codel对于X64相关代码使用#if defined (_AMD64_)的预编译命令(没有定义_IA64_宏);l对于IA64相关的代码使用#if defined (_IA64命令;l编译x64程序使用AMD64处理器;用 Visual C+ 创建在 64 位

20、Windows 操作系统中运行的应用程序时, 应注意以 下问题:l在64位 Windows操作系统中,int和long是32位值。l 在 64 位 Windows 操作系统中, size_t、time_t 和 ptrdiff_t 是 64 位值。l 在 32 位 Windows 操作系统中, time_t 是 32 位值。l 应注意代码在哪里采用 int 值和将其作为 size_t 值或 time_t 值处理。数字有 可能增长得比 32 位数大,并且数据在被传递回 int 存储时有可能被截断。l%x (十六进制int格式)printf修饰符在64位 Windows操作系统中不按预期 的那样工作

21、;它只对传递给它的值的前 32 位进行操作。lWindows 32 位操作系统使用 %I32x 显示整数。Windows 64 位操作系统使用 %I64x 显示整数。l%p (指针的十六进制格式)在 64位Windows操作系统中按预期的那样工作。2 /WP64:使编译器警告您潜在的问题Microsoft. Visual C 和 Microsoft. Visual C+_ .NET 2002编译器添加了 /WP64 开 关,这使您可以测试32位代码的64位兼容性问题。编译器将发出有关指针截断和不正确转换的警告。将32位应用程序迁移到 Windows 64位版本中前面的 一个步骤就是打开这个标记

22、,然后就像通常编译代码那样来编译您的代码。第一次会有几个错误。例如,请看下面这个代码片段:DWORD i = 0;size_t x = 100;i = x; / C4267: warning C4267: '=': conversion from/ 'size_t' to 'DWORD', possible loss of data.在32位的平台上,这段代码能够很好的进行编译,因为size_t是32位的,但 是在64位的平台上,size_t就是64位的整数。启用/WP64后,编译器将会 警告您类似的情况。其他示例:void func(DWORD

23、 context)char* sz = (char*)context; / C4312: warning C4312:/ 'type cast' : conversion/ from 'DWORD' to 'char *' of/ greater size/ Do something with sz.char* string = "the quick brown fox jumped over the lazy dog."func(DWORD)string); / C4311: warning C4311: 'type

24、 cast':/ pointer truncation from 'char *'/ to 'DWORD'在修复这些错误后,请测试您的32位代码。您希望确保32位的代码继续按预 期那样工作。32位和64位二进制文件应该从相同的代码库中构建。这就是编 写不断前进的 Windows应用程序的关键概念。开始时,您需要考虑32位和64 位的问题,并且为应用程序编写可以运行在这两个平台上的代码。将程序移植到64位Windows( 4)2009-09-22 22:123多态类型由于 Win32 API是针对C的,在很多情况下,您都需要将整数转换成指针或者相反。在32

25、位的硬件上不会有问题,其中指针的大小和整数的大小是相同的,但在64位的硬件上却完全不一样。这就是多态类型出现的原因。对于特定的精度,您可以使用固定精度的数据类型。不管处理器的词大小如何,它们的大小 都是一致的。大多数这些类型都在它们的名称中包含精度,可以从下面的表中看出:表1.固定精度的数据类型类型定义DWORD3232位无符号整数DWORD6464位无符号整数INT3232位有符号整数INT6464位有符号整数LONG3232位有符号整数1LONG6464位有符号整数UINT32无符号INT32UINT64无符号INT64ULONG32无符号LONG32ULONG64无符号LONG64此外,

26、当您需要数据类型的精度随着处理器词大小变化时,请使用指针精度数据类型。这些 类型又称为?多态?数据类型。这些类型通常以_PTR后缀结尾,如下面的表格所示:表2.指针精度的数据类型类型定义DWORD_PTF指针精度的无符号长类型HALF_PTR指针大小的一半。用于包含一个指针和两个小型字段的结构中INT_PTR指针精度的有符号整型LONG_PTR指针精度的有符号长类型SIZE_T指针可以引用的最大字节数。用于必须跨指针的整个范围的计数SSIZE_T有符号SIZE_TUHALF_PTR 无符号HALF_PTRUINT_PTR无符号INT_PTRULONG_PTR无符号 LONG_PTRLPARAM

27、 与LONG_PTR为同义词,(在 WTypes.h中定义)WPARAM 与 UINT_PTR为同义词,(在 WTypes.h中定义)通过整数参数传递参数或上下文信息的所有Win32 API都更改为使用这些新的类型SetWindowLong和SetWindowLongPtr函数都是很好的示例:旧方法:LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong);新的多态方法:LONG_PTR SetWindowLongPtr(HWND hWnd,int nIndex,LONG_PTR dwNewLong);请注意,该函数的xxxPtr版本使用新

28、的多态类型。对于开发人员而言,通过在窗口的额外 数据区域中存储指针来存储窗口的上下文信息是相当常见的。使用SetWi ndowL ong函数在Windows 32位版本上存储指针的任何代码必须更改为调用SetWindowLongPtr该更改非常简单并且很快就可以完成,因为大多数更改要求使用多态类型。另外,WindowProc 和 GetQueuedCompletionStatu也是很好的示例:LRESULT CALLBACK WindowProc(HWND hWnd,UINT uiMsg,WPARAM wParam,LPARAM IParam);BOOL GetQueuedCompletion

29、Status(HANDLE hCompletionPort,LPDWORD IpNumberOfBytes,PULONG_PTR lpCompletionKey, LPOVERLAPPED* lpOverlapped, DWORD dwMilliseconds);WindowProc 使用 LPARAM,后者是多态类型。GetQueuedCompletionStati使用ULONG_PTR后者也是多态类型。这使那些假设整数的大小与指针大小相同的现有代码可 以在进行很少修改的情况下继续工作。Microsoft. Visual Studio_ .NET 2002勺编译器包含两个新的优化模式:Lin

30、k Time CodeGeneration(LTCG,又称 Whole Program Optimization 和 Profile Guided Optimization (PoGO) 代码优化在Itanium处理器上比在x86平台上更为重要,因为编译器对生产高效代码负有 全部责任。对于编译器方面的知识,请参考MSDN中文网站 na/MSDN/library/wi ndev/Wi ndows2003/NFd nn etservws0364bitdev.mspx 来获得更多此方面的内容。七将驱动移植到64位Windows操作系统x64位操作系统和x32位操作系统的最大区别就是内存寻址方式的不同

31、。而 64 位操作系统不支持32位的驱动程序,因为驱动程序和 windows内核同处于一个 地址空间中。这是移植32位驱动到64位驱动的最大原因。当然,64位驱动程序 可以使用更大的分页内存,非分页内存及系统缓存。而且,你的设备从此就支持 64位win dows操作系统了。1 在X64下的驱动程序安装除了要把应用程序的32位驱动程序变成64位程序之外,驱动的安装程序和其它 配置文件同样需要修改。也就是说,对于要在x64上运行的32位程序,它所依赖的驱动仍然需要是64位的。这些相关程序包括inf文件,device installers, class installers和 co-installe

32、rs 相关资料可查看 MSDN Libarary DDK: Porting Your Driver to 64-Bit Win dows所以,要改造应用程序的安装程序。方法是,让32位版的驱动安装为缺省安装选项,即用户插入安装光盘之后,依然运行32位安装程序。但当程序调用UpdateDriverForPlugAndPlayDevice返回值为 ERROR_IN_WOW64时,这说明该安 装程序正运行在64位Windows环境中。此时,这个安装程序应该调用 CreateProcess 函数来启动64位的安装进程。这个64位的安装进程通过调用64位驱动目录下 的inf文件进行驱动安装。2 驱动要支

33、持 32位IOCTL某些IOCTL可能包含含有指针的结构,所以,要特别小心的区别对待 它,必须根据被调用者解析结构或者输出结构。有三种办法可以解决这个问题:1尽量避免使用IOCTL传递包含有指针的结构;2通过API lols32bitProces()来判断上层调用者的程序类型;3在64位程序中采用新的IOCTL命令;例子:IOCTL structure in header filetypedef struct _IOCTL_PARAMETERS PVOID Addr;SIZE_T Length;HANDLE Handle; IOCTL_PARAMETERS, *PIOCTL_PARAMETER

34、S;32-bit IOCTL structure/ This structure is defined/inside the driver source code/typedef struct _IOCTL_PARAMETERS_32 VOID*POINTER_32 Addr;INT32 Length;VOID*POINTER_32 Handle; IOCTL_PARAMETERS_32, *PIOCTL_PARAMETERS_32;32-Bit and 64-Bit IOCTL#ifdef _WIN64case IOCTL_REGISTER:if (lols32bitProcess(lrp)

35、 /* If this is a 32 bit process */params32 = (PIOCTL_PARAMETERS_32)(lrp>Associatedlrp.SystemBuffer);if(irpSp->Parameters.DeviceIoControl.lnputBufferLength < sizeof(IOCTL_PARAMETERS_32) status = STATUS_INVALID_PARAMETER; else LocalParam.Addr = params32->Addr;LocalParam.Handle = params32-&

36、gt;Handle;LocalParam.Length = params32->Length;/* Handle the ioctl here */status = STATUS_SUCCESS;Irp->IoStatus.Information = sizeof(IOCTL_PARAMETERS); else /* 64bit process IOCTL */ else /* 64bit process IOCTL */params = (PIOCTL_PARAMETERS)(lrp->Associatedlrp.SystemBuffer);if (irpSp->Pa

37、rameters.DeviceloControl.lnputBufferLength< sizeof(IOCTL_PARAMETERS) status = STATUS_INVALID_PARAMETER; else RtlCopyMemory (&LocalParam, params,sizeof(IOCTL_PARAMETERS);/* Handle the ioctl here */status = STATUS_SUCCESS;Irp->IoStatus.Information = sizeof(IOCTL_PARAMETERS);break;3 64-Bit IN

38、F文件要求在Windows Server 2003SP之后,64位驱动的安装被提高了要求。这可以简化用 户的操作及提高安全性。Inf文件中必须含有NTAmd64或者NTIA64之类的修饰符才行。具体做法是在 Manufacturer和Models小节都需要添加此类的字段。%mycompa ny% = MyCompa nyM odels,NTx86,NTAmd64MyCompanyModels.NTx86%MyDev% = mydevlnstallx86,mydevHwidMyCompanyModels. NTAmd64%MyDev% = mydevlnstallAmd64,mydevHwid如

39、果只需要在WindowsX64系统上安装,则只需要使用NTAmd64修饰符就可以了。更多请参考 4编程中容易碰到的问题1)指针的相关问题如果原有项目的编程风格控制不严,指针类型混用,强制转换使用过多等等可能对移植是一个巨大的考验。另外,程序中存在结构之中根据具体数据类型来计算 其它变量的位置此类的代码也需要重新检查。使用指针的原则如下:1不要将指针强制转换为int, long, ULONG, DWORD等类型,而应该使用UINT_PTR 和 INT_PTR;2使用PtrToUlong(和PtrToLong(来截断指针;3 永远不要将已经截断的存贮在int或者ULONG中指针地址的重新合成一个新

40、 的指针地址;4小心的计算缓冲区的大小,说不定缓冲区的长度比ULONG所能存储的最大数都大!5小心的调用那些传出指针的函数;对4可以举个例子:比如说有两个地址 ptr2(高地址),ptr1 (低地址),则len = ptr2 - ptr1将有可能大于2的32次方。2)结构的内存排列问题在64位的操作系统上,结构的内存排列(structure alignmer)t也需要小心审查。 内存排列的齐整有利于处理器的执行效率。如果打开了一些编译选项,为了对齐内存地址,编译器可能会将某些位置填空。 在移植过程中,对结构中的变量顺序需要仔细检查,特别是在同一个头文件中使用不同的pack选项。比如下面的代码:#pragma pack/*也可以使用编译选项/Zp(结构成员对齐)*/struct AlignSample ULONG size;void *ptr;struct AlignSample s;void foo(void *p) *p = p; /将会导致访问异常f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论