在Windows上以32位进程强制将DLL加载到2GB(0x80000000)以上

伊戈尔·斯科钦斯基(Igor Skochinsky)

要在我们的调试器中测试极端情况,我需要提供一个程序,该程序的DLL加载超过2GB(0x80000000)。当前的测试用例是一个多GB游戏,可加载> 700个DLL,我想拥有更简单,更小的东西。有没有一种方法可以可靠地实现它而又不会太费心?我认为我需要使用/LARGEADDRESSAWARE并以某种方式消耗足够的VA空间,以使新的DLL达到2GB以上,但是我对细节感到困惑...

伊戈尔·斯科钦斯基(Igor Skochinsky)

好的,我花了一些时间尝试,但我设法提出了一些可行的措施。

// cl /MT /Ox test.cpp /link /LARGEADDRESSAWARE
// occupy the 2 gigabytes!
#define ALLOCSIZE (64*1024)
#define TWOGB (2*1024ull*1024*1024)

#include <windows.h>
#include <stdio.h>

int main()
{
  int nallocs = TWOGB/ALLOCSIZE;
  for ( int i = 0; i < nallocs+200; i++ )
  {
   void * p = VirtualAlloc(NULL, ALLOCSIZE, MEM_RESERVE, PAGE_NOACCESS);
   if ( i%100 == 0)
   {
     if ( p != NULL )
       printf("%d: %p\n", i, p);
     else
     {
       printf("%d: failed!\n", i);
       break;
     }
   }
  }
  printf("finished VirtualAlloc. Loading  a DLL.\n");
  //getchar();
  HMODULE hDll = LoadLibrary("winhttp");

  printf("DLL base: %p.\n", hDll);
  //getchar();
  FreeLibrary(hDll);
}

在Win10 x64上产生:

0: 00D80000
100: 03950000
200: 03F90000
[...]
31800: 7FBC0000
31900: 00220000
32000: 00860000
32100: 80140000
32200: 80780000
32300: 80DC0000
32400: 81400000
32500: 81A40000
32600: 82080000
32700: 826C0000
32800: 82D00000

32900: 83340000
finished VirtualAlloc. Loading  a DLL.
DLL base: 83780000.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

要使32位应用程序在64位Windows 7上使用2GB以上的内存?

当 x=0x80000000,y = 1(32 位补码)时,为什么 `x - y <= x` 为真?

为什么0 <-0x80000000?

VPS上是否有2GB RAM的32或64位OS?

无法在Windows 7 32位PC上加载SQLite DLL

PHP(32位)2GB范围下载

BIOS已安装并检测到3GB RAM,仅Windows Vista 32位可看到2GB

Android VideoView setDataSource失败。:status = 0x80000000

为什么1不大于-0x80000000

为什么0x80000000和它的长格式不同?

2GB系统上的64位OS的开销

内存:2GB + 4GB是否比32位仅4GB好?

Win32 32位进程加载64位kernel32.dll

减去 0x1 - 0x80000000 如何导致溢出?

为什么32位进程的RAM限制为2 GB?

Ubuntu 32位仅适用于“ RAM小于2GB”的系统吗?

在 ubuntu 20.04 上只能识别 2GB 的 32GB RAM

有符号和无符号整数表达式与0x80000000之间的比较

为什么不能使用“ 0x80000000”来初始化int数组?

如何在 VS2019 中将 -0x80000000 分配给 long long 变量?

定义(1 << 31)还是使用0x80000000?结果不一样

2GB以上可加快单个表上的SQL查询

为什么在64位Windows上,将64位DLL转到System32,将32位DLL转到SysWoW64?

在Windows上用PHP模块启动Apache时出错:“无法将php5apache2_4.dll加载到服务器中:访问被拒绝”

如何将具有2GB分区的32GB USB闪存驱动器缩小/调整为2GB图像文件?

jmvfw.dll:无法在AMD 64位平台上加载IA 32位.dll

正确地将24位位图数据加载到32位位图对象中

当Windows 7似乎免费提供2GB以上的内存时,为什么Windows 7会说我的内存不足?

在 2GB USB 上的现有 Ubuntu 18.04.5 上安装 Windows 10