程序程序如何调用dllL后DLL怎么通知程序一些信息

求助!!怎么让程序缺少dll,还能继续运-中国学网-中国IT综合门户网站
> 信息中心 >
求助!!怎么让程序缺少dll,还能继续运
来源:互联网 发表时间: 0:49:07 责任编辑:李志喜字体:
为了帮助网友解决“求助!!怎么让程序缺少dll,还能继续运”相关的问题,中国学网通过互联网对“求助!!怎么让程序缺少dll,还能继续运”相关的解决方案进行了整理,用户详细问题包括:我的一个程序在自动升级时会出现丢失dll的情况,我是想当系统报错时,可以通知应用程序,让它做相应的处理,重新升级也好或手工升级也行,不知道还有没有什么好的方法,各位大虾帮帮忙!!!加载dll的方法是用引入库的,具体解决方案如下:解决方案1:除非你有源码把引用dll的地方删除。否则&不太可能。&对你表示同情。解决方案2:加载前检查一下文件即可解决方案3:引用&2&楼&nantony&的回复:加载前检查一下文件即可那检查的程序要放在哪个位置呢??缺少时dll又没办法进入程序中解决方案4:写一个独立的升级程序,升级的时候主程序关掉,启动升级程序。升级完成以后检查文件完整,再自动启动主程序,否则通知用户重新升级解决方案5:引用&4&楼&goddy123&的回复:写一个独立的升级程序,升级的时候主程序关掉,启动升级程序。升级完成以后检查文件完整,再自动启动主程序,否则通知用户重新升级很多网络游戏都是这么办的。
3个回答1个回答2个回答2个回答1个回答2个回答3个回答1个回答2个回答1个回答1个回答1个回答1个回答1个回答1个回答7个回答1个回答1个回答1个回答
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号2016计算机应用对于设备驱动程序通知应用程序的几种方法
更新时间:&&&&&&&&
来源:网络&&&&&&&&
&&&&&&&&字数:2500字
【看准网()】计算机论文频道小编搜集的范文“2016计算机应用对于设备驱动程序通知应用程序的几种方法”,供大家阅读参考,查看更多相关论文 ,请访问计算机论文频道。
精品学习网小编为你提供论文范文:“计算机应用对于设备驱动程序通知应用程序的几种方法”,大家可以结合自身的实际情况写出论文。计算机应用对于设备驱动程序通知应用程序的几种方法为了保证操作系统的平安性和稳定性以及应用程序的可移植性,Windows操作系统不答应应用程序直接访问系统的硬件资源,而是必须借助于相应的设备驱动程序。设备驱动程序可以直接操作硬件,假如应用程序和设备驱动程序之间实现了双向通信,也就达到了应用程序控制底层硬件设备的目的。它们之间的通信包括两个方面摘要:一方面是应用程序传送给设备驱动程序的数据;另一方面是设备驱动程序发送给应用程序的消息。前者的实现较轻易,通过CreateFile()函数获取设备驱动程序的句柄后,就可以使用Win32函数,如DeviceIoControl()、ReadFile()或WriteFile()等实现应用程序和设备驱动程序之间的通信。后者的实现远比前者复杂,同时介绍这方面情况的文章较少。这不等于说它不重要,相反,它在有些应用场合发挥着重要的功能。设备驱动程序完成数据的采集工作后,需要马上通知应用程序,以便应用程序能够及时将数据取走并进行处理。诸如此类情况,不一而足。   鉴于设备驱动程序通知应用程序的重要性,本人结合一些经验,对它进行了总结,归纳出5种方法摘要:异步过程调用(APC)、事件方式(VxD)、消息方式、异步I/O方式和事件方式(WDM)。下面分别说明这几种方式的原理,并给出实现的部分源代码。   1 异步过程调用(APC)   Win32应用程序使用CreateFile()函数动态加载设备驱动程序,然后定义一个回调函数backFunc(),并且将回调函数的地址%26backFunc()作为参数,通过DeviceIoControl()传送给设备驱动程序。设备驱动程序获得回调函数的地址后,将它保存在一个全局变量(如callback)中,同时调用Get_Cur_Thread_Handle()函数获取它的应用程序线程的句柄,并且将该句柄保存在一个全局变量(如appthread)中。当条件成熟时,设备驱动程序调用_VWIN32_QueueUserApc()函数,向Win32应用程序发送消息。这个函数带有三个参数摘要:第一个参数为回调函数的地址(已经注册);第二个参数为传递给回调函数的消息;第三个参数为调用者的线程句柄(已经注册)。Win32应用程序收到消息后,自动调用回调函数(实际是由设备驱动程序调用)。回调函数的输入参数是由设备驱动程序填入的,回调函数在这里主要是对消息进行处理。   2 事件方式(VxD)   首先,Win32应用程序创建一个事件的句柄,称其为Ring3句柄。由于虚拟设备驱动程序使用事件的Ring句柄,因此,需要创建Ring句柄。用LoadLibrary()函数加载未公开的动态链接库Kernel32.dll,获得动态链接库的句柄。然后,调用GetProcAddress(), 找到函数OpenVxDHandle()在动态链接库中的位置。接着,用OpenVxDHandle()函数将Ring3事件句柄转化为Ring事件句柄。Win32应用程序用CreateFile()函数加载设备驱动程序。假如加载成功,则调用DeviceIoControl()函数将Ring事件句柄传给VxD;同时,创建一个辅助线程等待信号变成有信号状态,本身则可去干其它的事情。当条件成熟时,VxD置Ring事件为有信号状态(调用_VWIN32_SetWin32Event()函数),这马上触发对应的Ring3事件为有信号状态。一旦Ring3事件句柄为有信号状态,Win32应用程序的辅助线程就对这个消息进行相应的处理。
  3 消息方式   Win32应用程序调用CreateFile()函数动态加载虚拟设备驱动程序。加载成功后,通过调用DeviceIoControl()函数将窗体句柄传送给VxD,VxD利用这个句柄向窗体发消息。当条件满足时,VxD调用SHELL_PostMessage()函数向Win32应用程序发送消息。要让该函数使用成功,必须用#define来自定义一个消息,并且也要照样在应用程序中定义它;还要在消息循环中使用ON_MESSAGE()来定义消息对应的消息处理函数,以便消息产生时,能够调用消息处理函数。SHELL_PostMessage()函数的第一个参数为Win32窗体句柄,第二个参数为消息ID号,第三、四个参数为发送给消息处理函数的参数,第五、六个参数为回调函数和传给它的参数。Win32应用程序收到消息后,对消息进行处理。4 异步I/O方式   Win32应用程序首先调用CreateFile()函数加载设备驱动程序。在调用该函数时,将倒数第2个参数设置为FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,表示以后可以对文件进行重叠I/O操作。当设备驱动程序文件创建成功后,创建一个初始态为无信号、需要手动复位的事件,并且将这个事件传给类型为OVERLAPPED的数据结构(如Overlapped)。然后,将Overlapped作为一个参数,传给DeviceIoControl()函数。设备驱动程序把这个I/O请求包(IRP)设置为挂起状态,并且设置一个取消例程。假如当前IRP队列为空,则将这个IRP传送给StartIo()例程;否则,将它放到IRP队列中。设备驱动程序做完这些工作后,结束这个DeviceIoControl()的处理,于是Win32应用程序可能不等待IRP处理完,就从DeviceIoControl()的调用中返回。通过判定返回值,得到IRP的处理情况。假如当前IRP处于挂起状态,则主程序先做一些其它的工作,然后调用WaitForSingleObject()或WaitForMultipleObject()函数等待Overlapped中的事件成为有信号状态。设备驱动程序在适当的时候处理排队的IRP,处理完成后,调用IoCompleteRequest()函数。该函数将Overlapped中的事件设置为有信号状态。Win32应用程序对这个事件马上进行响应,退出等待状态,并且将事件复位为无信号状态,然后调用GetOverlappedResult()   函数获取IRP的处理结果。   5 事件方式(WDM)   Win32应用程序首先创建一个事件,然后将该事件句柄传给设备驱动程序,接着创建一个辅助线程,等待事件的有信号状态,自己则接着干其它事情。设备驱动程序获得该事件的句柄后,将它转换成能够使用的事件指针,并且把它寄存起来,以便后面使用。当条件具备后,设备驱动程序将事件设置为有信号状态,这样应用程序的辅助线程马上知道这个消息,于是进行相应的处理。当设备驱动程序不再使用这个事件时,应该解除该事件的指针。   6 结语   在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口。它向上提供和硬件无关的用户接口,向下直接进行I/O、硬件中断、DMA和内存访问等操作。它将应用程序和硬件细节屏蔽开来,使软件不依靠于硬件并且可在多个不同的平台之间移植。本文介绍了5种设备驱动程序通知应用程序的方法,其中前3种方法主要用于VxD中,后2种方法主要用于WDM。这5种方法都经过实际测试。测试结果表明,它们都能够达到设备驱动程序通知应用程序的目的。 以上就是我们为您准备的“计算机应用对于设备驱动程序通知应用程序的几种方法”,更多内容请点击精品学习网论文频道。
