[原创]浅谈如何使用gcc开发NT核心驱动程序
一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软“正统”的VC来。诚然,用VC 配合 WINDDK 的确工作的不错,但或许我们可以让其变得更简单更完善一些。
其实偶一般是用 Masm32v9 + EditPlus2 编写 NT内核驱动,仅此而已。从环境搭建的便捷性和编写代码的灵活性来说无疑这是非常高的。但汇编终归是汇编,虽然强大,但很多事都要自己动手来做,往往很简单的功能都要用比较“生硬”的方法来完成,比如:
;**************************************************************** .data ;**************************************************************** szenter db "enter driverentry", szleave db "leave driverentry", ;****************************************************************
.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",
szleave db "leave driverentry", 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核心驱动程序的更多相关文章
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- [原创]浅谈移动互联网App兼容性测试
[原创]浅谈移动互联网App兼容性测试 今天要谈的话题,估计各位测试都有感受,移动互联网App兼容性测试,我们到底测试覆盖如何去挑选机型?具体移动App兼容性测试如何开展?是不是应引进像testin这 ...
- [原创]浅谈Web UI自动化测试
[原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...
- [原创] 浅谈ETL系统架构如何测试?
[原创] 浅谈ETL系统架构如何测试? 来新公司已入职3个月时间,由于公司所处于互联网基金行业,基金天然固有特点,基金业务复杂,基金数据信息众多,基金经理众多等,所以大家可想一下,基民要想赚钱真不容易 ...
- [原创]浅谈在创业公司对MVP的理解
[原创]浅谈在创业公司对MVP的理解 目前自已所处的公司类似一个创业平台,我们内部会不断的去孵化不同方向的产品,产品经理经常谈到的一个词就是MVP,所以有必需要去了解下什么是MVP? 1 什么是MVP ...
- [原创]浅谈IT人如何做理财规划
[原创]浅谈IT人如何做理财规划 鱼哥博客上多数写的是技术和管理相关,但很少有理财等话题,今天抽空来谈谈IT人如何做理财规划,如果要想学习理财,我想很有名的“标准普尔家庭资产象限图”上值得每个学习和理 ...
- [原创]浅谈移动App安全测试
[原创]浅谈移动App安全测试 移动互联网很火,就像当年互联网兴起一样,这几天和朋友在沟通交流,谈到一个话题,你们做金融App钱放在你们哪边安全不?会不会你们做的移动App不安全,让人盗了里面的资金, ...
- [原创]浅谈H5页面性能优化方法
[原创]浅谈H5页面性能优化方法 前阶段公司H5页面性能测试,其中测试时也发现了一些性能瓶颈问题,接下来我们在来谈谈H5页面性能优化,仅仅是一些常用H5页面性能优化措施,其实和Web页面性能优化思路大 ...
- [原创]浅谈H5页面性能测试
[原创]浅谈H5页面性能测试 H5页面我想各位都不陌生,随着移动互联网兴起,不管是App,还是H5都火起来了,最突出的2个表现是ios/android/前端等工程师薪水大涨,尤其是资深前端工程师40W ...
随机推荐
- KZ--NSString、NSMutableString
//NSString初始化的几种方法(3种方法) //1. NSString *str2 = [[NSString alloc] init]; ...
- 把WCF服务部署服务器IIS异常(详细:处理程序“svc-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”)
详细:处理程序“svc-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 原因: vs2010默认的是4.0框架,4.0的框架是独立的CLR,和2.0 ...
- 用python开发简单ftp程序
根据alex老师视频开发的简单ftp程序,只能实现简单的get功能 ftp客户端程序: #!/usr/bin/env python #_*_ coding:utf-8 _*_ import socke ...
- webstrom 常用快捷键
最近在学习javascript,同时发现了一款非常好用的IDE webstrom 现在记录改IDE的快捷键 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文 ...
- JavaScript学习之—prototype
一.利用prototype扩展String方法,去除字符前后空格: String.prototype.trim = function String$trim() { if (arguments.len ...
- Unicode其实是Latin1的扩展。只有一个低字节的Uncode字符其实就是Latin1字符——附各种字符编码表及转换表
一.概念 1,ASCII ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码.是 ...
- xxx.java: Recompile with -Xlint:unchecked for details.
一.遇到问题:用ant执行jasperreport的samples/charts示例的build.xml时,无法编译,提示错误如下:javac: [javac] Compiling 2 sour ...
- SVG关注复杂图形的网页绘制技术
SVG 是使用 XML 来描述二维图形和绘图程序的语言. 学习之前应具备的基础知识: 继续学习之前,你应该对以下内容有基本的了解: HTML XML 基础 如果希望首先学习这些内容,请在本站的首页选择 ...
- wchar_t 、UTF-8、UTF-16的转换方法 - luketty的专栏 - 博客频道 - CSDN.NET
wchar_t .UTF-8.UTF-16的转换方法 - luketty的专栏 - 博客频道 - CSDN.NET wchar_t .UTF-8.UTF-16的转换方法
- hdu 3934 Summer holiday(凸包最大内接三角形)
求n个点能组成的最大三角形,一发旋转卡壳模板题... #include<algorithm> #include<iostream> #include<cstring> ...