dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:2442回复:3

apc 的最简单实现

楼主#
更多 发布于:2001-07-16 17:22
1.在app里定义一个最间单的function和一个参数struct

void myapcroutine(PArgStruct pArg);
void myapcroutine(PArgStruct pArg)
{
printf("Apc Successful %s  %d!\n",pArg->arg1,pArg->i_arg2);

}

typedef struct _Argstruct{
char arg1[100];
int i_arg2;
}ArgStruct, *PArgStruct;
typedef struct _ApcRoutineAndArg
{
           ULONG apcRoutine;
PArgStruct pArg;
} ApcRoutineAndArg, *PApcRoutineAndArg;
2.给参数赋值并传递function到driver
ArgStruct sarg;
ApcRoutineAndArg apcandarg;
strcpy(sarg.arg1,"apc hello");
sarg.arg2i=1234;
apcandarg.pArg = &sarg;
apcandarg.apcRoutine= myapcroutine;
传递:
status = DeviceIoControl(
                            hDevice,              
                            IOCTL_SET_ApcRoutine,        
                            &apcandarg,              
                            sizeof(apcandarg),        
                            NULL,                  
                            0,                      
                            &ulReturnedLength,      
                            NULL                    
                            );

在driver里:
void MyRoutine(struct _KAPC *Apc,
               PKNORMAL_ROUTINE norm_routine,
               void *context,
               void *SysArg1,
               void *SysArg2)
{
    ExFreePool(Apc);
    return;
}
在deviceextension里定义
PKAPC apc;
ULONG addr;
PKTHREAD thread;
在处理IOCTL_SET_ApcRoutine时:
PArgStruct  sarg;
PApcRoutineAndArg pApcandarg;
....
pApcandarg=(PApcRoutineAndArg )Irp->AssociatedIrp.SystemBuffer;
pDeviceExtension->addr =pApcandarg->apcRoutine;
sarg=pApcandarg->pArg;
thread=KeGetCurrentThread();
pDeviceExtension->thread = thread;
pDeviceExtension->apc=ExAllocatePool(NonPagedPool, sizeof(struct _KAPC));
KeInitializeApc(pDeviceExtension->apc, thread, 0,
(PKKERNEL_ROUTINE)&MyRoutine, 0,
(PKNORMAL_ROUTINE)pDeviceExtension->addr, 1, sarg);
在需要调用apc的地方加入如下语句:
KeInsertQueueApc(pDeviceExtension->apc, (PVOID)NULL, (PVOID)NULL, 0);
*((unsigned char *)pDeviceExtension->thread+0x4a)=1;
这样就可以了


最新喜欢:

linwnlinwn
tase
驱动小牛
驱动小牛
  • 注册日期2002-03-10
  • 最后登录2015-01-23
  • 粉丝0
  • 关注0
  • 积分494分
  • 威望74点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-22 17:25
*((unsigned char *)pDeviceExtension->thread+0x4a)=1;


是什么意思? 为什么要用相对地址引用呢?

还有:

void MyRoutine(struct _KAPC *Apc,
PKNORMAL_ROUTINE norm_routine,
void *context,
void *SysArg1,
void *SysArg2)
{
ExFreePool(Apc);  //这里释放了内存
return;
}
 
意思是说,这个APC 只能被调用一次? 对吗? 下次调用还得再重新分配APC
--- TASE ---
tase
驱动小牛
驱动小牛
  • 注册日期2002-03-10
  • 最后登录2015-01-23
  • 粉丝0
  • 关注0
  • 积分494分
  • 威望74点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-22 17:26
才发现,楼主的帖子是6年前发的!
--- TASE ---
lee922@gmail.co
驱动牛犊
驱动牛犊
  • 注册日期2007-07-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分39分
  • 威望340点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分1分
地板#
发布于:2009-11-14 17:37
线程还要处于alertable状态
游客

返回顶部