ACCESS菜鸟,求花瓶大神很菜鸟小说指教,并告知为什么会出现这样的情况

只需一步,快速开始
扫一扫,访问微社区
查看: 8152|回复: 29
access菜鸟七大邪门武器之1—DsoFramer让word、excel作Access的报表
本帖最后由 ganlinlao 于
14:59 编辑
& && & 兄弟,如果你和我和一样,只是一个刚入门的access菜鸟。兄弟,如果你和我一样,可怜到只会一点点word和excel,而站在access门前徘徊许久而不得而入。那么本邪门武器就是为你我准备的。让我们用这种另类的方法,一起渡过苦难的菜鸟岁月吧。
  作为一个有觉悟的Access的超烂菜鸟,Access的一些功能让我很迷惑,以下是我的一些愚蠢的看法:
(1)、Access的报表功能很烂。我根本就学不会Access的报表。
(2)、Access窗体的条件格式功能不强,使用条件格式很容易出问题。
(3)、Access的查询简单易用,但对查询后的数据局部分析功能很弱。要进行分析,你得写一堆又一堆的vba代码,而VBA在这方面的能力也是超级低能。
(4)、Access的窗体无法动态加载,这让我几乎绝望。
(5)、Access的连续窗体和数据表视图让我一直很迷惑,虽然它们很易用,但确实让我很迷惑。我根本不知道它们是以什么样的方式在工作?虽然我隐隐有所猜测,但总觉得这种臆度可能是不准确的。
(6)、随着Access版本的提升,Access的图表功能会变得很烂,而且只会越来越烂。
俗话说:武功再高,也怕菜刀,作为菜鸟,我决定挥舞这把菜刀肢解Access功能。
& && & 用word和excel分别替代Access的部分功能。这是因为人们对word和excel的熟悉程度远远超过对Access的使用。随便走出来一个办公室的更年期大妈,使用word的水平,都不是我能匹敌的。而不少人对excel的研究之精到了令人发指的地步。
  为此我不惜引入这个让人又爱又恨的DsoFramer,之所以让人恨,是因为它的小缺陷很多很多,但带来的好处也是相当明显的。而且用它还有可能带来一些额外的其它更有趣的东西,这也是我为什么会想用它。
