wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4288回复:30

基于filedisk实现驱动回调应用程序

楼主#
更多 发布于:2004-08-14 15:50
我是驱动程序方面的菜鸟
在论坛搜索出了很多这方面的帖子,没有发现具体实现的例子

以filedisk为框架,想实现从filedisk.sys中调用filedisk.exe中的函数的方法。

第一步:在filedisk.exe中编写一个函数
int WINAPI CBFunc(int a, int b)
{
return a+b;
}

第二步:通过DeviceIoControl把函数指针传递给filedisk.sys
DeviceIoControl(
    Device,
    IOCTL_FILE_DISK_INIT_FILE,
    CBFunc, //callback
    4,
    NULL,
    0,
    &BytesReturned,
    NULL
    );

第三步:在filedisk.sys中获得这个函数的指针然后调用
    typedef int (__stdcall *CBFunc)(int a, int b);
    CBFunc tc;

    case IOCTL_FILE_DISK_INIT_FILE:
        tc = Irp->AssociatedIrp.SystemBuffer;
        a = 1;
        b = 2;
        ret = (*tc)(a, b);  //程序在此处飞掉

请问:
    我需要如何在程序中定义和使用这个函数,才能成功?

我很菜,提的问题如有不妥请别见笑,拜托了。
热切企盼ing.

最新喜欢:

aasa2aasa2
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-16 08:43
怎么没人理?
顶起来先
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-16 08:52
一个 是内核函数,一个是应用层函数,不可以这样做吧。

我想说的是有这样的必要么?
不限容量的免费邮箱 www.k65.net
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-16 09:03
一个 是内核函数,一个是应用层函数,不可以这样做吧。

我想说的是有这样的必要么?

应该是可以这样做的,http://dev.csdn.net/article/23/23195.shtm说明了这个问题。

这样做的意义就在于通过应用界面程序,增加功能的丰富、灵活性。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-08-16 15:29
问题是你不能用BUFFER的传输方式,而应该用NEITHER,嘿嘿。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-16 15:37
问题是你不能用BUFFER的传输方式,而应该用NEITHER,嘿嘿。。。。。。

首先感谢老大的光顾
您的意思是能够实现的了?
能否具体的指点一下?
我是要实现IRP_MJ_READ得到的数据让外部程序处理一下子再传回驱动程序呢
郁闷了好几天了,帮帮我吧!
AthlonxpX86
驱动小牛
驱动小牛
  • 注册日期2002-11-10
  • 最后登录2013-07-17
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-18 16:49
你这样做问题很多,不正规,很有可能是程序跑飞,主要是进程环境的问题,如果切换进程,那你的那个指针???正规的方法是用信号机制在你的IOCTL下设置信号,在应用程序里面设置监控线程等待驱动程序的信号,然后在应用程序中调用函数
AthlonxpX86(桃源村)
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-18 20:12
你这样做问题很多,不正规,很有可能是程序跑飞,主要是进程环境的问题,如果切换进程,那你的那个指针???正规的方法是用信号机制在你的IOCTL下设置信号,在应用程序里面设置监控线程等待驱动程序的信号,然后在应用程序中调用函数


晕了,彻底的晕了。
我还是把处理过程放到驱动程序里面吧。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2004-08-18 21:10
方法完全可行,你通过DEVICEIOCONTROL进来的时候,CONTEXT不会切换,我说了关键是用NEITHER方式可以正确获得你的应用层函数指针从而在驱动层调用你的应用层的函数。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-18 22:11
方法完全可行,你通过DEVICEIOCONTROL进来的时候,CONTEXT不会切换,我说了关键是用NEITHER方式可以正确获得你的应用层函数指针从而在驱动层调用你的应用层的函数。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2004-08-19 10:30
以filedisk为框架,想实现从filedisk.sys中调用filedisk.exe中的函数的方法。

第一步:在filedisk.exe中编写一个函数
int WINAPI CBFunc(int a, int b)
{
return a+b;
}

第二步:通过DeviceIoControl把函数指针传递给filedisk.sys
DeviceIoControl(
Device,
IOCTL_FILE_DISK_INIT_FILE,
CBFunc, //callback
4,
NULL,
0,
&BytesReturned,
NULL
);
#define IOCTL_FILE_DISK_INIT_FILE\
    CTL_CODE(XXX, XXX, METHOD_NEITHER , FILE_ANY_ACCESS  )

第三步:在filedisk.sys中获得这个函数的指针然后调用
typedef int (__stdcall *CBFunc)(int a, int b);
CBFunc tc;

case IOCTL_FILE_DISK_INIT_FILE:
inBuf = irpSp->Parameters.DeviceIoControl.Type3InputBuffer;
outBuf =  Irp->UserBuffer;
tc = (CBFunc)inBuf;
a = 1;
b = 2;
ret = tc(a, b);
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-19 10:42
我是驱动程序方面的菜鸟
在论坛搜索出了很多这方面的帖子,没有发现具体实现的例子

