Articles of DLL

在Windows XP上运行应用程序时出现“指定的程序无法find”错误(例外c0000139)

我们有一个在Vista和Win7上运行良好的DLL一段时间,但是当在XP上运行时,当调用LoadLibrary()来加载它时,我们得到错误“无法find指定的过程” 。 我已经试过通过configuration文件选项Dependency Walker运行它,全球标志设置为显示加载程序捕捉和唯一看似有用的信息,我可以从它是: LDR: Snapping imports for MyDll.dll from KERNEL32.dll LDR: LdrGetProcedureAddress by NAME – RtlGetLastWin32Error LDR: exception c0000139 thrown within function LdrpSnapIAT Exception record: 0012E490 Context record: 0012E4A4 Context->Eip = 7C9673BE Context->Ebp = 0012E7C0 Context->Esp = 0012E770 LDR: LdrpSnapIAT – caught exception c0000139 snapping thunks (#2) LDR: LdrpWalkImportTable – LdrpSnapIAT #2 failed with […]

来自另一个DLL的LoadLibrary

在MSDN中描述的DLL查找path是: 当前进程的可执行模块所在的目录。 当前目录。 Windows系统目录。 GetSystemDirectory函数检索此目录的path。 Windows目录。 GetWindowsDirectory函数检索此目录的path。 PATH环境variables中列出的目录。 这带来了以下疑问: 假设我在某个目录下有一个可执行文件,例如: c:\execdir\myexe.exe ,它会加载一个在PATHfind的DLL,位于c:\dlldir\mydll.dll 。 现在,假设mydll.dll尝试使用LoadLibrary加载另一个DLL。 首先查看哪个目录 – c:\dlldir或c:\execdir ? 我认为上面引用的查询规则说它将会是c:\execdir因为这被称为“当前进程的可执行模块所在的目录”,但是从另一个来源获得确认将是很好的。 编辑:另外,是c:\dlldir\ 在所有看 ? 毕竟,它既不是.exe所在的位置,也不是“当前目录”(如果这是一般意义上的)。 PS我对Windows XP和7都感兴趣。

参数对象的成员variables的内存地址在调用dll函数时发生变化

class SomeClass { //一些成员 MemberClass one_of_the_mem_; } 我有一个函数foo( SomeClass *object )在一个DLL中,它是从一个EXE调用。 问题 one_of_the_mem_地址在调用dll调用期间发生变化。 详情 : 呼叫之前 (从EXE): '&(this).one_of_the_mem_' – `0x00e913d0` 之后 – 在dll本身: '&(this).one_of_the_mem_' – `0x00e913dc` 对象的地址保持不变。 每次只有地址移动的成员。 我想要一些关于如何解决这个问题的指针。 代码: 来自Exe的代码 stat = module-> init(this,object_a,&object_b,object_c,con_dir); 在DLL中的代码 Status_C ModuleClass( SomeClass *object, int index, Config *conf, const char* name) { _ASSERT(0); //DEBUGGING HOOK … 更新1: 我根据迈克尔的指示比较了成员的抵消,在两种情况下他们都是一样的。 更新2: […]

知道.lib是静态还是导入

我有从C代码编译的.lib文件。 我怎么知道这个独立的静态库,或只是一个导入库和DLL将在运行时需要? 有一些我丢失的dumpbin选项吗?

WinDbg Dr. Watson minidump – 需要最初为安装的版本生成的pdb / dll?

我有一个目标的应用程序崩溃mindmp文件。 我有可能重build一个版本的软件的dll / pdb文件,并正确windbg加载符号? 我的问题是,我们的pdb文件只保留主要版本(不幸)。 这是一个每天构build,我可以重build我自己,但我越来越绊倒在错误。 使用!sym嘈杂:“图像标题与内存图像标题不匹配”。 DBGENG: C:\…\XXX.dll image header does not match memory image header. DBGENG: XXX.dll – Partial symbol image load missing image info DBGHELP: Module is not fully loaded into memory. DBGHELP: Searching for symbols using debugger-provided data. DBGHELP: C:\…\XXX.pdb – mismatched pdb 注意我已经用dll编译了pdb,它们来自同一个RELEASE目录(我应该构builddebugging吗?) 这些是发布版本(因为发布版本安装在目标和崩溃)我应该以某种方式使用debugging版本DLL获取更多的符号信息?

ASLR和Windows系统DLL的非感知可执行文件?

从微软的文章 : 地址空间布局随机化(ASLR) 当系统引导时,ASLR将可执行映像移动到随机位置,使得利用代码难以可预测地运行。 对于支持ASLR的组件,它所加载的所有组件也必须支持ASLR。 例如,如果A.exe使用B.dll和C.dll,则三者都必须支持ASLR。 默认情况下,Windows Vista和更高版本将随机化系统DLL和EXE ,但由ISV创build的DLL和EXE必须select使用/ DYNAMICBASE链接器选项来支持ASLR。 我不太明白。 以WIndows上的每个进程加载基本系统DLL: NtDll.dll和kernel32.dll 。 如果有一个不知道的可执行文件,这些系统DLL会使用ASLR吗? 也就是说,在Win 7上每次系统重新启动后,它们会在这个可执行文件中加载到不同的基地址,还是像Win XP一样在系统重启之后总会加载相同的基址? 为了更清楚我的意思:我典型的虚拟程序的启动堆栈如下所示: write_cons.exe!wmain() Line 8 C++ write_cons.exe!__tmainCRTStartup() Line 583 + 0x19 bytes C write_cons.exe!wmainCRTStartup() Line 403 C > kernel32.dll!_BaseProcessStart@4() + 0x23 bytes 看看BaseProcessStart的asm,我在我的XP机器上看到: _BaseProcessStart@4: 7C817054 push 0Ch 7C817056 push 7C817080h 7C81705B call __SEH_prolog (7C8024D6h) 7C817060 and dword ptr […]

是否有一个最佳实践指南,分发Windows本地C库?

有没有人知道部署本机(没有COM,没有.NET)ANSI C Windows共享库的最佳实践指南? 我们的产品使用zlib,我们在我们的下载页面上发布与官方zlib页面不同的预构build二进制文件。 我猜测这是为了避免混合C运行时 。 官方的是使用VC ++ 6.0构build的msvcrt,VS.NET/2005/2008将使用msvcrt71 / 80/90。 我想要做的是创buildVS2005 / 8解决scheme和项目,以便为我们正确构buildzlib并将它们分发到我们现在拥有的位置。 我想仔细地做这件事,并分发一个适当的有用的包,我也可以发送给zlib的策展人包括在他们的源代码发行。 但是,find可靠的信息已经certificate很麻烦。 我有一大堆关于Win32编程的书,我在网上发现了很多文章,但是这些文章似乎都没有详细描述你真正需要发布的东西。 例如,zlib分发.exp,.lib存根和.def文件,其中fftw分发.def文件,但不分发.lib存根和.exp文件。 我想我可以把所有在那里看起来有用的东西(或者只是镜像官方的zlib),但是我想知道为什么它必须在那里以及它属于哪个目录。 是否有很好的例子来源于unix世界的维护良好的Windows发行版? 官方zlib二进制发行版(向下滚动) 我们的Windows发行版 澄清: 我们发布一个库,并提供zlib(主要)Windows用户,因为他们通常没有它可用。 我希望我们的zlib版本能够作为一般的组件使用,而不仅仅是作为我们的产品消耗的.dll。 我们是开放源代码并被广泛使用,因此我们希望使我们的整个构build环境可用,并且可以轻松地适应任何您想要使用的编译器。

非COM,非.NET DLL的正确名称?

在Windows世界里,一个好东西的正确名称是什么。 老式的C + + DLL与导出的function? 不是一个COM DLL,而不是一个.NET DLL。 我们通过调用LoadLibrary()和GetProcAddress()调用的那种DLL? 我一直称它们为“平坦的DLL”,因为调用者不能从DLL实例化对象,但是什么是正确的名字? 编辑 感谢您的答案。 只是“DLL”在技术上可能是正确的,但是在我工作的地方,每个人都假设“DLL”意味着COM,或者推着.NET,所以我需要一个术语来区分我的意思。

可执行文件加载相同的DLL已经加载的DLL

我即将开始对我的项目进行重大修改,我只是想澄清一些事情,因为我认为我的devise可能有些复杂。 我有一个可执行文件加载一个dll,让我们调用这个dll1,然后加载dll2。 该可执行文件也加载dll2。 我问的是,我有两个dll2的全局和静态成员variables的实例,第二次加载的dll2发生,或者可执行只有加载1 dll2,即使dll2是由不同的DLL加载? 我知道我应该只有一个dll2的代码在内存中的副本,这很好。 这是我感兴趣的全局和静态variables。

使用C的dll注入

嘿,即时通讯试图注入一个DLL进程,即lsass.exe获取哈希。它有点哈克,但不能帮助我的项目。 我有一个DLL注入的代码,但在Visual C ++中,它给出了错误,如.. 在TEXT(“LoadLibraryA”))))—- >>>参数const wchar与LPCSTR不兼容 在lpFuncAddr ———– >>>参数types“LPVOID”与参数types“LPTHREAD_START ROUTINE”不兼容 码: BOOL InjectDLL(DWORD dwProcessId, LPCSTR lpszDLLPath) { HANDLE hProcess, hThread; LPVOID lpBaseAddr, lpFuncAddr; DWORD dwMemSize, dwExitCode; BOOL bSuccess = FALSE; HMODULE hUserDLL; //convert char to wchar char *lpszDLLPath = "hash.dll"; size_t origsize = strlen(orig) + 1; const size_t newsize = 100; size_t convertedChars = […]