מעמקי הקלט/פלט ב-Windows (פרק 6, אחרון) — מנהלי מסנן ומיניפילטר: למה Procmon וסורקי אנטי-וירוס יכולים להתערב בקלט/פלט

· · Windows, Win32, I/O, מיניפילטר, ליבה, מנהל התקן, אבטחה, חקירת תקלות

זה הפרק האחרון בסדרה «מעמקי הקלט/פלט ב-Windows».

מאז שפרק 1 צייר בתיבה «מסנני מערכת קבצים (אנטי-וירוס, הצפנה, Procmon וכדומה)» בתרשים מחסנית ההתקנים, אלה שיושבים באמצע הופיעו שוב ושוב לאורך הסדרה: למה Procmon יכול לרשום כל פעולת קלט/פלט (פרק 1); «גישה לקבצים איטית רק בסביבה אחת» (פרק 2); נקודת ה-reparse שגורמת ל-OneDrive להתחיל הורדה ברגע שקובץ נפתח (פרק 5). הפרק הזה סוף סוף פונה חזיתית למנגנון ההתערבות עצמו — מנהלי מסנן של מערכת קבצים ומיניפילטר — וסוגר כל חוט שהסדרה השאירה תלוי.

1. השורה התחתונה קודם

  • «התערבות בקלט/פלט» היא נקודת הרחבה שמערכת ההפעלה מאשרת רשמית. מסנן מערכת קבצים יכול לראות, לשכתב, לדחות או לטפל במקום מערכת הקבצים בקשה שנעשית למערכת הקבצים (פרק 2).1
  • התקן הנוכחי הוא המיניפילטר. כדי לפתור את בעיות הגישה הישנה שהתערבה ישירות במחסנית ההתקנים (סדר בלתי ניתן לניבוי, אין דרך לפרוק), המודל החליף דור לאחד שרושם קריאות חוזרות אצל מנהל המסננים (FltMgr) שמגיע עם Windows (פרק 2).23
  • המכניקה היא קריאות חוזרות pre/post. לפני ואחרי כל פעולה, מסננים נקראים לפי סדר הרישום — כלומר סדר הגובה. העברה, השלמה, דחייה, שכתוב — «הבחירות שיש למנהל» מפרק 1 חלות ישירות (פרק 3).2
  • הגובה (altitude) קובע את הסדר. לכל קבוצה לפי ייעוד מוקצה טווח מספרי (Activity Monitor 360000–389999, Anti-Virus 320000–329999 וכו’), ולכל מופע שמחובר לכרך ניתן מספר ייחודי בתוכו (פרק 4).45
  • אפשר לראות מי גר במחשב שלכם ב-fltmc. Procmon (רק בזמן שהוא רץ), תוכנת אנטי-וירוס, מסנן הענן של OneDrive — כולם עומדים כאן בתור (פרק 5).
  • הגדרת החרגה באנטי-וירוס פירושה «דילוג על הסריקה של המוצר עצמו» — אין לה השפעה על מיניפילטרים אחרים. החרגות מוותרות על הגנה, ולכרכי פיתוח יש אפשרות בטוחה יותר: Dev Drive (סריקה אסינכרונית) (פרק 6).67
  • חקירת «למה רק הסביבה הזו איטית» מתחילה בעמודת Duration של Procmon ובהשוואת תצורות fltmc (פרק 7).

מפת הידע של המאמר

הסטנדרט הנוכחי של מסנן מערכת קבצים הוא המיני-מסנן: בניגוד למסנן מדור קודם שמניח ישירות אובייקט התקן על מחסנית ההתקנים, הוא רושם callback מסוג pre/post אצל מנהל המסננים (FltMgr) שמגיע עם Windows. סדר הקריאה נקבע באופן דטרמיניסטי לפי האלטיטוד ש-Microsoft מקצה ומנהלת, ובפקודה fltmc אפשר לצפות בתצורה בפועל. אנטי-וירוס, ‏Procmon וסנכרון הענן של OneDrive הם כולם דיירים של אותו מנגנון; הגדרת החרגה מדלגת רק על הסריקה של המוצר עצמו ונושאת פשרה של החלשת ההגנה, ולכרכי פיתוח יש חלופה בטוחה יותר — Dev Drive.

