首页
社区
课程
招聘
[原创]一个基于gcc和Masm32V9.0+的驱动傻瓜生成包
发表于: 2009-2-16 17:37 16270

[原创]一个基于gcc和Masm32V9.0+的驱动傻瓜生成包

2009-2-16 17:37
16270
收藏
免费 7
支持
分享
最新回复 (24)
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不知道楼上的 奖章怎么卖
不用这开发 驱动
2009-2-16 17:41
0
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
3
干什么?你想要奖章啊?你想要的话你就说话嘛。你不说我怎么知道你想要呢?
虽然你很有诚意地看着我,可是你还是要跟我说你想要的。你真的想要吗?那你就拿去
吧!你不是真的想要吧?难道你真的想要吗?......
2009-2-16 18:40
0
雪    币: 615
活跃值: (1212)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
HO!

来试试.
2009-2-16 18:49
0
雪    币: 7146
活跃值: (3731)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asd
5
不在csdn好好做斑竹,一年看不到几次
2009-2-16 18:53
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
无法理解用MinGW来做Windows的驱动,编译的质量能与vc相比吗?
2009-2-16 18:57
0
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
7
偶版主做的挺好的呀,呵呵
2009-2-16 18:58
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
支持一下楼主,就是不知道要开发nt的驱动,是不是安装了mingw和xp sp1 ddk就行了?
2009-5-31 09:43
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
hopy是高人来的非常好的东西,感谢hopy收藏了。
2009-5-31 15:20
0
雪    币: 217
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
gcc的编译质量是不用怀疑的,特别是gcc4.x。主要是调试非常不便,gcc没法生成pdb文件。
2009-5-31 18:44
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
今天试了一下,给楼主补充一下,首先光有Masm32v9.0+ 和 MinGW 环境是不够的。还要下载kmdkit并安装,我用的是1.8版的kmdkit,下载链接:
http://www.wasm.ru/tools/21/KmdKit.zip
不知道算不算新,因为单位的网似乎连不上four-f的网站,老毛子的俄语又看不懂。
但不管怎样,最后实验是成功的。

我安装的是vc6.0龙卷风企业版sp6,xp的ddk,目录是2600的,应该是版本号吧。masm32v9,msys最新版就是包含mingw最新版,我用的gcc版本是4.3.3-tdm-1。实验的例子是ddk里面的cancel,因为据说它是最简单的例子了。
首先用ddk来build,一次通过,再用OSRLOADER加载,操作都是成功的,check版,文件大小是6,784。
然后用这篇博客(http://kruglinski.bokee.com/3642661.html)上的方法来试,在msys的环境下,quicksys0.2.2生成框架能编译连接但是无法加载,框架本身也不能用ddk来build,而用quicksys0.4.0生成的框架ddk无法build。然后用msys去编译cancel工程,编译时有warning,连接不通过。结论,参数有问题,有待摸索。
最后用楼主的工具,首先我下载安装了masm32v9,在虚拟机中安装好费时啊。然后下载kmdkit,解压后拷贝好文件夹,
Copy \include\            to  \masm32\include
Copy \macros\Strings.mac  to  \masm32\macros
Copy \lib\w2k             to  \masm32\lib

把楼主的文件解压,"b c"成功,osrload加载启动成功,free,final都是,文件大小分别是:311,392      3,264       1,728
观察脚本设定发现主要是用link来连接才成功的,问题是用了哪个link呢?原来是vc6的!

然而编译 ddk的cancel 不成功。

也就是说ddk自己的例子用楼主的工具和mingw是不成功的,只能是楼主的写法能通过mingw和kmdkit来编译并用vc的link来连接。

请教楼主,要是纯用gnu的ld来链接应该怎样做,还有要是用mingw自己的头文件究竟能不能编译。
2009-6-2 11:04
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
感觉在windows下编点东西忒没意思,什么都是闭源的。要是没有kmdkit的那两个lib,说不定就连接不了,听说vs2008里已经把lib的格式都改了,这样一来我看写什么都是hack性质的,靠猜,靠运气。不如linux那么自由,只有恶意软件的作者才把nt内核当天堂啊。我因为被一些事情所逼,才从linux上面来研究一下windows编程的,现在看来已没有必要了,拜拜啦。
2009-6-2 11:39
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
13
不错的东西。。。。
2009-6-2 17:15
0
雪    币: 471
活跃值: (4053)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
14
11楼的经验很有帮助
2009-6-2 18:01
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
这位    http://bbs.chinaunix.net/viewthread.php?tid=919186
和我有类似的经历,都是能用mingw编译却无法执行驱动,看来问题出在
1 程序的写法上,我用《天书夜读:从汇编语言到windows内核编程》上第80页的最简单例子来编译和连接,一样是能加载却无法运行,显示不是有效的驱动程序。
2 连接时要用到的lib
2009-6-3 05:57
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
最后看了楼主的sys.c的写法,确认了刚才说的第一点,gcc的写法不同,这种写法在我手边的任何一本讲驱动开发的书里都没有啊。
2009-6-3 06:04
0
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
17
感谢支持,你用的是WINDDK么?
2009-6-30 13:00
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
http://bbs.chinaunix.net/viewthread.php?tid=919186这个链接里面
作者写道:“已经指定了生成的driver.sys入口是--entry=_DriverEntry”

应该是--entry=_DriverEntry@8吧?因为是__stdcall
2009-7-21 18:35
0
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
19
虽然DriverEntry是stdcall,但是我用dlltool将函数名修改了,见c.bat
2009-7-30 12:05
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
今天又拿起这个题目操练了一下,基本上有了一点进步。
这次我是使用msys-cn的安装包安装的mingw,我不提供msys-cn的网址了,因为上次我在某个论坛贴链接结果收到一次斑竹的警告,唉。反正是code google上的,这是gcc版本号,已经不是最新的了,现在我也不想升级,等等再说

Using built-in specs.
Target: mingw32
Configured with: ../gcc-4.3.3/configure --prefix=/mingw --build=mingw32 --enable-languages=c,ada,c++,fortran,objc,obj-c++ --with-bugurl=http://www.tdragon.net/recentgcc/bugs.php --disable-nls --disable-win32-registry --enable-libgomp --disable-werror --enable-threads --disable-symvers --enable-cxx-flags='-fno-function-sections -fno-data-sections' --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-sjlj-exceptions --with-pkgversion='4.3.3-tdm-1 mingw32'
Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)

