[原创]浅谈如何使用gcc开发NT核心驱动程序

 [原创]浅谈如何使用gcc开发NT核心驱动程序

 

    一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软“正统”

的VC来。诚然,用VC 配合 WINDDK 的确工作的不错,但或许我们可以让其变

得更简单更完善一些。

    其实偶一般是用 Masm32v9 + EditPlus2 编写 NT内核驱动,仅此而已。

从环境搭建的便捷性和编写代码的灵活性来说无疑这是非常高的。但汇编

终归是汇编,虽然强大,但很多事都要自己动手来做,往往很简单的功能都

要用比较“生硬”的方法来完成,比如:

;****************************************************************

.data

;****************************************************************

         szenter db "enter driverentry",0

         szleave db "leave driverentry",0

;****************************************************************
.code INIT
;****************************************************************

DriverEntry proc pDriverObject:PDRIVER_OBJECT,/

        pusRegistryPath:PUNICODE_STRING
 
 local status:NTSTATUS    

mov status,STATUS_DEVICE_CONFIGURATION_ERROR

 invoke DbgPrint,$CTA0("enter driverentry")

 invoke DbgPrint,addr szenter

;do someting you want!

 invoke DbgPrint,addr szleave
  
 mov eax, status

 ret

DriverEntry endp
;****************************************************************
         end DriverEntry

    以上是一个简单的不能再简单的Driver 模版。如君所见,连字符串放在哪个段

中也要自己亲手安排,小程序尚可忍受,一旦代码规模上去就非常不方便。我们

也可以把数据直接放在代码段中,比如:

;****************************************************************
.code INIT
;****************************************************************

DriverEntry proc pDriverObject:PDRIVER_OBJECT,/

        pusRegistryPath:PUNICODE_STRING
 
 local status:NTSTATUS    

  jmp Real_Start

  szenter db "enter driverentry",0
  szleave db "leave driverentry",0

Real_Start:

 mov status,STATUS_DEVICE_CONFIGURATION_ERROR

 invoke DbgPrint,addr szenter

;do someting you want!

 invoke DbgPrint,addr szleave
  
 mov eax, status

 ret

DriverEntry endp
;****************************************************************
         end DriverEntry

    这样一来虽然不用自己操作段,但是毕竟稍显怪异,而且变量定义和

使用还是要分开。无奈,只有用宏来解决了:

 invoke DbgPrint,$CTA0("enter driverentry")
 
 invoke DbgPrint,$CTA0("leave driverentry")

 

    辛勤的汇编语言工作者们多么希望能向c那样简单的方式来写啊 ^_^

 

puts("So Cool!");

    但是VC对 标准 c99 的支持并不好,咋办呢?用gcc吧(不是广告哦。)

有人可能会问gcc能写Windows下的驱动么?答案是肯定的。以下是偶

总结出的2个方法:

1 gcc.exe + ld.exe

2 gcc.exe + link.exe

前者是全部是原汁原味的gcc;而后者编译器是gcc,连接器却是MS官方的

link.exe。以下便是用 gcc 写的一个类似 ASM-Driver 的模版:

#include <stdio.h>
#include "ddk/ntddk.h"

_stdcall NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,/
 PUNICODE_STRING pRegistryPath)
{
 NTSTATUS status = STATUS_DEVICE_CONFIGURATION_ERROR;
 
 DbgPrint("enter DriverEntry,I'm Hopy!/n");
 
 DbgPrint("Leave DriverEntry,byb :)!/n");
 
 return status;
}

    简单吗?呵呵。注意开头的_stdcall一定要加,否则调用者会来平衡stack,

这会造成stack异常,从而sys必须重启后才能卸载。

    活活,偶们可以利用gcc出色的代码优化功能来优化偶们的代码:

gcc -O3 -o miniDrv.obj -c miniDrv.c

    注意我们并不连接只是编译,所以用 -c 选项,而且可以看见我们使用了 O3

 级别的优化。

结果生成的PE文件只比用汇编生成的大几十字节,而且从逆向sys可以看到

机器码布局非常简练几乎可以和汇编的相媲美了。

    总结如下:

    使用gcc编写NT下的驱动十分方便,只需要

    gcc 包 + MS link + 一个好用的编辑器 即可。 :)

 

时间: 2024-10-03 06:36:22

[原创]浅谈如何使用gcc开发NT核心驱动程序的相关文章

浅谈区域经理如何开发一个新市场?

新市场的开发一直以来都是企业经营管理的重要策略,新区域的开拓意味着企业经营区域的扩大,意味着在行业市场份额的提升,意味着企业知名度.影响力的扩大.但是新区域的开拓也伴随着各种风险和企业管理成本的增加,风险诸如文化的适应.人员的稳定性及养成.区域的经营模式.客户对价值的认可程度以及新区域服务的能力等,都是一个新区域成长所要面临的诸多问题,提前 认识到这些问题,会让我们在市场开发的过程中,更加合理的评估我们开拓的进程以及有意识的规避风险. 我们暂且不谈我们什么时候该进入一个新区域,而从一个新区域的开

浅谈PHP Extension的开发——基础篇第1/2页

