阅读:2588回复:3
apc 的最简单实现
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; 这样就可以了 |
|
最新喜欢:![]() |
沙发#
发布于: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 |
|
|
板凳#
发布于:2007-03-22 17:26
才发现,楼主的帖子是6年前发的!
|
|
|
驱动牛犊
![]() |
地板#
发布于:2009-11-14 17:37
线程还要处于alertable状态
|