מפת הידע של מנהלי התקן מסנן ומיני-מסנניםתרשים שמראה את הקשרים בין מנהל התקן מסנן של מערכת הקבצים, חילופי הדורות ממסנן מדור קודם למיני-מסנן, מנהל המסננים (FltMgr), callback מסוג pre/post, אלטיטוד וקבוצות סדר טעינה, תצפית באמצעות fltmc, מיני-מסנן אנטי-וירוס והגדרות החרגה ו-Dev Drive, והמנגנון שבו Procmon כמיני-מסנן רושם את כל הקלט/פלטמממש אתמממש אתיורש אתמחייבעלול לגרום למונעמחייבמשתמש במשתמש במוגדר באמצעותמוגדר באמצעותנבדק באמצעותמחייבצריך לקדום לנבדק באמצעותנבדק באמצעותמשתמש במשתמש במשתמש במוגדר באמצעותמאוטמט אתמשתמש בעלול לגרום למצמצםעלול לגרום למוגדר באמצעותמצמצםמצמצםמענה מומלץ למשתמש בנבדק באמצעותמשתמש במשתמש במחייבמשתמש במיני-מסנןמנהל המסננים (FltMgr)מסנן מדור קודםמנהל התקן מסנן של מערכת הקבציםמחסנית התקניםאי-יציבות בסדר הטעינהcallback מסוג pre/postאלטיטוד (altitude)קבוצת סדר טעינהfltmcבקשת אלטיטודProcess Monitor(procmon.exe)מיני-מסנן של אנטי-וירוסמסנן קבצי ענן (cldflt)קבצים לפי דרישה של OneDriveFast I/Oעלות ביצועים עקב סריקההגדרת החרגה (החרגת תיקייה)ירידה ברמת ההגנהDev Driveמסגרת FltMgrאובייקט מנהל התקן

בתרשים, קו מלא מציין קשר שמתקיים תמיד וקו מקווקו מציין קשר מותנה (תנאי ההתקיימות מפורטים בהסבר של כל קשר בעמוד המפורט). רשימת כל הקשרים (סך הכול 35, עם אסמכתה ורמת ודאות) והגדרות המושגים המרכזיים מרוכזות בעמוד המפורט של מפת הידע (ביפנית). נתונים: JSON-LD / Turtle

2. ההיסטוריה של אלה שמתערבים — ממסננים ישנים ל-FltMgr

מנהל מסנן של מערכת קבצים הוא מנהל שיכול לחטוף בקשות שפונות למערכת הקבצים (או לכרך שמתחתיה). הוא יכול לרשום בקשות, לנטר, לשנות תוכן, ואפילו לדחות או לטפל במקום — הבסיס לתוכנות אנטי-וירוס, הצפנה, גיבוי וזיכרון היררכי.1

שיטת המימוש הישנה (מסנן ישן, legacy filter) הייתה לערם את אובייקט ההתקן שלה ישירות על מחסנית ההתקנים שראינו בפרק 1. כמנגנון זה ישר, אבל בפועל היה מלא בעיות — הסדר שבו ערמים תלוי בסדר הטעינה וקשה להבטיח, ואחרי שערמים אי אפשר לצאת בבטחה (אי אפשר לפרוק), וזה הפך לחממה לבאגים של תאימות בין מסננים.

לכן Windows הציג את מנהל המסננים (FltMgr). FltMgr עצמו עומד במחסנית כמסנן שמגיע עם מערכת ההפעלה, וכל פונקציית מסנן נרשמת כמיניפילטר אצל FltMgr בקריאות חוזרות.2

שיטת מיניפילטר(התקן הנוכחי)רישום קריאות חוזרותרישום קריאות חוזרותמנהל המסננים(FltMgr)מצורף ל-OS. רק הוא עומד במחסניתמיניפילטר A(גובה גבוה)מיניפילטר B(גובה נמוך)מערכת קבציםהסדר דטרמיניסטי לפי גובהטעינה בכל עת אפשרית(מסננים תומכים ניתנים גם לפריקה)שיטה ישנהמסנן ישן Aמסנן ישן Bמערכת קבציםהסדר תלוי בסדר הטעינהפריקה בטוחה אינה אפשרית

איור 1: החלפת דור. לא «לערם» במחסנית, אלא «לרשום» אצל FltMgr

היתרונות של שיטת המיניפילטר מנויים רשמית — אפשר לטעון בכל עת, לשלוט בסדר, ומסנן שמממש קריאת חוזרת לפריקה יכול גם לפרוק בזמן ריצה (מסנן שלא מממש או שמסרב אי אפשר להסיר).3 לצורך דו-קיום עם מסננים ישנים FltMgr יכול לעמוד בכמה מקומות במחסנית ככמה «מסגרות» (frames), ולמיניפילטר מובטח שיחזור לאותו מיקום (אותו גובה) גם בטעינה מחדש אחרי פריקה.2 אנטי-וירוס, ניטור וסנכרון מודרניים הם כמעט כולם המיניפילטר הזה.

3. תנועת המיניפילטר — קריאות חוזרות pre/post

מיניפילטר מכריז ל-FltMgr «באילו פעולות הוא מעוניין». למשל, מעוניין רק ב-IRP_MJ_CREATE (פתיחה) וב-IRP_MJ_WRITE (כתיבה). אז, בכל פעם שהפעולה הזו זורמת, נקראות לפני הפעולה (קריאת חוזרת pre) ואחרי הפעולה (קריאת חוזרת post).