再次声明这只是我个人菜鸟式的使用方式,聪明人一般要慎用。
1、2.3版的DsoFramer的使用范围:
DsoFramer支持office10,2013,Wps,viso,project,支持office2015也是没问题。但DsoFramer不支持office2003打开docx,xlsx,pptx。也就是说不支持2007格式兼容包。所以在2003中使用要特别注意。DsoFramer对doc,xls,ppt的支持最好。DsoFramer支持任何office版本的混装(我就是在混装13环境下测试),也支持office的精简版,但正常情况下还是使用完整版为好,这样问题会少一些。DsoFramer是开源的,所以没有任何版权问题。
2、2.3版的dsoframer的缺陷:
(1)、dsoframer的getApplicaiton方法:在新建word文档时,获取word的application会出现错误,弥补的方法是:set docApp=dsoFramer.acitveDocument.Application。在调用excel和PPT则不会。
(2)、dsoFramer的LoadoriginalFile方法,既支持doc,xls,ppt,而且也支持docx,xlsx,pptx。但使用docx,xlsx,pptx时,要这样写:
dsoFramer.loadOriginalFile &c:\1.docx&,&doc&。xlsx,pptx的写法类似。也可以用Open方法打开文档。Open方法在打开http:\\文件时,
docx,xlsx,pptx格式的文件,会出现问题。所以在web中使用,尽量使用LoadOriginalFile方法。
(3)、DsoFramer本身的SaveAs方法,默认会保存为doc,xls,ppt,而不支持docx,xlsx,pptx。所以应该用word,excel,ppt程序的SaveAs方法另存为来支持全部的格式。
(4)、DsoFramer的getTempFilePath,会默认返回一个支持doc,xls,ppt格式的tmp文件。这个tmp文件写入docx,xlsx,pptx格式时,word或excel程序打开文档会出错。弥补的方法:
如果是xlsx,docx,pptx等文件格式,则后缀名必须改成docx等。带VBA代码的excel文件,最好统一用xls格式。
(5)、DsoFramer在关闭excel文档后,没有释放excel的进程,这是后来改编的人粗心造成的。所以系统后台进程会一直有一个excel.exe,但不影响任何使用。这个目前我还没找到简易的方法弥补。如果你找到了,希望告知。Word和ppt则没有这个缺陷。
(6)、DsoFramer没有文档事件连接点,这是最大的遗憾。不过因为我们是在Aceess或VB中使用,所以这点缺陷还是能够弥补回来一些。
(7)、DsoFramer在使用word的打印预览没有任何问题。但在使用excel的打印预览,会有一些问题,可以调出打印预览界面,但调不回普通页面,这是excel的打印预览特殊性造成的。
(8)、DsoFramer没有简易的isOpened方法来判断文档是否打开或新建,弥补的方法:我们可以通过onDocumentOpened事件,用一个isOpened变量来记录是否打开或新建。
文档格式是doc或者是docx,这个可以有很多办法来判断。所以在这里我就不提了,但最好还是用一个doctype变量来记录是doc还是docX。Excel和PPT类似。
(9)、使用excel的VBA,宏安全性必须调到最低。这是oleobject方式决定的。在特殊的网络环境下,可能还需要调整保护视图。
(10)、以后再补上,写太多了,会让你后怕,呵呵。
看起来相当强大哦!
本帖最后由 ganlinlao 于
20:25 编辑
第6章、网络篇
2、Access作为客户端与web的交互能力的思考& && && & 坦白地说,作为一个超烂的菜鸟,我总愚蠢地认为写任何一个access应用,都应该具有网络功能。没有网络功能的access应用更象是一种自娱自乐。甚至我悲观地认为,如果access不具有强大的网络交互能力的话,那么在不远的将来,它会很快走向消亡。而且我坚信,以后的Access应该具有很强大的网络交互能力,否则它确实没有多少存在的意义。微软在access2013中已经开始尝试了。很可惜,在认坛里这么多年来,极少人谈及Access与网络交互能力。似乎太多的人坚定地认为access+SQLserver是唯一正确的方式。Access+SQL server是一种双层结构,有它的便利的一面。也有它的一些的局限性。这种局限性包括:SQL server的安装问题(在一些很小的应用中,这会是一个问题,其它的不算是问题)。在线更新问题,拓展性问题(拓展起来不方便),office文档管理问题(我了解到不少人尝试想利用sqlserver的filestream读取word或excel文件,但似乎问题很多而不可行),图片等资源的更新问题……
& & 虽然我们在access经常使用com组件,整个windows到处都是,而vba也只支持com的对象。但com本质是什么?我个人愚蠢地认为com的核心能力之一是聚合能力。通过组件的聚合,通过接口,达到简便地复用。而且我个人愚蠢地认为网络的核心功能之一就是聚集能力。不管是xml,webservice,还是其它的让人眼花缭乱的新技术,无非都是为了方便数据的聚集。在这一点上com组件和网络有着惊人一致的一面。
& && & 当谈及access与web网络交互能力时,有几个概念是一定要厘清的。1、有状态和无状态。Access与sql server的连接是一种有状态的连接。而access与http的连接是一种无状态的连接。但websock的出现可能会改变这种情况。2、字符集。整个windows都是采用gbk字符集,access和sql server也是默认以gbk作为默认字符集,但web上,gbk只是一种可选的字符集,更多的是采用utf-8字符集,很可惜vba没有简便的函数处理utf-8字符集。3、缓存问题。尽管access也有缓存,只要你打开一个mdb或acced,缓存就一定存在。但这个缓存和浏览器中的缓存,是两个概念。
4、同步和异步:access打开本地的mdb或acced,access打开sql server,所有的recordset默认是同步的。尽管你可以使用异步,但我很少见到有人使用异步。但在web的数据交互时,异步但会成为一个异常重要的问题。
5、相对路径和绝对路径:
为实现Http访问,微软提供了这么几种API:
(1)Winsock,工作于网络层和传输层的开发库,对于编写TCP,UDP,以及原始IP通信程序非常合适。函数原形也基本符合Unix socket标准。Windows平台上的大多数程序,如QQ,讯雷等都基于其开发。
(2)ws2_32,是Winsock的升级版本,在兼容的基础上增加了不符合Unix socket标准,但更适合Windows平台的库函数,一般以WSA*开头。
现代的大多数Windows平台程序也都开始依赖于此库。
(3)WinInet,Windows Internet扩展库,工作于应用协议层,提供了http,ftp,gopher协议的实现,为基于以上三种协议的程序开发提供基础平台,需要说明的是,尽管WinInet工作于应用层,但其本身wininet.dll的实现并不依赖于winsock.dll或ws2_32.dll,而是独立存在的。至少目前的版本是这样。基于WinInet的应用程序最著名的例子就是IE了。
(4)WinHttp,也是工作于应用协议层,提供了http协议的实现。看起来与WinInet有重复的部分,没错,WinHttp就是为了替换WinInet中的http部分的,它更加健壮稳定,而且还为http服务器端开发提供了库函数。如果进行现代http的开发,建议使用WinHTTP而不是WinInet。使用WinHTTP进行开发的著名例子就是Google的浏览器Chrome,但是Chrome2.0以后版本google放弃了winhttp而是使用了自己开发的http库,这也是为了使chrome实现跨平台的重要举措。另外,WinHttp.dll也不依赖于winsock或ws2_32,也是独立运行的。
如果基于socket编程的话,Winows平台与其它平台函数基本相同,实现跨平台比较容易。
wsock和wininet或winhttp也可以同时使用。
WinInet HttpSendRequest使用的事项
& &HttpSendRequest不支持异步模式,虽然API文档说可以,但是在其它官方文章中已证实不可以;要用异步方式完成任务,需要通过使用线程来自己封装。
& &HttpSendRequest使用的INTERNETHANLE要每次通过HttpOpenRequest获取,不能重用,否则可能会出现无法读取返回数据或数据重复等错误;虽然API文档说只要每次把上次的数据取完就可以,但这是经历了无数痛苦的unit test后换来的经验。
& & 发送httpSendRequest后,需要使用InternetReadFile来读取,重复多次读,直到返回数据为0byte为止。
& & 错误代码在&&,API文档中找不到。
什么是WinHTTP?
WinHTTP的全称是Microsoft Windows HTTP Services,它提供给开发者一个HTTP客户端应用程序接口(API), 通过这种API借助HTTP协议给其他的HTTP服务器发送请求.
WinHTTP支持桌面应用程序, Windows系统服务, 和Windows服务器端应用程序.
对于基于Microsoft.NET Framework的应用程序, 不推荐使用WinHTTP服务, 因为.NET Framework应用程序应该使用在System.Net命名空间下的网络基础设施类型.
WinHTTP提供了两种编程方式, 一种是CC++的API, 另一种是COM组件.
WinHTTP与WinINet的区别
================
WinHTTP被设计为主要应用在服务器端应用程序的场景下, 让服务器端应用程序访问HTTP服务器.
WinINet是一种更老的技术, 它被设计为一个HTTP客户端平台, 用于交互式桌面应用程序, 比如说IE, Office等.
服务器端应用程序要求HTTP客户端服务使用WinHTTP而不是WinINet.
WinHTTP和WinINet在微软是由不同的团队来提供支持的.
WinHTTP与Proxy
================
如果HTTP Proxy需要认证(authentication), 那么HTTP Application会收到407(proxy requiresauthentication). 除了这个状态码, 代理服务器还会发送一个或更多的authenticate headers:“Proxy-Authenticate”. 这些信息足够我们在network monitor trace中鉴定HTTP无法访问是否是由于proxy需要认证引起的了.
WinHTTP的proxy配置是存储在注册表键
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternetSettingsConnectionsWinHttpSettings
当中的, 修改和查看需要使用一个命令行工具proxycfg
下面来说说实现Http访问的流程(基本上都一样的流程):
1, 首先我们打开一个Session获得一个HINTERNET session句柄;
2, 然后我们使用这个session句柄与服务器连接得到一个HINTERNET connect句柄;
3, 然后我们使用这个connect句柄来打开Http 请求得到一个HINTERNET request句柄;
4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;
5, 最后依次关闭request,connect,session句柄。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
本帖最后由 ganlinlao 于
10:25 编辑
第1章、基本功能篇----恨你的妖艳从看你的第一眼开始
这里的例子仅仅是作为一些基本功能的测试
本帖子中包含更多资源
才可以下载或查看,没有帐号?
本帖最后由 ganlinlao 于
11:32 编辑
第2章、word功能篇---好白菜都让猪给拱了
(1)、用word作打印报表
& && &(1)word普通表格的作为打印报表
& && &一般在数据量比较少的情况下,可以用word的普通表格作为报表输出。word毕竟有强大的域功能。可以进行适当的公式计算等。
& && &但数据量比较大的情况下,应该选择用excel作为报表输出。在这里,我只是采用遍历循环,性能可能比较低,更快的方法,应该
& && &是采用剪贴板方式。注意点:强大的域功能是值得关注和掌握的。word的保护文档,不同模式下,对打印和页面设置的影响。
例子:同时适当修正一点上面例子的小错误
& & (2)利用word的书签功能作为打印报表,并可以多页连续打印
& && &&&word的书签功能是无比强大的功能。可以说没有书签功能,word的作用至少废了三分之一了。域也是
& && &&&word的书签功能的特殊运用。可惜我也掌握不是很好,有待深入。
& && &&&注意点:word的书签每一次插入内容后,书签会被自动删除。所以每一次插入内容之后,必须重新添加书签
& &(3)利用word的邮件合并功能
& && &&&word的邮件合并功能,其实也是蛮有趣的一个功能。如果有兴趣的话,可以继续深入一点。在这里我就不多谈
(2)、用word作输入界面:各种述职报告,会计纪要、审计报告,请假条……等
& && & 正常来说,一般是不提倡用word或excel作为输入界面,因为word和excel都没有数据绑定功能。但因为办公文件的种类实在是庞大而烦杂。象各种报告,会计记录、病历卡,各种常见的文涵等,用Access作为这种输入界面其实是相当不易用的。至少没有word来得熟悉和容易上手。
& & word作为输入界面:需要注意的无非就是两点,一个是输入内容的验证,因为有书签,表格、域等功能。验证内容其实是蛮容易。这跟使用RichText或richText32.ocx差不多。但word绝对比前面两种控件强大得多。
& && & 另一个是对word的事件交互。就是在Access中响应word的事件。这个说穿了也是蛮容易的,跟使用access的控件没什么两样,无非就是要对VBA的事件有一点本质的认识。这个我用excel的事件来作为例子。永远不要忘记,整个Office都是com组件
(3)、文档阅读的权限控制。批注,审阅等电子签章加密问题(这是公文流转的第一步)
本帖子中包含更多资源
才可以下载或查看,没有帐号?
本帖最后由 ganlinlao 于
11:05 编辑
第3章、excel表格篇—牛粪,请给鲜花一次傲骄的机会
(1)用excel作打印报表
(2)用excel作查询子窗体的优缺点
(3)用excel作输入界面:发票、凭证……等需要套打的界面
(4)关于excel的事件连接点的思考:
& &&&DsoFramer有一个显著的缺陷,就是没有事件连接点。这个如果放在IE、chrome或FireFox中使用,绝对是一个致命的缺点。
& &&&但如果是在access或vb6中使用,这个缺陷是可以弥补回来的。如果在aauto或python中使用,这个根本就不是缺点。因为aauto等自
带有事件接受收器。它们使用com组件,甚至比vb6来得更简洁。
& & vba中跟外部com组件事件有关,只有一个withEvents语句。withEvents其实就是vba的事件接受器。但它必须依赖于类型库。因为事件的接口就是在类型库中声明的,对vb来说也只能是在类型库中声明。类型库tlb对vb来说是至关重要的,没有它,vb基本什么事都干不了。
& &事件接收受器其实是一个com组件,只不过VBA帮助参考上永远不会告诉你,withEvents是一个com对象。它只会告诉你withEvents只能在类模块中使用。但为什么只能在类模块中使用呢?因为事件收受器是一个com组件,所以你必须通过类,把它实例化成一个com对象,这样才能建立起事件连接点。同样的道理,你也应该很容易理解event和raiseEvent语句了。
& & VBA必须依赖于类型库才能建立事件连接点。但excel2003,excel2007,excl2010,excel2013等不同版本,类型库是不同的,如何做到兼容性呢?这里利用到了Access的特殊性,access对于类型库会自动从低版本升级成高版本。但不能从高版本降低成低版本。所以为了兼容性,你在写代码的时候应该统一用低版本的类型库。目前常用的应该是excel2003版本算是最低了。
& & 我在例子里会提供一个excel2003的类型库,这是因为excel很奇怪。它的类型库隐在excel.exe里面。至于word、powrpoint和access,它们的类型库都是单独的一个olb文件,这很容易获得。在使用时,你百度一下tlb的注册工具,把excel类型库注册一下。然后就可以开始使用了。以后编译成mde文件,不用去管类型库。只要对方有安装office,mde会自动升级excel的类型库。那个excel11.tlb也不需要带上,不用去管它。
& && & 例子代码截图:通过例子,你会发现写excel的事件,跟在excel中用vba写excel事件是一模一样的。
& && && &&&
本帖子中包含更多资源
才可以下载或查看,没有帐号?
本帖最后由 ganlinlao 于
14:33 编辑
第3章、Excel表格篇
(5)、Access的vba和excel的vba之间的奸情无限
& && && &我前面曾说过很多人对excel的研究之精,已达到人兽共愤,令人发指的地步。所以excel文件中带上vba,是经常会发生的事情。
& && & 一般来说,因为access的vba能全面控制excel,所以vba代码应该尽量在access中写。毕竟access有编译功能,能比较好地保护vba代码和数据库信息。但因为vba是单线程的,有些时候用excel的vba功能,反而会更便捷。记住:access和excel是两个不同的进程,所以access的vba和excel的vba就变成了多线程。两个VBA之间的通信就变成了两个进程间的通信。
& && & 幸运的是,在windows上进程间的通信方式还是很多的。但简单易用的方式其实不算多。以下是我个人理解比较简易的方式,如果你有更简易的方式,希望告知。
&1&最简单易用的方式:用excel表的辅助列(或辅助表)。因为access能读写excel文件的表格内容,而excel的VBA也能读写自身文件的表格。所以利用辅助列或辅助表,可以让access的vba变量值与excel的vba的变量值进行互传
&2&利用剪粘板:虽然office的vba不能直接使用clipboard对象。但幸运的是,只要安装有vba,总有一个dataobject存在。这是office共有的,所以通过dataobject对象就可进行两个vba之间的变量值互传。Dataobject对象隐藏在form20.dll里面。所以使用时记得引用这个dll。
&3&其它的方式,为了避免无谓的复杂性,我就不说了。
& && &Excel的vba代码是无法受到编译级的保护。只不过这种代码其实也没必要有什么保护。
& &&&写到这里,我也不禁对excel.application.parient属性嘘嘘一番,这货总返回自身对象。那有什么意义呢。
本帖最后由 ganlinlao 于
14:23 编辑
第5章、excel透视表篇
强大啊!冬瓜爆发了!
本帖最后由 ganlinlao 于
14:47 编辑
第6章、网络篇
& &&&1、excel或word模板从网络中载入:
我的例子里自带有一个小型的服务器,足以支撑数百个并发,你不用太担心它的性能,你无须安装iis。无须配置网站。使用例子前,你得先点击一下exe,你的电脑就是一个web网站,程序所在的目录就是web网站的根目录。当然你想动手搭建一个iis的网站,那也只是几分钟的事情。正常来说,你应该选c#、vb.net或php、java来写服务端,因为这是最常用的。这个例子里,只是一个静态web。只是为了测试dsoframer从web端载入excel、word文件的能力。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
站长推荐 /6
即日起至日 Office中国全线产品优惠大促销
报名 Access中级 高级 顶级培训 将享有更多优惠,最高优惠达5800元
Access通用开发平台企业版,支持SQLServer后台
优惠价4500元/套
美女MVP教你轻松学习Excel VBA 优惠至49元
Excel O啦插件 优惠至79元
Excel 课程 5折优惠
Access超级经典源码剖析 脑图+源码+视频 组合装, 原价1749元,折合优惠价 1190元
更多的优惠请猛戳查看
1.让初学者了解Excel VBA的强大之处,学习VBA的使用
2.使更多Excel使用者会利用VBA来简化工作,减少重复操作
3.让Excel开发者能够快速地使用VBA进行开发设计,做出满足要求的应用
企业中正在实际使用的企业级进销存管理系统
用户可自定义的 拖拉式 流程图设计(而非普通的固死的流程图)
流程清晰 功能齐全 操作方便
VBA开发神器第一版发布-平台插件VBA伴侣
一款VBA编写帮助工具,让你在最短的时间编写质量最高的代码。VBA从此不再害怕!!
1.通用代码库,支持官方代码片段和官方函数
2.快捷添加到个人函数库,方便一键使用
3.函数提交支持参数设置,自动识别过程函数
4.自动生成作者和函数相关,快速填写注释
5.遇到陌生代码,可快速查找
6.代码美化整理
由Office中国出品,让你使用Excel更方便,更高效,更快捷!
搞定工作,不用加班,早点下班不再是梦!
包含功能个数:5大功能模块,近100个Excel功能
Access VBA 开发在线帮助指南手册
1.Access 2010 在线帮助教程手册
2.Access Jet Sql 语法在线帮助
3.微软 API 编程开发手册
4.ADO程序员参考在线帮助手册
5.DAO程序员参考在线帮助手册
6.Access中国在线培训中心
7.Access通用智能开发平台培训教程
8.Excel在线帮助手册大全
Powered by用驱动实现自己的 ZwOpenProcess ZwReadVirtualMemory ZwWriteVirtualMemory[菜鸟学习笔记]
标 题:用驱动实现自己的 ZwOpenProcess ZwReadVirtualMemory ZwWriteVirtualMemory[菜鸟学习笔记]
作 者:bujin888
时 间:<font color="#09-03-03 22:12 链 接:
&&Author:&&your&name&
&&Last&Updated:&
&&This&framework&is&generated&by&EasySYS&0.3.0
&&This&template&file&is&copying&from&QuickSYS&0.3.0&written&by&Chunhua&Liu
#include&&dbghelp.h&
#include&&jhxxs.h&
#include&&stdio.h&
#include&&ntdef.h&
#include&&ntstatus.h&
#include&&ntddk.h&
//&A&structure&representing&the&instance&information&associated&with
//&a&particular&device
typedef&struct&_DEVICE_EXTENSION
&&&&ULONG&&StateV
}&DEVICE_EXTENSION,&*PDEVICE_EXTENSION;
typedef&struct&_KAPC_STATE{
&&&&&&&&LIST_ENTRY&&&&&&&&ApcListHead[2];
&&&&&&&&PEPROCESS&&&&&&&&P
&&&&&&&&UCHAR&&&&&&&&&&&&&&&&KernelApcInP
&&&&&&&&UCHAR&&&&&&&&&&&&&&&&KernelApcP
&&&&&&&&UCHAR&&&&&&&&&&&&&&&&UserApcP
}KAPC_STATE,*PKAPC_STATE;
NTKERNELAPI&void&KeStackAttachProcess(IN&PEPROCESS&Process,&OUT&PKAPC_STATE&ApcState);
NTKERNELAPI&void&KeUnstackDetachProcess(IN&PKAPC_STATE&ApcState);
NTKERNELAPI&NTSTATUS&PsLookupProcessByProcessId(IN&ULONG&ulProcId,OUT&PEPROCESS&*&pEProcess);
NTKERNELAPI&NTSTATUS&ObOpenObjectByPointer(
&&&&IN&PVOID&Object,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&IN&ULONG&HandleAttributes,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&IN&PACCESS_STATE&PassedAccessState&OPTIONAL,&&&&&&&&&&&&&&&&
&&&&IN&ACCESS_MASK&DesiredAccess&OPTIONAL,&&&&&&&&&&&&&&&&&&&&&&
&&&&IN&POBJECT_TYPE&ObjectType&OPTIONAL,&&&&&&&&&&&&&&&&&&&&&&&&
&&&&IN&KPROCESSOR_MODE&AccessMode,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&OUT&PHANDLE&Handle&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&);
//&Device&driver&routine&declarations.
DriverEntry(
&&&&&&&&IN&PDRIVER_OBJECT&&&&&&&&&&&&&&&&DriverObject,
&&&&&&&&IN&PUNICODE_STRING&&&&&&&&&&&&&&&&RegistryPath
&&&&&&&&);
JhxxsDispatchCreate(
&&&&&&&&IN&PDEVICE_OBJECT&&&&&&&&&&&&&&&&DeviceObject,
&&&&&&&&IN&PIRP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Irp
&&&&&&&&);
JhxxsDispatchClose(
&&&&&&&&IN&PDEVICE_OBJECT&&&&&&&&&&&&&&&&DeviceObject,
&&&&&&&&IN&PIRP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Irp
&&&&&&&&);
JhxxsDispatchDeviceControl(
&&&&&&&&IN&PDEVICE_OBJECT&&&&&&&&&&&&&&&&DeviceObject,
&&&&&&&&IN&PIRP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Irp
&&&&&&&&);
JhxxsUnload(
&&&&&&&&IN&PDRIVER_OBJECT&&&&&&&&&&&&&&&&DriverObject
&&&&&&&&);
#ifdef&ALLOC_PRAGMA
#pragma&alloc_text(INIT,&DriverEntry)
#pragma&alloc_text(PAGE,&JhxxsDispatchCreate)
#pragma&alloc_text(PAGE,&JhxxsDispatchClose)
#pragma&alloc_text(PAGE,&JhxxsDispatchDeviceControl)
#pragma&alloc_text(PAGE,&JhxxsUnload)
#endif&//&ALLOC_PRAGMA
MyWriteMemory(IN&HANDLE&hProcess,OUT&PVOID&BaseAddress,IN&PVOID&Pbuff,IN&ULONG&BufferSize)
PEPROCESS&EP&
KAPC_STATE&ApcS
PVOID&writebuffer=NULL;
status&=&ObReferenceObjectByHandle(
&&&&&&&&&&&&&&&&&&hProcess,
&&&&&&&&&&&&&&&&&&PROCESS_VM_WRITE|PROCESS_VM_READ,
&&&&&&&&&&&&&&&&&&NULL,
&&&&&&&&&&&&&&&&&&KernelMode,
&&&&&&&&&&&&&&&&&&&EProcess,
&&&&&&&&&&&&&&&&&&NULL
&&&&&&&&&&&&&&&&&&);
&&&&&&&&&&&&&&&&&&
if(!NT_SUCCESS(status))
ObDereferenceObject(EProcess);
return&STATUS_UNSUCCESSFUL;
writebuffer&=&ExAllocatePoolWithTag&(NonPagedPool,&BufferSize,&'Sys');
if(writebuffer==NULL)
ObDereferenceObject(EProcess);
ExFreePool&(writebuffer);
return&STATUS_UNSUCCESSFUL;
*(ULONG*)writebuffer=(ULONG)0x1;
if&(MmIsAddressValid(Pbuff))
&&&ProbeForRead&((CONST&PVOID)Pbuff,&BufferSize,&sizeof(CHAR));
&&&RtlCopyMemory&(writebuffer,&Pbuff,&BufferSize);
&&&__except(EXCEPTION_EXECUTE_HANDLER)
&&&status&=&STATUS_UNSUCCESSFUL;
&&&status&=&STATUS_UNSUCCESSFUL;
if&(NT_SUCCESS(status))
&&KeStackAttachProcess&(EProcess,&&ApcState);
&&if&(MmIsAddressValid(BaseAddress))
&&&ProbeForWrite&((CONST&PVOID)BaseAddress,&BufferSize,&sizeof(CHAR));
&&&RtlCopyMemory&(BaseAddress,writebuffer,&BufferSize);
&&&__except(EXCEPTION_EXECUTE_HANDLER)
&&&status&=&STATUS_UNSUCCESSFUL;
&&&status&=&STATUS_UNSUCCESSFUL;
&&KeUnstackDetachProcess&(&ApcState);
ObDereferenceObject(EProcess);
ExFreePool&(writebuffer);
MyReadMemory(IN&HANDLE&hProcess,IN&PVOID&BaseAddress,OUT&PVOID&Pbuff,IN&ULONG&BufferSize)
PEPROCESS&EP
KAPC_STATE&ApcS
PVOID&readbuffer=NULL;
status&=&ObReferenceObjectByHandle(
&&&&&&&&&&&&&&&&&&hProcess,
&&&&&&&&&&&&&&&&&&PROCESS_VM_WRITE|PROCESS_VM_READ,
&&&&&&&&&&&&&&&&&&NULL,
&&&&&&&&&&&&&&&&&&KernelMode,
&&&&&&&&&&&&&&&&&&&EProcess,
&&&&&&&&&&&&&&&&&&NULL
&&&&&&&&&&&&&&&&&&);
if(!NT_SUCCESS(status))
ObDereferenceObject(EProcess);
return&STATUS_UNSUCCESSFUL;
readbuffer&=&ExAllocatePoolWithTag&(NonPagedPool,&BufferSize,&'Sys');
if(readbuffer==NULL)
ObDereferenceObject(EProcess);
ExFreePool&(readbuffer);
return&STATUS_UNSUCCESSFUL;
*(ULONG*)readbuffer=(ULONG)0x1;
KeStackAttachProcess&(EProcess,&&ApcState);
if&(MmIsAddressValid(BaseAddress))
&&&ProbeForRead&((CONST&PVOID)BaseAddress,&BufferSize,&sizeof(CHAR));
&&&RtlCopyMemory&(readbuffer,&BaseAddress,&BufferSize);
&&&__except(EXCEPTION_EXECUTE_HANDLER)
&&&status&=&STATUS_UNSUCCESSFUL;
&&status&=&STATUS_UNSUCCESSFUL;
KeUnstackDetachProcess&(&ApcState);
&&&if(NT_SUCCESS(status))
&&&&&&&&if&(MmIsAddressValid(Pbuff))
&&&&&&&&&__try
&&&&&&&&&{
&&&&&&&&&ProbeForWrite(Pbuff,&BufferSize,&sizeof(CHAR));
&&&&&&&&&RtlCopyMemory&(Pbuff,&readbuffer,&BufferSize);
&&&&&&&&&}
&&&&&&&&&__except(EXCEPTION_EXECUTE_HANDLER)
&&&&&&&&&{
&&&&&&&&&status&=&STATUS_UNSUCCESSFUL;
&&&&&&&&&}
&&&&&&&&else
&&&&&&&&status&=&STATUS_UNSUCCESSFUL;
ObDereferenceObject(EProcess);
ExFreePool&(readbuffer);
NTSTATUS&MyOpenProcess(ULONG&PID,&PHANDLE&pHandle)
&&NTSTATUS&&
&&PEPROCESS&&EProcess&=&NULL;
&&HANDLE&&&&handle&=&NULL;
&&UNICODE_STRING&y;
&&PULONG&&&&PsProcessT
&&status&=&PsLookupProcessByProcessId(PID,&&EProcess);
&&if&(NT_SUCCESS(status))
&&&&handle&=&0;
&&&&RtlInitUnicodeString(&y,&L&PsProcessType&);
&&&&PsProcessType&=&MmGetSystemRoutineAddress(&y);
&&&&if&(PsProcessType)
&&&&&&status&=&ObOpenObjectByPointer(EProcess,&0,&0,&PROCESS_ALL_ACCESS,&(PVOID)*PsProcessType,&UserMode,&&handle);
&&&&&&if&(NT_SUCCESS(status))
&&&&&&&&&&&&&&&&*pHandle&=&
&&&&ObfDereferenceObject(EProcess);
DriverEntry(
&&&&&&&&IN&PDRIVER_OBJECT&&&&&&&&&&&&&&&&DriverObject,
&&&&&&&&IN&PUNICODE_STRING&&&&&&&&&&&&&&&&RegistryPath
&&&&&&&&NTSTATUS&&&&&&&&&&&&&&&&&&&&&&&&status&=&STATUS_SUCCESS;&&&&
&&&&UNICODE_STRING&&&&&&&&&&&&&&&&ntDeviceN
&&&&&&&&UNICODE_STRING&&&&&&&&&&&&&&&&dosDeviceN
&&&&PDEVICE_EXTENSION&&&&&&&&deviceE
&&&&&&&&PDEVICE_OBJECT&&&&&&&&&&&&&&&&deviceObject&=&NULL;
&&&&&&&&BOOLEAN&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&fSymbolicLink&=&FALSE;
&&&&&&&&KdBreakPoint();
&&&&&&&&RtlInitUnicodeString(&ntDeviceName,&JHXXS_DEVICE_NAME_W);
&&&&status&=&IoCreateDevice(
&&&&&&&&&&&&&&&&DriverObject,
&&&&&&&&&&&&&&&&sizeof(DEVICE_EXTENSION),
&&&&&&&&&&&&&&&&&ntDeviceName,
&&&&&&&&&&&&&&&&FILE_DEVICE_JHXXS,
&&&&&&&&&&&&&&&&0,
&&&&&&&&&&&&&&&&TRUE,
&&&&&&&&&&&&&&&&&deviceObject
&&&&&&&&&&&&&&&&);
&&&&if&(!NT_SUCCESS(status))
&&&&&&&&&&&&&&&&goto&__
&&&&&&&&deviceExtension&=&(PDEVICE_EXTENSION)deviceObject-&DeviceE
&&&&&&&&RtlInitUnicodeString(&dosDeviceName,&JHXXS_DOS_DEVICE_NAME_W);
&&&&&&&&status&=&IoCreateSymbolicLink(&dosDeviceName,&&ntDeviceName);
&&&&if&(!NT_SUCCESS(status))
&&&&&&&&&&&&&&&&goto&__
&&&&&&&&fSymbolicLink&=&TRUE;
&&&&DriverObject-&MajorFunction[IRP_MJ_CREATE]&&&&&&&&&=&JhxxsDispatchC
&&&&DriverObject-&MajorFunction[IRP_MJ_CLOSE]&&&&&&&&&&=&JhxxsDispatchC
&&&&DriverObject-&MajorFunction[IRP_MJ_DEVICE_CONTROL]&=&JhxxsDispatchDeviceC
&&&&DriverObject-&DriverUnload&&&&&&&&&&&&&&&&&&&&&&&&&=&JhxxsU
&&&&if&(NT_SUCCESS(status))
&&&&&&&&&&&&return&
&&&&&&&&if&(fSymbolicLink)
&&&&&&&&&&&&&&&&IoDeleteSymbolicLink(&dosDeviceName);
&&&&&&&&if&(deviceObject)
&&&&&&&&&&&&&&&&IoDeleteDevice(deviceObject);
&&&&&&&&return&
JhxxsDispatchCreate(
&&&&&&&&IN&PDEVICE_OBJECT&&&&&&&&&&&&&&&&DeviceObject,
&&&&&&&&IN&PIRP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Irp
&&&&&&&&NTSTATUS&status&=&STATUS_SUCCESS;
&&&&&&&&Irp-&IoStatus.Information&=&0;
&&&&Irp-&IoStatus.Status&=&
&&&&IoCompleteRequest(Irp,&IO_NO_INCREMENT);
&&&&return&
JhxxsDispatchClose(
&&&&&&&&IN&PDEVICE_OBJECT&&&&&&&&&&&&&&&&DeviceObject,
&&&&&&&&IN&PIRP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Irp
&&&&&&&&NTSTATUS&status&=&STATUS_SUCCESS;
&&&&Irp-&IoStatus.Information&=&0;
&&&&&&&&Irp-&IoStatus.Status&=&
&&&&IoCompleteRequest(Irp,&IO_NO_INCREMENT);
&&&&return&
JhxxsDispatchDeviceControl(
&&&&&&&&IN&PDEVICE_OBJECT&&&&&&&&&&&&&&&&DeviceObject,
&&&&&&&&IN&PIRP&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Irp
&&&&&&&&NTSTATUS&&&&&&&&&&&&&&&&&&&&&&&&status&=&STATUS_SUCCESS;
&&&&PIO_STACK_LOCATION&&&&&&&&irpS
&&&&PDEVICE_EXTENSION&&&&&&&&deviceE
&&&&&&&&PVOID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ioB
&&&&ULONG&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&inBufLength,&outBufL
&&&&&&&&ULONG&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ioControlC
&&&&&&&&UCHAR&&&&&&&&&&&&&&&*buff&=0;
&&&&&&&&ULONG&&&&&&&&&&&&&&&OutByteCount&=0;
&&&&&&&&HANDLE&&&&&&&&&&&&&&W
&&&&&&&&PVOID&&&&&&&&&&&&&&&WriteDstA
&&&&&&&&PVOID&&&&&&&&&&&&&&&WriteSrcA
&&&&&&&&ULONG&&&&&&&&&&&&&&&WriteS
&&&&&&&&NTSTATUS&&&&&&&&&&&&WriteR
&&&&&&&&HANDLE&&&&&&&&&&&&&&R
&&&&&&&&PVOID&&&&&&&&&&&&&&&ReadBaseA
&&&&&&&&PVOID&&&&&&&&&&&&&&&ReadB
&&&&&&&&ULONG&&&&&&&&&&&&&&&ReadS
&&&&&&&&NTSTATUS&&&&&&&&&&&&ReadR
&&&&&&&&ULONG&&&&&&&&&&&&&&&OpenP
&&&&&&&&PHANDLE&&&&&&&&&&&&&PProcessH
&&&&&&&&NTSTATUS&&&&&&&&&&&&OpenR
&&&&irpStack&=&IoGetCurrentIrpStackLocation(Irp);
&&&&deviceExtension&=&(PDEVICE_EXTENSION)DeviceObject-&DeviceE
&&&&&&&&Irp-&IoStatus.Information&=&0;
&&&&&&&&ioBuf&=&Irp-&AssociatedIrp.SystemB
&&&&&&&&inBufLength&=&irpStack-&Parameters.DeviceIoControl.InputBufferL
&&&&outBufLength&=&irpStack-&Parameters.DeviceIoControl.OutputBufferL
&&&&ioControlCode&=&irpStack-&Parameters.DeviceIoControl.IoControlC
&&&&switch&(ioControlCode)
&&&&&&&&case&&0X:
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&buff=(UCHAR&*)Irp-&AssociatedIrp.SystemBuffer&;
&&&&&&&&&&&&&&&&&memmove(&Writehandel,&buff[0],4);
&&&&&&&&&&&&&&&&&memmove(&WriteDstAddr,&buff[4],4);
&&&&&&&&&&&&&&&&&memmove(&WriteSrcAddr,&buff[8],4);
&&&&&&&&&&&&&&&&&memmove(&WriteSize,&buff[12],4);
&&&&&&&&&&&&&&&&&WriteReturn=MyWriteMemory(Writehandel,WriteDstAddr,WriteSrcAddr,WriteSize);
&&&&&&&&&&&&&&&&&memmove(Irp-&AssociatedIrp.SystemBuffer,&WriteReturn,4);
&&&&&&&&&&&&&&&&&OutByteCount=4;
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&case&&0X:
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&buff=(UCHAR&*)Irp-&AssociatedIrp.SystemBuffer&;
&&&&&&&&&&&&&&&&&memmove(&Readhandel,&buff[0],4);
&&&&&&&&&&&&&&&&&memmove(&ReadBaseAddr,&buff[4],4);
&&&&&&&&&&&&&&&&&memmove(&ReadBuffer,&buff[8],4);
&&&&&&&&&&&&&&&&&memmove(&ReadSize,&buff[12],4);
&&&&&&&&&&&&&&&&&ReadReturn=MyReadMemory(Readhandel,ReadBaseAddr,ReadBuffer,ReadSize);
&&&&&&&&&&&&&&&&&memmove(&buff[0],&ReadReturn,4);
&&&&&&&&&&&&&&&&&OutByteCount=4;
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&case&&0X:
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&OpenReturn&=&MyOpenProcess(*(PULONG)ioBuf,ioBuf);
&&&&&&&&&&&&&&&&&buff=(UCHAR&*)Irp-&AssociatedIrp.SystemBuffer&;
&&&&&&&&&&&&&&&&&memmove(&buff[4],&OpenReturn,4);
&&&&&&&&&&&&&&&&&OutByteCount=8;
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&
&&&&&&&&case&IOCTL_JHXXS_HELLO:
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&default:
&&&&&&&&status&=&STATUS_INVALID_PARAMETER;
&&&&&&&&&&&&&&&&
&&&&&&&&Irp-&IoStatus.Status&=&
&&&&&&&&Irp-&IoStatus.Information&=&OutByteC
&&&&&&&&IoCompleteRequest(Irp,&IO_NO_INCREMENT);
&&&&return&
JhxxsUnload(
&&&&&&&&IN&PDRIVER_OBJECT&&&&&&&&&&&&&&&&DriverObject
&&&&UNICODE_STRING&dosDeviceN
&&&&&&&&RtlInitUnicodeString(&dosDeviceName,&JHXXS_DOS_DEVICE_NAME_W);
&&&&IoDeleteSymbolicLink(&dosDeviceName);
&&&&&&&&IoDeleteDevice(DriverObject-&DeviceObject);
完整可编译代码如下[驱动由&BC++编写&WINDDK编译]上传的附件

我要回帖

更多关于 菜鸟的专属大神 的文章

 

随机推荐