1.Windows蓝屏代码列表
2.PandPdfJz2.dll是什么文件?
3.深入浅出windows驱动开发的目录
4.bat批量处理结束进程:杀毒软件是怎样做到不被终止的?比如我用taskkill /pid * 。或者
5.任务管理器的高手问题
6.Linux系统移植的目录
教你如何删除顽固文件
核心提示: 大家是否遇到删除文件的时候会提示“文件正在被使用”,或者提示删除了,但是一刷新,它又在那里了。 而有一些文件根本就看不见,无论是通过管理器还是其它方式都看不到,更就没有办法删除了。 下面我们就来探讨一下这个问题。
大家是否遇到删除文件的时候会提示“文件正在被使用”,或者提示删除了,但是一刷新,它又在那里了。
而有一些文件根本就看不见,无论是通过管理器还是其它方式都看不到,更就没有办法删除了。
下面我们就来探讨一下这个问题。
在windows下,一个正常共享打开或被使用的文件,是不能被删除的。当删除的时候,
会提示“无法删除,文件正在被使用”。常见的就是流氓软件的各种.dll或者.exe进程或者.sys驱动文件。
所以删除文件之前,需要解除使用这个文件的句柄或者加载它的.exe进程。
一、常规方法
只是很简单的介绍一下,只是利用系统自带的功能。高手可以跳过。
1.结束进程再删除。删除文件时如果系统提示“文件正在使用”,首先检查一下是否没有退出与被删文件相关的程序,再看看系统进程中是否还有相关进程保留。
2.重启后或换个系统再删除。使用多系统的朋友可以切换到另外一个系统中执行删除操作,这招比较有效。
3.结束掉Explorer进程后再删除。按下Ctrl+Alt+Del键打开任务管理器,切换到“进程”选项卡,结束掉Explorer进程,这时候桌面会丢失,不用着急,运行“文件→新任务”,输入“cmd”后回车打开命令行窗口,进入待删文件所在目 录,用RD或delete命令删除即可。删除完毕后再次运行“文件→新任务”命令,输入“explorer”后回车,桌面又回来了.
4.关闭预览功能再删除。如果你在管理器中使用了、的预览功能,那么在删除此类文件时常常不成功,解决的办法是关闭该功能:Windows XP用户在“开始→运行”中输入“regsvr32 /u shmedia.dll”即可,Windows 2000用户则在管理器中的空白处单击鼠标右键,选择“自定义文件夹”选项,会出现自定义文件夹向导,进入到“请选择模板”窗口后,选择其中的“简易”便可以禁止预览了。
5.Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
首先要打开Windows XP安装盘,点“Support Tools”,进入硬盘的Support Tools安装目录(X:Program FilesSupport Tools),找到Msicuu.exe并双击,于是就会弹出一个“Windows Installer Clean Up”窗口,显示当前已安装的所有程序列表。你从中选择顽固程序,然后单击“Rmove”按钮即可卸载。如果以上方法无效,建议你用Msizap.exe来卸载,方法是:打开注册表编辑器,定位到HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionUninstall,在左边项中找到顽固程序的标识(例如),然后依次选择“开始→程序→Windows Support Tools→Command Prompt”命令,在命令提示符后,输入以下命令:msizap T ,按回车后即可卸载顽固程序。
6.Windows XP的命令Replace.exe的主要功能,就是替换文件。该命令在Windows安装目录的System32文件夹下,
它能够替换正在使用中的文件!
例如,我们用Windows Media Player播放一首路径为“g:mp3source.mp3”的歌曲
,然后在命令提示符窗口下键入下列命令:
replace.exe d:mp3source.mp3 g:mp3
这里的“d:mp3source.mp3”是准备用来替换的另一首MP3歌曲,注意两个
文件的文件名必须保持一致,很快我们就会在看到替换成功的提示,接下来Windows Medi
a Player窗口正在播放的歌曲也会自动变为另一首歌曲,呵呵,够神奇的吧?当然,repl
ace命令的最大好处是用来替换系统文件,这样就不需要重新启动到安全模式下了!
Replace.exe命令的使用参数如下,有兴趣的朋友可以深入研究一下:
/A——把新文件加入目标目录,注意不能与/S或/U搭配使用。
/P——替换文件或加入源文件之前提醒用户进行确认。
/R——替换只读文件以及未受保护的文件。
/S——替换目标目录中所有子目录中的文件。
/W——等待用户插入磁盘后再运行。
/U——只替换或更新比源文件日期早的文件,不能与/A搭配使用。
二、其它常用软件来删除
请常用软件“兼职”删除。我们可以使用FlashFXP、Nero、ACDSee、Winrar、qq,Winamp来删除顽固文件,这种方法往往有奇效。
1,FlashFXP、Nero、ACDSee只需在本地目录中浏览到待删文件,对其执行删除操作即可.
2,使用Winrar来删除文件的方法步骤如下:右键单击待删除文件或者文件夹,选择“添加到档案文件”菜单,
在谈出窗口中勾选“存档后删除源文件”,单击“确定”,这样Winrar在创建压缩文件的同时,也会帮我们删除顽固的文件,
我们只需要将创建的压缩文件删除即可.
3,将QQ安装目录下的unins000.exe文件拷贝到要卸载文件的安装目录,再执行该程序即可!这种办法对于卸载那些反安装程序丢失或者损坏的文件有特效。
4,首先在“我的电脑”找到Winamp安装目录下的UninstWp.exe程序,复制并粘贴到顽固程序所在的文件夹中,双击运行该程序就可以把顽固程序卸载得干干净净了。
三、使用专业删除软件。
1,冰刃icesword
现在很多流氓软件都是通过内核来加载,象CNNIC中文上网的cdnprot.sys,3721的CnsMinKP.sys,它加载后,为了保证软件不被删除,就监视所有的文件、注册表删除操作,如果发现是删除这些文件,就直接返回一个true,这样Windows以为已经删除了,但是文件还在那里。再有一些做得更绝,它会把文件隐藏起来。这个隐藏是基于内核级的,不是通过打开管理器里面的“显示隐藏文件”选项就能看到的。象TotalCommand有时也发现不了。针对这些文件,Unlocker也是无药可施的。即使是Windows提供的重启删除机制,也被这些流氓软件给破了。IceSword是这类软件中最有效的,能删除各种驱动保护文件,而不需要重启操作系统或者装一个DOS之类多操作系统来完成。
使用很简单,通过它的“文件”,然后象管理器一样,找到相应的文件,然后点右键——删除便可。如果是.exe的文件本身在运行,要先通过IceSword的进程管理器来杀掉,然后再删除。
冰刀是重建系统核心,可以绕过所有的NTFS安全以及其它保护。
但前不久有人写出的专门来欺骗冰刀的文章已经有人应用了。
2,金山文件粉碎器(金山反间谍2007)。
大多数情况下,Windows自带的文件删除并不彻底,文件被删除后,他人仍然可以通过一些磁盘工具进行恢复。
所以对于一些想彻底删除的文件,可以使用文件粉碎器进行彻底删除。新版本的文件粉碎器用了基于磁盘物理扇区的粉碎机制,
能够彻底清除文件内容、文件名以及分配表等所有文件信息,保证了被粉碎文件无法恢复。
同时符合美国国防部标准中对机密文件的粉碎处理方式。
试验表明,它独有的方式正好可以突破目前所有的流氓软件的自我保护功能。经试验,Windows系统下的所有文件,
无论是正在运行的程序,正在被使用的DLL,正在被打开的文件,还是取自我保护的驱动,全部都可以被轻易地删除!
试验过程:在机上上同时安装了CNNIC,彩信通,SPOOLSV、百狗(Baigoo)、3721,百度等多个流氓软件,
然后在不关闭任何进程以及使用任何工具的情况下,把所有流氓软件相关的目录、驱动文件、可执行文件,
通过文件粉碎器,一次性全部删除!
文件粉碎器是直接写磁盘的文件空间,把文件内容改写,所以还是需要通过NTFS的权限检查的,
所以在普通帐户下删除管理员帐户的文件可能会失败。
3,PC Tools
可以删除几乎所有“顽固”软件。运行软件后,先按任意键进入软件的主界面,然后按下F10 切换选中待删文件,按下D键并确认操作即可删除.
4.unlocker,killbox,CopyLock
unlocker是一个非常优秀、小巧,功能强大的文件删除工具。大部分正常情况下都可以把.dll, exe等文件删除掉。
它可以关掉使用文件的句柄(正常文件),杀掉进程(.dll),Unload DLL。安装完了之后,以后要使用的时候,
在需要删除的文件或者目录上点右键,在菜单中选择“Unlocker”。这时如果它检测到文件/目录被其它进程锁了,
就会有一个列表的窗口出来,显示当前锁定或使用这个文件/目录的进程。那个Action动作选择“删除”,
再点一下那个“Unlock All”就可以了。 如果这个文件被一些核心进程占用或者保护,它会提示要等下一次启动的时候再删除,
这时点确定就可以了。大多数情况下,是不需要重启的。
killbox,unlocker里面的文件删除用了很多办法,最后一招是利用系统的“延迟删除功能”。
但是现在有不少流氓软件已经针对此做了防范,只要过滤相关的注册表值就可以了。所以对于有一些文件,它们都删除不掉。
四、安全模式或DOS或PE或光盘版xp(非PE)
其实熟悉DOS或者有能光盘启动的工具盘的话,一切都很简单。
1,一般情况下,在安全模式下能删除。
2,在DOS下删使用RD(删除目录)或delete命令(删除文件)
3,用PE系统光盘启动删除。
4,类推的,其他系统都可以删除,比如linux等等,不一一列举。
五、利用WINDOWS命名漏洞建立的文件或文件夹
对利用WINDOWS命名漏洞命名的文件, 利用Windows以设备命名文件夹拒绝服务漏洞的文件,在“开始”→“运行”中输入cmd后回车,使用dos命令删除。 这个把怎么建立的过程也讲一下:
1,利用Windows以设备命名文件夹拒绝服务漏洞
例如新建以下这些名字的文件(或文件夹):aux、com1、com2、prn、con、nul,系统会提示无法建立。
我们可以在命令行窗口中建立,然后将文件copy进去,这样,文件打不开也删不掉。
实现过程:在“开始”→“运行”中输入cmd后回车,进入命令行窗口,设你所要加密的文件在C盘根目录下,名字为111.txt,只要输入copy c:I.txt .c:com1.txt(小提示:也可以命名为aux、com2、prn、con、nul其中的任意一个文件名)。这样你的111.txt文件中的内容就会被复制到com1.txt文件中了,com1.txt含有Windows禁用的文件名,故无法打开
也无法删除,别人就拿它没办法了,你要是再想查看其中的内容可以在“开始”→“运行”中输入.c:com1.txt即可,删除它也很简单,在命令行中输入del .c:com1.txt。
2,利用WINDOWS命名漏洞命名的文件, 比如xxx.,即文件最后有一个点.
这样的文件夹是无法直接建立的,不信试一下,后面的那个点是自动消失的。
建立这个文件的话可以用 md xxx.. 也可以新建一个xxx,然后用WINRAR改xxx为xxx.. 删除的话用 rd /s /q xxx..
没用的话再输入 del /f /q xxx..
--------------------------------------------------------------------------
对于含有保留字的文件,当我们发出删除指令的时候,Windows会检查被删除的文件是否有合法的路径,如果你的文件名含有Windows认为的非法字符或保留字,那么删除就会失败。
我们有3种方法可以删除这类文件:
a)用Linux或其他非Windows的操作系统,以Linux/Unix为例:可以使用rm命令删除:
rm -d //driveletter/path using forward slashes/filename
rm -r "//C/Program Files/BadFolder"
b)使用命令行工具的一个特殊参数解决:
RD.:
DEL.driveletter:path ilename
在删除命令后面跟上.参数就可以避免Windows检查文件名的合法性,因此可以删除含有Windows保留字或非法名字的文件。
c)对于文件,如果可以使用通配符,那么也可以用通配符解决:
DEL DEL PR?.*
DEL LPT?.*
--------------------------------------
以下另提供两种方法
不进安全模式,不借第三方工具,删除正在使用的文件两招。
(仅适用于 Windows NT/2000/XP/2003)
相信大家一定碰到过因为文件正在使用而无法删除的问题吧,现在教大家两招,仅用系统自身的功能就可以搞定。思路其实非常简单,就是让正在使用的文件变成不是正在使用就可以了。现在来解决这个问题:
第一招 磁盘扫描
看到这个题目大家不要郁闷,磁盘扫描是如何能做到的呢,其实磁盘扫描 CHKDSK 有一个参数 /X ,作用是强制关闭指定磁盘打开文件的句柄。正是利用这个来解决问题。
设 E: 有个文件正在使用,无法删除。
第一步:关闭 E: 上已知正在运行的程序或文件。毕竟能用正常方法关闭的文件就用正常方法关闭。
第二步:运行 CMD 打开“命令提示符”窗口,输入 CHKDSK E: /X 。如没有意外,系统会显示 E: 已被强制卸下,所有打开的句柄都将无效,这说明 E: 上所有打开的文件已被强制关闭,待磁盘扫描完毕后就可以去删除你要删除的文件了。:)
特别说明:
此方法不适用于 Windows 所在的系统磁盘以及虚拟内存所在磁盘。例如你 Windows 装在 C: ,那么 C: 是无法被强制卸下的。如果虚拟内存放在 D: ,那么 D: 也不能够被强制卸下。
第二招 利用 NTFS 安全设置
要用这个方法必须保证磁盘为 NTFS 文件系统才行。
首先,找到正在使用而无法删除的文件,打开其“属性”,选择“安全”选项卡(XP 要在“文件夹选项”里面取消“使用简单的文件共享”才显示该项。),单击“高级”按钮,打开高级选项页,取消从父文件夹继承权限的选项。访问者列表里面除了自己的登陆账号以外其它的统统删除,之后点击“编辑”按钮编辑你自己的访问权限,只勾选“删除”的权限,其它诸如“读取”“执行”的权限等等全部取消或拒绝,确定后重新启动计算机。计算机重新启动后任何用户都无权读取该文件,该文件自然不会变成“正在使用的文件”。而你自己的账号有删除的权限,则可以轻松删除该文件了。
以上为本人的一点经验,希望对解决部分顽固,以及不方便进 DOS 或不熟悉 DOS 的用户有所帮助。
Windows蓝屏代码列表
下载专杀工具:
下载地址: ://220.181.34.241/pxzs.exe(由该地址下载的专杀工具会一直保持更新。)
使用的时候,暂时关闭其它杀毒软件,防止产生冲突。查杀完毕之后按提示重新启动操作系统,再次打开飘雪专杀工具,即可彻底清除该。
飘雪中毒症状:
IE浏览器主页被改为.piaoxue 或者 .feixue
木马名称:
Trojan.download.QQhelper.mo
Trojan.Zapchast.ch
飘雪手动免疫办法:
为了房子飘雪、飞雪木马植入注册表,可以运行regedit打开注册表,查找注册表项HKLM\SOWFTWARE\Microsoft\Internet Explorer,在其下建立一个SearchPlugInX的DWORD值,任意设置一个键值即可。
参考资料:
PandPdfJz2.dll是什么文件?
Windows蓝屏密码!补全版(ZT)
格式是:(0x0000 操作已成功完成。 0x0001 错误的函数。 )
1.停止错误编号:0x0000000A
说明文字RQL-NOT-LESS-OR-EQUAL
通常的原因:驱动程序使用了不正确的内存地址.
解决方法:如果无法登陆,则重新启动计算机.当出现可用的作系统列表时,按F8键.在Windows高级选项菜单屏幕上,选择"最后一次正确的配置",然后按回车键.
检查是否正确安装了所有的新硬件或软件.如果这是一次全新安装,请与硬件或软件的制造商联系,获得可能需要的任何Windows更新或驱动程序.
运行由计算机制造商提供的所有的系统诊断软件,尤其是内存检查.
禁用或卸掉新近安装的硬件(RAM,适配器,硬盘,调制解调器等等),驱动程序或软件.
确保硬件设备驱动程序和系统BIOS都是最新的版本.
确保制造商可帮助你是否具有最新版本,也可帮助你获得这些硬件.
禁用 BIOS内存选项,例如cache或shadow.
2.停止错误编号:0x0000001E
说明文字:KMODE-EXPTION-NOT-HANDLED
通常的原因:内核模式进程试图执行一个非法或未知的处理器指令.
解决方法:确保有足够的空间,尤其是在执行一次新安装的时候.
如果停止错误消息指出了某个特定的驱动程序,那么禁用他.如果无法启动计算机.应试着用安全模式启动,以便删除或禁用该驱动程序.
如果有非 Microsoft支持的驱动程序,尽量切换到标准的VGA驱动程序或Windows提供的适当驱动程序.
禁用所有新近安装的驱动程序.
确保有最新版本的系统BIOS.硬件制造商可帮助确定你是否具有最新版本,也可以帮助你获得他.
BIOS内存选项,例如cache,shadow.
3.停止错误编号:0x00000023或0x00000024
说明文字:FAT-FILE-SYSTEM或MTFS-FILE-SYSTEM
通常原因:问题出现在Ntfs.sys(允许系统读写NTFS驱动器的驱动程序文件)内.
解决方法:运行由计算机制造商提供的系统诊断软件,尤其是硬件诊断软件..
禁用或卸载所有的反软件,磁盘碎片整理程序或备份程序.
通过在命令提示符下运行Chkdsk /f命令检查硬盘驱动器是否损坏,然后重新启动计算机
4.停止编号:0x0000002E
说明文字ATA-BUS-ERROR
通常的原因:系统内存奇偶校验出错,通常由硬件问题导致.
解决方法:卸掉所有新近安装的硬件(RAM.适配器.硬盘.调制解调器等等).
运行由计算机制造商提供的系统诊断软件,尤其是硬件诊断软件.
确保硬件设备驱动程序和系统BIOS都是最新版本.
使用硬件供应商提供的系统诊断,运行内存检查来查找故障或不匹配的内存.
禁用BIOS内存选项,例如cache或shadow.
在启动后出现可用作系统列表时,按F8.在Windows高级选项菜单屏幕上,选择"启动VGA模式:.然后按回车键.如果这样做还不能解决问题,可能需要更换不同的适配器列表,有关支持的适配器列表,请参阅硬件兼容性列表.
5.停止编号:0x0000003F
说明文字:NO-MOR-SYSTEM-PTES
通常的原因:每哟正确清理驱动程序.
解决方法:禁用或卸载所有的反软件,磁盘碎片处理程序或备份程序.
6:停止错误编号:0x00000058
说明文字:FTDISK-INTERN-ERROR
通常的原因:容错集内的某个主驱动器发生故障.
解决方法:使用Windows安装盘启动计算机,从镜象(第2)系统驱动器引导.有关如何编辑Boot.ini文件以指向镜象系统驱动器的指导,可在MIcrosoft支持服务Web站点搜索"EditARC path".
7.停止错误编号:0x0000007B
说明文字NACCESSI-BLE-BOOT-DEVICE
通常原因:初始化I/O系统(通常是指引导设备或文件系统)失败.
解决方法:引导扇区通常会导致这种停止错误.是用反软件的最新版本,检查计算机上是否有存在.如果找到,则必须执行必要的不找把他从计算机上清除掉,请参阅反软件文档了解如何执行这些步骤.
卸下所有新近安装的硬件(RAM,适配器,调制解调器等等).
核对MIcrosoft硬件兼容性列表以确保所有的硬件和驱动程序都与Windows兼容.
如果使用的适SCSI适配器,可以从硬件供应商除获得最新WINDOWS驱动程序,禁用SCSI设备的同步协商,检查该SCSI链是否终结,并核对这些设备的SCSIID,如果无法确定如何执行能够这些步骤,可参考硬件设备的文档.
如果你用的是IDE设备,将板上的IDE端口定义为唯一的主端口.核对IDE设备的主/从/唯一设置.卸掉除硬盘之外的所有IDE设备.如果无法确认如何执行这些不找,可参考硬件文档.
如果计算机已使用NTFS文件系统格式化,可重新启动计算机,然后在该系统分区上运行Chkdsk/f/r命令.如果由于错误而无法启动系统,那么使用命令控制台,并运行Chkdsk /r命令.
运行Chkdsk /f命令以确定文件系统是否损坏.如果Windows不能运行Chkdsk命令,将驱动器移动到其他运行Windows的计算机上,然后从这台计算机上对该驱动器运行Chkdsk命令.
8.停止错误编号:0x0000007F
说明文字:UNEXPECTED-KERNEL-MODE-TRAP
通常的原因:通常是由于硬件或软件问题导致,但一般都由硬件故障引起的..
解决方法:核对Microsoft硬件兼容性列表以确保所有的硬件和驱动程序都与Windows兼容.如果计算机主板不兼容就会产生这个问题.
卸掉所由新近安装的硬件.
运行由计算机制造商提供的所有系统诊断软件,尤其是内存检查.
禁用BIOS内存选项,例如cache或shadow.
9.停止错误编号:0x00000050
说明文字E-FAULT-IN-NONPED-AREA
通常的原因:内存错误(数据不能使用分页文件交换到磁盘中).
解决方法:卸掉所有的新近安装的硬件.
运行由计算机制造商提供的所有系统诊断软件.尤其是内存检查.
检查是否正确安装了所有新硬件或软件,如果这是一次全新安装,请与硬件或软件制造商联系,获得可能需要的任何Windows更新或驱动程序.
禁用或卸载所有的反程序.
禁用BIOS内存选项,例如cache或shadow.
10.停止错误编号:0x0000007
说明文字:KERNEL-STEL-STACK-INPE-ERROR
通常的原因:无法从分页文件将内核数据所需的页面读取到内存中。
解决方法:使用反软件的最新版本,检查计算机上是否有。如果找到,则执行必要的步骤把他从计算机上清除掉。请参阅制造商提供的所有系统诊断软件,尤其是内存检查。
禁用BIOS内存选项,例如cache,shadow.
11.停止错误编号:0x00000079
说明文字:MISMATCHED-HAL
通常的原因:硬件抽象层与内核或机器类型不匹配(通常发生在单处理器和多处理器配置文件混合在同一系统的情况下)。
解决方法:要解决本错误,可使用命令控制台替换计算机上错误的系统文件。
单处理器系统的内核文件是Ntoskml.exe,而多处理器系统的内核文件是Ntkrnlmp.exe,但是,这些文件要与安装媒体上的文件相对应;在安装完Windows2000和,不论使用的是哪个原文件,都会被重命名为Ntoskrnl.exe文件。HAL文件在安装之后也使用名称Hal.dll但是在安装媒体,但是在安装媒体上却有若干个可能的HAL文件。
12.停止错误编号:0x0000007A
说明文字:KERNEL-DATA-INPE-ERROR
通常的原因:无法从分页文件将内核数据所需的页面读取到内存中。(通常是由于分页文件上的故障,,磁盘控制器错误或由故障的RAM引起的)。
解决方法:使用反软件的最新版本,检查计算机上是否存在。如果找到。则执行必要的步骤把他从计算机上清除掉,请参阅犯病度软件文档了解如何执行这些步骤。
如果计算机已使用NTFS文件系统格式化。可重新启动计算机,然后在该系统分区上运行Chkdsk/f/r命令。如果由于错误而无法启动命令,那么使用命令控制台,并运行Chkdsk /r命令。
运行由计算机制造商提供的所有的系统在很端软件,尤其是内存检查。
13.停止错误编号:0xC000021A
说明文字:STATUS-SYSTEM-PROCESS-TERMINATED
通常的原因:用户模式子系统,例如Winlogon或客户服务器运行时子系统(CSRSS)已被损坏,所以无法再保证安全性。
解决方法:卸掉所有新近安装的硬件。
如果无法登陆,则重新启动计算机。当出现可用的作系统列表时按F8。在Windows2000高级选项菜单屏幕上,选择:"最后一次正确的配置"。然后按会车。
运行故障恢复台,并允许系统修复任何检测到的错误。
14.停止错误编号:0xC0000221
说明文字:STATUS-IME-CHECKISU7M-MISMATCH
通常的原因:驱动程序或系统DLL已经被损坏。
解决方法:运行故障复控台,并且允许系统修复任何检测到的错误。
如果在RAM添加到计算机之后,立即发生错误,那么可能是分页文件损坏,或者新RAM由故障或不兼容。删除Pagefile.sys并将系统返回到原来的RAM配置。
代码 错误信息解释
0 操作已成功完成。
1 错误的函数。
2 系统找不到指定的文件。
3 系统找不到指定的路径。
4 系统无法打开文件。
5 拒绝访问。
6 句柄无效。
7 存储区控制块已损坏。
8 可用的存储区不足,无法执行该命令。
9 存储区控制块地址无效。
10 环境错误。
11 试图使用不正确的格式加载程序。
12 访问代码无效。
13 数据无效。
14 可用的存储区不足,无法完成该操作。
15 系统找不到指定的驱动器。
16 无法删除该目录。
17 系统无法将文件移到其他磁盘驱动器上。
18 没有其他文件。
19 媒体写保护。
20 系统找不到指定的设备。
21 设备尚未准备好。
22 设备无法识别该命令。
23 数据错误(循环冗余检查)。
24 程序发出命令,但是该命令的长度错误。
25 驱动器在磁盘上无法定位指定的区域或磁道。
26 无法访问指定的磁盘或软盘。
27 驱动器找不到所请求的扇区。
28 打印机缺纸。
29 系统无法写入指定的设备。
30 系统无法读取指定的设备。
31 与系统连接的设备不能正常运转。
32 其他进程正使用该文件,因此现在无法访问。
33 另一进程已锁定该文件的某一部分,因此现在无法访问。
34 驱动器中的软盘不正确。 请将 %2 (卷标序列号: %3) 插入驱动器 %1。
36 打开共享的文件太多。
38 已到达文件结尾。
39 磁盘已满。
50 不支持此网络请求。
51 远程计算机无法使用。
52 网络中存在重名。
53 找不到网络路径。
54 网络正忙。
55 指定的网络或设备已不可用。
56 已经达到网络 BIOS 命令的极限。
57 网络适配器出现错误。
58 指定的服务器无法执行所请求的操作。
59 网络出现意外错误。
60 远程适配器不兼容。
61 打印机队列已满。
62 服务器上没有存储等待打印的文件的空间。
63 已经删除等候打印的文件。
64 指定的网络名无法使用。
65 拒绝访问网络。
66 网络类型错误。
67 找不到网络名。
68 已超过本地计算机网络适配器卡的名称极限。
69 已超过网络 BIOS 会话的极限。
70 远程服务器已经暂停或者正在启动过程中。
71 由于该计算机的连接数目已达到上限,此时无法再连接到该远程计算机。
72 指定的打印机或磁盘设备已经暂停。
80 该文件存在。
82 无法创建该目录或文件。
83 INT 24 失败。
84 处理该请求的存储区不可用。
85 正在使用该本地设备名。
86 指定的网络密码不正确。
87 参数错误。
88 网络出现写入错误。
89 此时系统无法启动其他进程。
100 无法创建其他系统标志。
101 属于其他进程的专用标志。
102 标志已经设置,无法关闭。
103 无法再次设置该标志。
104 中断时无法请求专用标志。
105 此标志先前的所有权已终止。
106 请将软盘插入驱动器 %1。
107 后续软盘尚未插入,程序停止。
108 磁盘正在使用或已由其他进程锁定。
109 管道已经结束。
110 系统无法打开指定的 设备或文件。
111 文件名太长。
112 磁盘空间不足。
113 没有其他可用的内部文件标识符。
114 目标内部文件标识符不正确。
117 该应用程序所运行的 IOCTL 调用不正确。
118 校验写入的开关参数值不正确。
119 系统不支持所请求的命令。
120 该系统上不支持此功能。
121 标记已超时。
122 传给系统调用的数据区域太小。
123 文件名、目录名或卷标语法错误。
124 系统调用层不正确。
125 磁盘没有卷标。
126 找不到指定的模块。
127 找不到指定的过程。
128 没有要等候的子进程。
129 %1 应用程序无法在 Win32 模式下运行。
130 试图使用操作(而非原始磁盘 I/O)的已打开磁盘分区的文件句柄。
131 试图将文件指针移至文件开头之前。
132 无法在指定的设备或文件中设置文件指针。
133 对于包含已连接驱动器的驱动器,不能使用 JOIN 或 SUBST 命令。
134 试图在已经连接的驱动器上使用 JOIN 或 SUBST 命令。
135 试图在已经替换的驱动器上使用 JOIN 或 SUBST 命令。
136 系统试图删除尚未连接的驱动器的 JOIN。
137 系统试图删除尚未替换的驱动器的替换项。
138 系统试图将驱动器连接到已连接的驱动器下的目录。
139 系统试图将驱动器替换成已替换的驱动器下的目录。
140 系统试图将驱动器连接到已替换的驱动器的一个目录中。
141 系统试图将驱动器替换成到已连接的驱动器下的目录。
142 此时系统无法运行 JOIN 或 SUBST。
143 系统无法将驱动器连接到或替换成同一驱动器下的目录。
144 此目录不是该根目录的子目录。
145 该目录未清空。
146 指定的路径已经在替换中使用。
147 不足,无法执行该命令。
148 此时无法使用指定的路径。
149 试图连接或替换某个驱动器目录,该驱动器上的某个目录是上一次替换的目标目录。
150 CONFIG.SYS 文件未指定系统跟踪信息,或禁止跟踪。
151 DosMuxSemWait 的指定信号的数目不正确。
152 DosMuxSemWait 没有运行;已经设置太多的标志。
153 DosMuxSemWait 列表不正确。
154 输入的卷标超过目标文件系统的 标号字符长度极限。
155 无法创建其他线程。
156 接收进程拒绝该信号。
157 已经放弃该区域,因此无法锁定。
158 该区域已经解除锁定。
159 线程标识符的地址错误。
160 传到 DosExecPgm 的参数字符串错误。
161 指定的路径无效。
162 信号已挂起。
164 系统无法创建其他线程。
167 无法锁定文件的范围。
170 所要求的正在使用中。
173 锁定请求对于提供的取消区域不重要。
174 文件系统不支持到锁定类型的自动更改。
180 系统检测到错误的区域号码。
182 操作系统无法运行 %1。
183 不能创建已经存在的文件。
186 传送的标志不正确。
187 找不到指定的系统信号名称。
188 操作系统无法运行 %1。
189 操作系统无法运行 %1。
190 操作系统无法运行 %1。
191 无法在 Win32 模式下运行 %1。
192 操作系统无法运行 %1。
193 %1 不是有效的 Win32 应用程序。
194 操作系统无法运行 %1。
195 操作系统无法运行 %1。
196 操作系统无法运行此应用程序。
1 当前无法配置操作系统运行此应用程序。
198 操作系统无法运行 %1。
199 操作系统无法运行此应用程序。
200 代码段应小于 64K。
201 操作系统无法运行 %1。
202 操作系统无法运行 %1。
203 系统找不到输入的环境选项。
205 在命令子树中的进程没有信号句柄。
206 文件名或扩展名太长。
207 环 2 堆栈正在使用中。
208 输入的全局文件名字符 * 或 ? 不正确,或指定的全局文件名字符太多。
209 所发送的信号不正确。
210 无法设置信号处理程序。
212 区域已锁定,无法重新分配。
214 附加到此程序或动态链接模块的动态链接模块太多。
215 无法嵌套调用 LoadModule。
216 图像文件 %1 有效,但不适用于本机类型。
230 管道状态无效。
231 所有的管道实例都处于忙状态。
232 管道正在关闭。
233 在管道的另一端没有进程。
234 有更多可用的数据。
240 已取消会话。
254 指定的扩展属性名无效。
255 扩展属性不一致。
258 等待操作过时。
259 没有其他可用数据。
266 无法使用复制功能。
267 目录名无效。
275 扩展属性不匹配缓冲区。
276 所装载的文件系统上的扩展属性文件已被损坏。
277 扩展属性表格文件已满。
278 指定的扩展属性句柄无效。
282 安装的文件系统不支持扩展属性。
288 试图释放不属于调用者的多路同步信号 。
298 信号投递的次数太多。
299 仅完成部分 ReadProcessMemory 或 WriteProcessMemory 请求。
300 操作锁定请求被拒绝。
301 系统接收了一个无效的操作锁定确认。
317 在 %2 的消息文件中,系统无法找到消息号为 0x%1 的消息文本。
487 试图访问无效地址。
534 运算结果超过 32 位。
535 该管道的另一方有一进程。
536 等候进程打开管道的另一端。
994 拒绝对扩展属性的访问。
995 由于线程退出或应用程序的要求,I/O 操作异常终止。
996 重叠的 I/O 不处于已标记状态。
9 正在处理重叠的 I/O 操作。
998 对内存位置的无效访问。
999 执行页内操作出错。
1001 递归太深;堆栈溢出。
1002 窗口无法用来发送消息。
1003 无法完成此项功能。
1004 标志无效。
1005 卷不包含已识别的文件系统。 请确认所有需要的文件系统驱动程序都已经加载,而且卷没有任何损坏。
1006 某文件的卷已在外部改变,因而打开的文件不再有效。
1007 要求的操作无法以全屏幕模式执行。
1008 试图引用并不存在的符号。
1009 配置注册表数据库已损坏。
1010 配置注册表主键无效。
1011 无法打开配置注册表主键。
1012 无法读取配置注册表主键。
1013 无法写入配置注册表主键。
1014 必须使用日志文件或其他副本来恢复注册表数据库中的某个文件。恢复成功。
1015 注册表已损坏。可能是一个包含注册表数据文件的结构已损坏,也可能内存中该文件的系统映像已损坏,或者因为备份副本(或日志)不存在(或损坏)导致无法恢复该文件。
1016 由注册表引起的 I/O 操作发生了不可恢复的错误。注册表将不能读取、写出或刷新包含注册表系统映像的其中一个文件。
1017 系统试图将文件加载或还原到注册表中,但是,指定的文件不是注册表文件格式。
1018 试图在注册表键(已经标记为删除)中完成的操作非法。
1019 系统无法在注册表日志文件中分配所需的空间。
1020 无法在已经有子键或键值的注册表项中创建符号链接。
1021 在易失的父键下不能创建固定的子键。
1022 通知的更改请求已经完成,并且返回信息还没有被送到调用者的缓冲区中。调用者需要列举所有文件以找到改动的内容。
1051 已将停止控制发送给与其他运行服务相关的服务。
1052 所要求的控制对此服务无效。
1053 服务没有及时地响应启动或控制请求。
1054 无法为该服务创建线程。
1055 服务数据库已锁定。
1056 该服务的实例已在运行。
1057 帐户名无效或者不存在,或者指定帐户名的密码无效。
1058 服务无法启动,可能因为被禁用,也可能因为没有关联的可用设备。
1059 已经指定了循环服务的从属关系。
1060 指定的服务不是所安装的服务。
1061 该服务此时无法接收控制消息。
1062 服务尚未启动。
1063 服务进程无法连接到服务控制程序。
1064 处理控制请求时,服务出现意外情况。
1065 指定的数据库不存在。
1066 服务返回服务特定的错误码。
1067 进程意外地终止。
1068 无法启动从属服务或组。
1069 由于登录失败,没有启动服务。
1070 启动后,服务保持在启动挂起状态。
1071 指定的服务数据库锁定无效。
1072 指定的服务已经标记为删除。
1073 指定的服务已经存在。
1074 系统当前正以上一次运行成功的配置运行。
1075 从属服务不存在,或已经标记为删除。
1076 已接受使用当前引导作为最后的有效控制设置。
1077 自从上一次启动以后,没有再次启动过该服务。
1078 该名称已经用作服务名或服务显示名。
1079 此服务的帐户不同于运行于同一进程上的其它服务的帐户。
1080 只能为 Win32 服务设置失败操作,不能为驱动程序设置。
1081 这个服务所运行的进程和服务控制管理器相同。 所以,如果服务进程意外中止的话,服务控制管理器无法进行任何操作。
1082 这个服务没有设置恢复程序。
1083 配置成在该可执行程序中运行的这个服务不能执行该服务。
1100 已经到达磁带的物理尽头。
1101 磁带访问到文件标记。
1102 到达磁带或分区首部。
1103 磁带访问到文件组的末尾。
1104 磁带上没有其他数据。
1105 磁带无法分区。
1106 访问多重卷分区的新磁带时,当前的区块大小不正确。
1107 加载磁带时,找不到磁带分区信息。
1108 无法锁定媒体退出功能。
1109 无法卸载媒体。
1110 驱动器中的媒体已经更改。
1111 已经复位 I/O 总线。
1112 驱动器中没有媒体。
1113 在目标多字节代码页中不存在对单码字符的映射。
1114 动态链接库 (DLL) 初始化例程失败。
1115 正在关闭系统。
1116 无法终止系统关机,因为没有进行中的关机操作。
1117 由于 I/O 设备出现错误,无法运行该请求。
1118 串行设备初始化失败。将卸载串行驱动程序。
1119 无法打开正与其他设备共享中断请求 (IRQ) 的设备。至少有一个使用该 IRQ 的设备已经打开。
1120 由于再次写入串行口,串行 I/O 操作已结束。 ( IOCTL_SERIAL_XOFF_COUNTER 为零。)
1121 由于超时,串行 I/O 操作已结束。 (IOCTL_SERIAL_XOFF_COUNTER 未达到零。)
1122 在软盘上找不到标识符地址标记。
1123 软盘扇区标识符字段与软盘控制器磁道地址不匹配。
1124 软盘控制器报告软盘驱动程序不能识别的错误。
1125 软盘控制器返回的结果和注册的不一致。
1126 访问硬盘时,再校准操作失败,再试一次后也无法操作。
1127 访问硬盘时,磁盘操作失败,再试一次后仍没有作用。
1128 访问硬盘时,需要重启动磁盘控制器,但仍未成功。
1129 磁带已卷到尽头。
1130 可用的服务器存储区不足,无法执行该命令。
1131 检测到潜在的死锁情况。
1132 指定的基址或文件偏移量没有正确对齐。
1140 试图更改系统电源状态的操作被另一应用程序或驱动程序禁止。
1141 系统 BIOS 无法更改系统电源状态。
1142 试图在一文件上创建超过系统允许数额的链接。
1150 指定的程序需要新的 Windows 版本。
1151 指定的程序不是 Windows 或 MS-DOS 程序。
1152 无法启动指定程序的多个实例。
1153 指定的程序是为 Windows 的早期版本编写的。
1154 运行此应用程序所需的某个库文件已损。
1155 没有应用程序与该操作中所指定的文件关联。
1156 将命令发送到应用程序时出现错误。
1157 找不到运行此应用程序所需的某个库文件。
1158 当前进程已使用了 Window 管理器对象的系统允许的所有句柄。
1159 消息只能与同步操作一起使用。
1160 指出的源元素没有媒体。
1161 指出的目标元素已包含媒体。
1162 指出的元素不存在。
1163 指出的元素是未显示的存储的一部分。
1164 指出的设备需要重新初始化,因为硬件有错误。
1165 设备显示在尝试进一步操作之前需要清除。
1166 设备显示它的门仍是打开状态。
1167 设备没有连接。
1168 找不到元素。
1169 索引中没有同指定项相匹配的项。
1170 在对象上不存在指定的属性集。
1171 传递到 GetMouseMovePoints 的点不在缓冲区中。
1172 跟踪(工作站)服务没运行。
1173 找不到卷 ID。
1175 无法删除要被替换的文件。
1176 无法将替换文件移到要被替换的文件。要被替换的文件保持原来的名称。
1177 无法将替换文件移到要被替换的文件。要被替换的文件已被重新命名为备份名称。
1178 卷更改记录被删除。
1179 卷更改记录服务不处于活动中。
1180 找到一份文件,但是可能不是正确的文件。
1181 日志项已从日志中删除。
1200 指定的设备名无效。
1201 设备当前虽然未连接,但它是记忆连接。
1202 试图记起已经记住的设备。
1203 网络供应商不接受给定的网络路径。
1204 指定的网络供应商名无效。
1205 无法打开网络连接配置文件。
1206 网络连接配置文件已损坏。
1207 无法列举非包容类。
1208 出现扩展错误。
1209 指定组名的格式无效。
1210 指定计算机名的格式无效。
1211 指定名的格式无效。
1212 指定域名的格式无效。
1213 指定服务名的格式无效。
1214 指定网络名的格式无效。
1215 指定共享名的格式无效。
1216 指定密码的格式无效。
1217 指定的邮件名无效。
1218 指定邮件目的地的格式无效。
1219 所提供的凭据与现有凭据设置冲突。
1220 试图与网络服务器建立会话,但目前与该服务器建立的会话太多。
1221 网络上的其他计算机已经使用该工作组或域名。
1222 网络不存在或者没有启动。
1223 用户已经取消该操作。
1224 所要求的操作无法在已经打开用户映射区域的文件中运行。
1225 远程系统拒绝网络连接。
1226 已经关闭网络连
深入浅出windows驱动开发的目录
这个是dll文件意义
软件
DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用程序拓展",是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
5本词条?无参考资料,?欢迎各位?编辑词条,额外获取5个金币。
基本信息
中文名称
动态链接库
外文名称
Dynamic Link Library
简称
DLL
属性
软件文件类型
目录
1意义
2作用
3常见种类
4特点
5链接方法
6故障排除
7文件修复
折叠编辑本段意义
DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用DLL文件还可以减小程序的体积。
折叠编辑本段作用
动态链接库是早期Windows系统由于受限于当时计算机内存空间较小的问题而出现的一种内存优化方法。当一段相同的子程序被多个程序调用时,为了减少内存消耗,可以将这段子程序存储为一个可执行文件,当被多个程序调用时只在内存中生成和使用同一个实例。
在 Windows操作系统中,每个程序都可以使用该 DLL 中包含的功能来实现"打开"对话框。这有助于促进代码重用和内存的有效使用。
通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个记账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。
折叠编辑本段常见种类
Windows操作系统中的一些作为 DLL 实现的文件
·ActiveX 控件 (.ocx) 文件
ActiveX控件的一个示例是日历控件,它使您可以从日历中选择日期。
·控制面板 (.cpl) 文件
.cpl 文件的一个示例是位于控制面板中的项。每个项都是一个专用 DLL。
·设备驱动程序(.drv) 文件
设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序。
折叠编辑本段特点
一、 使用较少的
当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows操作系统上运行的程序。
二、 推广模块式体系结构
DLL 有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。
三、 简化部署和安装
当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。
1、如何了解某应用程序使用哪些DLL文件
右键单击该应用程序并选择快捷菜单中的"快速查看"命令,在随后出现的"快速查看"窗口的"引入表"一栏中你将看到其使用DLL文件的情况。
2、如何知道DLL文件被几个程序使用
运行Regedit,进入HKEY_LOCAL_MACHINE\Software\Microsrft\Windows\CurrentVersion\SharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可以将其删除。
3、如何解决DLL文件丢失的情况
有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL文件。一旦出现了丢失DLL文件的情况,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果这样不行,在电脑启动时又总是出现"***dll文件丢失……"的提示框,你可以在"开始/运行"中运行Msconfig,进入系统配置实用程序对话框以后,单击选择"System.ini"标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示了。
rundll的功能是以命令列的方式呼叫Windows的动态链接库。
Rundll32.exe与Rundll.exe的区别就在于前者是用于32位的链结库,后者是用于16位的链结库。rundll32.exe是专门用来调用dll文件的程序。
如果用的是Win98,rundll32.exe一般存在于Windows目录下;
如果用的WinXP、Win7,rundll32.exe一般存在于Windows\System32目录下。
若是在其它目录,就可能是一个木马程序,它会伪装成rundll32.exe。
折叠编辑本段链接方法
当您在应用程序中加载 DLL 时,可以使用两种链接方法来调用导出的 DLL 函数。这两种链接方法是加载时动态链接和运行时动态链接。
在运行时动态链接中,应用程序调用 LoadLibrary 函数或 LoadLibraryEx 函数以在运行时加载 DLL。成功加载?DLL?后,可以使用 GetProcAddress 函数获得要调用的导出的 DLL 函数的地址。在使用运行时动态链接时,无需使用导入库文件。
Win32 DLL的特点
Win32 DLL与 Win16 DLL有很大的区别,这主要是由操作系统的设计思想决定的。一方面,在Win16 DLL中程序入口点函数和出口点函数(LibMain和WEP)是分别实现的;而在Win32 DLL中却由同一函数DLLMain来实现。无论何时,当一个进程或线程载入和卸载DLL时,都要调用该函数,它的原型是
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);
其中,第一个参数表示DLL的实例句柄;第三个参数系统保留;这里主要介绍一下第二个参数,它有四个可能的值:DLL_PROCESS_ATTACH(进程载入),DLL_THREAD_ATTACH(线程载入),DLL_THREAD_DETACH(线程卸载),DLL_PROCESS_DETACH(进程卸载),在DLLMain函数中可以对传递进来的这个参数的值进行判别,并根据不同的参数值对DLL进行必要的初始化或清理工作。举个例子来说,当有一个进程载入一个DLL时,系统分派给DLL的第二个参数为DLL_PROCESS_ATTACH,这时,你可以根据这个参数初始化特定的数据。另一方面,在Win16环境下,所有应用程序都在同一地址空间;而在Win32环境下,所有应用程序都有自己的私有空间,每个进程的空间都是相互独立的,这减少了应用程序间的相互影响,但同时也增加了编程的难度。大家知道,在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,当进程在载入DLL时,系统自动把DLL地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,也就是说每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。因此,在Win32环境下要想在多个进程享数据,就必须进行必要的设置。亦即把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。
折叠编辑本段故障排除
可以使用多个工具来帮助您解决 DLL 问题。以下是其中的部分工具。
Dependency Walker
Dependency Walker 工具可以递归扫描以寻找程序所使用的所有依赖 DLL。当您在 Dependency Walker 中打开程序时,Dependency Walker 会执行下列检查:
Dependency Walker 检查是否丢失 DLL。
Dependency Walker 检查是否存在无效的程序文件或 DLL。
Dependency Walker 检查导入函数和导出函数是否匹配。
Dependency Walker 检查是否存在循环依赖性错误。
Dependency Walker 检查是否存在由于针对另一不同操作系统而无效的模块。
通过使用 Dependency Walker,您可以记录程序使用的所有 DLL。这可能有助于避免和更正将来可能发生的 DLL 问题。当您安装 Microsoft Visual Studio 6.0 时,Dependency Walker 将位于以下目录中:
drive\Program Files\Microsoft Visual Studio\Common\Tools
DLL Universal Problem Solver
DLL Universal Problem Solver (DUPS) 工具用于审核、比较、记录和显示 DLL 信息。下表说明了组成 DUPS 工具的实用工具:
Dlister.exe:该实用工具枚举计算机中的所有 DLL,并且将此信息记录到一个文本文件或数据库文件中。
Dcomp.exe:该实用工具比较在两个文本文件中列出的 DLL,并产生包含差异的第三个文本文件。
Dtxt2DB.exe:该实用工具将通过使用 Dlister.exe 实用工具和 Dcomp.exe 实用工具创建的文本文件加载到 dllHell数据库中。
DlgDtxt2DB.exe:该实用工具提供 Dtxt2DB.exe 实用工具的图形用户界面(GUI) 版本。
DLL影响
bat批量处理结束进程:杀毒软件是怎样做到不被终止的?比如我用taskkill /pid * 。或者
向内核世界说一声:hello,我来了。如果你是一个初学者,并对这个世界充满好奇心,请从这一章开始,我们一起打招呼~
第1章 Hello World驱动 1
1.1 从Hello World开始 2
1.1.1 HelloDRIVER 4
1.1.2 代码解释 8
1.1.3 驱动程序的编译和安装 11
1.1.4 查看我们的驱动 14
1.2 虚拟环境 15
1.2.1 使用虚拟环境进行驱动开发 15
1.2.2 使用VMware虚拟机 15
1.2.3 目标机设置 16
1.2.4 Virtual PC虚拟机 18
1.3 小结 19
如何在规范的商业环境中,开发成功而有效的驱动软件?驱网站长马勇(ZnSoft)将向你娓娓道来。你会学到这些内容:建立一个简单而有效的开发、调试环境;64位环境下的内核编程技巧;如何发布你的驱动软件。
第2章 商业驱动开发技术 20
2.1 建立开发调试环境 21
2.1.1 SVN环境 21
2.1.2 创建工程,导入SVN 23
2.1.3 建立符号服务器 25
2.1.4 用符号调试 27
2.2 64位驱动开发技术 34
2.2.1 64位驱动编写技术 35
2.2.2 32位应用程序与64位驱动混合模式 36
2.3 驱动程序的发布与测试 42
2.3.1 驱动程序签名 42
2.3.2 驱动程序测试 46
2.3.3 WHQL 49
2.4 小结 50
WDF是目前最新的驱动编程框架。当很多内核程序员还紧抱WDM的巨大佛脚时,千万要记住,WDF已是大势所趋。本章介绍了WDF最重要的几个概念,并进行了一定程度的深度挖掘。对于WDF框架的三大核心模型:对象模型、模型、PNP/Power模型,本章作了重点讲述。
第3章 WDF概述 51
3.1 主要特点 52
3.2 框架视图 53
3.3 兼容性 55
3.4 对象模型 56
3.4.1 对象和句柄 59
3.4.2 引用计数 60
3.4.3 上下文空间 61
3.4.4 PME接口 67
3.4.5 DDI接口 69
3.4.6 父子关系 76
3.4.7 对象同步 77
3.5 驱动对象和设备对象 78
3.5.1 驱动对象 78
3.5.2 驱动入口DriverEntry 81
3.5.3 设备对象 84
3.5.4 创建设备对象 85
3.5.5 设备栈 86
3.6 IO模型 88
3.6.1 IO目标对象 88
3.6.2 IO目标对象的细节 90
3.6.3 安全的缓冲区 93
3.6.4 内存对象(一) 96
3.6.5 内存对象(二) 98
3.6.6 框架和IO请求 102
3.6.7 更详细的处理流程 103
3.6.8 IO请求参数 105
3.6.9 队列 107
3.6.10 创建IO请求 110
3.7 PNP和电源模型 112
3.8 小结 115
使用WDF框架开发USB驱动,方便且简单。本章首先总体上从硬件和软件两个方面介绍USB相关知识点,包括设备的电气特性、总线结构、USB驱动类型以及类驱动。编程方面,从USB设备初始化、数据操作以及设备控制等几个方面来讲解,透彻并且翔实。
第4章 WDF USB设备驱动开发 116
4.1 USB设备硬件结构 117
4.1.1 主从结构 117
4.1.2 硬件拓扑 118
4.1.3 USB中断 119
4.2 USB软件结构 120
4.2.1 总线驱动 120
4.2.2 系统类驱动 121
4.2.3 功能驱动 122
4.2.4 父驱动与混合设备 122
4.2.5 过滤驱动 125
4.2.6 USB驱动栈、设备栈 125
4.3 内核开发 127
4.3.1 设备驱动 127
4.3.2 入口函数 128
4.3.3 USB描述符 129
4.3.4 描述符介绍 130
4.3.5 汇总举例 133
4.3.6 读取描述符 135
4.3.7 初始化 137
4.3.8 设备初始化函数 138
4.3.9 创建设备对象 141
4.3.10 设备命名、符号链接 143
4.3.11 启动设备 147
4.3.12 创建队列 156
4.3.13 停止设备/反初始化 158
4.4 数据I/O操作 160
4.4.1 USB控制命令 160
4.4.2 构造并发送控制命令 162
4.4.3 读USB中断端口 163
4.4.4 连续读操作 165
4.4.5 数据处理函数 166
4.4.6 中断端口的效率 167
4.4.7 读/写批量端口 168
4.5 设备控制 171
4.5.1 关于I/O Target对象 171
4.5.2 获取USB版本 172
4.5.3 管道重置 174
4.5.4 设备重置 176
4.5.5 管道中止与终止 177
4.6 用户程序 179
4.6.1 内核读/写 179
4.6.2 控制命令 179
4.7 小结 180
1394俗称火线。大伙平时最多接触它的地方大概是内核调试时,借助1394卡进行双机互联。本章首先从硬件方面介绍了1394的知识,它的总线结构很特别,极具可扩性,能非常方便地在各种类型的1394设备之间建立数据链路。内核编程方面,本章重点讲解了数据通信相关知识,分为异步通信和同步通信两种方式,颇为复杂,相对难于掌握,但套路是现成的,变化的东西不多,可以熟能生巧。本章最后介绍了1394双机互联的原理,有兴趣的读者可参考之。
第5章 WDF 1394驱动开发 181
5.1 1394一席谈 182
5.1.1 版本情况 183
5.1.2 电源特性 183
5.1.3 1394卡 183
5.1.4 总线拓扑 184
5.2 发送请求 186
5.2.1 同步方式 187
5.2.2 异步方式 189
5.2.3 对WDM的回忆 191
5.3 总线重置与计数 193
5.3.1 总线重置 193
5.3.2 设置重置回调 193
5.3.3 计数更新 194
5.4 PNP操作 195
5.5 异步通信 196
5.5.1 地址范围 1
5.5.2 异步读 200
5.5.3 异步写 201
5.5.4 异步锁请求 202
5.5.5 数据流 203
5.6 等时通信 204
5.6.1 申请带宽 205
5.6.2 释放带宽 206
5.6.3 等时通道 206
5.6.4 句柄 207
5.6.5 缓冲区挂载 210
5.6.6 缓冲区解挂 211
5.6.7 开始传输 211
5.6.8 停止传输 212
5.6.9 其他等时操作 213
5.7 其他操作 213
5.7.1 设备配置 213
5.7.2 获取控制器信息 214
5.7.3 速度信息 215
5.7.4 厂商自定义命令 216
5.8 安装与测试 216
5.8.1 1394虚拟设备 216
5.8.2 创建虚拟设备 218
5.8.3 示例代码 219
5.8.4 安装与测试 221
5.9 小结 222
内核天生适合于C语言编程,但越来越多的内核项目,规模达到10数万的规模。在这种情况下,人们不由地会将目光投向优雅的C++语言。总体上说,C和C++是至亲好友,内核中使用C++本不应有什么大问题,但有几个暗礁潜伏已久,不小心的程序员,你可千万不要触礁。
第6章 内核驱动C++编程 223
6.1 驱动中的类 224
6.1.1 一个简单的例子 224
6.1.2 new/delete 225
6.1.3 extern C 227
6.1.4 全局/静态变量 228
6.1.5 栈的忧虑 230
6.2 类封装的驱动程序 233
6.2.1 寻找合适的存储所 233
6.2.2 类方法与函数 235
6.2.3 KMDF驱动实现 236
6.2.4 WDM驱动实现 237
6.3 多态 238
6.3.1 基类、子类 238
6.3.2 实现多态 239
6.3.3 测试 241
6.4 小结 241
使用WDF框架编写的驱动程序,在测试和调试的时候,有特殊的工具。本章介绍了目前所知的三个,它们分别是:Windbg扩展调试命令、WDFTester测试工具、WDFVerifier测试工具。本章将以示例方式,介绍这些工具的使用。
第7章 WDF驱动测试 242
7.1 WDF错误 243
7.1.1 实例分析 245
7.1.2 USB错误 246
7.2 WDF扩展调试命令 247
7.3 WDFTester 254
7.3.1 WDFFiTester 254
7.3.2 使用 256
7.3.3 WDFCallTracer 260
7.4 WDFVerifier 263
7.4.1 识别KMDF驱动 263
7.4.2 使用与介绍 265
7.5 小结 266
SoftIce渐行渐远之后,Windbg成为内核调试的第一利器。使用Windbg的最大难点是命令繁多,参数复杂。本章以总结归纳的形式,介绍了作者在工作中经常用到的几大类调试命令,并以实例形式一一介绍。作者根据个人经验所作的分类,未能全备,但能够保证的是,所有实例翔实而可靠,可以作为可信的参考。
第8章 调试命令详解 267
8.1 概述 268
8.1.1 寻求帮助 269
8.1.2 DML语言 270
8.1.3 基本信息 271
8.1.4 基本设置 272
8.1.5 格式化显示 273
8.1.6 开始调试 273
8.2 符号与源码 276
8.2.1 模块列表 277
8.2.2 模块信息 279
8.2.3 符号路径 280
8.2.4 符号加载 283
8.2.5 符号搜索 285
8.2.6 源码命令 287
8.3 进程与线程 289
8.3.1 进程命令 289
8.3.2 线程命令 292
8.3.3 异常与 296
8.3.4 局部变量 300
8.3.5 显示类型 301
8.4 断点 301
8.4.1 软件断点 301
8.4.2 硬件断点 303
8.4.3 其他操作 303
8.5 内存命令 304
8.5.1 查看内存 304
8.5.2 内存信息 307
8.5.3 其他命令 311
8.6 小结 312
相信大多数人在学习内核开发的时候,都问过这样一个问题:内核驱动怎么向用户程序发送消息,或者如何调用Win32函数。用户程序和内核同步,是一个基本而重要的知识,本章介绍了三种主要的实现方式。至于内核是否可以调用Win32函数,读一读本章开篇的话,你就有答案了。
第9章 内核同步 313
9.1 关于内核同步 314
9.2 内核同步 316
9.2.1 原理 316
9.2.2 用户程序 318
9.2.3 内核实现 319
9.3 IRP同步 320
9.3.1 用户程序 321
9.3.2 内核实现 323
9.4 WMI同步 325
9.5 数据缓冲区同步 326
9.6 反向调用 328
9.7 小结 330
微软最新的音编程框架即AVStream框架,不管从什么方面来说,音编程都是一个很小众的领域。AVStream框架极其复杂,个人看法是掌握的难度超过了WDF。本章介绍了AVStream框架的各种基本知识点,并以实例讲解一个内核音频过滤器在系统中是如何工作的。
第10章 音频驱动开发 331
10.1 简介 332
10.1.1 音频模块架构 332
10.1.2 系统中的音频设备 334
10.2 AVStream对象 338
10.2.1 设备对象 339
10.2.2 Filter工厂和Filter对象 340
10.2.3 Pin工厂和Pin对象 342
10.2.4 Node对象与Connection结构体 343
10.3 AVStream描述符 346
10.3.1 描述符简介 346
10.3.2 描述符示例 347
10.3.3 分发函数表 349
10.3.4 自控表 349
10.3.5 自控表示例 351
10.4 代码讲解 355
10.4.1 入口函数 355
10.4.2 设备分发函数 357
10.4.3 Filter与Pin分发函数 358
10.4.4 创建和删除 359
10.4.5 数据处理 360
10.4.6 数据格式 362
10.5 自控表函数 364
10.5.1 函数 364
10.5.2 属性函数 366
10.5.3 方法函数 367
10.5.4 用户接口 367
10.6 硬件操作 370
10.6.1 数据DMA 370
10.6.2 AVStream中的DMA实现 371
10.6.3 谈谈ISR 374
10.7 安装与测试 376
10.7.1 安装 376
10.7.2 测试工具 376
10.8 小结 379
ASIO音频驱动具有两个非常亮眼的优点:低延迟、多通道。低延迟能够达到几毫秒,使得最灵敏的耳朵也难也察觉;多通道则让通常的双声道、6.1声道等一齐歇菜,而可以很轻松地让多达十几、几十个声道同时工作,在进行高级音频编辑时,这非常重要。
第11章 ASIO虚拟声卡 380
11.1 引言 381
11.2 关于ASIO 383
11.3 ASIO用户驱动 384
11.3.1 COM接口 384
11.3.2 安装与卸载 386
11.3.3 IASIO接口 387
11.3.4 技术核心 390
11.3.5 计算延迟 392
11.4 内核驱动实现 393
11.4.1 同步 393
11.4.2 原理 393
11.4.3 实现 396
11.5 ASIO音频软件 396
11.6 小结 3
从本章开始的三章内容,讲的都是“驱动安装”这个话题。在本章中,介绍了系统中和驱动安装有关的各种系统模块。读者通过阅读本章后,至少能够掌握这两个基本知识:系统如何识别一个旧设备,并为它加载合适的驱动文件;系统如何发现一个新设备,并完成驱动安装。
第12章 设备驱动安装入门 399
12.1 基础知识预介 400
12.1.1 设备类型 400
12.1.2 设备实例ID 401
12.1.3 驱动加载和安装 403
12.2 安装模块 404
12.2.1 内核PNP管理器 405
12.2.2 用户PNP管理器 406
12.2.3 安装接口函数(Setup API) 408
12.2.4 配置管理器接口(CfgMgr API) 410
12.2.5 类安装器(Class Installers) 410
12.2.6 类协安装器(Class Co-Installers) 410
12.2.7 设备协安装器(Device Co-Installers) 411
12.2.8 驱动包(Driver Package) 412
12.2.9 驱动仓库(Driver Store) 413
12.2.10 设备管理器(Device Manager) 414
12.2.11 安装程序 415
12.2.12 新设备向导 416
12.2.13 添加硬件向导 416
12.2.14 驱动安装器(Driver Installer) 416
12.3 重要问题 417
12.3.1 寻找和选择 417
12.3.2 32位与64位系统兼容 418
12.3.3 系统重启 419
12.4 安装模式 420
12.4.1 示例1:客户端模式 421
12.4.2 示例2:服务器模式 423
12.5 安装器编程 424
12.5.1 DIF码 424
12.5.2 处理流程 427
12.5.3 工程示例 429
12.5.4 注册 430
12.6 小结 431
INF文件即驱动程序的“安装文件”,它包含了各种与驱动安装有关的指令信息。通过INF文件,系统知道如何处理驱动包中的各个文件,并在系统注册表中做出准确记录。本章主要从指令和域,这两个方面进行讲解。
第13章 深入解析INF文件 432
13.1 概述 433
13.1.1 域 433
13.1.2 指令 434
13.1.3 多系统 435
13.2 注册表指令 436
13.2.1 缩写根键 436
13.2.2 软件键 437
13.2.3 硬件键 437
13.2.4 AddReg 438
13.2.5 DelReg 440
13.2.6 BitReg 441
13.3 文件操作指令 441
13.3.1 CopyFiles 441
13.3.2 DelFiles 443
13.3.3 RenFiles 443
13.4 服务指令 444
13.4.1 AddService 444
13.4.2 DelService 445
13.5 基本域 446
13.5.1 版本域 446
13.5.2 文件域 447
13.5.3 默认安装域 451
13.5.4 控制域 454
13.5.5 字符串域 457
13.6 设备类安装域 458
13.6.1 主域 459
13.6.2 服务子域 461
13.7 接口类安装域 461
13.8 厂商/产品域 462
13.8.1 厂商域 463
13.8.2 产品域 464
13.9 设备安装域 464
13.9.1 硬件子域 466
13.9.2 协安装器子域 467
13.9.3 接口子域 468
13.9.4 厂商默认配置子域 469
13.9.5 逻辑优先配置子域 470
13.10 ChkInf介绍 471
13.11 小结 472
驱动安装程序让你的驱动软件显得更加专业,所以,放弃手动安装驱动的做法吧,你的驱动将显得更靓。本章的示例软件MyDrvInst,可以作为读者设计更漂亮的安装软件的开始。
第14章 设计驱动安装程序 473
14.1 驱动包 474
14.1.1 安装方式 474
14.1.2 安装驱动包 475
14.1.3 卸载驱动包 476
14.2 驱动更新 477
14.2.1 设备已连接 477
14.2.2 设备未连接 478
14.2.3 枚举系统设备 481
14.3 分析INF文件 484
14.3.1 函数介绍 484
14.3.2 打印设备ID 486
14.4 MyDrvInst介绍 487
14.5 制作软件安装包 490
14.5.1 视图介绍 490
14.5.2 我们的工程 492
14.5.3 编译执行 493
14.6 小结 494
附录A CY001 USB开发板 495
附录B VisualKD + VMWare实现单机内核调试 501
任务管理器的高手问题
呵呵,建议你下了解一下杀毒软件的工作机制。
金山,360,瑞星等杀毒软件,都是驱动保护的,bat因为比它高层,所以做不到关闭杀毒软件。否则连批处理都可轻易攻破,那早就有无数泛滥了。只有汇编语言这样的底层语言才可以,(其实C语言也能做到)。当然,bat也不是不行,可以用bat汇编,叫做ASCIICoding技术,挺难的。2007年以前国内还没有一个会的(除非会但不说,那我当然就不知道了)。也建议你学习Rootkit Hook技术,可以读一读这篇文章。
瘟神的--Rootkit技术发展史
作者:小金
一. 无法驱逐的“助手”
网管小张正在手忙脚乱的寻找他的手工杀毒工具包,因为他在安装一个网管工具的时候无意中走了神,点击了“下一步”按钮后才惊觉安装程序的界面里一个不引人注目的角落里写着“安装CNNIC网络实名”这一行小字,而且最开头部分有一个小小的勾。于是著名的“中国网民的得力助手”便理所当然的在他的机器里安了家。
心里把厂商骂了十八遍的小张终于翻出了他外出修机时最得意的工具IceSword和超级巡警,果然在进程列表和SSDT列表里发现了红色警报,小张笑了笑,对付这些一般用户无法卸载的恶意流氓,自己可谓经验丰富了,当下便三下五除二的把CNNIC的进程给终结了,SSDT也给恢复了初始状态,然后小张去删除注册表启动项——突然发出的一个错误提示声音把小张吓了一跳,再定睛一看,他的笑容凝固了:“删除项时出错”。不会吧?小张急忙去删除CNNIC目录,结果彻底愣在了那里,系统弹出的错误提示很明确的告诉他,“无法删除文件,文件可能正在被使用”。怎么回事?小张一下子没了头绪……
达尔文的进化论告诉我们,“物竞天择,适者生存”,同样,在这安全与入侵的网络世界里,也在进行着这样一场选择的过程……
二. 被AIDS纠缠的互联网
。。。。。。。。。
。。。。。。。。。。。。。
。。。。。。。。。。。。。。(百度长度限制。。。想看全篇自己搜吧)
三. 结语
虽然到处都在提倡和谐网络的普及,但是,“健康上网”仅仅是指代那些黄赌毒而已吗?在利益面前,开发者的正义感越发渺小起来,我们的网络世界,是被瘟神紧紧跟随着的。技术的斗争越发激烈,但是用户的电脑知识是不会跟着时代发展而自动填充的,最终,大众上网的人民成了这一切技术较量的受害者。
这个荒谬的发展方向,何时才能休止呢?
还有这篇:
对大多数的Windows开发者来说,如何在Win32系统中对API函数的调用进行拦截一直是项极富挑战性的课题,因为这将是对你所掌握的计算机知识较为全面的考验,尤其是一些在如今使用RAD进行软件开发时并不常用的知识,这包括了操作系统原理、汇编语言甚至是机器指令(听上去真是有点恐怖,不过这是事实)。
当前广泛使用的Windows操作系统中,像Win 9x和Win NT/2K,都提供了一种比较稳健的机制来使得各个进程的内存地址空间之间是相互独立,也就是说一个进程中的某个有效的内存地址对另一个进程来说是无意义的,这种内存保护措施大大增加了系统的稳定性。不过,这也使得进行系统级的API拦截的工作的难度也大大加大了。
当然,我这里所指的是比较文雅的拦截方式,通过修改可执行文件在内存中的映像中有关代码,实现对API调用的动态拦截;而不是用比较暴力的方式,直接对可执行文件的磁盘存储中机器代码进行改写。
二、API钩子系统一般框架
通常,我们把拦截API的调用的这个过程称为是安装一个API钩子(API Hook)。一个API钩子基本是由两个模块组成:一个是钩子服务器(Hook Server)模块,一般为EXE的形式;一个是钩子驱动器(Hook Driver)模块,一般为DLL的形式。
钩子服务器主要负责向目标进程注入钩子驱动器,使得钩子驱动器运行在目标进程的地址空间中,这是关键的第一步,而钩子驱动器则负责实际的API拦截处理工作,以便在我们所关心的API函数调用的之前或之后能做一些我们所希望的工作。一个比较常见的API钩子的例子就是一些实时翻译软件(像金山词霸)中必备的的功能:屏幕抓词。它主要是对一些Win32 API中的GDI函数进行了拦截,获取它们的输入参数中的字符串,然后在自己的窗口中显示出来。
针对上述关于API钩子的两个部分,有以下两点需要我们重点考虑的: 选用何种DLL注入技术,以及用何种API拦截机制。
三、注入技术的选用
由于在Win32系统中各个进程的地址是互相独立的,因此我们无法在一个进程中对另一个进程的代码进行有效的修改,但如果你要完成API钩子的工作又必须如此。因此,我们必须取某种独特的手段,使得API钩子(准确的说是钩子驱动器)能够成为目标进程中的一部分,才有较大的可能来对目标进程数据和代码进行有控制的修改。
通常可用的几种注入方式:
1.利用注册表
如果我们准备拦截的进程连接了User32.dll,也就是使用了 User32.dll中的API(一般图形界面的应用程序都是符合这个条件),那么就可以简单把你的钩子驱动器DLL的名字作为值添加在下面注册表的键下: HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs 值的形式可以为单个DLL的文件名,或者是一组DLL的文件名,相邻的名称之间用逗号或空格间隔。所有由该值标识的DLL将在符合条件的应用程序启动的时候装载。这是一个操作系统内建的机制,相对其他方式来说危险性较小,但它也有一些比较明显的缺点:该方法仅适用于NT/2K操作系统,显然看看键的名称就可以明白;如果需要激活或停止钩子的注入,只有重新启动Windows,这个就似乎太不方便了;最后一点也很显然,不能用此方法向没有使用User32.dll的应用程序注入DLL,例如控制台应用程序等。另外,不管是否为你所希望,钩子DLL将注入每一个GUI应用程序,这将导致整个系统性能的下降!
2.建立系统范围的Windows钩子
要向某个进程注入DLL,一个十分普遍也是比较简单的方法就是建立在标准的Windows钩子的基础上。Windows钩子一般是在DLL中实现的,这是一个全局性的Windows钩子的基本要求,这也很符合我们的需要。当我们成功地调用SetWindowsHookEx函数之后,便在系统中安装了某种类型的消息钩子,这个钩子可以是针对某个进程,也可以是针对系统中的所有进程。一旦某个进程中产生了该类型的消息,操作系统会自动把该钩子所在的DLL映像到该进程的地址空间中,从而使得消息回调函数(在 SetWindowsHookEx的参数中指定)能够对此消息进行适当的处理,在这里,我们所感兴趣的当然不是对消息进行什么处理,因此在消息回调函数中只需把消息钩子向后传递就可以了,但是我们所需的DLL已经成功地注入了目标进程的地址空间,从而可以完成后续工作。
我们知道,不同的进程之间是不能直接共享数据的,因为它们活动在不同的地址空间中。但在Windows钩子 DLL中,有一些数据,例如Windows钩子句柄HHook,这是由SetWindowsHookEx函数返回值得到的,并且作为参数将在 CallNextHookEx函数和UnhookWindoesHookEx函数中使用,显然使用SetWindowsHookEx函数的进程和使用 CallNextHookEx函数的进程一般不会是同一个进程,因此我们必须能够使句柄在所有的地址空间中都是有效的有意义的,也就是说,它的值必须必须在这些钩子DLL所挂钩的进程之间是共享的。为了达到这个目的,我们就应该把它存储在一个共享的数据区域中。
在VC++中我们可以用预编译指令#pragma data_seg在DLL文件中创建一个新的段,并且在DEF文件中把该段的属性设置为"shared",这样就建立了一个共享数据段。对于使用 Delphi的人来说就没有这么了:没有类似的比较简单的方法(或许是有的,但我没有找到)。不过我们还是可以利用内存映像技术来申请使用一块各进程可以共享的内存区域,主要是利用了CreateFileMing和MapViewOfFile这两个函数,这倒是一个通用的方法,适合所有的开发语言,只要它能直接或间接的使用Windows的API。
在Borland的BCB中有一个指令#pragma codeseg与VC++中的#pragma data_seg指令有点类似,应该也能起到一样的作用,但我试了一下,没有没有效果,而且BCB的联机帮助中对此也提到的不多,不知怎样才能正确的使用(或许是另外一个指令,呵呵)。
一旦钩子DLL加载进入目标进程的地址空间后,在我们调用UnHookWindowsHookEx函数之前是无法使它停止工作的,除非目标进程关闭。
这种DLL注入方式有两个优点: 这种机制在Win 9x/Me和Win NT/2K中都是得到支持的,预计在以后的版本中也将得到支持;钩子DLL可以在不需要的时候,可由我们主动的调用 UnHookWindowsHookEx来卸载,比起使用注册表的机制来说方便了许多。尽管这是一种相当简洁明了的方法,但它也有一些显而易见的缺点:首先值得我们注意的是,Windows钩子将会降低整个系统的性能,因为它额外增加了系统在消息处理方面的时间;其次,只有当目标进程准备接受某种消息时,钩子所在的DLL才会被系统映射到该进程的地址空间中,钩子才能真正开始发挥作用,因此如果我们要对某些进程的整个生命周期内的API调用情况进行监控,用这种方法显然会遗漏某些API的调用 。
3.使用 CreateRemoteThread函数
在我看来这是一个相当棒的方法,然而不幸的是,CreateRemoteThread这个函数只能在Win NT/2K系统中才得到支持,虽然在Win 9x中这个API也能被安全的调用而不出错,但它除了返回一个空值之外什么也不做。该注入过程也十分简单:我们知道,任何一个进程都可以使用 LoadLibrary来动态地加载一个DLL。但问题是,我们如何让目标进程(可能正在运行中)在我们的控制下来加载我们的钩子DLL(也就是钩子驱动器)呢?有一个API函数CreateRemoteThread,通过它可在一个进程中可建立并运行一个远程的线程--这个好像和注入没什么关系嘛?往下看!
调用该API需要指定一个线程函数指针作为参数,该线程函数的原型如下: Function ThreadProc(lpParam: Pointer): DWORD,我们再来看一下LoadLibrary的函数原型: Function LoadLibrary(lpFileName: PChar): HModule。发现了吧!这两个函数原型几乎是一样的(其实返回值是否相同关系不大,因为我们是无法得到远程线程函数的返回值的),这种类似使得我们可以把直接把LoadLibrary当做线程函数来使用,从而在目标进程中加载钩子DLL。
与此类似,当我们需要卸载钩子DLL时,也可以FreeLibrary作为线程函数来使用,在目标进程中卸载钩子DLL,一切看来是十分的简洁方便。通过调用GetProcAddress函数,我们可以得到LoadLibrary函数的地址。由于 LoadLibrary是Kernel32中的函数,而这个系统DLL的映射地址对每一个进程来说都是相同的,因此LoadLibrary函数的地址也是如此。这点将确保我们能把该函数的地址作为一个有效的参数传递给CreateRemoteThread使用。 FreeLibrary也是一样的。
AddrOfLoadLibrary := GetProcAddress(GetModuleHandle(‘Kernel32.dll'), ‘LoadLibrary');
HRemoteThread := CreateRemoteThread(HTargetProcess, nil, 0, AddrOfLoadLibrary, HookDllName, 0, nil);
要使用CreateRemoteThread,我们需要目标进程的句柄作为参数。当我们用 OpenProcess函数来得到进程的句柄时,通常是希望对此进程有全权的存取操作,也就是以PROCESS_ALL_ACCESS为标志打开进程。但对于一些系统级的进程,直接这样显然是不行的,只能返回一个的空句柄(值为零)。为此,我们必须把自己设置为拥有调试级的特权,这样将具有最大的存取权限,从而使得我们能对这些系统级的进程也可以进行一些必要的操作。
4.通过BHO来注入DLL
有时,我们想要注入DLL的对象仅仅是Internet Explorer,很,Windows操作系统为我们提供了一个简单的归档方法(这保证了它的可靠性!)―― 利用Browser Helper Objects(BHO)。一个BHO是一个在 DLL中实现的COM对象,它主要实现了一个IObjectWithSite接口,而每当IE运行时,它会自动加载所有实现了该接口的COM对象。
四、拦截机制
在钩子应用的系统级别方面,有两类API拦截的机制――内核级的拦截和用户级的拦截。内核级的钩子主要是通过一个内核模式的驱动程序来实现,显然它的功能应该最为强大,能捕捉到系统活动的任何细节,但难度也较大,不在本文的探讨范围之内(尤其对我这个使用Delphi的人来说,还没涉足这块领域,因此也无法探讨,呵呵)。
而用户级的钩子则通常是在普通的DLL中实现整个API的拦截工作,这才是此次重点关注的。拦截API函数的调用,一般可有以下几种方法:
1. 代理DLL(特洛伊木马
一个容易想到的可行的方法是用一个同名的DLL去替换原先那个输出我们准备拦截的API所在的DLL。当然代理DLL也要和原来的一样,输出所有函数。但如果想到DLL中可能输出了上百个函数,我们就应该明白这种方法的效率是不高的,估计是要累死人的。另外,我们还不得不考虑DLL的版本问题,很是麻烦。
2.改写执行代码
有许多拦截的方法是基于可执行代码的改写,其中一个就是改变在CALL指令中使用的函数地址,这种方法有些难度,也比较容易出错。它的基本思路是检索出在内存中所有你所要拦截的API的CALL指令,然后把原先的地址改成为你自己提供的函数的地址。
另外一种代码改写的方法的实现方法更为复杂,它的主要的实现步骤是先找到原先的API函数的地址,然后把该函数开始的几个字节用一个JMP指令代替(有时还不得不改用一个INT指令),从而使得对该API函数的调用能够转向我们自己的函数调用。实现这种方法要牵涉到一系列压栈和出栈这样的较底层的操作,显然对我们的汇编语言和操作系统底层方面的知识是一种考验。这个方法倒和很多文件型的感染机制相类似。
3.以调试器的身份进行拦截
另一个可选的方法是在目标函数中安置一个调试断点,使得进程运行到此处就进入调试状态。然而这样一些问题也随之而来,其中较主要的是调试异常的产生将把进程中所有的线程都挂起。它也需要一个额外的调试模块来处理所有的异常,整个进程将一直在调试状态下运行,直至它运行结束。
4.改写PE文件的输入地址表
这种方法主要得益于现如今Windows系统中所使用的可执行文件(包括EXE文件和DLL文件)的良好结构――PE文件格式(Portable Executable File Format),因此它相当稳健,又简单易行。要理解这种方法是如何运作的,首先你得对PE文件格式有所理解。
一个PE文件的结构大致如下所示:一般PE文件一开始是一段DOS程序,当你的程序在不支持Windows的环境中运行时,它就会显示"This Program cannot be run in DOS mode"这样的警告语句;接着这个DOS文件头,就开始真正的PE文件内容了,首先是一段称为"IME_NT_HEADER"的数据,其中是许多关于整个PE文件的消息,在这段数据的尾端是一个称为Data Directory的数据表,通过它能快速定位一些PE文件中段(section)的地址;在这段数据之后,则是一个"IME_SECTION_HEADER"的列表,其中的每一项都详细描述了后面一个段的相关信息;接着它就是PE文件中最主要的段数据了,执行代码、数据和等等信息就分别存放在这些段中。
在所有的这些段里,有一个被称为".idata"的段(输入数据段)值得我们去注意,该段中包含着一些被称为输入地址表(IAT,Import Address Table)的数据列表,每个用隐式方式加载的API所在的DLL都有一个IAT与之对应,同时一个API的地址也与IAT中一项相对应。当一个应用程序加载到内存中后,针对每一个API函数调用,相应的产生如下的汇编指令:
JMP DWORD PTR [XXXXXXXX]
如果在VC++中使用了_delcspec(import),那么相应的指令就成为:
CALL DWORD PTR [XXXXXXXX]。
不管怎样,上述方括号中的总是一个地址,指向了输入地址表中一个项,是一个DWORD,而正是这个 DWORD才是API函数在内存中的真正地址。因此我们要想拦截一个API的调用,只要简单的把那个DWORD改为我们自己的函数的地址,那么所有关于这个API的调用将转到我们自己的函数中去,拦截工作也就宣告顺利的成功了。这里要注意的是,自定义的函数的调用约定应该是API的调用约定,也就是 stdcall,而Delphi中默认的调用约定是register,它们在参数的传递方法等方面存在着较大的区别。
另外,自定义的函数的参数形式一般来讲和原先的API函数是相同的,不过这也不是必须的,而且这样的话在有些时候也会出现一些问题,我在后面将会提到。因此要拦截API的调用,首先我们就要得到相应的IAT的地址。系统把一个进程模块加载到内存中,其实就是把 PE文件几乎是原封不动的映射到进程的地址空间中去,而模块句柄HModule实际上就是模块映像在内存中的地址,PE文件中一些数据项的地址,都是相对于这个地址的偏移量,因此被称为相对虚拟地址(RVA,Relative Virtual Address)。
于是我们就可以从HModule开始,经过一系列的地址偏移而得到IAT的地址。不过我这里有一个简单的方法,它使用了一个现有的API函数ImageDirectoryEntryToData,它帮助我们在定位IAT时能少走几步,省得把偏移地址弄错了,走上弯路。不过纯粹使用RVA从HModule开始来定位IAT的地址其实并不麻烦,而且这样还更有助于我们对PE文件的结构的了解。上面提到的那个API 函数是在DbgHelp.dll中输出的(这是从Win 2K才开始有的,在这之前是由ImageHlp.dll提供的),有关这个函数的详细介绍可参见MSDN。
在找到IAT之后,我们只需在其中遍历,找到我们需要的API地址,然后用我们自己的函数地址去覆盖它,下面给出一段对应的源码:
procedure RedirectApiCall; var ImportDesc:PIME_IMPORT_DESCRIPTOR; FirstThunk:PIME_THUNK_DATA32; sz:DWORD;
begin
//得到一个输入描述结构列表的首地址,每个DLL都对应一个这样的结构 ImportDesc:=ImageDirectoryEntryToData(Pointer(HTargetModule), true, IME_DIRECTORY_ENTRY_IMPORT, sz);
while Pointer(ImportDesc.Name)<>nil do
begin //判断是否是所需的DLL输入描述
if StrIComp(PChar(DllName),PChar(HTargetModule+ImportDesc.Name))=0 then begin
//得到IAT的首地址
FirstThunk:=PIME_THUNK_DATA32(HTargetModule+ImportDesc.FirstThunk);
while FirstThunk.Func<>nil do
begin
if FirstThunk.Func=OldAddressOfAPI then
begin
//找到了匹配的API地址 ......
//改写API的地址
break;
end;
Inc(FirstThunk);
end;
end;
Inc(ImportDesc);
end;
end;
最后有一点要指出,如果我们手工执行钩子DLL的退出目标进程,那么在退出前应该把函数调用地址改回原先的地址,也就是API的真正地址,因为一旦你的DLL退出了,改写的新的地址将指向一个毫无意义的内存区域,如果此时目标进程再使用这个函数显然会出现一个非法操作。
五、替换函数的编写
前面关键的两步做完了,一个API钩子基本上也就完成了。不过还有一些相关的东西需要我们研究一番的,包括怎样做一个替换函数。 下面是一个做替换函数的步骤: 首先,不失一般性,我们先设有这样的一个API函数,它的原型如下:
function SomeAPI(param1: Pchar;param2: Integer): DWORD;
接着再建立一个与之有相同参数和返回值的函数类型:
type FuncType= function (param1: Pchar;param2: Integer): DWORD;
然后我们把SomeAPI函数的地址存放在OldAddress指针中。接着我们就可以着手写替换函数的代码了:
function DummyFunc(param1: Pchar;param2: Integer): DWORD; begin ......
//做一些调用前的操作
//调用被替换的函数,当然也可以不调用
result := FuncType(OldAddress) (param1 , param2);
//做一些调用后的操作
end;
我们再把这个函数的地址保存到NewAddress中,接着用这地址覆盖掉原先API的地址。这样当目标进程调用该API的时候,实际上是调用了我们自己的函数,在其中我们可以做一些操作,然后在调用原先的API函数,结果就像什么也没发生过一样。当然,我们也可以改变输入参数的值,甚至是屏蔽调这个API函数的调用。
尽管上述方法是可行的,但有一个明显的不足:这种替换函数的制作方法不具有通用性,只能针对少量的函数。如果只有几个API要拦截,那么只需照上述说的重复做几次就行了。但如果有各种各样的API要处理,它们的参数个数和类型以及返回值的类型是各不相同的,仍然用这种方法就太没效率了。
的确是的,上面给出的只是一个最简单最容易想到的方法,只是一个替换函数的基本构架。正如我前面所提到的,替换函数的与原先的API函数的参数类型不必相同,一般的我们可以设计一个没有调用参数也没有返回值的函数,通过一定的技巧,使它能适应各种各样的API 函数调用,不过这得要求你对汇编语言有一定的了解。
首先,我们来看一下执行到一个函数体内前的系统堆栈情况(这里函数的调用方式为stdcall),函数的调用参数是按照从右到左的顺序压入堆栈的(堆栈是由高端向低端发展的),同时还压入了一个函数返回地址。在进入函数之前,ESP正指向返回地址。因此,我们只要从ESP+4开始就可以取得这个函数的调用参数了,每取一个参数递增4。另外,当从函数中返回时,一般在EAX中存放函数的返回值。
了解了上述知识,我们就可以设计如下的一个比较通用的替换函数,它利用了Delphi的内嵌式汇编语言的特性。
Procedure DummyFunc;
asm add esp,4 mov eax,esp//得到第一个参数
mov eax,esp+4//得到第二个参数 ......
//做一些处理,这里要保证esp在这之后恢复原样
call OldAddress //调用原先的API函数 ......
//做一些其它的事情
end;
当然,这个替换函数还是比较简单的,你可以在其中调用一些纯粹用OP语言写的函数或过程,去完成一些更复杂的操作(要是都用汇编来完成,那可得把你忙死了),不过应该把这些函数的调用方式统一设置为stdcall方式,这使它们只利用堆栈来传递参数,因此你也只需时刻掌握好堆栈的变化情况就行了。如果你直接把上述汇编代码所对应的机器指令存放在一个字节数组中,然后把数组的地址当作函数地址来使用,效果是一样的。
六、后记
做一个API钩子的确是件不容易的事情,尤其对我这个使用Delphi的人来说,为了解决某个问题,经常在OP、C++和汇编语言的资料中东查西找,在程序调试中还不时的发生一些意想不到的事情,弄的自己是手忙脚乱。不过,好歹总算做出了一个 API钩子的雏形,还是令自己十分的高兴,对计算机系统方面的知识也掌握了不少,受益非浅。当初在写这篇文章之前,我只是想翻译一篇从网上Down下来的英文资料(网址为://.codeproject/ ,文章名叫"API Hook Revealed",示例源代码是用VC++写的,这里不得不佩服老外的水平,文章写得很有深度,而且每个细节都讲的十分详细)。
Linux系统移植的目录
任务管理器有什么
任务管理器的用户界面提供了文件、选项、查看、窗口、关机、帮助等六大菜单项,例如“关机”菜单下可以完成待机、休眠、关闭、重新启动、注销、切换等操作,其下还有应用程序、进程、性能、联网、用户等五个标签页,窗口底部则是状态栏,从这里可以查看到当前系统的进程数、CPU使用比率、更改的内存<容量等数据,默认设置下系统每隔两秒钟对数据进行1次自动更新,当然你也可以点击“查看→更新速度”菜单重新设置。
1. 应用程序
这里显示了所有当前正在运行的应用程序,不过它只会显示当前已打开窗口的应用程序,而QQ、MSN Messenger等最小化至系统托盘区的应用程序则并不会显示出来。
你可以在这里点击“结束任务”按钮直接关闭某个应用程序,如果需要同时结束多个任务,可以按住Ctrl键复选;点击“新任务”按钮,可以直接打开相应的程序、文件夹、文档或Internet,如果不知道程序的名称,可以点击“浏览”按钮进行搜索,其实这个“新任务”的功能看起来有些类似于开始菜单中的运行命令。
2. 进程
这里显示了所有当前正在运行的进程,包括应用程序、后台服务等,那些隐藏在系统底层深处运行的程序或木马程序都可以在这里找到,当然前提是你要知道它的名称。找到需要结束的进程名,然后执行右键菜单中的“结束进程”命令,就可以强行终止,不过这种方式将丢失未保存的数据,而且如果结束的是系统服务,则系统的某些功能可能无法正常使用。
Windows的任务管理器只能显示系统中当前进行的进程,而Process Explorer可以树状方式显示出各个进程之间的关系,即某一进程启动了哪些其他的进程,还可以显示某个进程所调用的文件或文件夹,如果某个进程是Windows服务,则可以查看该进程所注册的所有服务,需要的朋友可以从 ://.skycn/soft/17580.html 下载。
3. 性能
从任务管理器中我们可以看到计算机性能的动态概念,例如CPU和各种内存的使用情况。
CPU使用情况:表明处理器工作时间百分比的图表,该计数器是处理器活动的主要指示器,查看该图表可以知道当前使用的处理时间是多少。
CPU使用记录:显示处理器的使用程序随时间的变化情况的图表,图表中显示的样情况取决于“查看”菜单中所选择的“更新速度”设置值,“高”表示每秒2次,“正常”表示每两秒1次,“低”表示每四秒1次,“暂停”表示不自动更新。
PF使用情况:PF是页面文件page file的简写。但这个数字常常会让人误解,以为是系统当时所用页面文件大小。正确含义则是正在使用的内存之和,包括物理内存和虚拟内存。那么如何得知实际所使用的页面文件大小昵?一般用第三方软件,比如PageFile Monitor,也可以通过windows控制台来看。本人的页面文件预设了。
页面文件使用记录:显示页面文件的量随时间的变化情况的图表,图表中显示的样情况取决于“查看”菜单中所选择的“更新速度”设置值。
总数:显示计算机上正在运行的句柄、线程、进程的总数。
执行内存:分配给程序和操作系统的内存,由于虚拟内存的存在,“峰值”可以超过最大物理内存,“总数”值则与“页面文件使用记录”图表中显示的值相同。
句柄数:这个东东很专业的。会编程的人知道,我不懂,只知道被称作指针的指针,“线程数”指程序中能独立运行的部分,“进程数”简单理解就是运行的程序数目。
物理内存:计算机上安装的总物理内存,也称RAM,“可用数”物理内存中可被程序使用的空余量。但实际的空余量要比这个数值略大一点,因为物理内存不会在完全用完后才去转用虚拟内存的。也就是说这个空余量是指使用虚拟内存(pagefile)前所剩余的物理内存。 “系统缓存”被分配用于系统缓存用的物理内存量。主要来存放程序和数据等。一但系统或者程序需要,部分内存会被释放出来,也就是说这个值是可变的。
认可用量总数:其实就是被操作系统和正运行程序所占用内存总和,包括物理内存和虚拟内存(page file)。它和上面的PF使用率是相等的。“限制”指系统所能提供的最高内存量,包括物理内存(RAM)和虚拟(page file)内存。 “峰值”指一段时间内系统曾达到的内存使用最高值。如果这个值接近上面的“限制”的话,意味着要么你增加物理内存,要么增加pagefile,否则系统会给你颜色看的!
内核内存:操作系统内核和设备驱动程序所使用的内存,“分页数”是可以复制到页面文件中的内存,一旦系统需要这部分物理内存的话,它会被映射到硬盘,由此可以释放物理内存;“未分页”是保留在物理内存中的内存,这部分不会被映射到硬盘,不会被复制到页面文件中。
4. 联网
这里显示了本地计算机所连接的网络通信量的指示,使用多个网络连接时,我们可以在这里比较每个连接的通信量,当然只有安装网卡后才会显示该选项。
5. 用户
这里显示了当前已登录和连接到本机的用户数、标识(标识该计算机上的会话的数字ID)、活动状态(正在运行、已断开)、客户端名,可以点击“注销”按钮重新登录,或者通过“断开”按钮连接与本机的连接,如果是局域网用户,还可以向其他用户发送消息呢。
[编辑本段]任务管理器之特别任务
其实,任务管理器除了终止任务、结束进程、查看性能外,它还可以完成很多更高级的特别任务呢。下面,我们通过几个实例来介绍任务管理器的扩展应用:
实例一:同时最小化多个窗口
切换到“应用程序”标签页,按住Ctrl键同时选择需要同时最小化的应用程序项目,然后点击这些项目中的任意一个,从右键菜单中选择“最小化”命令即可,这里同时还可以完成层叠、横向平铺、纵向平铺等操作。
实例二:降低BT软件的占用率
运行BT软件时,往往会占用大量的系统,你会看到硬盘灯不停闪烁并伴随着飞速转动的噪音,此时无论是浏览网页或是运行其他应用程序,肯定会有系统停滞的感觉。
打开“任务管理器→进程”窗口,选择BT软件的进程名,然后从右键菜单中选择“设置优先级”命令,这里可以选择实时、高、高于标准、标准、低于标准、低等不同级别,请根据实际情况进行设置,例如设置为“低于标准”可以降低进程的优先级别,从而让Windows为其他进程分配更多的。
实例三:打造增强版本的任务管理器
有热心网友从Longhorn中将任务管理器剥离出来并提供下载,我们可以借此来打造一个增强版本的任务管理器。解压缩下载文件,会得到Taskkill.exe、Tasklist.exe、Taskmgr.exe等3个文件,首先覆盖\Windows\System32\Dllcahe\下的同名文件,覆盖前请事先备份源文件,接下来继续覆盖\Windows\System32\下的同名文件,当弹出“Windows文件保护”对话框时,选择“取消”按钮。
更换后的任务管理器不仅程序图标发生了变化,右击进程,可以发现在右键菜单中增加了打开所在目录、创建转储文件两个命令,而“查看→选择列”中增加了命令行、映像路径两个项目,前者可以查看所显示的进程是否被伪装,后者则可以查看进程的文件路径。
实例四:打开处理器的超线程
P4处理器的超线程技术(Hyper-Threading Technology)其实是相当于将一颗处理器分为两个虚拟的处理器,简单地说,实现超线程需要处理器、主板、操作系统三方面的支持。如果你使用的是Windows XP/Server 2003,而且确定自己的主板和处理器支持超线程,那么可以切换到“性能”标签页,如果这里显示两个CPU使用记录图表的话,说明你的处理器确确实实已经打开超线程。
当然,我们也可以在开机信息中查看超线程支持情况,一般会显示CPU1、CPU2两个处理器名称,或者启动后进入“设备管理器”,这样同样会显示两个处理器的信息。
实例五:禁用任务管理器
任务管理器可以完成如此强大的任务,如果你使用的是公用计算机,而又不希望他人私自操作任务管理器,可以在“开始→运行”框中键入Gpedit.msc命令打开组策略窗口,找到“本地计算机策略→用户配置→管理模板→系统→Ctrl+Alt+Del选项”项,然后在右侧窗口中选择“删除任务管理器”项,将其设置为“已启用”,以后按下“Ctrl+Alt+Del”组合键时就无法操作任务管理器了。
当然,通过文中提到的其他两个方法还是可以正常操作任务管理器的,一劳永逸的解决办法是为Taskmgr.exe文件设置用户授权,当然必须使用NTFS文件系统才行,呵呵。
也可以修改注册表来禁用:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\system
新建Dword值:DisableTaskMgr=1(禁用)DisableTaskMgr=0(解禁)
小知识
句柄:用来惟一标识(例如文件中注册表项)的值,以便程序可以访问它。
线程:在运行程序指令的进程的对象,线程允许在进程中进行并发操作,并使一个进程能够在不同处理器上同时运行其程序的不同部分。
进程:一个可执行程序(例如管理器)或者一种服务(例如MSTask)
6.当任务管理器的界面出现不正常,如性能.进程的切换栏不见了,无法最大化最小化时等等时,你可以取以下措施恢复如无管理器的界面。操作如下:在边框上空白处双击即可!!
Windows系统的任务管理器是大家经常会用到的一个程序,通常它主要被用来管理计算机进程或者查看计算机实时的工作状态。实际上它还有不少的妙用。
奇招一:在网吧也能“运行”
在网吧“混”的朋友们都知道,网吧的机子通常来说都会将运行对话框屏蔽掉,如果大家碰上某些情况需要使用运行对话框就只能束手无策了。其实这个时候任务管理器能被临时用来代替运行对话框的作用。
先按住“Ctrl+Alt+Del”组合键尝试一下能否调出任务管理器,能调出就好办了,我们依次点击任务管理器的菜单“文件→新建任务”,弹出“创建新任务”(图1)窗口,输入内容试试看,它跟运行对话框效果相同啊!
奇招二:快速刷新注册表
许多软件在安装后会提示我们需要重新启动才能让软件正常使用,其实大部分时候这些软件只是在“小题大做”,因为重启仅仅是为了让注册表更新而已,我们可以利用任务管理器来更快地让软件生效。
方法为:在“进程”选项卡中用鼠标选择“explorer.exe”进程,然后点击右下角的“结束进程”按钮将它结束,这个时候桌面显示消失了。不必惊慌,我们在“创建新任务”窗口中输入“explorer.exe”。运行即可让桌面恢复显示,同时计算机的注册表也会被更新,现在软件就能正常使用了。
奇招三:优化游戏运行
许多朋友都和笔者一样还在使用1GB以下的内存,所以当我们玩3D游戏的时候就会觉得运行有些卡,这个时候除了使关闭游戏以外的所有程序以外,似乎再没有其他节省内存的办法了,其实我们可以在运行游戏前先在任务管理器中结束“explorer.exe”进程,因为它在很多情况下可都是内存耗用大户,结束它可为我们的游戏增加几十MB的可用内存,游戏效果当然会有更多改善。
不过此时没了桌面显示,启动游戏的方法也有所改变,我们需要打开“文件→新建任务”,然后点击“浏览”按钮进入游戏目录载入游戏主程序,点击“确定”即可运行游戏。
在W2K/XP中,同时按下Ctrl+Alt+Del键,可以打开Windows任务管理器,单击“进程”,可以看到很多正在运行的EXE进程:
System Idle Process:这是关键进程,只有16kB,循环统计CPU的空闲度,这个值越大越好。该进程不能被结束,该进程似乎没低于过25%,大多数情况下保持50%以上。
system:system是windows页面内存管理进程,拥有0级优先。(当system后面出现.exe时是netcontroller木马生成的文件,出现在c:\\windows目录下,建议将其删除。)
explorer:explorer.exe控制着标准的用户界面、进程、命令和桌面等。explorer.exe总是在后台运行,根据系统的字体、背景、活动桌面等情况的不同,通常会消耗5.8MB到36MB内存不等。(explorer.exe和Internet Explorer可不同)
IEXPLORE:iexplore.exe是Microsoft对因特网的主要编程器.,这个微软视窗应用让你畅游网络有了地方。 iexplore.exe是非常必要的过程,不应终止,除非怀疑造成问题。它的作用是加快我们再一次打开IE的速度,当关闭所有IE窗口时,它将依然在后台运行。当我们用它上网冲浪时,占有7.3MB甚至更多的内存,内存随着打开浏览器窗口的增加也增多。
ctfmon:这是安装了WinXP后,在桌面右下角显示的语言栏。如果不希望它出现,可通过下面的步骤取消:控制面板-区域和语言选项-语言-详细信息-文字服务和输入语言-(首选项)语言栏-语言栏设置-把在桌面上显示语言栏的勾取消。这样会为你节省4MB多的内存。
wowexec:用于支持16位操作系统的关键进程,不能终止。
csrss:这是Windows的核心部份之一,全称为Client Server Process。这个只有4K的进程经常消耗3MB到6MB左右的内存,不能终止,建议不要修改此进程。
dovldr32:为了节省内存,可以将禁止,它占用大约2.3MB到2.6MB的内存。
winlogon:这个进程处理登录和注销任务,事实上,这个进程是必需的,它的大小和你登录的时间有关。
services:services.exe是微软windows操作系统的一部分。用于管理启动和停止服务。该进程也会处理在计算机启动和关机时运行的服务。这个程序对你系统的正常运行是非常重要的,该进程系统禁止结束。
svchost:Svchost.exe是属于微软windows操作系统的系统程序,用于执行dll文件。这个程序对你系统的正常运行是非常重要的。开机出现“Generic Host Process for Win32 Services遇到问题需要关闭”一般都是说的这个进程找不到dll文件所致。
msmsgs:这是微软的Windows Messengr(即时通信软件)著名的MSN进程,在WinXP的家庭版和专业版里面绑定的,如果你还运行着Outlook和MSN Explorer等程序,该进程会在后台运行支持所有这些微软号称的很Cool的,NET功能等新技术。
msn6:这是微软在WinXP里面的MSN浏览器进程,当msmsgs.exe运行后才有这个进程。
Point32:这是安装了特殊的鼠标软件(Intellimouse等等)后启动的等程序,这不是系统必须的进程,通过用户许可协议安装。由于在WinXP里面内建了很多鼠标新功能,所以,就没有必要在系统后台运行,既浪费1.1MB到1.6MB的内存,还要在任务栏占个地方!
spoolsv:用于将windows打印机任务发送给本地打印机,关闭以后一会又自己开开。
Promon:这是Intel系列网卡配置和安装的程序,在任务栏显示图标控制程序,占据大约656KB到1.1MB的内存。
smss:只有45KB的大小却占据着300KB到2MB的内存空间,这是一个Windows的核心进程之一,是windowsNT内核的会话管理程序。
taskmgr:如果你看到了这个进程在运行,其实就是看这个进程的“任务管理器”本身。它大约占用了3.2MB的内存,当你优化系统时,不要忘了把它也算进去。
Tastch:在XP系统中安装了powerToys后会出现此进程,按Alt+Tab键显示切换图标,大约占用1.4MB到2MB的内存空间。
lsass:本地安全权限服务。是微软安全机制的系统进程,主要处理一些特殊的安全机制和登录策略。
atievxx:这是随ati显卡硬件产品驱动一起安装而来。它不是纯粹的系统程序,但如果终止它,可能会导致不可知的问题。
alg:这是微软windows操作系统自带的程序。它用于处理微软windows网络连接共享和网络连接防火墙,这个程序对你系统的正常运行是非常重要的。
非windows任务管理器:大多数人会想起Windows任务管理器,但是Windows的这个任务管理器实在是太简陋了,因此很多人转而使用第三方软件。目前,在网上的流行的第三方任务管理器比较多,比如WinProc、Windows Processes、Windows进程管理器等。
让我们从任务管理器中抓和木马
任何和木马存在于系统中,都无法彻底和进程脱离关系,即使用了隐藏技术,也还是能够从进程中找到蛛丝马迹,因此,查看系统中活动的进程成为我们检测木马最直接的方法。但是系统中同时运行的进程那么多,哪些是正常的系统进程,哪些是木马的进程,而经常被木马冒的系统进程在系统中又扮演着什么角色呢?请看本文。
当我们确认系统中存在,但是通过“任务管理器”查看系统中的进程时又找不出异样的进程,这说明用了一些隐藏措施,总结出来有三法
1.以乱真
系统中的正常进程有:svchost.exe、explorer.exe、iexplore.exe、winlogon.exe等,可能你发现过系统中存在这样的进程:svch0st.exe、explore.exe、iexplorer.exe、winlogin.exe。对比一下,发现区别了么?这是经常使用的伎俩,目的就是迷惑用户的眼睛。通常它们会将系统中正常进程名的o改为0,l改为i,i改为j,然后成为自己的进程名,仅仅一字之差,意义却完全不同。又或者多一个字母或少一个字母,例如explorer.exe和iexplore.exe本来就容易搞混,再出现个iexplorer.exe就更加混乱了。如果用户不仔细,一般就忽略了,的进程就逃过了一劫。
2.偷梁换柱
如果用户比较心细,那么上面这招就没用了,会被就地正法。于是乎,也学聪明了,懂得了偷梁换柱这一招。如果一个进程的名字为svchost.exe,和正常的系统进程名分毫不差。那么这个进程是不是就安全了呢?非也,其实它只是利用了“任务管理器”无法查看进程对应可执行文件这一缺陷。我们知道svchost.exe进程对应的可执行文件位于“C:\WINDOWS\system32”目录下(Windows2000则是C:\WINNT\system32目录),如果将自身复制到“C:\WINDOWS\”中,并改名为svchost.exe,运行后,我们在“任务管理器”中看到的也是svchost.exe,和正常的系统进程无异。你能辨别出其中哪一个是的进程吗?
3.借尸还魂
除了上文中的两种方法外,还有一招终极大法——借尸还魂。所谓的借尸还魂就是用了进程插入技术,将运行所需的dll文件插入正常的系统进程中,表面上看无任何可疑情况,实质上系统进程已经被控制了,除非我们借助专业的进程检测工具,否则要想发现隐藏在其中的是很困难的。
上文中提到了很多系统进程,这些系统进程到底有何作用,其运行原理又是什么?下面我们将对这些系统进程进行逐一讲解,相信在熟知这些系统进程后,就能成功破解的“以乱真”和“偷梁换柱”了。
常被冒充的进程名有:svch0st.exe、schvost.exe、scvhost.exe。随着Windows系统服务不断增多,为了节省系统,微软把很多服务做成共享方式,交由svchost.exe进程来启动。而系统服务是以动态链接库(DLL)形式实现的,它们把可执行程序指向scvhost,由cvhost调用相应服务的动态链接库来启动服务。我们可以打开“控制面板”→“管理工具”→服务,双击其中“ClipBook”服务,在其属性面板中可以发现对应的可执行文件路径为“C:\WINDOWS\system32\clipsrv.exe”。再双击“Alerter”服务,可以发现其可执行文件路径为“C:\WINDOWS\system32\svchost.exe-kLocalService”,而“Server”服务的可执行文件路径为“C:\WINDOWS\system32\svchost.exe-knetsvcs”。正是通过这种调用,可以省下不少系统,因此系统中出现多个svchost.exe,其实只是系统的服务而已。
在Windows2000系统中一般存在2个svchost.exe进程,一个是RPCSS(RemoteProcedureCall)服务进程,另外一个则是由很多服务共享的一个svchost.exe;而在WindowsXP中,则一般有4个以上的svchost.exe服务进程。如果svchost.exe进程的数量多于5个,就要小心了,很可能是冒的,检测方法也很简单,使用一些进程管理工具,例如Windows优化大师的进程管理功能,查看svchost.exe的可执行文件路径,如果在“C:\WINDOWS\system32”目录外,那么就可以判定是了。
常被冒充的进程名有:iexplorer.exe、expiorer.exe、explore.exe。explorer.exe就是我们经常会用到的“管理器”。如果在“任务管理器”中将explorer.exe进程结束,那么包括任务栏、桌面、以及打开的文件都会统统消失,单击“任务管理器”→“文件”→“新建任务”,输入“explorer.exe”后,消失的东西又重新回来了。explorer.exe进程的作用就是让我们管理计算机中的。
explorer.exe进程默认是和系统一起启动的,其对应可执行文件的路径为“C:\Windows”目录,除此之外则为。
iexplore.exe
常被冒充的进程名有:iexplorer.exe、iexploer.exeiexplorer.exe进程和上文中的explorer.exe进程名很相像,因此比较容易搞混,其实iexplore.exe是MicrosoftInternetExplorer所产生的进程,也就是我们平时使用的IE浏览器。知道作用后辨认起来应该就比较容易了,iexplore.exe进程名的开头为“ie”,就是IE浏览器的意思。
iexplore.exe进程对应的可执行程序位于C:\ProgramFiles\InternetExplorer目录中,存在于其他目录则为,除非你将该文件夹进行了转移。此外,有时我们会发现没有打开IE浏览器的情况下,系统中仍然存在iexplore.exe进程,这要分两种情况:1.冒iexplore.exe进程名。2.偷偷在后台通过iexplore.exe干坏事。因此出现这种情况还是赶快用杀毒软件进行查杀吧。
rundll32.exe
常被冒充的进程名有:rundl132.exe、rundl32.exe。rundll32.exe在系统中的作用是执行DLL文件中的内部函数,系统中存在多少个Rundll32.exe进程,就表示Rundll32.exe启动了多少个的DLL文件。其实rundll32.exe我们是会经常用到的,他可以控制系统中的一些dll文件,举个例子,在“命令提示符”中输入“rundll32.exeuser32.dll,LockWorkStation”,回车后,系统就会快速切换到登录界面了。rundll32.exe的路径为“C:\Windows\system32”,在别的目录则可以判定是。
常被冒充的进程名有:spoo1sv.exe、spolsv.exe。spoolsv.exe是系统服务“PrintSpooler”所对应的可执行程序,其作用是管理所有本地和网络打印队列及控制所有打印工作。如果此服务被停用,计算机上的打印将不可用,同时spoolsv.exe进程也会从计算机上消失。如果你不存在打印机设备,那么就把这项服务关闭吧,可以节省系统。停止并关闭服务后,如果系统中还存在spoolsv.exe进程,这就一定是伪装的了。
限于篇幅,关于常见进程的介绍就到这里,我们平时在检查进程的时候如果发现有可疑,只要根据两点来判断:
1.仔细检查进程的文件名;
2.检查其路径。
通过这两点,一般的进程肯定会露出马脚。
找个管理进程的好帮手
系统内置的“任务管理器”功能太弱,肯定不适合查杀。因此我们可以使用专业的进程管理工具,例如Procexp。Procexp可以区分系统进程和一般进程,并且以不同的颜色进行区分,让冒系统进程的进程无处可藏。
运行Procexp后,进程会被分为两大块,“SystemIdleProcess”下属的进程属于系统进程,
explorer.exe”下属的进程属于一般进程。我们介绍过的系统进程svchost.exe、winlogon.exe等都隶属于“SystemIdleProcess”,如果你在“explorer.exe”中发现了svchost.exe,那么不用说,肯定是冒充的。
第1篇 系统移植基础篇
第1章 linux内核介绍 2
1.1 系统调用接口 2
1.1.1 linux系统调用 2
1.1.2 用户编程接口 2
1.1.3 系统调用与服务例程的对应关系 3
1.1.4 系统调用过程 3
1.1.5 系统调用传递的参数 4
1.2 进程管理 4
1.2.1 进程 4
1.2.2 进程描述符 5
1.2.3 进程状态 6
1.2.4 进程调度 6
1.2.5 进程地址空间 8
1.3 内存管理 10
1.3.1 内存管理技术 10
1.3.2 内存区管理 12
1.3.3 内核中获取内存的几种方式 13
1.4 虚拟文件系统 14
1.4.1 虚拟文件系统作用 14
.1.4.2 文件系统的注册 15
1.4.3 文件系统的安装和卸载 15
1.5 设备驱动程序 17
1.5.1 字符设备驱动程序 17
1.5.2 块设备驱动程序 18
1.5.3 网络设备驱动程序 21
1.5.4 内存与i/o操作 22
1.6 小结 23
第2章 嵌入式linux开发环境搭建 24
2.1 虚拟机及linux安装 24
2.1.1 虚拟机的安装 24
2.1.2 单独分区安装系统 30
2.1.3 虚拟机和主机通信设置 31
2.1.4 vmware tools工具安装 33
2.1.5 虚拟机与主机共享文件 35
2.1.6 虚拟机与主机文件传输 36
2.2 交叉编译工具 38
2.2.1 交叉编译工具安装 38
2.2.2 交叉编译器测试 43
2.3 超级终端和minicom 44
2.3.1 超级终端软件的安装 44
2.3.2 minicom使用 45
2.3.3 securecrt使用 48
2.4 内核、文件系统加载工具 48
2.4.1 烧写bootloader 48
2.4.2 内核和文件系统下载 52
2.4.3 应用程序和文件传输 54
2.5 在开发中使用网络文件系统(nfs) 56
2.5.1 虚拟机设置 56
2.5.2 虚拟机的ip地址设置 56
2.5.3 验证网络连接 59
2.5.4 设置共享目录 59
2.5.5 启动nfs服务 60
2.5.6 修改共享配置后 61
2.5.7 挂载nfs 61
2.5.8 双网卡挂载nfs 61
2.6 小结 62
第2篇 系统移植技术篇
第3章 bootloader移植 64
3.1 bootloader介绍 64
3.1.1 bootloader与嵌入式linux系统的关系 64
3.1.2 bootloader基本概念 64
3.1.3 bootloader启动过程 66
3.2 bootloader之u-boot 67
3.2.1 u-boot优点 67
3.2.2 u-boot的主要功能 68
3.2.3 u-boot目录结构 68
3.3 u-boot移植过程 69
3.3.1 环境配置 69
3.3.2 修改cpu/arm920t/start.s 70
3.3.4 具体平台相关修改 79
3.3.5 其他部分修改 81
3.3.6 u-boot的编译 84
3.4 bootloader之vivi 85
3.4.1 vivi简介 85
3.4.2 vivi配置与编译 85
3.4.3 代码分析 88
3.5 vivi的运行 88
3.5.1 bootloader启动的阶段一 89
3.5.2 bootloader启动的阶段二 95
3.6 小结 95
第4章 linux内核裁剪与移植 96
4.1 linux内核结构 96
4.1.1 内核的主要组成部分 96
4.1.2 内核源码目录介绍
4.2 内核配置选项 99
4.2.1 一般选项 99
4.2.2 内核模块加载方式支持选项 100
4.2.3 系统调用、类型、特性、启动相关选项 101
4.2.4 网络协议支持相关选项 102
4.2.5 设备驱动支持相关选项 102
4.2.6 文件系统类型支持相关选项 103
4.2.7 安全相关选项 104
4.2.8 其他选项 104
4.3 内核裁剪及编译 105
4.3.1 安装内核源代码 105
4.3.2 检查编译环境设置 105
4.3.3 配置内核 106
4.3.4 编译内核 115
4.4 内核映像文件移植到arm板 116
4.4.1 移植准备 116
4.4.2 烧写系统 118
4.5 内核升级 121
4.5.1 准备升级内核文件 121
4.5.2 移植过程 122
4.6 小结 125
第5章 嵌入式文件系统制作 126
5.1 文件系统选择 126
5.1.1 flash硬件方案比较 126
5.1.2 嵌入式文件系统的分层结构 127
5.2 基于flash的文件系统 127
5.2.1 jffs文件系统(journalling flash filesystem) 128
5.2.2 yaffs文件系统(yet another flash file system) 130
5.2.3 cramfs文件系统(compressed rom file system) 133
5.2.4 romfs文件系统(rom file system) 134
5.3 基于ram的文件系统 135
5.4 文件系统的制作 135
5.4.1 制作ramdisk文件系统 136
5.4.2 制作yaffs2文件系统 144
5.4.3 制作jffs2文件系统 150
5.4.4 其他文件系统制作 152
5.5 小结 153
第3篇 系统移植与驱动篇
第6章 lcd驱动移植 156
6.1 认识lcd相关硬件原理 156
6.1.1 lcd概述 156
6.1.2 lcd控制器 157
6.1.3 lcd控制器方块图 157
6.1.4 lcd控制器操作 158
6.1.5 lcd控制寄存器 163
6.2 lcd参数设置 166
6.3 内核lcd驱动机制 167
6.3.1 framebuffer概述 167
6.3.2 framebuffer 设备驱动的结构 167
6.4 linux 2.6.25的lcd驱动源码分析 171
6.4.1 lcd驱动开发的主要工作 171
6.4.2 s3c2410fb_init()函数分析 172
6.4.3 s3c2410fb_probe()函数分析 173
6.4.4 s3c2410fb_remove()函数分析 178
6.5 移植内核中的lcd驱动 179
6.5.1 lcd硬件电路图 179
6.5.2 修改lcd源码 179
6.5.3 配置内核 184
6.6 小结 187
第7章 触摸屏驱动移植 188
7.1 触摸屏概述 188
7.1.1 触摸屏工作原理 188
7.1.2 触摸屏的主要类型 188
7.2 s3c2440 adc接口使用 191
7.2.1 s3c2440触摸屏接口概述 191
7.2.2 s3c2440触摸屏接口操作 192
7.3 2.6内核触摸屏驱动源码分析(s3c2410_ts.c源码分析) 196
7.4 linux内核输入子系统介绍 201
7.4.1 input子系统概述 202
7.4.2 输入设备结构体 202
7.4.3 输入链路的创建过程 205
7.4.4 使用input子系统 206
7.4.5 编写输入设备驱动需要完成的工作 208
7.5 触摸屏驱动移植和内核编译 209
7.5.1 修改初始化源码 209
7.5.2 修改硬件驱动源码s3c2440_ts.c 211
7.5.3 修改kconfig和makefile 213
7.5.4 配置编译内核 214
7.5.5 触摸屏测试程序设计 215
7.6 小结 216
第8章 usb设备驱动移植 217
8.1 usb协议 217
8.1.1 usb协议的系统主要组成部分 217
8.1.2 总线物理拓扑结构 219
8.1.3 usb设备、配置、接口、端点 219
8.1.4 usb设备状态 222
8.1.5 usb枚举过程 223
8.1.6 usb请求块(urb) 226
8.2 usb主机驱动 230
8.2.1 usb主机驱动结构和功能 230
8.2.2 主机控制器驱动(usb_hcd) 231
8.2.3 ohci主机控制器驱动 233
8.2.4 s3c24xx ohci主机控制器驱动实例 234
8.3 usb设备驱动 237
8.3.1 usb骨架程序分析 237
8.3.2 usb驱动移植的时钟设置 241
8.4 usb鼠标键盘驱动 242
8.4.1 usb鼠标驱动代码分析 242
8.4.2 usb键盘驱动代码分析 245
8.4.3 内核中添加usb鼠标键盘驱动 248
8.5 u盘驱动 249
8.5.1 内核配置 249
8.5.2 移植和测试 250
8.6 小结 252
第9章 网卡驱动程序移植 253
9.1 以太网概述 253
9.1.1 以太网连接 253
9.1.2 以太网技术概述 254
9.1.3 以太网的帧结构 256
9.2 网络设备驱动程序体系结构 258
9.2.1 嵌入式linux网络驱动程序介绍 258
9.2.2 linux网络设备驱动的体系结构 259
9.2.3 网络设备驱动程序编写方法 259
9.2.4 网络设备驱动程序应用实例 261
9.3 net_device 数据结构 262
9.3.1 全局信息 262
9.3.2 硬件信息 263
9.3.3 接口信息 263
9.3.4 设备方法 266
9.3.5 公用成员 268
9.4 dm9000网卡概述 268
9.4.1 dm9000网卡总体介绍 269
9.4.2 dm9000网卡的特点 269
9.4.3 内部寄存器 270
9.4.4 功能描述 274
9.5 dm9000网卡驱动程序移植 275
9.5.1 dm9000网卡连接 275
9.5.2 驱动分析——硬件的数据结构 276
9.5.3 驱动分析——数据读写函数 277
9.5.4 驱动分析——重置网卡 277
9.5.5 驱动分析——初始化网卡 277
9.5.6 驱动分析——打开和关闭网卡 282
9.5.7 驱动分析——数据包的发送与接收 283
9.5.8 dm9000网卡驱动程序移植 285
9.6 小结 288
第10章 音频设备驱动程序移植 289
10.1 音频设备接口 289
10.1.1 pcm(脉冲编码调制)接口 289
10.1.2 iis(inter-ic sound)接口 289
10.1.3 ac(audio codec 19)接口 289
10.1.4 linux音频设备驱动框架 290
10.2 linux音频设备驱动——oss驱动框架 291
10.2.1 oss驱动架构硬件 291
10.2.2 oss驱动架构代码 291
10.2.3 oss初始化函数oss_init() 293
10.2.4 oss释放函数oss_cleanup() 294
10.2.5 打开设备文件函数sound_open() 295
10.2.6 录音函数sound_read() 296
10.2.7 播放函数sound_write() 2
10.2.8 控制函数sound_ioctl() 2
10.3 linux音频设备驱动——alsa驱动框架 298
10.3.1 card和组件 299
10.3.2 pcm设备 303
10.3.3 控制接口 306
10.3.4 ac api音频接口 308
10.4 音频设备应用程序编写 312
10.4.1 dsp接口编程 312
10.4.2 mixer接口编程 315
10.4.3 alsa应用程序编程 316
10.5 音频设备驱动移植 318
10.5.1 添加uda1341结构体 318
10.5.2 修改录音通道 319
10.5.3 内核中添加uda1341驱动支持 320
10.5.4 移植新内核并进行测试 321
10.6 音频播放程序madplay的移植 322
10.6.1 准备移植需要的源文件 322
10.6.2 交叉编译 322
10.6.3 移植和测试 323
10.6.4 编译中可能遇到的问题 324
10.7 小结 324
第11章 sd卡驱动移植 325
11.1 sd卡简介 325
11.1.1 sd卡系统概念 325
11.1.2 sd卡寄存器 325
11.1.3 sd功能描述 326
11.2 sd卡驱动程序分析 329
11.2.1 host驱动部分 330
11.2.2 core驱动部分 333
11.2.3 card驱动部分 337
11.3 sd卡移植步骤 339
11.3.1 添加延时和中断 339
11.3.2 配置内核 340
11.3.3 烧写新内核 341
11.4 小结 342
第12章 nandflash驱动移植 343
12.1 nandflash介绍 343
12.1.1 nandflash命令介绍 343
12.1.2 nandflash控制器 344
12.2 nandflash驱动介绍 345
12.2.1 nand芯片结构 345
12.2.2 nandflash驱动分析 346
12.3 nandflash驱动移植 351
12.3.1 内核的修改 351
12.3.2 内核的配置和编译 353
12.4 小结 353
第4篇 系统移植高级篇
第13章 minigui与移植 356
13.1 minigui在上位机中的安装 356
13.1.1 安装需要的安装文件 356
13.1.2 minigui的运行模式 357
13.1.3 编译并安装minigui 357
13.1.4 编译安装minigui需要的支持库 360
13.1.5 编译minigui应用程序例子 360
13.2 eclipse开发minigui程序 361
13.2.1 linux下安装eclipse介绍 361
13.2.2 使用eclipse编译minigui程序 363
13.2.3 设置外部工具 367
13.2.4 运行程序 368
13.3 vc++6.0开发minigui程序 368
13.3.1 安装windows开发库 368
13.3.2 建立新工程 369
13.3.3 添加文件和设置工程 370
13.3.4 编译和运行程序 371
13.3.5 minigui程序编程风格举例 372
13.4 minigui的交叉编译和移植 374
13.4.1 交叉编译minigui 375
13.4.2 移植minigui程序 376
13.5 小结 378
第14章 qt开发与qtopia移植 379
14.1 qt安装与编程 379
14.1.1 下载安装qt 379
14.1.2 qt编程 380
14.1.3 使用qmake生成makefile 382
14.2 qtopia core在x86平台上的安装和应用 383
14.2.1 qtopia core安装准备 383
14.2.2 编译qtopia core 384
14.2.3 qtopia在x86平台上的应用开发 385
14.3 qtopia core在嵌入式linux上的移植 388
14.3.1 qtopia core移植准备 389
14.3.2 交叉编译qtopia core 389
14.3.3 编译内核 392
14.3.4 应用程序开发 392
14.3.5 应用程序移植 395
14.4 小结 395
第15章 嵌入式数据库berkeley db移植 396
15.1 数据库的基本概念 396
15.1.1 利用文档和源代码 396
15.1.2 创建环境句柄 396
15.1.3 创建数据库句柄 3
15.1.4 打开数据库 398
15.1.5 d结构 398
15.1.6 存取数据 399
15.1.7 关闭数据库 400
15.2 berkeley db数据库安装 400
15.2.1 安装成c库 400
15.2.2 安装成c++库 401
15.2.3 交叉编译安erkeley db 401
15.3 使用berkeley db数据库 403
15.3.1 代码分析 403
15.3.2 编译运行程序 406
15.4 移植berkeley db数据库 407
15.4.1 数据库设计 407
15.4.2 编写应用程序 407
15.4.3 调试和交叉编译应用程序 409
15.4.4 数据库的移植和测试 410
15.5 小结 410
第16章 嵌入式数据库sqlite移植 411
16.1 sqlite支持的sql语句 411
16.1.1 数据定义语句 411
16.1.2 数据操作语句 412
16.2 sqlite数据库编译、安装和使用 412
16.2.1 安装sqlite 413
16.2.2 利用sql语句操作sqlite数据库 413
16.2.3 利用c接口访问sqlite数据库 414
16.3 移植sqlite 417
16.3.1 交叉编译sqlite 417
16.3.2 交叉编译应用程序 418
16.4 移植sqlite数据库 418
16.4.1 文件移植 419
16.4.2 运行应用程序 419
16.4.3 测试sqlite3 419
16.5 小结 421
第17章 嵌入式web服务器boa移植 422
17.1 boa介绍 422
17.1.1 boa的功能 422
17.1.2 boa流程分析 423
17.1.3 boa配置信息 426
17.2 boa编译和html页面测试 428
17.2.1 编译boa源代码 428
17.2.2 设置boa配置信息 429
17.2.3 测试boa 429
17.3 cgi脚本测试 431
17.3.1 编写测试代码 431
17.3.2 编译测试程序 431
17.3.3 测试cgi脚本 431
17.4 boa交叉编译与移植 431
17.4.1 交叉编译boa 432
17.4.2 准备测试程序 432
17.4.3 配置boa 432
17.4.4 测试 433
17.5 boa与sqlite结合 433
17.5.1 通过cgi程序访问sqlite 434
17.5.2 编译和测试 436
17.6 小结 437
第18章 嵌入式web服务器td移植 438
18.1 td介绍 438
18.1.1 web服务器比较 438
18.1.2 td的特点 438
18.1.3 td核心代码分析 439
18.2 td编译和html页面测试 442
18.2.1 配置文件介绍 442
18.2.2 td编译 443
18.2.3 运行和测试td 443
18.3 cgi脚本测试 446
18.3.1 编写测试代码 446
18.3.2 编译测试程序 447
18.3.3 测试cgi脚本 447
18.4 td交叉编译与移植 447
18.4.1 交叉编译td 447
18.4.2 交叉编译cgi程序 448
18.4.3 移植td 448
18.4.4 测试 449
18.5 td与嵌入式数据库结合 450
18.5.1 通过cgi程序访问sqlite 450
18.5.2 编译和测试 452
18.6 小结 453
第19章 jvm及其移植 454
19.1 jvm介绍 454
19.1.1 jvm原理 454
19.1.2 jvm支持的数据类型 455
19.1.3 jvm指令系统 456
19.1.4 jvm寄存器 456
19.1.5 jvm栈结构 456
19.1.6 jvm碎片回收堆 459
19.1.7 jvm异常抛出和异常捕获 459
19.2 类装载 460
19.2.1 装载类的结构体 460
19.2.2 装载类的操作 461
19.3 垃圾回收 463
19.3.1 mark-and-sweep回收算法 464
19.3.2 分代回收算法 465
19.3.3 增量收集 466
19.4 解析器 466
19.4.1 函数interpret() 466
19.4.2 函数fastinterpret() 467
19.4.3 函数slowinterpret () 469
19.5 ja编程浅析 470
19.5.1 ja程序命令 470
19.5.2 ja构造函数 470
19.5.3 ja主函数 470
19.5.4 ja程序编译与运行 471
19.6 kvm执行过程 471
19.6.1 kvm启动过程 471
19.6.2 kvm用到的计数器清零 474
19.6.3 kvm初始化内存管理 475
19.6.4 kvm中的哈希表初始化 476
19.6.5 kvm中的初始化 477
19.6.6 kvm中的释放 477
19.7 pc机安装jvm 477
19.7.1 jvm在windows上的安装 478
19.7.2 jvm在linux上的安装 479
19.8 kvm移植和测试 480
19.8.1 sdk安装和环境变量设置 480
19.8.2 修改makefile和代码 480
19.8.3 kvm编译 481
19.8.4 测试 481
19.8.5 移植 483
19.9 小结 485
第20章 voip技术与linphone编译 486
20.1 voip介绍 486
20.1.1 voip基本原理 486
20.1.2 voip的基本传输过程 487
20.1.3 voip的优势 487
20.1.4 voip的实现方式 487
20.1.5 voip的关键技术 488
20.2 osip协议概述 488
20.3 osip状态机 489
20.3.1 ict(invite client (outgoing) transaction)状态机 489
20.3.2 nict(non-invite client (outgoing) transaction)状态机 498
20.3.3 ist(invite server (incoming) transaction)状态机 499
20.3.4 nist(non-invite server (incoming) transaction)状态机 500
20.4 osip解析器 500
20.4.1 初始化解析类型函数osip_body_init() 500
20.4.2 释放函数osip_body_free() 501
20.4.3 字符串到body类型转换函数osip_body_parse() 501
20.4.4 body类型到字符串类型转换函数osip_body_to_str() 502
20.4.5 克隆函数osip_body_clone() 504
20.4.6 osip解析器分类 505
20.5 osip事务层 506
20.6 sip建立会话的过程 508
20.7 rtp协议 510
20.7.1 rtp基本概念 510
20.7.2 发送rtp 511
20.7.3 接收rtp 513
20.8 linphone编译与测试 515
20.8.1 编译linphone需要的软件包 516
20.8.2 x86平台上编译和安装 516
20.8.3 linphone测试 519
20.8.4 进一步的测试和开发 523
20.9 linphone交叉编译 523
20.9.1 linphone的交叉编译 523
20.9.2 linphone的测试 526
20.10 小结 527