NewFreedom
驱动小牛
驱动小牛
  • 注册日期2003-02-14
  • 最后登录2010-09-28
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1765回复:14

帮个忙 , 有关CompleteRoutine

楼主#
更多 发布于:2004-07-19 12:00
我在DeviceIoControl内的程序如下:
NTSTATUS InternalIOCTLCompletion(IN PDEVICE_OBJECT fido, IN PIRP Irp, IN PVOID Context)
{
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);

if (Irp->PendingReturned) {
IoMarkIrpPending(Irp);
}

KeSetEvent(&pdx->SendKeyEvent, 0, FALSE); //这行

return STATUS_SUCCESS;
}
我的目的是要我的过滤驱动在抓到信号时能再送到另一个Driver,但在IoSetCompletionRoutine设定的那个程序(如上)在作 KeSetEvent 却会造成刷屏 , 如果没有那行 , 就可正常无误的加载,
是因为在DeviceIoControl内不能用到KeSetEvent吗?希望大家能给点建议 , 谢谢~
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-19 15:04
If Wait is set to FALSE, the caller can be running at IRQL <= DISPATCH_LEVEL. Otherwise, callers of KeSetEvent must be running at IRQL PASSIVE_LEVEL and in a nonarbitrary thread context.

Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-19 15:36
这个event初始化了吗?
然后,这个event信号态后,你处理得对不对啊?
有没有造成死循环?
NewFreedom
驱动小牛
驱动小牛
  • 注册日期2003-02-14
  • 最后登录2010-09-28
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-19 20:40
谢谢前面两位

To:
 Asmsys
    这个我有注意到 DDK有说明 .

To:
 Shentu
     1. event初始化我在 createEvent
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-21 16:06
这个,就要具体情况具体分析了,跟踪一下看看吧,仔细读读代码。
或者叫个高手帮你看看,:)

另外,刷屏什么意思?


[编辑 -  7/21/04 by  Shentu]
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-22 08:39
这个,就要具体情况具体分析了,跟踪一下看看吧,仔细读读代码。
或者叫个高手帮你看看,:)

另外,刷屏什么意思?


[编辑 -  7/21/04 by  Shentu]

基本上是irql的问题,确认完成例程的irql.
应该是调用  KeInitializeEvent初始化event
不停学习
NewFreedom
驱动小牛
驱动小牛
  • 注册日期2003-02-14
  • 最后登录2010-09-28
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-22 20:46
刷屏就是会重新开机,
而且还会出现蓝色画面 ,
导致我要ghost回去,会有关于开机的档案被影响到

你们说的irql , 我知道它必须在dispatch之上丫,
这部份我也有确认丫,
真的不知道是错在哪
求救 , 谢谢 ~
lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-27 00:13
这边应该没问题,假如初始化没问题的话,
可能在等待的那边有问题
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
NewFreedom
驱动小牛
驱动小牛
  • 注册日期2003-02-14
  • 最后登录2010-09-28
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-27 11:13
To lifeship :
   谢谢 , 你所说的等待问题是指KeWaitForSingleObject吗?
能否再讲的清楚一点 , 谢谢 ~

bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-27 14:33
问题估计是出在等待的那边,你这里触发了Event,那里Wait到后做的一些动作导致了蓝屏
NewFreedom
驱动小牛
驱动小牛
  • 注册日期2003-02-14
  • 最后登录2010-09-28
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-27 19:37
To bingjie
   谢谢 bingjie ,
有个观念想要请教 , 如果程序它原本是在readwrite function 内设定 readcompleteroutine ,
也在这边触发event , 接着thread要作传递message的动作, 这部份我试过都没问题,
那我把它改在在DeviceIoControl 去readcompleteroutin(我想这边是ok的)
然后我在completeroutine内去KeSetEvent , 其它部份就跟前面” 接着thread要作传递message的动作, 这部份我试过都没问题,” 我不知道这样是不是就会不行 , 因为两者现在的差别就是
一个是在readwrite function 作 , 一个是在 DeviceIoControl里作 ,
我的Device是 Keyboard 只是我从readwrite function 去抓code 只能抓到标准key ,
所以我就从DeviceIoControl内去抓 , 可以抓的到 , 但只能在Driver Monitor上看到
我要将Key 抓到Ap上呈现 , 现在就卡在 filter Driver 送到我的另一个Driver 时就会蓝屏
就是我现在的状况

lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-27 23:01
我不适非常明白你说的话,是不是这个意思,你喜欢像某个地方发送message,你的message是什么意思
这里好像有点问题,在DeviceIoControl或者readwrite function
和completeroutine 两者有个很大的区别,前这是在非任意线程环境下运行的,而后者在人以线程环境下运行,这是,某些资源就可能是失效了,如一些地址,句并等等
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
piggy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-24
  • 最后登录2012-01-14
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望27点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-07-27 23:59
I think your DeviceIoControl dispatch routine should like the following.

YourDeviceIoControlDispatchRoutine ( PDEVICE_OBJECT DeviceObject,
    PIRP Irp
)
{
NTSTATUS status;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;

        IoCopyCurrentIrpStackLocationToNext(Irp);
        KeInitializeEvent(&pdx->SendKeyEvent,
                          NotificationEvent,
                          FALSE
                          );

        IoSetCompletionRoutine(Irp,
                               (PIO_COMPLETION_ROUTINE) InternalIOCTLCompletion,
                               pdx,
                               TRUE,
                               TRUE,
                               TRUE); // No need for Cancel

        status = IoCallDriver(pdx->NextLowerDevice, Irp);

        if (STATUS_PENDING == status) {
            KeWaitForSingleObject(
               &pdx->SendKeyEvent,
               Executive, // Waiting for reason of a driver
               KernelMode, // Waiting in kernel mode
               FALSE, // No alert
               NULL); // No timeout
        }

        //
        // We must now complete the IRP, since we stopped it in the
        // completion routine with STATUS_MORE_PROCESSING_REQUIRED.
        //
        Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}

Then your completion routine should like the following.

NTSTATUS InternalIOCTLCompletion(IN PDEVICE_OBJECT fido, IN PIRP Irp, IN PVOID Context)
{
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;

KeSetEvent(&pdx->SendKeyEvent, 0, FALSE); //这行

return STATUS_MORE_PROCESSING_REQUIRED;
}

If a completion routine signals an event, it should not call IoMarkIrpPending.

Hope this can help you.
NewFreedom
驱动小牛
驱动小牛
  • 注册日期2003-02-14
  • 最后登录2010-09-28
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-07-28 10:00
谢谢所有参与讨论的人 。
To lifeship:
    我所说的message指的是USB Keyboard 的keycode ,
而readwrite fuction 和 DeviceIoControl 以 USB Keyboard 来说 ,
收到的 keycode 就会放在 readwirte function 内去作 , 而 一些control pipe
的Data 就会放在 DeviceIoControl 内去作 , 基本上completeroutine 是用来设定某事情
作完 ,再去作某事情
非任意线程环境 与 线程环境 这个我还不太懂 ;

To piggy :
   I now try your suggestion , thanks
NewFreedom
驱动小牛
驱动小牛
  • 注册日期2003-02-14
  • 最后登录2010-09-28
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-08-06 15:48
我果然是event没有初始化的问题 ,
但现在我去 KetSetEvent 的部份并不会有相对应的动作 ,
游客

返回顶部