阅读:2590回复:12
APC异常问题
我现在做一个防火墙过滤驱动,需要将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,要怎么保证我的线程处于警醒状态呢? 或者有没有其它成熟的方案能够满足我的需求呢? |
|
最新喜欢:Athlon... |
沙发#
发布于:2008-05-04 22:11
自己搞定了,原创!hoho
|
|
板凳#
发布于:2008-05-05 12:46
那就说说什么问题以及如何解决的.
|
|
地板#
发布于:2008-05-05 16:46
pApcState = (PKAPC_STATE)((PUCHAR)thread + g_KThreadOffset.wOffsetApcState);
pApcState->UserApcPending = 1; 删掉删掉,自己的线程自己保持警醒就可以了 |
|
地下室#
发布于:2008-05-05 21:35
呵,学习APC上瘾了,啥东西都想用APC。
|
|
5楼#
发布于:2008-05-06 11:56
被楼上说中了,我打算再用官方标准方法实现一个:应用层创建一个事件,传递给内核。
内核在有数据要传递的时候KeSetEvent,然后用户接受数据线程调用DeviceIoControl读取数据。或者通过ReadFile读取. |
|
6楼#
发布于:2008-05-06 16:37
用官方的才是正道.
|
|
|
7楼#
发布于:2008-05-06 22:03
因为我发现可耻的微点让我的APC调用失败了 难道我自己插入自己线程的APC 微点也要管???这世道真是
|
|
8楼#
发布于:2008-05-07 06:56
APC很好的,卡巴里面很多自插APC~
|
|
|
9楼#
发布于:2008-05-19 15:21
被楼上说中了,我打算再用官方标准方法实现一个:应用层创建一个事件,传递给内核。
内核在有数据要传递的时候KeSetEvent,然后用户接受数据线程调用DeviceIoControl读取数据。或者通过ReadFile读取.------------------------------------------》如果驱动需要用户层的完成返回信息才能进行以后的动作需要怎么办? 官方的正道是如何做的? |
|
10楼#
发布于:2008-05-19 17:31
上面的问题比较复杂,等待牛人来解答,我也关注ing
|
|
11楼#
发布于:2008-05-20 16:34
那你再召唤一次吧,呵呵
|
|
12楼#
发布于:2008-05-20 16:43
搂住患上 apc 综合症了.
|
|