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

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

2009-2-16 17:37
16416
收藏
免费 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
活跃值: (1372)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
HO!

来试试.
2009-2-16 18:49
0
雪    币: 8047
活跃值: (4918)
能力值: ( 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
雪    币: 1776
活跃值: (69)
能力值: ( 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
雪    币: 1776
活跃值: (69)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
今天试了一下,给楼主补充一下,首先光有Masm32v9.0+ 和 MinGW 环境是不够的。还要下载kmdkit并安装,我用的是1.8版的kmdkit,下载链接:
82eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4N6S2M7$3#2Q4x3X3g2J5N6g2)9J5c8Y4c8G2L8$3I4K6i4K6u0r3x3U0q4Q4x3V1k6w2L8h3c8w2K9i4c8Q4x3X3g2*7K9i4l9`.
不知道算不算新,因为单位的网似乎连不上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。
然后用这篇博客(59cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3E0J5N6h3N6D9K9h3&6K6K9$3W2Q4x3X3g2T1L8$3E0W2k6g2)9J5k6h3y4G2L8g2)9J5c8U0x3$3y4o6t1$3y4U0q4Q4x3X3g2Z5N6r3#2D9i4K6t1&6i4@1f1@1i4@1t1^5i4K6S2m8i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1$3i4K6V1$3i4@1t1&6i4@1f1$3i4@1t1K6i4K6V1#2i4@1f1$3i4K6W2p5i4@1p5#2i4@1f1^5i4@1q4r3i4K6V1#2i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1#2i4K6W2o6i4@1p5^5L8i4y4&6M7#2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4#2)9^5c8g2!0m8c8W2!0q4y4g2!0m8x3W2)9^5x3#2!0q4y4q4!0n7z5q4)9^5b7W2!0q4c8W2!0n7b7#2)9^5b7%4q4#2K9h3y4C8M7%4W2K6x3q4)9J5k6e0u0Q4x3X3f1J5i4@1f1%4i4K6V1@1i4K6W2r3i4@1f1$3i4K6R3^5i4K6V1H3i4@1f1$3i4@1p5I4i4K6R3$3i4@1f1$3i4K6W2q4i4@1t1$3i4@1f1^5i4K6R3K6i4@1u0p5i4@1f1%4i4@1u0o6i4K6V1$3i4@1f1^5i4@1q4r3i4K6V1I4i4@1f1^5i4@1u0r3i4K6W2q4i4@1f1$3i4K6S2q4i4@1p5#2i4@1f1@1i4@1u0p5i4K6R3$3i4@1f1$3i4K6V1^5i4@1q4r3i4@1f1$3i4K6V1%4i4@1p5H3i4@1f1$3i4@1t1K6i4K6V1#2i4@1f1#2i4K6S2m8i4@1p5H3i4@1f1^5i4@1u0p5i4@1u0p5i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4@1p5I4i4K6R3$3i4@1f1$3i4K6W2q4i4@1t1$3i4@1f1$3i4K6W2o6i4@1q4o6i4@1f1^5i4@1u0m8i4@1q4n7i4@1f1@1i4@1t1&6i4K6W2r3i4@1f1@1i4@1t1^5i4K6S2p5i4@1f1^5i4K6R3K6i4@1u0p5i4@1f1%4i4K6V1@1i4@1p5^5k6r3c8C8i4@1f1$3i4K6W2p5i4@1p5#2j5Y4g2A6L8r3c8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0S2Q4z5o6m8Q4z5p5y4Q4c8e0N6Q4z5e0c8Q4b7e0S2I4N6h3W2U0K9%4y4&6M7K6m8Q4x3X3f1@1i4K6u0W2x3q4!0q4y4#2)9&6y4q4)9&6c8W2!0q4y4W2)9^5z5q4)9&6x3q4!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4W2!0m8x3g2)9^5y4W2!0q4y4W2)9&6c8g2!0n7y4X3c8V1K9#2!0q4y4W2)9&6y4#2!0m8x3q4!0q4y4W2!0n7x3#2)9&6y4h3u0#2K9h3I4V1i4@1f1K6i4K6R3H3i4K6R3J5i4@1f1%4i4K6R3@1i4@1t1$3i4@1f1#2i4K6V1H3i4K6S2q4i4@1f1%4i4K6V1@1i4@1p5^5L8i4y4&6M7#2!0q4y4g2)9^5c8g2!0n7b7W2!0q4y4#2!0n7b7#2)9&6y4W2!0q4z5q4!0m8c8W2)9&6x3h3y4S2L8X3y4W2L8q4!0q4y4g2!0n7y4#2!0m8y4g2!0q4y4#2!0m8z5q4)9^5b7W2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4#2!0n7b7#2)9&6y4W2!0q4z5q4!0m8c8W2)9&6x3g2!0q4y4W2)9&6y4#2!0n7y4W2!0q4y4W2)9&6b7#2)9^5z5i4N6S2M7X3&6A6L8X3N6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0S2Q4b7V1k6Q4z5f1g2Q4c8e0k6Q4z5p5g2Q4b7e0g2Q4c8e0c8Q4b7U0S2Q4z5p5c8Q4c8e0W2Q4z5o6m8Q4z5f1q4Q4c8e0S2Q4b7V1k6Q4z5o6N6Q4c8e0y4Q4z5o6m8Q4z5o6u0Q4c8e0N6Q4b7V1u0Q4z5e0y4Q4c8e0S2Q4b7f1g2Q4b7V1q4Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4z5p5k6Q4z5o6u0Q4c8e0k6Q4z5e0g2Q4b7U0m8Q4c8e0k6Q4z5f1y4Q4z5o6W2Q4c8e0W2Q4z5e0N6Q4b7f1g2Q4c8e0W2Q4b7e0u0Q4z5e0S2Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0k6Q4z5f1y4Q4z5o6W2Q4c8e0g2Q4b7V1g2Q4z5o6g2Q4c8e0k6Q4z5e0q4Q4b7U0S2Q4c8e0N6Q4b7U0c8Q4b7e0u0Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
最后用楼主的工具,首先我下载安装了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
雪    币: 1776
活跃值: (69)
能力值: ( 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
雪    币: 472
活跃值: (4906)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
14
11楼的经验很有帮助
2009-6-2 18:01
0
雪    币: 1776
活跃值: (69)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
这位    b12K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6h3y4Z5K9h3&6S2N6h3&6A6P5q4)9J5k6h3&6W2N6q4)9J5c8Y4k6A6k6i4N6@1K9s2u0W2j5h3c8Q4x3X3g2H3K9s2m8Q4x3@1k6@1K9h3c8Q4x3@1b7&6x3e0V1I4z5o6j5`.
和我有类似的经历,都是能用mingw编译却无法执行驱动,看来问题出在
1 程序的写法上,我用《天书夜读:从汇编语言到windows内核编程》上第80页的最简单例子来编译和连接,一样是能加载却无法运行,显示不是有效的驱动程序。
2 连接时要用到的lib
2009-6-3 05:57
0
雪    币: 1776
活跃值: (69)
能力值: ( 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
a06K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6h3y4Z5K9h3&6S2N6h3&6A6P5q4)9J5k6h3&6W2N6q4)9J5c8Y4k6A6k6i4N6@1K9s2u0W2j5h3c8Q4x3X3g2H3K9s2m8Q4x3@1k6@1K9h3c8Q4x3@1b7&6x3e0V1I4z5o6k6Q4c8e0S2Q4b7V1k6Q4z5e0W2Q4c8e0c8Q4b7U0S2Q4b7f1q4Q4c8e0W2Q4z5e0y4Q4b7V1g2Q4c8e0k6Q4z5p5g2Q4b7e0g2Q4c8e0W2Q4z5o6N6Q4z5p5y4Q4c8e0W2Q4z5f1c8Q4b7e0t1`.
作者写道:“已经指定了生成的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
雪    币: 1776
活跃值: (69)
能力值: ( 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=a55K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4c8V1M7X3q4Y4L8$3&6Q4x3X3g2F1k6i4c8Q4x3V1k6J5k6h3y4W2L8Y4c8Y4j5$3y4Q4x3V1k6T1N6h3N6K6i4K6u0W2M7r3S2H3 --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
雪    币: 1776
活跃值: (69)
能力值: ( 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
活跃值: (230)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
25
这个有点意思。
2010-1-14 13:40
0
游客
登录 | 注册 方可回帖
返回