日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS2017编译可在Win2000上运行的程序

發布時間:2025/3/19 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS2017编译可在Win2000上运行的程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

微軟最后一個可以原生編譯Win2000應用程序IDE是Visual Studio 2008,后續版本只能支持到WinXP。那么有什么辦法讓高版本的VS編譯出可以在Win2000上運行的程序呢?

首先我們要了解為什么編譯出的程序無法在Win2000上運行,首先一個原因是EXE可執行文件NTHEADER中的可選頭有一個操作系統版本和子系統版本,這個如果是支持XP,則值為5.1,如果是2000,則必須是5.0。

另外一個原因就是Win2000上kernel32.dll,缺失了一些關鍵的API,例如EncodePointer、DecodePointer等等。

有一個方案是安裝多個版本的VS,然后配置Daffodil.ENU.msi這個補丁來讓高版本的VS能夠使用低版本的Toolset。但是這有兩個個問題,首先如果讓高版本的VS識別VC2008的工具集就必須安裝VS2010,這樣就導致你的機器至少有3個版本的VS。其次就是雖然你可以使用VC2008的工具集了,但是你的編譯器也是VC2008,并不能享受高版本VC的特性,例如C99,VC++11等等。而且據我所知VC2013是第一個完整支持C99的版本,VC2015是第一個完整支持VC++11的版本。

此文給出老外的一個解決辦法,這里只做整理,原理很簡單,就是通過鏈接時符號替換。

首先創建一個最簡單的控制臺工程。只打印出hello world即可。

添加impapi.asm文件,內容如下

.586 .MODEL FLAT, STDCALLEXTERN STDCALL i__GetModuleHandleExW@12:PROC EXTERN STDCALL i__SetFilePointerEx@20:PROC EXTERN STDCALL i__InitializeSListHead@4:PROC EXTERN STDCALL i__EncodePointer@4:PROC EXTERN STDCALL i__DecodePointer@4:PROC EXTERN STDCALL i__HeapSetInformation@16:PROC.DATA__imp__InitializeSListHead@4 DWORD i__InitializeSListHead@4__imp__InterlockedPushEntrySList@8 DWORD RtlInterlockedPushEntrySList__imp__GetModuleHandleExW@12 DWORD i__GetModuleHandleExW@12__imp__EncodePointer@4 DWORD i__EncodePointer@4__imp__DecodePointer@4 DWORD i__DecodePointer@4__imp__HeapSetInformation@16 DWORD i__HeapSetInformation@16__imp__SetFilePointerEx@20 DWORD i__SetFilePointerEx@20EXTERNDEF STDCALL __imp__InitializeSListHead@4:DWORDEXTERNDEF STDCALL __imp__InterlockedPushEntrySList@8:DWORDEXTERNDEF STDCALL __imp__GetModuleHandleExW@12:DWORDEXTERNDEF STDCALL __imp__EncodePointer@4:DWORDEXTERNDEF STDCALL __imp__DecodePointer@4:DWORDEXTERNDEF STDCALL __imp__HeapSetInformation@16:DWORDEXTERNDEF STDCALL __imp__SetFilePointerEx@20:DWORD.CODE InterlockedPushEntrySList PROCpush ebxpush ebpmov ebp, ecxmov ebx, edxmov edx, [ebp+4]mov eax, [ebp+0]Epsh:mov [ebx], eaxlea ecx, [edx+10001h]lock cmpxchg8b qword ptr [ebp+0]jnz Epshpop ebppop ebxretn InterlockedPushEntrySList ENDPRtlInterlockedPushEntrySList PROCmov edi, edipush ebpmov ebp, espmov edx, [ebp+0Ch] ; ListEntrymov ecx, [ebp+08h] ; ListHeadcall InterlockedPushEntrySListpop ebpretn 8 RtlInterlockedPushEntrySList ENDPEND

添加extapi.c,內容如下

