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

原创 2008年04月11日 13:53:00

 [原创]浅谈如何使用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 + 一个好用的编辑器 即可。 :)

 

版权声明:大熊猫猪·侯佩原创或翻译作品.谢绝转载! hopy

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

 [原创]浅谈如何使用gcc开发NT核心驱动程序     一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软“正统”的VC来。诚然,用VC 配合 WINDDK 的确工作的不错,但或...
  • mydo
  • mydo
  • 2008年04月11日 13:53
  • 2133

激光雷达学习笔记(六)ARM-Linux平台算法移植

在写第一篇激光雷达的日志我就说,激光雷达的算法开发的最终的目标是移植到嵌入式设备上, 因为在机器人定位时,不可能用一个很大很重的设备,因此最理想的还是ARM平台,(工控机也可以 考虑,几乎不存在移植的...
  • hebbely
  • hebbely
  • 2017年06月20日 11:19
  • 468

NT式驱动和WDM式驱动程序

1.Windows驱动程序分为两类,一类是不支持即插即用功能的NT式的驱动程序;另一类是支持即插即用功能的WDM式的驱动程序。   2.NT式的驱动程序要导入的头文件时NTDDK.H,而WDM式的...
  • whatday
  • whatday
  • 2015年03月28日 15:27
  • 2896

Android上方便地开发的C程序

如果你基于没有一个专门的开发板练手,那你的Android手机也可以开发大多数C应用程序,安装好后编译C的编译器。本文只写一个Hello World的运行过程。优点是:不需要eclipse,不需要And...
  • kangear
  • kangear
  • 2014年07月09日 23:01
  • 3086

[arm-linux]使用arm驱动hp1020激光打印机

上次讲到交叉编译ghostscript,今天就来看看如何利用gs等软件,在arm开发板上驱动激光打印机,手头只有usb接口的hp 1020 plus,就锁定这款吧。 1)要想Linux支持usb打印...
  • vigour1000
  • vigour1000
  • 2014年04月14日 19:01
  • 822

激光雷达学习笔记(六)ARM-Linux平台算法移植

在写第一篇激光雷达的日志我就说,激光雷达的算法开发的最终的目标是移植到嵌入式设备上, 因为在机器人定位时,不可能用一个很大很重的设备,因此最理想的还是ARM平台,(工控机也可以 考虑,几乎不存在移...
  • u014035838
  • u014035838
  • 2015年04月08日 15:44
  • 1403

(三)NT驱动基础——创建驱动设备 并 实现驱动与应用程序的通信

NT驱动需要至少在入口函数创建一个设备对,这个对象可以与物理设备建立映射,来操控物理设备;也可以独立存在,作为软件驱动设备 一、设备对象的功能 1.作为物理设备的虚拟映射,即作为物理设备与...
  • yangbostar
  • yangbostar
  • 2010年07月29日 17:05
  • 1184

NRF52832开发:射频驱动

NRF52832开发:射频驱动 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.   环境: 开发环境:MDK5.23 ...
  • jdh99
  • jdh99
  • 2018年01月26日 15:24
  • 112

[arm-linux]使用arm驱动hp1020激光打印机

上次讲到交叉编译ghostscript,今天就来看看如何利用gs等软件,在arm开发板上驱动激光打印机,手头只有usb接口的hp 1020 plus,就锁定这款吧。 1)要想Linux支持usb打印...
  • samssm
  • samssm
  • 2014年02月27日 10:26
  • 4317

惠普(HP) LaserJet Pro M1136 MFP 黑白多功能激光一体机 (打印 复印 扫描)驱动安装记录

惠普(HP) LaserJet Pro M1136 MFP 黑白多功能激光一体机 (打印 复印 扫描)新入手的打印机,如果没有安装经验,不要急着开箱组装!先打开电脑,放入驱动光盘,运行安装向导,会有动...
  • testcs_dn
  • testcs_dn
  • 2014年05月23日 11:34
  • 18730
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创]浅谈如何使用gcc开发NT核心驱动程序
举报原因:
原因补充:

(最多只允许输入30个字)