2017-04-20 5 views

Répondre

0

APC doit être attribuée uniquement de non paginée car APC peut être inséré (par KeInsertQueueAPC) dans la liste de fil à DPC niveau - donc si par exemple vous allouez KAPC de paginée, insérer, puis quelqu'un essayer d'insérer une autre APC au niveau DPC - votre paginée données APC peuvent être affectées (lorsqu'ils sont insérés à la liste liée) et comme résultat BSOD

pour ini tialize KAPC utilisez KeInitializeApc. si gratuitement APC besoin d'appeler exactement ExFreePool et rien de plus vous pouvez utiliser 0 comme RundownRoutine. sinon vous devez fournir RundownRoutine pour un nettoyage correct. KernelRoutine doit toujours être défini, et parce que presque toujours il pointe vers une fonction dans votre pilote - le pilote ne doit pas être déchargé tant que APC ne sera pas exécuté. d'habitude besoin appel ObfReferenceObject pour objet pilote avant insertion APC par KeInsertQueueAPC et ObfDereferenceObject après KernelRoutine ou RundownRoutine sera exécuté (ou KeInsertQueueAPC return false). mais vous ne pouvez pas « normalement » appel ObfDereferenceObject - cela n'a aucun sens (si la main du pilote sur la dernière référence - sera plantage lors de ObfDereferenceObject retour à votre code de pilote que vous besoin de l'assembleur procuration écrite de KernelRoutine et RundownRoutine. qui appellent elles c/C++ mise en œuvre et la sortie ne JMP (mais pas appel !!) instruction à ObfDereferenceObject et la pile doit être reconstruire spéciale pour après ObfDereferenceObject appel ret - le code sera retourné au noyau co de qui appeler votre routine de rappel du pilote (noyau ou diminution des effectifs) - donc sauter le code du pilote exécuter après ObfDereferenceObject

pour plus de détails - lire Inside NT's Asynchronous Procedure Call - malgré cela est déjà très ancien article - rien n'a changé de ce temps et dans le dernier gagner 10 - tout de même