#include <windows.h>typedef BOOL (WINAPI *PFN_GET_MODULE_HANDLE_EX_W)(DWORD dwFlags, LPCWSTR lpModuleName, HMODULE *phModule); typedef BOOL (WINAPI *PFN_SET_FILE_POINTER_EX)(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod); typedef VOID (WINAPI *PFN_INITIALIZE_SLIST_HEAD)(PSLIST_HEADER ListHead); typedef PVOID (WINAPI *PFN_ENCODE_POINTER)(PVOID Pointer); typedef PVOID (WINAPI *PFN_DECODE_POINTER)(PVOID Pointer); typedef BOOL (WINAPI *PFN_HEAP_SET_INFORMATION)(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, SIZE_T HeapInformationLength);PFN_GET_MODULE_HANDLE_EX_W pfnGetModuleHandleExW; PFN_SET_FILE_POINTER_EX pfnSetFilePointerEx; PFN_INITIALIZE_SLIST_HEAD pfnInitializeSListHead; PFN_ENCODE_POINTER pfnEncodePointer; PFN_DECODE_POINTER pfnDecodePointer; PFN_HEAP_SET_INFORMATION pfnHeapSetInformation; BOOL HasAlreadyTryGetFunction;static VOID TryGetFunction(VOID) {HANDLE hKernel32 = GetModuleHandleA("kernel32");if(HasAlreadyTryGetFunction)return;pfnGetModuleHandleExW = (PFN_GET_MODULE_HANDLE_EX_W)GetProcAddress(hKernel32, "GetModuleHandleExW");pfnSetFilePointerEx = (PFN_SET_FILE_POINTER_EX)GetProcAddress(hKernel32, "SetFilePointerEx");pfnInitializeSListHead = (PFN_INITIALIZE_SLIST_HEAD)GetProcAddress(hKernel32, "InitializeSListHead");pfnEncodePointer = (PFN_ENCODE_POINTER)GetProcAddress(hKernel32, "EncodePointer");pfnDecodePointer = (PFN_DECODE_POINTER)GetProcAddress(hKernel32, "DecodePointer");pfnHeapSetInformation = (PFN_HEAP_SET_INFORMATION)GetProcAddress(hKernel32, "HeapSetInformation");HasAlreadyTryGetFunction = TRUE; }BOOL WINAPI i__GetModuleHandleExW(DWORD dwFlags, LPCWSTR lpModuleName, HMODULE *phModule) {TryGetFunction();if(pfnGetModuleHandleExW){return pfnGetModuleHandleExW(dwFlags, lpModuleName, phModule);}//NOT FULLY IMPLEMENTED//BasepGetModuleHandleExParameterValidationif( phModule == NULL ||(dwFlags & ~(GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)) ||(dwFlags & GET_MODULE_HANDLE_EX_FLAG_PIN && dwFlags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT) ||(lpModuleName == NULL && dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) ){SetLastError(ERROR_INVALID_PARAMETER);return FALSE;}*phModule = NULL;//BasepGetModuleHandleExWif(dwFlags & GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS){MEMORY_BASIC_INFORMATION mbi;SIZE_T size;size = VirtualQuery(lpModuleName, &mbi, sizeof(mbi));if(size >= sizeof(PVOID) * 2){*phModule = (HANDLE)mbi.AllocationBase;}}else{*phModule = GetModuleHandleW(lpModuleName);}return TRUE; }BOOL WINAPI i__SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod) {LARGE_INTEGER liDistanceToMoveTmp;DWORD dwRet;TryGetFunction();if(pfnSetFilePointerEx){return pfnSetFilePointerEx(hFile, liDistanceToMove, lpNewFilePointer, dwMoveMethod);}liDistanceToMoveTmp = liDistanceToMove;dwRet = SetFilePointer(hFile, liDistanceToMoveTmp.LowPart, &liDistanceToMoveTmp.HighPart, dwMoveMethod);if(dwRet != INVALID_SET_FILE_POINTER){lpNewFilePointer->LowPart = dwRet;lpNewFilePointer->HighPart = liDistanceToMoveTmp.HighPart;return TRUE;}return FALSE; }VOID WINAPI i__InitializeSListHead(PSLIST_HEADER ListHead) {ListHead->Alignment = 0; }PVOID WINAPI i__EncodePointer(PVOID Pointer) {TryGetFunction();if(pfnEncodePointer){return pfnEncodePointer(Pointer);}//NOT IMPLEMENTEDreturn Pointer; }PVOID WINAPI i__DecodePointer(PVOID Pointer) {TryGetFunction();if(pfnDecodePointer){return pfnDecodePointer(Pointer);}//NOT IMPLEMENTEDreturn Pointer; }BOOL WINAPI i__HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, SIZE_T HeapInformationLength) {TryGetFunction();if(pfnHeapSetInformation)return pfnHeapSetInformation(HeapHandle, HeapInformationClass, HeapInformation, HeapInformationLength);//NOT IMPLEMENTEDreturn TRUE; }