以filedisk为框架,想实现从filedisk.sys中调用filedisk.exe中的函数的方法。

第一步:在filedisk.exe中编写一个函数
int WINAPI CBFunc(int a, int b)
{
return a+b;
}

第二步:通过DeviceIoControl把函数指针传递给filedisk.sys
DeviceIoControl(
    Device,
    IOCTL_FILE_DISK_INIT_FILE,
    CBFunc, //callback
    4,
    NULL,
    0,
    &BytesReturned,
    NULL
    );

第三步:在filedisk.sys中获得这个函数的指针然后调用
    typedef int (__stdcall *CBFunc)(int a, int b);
    CBFunc tc;

    case IOCTL_FILE_DISK_INIT_FILE:
        tc = Irp->AssociatedIrp.SystemBuffer;
        a = 1;
        b = 2;
        ret = (*tc)(a, b);  //程序在此处飞掉

请问:
    我需要如何在程序中定义和使用这个函数,才能成功?

我很菜,提的问题如有不妥请别见笑,拜托了。
热切企盼ing.

我觉得如果你用的是缓冲io的话,错误很简单
tc = *(CBFunc *)Irp->AssociatedIrp.SystemBuffer;
不停学习
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2004-08-19 10:54
[quote]我是驱动程序方面的菜鸟
在论坛搜索出了很多这方面的帖子,没有发现具体实现的例子

以filedisk为框架,想实现从filedisk.sys中调用filedisk.exe中的函数的方法。

第一步:在filedisk.exe中编写一个函数
int WINAPI CBFunc(int a, int b)
{
return a+b;
}

第二步:通过DeviceIoControl把函数指针传递给filedisk.sys
DeviceIoControl(
    Device,
    IOCTL_FILE_DISK_INIT_FILE,
    CBFunc, //callback
    4,
    NULL,
    0,
    &BytesReturned,
    NULL
    );

第三步:在filedisk.sys中获得这个函数的指针然后调用
    typedef int (__stdcall *CBFunc)(int a, int b);
    CBFunc tc;

    case IOCTL_FILE_DISK_INIT_FILE:
        tc = Irp->AssociatedIrp.SystemBuffer;
        a = 1;
        b = 2;
        ret = (*tc)(a, b);  //程序在此处飞掉

请问:
    我需要如何在程序中定义和使用这个函数,才能成功?

我很菜,提的问题如有不妥请别见笑,拜托了。
热切企盼ing.

我觉得如果你用的是缓冲io的话,错误很简单
tc = *(CBFunc *)Irp->AssociatedIrp.SystemBuffer; [/quote]

楼上的有没有做过测试呢??我也在Irp->AssociatedIrp.SystemBuffer测试过,可里面的根本就是不是你传来的函数指针,请你做过测试后再说。。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-08-19 11:42
[quote][quote]我是驱动程序方面的菜鸟
在论坛搜索出了很多这方面的帖子,没有发现具体实现的例子

以filedisk为框架,想实现从filedisk.sys中调用filedisk.exe中的函数的方法。

第一步:在filedisk.exe中编写一个函数
int WINAPI CBFunc(int a, int b)
{
return a+b;
}

第二步:通过DeviceIoControl把函数指针传递给filedisk.sys
DeviceIoControl(
    Device,
    IOCTL_FILE_DISK_INIT_FILE,
    CBFunc, //callback
    4,
    NULL,
    0,
    &BytesReturned,
    NULL
    );

第三步:在filedisk.sys中获得这个函数的指针然后调用
    typedef int (__stdcall *CBFunc)(int a, int b);
    CBFunc tc;

    case IOCTL_FILE_DISK_INIT_FILE:
        tc = Irp->AssociatedIrp.SystemBuffer;
        a = 1;
        b = 2;
        ret = (*tc)(a, b);  //程序在此处飞掉

请问:
    我需要如何在程序中定义和使用这个函数,才能成功?

我很菜,提的问题如有不妥请别见笑,拜托了。
热切企盼ing.

我觉得如果你用的是缓冲io的话,错误很简单
tc = *(CBFunc *)Irp->AssociatedIrp.SystemBuffer; [/quote]

楼上的有没有做过测试呢??我也在Irp->AssociatedIrp.SystemBuffer测试过,可里面的根本就是不是你传来的函数指针,请你做过测试后再说。。。。。。。 [/quote]

我没测试过,但是不用测试,你的代码也有问题:
inBuf = irpSp->Parameters.DeviceIoControl.Type3InputBuffer;
outBuf = Irp->UserBuffer;
tc = (CBFunc)inBuf;应该改成tc = *(CBFunc*)inBuf;
这两个是完全不一样的,所以才有:里面的根本就是不是你传来的函数指针
不停学习
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-08-19 12:26
其实函数的地址只是一个数值而已,通过哪种方式不能传下来啊!! 所以还是代码的问题,不是方法的问题。:P
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-08-19 12:29
看看函数地址传下来的和user mode下的是否相同,如果相同的话,还要注意函数的调用方式是否一致(stdcall fastcall etc),我没有试过,胡乱说的,希望有所帮助。 :P
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
16楼#
发布于:2004-08-19 13:03
[quote][quote][quote]我是驱动程序方面的菜鸟
在论坛搜索出了很多这方面的帖子,没有发现具体实现的例子