NTFSמיניפילטר B(גובה נמוך)מיניפילטר A(גובה גבוה)FltMgrמנהל הקלט/פלטNTFSמיניפילטר B(גובה נמוך)מיניפילטר A(גובה גבוה)FltMgrמנהל הקלט/פלטבקשה(IRP_MJ_CREATE וכו'. עולם פרק 1)קריאת חוזרת preקריאת חוזרת preלמערכת הקבציםתוצאת העיבודקריאת חוזרת postקריאת חוזרת postהשלמה(לזרימת ההשלמה של פרק 1)

איור 2: קריאות חוזרות pre/post. בדרך הלוך לפי גובה גבוה קודם, בחזרה בסדר הפוך

מה אפשר לעשות בכל קריאת חוזרת. אותו מבנה של «שלוש הבחירות של מנהל» מפרק 1 סעיף 4.3 מסופק ב-API בטוח יותר.

נקראה קריאת חוזרת preמה לעשות עם הפעולה הזולהעביר כמו שהיא(ואם אין צורך ב-post, גם מכריזים על זה)לדחותמחזירים מיד דחיית גישה וכו'דוגמה: זיהוי וירוס, איסור כתיבהלהשלים בעצמםדוגמה: מסנן ענןמשיג את הישות ומגיש אותהנוגעים בפרמטרים או בתוכן ומעביריםדוגמה: מסנן הצפנה

איור 3: הבחירות בקריאת חוזרת pre. «לראות, לעצור, לקחת על עצמם, לשכתב» — הכול אפשרי רשמית

וכאן נסגר שיעורי הבית מפרק 4 — מיניפילטר יכול להיות נוכח גם ב-Fast I/O (קיצור שלא יוצר IRP). FltMgr מעביר את מנגנון הקריאות החוזרות גם בנתיב Fast I/O, כך שאין «לא רואים אם עוברים בקיצור» כמו בעידן הישן. הסיבה ששורות FASTIO_ עומדות גם ביומן Procmon היא בזכות המיקום הזה.

4. גובה — «הגובה מעל פני הים» קובע את הסדר

כשכמה מסננים מעוניינים באותה פעולה, מי רואה קודם היא שאלה חמורה. אם אנטי-וירוס לא רואה לפני הצפנה, הוא נאלץ לסרוק טקסט מוצפן, וכלי ניטור חייב להיות מעל כולם כדי לצפות בכול.

מה שקובע את הסדר הזה הוא גובה (altitude). לכל סוג מסנן מוגדרות קבוצת סדר טעינה וטווח מספרים. בדיוק, היחידה שמקבלת גובה אינה המנהל כולו אלא «המופע» של המיניפילטר שמחובר לכרך. המספר ייחודי, וככל שהוא גדול יותר כך המיקום גבוה יותר במחסנית (קרוב יותר ליישום).4 מנהל אחד יכול להחזיק כמה הגדרות מופע ולהופיע בגבהים שונים, ולכן רשימת fltmc instances היא לפי מופע.

קרוב ליישום(מספר גדול)FSFilter Activity Monitor: 360000〜389999תצפית ורישום קלט/פלט(Procmon כאן)FSFilter Undelete: 340000〜349999שחזור קבצים שנמחקוFSFilter Anti-Virus: 320000〜329999זיהוי וסילוק וירוסיםFSFilter Replication: 300000〜309999שכפול למרוחקFSFilter Continuous Backup: 280000〜289999גיבוי מתמשךעוד למטה: Content Screener /Quota Management / System Recovery /טווחי הצפנה, דחיסה וכו' ממשיכיםקרוב למערכת הקבצים(מספר קטן)

איור 4: טווחי גובה (קטע). לכל ייעוד נקבע «הגובה שבו צריך לעמוד»

החשוב הוא שהמספר הזה מוקצה ומנוהל בידי Microsoft.5 ספקים אינם מכריזים על עצמם אלא מגישים בקשה ומקבלים — לכן בכל מחשב נשמר הסדר «ניטור מעל אנטי-וירוס, אנטי-וירוס מעל הצפנה». זה היה המענה ל«הגרלת סדר טעינה» של עידן ה-legacy.

לאן מגישים בקשה כשבונים מיניפילטר בחברה. למפתחים, רק הצעד הבא. גובה מגישים לפי הנוהל ב-Request a Filter Altitude Identifier, שולחים דוא״ל באנגלית ל-fsfcomm@microsoft.com עם נושא «Filter altitude request». צריך למלא הכול: שם חברה, פרטי קשר (כינוי חברה לטווח ארוך, לא אישי), שם מוצר, URL מוצר, תיאור המסנן, שם קובץ המנהל, סוג מסנן, סוג התחלה, קבוצת סדר הטעינה הרצויה והגובה הרצוי. מצוין גם שיש לצפות ל-30 ימי עבודה לעיבוד, שאין חלון טיפול דחוף, ושהמספר שיוקצה עשוי להיות שונה מהמבוקש.8 בנוסף, חברה שכבר יש לה גובה שלם באותה קבוצת סדר טעינה רשאית לקבוע בעצמה ערך עם שבר אחרי המספר הזה (למשל 325000.3), ואז די בדיווח בדוא״ל אחרי מעשה.8

5. היכרות עם הדיירים — המחשב שלכם דרך fltmc

די בתיאוריה. נראה את הדבר עצמו. בשורת פקודה עם הרשאות מנהל:

:: List of registered minifilters (with altitudes)
fltmc

:: Which filter is attached to which volume
fltmc instances

:: From the volume side
fltmc volumes

fltmc בלי ארגומנטים מוציא את אותה רשימה כמו fltmc filters. הפלט הוא 4 עמודות, וגם בתיעוד של Microsoft יש דוגמה באותה צורה.9

C:\Windows\system32>fltmc

Filter Name                     Num Instances    Altitude    Frame
------------------------------  -------------  ------------  -----
bindflt                                 1        409800         0
cldflt                                  1        409500         0
WdFilter                                4        328010         0
luafv                                   1        135000         0
FileInfo                                4         45000         0

למעלה זה קטע להסבר. הרכב הפנים ומספר המופעים משתנים לפי סביבה, אבל ערכי הגובה הם ערכים קבועים ש-Microsoft הקצתה, ולכן אפשר להצליב מול הרשימה הציבורית שנגענו בה בפרק 4.

משמעות העמודות היא כך.

עמודה משמעות
Filter Name שם המסנן (המנהל)
Num Instances לכמה כרכים הוא מחובר (מספר המופעים מפרק 4)
Altitude הגובה. גדול יותר = קרוב יותר ליישום
Frame מספר המסגרת של FltMgr. אם כאן <Legacy>, זה סימן שמסנן ישן שאינו משתמש ב-FltMgr עדיין חי.9

גם בחמש השורות האלה אפשר לקרוא ש-bindflt ו-cldflt נמצאים בטווח העליון FSFilter Top (400000–409999), WdFilter בטווח Anti-Virus (320000–329999), ו-FileInfo בטווח התחתון FSFilter Bottom (40000–49999). המבנה שראינו בפרק 4, «לכל ייעוד נקבע הגובה שבו צריך לעמוד», מאושר כאן במספרים. ואם מריצים fltmc שוב אחרי שהפעלתם Procmon, נוספת שורה שמתחילה ב-PROCMON בטווח Activity Monitor (360000–389999).

הרכב הפנים משתנה לפי סביבה, אבל הדיירים הטיפוסיים הם אורחי הקבע של הסדרה הזו.

  • WdFilter — המיניפילטר של Microsoft Defender. בטווח Anti-Virus. במחשבים רבים זה מחסום שכל קלט/פלט קבצים חייב לעבור.
  • cldflt — מסנן קובצי ענן. יחידת הביצוע של קבצים לפי דרישה ב-OneDrive, ומכין את הישות כשנפתחת נקודת reparse (מציין מיקום) שראינו בפרק 5.10
  • PROCMON24 (וכו’) — מיניפילטר זמני בטווח Activity Monitor שמופיע רק בזמן ש-Process Monitor רץ. זה סוד הקסם של למה Procmon רואה את כל הקלט/פלט.11 נסו להריץ fltmc לפני ואחרי ההפעלה ולהשוות.
  • מלבד אלה, תוכנות גיבוי, מוצרי הצפנה (מניעת דליפת מידע), EDR, אחסון וירטואלי — ככל שהמחשב עסקי יותר, כך הדיירים מתרבים.

כשמביטים מבחוץ על כלי Procmon שהשתמשנו בו מפרק 1, בפרק האחרון, מתקבל מעגל נקי: «גם הצופה היה דייר באותו מנגנון של מושא התצפית».

6. איפה אנטי-וירוס מבזבז זמן

ההשפעה המעשית הגדולה ביותר של מסננים היא עלות סריקת האנטי-וירוס. נצייר איפה הזמן נוצר (הפרטים משתנים לפי מוצר. להלן הצורה הטיפוסית).

NTFSמיניפילטר AVיישוםNTFSמיניפילטר AVיישוםpre-create: שיפוט מוקדם של נתיב ומדיניותאם הקובץ טרם נסרקסורקים כאן את התוכןואם יש בעיה מבטלים את הפתיחה── הסיבה העיקרית שפתיחה מתעכבתקבצים ששונוהופכים ליעד לסריקה מחדש בסגירה וכו'בקבצים קטנים רבים(תוצרי ביניים של בנייה וכו')ההלוך-ושוב הזה מצטבר לפי מספר הקבציםפותח קובץמעביר(ביצוע הפתיחה)הפתיחה הצליחה(post-create)אם אין בעיה, מוחזר handleכתיבה / סגירה

