能力值:
( LV2,RANK:10 )
2 楼
不知道楼上的 奖章怎么卖
不用这开发 驱动
能力值:
( LV9,RANK:350 )
3 楼
干什么?你想要奖章啊?你想要的话你就说话嘛。你不说我怎么知道你想要呢?
虽然你很有诚意地看着我,可是你还是要跟我说你想要的。你真的想要吗?那你就拿去
吧!你不是真的想要吧?难道你真的想要吗?......
能力值:
( LV4,RANK:50 )
4 楼
HO!
来试试.
能力值:
( LV2,RANK:10 )
5 楼
不在csdn好好做斑竹,一年看不到几次
能力值:
( LV2,RANK:10 )
6 楼
无法理解用MinGW来做Windows的驱动,编译的质量能与vc相比吗?
能力值:
( LV9,RANK:350 )
7 楼
偶版主做的挺好的呀,呵呵
能力值:
( LV3,RANK:20 )
8 楼
支持一下楼主,就是不知道要开发nt的驱动,是不是安装了mingw和xp sp1 ddk就行了?
能力值:
( LV2,RANK:10 )
9 楼
hopy是高人来的非常好的东西,感谢hopy收藏了。
能力值:
( LV2,RANK:10 )
10 楼
gcc的编译质量是不用怀疑的,特别是gcc4.x。主要是调试非常不便,gcc没法生成pdb文件。
能力值:
( 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自己的头文件究竟能不能编译。
能力值:
( LV3,RANK:20 )
12 楼
感觉在windows下编点东西忒没意思,什么都是闭源的。要是没有kmdkit的那两个lib,说不定就连接不了,听说vs2008里已经把lib的格式都改了,这样一来我看写什么都是hack性质的,靠猜,靠运气。不如linux那么自由,只有恶意软件的作者才把nt内核当天堂啊。我因为被一些事情所逼,才从linux上面来研究一下windows编程的,现在看来已没有必要了,拜拜啦。
能力值:
(RANK:1290 )
13 楼
不错的东西。。。。
能力值:
( LV9,RANK:170 )
14 楼
11楼的经验很有帮助
能力值:
( LV3,RANK:20 )
15 楼
这位 http://bbs.chinaunix.net/viewthread.php?tid=919186
和我有类似的经历,都是能用mingw编译却无法执行驱动,看来问题出在
1 程序的写法上,我用《天书夜读:从汇编语言到windows内核编程》上第80页的最简单例子来编译和连接,一样是能加载却无法运行,显示不是有效的驱动程序。
2 连接时要用到的lib
能力值:
( LV3,RANK:20 )
16 楼
最后看了楼主的sys.c的写法,确认了刚才说的第一点,gcc的写法不同,这种写法在我手边的任何一本讲驱动开发的书里都没有啊。
能力值:
( LV9,RANK:350 )
17 楼
感谢支持,你用的是WINDDK么?
能力值:
( LV2,RANK:10 )
18 楼
http://bbs.chinaunix.net/viewthread.php?tid=919186这个链接里面
作者写道:“已经指定了生成的driver.sys入口是--entry=_DriverEntry”
应该是--entry=_DriverEntry@8吧?因为是__stdcall
能力值:
( LV9,RANK:350 )
19 楼
虽然DriverEntry是stdcall,但是我用dlltool将函数名修改了,见c.bat
能力值:
( 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内核驱动的,就是要注意一点语言特性。
能力值:
( 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,好烦,有没有什么一劳永逸的办法?
能力值:
( LV2,RANK:10 )
22 楼
MinGW能编译驱动!好啊,谢谢hopy和hjonline,刚才下载WDK,600多MB,真吓人啊。
能力值:
( LV2,RANK:10 )
23 楼
为什么我按照你的命令行编译出来的1.sys只能注册,删除,但是不能启动呢?
能力值:
( LV2,RANK:10 )
24 楼
收藏了,感谢楼主。
能力值:
( LV9,RANK:270 )
25 楼
这个有点意思。