32位應(yīng)用程序到64位應(yīng)用程序的遷移_第1頁
32位應(yīng)用程序到64位應(yīng)用程序的遷移_第2頁
32位應(yīng)用程序到64位應(yīng)用程序的遷移_第3頁
32位應(yīng)用程序到64位應(yīng)用程序的遷移_第4頁
32位應(yīng)用程序到64位應(yīng)用程序的遷移_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、將程序移植到 64 位 Windows雷立輝 整理簡介:本文對如何將32位Windows程序平滑的支持和過渡到 64位Windows操作 系統(tǒng)做出了一個簡單而系統(tǒng)的介紹。 包括對于 64位操作系統(tǒng)的版本, 編程模型, 一些移植原則甚至包括對驅(qū)動程序的移植原則的介紹。作者介紹:系統(tǒng)分析員,現(xiàn)在在北京工作。作者的 blog: .前言:或許大家還對32位的CPU及操作系統(tǒng)使用還是覺得非常的合乎日常需要,但Windows 64位已經(jīng)悄悄的來到了各位的身邊。 不少軟件廠商也紛紛宣稱自己的軟 件已經(jīng)支持 64位操作系統(tǒng)了。筆者在幾個月之前就成功的實施了一個軟件的 64位操作系統(tǒng)移植。 大致方案是, 上層應(yīng)

2、用程序仍然使用 32位程序,但將該系統(tǒng)軟件的驅(qū)動程序統(tǒng)統(tǒng)的變成了 64 位。這也是讓應(yīng)用程序支持 64位的最小代價。整個過程前后不到一個月 (兩個人 月),就解決了大部分問題。而一些難啃的骨頭都是因為以前的編碼不太規(guī)范而 引起的。因為這不是本文的主題,所以就此打住。下面的內(nèi)容就是我在工作過程中整理各種資料所得到的成果。為了文章的系統(tǒng) 性,中間轉(zhuǎn)貼了一些 MSDN 中文網(wǎng)站的內(nèi)容。希望能對大家的工作有所幫助。一最有可能受益于 64 位的應(yīng)用l 需要大量的可尋址內(nèi)存, 因而系統(tǒng)總體內(nèi)存需求超過 4GB 的應(yīng)用。例如那些采 用大型數(shù)據(jù)集的應(yīng)用(金融和科學(xué)建模軟件)和基于主機的桌面應(yīng)用(在不 降低性能

3、的情況下同時運行多個線程);l 必須同時管理大量的用戶或者應(yīng)用線程,例如大規(guī)模的瘦客戶端解決方案,大型數(shù)據(jù)庫,以及用于客戶關(guān)系管理(CRM)、供應(yīng)鏈管理(SCM)、企業(yè)資 源規(guī)劃(ERP)和數(shù)字版權(quán)管理(DRM)系統(tǒng)中的解決方案的數(shù)據(jù)倉庫應(yīng)用;l 需要通過實時加密和解密提高安全性的應(yīng)用,包括電子商務(wù)應(yīng)用和對專用或者分類數(shù)據(jù)的保護;l 需要數(shù)學(xué)精度和浮點性能的應(yīng)用,包括建模、模擬、統(tǒng)計和金融分析、圖像 / 視頻/信號處理、物理、醫(yī)學(xué)研究、遠程通信、加密和壓縮;l 需要大規(guī)模的、強大的數(shù)據(jù)庫性能的應(yīng)用,包括決策支持,搜索和索引,文檔 和內(nèi)容管理,以及語音識別;l需要64位計算的大內(nèi)存尋址功能的應(yīng)用

4、,包括很多高性能計算(HPC)群集應(yīng) 用;l 需要提供數(shù)字內(nèi)容創(chuàng)建功能,例如計算機輔助設(shè)計、制造和工程(CAD、CAM和CAE)、數(shù)字音樂制作和視頻編輯,以及實時媒體流解決方案;l 需要通過最大限度的性能實現(xiàn)逼真的影院級消費者體驗,包括計算機游戲、數(shù) 字視頻和協(xié)作;l 需要將以前只限于 64 位工作站的功能移植到企業(yè)、消費者和計算機愛好者的 臺式機中,包括 3D 建模、渲染、動畫、模擬和軟件開發(fā)。二 Windows XP的64位版分類微軟在2003年3月28日發(fā)布了 64位的 Windows XP。64位的 Windows XP稱 Windows XP 64-Bit Edition 其實就是