איור 5: נקודות יצירת עלות הסריקה. לקובץ אחד זה זניח, אבל בעשרות אלפי קבצים זה הופך לשולט

מתוך זה אפשר להבין בדיוק שני נושאים מעשיים.

המשמעות הטכנית של הגדרת החרגה. בקלט/פלט בנתיב שתואם לרשימת ההחרגה, עיבוד הסריקה של המסנן מדולג. המסנן אינו נעלם מהמחסנית; המציאות היא שההחלטה «לא לבדוק» מתקבלת מוקדם יותר. ויש עוד מגבלה חשובה — ההחרגה חלה רק על המסנן של המוצר שמחזיק את ההגדרה. הגדרת החרגה של Microsoft Defender משנה את הסריקה של WdFilter, ואין לה שום השפעה על התנהגות מיניפילטרים אחרים שגרים יחד (אנטי-וירוס של חברה אחרת, EDR, גיבוי, הצפנה וכו’). כש«הוספתי החרגה ועדיין איטי», חשדו שאולי דייר אחר מבזבז זמן (השוואת fltmc בפרק 7). האפקט גדול, אבל החרגה מחלישה בוודאות את ההגנה במקום הזה. גם התיעוד של Microsoft מזהיר שוב ושוב שהחרגה מפחיתה הגנה ולכן צריך מינימום אחרי הערכת סיכון.6 הטיפול המעשי בזיהוי שגוי ובהשפעת ביצועים טופל ב«כשיישום Windows שפיתחתם מטופל כוירוס».