看了这篇文章的还看了
精品学习网为您提供&试析基于X3D的虚拟植物建模和可视化探究&解决您在写计算机应用论文中的难题试析基于X3D的虚拟植物建模和可视化探究1 X3D虚拟现实技术概述  虚拟现 实 (Virtual Reality)是2世 界 8年代初由VPL Research公司创始人 Jaron Lanier提出的。已广泛应 用...…
&计算机应用研究简述计算机专业如何实施双语教学&怎么写呢,请看精品学习网小编为大家整理的范文计算机应用研究简述计算机专业如何实施双语教学当今全球化、国际化对我国教育的影响越来越突出,国际化已经成为学校办学水平的重要体现。教育部在21年的4号文件《有关加强高等学校本科...…
无论是&宏观原理&还是&微观原理&,都需要管理学的原理作基础来加以学习和研究,管理学是各门具体的或专门的管理学科的共同基础本文以汇总的形式向大家展现了浅谈旅游业转型升级论文等旅游管理类论文。详情如下:
管理学:旅游管...…
与观光旅游相适应的旅游地产产品形态&住宅+景区&的简单形式已不能满足现代休闲、度假市场的需求。传统的旅游消费、旅游景区、旅游地产面临着转型升级。 详细内容请看下文浅谈旅游综合体开发一种旅游。即旅游消费模式从单一观光旅游到综合休闲度假旅游发展,景区发展模式从单一开发...…
2世纪5年代以来,世界范围内发生了三次大规模产业转移,在这三次浪潮中转移地、承接地从美国向日本, 下面是编辑老师为大家准备的浅谈旅游业转型升级。从日本向亚洲&四小龙&等新兴工业化国家,从发达国家向中国等发展中国家依次进行。随着区域经济一体化的深入发展,新一轮国际国内...…
论文热门标签
友情链接链接合作QQ:下次自动登录
现在的位置:
& 综合 & 正文
如何查看一个运行的exe执行程序需要有哪些DLL动态链接库
如何查看一个运行的exe执行需要有哪些DLL动态链接库
打开“360安全卫士”软件
笔者的360安全卫士的版本是:8.8
打开“功能大全”菜单
运行“360任务管理器”。
用鼠标选中查看需要分析的exe执行程序。
鼠标点击“显示进程加载的模块”
显示正在运行的exe所包含的动态链接库DLL以及引用的库文件所在的位置
【笔者注】
笔者在VS2008分析一段,在一个DLL动态链接库的设置了断点,结果显示是灰色的,不是红色的,不能进行中断调试。
移到断点上一看,显示"当前不会命中断点。还没有为该文档加载任何符号"。折腾了2个多小时,最终发现哪个应用进程,根本就不调用这个动态链接库。所以,设置的断点,就根本不起作用。
&&&&推荐文章:
【上篇】【下篇】APIHook从基础讲起,新手手册;注:本文是根据我两年前写的一个系统行为监测程序写;学习各种外挂制作技术,马上去百度搜索&;基本原理;APIHook是什么我就不多说了,直接进入正题;DLL_PROCESS_ATTACH通知,Use;显然使用这种方法要求设置注册表之后立刻重起系统,;可以使用SetWindowsHookEx(WH_;使用Create
APIHook从基础讲起,新手手册。
注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章)。最近在论坛上看到有不少人在问关于APIHook的问题,便写成此文,希望能对朋友们在写APIHook代码的时候能够有所帮助。
学习各种外挂制作技术,马上去百度搜索&魔鬼作坊&点击第一个站进入、快速成为做挂达人。
APIHook是什么我就不多说了,直接进入正题。APIHook技术主要有下面的技术难点:这种方法可以指定多个DLL,用空格隔开。这些DLL会被任何用到User32.dll的所有程序自动加载。当User32.dll加载的时候,User32.dll的DllMain会收到一个
DLL_PROCESS_ATTACH通知,User32在这个时候读取注册表项中的值,调用LoadLibrary加载各个DLL。
显然使用这种方法要求设置注册表之后立刻重起系统,不过一般情况下这不是大问题。这种方法的主要问题在于,只有用到User32.dll的应用程序才会被Inject。所有的GUI和少部分CUI程序会用到User32.dll,所以如果你的APIHook程序不打算监视CUI程序的话,那么可能问题并不太大。但是如果你的APIHook程序需要监视系统中所有进程的话,这种方法的限制将是非常致命的。
可以使用SetWindowsHookEx(WH_GETMESSAGE,…,0)设置全局的消息钩子,虽然可能你的程序并不用到消息钩子,但是钩子的一个副作用是会将对应的DLL加载到所有的GUI线程之中。类似的,只有用到GUI的进程才会被挂接。虽然有这种限制,这种方法仍然是最常用的挂接进程的方法。
使用CreateRemoteThread函数在目标进程中创建远程线程
这种方法可以在任意的目标进程中创建一个远程线程,远程线程中可以执行任意代码,这样便可以做到把我们的代码Inject到目标进程中。这种方法具有最大的灵活性,但是难度也最高:
a)远程线程代码必须可以自重定位
b)要能够监视进程的启动和结束,这样才可以挂接到所有进程
这两个问题都是可以解决的,在本文中我将重点讲述如何创建远程线程和解决这两个问题。如果你只是要挂接某个特定进程的并且情况允许你自己来创建此进程,你可以调用CreateProcess(…,CREATE_SUSPENDED)创建子进程并暂停运行,然后修改入口代码使之调用LoadLibrary加载自己的DLL。该方法在不同CPU之间显然是无法移植的。
找到API函数在内存中的地址,改写函数头几个字节为JMP指令跳转到自己的代码,执行完毕再执行API开头几个字节的内容再跳回原地址。这种方法对CPU有较大的依赖性,而且在多线程环境下可能出问题,当改写函数代码的时候有可能此函数正在被执行,这样做可能导致程序出错。
修改PE文件的IAT(ImportAddressTable),使之指向自己的代码,这样EXE/DLL在调用系统API的时候便会调用你自己的函数
PE文件结构和输入函数
Windows9x、WindowsNT、Windows2000/XP/2003等操作系统中所使用的可执行文件格式是纯32位PE(PortableExecutable)文件格式,大致如下:
文件中数据被分为不同的节(Section)。代码(.code)、初始化的数据(.idata),未初化的数据(.bss)等被按照属性被分类放到不同的节中,每个节的属性和位置等信息用一个IMAGE_SECTION_HEADER结构来描述。所有的这些IMAGE_SECTION_HEADER结构组成一个节表(SectionTable),这个表被放在所有节数据的前面。由于数据按照属性被放在不同的节中,那么不同用途但是属性相同的数据可能被放在同一个节中,因此PE文件中
还使用IMAGE_DATA_DIRECTORY数据目录结构来指明这些数据的位置。数据目录和其他描述文件属性的数据和在一起称为PE文件头。PE文件头被放在节和节表的前面。PE文件中的数据位置使用RVA(RelativeVirtualAddress)来表示。RVA指的是相对虚拟地址,也就是一个偏移量。当PE文件被装入内存中的时候,Windows把PE文件装入到某个特定的位置,称为映像基址(ImageBase)。而某个RVA值表示某个数据在内存中相对于映像基址的偏移量。
输入表(ImportTable)是来放置输入函数(Importedfunctions)的一个表。输入函数就是被程序调用的位于外部DLL的函数,这些函数称为输入函数。它们的代码位于DLL之中,程序通过引用其DLL来访问这些函数。输入表中放置的是这些函数的名称(或者序号)以及函数所在的DLL路径等有关信息。程序通过这些信息找到相应的DLL,从而调用这些外部函数。这个过程是在运行过程中发生的,因此属于动态链接。由于操作系统的API也是在DLL之中实现的,因此应用程序调用API也要通过动态连接。在程序的代码中,当需要调用API的时候,就执行类似下面语句:
0040100ECALL0040101A
可以看到这是一个call语句。Call语句则调用下面的语句:
0040101AJMPDWORDPTR[]
上面的代码称为桩代码(Stubcode),jmp语句中的目标地址[]才是API函数的地址。这段Stubcode位于.lib输入库中。如果加以优化,那么调用代码是下面这样:XXXXXXXXCALLDWORDPTR[XXXXXXXX]
其中[XXXXXXXX]指向IAT(ImportAddressTable)即输入地址表中的表项。表项中指定了API的目标地址。这是经过编译器优化过的调用方法,通常速度要比原来的CALL+JMP快一些。
从上面的PE文件结构可知,当我们知道了IAT中的地址所在位置,便可以把原来的API的地址修改为新的API的地址。这样,进程在调用API的时候就会调用我们所提供的新的API的地址。修改输入表可以通过调用ImageDirectoryEntryToDataAPI函数得到内存中模块的输入表的地址:
PIMAGE_IMPORT_DESCRIPTORpid=(PIMAGE_IMPORT_DESCRIPTOR)
ImageDirectoryEntryToData(
IMAGE_DIRECTORY_ENTRY_IMPORT,
这个函数返回一个IMAGE_IMPORT_DESCRIPTOR的指针,指向输入描述符数据。然后,遍历该描述符表通过比较DLL名称查找到相应的DLL所对应的IMAGE_IMPORT_DESCRIPTOR:
//ifthisimagehasnoimportsection,justsimplyreturnanddonothing
if(pid==NULL)
//findthecorrespondingitem
while(pid-&Name)
//pid-&NamecontainstheRVAaddrofthemodulenamestring
PSTRpszModName=(PSTR)((PBYTE)hModule+pid-&Name);
if(lstrcmpiA(pszModuleName,pszModName)==0)
if(pid-&Name==0)
//notfound,justreturn
找到相应的DLL之后,遍历其IAT表,根据地址pfnCurrentFuncAddr找到相应的表项,修改之
//getcaller'simportaddresstable(IAT)forthecallee'sfunctions
PIMAGE_THUNK_DATApThunk=(PIMAGE_THUNK_DATA)((PBYTE)hModule+pid-&FirstThunk);
while(pThunk-&u1.Function)
PROC*ppfnEntry=(PROC*)&(pThunk-&u1.Function);
包含各类专业文献、生活休闲娱乐、幼儿教育、小学教育、行业资料、应用写作文书、文学作品欣赏、专业论文、90API Hook 从基础讲起,新手手册。等内容。 
 API Hook完全手册 22页 免费 HOOK API 函数跳转详解...Detours API HOOK快速入门 6页 免费 API拦截 22页...这种 方法的基础主要是基于这样的事实,即所有的 32...  API Hook完全手册 22页 免费 API Hook应用简述 6页...我们需要从“可选头”尾的“数据目录”数组中的第...中医护理学基础重点 执业医师实践技能考试模拟试题80份...  Detours API HOOK快速入门_IT/计算机_专业资料。Detours...什么是 Detours 简单地说,Detours 是微软提供的一个...hook api技术 7页 2下载券 API Hook完全手册 22...  脱壳基础知识入门现在加解密发展己形成 2 个分支了, 一个就是传统的算法, 另...从这点来说,加壳 的 DLL 比加壳的 EXE 更难修正。 4)HOOK-API 程序文件中...  API Hook完全手册 22页 免费 各类HOOK很牛的 2页...所 以说,api hook 并不是什么特别不同的 hook,...从它中的 VirtualAddress 地址,“顺藤摸瓜” 找到...  就 Windows 9x 而言,16 位 DLL 与 32 位 DLL 的 API Hook 代码也完全不相同。 API HOOK 入门 API Hook 是一项有趣而实用的 Windows 系统编程技术, 应用...  API Hook完全手册 15页 1财富值 Windows+API+HOOK通用框架... 39页 1财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行...  API HOOK实例剖析_IT/计算机_专业资料。API HOOK 实例剖析 关于 APIHOOK 的基础知识有很多,如 dll 的相关知识、Hook 的相关知识、系统 进程与线程之间的联系等。...  GDAL开发手册--基础API的介绍和一些入门_IT/计算机_专业资料。能够让你短时间快...注意, 上面所说的点/线坐标系是从左上角(0,0)点到右下角,也就是坐标轴...

我要回帖

更多关于 64位程序调用32位dll 的文章

 

随机推荐