forked from dmoulding/vld
-
Notifications
You must be signed in to change notification settings - Fork 321
Open
Description
#include <windows.h>
#include <thread>
#include <chrono>
#include <memory>
int main(int argc, wchar_t *argv[]) {
for (int i = 0; i < 0x40; ++i)
TlsAlloc();
HMODULE h_vld = LoadLibraryA("vld.dll");
typedef void(*vld_enable_t)(void);
auto vld_enable = (vld_enable_t)::GetProcAddress(h_vld, "VLDGlobalEnable");
vld_enable();
std::thread([]() {std::make_shared<int>(); }).join();
return 0;
}
当内存分配发生时,VLD将信息存储在其TLS插槽中,以避免争用并降低性能影响。当VLD被分配了一个TLS插槽= 0x40,并且内存分配发生在一个没有扩展TLS的线程中时,从VLD访问TLS插槽将触发另一个TLS扩展。
但是,扩展会调用RtlAllocateHeap来分配内存,而这次内存分配的记录会被VLD保存到TLS槽中,这会再次触发另一次TLS扩展......这样,程序就会进入无限递归。
由于某些限制,我只能在我的程序中使用dll中的vld,这使我无法在程序开始时的入口点初始化vld。我该怎么办?
Metadata
Metadata
Assignees
Labels
No labels