המענה החדש שנקרא Dev Drive. כרך ייעודי שתוכנן לעומסי פיתוח (קבצים קטנים רבים), שבו Microsoft Defender פועל במצב ביצועים (סריקה אסינכרונית). הוא ממוקם כחלופה בטוחה יותר להחרגת תיקייה, וכברירת מחדל מסננים נוספים אינם מתחברים, מצד שני מצוינת גם אזהרה חזקה מול תפעול שמסיר את כל המסננים.7 זה הפתרון המומלץ הנוכחי של Microsoft ל«רוצים להאיץ בנייה אבל החרגה מפחידה».

7. נוהל החקירה ל«רק הסביבה הזו איטית»

את הכלים שהצטברו בסדרה נסגור לבסוף לנוהל אחד.

כןכןלאלא(מזדמן)תסמין: אותו יישום אבל רק בסביבה מסוימתגישה לקבצים איטיתמסתכלים בעמודת Duration ב-Procmonלאיזו פעולה(IRP_MJ_CREATE? WRITE?)הזמן נעלםפעולה מסוימת איטית באופן אחיד?משווים fltmc instances לסביבה המהירהרואים את הפרש תצורת המסנניםהמסנן בהפרש הוא הסיבה?הגדרת החרגה(עם הערכת סיכון)אובחינת Dev Drive / התייעצות עם הספקחושדים במשהו שאינו מסנן:מטמון(פרק 4)· פיצול או MFT(פרק 5)·יעד רשת(UNC)· ההתקן עצמו

איור 6: הפרדת איטיות שמקורה במסנן. המפתח הוא «זמן לפי פעולה» ו«הפרש תצורת מסננים בין סביבות»

שתי נקודות. ראשית, ל-Procmon יש זמן לכל פעולה (Duration). אם אפשר לפרק «איטי» ל«איזו פעולה איטית», חיפוש האשם בחצי הדרך. שנית, הפרש סביבות הוא לעיתים קרובות הפרש תצורת מסננים. מכונת פיתוח מול מכונת ייצור, מחשב החברה מול מחשב הלקוח — רק לשים את פלט fltmc זה לצד זה כבר מראה מועמדים לחשד.

שלושת הצעדים הראשונים אם מעולם לא נגעתם ב-Procmon. עמודת Duration אינה מוצגת כברירת מחדל, אז נכתוב רק את הפעולה כדי לא להיתקע כאן.

  1. מפעילים Procmon.exe כמנהל.
  2. פותחים Options menu > Select Columns…, ומסמנים Duration ברשימת העמודות.
  3. ב-Filter menu > Filter… (Ctrl+L) מזינים Process Name / is / שם ה-exe היעד / Include, ולוחצים Add ואז OK (בלי Add התנאי אינו נכנס).

אחרי זה לחיצה על עמודת Duration למיון מרכזת למעלה את הפעולות שאוכלות זמן. לסיכום לפי תהליך או לפי קובץ אפשר גם Tools menu > File Summary. התפעול הכללי של ProcMon מסודר ב«מדריך מעשי ל-Process Monitor (ProcMon)».

8. סיום הסדרה — מפת ששת הפרקים

בזה פתחנו את כל התיבות במפה שציירנו בפרק 1. נשים את הכול בדף אחד.

ההשלמה חוזרת לכאןקלט/פלט עם מטמון בתיאום(מערכת הקבצים קוראת לפונקציית המטמון)הפרעה→השלמה(פרק 1)יישוםReadFile / WriteFile / async-awaitפרק 2: קלט/פלט סינכרוני ואסינכרונימצב ה-handle ו-OVERLAPPEDפרק 3: IOCP ומאגר התהליכונים של .NETקבלת ההשלמה והרצת ההמשךפרק 1: מנהל הקלט/פלט ו-IRPפתרון שמות · שלושה אובייקטים · מחסנית התקניםפרק 6: מסננים ומיניפילטרFltMgr · גובה · pre/postפרק 4: מנהל המטמוןתצוגת 256KB · lazy writer · Fast I/O(עובד בתיאום עם NTFS)פרק 5: NTFSMFT · זרמים · קישורים · שני יומניםמחסנית האחסון וההתקן