以filedisk为框架,想实现从filedisk.sys中调用filedisk.exe中的函数的方法。

第一步:在filedisk.exe中编写一个函数
int WINAPI CBFunc(int a, int b)
{
return a+b;
}

第二步:通过DeviceIoControl把函数指针传递给filedisk.sys
DeviceIoControl(
    Device,
    IOCTL_FILE_DISK_INIT_FILE,
    CBFunc, //callback
    4,
    NULL,
    0,
    &BytesReturned,
    NULL
    );

第三步:在filedisk.sys中获得这个函数的指针然后调用
    typedef int (__stdcall *CBFunc)(int a, int b);
    CBFunc tc;

    case IOCTL_FILE_DISK_INIT_FILE:
        tc = Irp->AssociatedIrp.SystemBuffer;
        a = 1;
        b = 2;
        ret = (*tc)(a, b);  //程序在此处飞掉

请问:
    我需要如何在程序中定义和使用这个函数,才能成功?

我很菜,提的问题如有不妥请别见笑,拜托了。
热切企盼ing.

我觉得如果你用的是缓冲io的话,错误很简单
tc = *(CBFunc *)Irp->AssociatedIrp.SystemBuffer; [/quote]

楼上的有没有做过测试呢??我也在Irp->AssociatedIrp.SystemBuffer测试过,可里面的根本就是不是你传来的函数指针,请你做过测试后再说。。。。。。。 [/quote]

我没测试过,但是不用测试,你的代码也有问题:
inBuf = irpSp->Parameters.DeviceIoControl.Type3InputBuffer;
outBuf = Irp->UserBuffer;
tc = (CBFunc)inBuf;应该改成tc = *(CBFunc*)inBuf;
这两个是完全不一样的,所以才有:里面的根本就是不是你传来的函数指针
 [/quote]
请你用SOFTICE调试后再说对错,我是直接在汇编中调试的,而且也执行成功的,嘿嘿。。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-08-19 13:26
[quote][quote][quote][quote]我是驱动程序方面的菜鸟
在论坛搜索出了很多这方面的帖子,没有发现具体实现的例子

以filedisk为框架,想实现从filedisk.sys中调用filedisk.exe中的函数的方法。

第一步:在filedisk.exe中编写一个函数
int WINAPI CBFunc(int a, int b)
{
return a+b;
}

第二步:通过DeviceIoControl把函数指针传递给filedisk.sys
DeviceIoControl(
    Device,
    IOCTL_FILE_DISK_INIT_FILE,
    CBFunc, //callback
    4,
    NULL,
    0,
    &BytesReturned,
    NULL
    );

第三步:在filedisk.sys中获得这个函数的指针然后调用
    typedef int (__stdcall *CBFunc)(int a, int b);
    CBFunc tc;

    case IOCTL_FILE_DISK_INIT_FILE:
        tc = Irp->AssociatedIrp.SystemBuffer;
        a = 1;
        b = 2;
        ret = (*tc)(a, b);  //程序在此处飞掉

请问:
    我需要如何在程序中定义和使用这个函数,才能成功?

我很菜,提的问题如有不妥请别见笑,拜托了。
热切企盼ing.

我觉得如果你用的是缓冲io的话,错误很简单
tc = *(CBFunc *)Irp->AssociatedIrp.SystemBuffer; [/quote]

楼上的有没有做过测试呢??我也在Irp->AssociatedIrp.SystemBuffer测试过,可里面的根本就是不是你传来的函数指针,请你做过测试后再说。。。。。。。 [/quote]

我没测试过,但是不用测试,你的代码也有问题:
inBuf = irpSp->Parameters.DeviceIoControl.Type3InputBuffer;
outBuf = Irp->UserBuffer;
tc = (CBFunc)inBuf;应该改成tc = *(CBFunc*)inBuf;
这两个是完全不一样的,所以才有:里面的根本就是不是你传来的函数指针
 [/quote]
请你用SOFTICE调试后再说对错,我是直接在汇编中调试的,而且也执行成功的,嘿嘿。。。。。。。 [/quote]
呵呵,原来把程序代码段的地址作为缓冲地址传进来了!
很抱歉,我没看应用程序部分。
尽管如此,我觉得这种传递参数的做法不好!
不停学习
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
18楼#
发布于:2004-08-19 13:37
嘿嘿,老兄我又没说他好,我只是针对楼主的想法的一个实现方法而已......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wang1203
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-09-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-08-19 21:03
嘿嘿,老兄我又没说他好,我只是针对楼主的想法的一个实现方法而已......


这两天出差,没有上来,感谢!

如何给分?
上一页
游客

返回顶部