阅读:2046回复:13
同NT和2000下能建造内核模式的API吗?
我在win98下针对我的一PCI设备,在内核态(kernel mode)建造了一个API,也就是输出了一系列的函数供其它驱动在内核态中直接调用,可我在NT及2000下没有找到相应的机制。不知在NT和2000下怎样才能输出一内核API,需要使用什么样的机制,在DDK文档中有描述吗?
|
|
沙发#
发布于:2001-07-22 12:17
在NT方式下,提供了一种紧耦合的调用方式,可能比较适合你的要求。
不过我正在看,还没有实际用过。 |
|
|
板凳#
发布于:2001-07-23 08:29
在PROGRAMMING WDM一书中,你看看GENERIC.SYS就明白了
|
|
|
地板#
发布于:2001-07-23 09:31
To: LittleSW, 你所说的紧耦合方式,用英语怎么拼,在DDK文档中有描述吗?
To:KDriver, 真抱歉,我没有这本书,所以你能说的稍微详细一些吗? 内核API在Linux下用得较多,在windows下倒不常用,其实我认为用处还是很多,比如就可以提供给这些软驱动在内核态直接使用。 |
|
地下室#
发布于:2001-07-23 12:07
closely coupled
在DDK中有讲。 |
|
|
5楼#
发布于:2001-07-23 13:42
本站就有这本书DOWN,你看看GENERIC这个工程,它生成一个GENERIC.SYS,导出了很多函数供别的内核驱动程序使用,你看看就可以了。
|
|
|
6楼#
发布于:2001-07-23 22:44
主要有两种方法:
1、在MJ_FUNCTION注册时,注册一个IRP_MJ_INTERNAL_DEVICE_CONTROL的分派例程。然后在另外一个驱动 里面构造一个irp,使用IoCallDriver函数将这个irp发送到提供函数 的那个驱动去。 2、使用一种没有公开的技术。是osr发布的。 在提供服务的驱动里面将所有需要被其他驱动调用的函数使用类似 dll方式的declare,然后在使用函数的驱动里面直接用调用dll函数 的方法调用 |
|
|
7楼#
发布于:2001-07-23 23:07
To hechao:
第二种方法在多线程调用时会产生重入。 |
|
|
8楼#
发布于:2001-07-24 10:52
To: KDriver ,那本书我已下载下来,但没有那个GENERIC工程源代码,你能把它的源代码发给我吗?Email : BlueLight@371.net
To: hechao ,你所说的IRP方式,在没办法时我会用的,毕竟一个 buff 不如函数友好,而且也不便于封装。你说的第二种方法,有例子程序吗?littleSW所说的重入会造成什么后果吗? |
|
9楼#
发布于:2001-07-24 11:58
重入,当然会造成同步互斥的问题。当然解决的方法也有,就是使用自旋锁。
源程序我有,不过不能完全给你,只可以是同这部分有关的,很简单,相信你一看就知道。 请发信到he_chao@263.net我会回复你 |
|
|
10楼#
发布于:2001-07-24 18:00
已经发去,你收以下
|
|
|
11楼#
发布于:2001-07-24 18:12
也给我一份。
lingying74@21cn.com |
|
|
12楼#
发布于:2001-07-25 12:58
下面的说明是关于两个驱动之间通信的。
其中假设a.sys为主驱动sys,b.sys为a.sys提供某种处理过程。a.sys通过调用b.sys的函数来进行通信。 b.sys的函数为自定义函数,没有任何限制。 在b.sys头文件里面声明如下函数,然后在程序里面直接调用。 extern int BBB(PUCHAR databuf, PUSHORT databuflen); 在a.sys定义如下函数 int _declspec( dllexport ) BBB(PUCHAR databuf, PUSHORT databuflen); 然后实现其即可。 该方式在nt下使用正常,一个朋友在2000下也可以,但他说在98下面好象有一些问题。该方法在sys之间, wdm之间,sys和wdm之间都可以使用。 另外需要注意的一点是互斥。好象在这个函数里面自旋锁无法使用。反正我在BBB函数里面使用自旋锁,跟 本没有用,不知道为什么。 实现通信的另外一种方法是使用irp方式,这个在机械工业的那本书里面有详细的介绍。 |
|
|
13楼#
发布于:2001-07-26 10:00
那a.sys中还需要打开、调用或引导b.sys吗?若需要,用什么函数呢,有什么限制吗?
win98好像用 _cdecl 声名即可。 |
|