איור 7: מפת הסדרה כולה. מנהל המטמון אינו «שכבה שעוברים בה» אלא שותף שמתואם עם מערכת הקבצים, ובפספוס מטמון יוצאת בקשה מ-NTFS לאחסון

9. סיכום — לסיום הסדרה

סיכום הפרק האחרון.

  • התערבות בקלט/פלט היא נקודת הרחבה שמערכת ההפעלה מאשרת, והתקן הנוכחי הוא רישום קריאות חוזרות אצל FltMgr (מיניפילטר). הסדר נקבע באופן דטרמיניסטי לפי גובה, ו-Microsoft מקצה ומנהלת את המספרים.245
  • התנועה היא קריאות חוזרות pre/post. אפשר להעביר, לדחות, לקחת על עצמם, לשכתב, ולהיות נוכחים גם ב-Fast I/O. Procmon, Defender ו-OneDrive כולם דיירים באותו מנגנון.11110
  • הגדרת החרגה = דילוג על סריקה, וזה פשרה מול הגנה. לכרכי פיתוח יש אפשרות בטוחה יותר: Dev Drive (סריקה אסינכרונית).67
  • «רק הסביבה הזו איטית» מפרידים מDuration של Procmon ומהפרש תצורת fltmc — כלי הסדרה הופכים כמו שהם לנוהל חקירה.

ואת מסקנת הסדרה כולה בשורה אחת אפשר לומר כך — הקלט/פלט ב-Windows הוא תכנון עקבי שבו קובעים יעד במרחב השמות, הופכים בקשה לחבילה (IRP) ומזרימים אותה בין שכבות, וכל שכבה יכולה לבחור «לראות, לקבל, לקחת על עצמה». מתחת לשורת File.ReadAllText אחת, מבנה ששת הפרקים האלה רץ בכל פעם. במקום לשנן התנהגות API, לגזור מתוך המפה הזו «כך זה אמור להיות» — זה הכוח שרצינו שתקבלו בסדרה. תודה שהתלוויתם למסע הארוך.

מאמרים קשורים

תחומי ייעוץ קשורים

KomuraSoft LLC מטפלת בחקירת בעיות ביצועים ותקלות ביישומים עסקיים ל-Windows שקשורים למנהלי מסנן, כמו «איטי רק בסביבה מסוימת» או «תוכנת אבטחה מתנגשת ביישום שלנו».

