[原创]浅谈如何使用gcc开发NT核心驱动程序
2008-04-11 13:53
381 查看
[原创]浅谈如何使用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 + 一个好用的编辑器 即可。 :)
一谈到在 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 + 一个好用的编辑器 即可。 :)
相关文章推荐
- [原创]浅谈如何使用gcc开发NT核心驱动程序
- [原创]浅谈如何使用gcc开发NT核心驱动程序
- [原创]浅谈如何使用gcc开发NT核心驱动程序
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- Q:我欲使用WinDriver开发一个PCI卡的驱动程序来传输图像,但是当我利用WinDriver进行Virtex5 FPGA进行读取和写入动作时,计算机会当机,请问如何解决?
- 【原创】如何使用build.gradle优雅的开发Android
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- 【原创】浅谈如何在C#Winform程序中正确使用登录窗体
- (原創) 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- Q:当我使用WinDriver开发驱动程序,此工具会自动建立许多档案并且包含DLL档案。若我不想看到此DLL档案,请问如何解决?
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++) [转]
- (转载) 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- 【原创】如何使用build.gradle优雅的开发Android
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- iOS海哥开发笔记(开发中如何使用数据持久化)海哥原创,让你对存储知识一目了然
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- [转]如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++)
- Q:我已经购买过WinDriver,最近欲使用另一部新计算机撰写驱动程序,但却无法正常操作WinDriver,请问如何解决?
- 如何使用Eclipse的NDK开发动态库,静态库