פתרון יצירת תהליך וזהותו¶
הילד מחזיר שבע כדי שנוכל לזהות שההורה קרא את exit status שלו, ולא רק בדק שיצירת התהליך הצליחה. ההורה יכול להחליט ששבע היא תוצאה צפויה של הניסוי ולהחזיר אפס. מדיניות המוצר היא שמגדירה איך קוד הילד מתורגם לקוד ההורה.
ה־thread handle נסגר מיד אחרי היצירה מפני שההורה אינו משתמש בו. ה־process handle נשאר חי עד אחרי ההמתנה ושאילתת הקוד. סגירת ה־thread handle אינה מסיימת את ה־thread, וסגירת process handle אינה שקולה להריגת התהליך.
ה־lpApplicationName הוא נתיב מפורש של image. שורת הפקודה נמסרת לילד ומפורשת על ידו או על ידי ה־runtime שלו. מרכאות סביב נתיב עם רווחים שומרות את שם התוכנית כיחידה אחת בפרשנות המתאימה.
כדי להוסיף משתנה לבלוק, מכניסים מחרוזת שלמה נוספת לפני ה־null הנוסף הסופי. אפשר לבנות את הבלוק באמצעות פונקציית עזר שמוסיפה כל ערך ו־null, ואז מוסיפה מסיים אחד בסוף.
std::wstring environment;
auto append = [&](const std::wstring& entry) {
environment += entry;
environment.push_back(L'\0');
};
append(L"AMITTECH_ROLE=child");
append(L"SystemRoot=" + std::wstring(system_root.data()));
append(L"TEMP=C:\\AmitTechLab\\temp");
environment.push_back(L'\0');
הקטע מחליף את בניית הבלוק בדוגמה ומניח שהתיקייה המוצהרת מתאימה לניסוי. סדר המשתנים נשמר לפי שמותיהם באופן מתאים, והנתיב אינו גורם ליצירת התיקייה מעצמו.
פרוטוקול readiness יכול להשתמש ב־event שנוצר על ידי ההורה ומועבר לילד באופן מפורש. הילד מסמן אותו רק אחרי הצלחת האתחול. ההורה ממתין גם ל־readiness וגם לסיום התהליך או timeout, כך שילד שנכשל לפני האיתות אינו משאיר המתנה בלתי מוגבלת.
מידע שנקרא מתוך PEB מסביר את התוכנית שנחקרה, אך קוד היישום אינו צריך לקבע offsets. גם קריאת שורת פקודה מתוך תהליך אחר דורשת הרשאות והקשר מתאים. אין לפרש כשל גישה כאילו ה־PEB אינו קיים.