מקורות

  1. Microsoft Learn, About file system filter drivers. על כך שמנהל מסנן של מערכת קבצים הוא מנהל אופציונלי שיכול לחטוף (intercept) בקשות שפונות למערכת קבצים או למנהל מסנן אחר; על כך שבחטיפת בקשה אפשר להרחיב או להחליף פונקציה לפני שהיא מגיעה ליעד המקורי, ולרשום, לנטר, לשנות נתונים ולמנוע פעולה; ועל כך שכלי עזר לאנטי-וירוס, תוכניות הצפנה ומערכות ניהול זיכרון היררכי הם דוגמאות למנהלי מסנן.  2 3

  2. Microsoft Learn, Filter Manager Concepts. על כך שמנהל המסננים (FltMgr) הוא מנהל במצב ליבה שמצורף ל-Windows ומפרסם פונקציות שמפשטות פיתוח מנהלי מיניפילטר; על כך שמיניפילטר יכול לרשום עיבוד לפני ואחרי פעולות קלט/פלט (קריאות חוזרות pre/post); על כך שלצורך דו-קיום עם מסננים ישנים FltMgr יכול להתחבר לכמה מקומות במחסנית הקלט/פלט כמסגרת; ועל כך שמיניפילטר חוזר לאותו גובה באותה מסגרת גם אחרי פריקה וטעינה מחדש.  2 3 4 5

  3. Microsoft Learn, Advantages of the Filter Manager Model. על כך שכיתרונות של מודל המיניפילטר מול מודל המסנן הישן מנויים שליטה טובה יותר בסדר טעינת המסננים; על כך שבניגוד למסנן ישן מיניפילטר ניתן לטעינה בכל נקודת זמן; על כך שפריקה אפשרית; ועל חיבור לכרך DAX וכו’.  2

  4. Microsoft Learn, Load order groups and altitudes for minifilter drivers. על כך שלמסנני מערכת קבצים מוגדרות קבוצות סדר טעינה לפי ייעוד, ולכל קבוצה מוקצה טווח גבהים; על כך שלכל מנהל מסנן יש מזהה גובה ייחודי שקובע את מיקומו היחסי מול מסננים אחרים במחסנית הקלט/פלט; ועל כך שדוגמאות לקבוצות כוללות FSFilter Activity Monitor (360000–389999, תצפית ודיווח על קלט/פלט), FSFilter Undelete (340000–349999), FSFilter Anti-Virus (320000–329999, זיהוי וסילוק וירוסים במהלך קלט/פלט קבצים), FSFilter Replication (300000–309999), FSFilter Continuous Backup (280000–289999) וכו’.  2 3

  5. Microsoft Learn, Allocated altitudes. על כך שגבהי מיניפילטר מוקצים ומנוהלים בידי Microsoft, ונשמרת רשימה ציבורית של גבהים שהוקצו; ועל כך שברשימה הזו WdFilter.sys מופיע כ-328010 בקבוצת FSFilter Anti-Virus, ו-cldflt.sys כ-409500 בקבוצת FSFilter Top.  2 3

  6. Microsoft Learn, Configure and validate exclusions for Microsoft Defender Antivirus. על כך שבהגדרת החרגה של Microsoft Defender קבצים, תיקיות ותהליכים מוחרגים יוצאים מיעד הסריקה; ועל כך שמזהירים שוב ושוב שהחרגה מורידה את רמת ההגנה ולכן יש להגדיר בזהירות אחרי הערכת הצורך.  2 3

  7. Microsoft Learn, Set up a Dev Drive on Windows 11. על כך ש-Dev Drive הוא כרך שתוכנן לעומסי פיתוח, וש-Microsoft Defender פועל במצב ביצועים (סריקה אסינכרונית); על כך שהוא ממוקם כחלופה בטוחה להחרגות תיקייה (secure alternative to folder exclusions) תוך התחשבות במהירות ובביצועים; על כך שמסננים נוספים אינם מתחברים כברירת מחדל ל-Dev Drive; ועל כך שמזהירים שתפעול בלי מסנן אנטי-וירוס הוא סיכון אבטחה חמור.  2 3

  8. Microsoft Learn, Request a Filter Altitude Identifier. על כך שבקשה לגובה מסנן חדש נעשית בשליחת דוא״ל טקסט ASCII עם נושא «Filter altitude request» אל fsfcomm@microsoft.com; על כך שצריך למלא את כל הפריטים: שם חברה, דוא״ל קשר (כינוי חברה לטווח ארוך, לא אישי), שם מוצר, URL מוצר, תיאור המסנן, שם קובץ המסנן, סוג מסנן, סוג התחלה, קבוצת סדר הטעינה הרצויה והגובה הרצוי; על כך שיש לצפות ל-30 ימי עבודה לעיבוד ואין חלון בקשה מחוץ לנוהל הזה; על כך ש-Microsoft עשויה להקצות גובה שונה מהמבוקש; ועל כך שמי שכבר יש לו גובה שלם יכול ליצור גובה משלו עם שבר באותה קבוצת סדר טעינה ולדווח אחרי מעשה.  2

  9. Microsoft Learn, Blocking legacy file system filter drivers. על כך שבהרצת fltmc filters משורת פקודה עם הרשאות מנהל מוצגת רשימת מסננים ב-4 עמודות «Filter Name / Num Instances / Altitude / Frame»; ועל כך שאלה שעמודת Frame שלהם היא <Legacy> הם מנהלי מסנן ישנים של מערכת קבצים שאינם עוברים דרך FltMgr, ובמיניפילטר נכנס מספר (0 וכו’) ב-Frame.  2

  10. Microsoft Learn, Cloud Files API. על כך ש-Cloud Files API (מסנן ענן) הוא הבסיס למנועי סנכרון (קבצים לפי דרישה ב-OneDrive וכו’) שמציגים קבצים בענן כמצייני מיקום מקומית ומשיגים את הישות בגישה.  2

  11. Microsoft Learn, Process Monitor - Sysinternals. על כך ש-Process Monitor הוא כלי ניטור מתקדם שמציג בזמן אמת פעילות של מערכת קבצים, רישום ותהליך/תהליכון (כפי שבגוף המאמר, בזמן פעולה הוא נצפה ברשימת fltmc כמיניפילטר).  2

מאמרים עדכניים עם אותן תגיות, להעמקה בנושאים קרובים.

העמודים האלה ממקמים את הנושא בהקשר רחב יותר של שירותים והחלטות.

המאמר קשור ישירות לשירותים הבאים.

שאלות נפוצות

שאלות נפוצות בפניות בנושא המאמר.

