פתרון מפת NT ומעבר לקרנל¶
המחסנית מתעדת את המסלול שנבחר בגרסה המסוימת. ייתכן שהקריאה תעבור דרך KernelBase, וייתכן שהסמלים יציגו עטיפה אחרת. הממצא היציב הוא שהקוד שלנו משתמש בחוזה SetEvent; השרשרת הפנימית היא ראיה לחקירה של אותה מערכת.
כאשר event ידני מסומן, ההמתנה יכולה להחזיר WAIT_OBJECT_0 בלי להמתין לשינוי מצב עתידי. כאשר הוא אינו מסומן וה־timeout קצר, צפויה WAIT_TIMEOUT אם איש לא מסמן אותו לפני סוף הזמן. התוצאה אינה מספרת אם ה־thread איבד CPU בזמן כלשהו מסיבה אחרת.
הקוד הבא מחליף את יצירת האירוע ואת ההמתנה לצורך הניסוי השני. משאירים את בדיקת הכשל ואת הסגירה מהתוכנית המלאה, ומסירים את SetEvent.
HANDLE event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
// Check creation before continuing.
const DWORD result = WaitForSingleObject(event, 20);
ה־timeout אינו הבטחה להתעוררות בדיוק אחרי עשרים מילישניות. הוא מתאר תנאי המתנה; תזמון ה־thread אחרי שההמתנה הסתיימה יכול להוסיף זמן.
מעבר user/kernel מתאר שינוי ברמת ההרשאה ובהקשר ביצוע המערכת. המעבר context switch מתאר מעבר בין threads שמתוזמנים על מעבד לוגי. אפשר לבצע את הראשון בלי השני, ואפשר לבצע את השני בעקבות interrupt או תזמון גם בלי שהיישום ביקש syscall באותו רגע.
מנהל האובייקטים משתתף בפרשנות handle ובחיי האובייקט, מנגנוני אבטחה בודקים זכויות לפי המסלול, מנהל הזיכרון עוסק במיפוי, ומנהל ה־I/O והדרייברים מעבירים בקשות התקן. התזמון בוחר ישות ביצוע מוכנה בהתאם למדיניות ולמצב.
הדוח הטוב אינו מצייר חץ דרך כל הרכיבים רק מפני שהם קיימים במערכת. הוא מסביר איזו אחריות נדרשה לפעולה המסוימת ואיזו ראיה תומכת בכך.