这次我不使用kmdkit,就用gcc自己的包来编译。

源代码还是天书夜读上的那个:
原来的文件是:
#include <ntifs.h>
NTSTATUS DriverEntry(
                PDRIVER_OBJECT driver,
                PUNICODE_STRING reg)
{
        return STATUS_SUCCESS;
}

经过尝试,我改为:

#include <ddk/ntifs.h>
NTSTATUS STDCALL DriverEntry(
                PDRIVER_OBJECT driver,
                PUNICODE_STRING reg)
{
        return STATUS_SUCCESS;
}

修改的地方是头文件包含处加上“ddk/",否则找不到路径。加上STDCALL不然又是警告又是不能运行。

编译命令是:
gcc -o 1.sys -s -nostartfiles -Wl,-nostdlib -shared -Wl,--entry,_DriverEntry@8 -Wl,--file-alignment,0x0080 -Wl,--section-alignment,0x0080 -Wl,--image-base,0x00010000 1.c -lntoskrnl

不明白是什么意思,反正是从一个叫Aliwy的牛人的编程博客上看到一点code:blocks的配置,code:block也是一个gcc的图形化包装,然后经过摸索,尤其是那个结尾的参数的位置是google来的。

编译没有问题。生成了1.sys。用osrloader能注册,启动,删除,但是不能结束。然后从csdn上下载了ds的driver monitor绿色版,信息如下:
          Monitor                    Reader thread started
          Monitor                    Remote reader thread started
          Monitor                    Using existing service database entry for driver.
          Monitor                    The driver has already been started.
          Monitor                    ERROR (1052): The driver is not in a state to accept this command.
          Monitor                    ERROR (1072): The driver's service database entry is already marked for deletion.
           Monitor                     -- end --
看来这个驱动是终结不了,但其他正常,估计和程序的写法有关。

结论:使用gcc是可以编译nt内核驱动的,就是要注意一点语言特性。
2009-9-12 13:38
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
备忘一下,知道了为什么不能停止驱动的原因了,因为没有设定driverunload。
修改上面的代码,加入unload函数。

#include <ddk/ntifs.h>
void STDCALL OnUnload ( IN PDRIVER_OBJECT DriverObject )  
{  
          DbgPrint("[hj_18] OnUnload\n");  
}  

NTSTATUS STDCALL DriverEntry(
                PDRIVER_OBJECT driver,
                PUNICODE_STRING reg)
{
        driver->DriverUnload = OnUnload;
        return STATUS_SUCCESS;
}

注意一下,还是要加STDCALL,好烦,有没有什么一劳永逸的办法?
2009-9-12 19:28
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
MinGW能编译驱动!好啊,谢谢hopy和hjonline,刚才下载WDK,600多MB,真吓人啊。
2009-9-17 21:50
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
为什么我按照你的命令行编译出来的1.sys只能注册,删除,但是不能启动呢?
2009-11-18 15:20
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
收藏了,感谢楼主。
2009-11-18 16:04
0
雪    币: 89
活跃值: (185)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
25
这个有点意思。
2010-1-14 13:40
0
游客
登录 | 注册 方可回帖
返回
//