boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
阅读:2590回复:12

APC异常问题

楼主#
更多 发布于:2008-05-03 10:09
我现在做一个防火墙过滤驱动,需要将Ndis截获的数据包提交给用户层进行处理,我目前的方案是:
接受到数据包->内核过滤器匹配->创建一个工作项->插入APC到我的接受线程->用户函数执行

插入APC的代码为:
    apc = ExAllocatePool(NonPagedPool, sizeof(struct _KAPC));
    
    KeInitializeApc(apc, thread, 0, Context->ApcCompleteRoutine, 0, Context->ApcFunction, 1, (PVOID)Context->Args[0]);
    
    /* Insert it to the queue of the target thread */
    if (!KeInsertQueueApc(apc, (PVOID)Context->Args[1], (PVOID)Context->Args[2], 0))
    {
        KdPrint(("KeInsertQueueApc Failed!\n"));
        ExFreePool(apc);
        goto free_exit;
    }
    //set UserApcPending = TRUE
    pApcState = (PKAPC_STATE)((PUCHAR)thread + g_KThreadOffset.wOffsetApcState);
    pApcState->UserApcPending = 1;
接受线程就是一个循环 while(!exit) Sleep(10);
现在的情况是:用户接受线程可以接受到APC调用,并能正常处理数据,但是一般运行一段时候后就突然提示 内存错误!!!驱动倒是一直稳定工作。
我怀疑是不是我发APC时候,手工设置线程UserApcPending数据造成的?理论上如果我的接受线程是一个警醒的线程,那我可以不用设置UserApcPending,要怎么保证我的线程处于警醒状态呢?

或者有没有其它成熟的方案能够满足我的需求呢?



最新喜欢:

AthlonxpX86Athlon...
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2008-05-04 22:11
自己搞定了,原创!hoho
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-05-05 12:46
那就说说什么问题以及如何解决的.
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
地板#
发布于:2008-05-05 16:46
    pApcState = (PKAPC_STATE)((PUCHAR)thread + g_KThreadOffset.wOffsetApcState);
    pApcState->UserApcPending = 1;
删掉删掉,自己的线程自己保持警醒就可以了
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-05-05 21:35
呵,学习APC上瘾了,啥东西都想用APC。
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2008-05-06 11:56
被楼上说中了,我打算再用官方标准方法实现一个:应用层创建一个事件,传递给内核。
内核在有数据要传递的时候KeSetEvent,然后用户接受数据线程调用DeviceIoControl读取数据。或者通过ReadFile读取.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2008-05-06 16:37
用官方的才是正道.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2008-05-06 22:03
因为我发现可耻的微点让我的APC调用失败了 难道我自己插入自己线程的APC 微点也要管???这世道真是
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
8楼#
发布于:2008-05-07 06:56
APC很好的,卡巴里面很多自插APC~
没有战争就没有进步 X3工作组 为您提供最好的军火
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2008-05-19 15:21
被楼上说中了,我打算再用官方标准方法实现一个:应用层创建一个事件,传递给内核。
内核在有数据要传递的时候KeSetEvent,然后用户接受数据线程调用DeviceIoControl读取数据。或者通过ReadFile读取.------------------------------------------》如果驱动需要用户层的完成返回信息才能进行以后的动作需要怎么办? 官方的正道是如何做的?
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2008-05-19 17:31
上面的问题比较复杂,等待牛人来解答,我也关注ing
action3210
驱动小牛
驱动小牛
  • 注册日期2008-02-27
  • 最后登录2010-09-17
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望194点
  • 贡献值0点
  • 好评度69点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-05-20 16:34
那你再召唤一次吧,呵呵
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-05-20 16:43
搂住患上 apc 综合症了.
游客

返回顶部