摘要&引言 PHP是当前应用非常广泛的一门语言,从国外的Facebook.Twitter到国内的淘宝.腾讯.百度再到互联网上林林总总的各种大中小型网站都能见到它的身影.PHP的成功,应该说很大程度上依赖于其开放的扩展API机制和丰富的扩展组件(PHP Extension),正是这些扩展组件使得PHP从各种数据库操作到XML.JSON.加密.文件处理.图形处理.Socket等领域无所不能.有时候开发人员可能需要开发自己的PHP扩展,当前PHP5的扩展机制是基于Zend API的,Zend API提

走进原创 浅谈对于SEO中内容原创的理解

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 原创这个词在我的字典已经消失很多年了,记得小学的时候,老师说同学们今天给大家布置一篇作文,大家回去好好写写,明天上课交上来.这种声音随着年龄的增加而逐渐销声匿迹了.对于当时的我们来说是一件多么幸福的事情啊. 在我初中的时候,写作简直是一片空白.整天沉浸在数理化的纠结中.当然还有青春期的叛逆,没那么多心思,去追随已经难得解放的枯燥的文字中.3年

浅谈当前流行的开发架构

问题描述 随着软件开发规模和复杂性,社会对软件开发速度和数量要求不断提高,Web应用系统特别是企业级Web系统的开发通常都要求有一个良好的.可维护的.可扩展.高稳定性的开发架构,便于敏捷.协作开发和扩展升级,期望提高软件开发质量和效率.目前流行的开发架构主要有Struts.JSF.Spring等,都遵循模型-视图-控制(MVC)模式:商业逻辑和描述分开,由一个逻辑流控制器来协调客户端的请求和服务器上将采取的行动.这也成为Web开发事实上的标准,只是各个开发架构内在的机制不同.其中主流.最先进的开

浅谈PHP Extension的开发——基础篇第1/2页_php技巧

摘要&引言 PHP是当前应用非常广泛的一门语言,从国外的Facebook.Twitter到国内的淘宝.腾讯.百度再到互联网上林林总总的各种大中小型网站都能见到它的身影.PHP的成功,应该说很大程度上依赖于其开放的扩展API机制和丰富的扩展组件(PHP Extension),正是这些扩展组件使得PHP从各种数据库操作到XML.JSON.加密.文件处理.图形处理.Socket等领域无所不能.有时候开发人员可能需要开发自己的PHP扩展,当前PHP5的扩展机制是基于Zend API的,Zend API提

浅谈Android手机联系人开发之增删查改功能

最近在做手机联系人的功能模块的时候,遇到了很多的坑,在网上搜索的有一些所谓的最全的手机联系人开发的介绍还存在一些bug,所以我把我最近的项目心得和方法写下来,既能帮助大家减少了解android开发手机联系人的门槛,好,废话少说,接下来直奔主题. 一.深入浅出手机联系人的前奏(小米手机的data表跟模拟器的data表不一样) 1.手机联系人主要是对contacts2.db数据库表的操纵,这个数据库中有三个表是比较重要的,分别是data,raw_contacts,mimetyps这三个表.在下面的增

浅谈国产游戏脚本开发软件

近几年,伴随游戏行业的兴起,脚本行业也火热起来,按键公司是其中最大的收益者,从一个简单的模拟工具发展到今天,真所谓的天时地利人和,有人估算了现在的脚本市场,一个月大概有1个亿左右的资金流通,可能会更多,但是脚本行业需要一个良性发展. 就近几年来说,个人看得比较好的脚本工具,按键,E语言,和后面兴起的TC,按键目前来说可以说是脚本行业影响力最大的一个工具,上手简单.E语言曾经也是风靡一时,但是后面因为E语言制作出太多变态的工具,后面遭封杀,按键现在也慢慢有被封杀的趋势,TC刚出来还没有被封杀迹象,

浅谈百度收录网站的四大核心条件

做网站最为头等大事就是让百度收录自己的网站,当然如果你是做外贸的网站,自然是想要谷歌收录,在这里我们重点谈的就是有关百度收录网站的条件,因为百度对于网站的收录是会经过很长的时间考察的,一般是一周到一个半月的时间,主要就看你网站做的是否符合他们发的SEO白皮书<百度优化指南>了,而这里面给我们提供了最为重要的三大核心条件,下面我就来简单的跟大家分享一下! 一:关于网站的域名 在注册域名之前一定要检查注册的域名之前有没有被用过,而且是否被注册过,如果有就要查看这个域名是被K后然后丢弃不用,还是因为

浅谈新站快速收录的核心操作

新站上线如何让搜索引擎快速收录呢?这是很多的新站上线站长比较关注的问题,其实我也不例外,我最近就做了一个新站红枣养生吧,经过我优化网站的努力之下让红枣养生吧一周之内就让比较难收录的百度搜索引擎给收录了,那么新站初期我做了哪些优化让网站如此快的被收录了呢?接下来给大家分享下我的亲自的操作经验: 因为在网络公司上班的缘故,接触到的网站比较多,于是经常的注意到,很多的新站上线之前所做的准备不充分,导致网站的收录时间或者说被百度放出的时候过慢,所以新站上线之前要做的准备如下: 第一:网站的标题.关键词.