366.7 KB - Evernote
366.7 KB - Evernote
366.7 KB - Evernote
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Introduction And Acknowledgements<br />
There are several articles on the subject of Windows APCs and in particular Inside NT's<br />
Asynchronous Procedure Call by Albert Almeida (Dr. Dobb’s Journal, Nov 01, 2002) contains a good<br />
deal of information about them. To be fair, that article has guided me throughout the writing of this<br />
one. My attempt has been to add a few more details to the concepts presented and a little insight into<br />
undocumented Windows features, like the GATEWAIT and DEFERREDREADY thread states, which<br />
are tied to how APCs work.<br />
Furthermore, Almeida’s article was published when Windows XP was current, so another goal of this<br />
work has been to revise the information presented there for Windows Vista. Unless otherwise<br />
specified, all the material contained here has been verified agains the Windows Vista SP1 Ultimate<br />
Edition code (for x86).<br />
APC Basic Concepts<br />
APCs are a Windows functionality that can divert a thread from its regular execution path and direct it<br />
to execute some other code. The most important thing about an APC is that when one is scheduled, it<br />
is targeted to a specific thread.<br />
APCs are little documented: the kernel APIs to use them are not public and their inner working is only<br />
partially covered. What makes them interesting is that they are tied with the way Windows dispatches<br />
threads, thus, by analyzing them we can better understand this core Windows feature.<br />
Windows internals books often mention the fact that an APC is scheduled by means of a software<br />
interrupt. This raises the question of how can the system guarantee that this interrupt will run in the<br />
context of a particular thread. This is, ultimately, the purpose on an APC, but software interrupts can<br />
break into the execution of whatever thread is current. We will see in this document how Windows<br />
accomplishes this.<br />
Code executed by means of an APC can run, depending on the APC type, at a dedicated IRQL level,<br />
which, not surprisingly, is called APC level.<br />
So, what are APCs used for? Among other things:<br />
• The I/O manager uses an APC to complete an I/O operation in the context of the thread which<br />
initiated it.<br />
• A special APC is used to break into the execution of a process when it must terminate.<br />
• The kernel implementation of APCs is under the hood of Windows API functions like<br />
QueueUserAPC and ReadFileEx/WriteFileEx, when used to perform asychronous I/O.<br />
APC Process Context<br />
Normally, a Windows thread executes in the context of the process which created it. However, it is<br />
possible for a thread to attach itself to another process, which means it will execute in its context.<br />
Windows accounts for this when managing APCs: they can be scheduled to run in the context of the<br />
process which owns the thread, or in the context of whichever process the thread is currently attached<br />
to.<br />
4