阅读:4291回复:30
基于filedisk实现驱动回调应用程序
我是驱动程序方面的菜鸟
在论坛搜索出了很多这方面的帖子,没有发现具体实现的例子 以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. |
|
最新喜欢:![]() |
沙发#
发布于:2004-08-16 08:43
怎么没人理?
顶起来先 |
|
板凳#
发布于:2004-08-16 08:52
一个 是内核函数,一个是应用层函数,不可以这样做吧。
我想说的是有这样的必要么? |
|
|
地板#
发布于:2004-08-16 09:03
一个 是内核函数,一个是应用层函数,不可以这样做吧。 应该是可以这样做的,http://dev.csdn.net/article/23/23195.shtm说明了这个问题。 这样做的意义就在于通过应用界面程序,增加功能的丰富、灵活性。 |
|
地下室#
发布于:2004-08-16 15:29
问题是你不能用BUFFER的传输方式,而应该用NEITHER,嘿嘿。。。。。。
|
|
|
5楼#
发布于:2004-08-16 15:37
问题是你不能用BUFFER的传输方式,而应该用NEITHER,嘿嘿。。。。。。 首先感谢老大的光顾 您的意思是能够实现的了? 能否具体的指点一下? 我是要实现IRP_MJ_READ得到的数据让外部程序处理一下子再传回驱动程序呢 郁闷了好几天了,帮帮我吧! |
|
6楼#
发布于:2004-08-18 16:49
你这样做问题很多,不正规,很有可能是程序跑飞,主要是进程环境的问题,如果切换进程,那你的那个指针???正规的方法是用信号机制在你的IOCTL下设置信号,在应用程序里面设置监控线程等待驱动程序的信号,然后在应用程序中调用函数
|
|
|
7楼#
发布于:2004-08-18 20:12
你这样做问题很多,不正规,很有可能是程序跑飞,主要是进程环境的问题,如果切换进程,那你的那个指针???正规的方法是用信号机制在你的IOCTL下设置信号,在应用程序里面设置监控线程等待驱动程序的信号,然后在应用程序中调用函数 晕了,彻底的晕了。 我还是把处理过程放到驱动程序里面吧。 |
|
8楼#
发布于:2004-08-18 21:10
方法完全可行,你通过DEVICEIOCONTROL进来的时候,CONTEXT不会切换,我说了关键是用NEITHER方式可以正确获得你的应用层函数指针从而在驱动层调用你的应用层的函数。
|
|
|
9楼#
发布于:2004-08-18 22:11
方法完全可行,你通过DEVICEIOCONTROL进来的时候,CONTEXT不会切换,我说了关键是用NEITHER方式可以正确获得你的应用层函数指针从而在驱动层调用你的应用层的函数。 |
|
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); |
|
|
11楼#
发布于:2004-08-19 10:42
我是驱动程序方面的菜鸟 我觉得如果你用的是缓冲io的话,错误很简单 tc = *(CBFunc *)Irp->AssociatedIrp.SystemBuffer; |
|
|
12楼#
发布于:2004-08-19 10:54
[quote]我是驱动程序方面的菜鸟 我觉得如果你用的是缓冲io的话,错误很简单 tc = *(CBFunc *)Irp->AssociatedIrp.SystemBuffer; [/quote] 楼上的有没有做过测试呢??我也在Irp->AssociatedIrp.SystemBuffer测试过,可里面的根本就是不是你传来的函数指针,请你做过测试后再说。。。。。。。 |
|
|
13楼#
发布于:2004-08-19 11:42
[quote][quote]我是驱动程序方面的菜鸟 我觉得如果你用的是缓冲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; 这两个是完全不一样的,所以才有:里面的根本就是不是你传来的函数指针 |
|
|
14楼#
发布于:2004-08-19 12:26
其实函数的地址只是一个数值而已,通过哪种方式不能传下来啊!! 所以还是代码的问题,不是方法的问题。:P
|
|
15楼#
发布于:2004-08-19 12:29
看看函数地址传下来的和user mode下的是否相同,如果相同的话,还要注意函数的调用方式是否一致(stdcall fastcall etc),我没有试过,胡乱说的,希望有所帮助。 :P
|
|
16楼#
发布于:2004-08-19 13:03
[quote][quote][quote]我是驱动程序方面的菜鸟 我觉得如果你用的是缓冲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调试后再说对错,我是直接在汇编中调试的,而且也执行成功的,嘿嘿。。。。。。。 |
|
|
17楼#
发布于:2004-08-19 13:26
[quote][quote][quote][quote]我是驱动程序方面的菜鸟 我觉得如果你用的是缓冲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] 呵呵,原来把程序代码段的地址作为缓冲地址传进来了! 很抱歉,我没看应用程序部分。 尽管如此,我觉得这种传递参数的做法不好! |
|
|
18楼#
发布于:2004-08-19 13:37
嘿嘿,老兄我又没说他好,我只是针对楼主的想法的一个实现方法而已......
|
|
|
19楼#
发布于:2004-08-19 21:03
嘿嘿,老兄我又没说他好,我只是针对楼主的想法的一个实现方法而已...... 这两天出差,没有上来,感谢! 如何给分? |
|
上一页
下一页