解決方案資源管理器,在項目上右鍵菜單選擇生成自定義,勾選masm。

在extapi1.asm右鍵屬性,配置常規項類型為 Microsoft Macro Assembler。

編譯該項目,修改上述所說的版本號為5.0。

嘗試在win2000上運行通過。

?

另外還有一些在Win2000上的VC運行庫,包括VC2010 VC2012 VC2012 VC2015 VC2017

http://i430vx.net/files/Win2k/Extended%20kernel%20ONLY/

上述代碼參考來源

https://stackoverflow.com/questions/19516796/visual-studio-2012-win32-project-targeting-windows-2000

?

?

?

總結

以上是生活随笔為你收集整理的VS2017编译可在Win2000上运行的程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 啪啪福利社 | 日本久久99 | 特黄aaaaaaaaa毛片免 | 91久久精品一区 | 成人伊人网 | 撒尿free性hd | 怡红院一区 | 精品无码国产一区二区三区av | 五月婷婷六月婷婷 | 国产精品午夜一区二区 | 毛片小视频 | 久久精品动漫 | 国产麻豆天美果冻无码视频 | 久久久久久夜 | 红桃视频一区 | 超碰国产在线 | 三级性生活片 | 伊人久久青草 | 99视频99 | 狠狠操夜夜爽 | 美国爱爱视频 | 俄罗斯美女av | av中文字幕一区 | 国产在线一卡二卡 | 老司机精品导航 | 综合天堂av久久久久久久 | 8x8x国产精品一区二区 | 国产高清一区在线观看 | 人操人操 | 精品久久一 | 欧美一区二区在线播放 | videos麻豆| 美女视频一区二区 | 国产精华一区二区三区 | 日韩三区在线观看 | 漂亮人妻被中出中文字幕 | 欧美日韩一区二区电影 | 依依av| 亚洲精品日韩综合观看成人91 | 免费国产a级片 | 99久久精品久久久久久清纯 | 影音先锋人妻啪啪av资源网站 | 精品电影一区二区 | 久久国产美女视频 | 国内自拍99 | 国产午夜福利一区 | 风流老熟女一区二区三区 | 日女人网站| 精品偷拍一区 | 亚洲精品国产精华液 | 国产人妻精品久久久久野外 | 国产三级第一页 | 成人精品三级av在线看 | 久久精品人人爽 | 国产美女精品久久 | 国产精品久久久一区 | 成人动漫av在线 | 亚洲香蕉av | 99久久久国产精品无码网爆 | 伊人影院亚洲 | 污视频导航 | 中文字幕乱码亚洲精品一区 | 91精品视频网站 | 黄色网在线免费观看 | 67194在线免费观看 | 亚洲av永久无码精品放毛片 | 欧美1区2区 | 哪个网站可以看毛片 | 午夜国产一级 | 亚洲图色在线 | 性欧美1819性猛交 | 亚洲免费视频一区二区三区 | 午夜肉体高潮免费毛片 | 搞中出| 久久99久 | a毛片基地 | 中文字幕亚洲一区二区三区五十路 | 黑料视频在线 | 午夜精品久久久久久久久久久久 | 尹人成人 | 俄罗斯女人裸体性做爰 | 国产免费麻豆 | 亚洲精品国产一区二区 | 一区二区三区在线免费视频 | 公肉吊粗大爽色翁浪妇视频 | 男人在线网站 | 永久免费快色 | 免费日韩毛片 | 深夜在线观看 | 亚洲人成无码网站久久99热国产 | 亚色av | 男女视频久久 | 少妇人妻偷人精品无码视频新浪 | 麻豆91视频 | 美女毛片在线观看 | 日韩在线播放视频 | 欧美videos另类精品 | 欧美性理论片在线观看片免费 | 高清国产在线观看 |