מה ההבדל בין מנהל מסנן של מערכת קבצים למיניפילטר?
שניהם «מנהלים שמתערבים בבקשות קלט/פלט למערכת הקבצים», אבל הם נבדלים בדור שיטת ההתערבות. גישת המסנן הישן (legacy) ערמה את אובייקט ההתקן שלה ישירות על מחסנית ההתקנים של מערכת הקבצים, כך שהמיקום נקבע לפי סדר הטעינה והיה קשה להבטיח, והיו בעיות כמו חוסר יכולת לפרוק בבטחה אחרי טעינה. התקן הנוכחי, המיניפילטר, רושם קריאות חוזרות אצל מנהל המסננים (FltMgr) שמגיע עם Windows, במובן «תקרא לי לפני ואחרי הפעולה הזו». המיקום נקבע באופן דטרמיניסטי במספר שנקרא גובה (altitude), אפשר לטעון בכל עת, ומסנן שמממש קריאת חוזרת לפריקה יכול אפילו להיות מוסר בזמן ריצה. כמעט כל המסננים המודרניים — אנטי-וירוס, הצפנה, כלי ניטור, סנכרון ענן — ממומשים כמיניפילטר.
למה תוכנת אנטי-וירוס יכולה לבדוק כל גישה לקובץ?
כי מערכת ההפעלה מספקת רשמית נקודת הרחבה בדיוק למטרה הזו. מיניפילטר יכול לרשום אצל מנהל המסננים קוד שייקרא לפני (קריאת חוזרת pre) ואחרי (קריאת חוזרת post) פעולות כמו פתיחה, קריאה או כתיבה של קובץ. מסנן אנטי-וירוס יושב בטווח הגובה השמור לאנטי-וירוס (320000–329999), ויכול למשל לסרוק את התוכן מיד אחרי שפתיחת קובץ מצליחה (post-create), ואם יש בעיה, לבטל את הפתיחה כדי שהגישה תיכשל. כפי שראינו בפרק 1 של הסדרה, כל פעולת קלט/פלט לקובץ זורמת במחסנית ההתקנים, כך שההיגיון הוא שעמידה במיקום קבוע לאורך הנתיב מאפשרת לבדוק כל גישה. זה אינו פריצה — זה מנגנון בנוי בתכנון מערכת ההפעלה.
מה הגדרת החרגה באנטי-וירוס (החרגת תיקייה) עושה בפועל, טכנית?
לקלט/פלט בנתיב שתואם לרשימת ההחרגה, היא גורמת למסנן של המוצר הזה לדלג על הסריקה שהיה מבצע אחרת. המסנן עצמו אינו נעלם מהמחסנית; ההבנה הקרובה יותר לאמת היא שההחלטה «אל תבדוק את הנתיב הזה» מתקבלת מוקדם יותר. מגבלה חשובה היא שהחרגה עובדת רק למוצר שמחזיק את ההגדרה הזו. למשל, הגדרת החרגה של Microsoft Defender משנה את הסריקה שעושה המסנן של Defender (WdFilter), ואין לה השפעה על התנהגות מיניפילטרים אחרים שיושבים לצידה — מוצר אנטי-וירוס מתחרה, EDR, תוכנת גיבוי וכו'. לכל מוצר נדרשת הגדרת החרגה משלו, וכש«עדיין איטי גם אחרי שהוספתי החרגה», מסנן אחר יכול להיות הסיבה. וכפי שהתיעוד של Microsoft מזהיר שוב ושוב, החרגה מחלישה את ההגנה במקום הזה, ולכן צריך לשמור אותה למינימום יחד עם הערכת סיכון. לשימוש בפיתוח, שווה גם לשקול Dev Drive (מצב ביצועים, כלומר סריקה אסינכרונית), שתוכנן כחלופה בטוחה להחרגות תיקייה.
איך Process Monitor רושם כל פעולת קלט/פלט בלי להחמיץ?
כי Procmon עצמו רושם את עצמו אצל מנהל המסננים בהפעלה, כמיניפילטר בטווח הגובה של Activity Monitor. אם מריצים fltmc משורת פקודה מוגבהת בזמן ש-Procmon רץ, אפשר לאשר שמסנן ששמו מתחיל ב-PROCMON מופיע ברשימה. מכיוון שהוא נוכח בשלבי pre ו-post של פעולות קלט/פלט בכל כרך כמיניפילטר, הוא יכול לרשום בלי השמטה איזה תהליך ביצע איזו פעולה על איזה קובץ. הסיבה שמונחי IRP ו-Fast I/O שעקבנו אחריהם לאורך הסדרה מופיעים ישירות בתצוגת Procmon היא בדיוק כי הוא צופה ממיקום שעומד על הנתיב שהקלט/פלט עצמו עובר.
כשבניות במכונת פיתוח איטיות, כדאי לחשוד במנהלי מסנן?
שווה מאוד לחשוד. בנייה היא גוש של יצירה, קריאה, כתיבה ומחיקה של מספר עצום של קבצים קטנים, וכל אחד מהם הופך ליעד לבדיקה של המסננים (במיוחד סריקת אנטי-וירוס), וזה הופך אותה לעומס העבודה שבו עלות המסנן הכי סבירה לעלות לפני השטח. נוהל החקירה הבסיסי הוא לבדוק את עמודת Duration ב-Procmon כדי לראות לאיזו פעולה הזמן הולך, ולהשוות את ההבדל בתצורת המסננים בין סביבות ב-fltmc instances. כאמצעי נגד, לצד הגדרת החרגה שאומצה אחרי הערכת סיכון, יש גם שימוש ב-Dev Drive, שתוכנן במיוחד לכרכי פיתוח. ב-Dev Drive האנטי-וירוס רץ במצב ביצועים (סריקה אסינכרונית), ו-Microsoft ממקמת את זה כחלופה בטוחה יותר להגדרת החרגה.

פרופיל הכותב

עמוד היכרות עם כותב המאמר.

Go Komura

מנהל KomuraSoft LLC

מתמחה בפיתוח תוכנה עבור Windows, ייעוץ טכני וחקירת תקלות, בעיקר בפרויקטים עם מערכות קיימות ובאגים שקשה לשחזר.

קישורים ציבוריים

חזרה לבלוג