5、64 位版本的 Windows XP Professional 根據(jù) 不同的微處理器架構(gòu),它分為兩個不同版本:1.IA-64 版的 Windows XP針對英特爾(Intel)的IA-64架構(gòu)的安騰2(ltanium2純64位微處理器的 Windows XP 64-Bit Edition Version 2003 for Itanium-based System它是擁有 64 位尋址能力的強 大的操作系統(tǒng),主要面向頂級的高端IA-64架構(gòu)的工作站,用在高端的科學(xué)運算, 石油探測工藝,立體繪圖,復(fù)雜的動畫制作等等,是一種用在高效能運算 (High Performa nee Computi n的強

6、大的操作系統(tǒng)。估計它可能會改名為Win dows XPProfessio nal Itani um-based Edition支持雙處理器;最低支持 1GB的內(nèi)存,最高支 持16GB的內(nèi)存。2.X64 版的 Windows XP針對超微(AMD)的x64架構(gòu)的皓龍(Opteron與速龍64(Athlon64所屬的64位擴展 微處理器的 Windows XP 64-Bit Edition for 64-Bit Extended Systems由于英特爾也 發(fā)布了 x64架構(gòu)的In tel EM64T技術(shù)的至強(Xeo n)與奔騰4(Pe ntium 4的 64位擴展 微處理器,故微軟將該版本的的

7、 Windows XP 64-Bit Edition改為 Windows XPProfessio nal x64 Edition它支持AMD與In tel的x64架構(gòu)??梢允褂迷谝话?x64 架構(gòu)的工作站,桌面電腦以及筆記本電腦,用途與32位Windows XP Professional一樣,但具有64位尋址能力。支持雙處理器;最低支持 256MB的內(nèi)存,最高支 持16GB的內(nèi)存。Windows XP Professional x64 Editic與 32 位版本很相像三 x64版的Windows操作系統(tǒng)的設(shè)計目標(biāo)x64版有5大特征,即:1. 同時輕松支持32位Win32程序及64位程序;2.

8、 在64位運行的程序代碼和32位運行的程序應(yīng)該是同一份代碼;3. 使現(xiàn)有程序具有企業(yè)級應(yīng)用性能;(Enable existing即plications to scale toen terprise capacities4. 支持新的設(shè)計使之可以利用巨大地址空間及內(nèi)存空間;5. 支持32位既有程序。x64位平臺并沒有出現(xiàn) Win64 API,它仍然是熟悉的 Win32 API (現(xiàn)在更合適的 名稱為 Windows AP)。但它出現(xiàn)了一些新的兼容 64位的數(shù)據(jù)類型,所以可能 需要對代碼進行少量的更改。這就意味著開發(fā)者可以從單個代碼庫構(gòu)建代碼的 32位和64位版本,減少了由于維護兩個代碼庫所帶來的

9、維護開銷。但是,在x64中,Microsoft已經(jīng)去除了一些舊的組件,女口 Win16子系統(tǒng)。所以Windows 64位代碼不支持16位的Windows程序。也不支持 POSIX和OS/2子 系統(tǒng)。又出現(xiàn)了一個新的子系統(tǒng),稱為WOW64。四 x64新出現(xiàn)的子系統(tǒng)一WOW64WOW64是 Windows-32-on-Windows-64的縮寫。它為現(xiàn)有的 32位應(yīng)用程序提供 了 32位的模擬環(huán)境,可以使大多數(shù) 32位應(yīng)用程序在無需修改而直接運行在Win dows 64位版本上。它類似于舊的 WOW32子系統(tǒng),負責(zé)在 Win dows 32位 版本下運行16位的代碼。Direct 32-bit e

10、xecution on x64盡管x64 CPU本身具有32位兼容性模式,可以處理IA-32指令的實際執(zhí)行, 但WOW層仍然必不可少。WOW子系統(tǒng)負責(zé)諸如在32位和64位模式之間進程 切換以及模擬32位系統(tǒng)的服務(wù)。例如,32位和64位程序具有不同的注冊表配 置單元,還有一個用于 32位二進制文件的不同的系統(tǒng)目錄,而且64位二進制文件仍然使用System32目錄。因此,當(dāng)32位應(yīng)用程序安裝到系統(tǒng)中時,WOW 層會確保將32位二進制文件置于一個新的目錄SysWOW64中。這是通過如下方式實現(xiàn)的:根據(jù)應(yīng)用程序是否運行在WOW下,截獲對API的調(diào)用(如GetSystemDirector)并返回適當(dāng)?shù)哪?/p>

11、錄。類似的問題可能會存在于注冊表中。因 為32位和64位的COM服務(wù)器都可以安裝在系統(tǒng)上,并位于相同的類標(biāo)識符 (CLSID)下,因此 WOW層需要將對注冊表的調(diào)用重定向到適當(dāng)?shù)?2位或64位配置單元中。WOW層也會處理注冊表中某些區(qū)域之間的鏡像更改,以便使其更簡單地支持32位和64位代碼之間的交互操作。WOW64非常重要,因為當(dāng)不關(guān)注性能和可伸縮性的問題時,它使開發(fā)者可以利用大多數(shù)現(xiàn)有的32位代碼。它是兩種方法的最佳結(jié)合。開發(fā)者可以將應(yīng)用程序 服務(wù)遷移到64位,同時將 Microsoft管理控制臺(MMC)配置管理單元保留為 32位。Windows 64位版本包括 MMC的32位和64位的版

12、本。當(dāng)選擇保留管理 工具為32位時,進程間的通訊可能會遇到某些問題,但是只要接口設(shè)計正確, 諸如遠程過程調(diào)用(RPC)的協(xié)議應(yīng)該可以在32位和64位進程之間運行。有關(guān)WOW64 的另外一點需要牢記: 它并不是為要求高性能的應(yīng)用程序而設(shè)計的。 至 少,WOW64子系統(tǒng)需要將32位參數(shù)擴展到64位,并且需要將64位的返回值截 斷為 32位。在最糟糕的情況下, WOW64 子系統(tǒng)將需要進行內(nèi)核調(diào)用,涉及到 的不僅僅是到內(nèi)核的轉(zhuǎn)換, 還有從處理器的 32位兼容性模式到其本機 64位模式 的轉(zhuǎn)換。在 WOW64 下運行時,應(yīng)用程序?qū)o法妥當(dāng)?shù)剡M行調(diào)整。對于那些要 將其保留為32位的應(yīng)用程序而言,必須在

13、WOW64下測試它們。如果性能不能 滿足期望,則需要考慮將應(yīng)用程序遷移到 64位。WOW64是在用戶模式下實現(xiàn)的,作為 ntdll.dll和內(nèi)核之間的層。WOW64及其支 持的一些DLL僅僅是可以加載到32位進程中的64位的DLL。對于所有其他情 況,進程保持為純進程。32位的進程無法加載64位的DLL,反之亦然。所以, 請檢查代碼中的所有 ?LoadLibrary? 調(diào)用是否有效。有關(guān) WOW64 的詳細信息,請參閱 Microsoft_ Platform SDK 中的?64 -bit Windows Programming - Running 3b2i-t Applications? 。五

14、 64位windows內(nèi)存地址空間映射默認(rèn)情況下,Windows 32位版本的地址空間限制在 4GB,其中一半是為內(nèi)核保留 的。這限制了普通的應(yīng)用程序只能使用 2GB的有效虛擬內(nèi)存。2 GB看起來好像 很多,但是由于錯誤的分配算法、大型文件映射甚至過多的使用DLL,地址空間很容易在應(yīng)用程序中變得零碎。看一下任務(wù)管理器中的?VM Size?列,就會發(fā)現(xiàn)普通應(yīng)用程序消耗的虛擬內(nèi)存量。當(dāng)然,就想過去的 DOS 時期(利用 XMS/EMS) 樣,有很多種方法可以使 32位的應(yīng)用程序訪問多于 4 GB的物 理內(nèi)存。進入物理地址擴展 (PAE) 和地址窗口擴展( Address Windowing Ext

15、ensions, AWE)。 PAE 通過將地址位的數(shù)量從 32 擴展到 36 來工作,這樣 使應(yīng)用程序可以尋址的空間達到 64 GB。 AWE 使應(yīng)用程序可以將大于 4 GB 的 物理內(nèi)存范圍映射到虛擬地址空間中。 這兩種方法都引入了開銷并增加了代碼的 復(fù)雜性。Windows 64 位版本提供 16 TB 的有效尋址空間,其中一半可用于用戶模式的應(yīng) 用程序。這意味著整個數(shù)據(jù)庫可以移動到內(nèi)存中, 顯著地提高了性能, 或者整個 網(wǎng)站可以緩存到內(nèi)存中。它還可以使代碼保留并委托到巨型的鄰近虛擬內(nèi)存塊 中,無需實際地擔(dān)心虛擬內(nèi)存碎片問題。 這也考慮到了巨型文件映射對象或共享 的內(nèi)存部分。面是 64 位

16、體系結(jié)構(gòu)和 32 位體系結(jié)構(gòu)的比較表格:地址空間64 位 Windows32 位 Windows虛擬內(nèi)存16 TB4 GB頁面文件512 TB16 TB頁面緩沖池128 GB470 MB非頁面緩沖池128 GB256 MB系統(tǒng)緩存1 TB1 GBF面是Windows系列內(nèi)存地址空間分配比較:分區(qū)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位編碼指導(dǎo)原則Windows 64位版本使

18、用LLP64數(shù)據(jù)模型。這意味著標(biāo)準(zhǔn) C類型int和long 保持為32位整數(shù)。數(shù)據(jù)類型size_t將映射到處理器詞大?。↖A32為32位,IA64為64位),并且 _int64是64位整數(shù)。在協(xié)助遷移 32位代碼時就會 完成上述操作。意義在于您可以對應(yīng)用程序的 32位版本和64版本使用相同的 代碼庫。還有一個稱為LP64的數(shù)據(jù)模型,它將標(biāo)準(zhǔn)的C類型long映射到64位整數(shù), 并使int保持為32位的整數(shù)。這種數(shù)據(jù)模型常見于 Unix平臺,但從單個代碼 庫同時創(chuàng)建應(yīng)用程序的 32位和64位版本時可能有一些困難。您可能注意到了 此處的常見主題。32位平臺與64位平臺的思想就是應(yīng)該能夠從單個代碼庫中

19、構(gòu)建兩個版本的應(yīng)用程序。 如果無法做到, 那么您可能要重新審視您的設(shè)計。 具 有單個代碼庫就是巨大的勝利,尤其是如果您計劃發(fā)行兩個版本。綜合以上考慮,建議如下:l使用Windows64位或32位安全數(shù)據(jù)類型;l 檢查所有的指針運算及使用指針的地方;改寫所有嵌入的匯編代碼;使用 intrinsics或者 native assembly codel對于X64相關(guān)代碼使用#if defined (_AMD64_)的預(yù)編譯命令(沒有定義_IA64_宏);l對于IA64相關(guān)的代碼使用#if defined (_IA64命令;l編譯x64程序使用AMD64處理器;用 Visual C+ 創(chuàng)建在 64 位

20、Windows 操作系統(tǒng)中運行的應(yīng)用程序時, 應(yīng)注意以 下問題:l在64位 Windows操作系統(tǒng)中,int和long是32位值。l 在 64 位 Windows 操作系統(tǒng)中, size_t、time_t 和 ptrdiff_t 是 64 位值。l 在 32 位 Windows 操作系統(tǒng)中, time_t 是 32 位值。l 應(yīng)注意代碼在哪里采用 int 值和將其作為 size_t 值或 time_t 值處理。數(shù)字有 可能增長得比 32 位數(shù)大,并且數(shù)據(jù)在被傳遞回 int 存儲時有可能被截斷。l%x (十六進制int格式)printf修飾符在64位 Windows操作系統(tǒng)中不按預(yù)期 的那樣工作

21、;它只對傳遞給它的值的前 32 位進行操作。lWindows 32 位操作系統(tǒng)使用 %I32x 顯示整數(shù)。Windows 64 位操作系統(tǒng)使用 %I64x 顯示整數(shù)。l%p (指針的十六進制格式)在 64位Windows操作系統(tǒng)中按預(yù)期的那樣工作。2 /WP64:使編譯器警告您潛在的問題Microsoft. Visual C 和 Microsoft. Visual C+_ .NET 2002編譯器添加了 /WP64 開 關(guān),這使您可以測試32位代碼的64位兼容性問題。編譯器將發(fā)出有關(guān)指針截斷和不正確轉(zhuǎn)換的警告。將32位應(yīng)用程序遷移到 Windows 64位版本中前面的 一個步驟就是打開這個標(biāo)記

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位的整數(shù)。啟用/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'在修復(fù)這些錯誤后,請測試您的32位代碼。您希望確保32位的代碼繼續(xù)按預(yù) 期那樣工作。32位和64位二進制文件應(yīng)該從相同的代碼庫中構(gòu)建。這就是編 寫不斷前進的 Windows應(yīng)用程序的關(guān)鍵概念。開始時,您需要考慮32位和64 位的問題,并且為應(yīng)用程序編寫可以運行在這兩個平臺上的代碼。將程序移植到64位Windows( 4)2009-09-22 22:123多態(tài)類型由于 Win32 API是針對C的,在很多情況下,您都需要將整數(shù)轉(zhuǎn)換成指針或者相反。在32

25、位的硬件上不會有問題,其中指針的大小和整數(shù)的大小是相同的,但在64位的硬件上卻完全不一樣。這就是多態(tài)類型出現(xiàn)的原因。對于特定的精度,您可以使用固定精度的數(shù)據(jù)類型。不管處理器的詞大小如何,它們的大小 都是一致的。大多數(shù)這些類型都在它們的名稱中包含精度,可以從下面的表中看出:表1.固定精度的數(shù)據(jù)類型類型定義DWORD3232位無符號整數(shù)DWORD6464位無符號整數(shù)INT3232位有符號整數(shù)INT6464位有符號整數(shù)LONG3232位有符號整數(shù)1LONG6464位有符號整數(shù)UINT32無符號INT32UINT64無符號INT64ULONG32無符號LONG32ULONG64無符號LONG64此外,

26、當(dāng)您需要數(shù)據(jù)類型的精度隨著處理器詞大小變化時,請使用指針精度數(shù)據(jù)類型。這些 類型又稱為?多態(tài)?數(shù)據(jù)類型。這些類型通常以_PTR后綴結(jié)尾,如下面的表格所示:表2.指針精度的數(shù)據(jù)類型類型定義DWORD_PTF指針精度的無符號長類型HALF_PTR指針大小的一半。用于包含一個指針和兩個小型字段的結(jié)構(gòu)中INT_PTR指針精度的有符號整型LONG_PTR指針精度的有符號長類型SIZE_T指針可以引用的最大字節(jié)數(shù)。用于必須跨指針的整個范圍的計數(shù)SSIZE_T有符號SIZE_TUHALF_PTR 無符號HALF_PTRUINT_PTR無符號INT_PTRULONG_PTR無符號 LONG_PTRLPARAM

27、 與LONG_PTR為同義詞,(在 WTypes.h中定義)WPARAM 與 UINT_PTR為同義詞,(在 WTypes.h中定義)通過整數(shù)參數(shù)傳遞參數(shù)或上下文信息的所有Win32 API都更改為使用這些新的類型SetWindowLong和SetWindowLongPtr函數(shù)都是很好的示例:舊方法:LONG SetWindowLong(HWND hWnd,int nIndex,LONG dwNewLong);新的多態(tài)方法:LONG_PTR SetWindowLongPtr(HWND hWnd,int nIndex,LONG_PTR dwNewLong);請注意,該函數(shù)的xxxPtr版本使用新

28、的多態(tài)類型。對于開發(fā)人員而言,通過在窗口的額外 數(shù)據(jù)區(qū)域中存儲指針來存儲窗口的上下文信息是相當(dāng)常見的。使用SetWi ndowL ong函數(shù)在Windows 32位版本上存儲指針的任何代碼必須更改為調(diào)用SetWindowLongPtr該更改非常簡單并且很快就可以完成,因為大多數(shù)更改要求使用多態(tài)類型。另外,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,后者是多態(tài)類型。GetQueuedCompletionStati使用ULONG_PTR后者也是多態(tài)類型。這使那些假設(shè)整數(shù)的大小與指針大小相同的現(xiàn)有代碼可 以在進行很少修改的情況下繼續(xù)工作。Microsoft. Visual Studio_ .NET 2002勺編譯器包含兩個新的優(yōu)化模式:Lin

30、k Time CodeGeneration(LTCG,又稱 Whole Program Optimization 和 Profile Guided Optimization (PoGO) 代碼優(yōu)化在Itanium處理器上比在x86平臺上更為重要,因為編譯器對生產(chǎn)高效代碼負有 全部責(zé)任。對于編譯器方面的知識,請參考MSDN中文網(wǎng)站 na/MSDN/library/wi ndev/Wi ndows2003/NFd nn etservws0364bitdev.mspx 來獲得更多此方面的內(nèi)容。七將驅(qū)動移植到64位Windows操作系統(tǒng)x64位操作系統(tǒng)和x32位操作系統(tǒng)的最大區(qū)別就是內(nèi)存尋址方式的不同

31、。而 64 位操作系統(tǒng)不支持32位的驅(qū)動程序,因為驅(qū)動程序和 windows內(nèi)核同處于一個 地址空間中。這是移植32位驅(qū)動到64位驅(qū)動的最大原因。當(dāng)然,64位驅(qū)動程序 可以使用更大的分頁內(nèi)存,非分頁內(nèi)存及系統(tǒng)緩存。而且,你的設(shè)備從此就支持 64位win dows操作系統(tǒng)了。1 在X64下的驅(qū)動程序安裝除了要把應(yīng)用程序的32位驅(qū)動程序變成64位程序之外,驅(qū)動的安裝程序和其它 配置文件同樣需要修改。也就是說,對于要在x64上運行的32位程序,它所依賴的驅(qū)動仍然需要是64位的。這些相關(guān)程序包括inf文件,device installers, class installers和 co-installe

32、rs 相關(guān)資料可查看 MSDN Libarary DDK: Porting Your Driver to 64-Bit Win dows所以,要改造應(yīng)用程序的安裝程序。方法是,讓32位版的驅(qū)動安裝為缺省安裝選項,即用戶插入安裝光盤之后,依然運行32位安裝程序。但當(dāng)程序調(diào)用UpdateDriverForPlugAndPlayDevice返回值為 ERROR_IN_WOW64時,這說明該安 裝程序正運行在64位Windows環(huán)境中。此時,這個安裝程序應(yīng)該調(diào)用 CreateProcess 函數(shù)來啟動64位的安裝進程。這個64位的安裝進程通過調(diào)用64位驅(qū)動目錄下 的inf文件進行驅(qū)動安裝。2 驅(qū)動要支

33、持 32位IOCTL某些IOCTL可能包含含有指針的結(jié)構(gòu),所以,要特別小心的區(qū)別對待 它,必須根據(jù)被調(diào)用者解析結(jié)構(gòu)或者輸出結(jié)構(gòu)。有三種辦法可以解決這個問題:1盡量避免使用IOCTL傳遞包含有指針的結(jié)構(gòu);2通過API lols32bitProces()來判斷上層調(diào)用者的程序類型;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位驅(qū)動的安裝被提高了要求。這可以簡化用 戶的操作及提高安全性。Inf文件中必須含有NTAmd64或者NTIA64之類的修飾符才行。具體做法是在 Manufacturer和Models小節(jié)都需要添加此類的字段。%mycompa ny% = MyCompa nyM odels,NTx86,NTAmd64MyCompanyModels.NTx86%MyDev% = mydevlnstallx86,mydevHwidMyCompanyModels. NTAmd64%MyDev% = mydevlnstallAmd64,mydevHwid如

39、果只需要在WindowsX64系統(tǒng)上安裝,則只需要使用NTAmd64修飾符就可以了。更多請參考 4編程中容易碰到的問題1)指針的相關(guān)問題如果原有項目的編程風(fēng)格控制不嚴(yán),指針類型混用,強制轉(zhuǎn)換使用過多等等可能對移植是一個巨大的考驗。另外,程序中存在結(jié)構(gòu)之中根據(jù)具體數(shù)據(jù)類型來計算 其它變量的位置此類的代碼也需要重新檢查。使用指針的原則如下:1不要將指針強制轉(zhuǎn)換為int, long, ULONG, DWORD等類型,而應(yīng)該使用UINT_PTR 和 INT_PTR;2使用PtrToUlong(和PtrToLong(來截斷指針;3 永遠不要將已經(jīng)截斷的存貯在int或者ULONG中指針地址的重新合成一個新

40、 的指針地址;4小心的計算緩沖區(qū)的大小,說不定緩沖區(qū)的長度比ULONG所能存儲的最大數(shù)都大!5小心的調(diào)用那些傳出指針的函數(shù);對4可以舉個例子:比如說有兩個地址 ptr2(高地址),ptr1 (低地址),則len = ptr2 - ptr1將有可能大于2的32次方。2)結(jié)構(gòu)的內(nèi)存排列問題在64位的操作系統(tǒng)上,結(jié)構(gòu)的內(nèi)存排列(structure alignmer)t也需要小心審查。 內(nèi)存排列的齊整有利于處理器的執(zhí)行效率。如果打開了一些編譯選項,為了對齊內(nèi)存地址,編譯器可能會將某些位置填空。 在移植過程中,對結(jié)構(gòu)中的變量順序需要仔細檢查,特別是在同一個頭文件中使用不同的pack選項。比如下面的代碼:#pragma pack/*也可以使用編譯選項/Zp(結(jié)構(gòu)成員對齊)*/struct AlignSample ULONG size;void *ptr;struct AlignSample s;void foo(void *p) *p = p; /將會導(dǎo)致訪問異常f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論