摘要:
一、TLS简述 我们知道在一个进程中,所有线程是共享同一个地址空间的。所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线程对其进行了修改,也就会影响到其他所有的线程。不过我们可能并不希望这样,所以更多的推荐用基于堆栈的自动变量或函数参数来访问数据,因为基于堆栈的变量总是 阅读全文
摘要:
一、函数转发器 函数转发器是D L L的输出节(导出段)中的一个项目,用于将对一个函数的调用转至另一个 DLL中的另一个函数。 可以在DLL中使用函数转发器: #pragma comment(linker,"/export:SomeFunc=Dll.SomeOtherFunc") // SomeFu 阅读全文
摘要:
延迟加载的 DLL 是个隐含链接的 DLL,它实际上要等到你的代码试图引用 DLL 中包含的一个符号时才进行加载。 DLL延迟加载技术的原理,就是从导入表中去掉某dll这一项,等到正式调用DLL的时候,才会加载DLL文件。 应用场景: 应用初始化加载的DLL过多,导致程序初始化时间过长。使用延迟加载 阅读全文
摘要:
如果在执行一些与进程或者线程有关的初始化或者销毁工作的时候,需要 DllMain。如果只需要创建一个包含资源的DLL,不需要这个函数。 B00L WINAPI DllMain(HINSTANCE hinstDll,DWORD fdwReason,PVOID fImpLoad) { switch (f 阅读全文
摘要:
FAPPROC GetProcAddress(HMOUDLE hInstDll,PCSTR pszSymbolName); 1.根据名称 FARPROC FunctionAddress = (ULONG_PTR)GetProcAddress(ModuleBase, "SomeFuncInDll"); 阅读全文
摘要:
一、显式加载DLL模块使用函数 LoadLibrary/LoadLibraryEx HINSTANCE LoadLibrary(PCTSTR pSzDLLPathName); HINSTANCE LoadLibraryEx(PCTSTR pSzDLLPathName,HANDLE hF1le,DWO 阅读全文
摘要:
部分笔记来自于:https://blog.csdn.net/blade1080/article/details/81364161 注:关于DLL存放位置,一般是放到可执行文件的目录下。 下面时加载程序的搜索顺序: 1) 包含可执行映像文件的目录。 2) 进程的当前目录。 3) Windows系统目录 阅读全文
摘要:
Windows 中最重要的三个DLL是: Kernel32.dll:包含的函数用来管理内存、进程以及线程 User32.dll:包含的函数用来执行和用户界面相关的任务 GDI32.dll:包含的函数用来绘制图像和显示文字 将DLL文件映射到进程空间有两种方法:隐式载入时链接、显示运行时链接 如下图, 阅读全文
摘要:
Windows 提供了以下三种机制来对内存进行操控虚拟内存:最适合用来管理大量对象数组或者大型数据结构内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间的共享数据。堆:最适合用来管理大量的小型对象。 最后一种对内存进行操控的方法是堆。堆适合分配大量小型数据,是管 阅读全文