เชิงลึกของ Windows I/O (ตอนที่ 6・ตอนสุดท้าย) — ไดรเวอร์ฟิลเตอร์กับมินิฟิลเตอร์: เหตุที่ Procmon และการสแกนไวรัสแทรก I/O ได้
· Go Komura · Windows, Win32, I/O, มินิฟิลเตอร์, เคอร์เนล, ไดรเวอร์อุปกรณ์, ความปลอดภัย, การสอบสวนบั๊ก
ซีรีส์ «เชิงลึกของ Windows I/O» ตอนสุดท้าย
ตั้งแต่ตอนที่ 1 วาดกล่อง «ฟิลเตอร์ระบบไฟล์ (ป้องกันไวรัส・การเข้ารหัส・Procmon ฯลฯ)» บนแผนภาพสแตกอุปกรณ์ ซีรีส์นี้มี ผู้ที่แทรกกลาง โผล่ซ้ำหลายครั้ง เหตุที่ Procmon บันทึก I/O ทั้งหมดได้ (ตอนที่ 1) «การเข้าถึงไฟล์ช้าแค่สภาพแวดล้อมนั้น» (ตอนที่ 2) จุดรีพาร์สที่ OneDrive เริ่มดาวน์โหลดวินาทีที่ถูกเปิด (ตอนที่ 5) คราวนี้จะเผชิญกลไกการแทรกนั้นเอง ── ไดรเวอร์ฟิลเตอร์ระบบไฟล์กับมินิฟิลเตอร์ ── ตรง ๆ และเก็บเส้นเรื่องที่ปูไว้ของซีรีส์ทั้งหมด
1. สรุปก่อนเลย
- «การแทรก I/O» คือจุดขยายที่ OS รับรองอย่างเป็นทางการ ฟิลเตอร์ระบบไฟล์ ดู แก้ ปฏิเสธ และประมวลผลแทนระบบไฟล์ คำขอไประบบไฟล์ได้ (หมวด 2)1
- มาตรฐานปัจจุบันคือมินิฟิลเตอร์ เพื่อแก้ปัญหาของวิธีรุ่นเก่าที่แทรกสแตกอุปกรณ์โดยตรง (ลำดับไม่แน่นอน・ถอดออกไม่ได้) จึงผลัดรุ่นไปวิธีลงทะเบียนคอลแบ็กกับ Filter Manager (FltMgr) ที่มากับ Windows (หมวด 2)23
- การเคลื่อนคือคอลแบ็ก pre/post ก่อนและหลังแต่ละการดำเนินการ ถูกเรียกตามลำดับลงทะเบียน = ลำดับอัลติจูด ปล่อยผ่าน จบ ปฏิเสธ แก้ ── «ทางเลือกของไดรเวอร์» ที่เห็นในตอนที่ 1 ใช้ได้ตรง (หมวด 3)2
- อัลติจูด (ความสูง) กำหนดลำดับ แต่ละกลุ่มตามวัตถุประสงค์ถูกกำหนดแถบหมายเลข (Activity Monitor 360000〜389999, Anti-Virus 320000〜329999 ฯลฯ) และแต่ละอินสแตนซ์ที่ติดวอลุ่มได้หมายเลขไม่ซ้ำ (หมวด 4)45
- ผู้อยู่บนพีซีของคุณดูด้วย
fltmcได้ Procmon (เฉพาะตอนทำงาน) ป้องกันไวรัส ฟิลเตอร์คลาวด์ของ OneDrive ── ทุกคนเรียงที่นี่ (หมวด 5) - การตั้งค่ายกเว้นของป้องกันไวรัสคือ «การข้ามสแกนของผลิตภัณฑ์นั้นเอง» และไม่กระทบมินิฟิลเตอร์อื่น การยกเว้นเป็นการแลกที่ทำให้การป้องกันอ่อน และสำหรับวอลุ่มพัฒนามีทางเลือกที่ปลอดภัยกว่าคือ Dev Drive (สแกนอะซิงโครนัส) (หมวด 6)67
- การสอบสวน «ช้าแค่สภาพแวดล้อมนั้น» เริ่มจากคอลัมน์ Duration ของ Procmon และการเทียบโครง
fltmc(หมวด 7)
แผนที่ความรู้ของบทความนี้
มาตรฐานปัจจุบันของฟิลเตอร์ระบบไฟล์คือมินิฟิลเตอร์ ซึ่งต่างจากฟิลเตอร์รุ่นเก่าที่ซ้อนอ็อบเจ็กต์อุปกรณ์ลงสแตกอุปกรณ์โดยตรง เป็นวิธีลงทะเบียนคอลแบ็ก pre/post กับ Filter Manager (FltMgr) ที่มากับ Windows ลำดับที่ถูกเรียกถูกกำหนดเด็ดขาดด้วยอัลติจูดที่ Microsoft จัดสรรและจัดการ และโครงจริงสังเกตได้ด้วยคำสั่ง fltmc ป้องกันไวรัส, Procmon และการซิงค์คลาวด์ของ OneDrive ล้วนเป็นผู้อยู่ในกลไกเดียวกัน การตั้งค่ายกเว้นแค่ข้ามการสแกนของผลิตภัณฑ์นั้นเองและเป็นการแลกที่ทำให้การป้องกันอ่อนลง ส่วนวอลุ่มพัฒนามีทางเลือกที่ปลอดภัยกว่าคือ Dev Drive
flowchart LR
accTitle: แผนที่ความรู้ไดรเวอร์ฟิลเตอร์กับมินิฟิลเตอร์
accDescr: แผนภาพที่แสดงความสัมพันธ์ระหว่างไดรเวอร์ฟิลเตอร์ระบบไฟล์ การผลัดรุ่นจากฟิลเตอร์รุ่นเก่าสู่มินิฟิลเตอร์ Filter Manager (FltMgr) คอลแบ็ก pre/post อัลติจูดกับกลุ่มลำดับโหลด การสังเกตด้วย fltmc มินิฟิลเตอร์ป้องกันไวรัสกับการตั้งค่ายกเว้น・Dev Drive และกลไกที่ Procmon ในฐานะมินิฟิลเตอร์บันทึก I/O ทั้งหมด
minifilter["มินิฟิลเตอร์"]
filter_manager["Filter Manager (FltMgr)"]
legacy_filter_driver["ฟิลเตอร์รุ่นเก่า"]
filesystem_filter_driver["ไดรเวอร์ฟิลเตอร์ระบบไฟล์"]
device_stack["สแตกอุปกรณ์"]
load_order_instability["ความไม่แน่นอนของลำดับโหลด"]
minifilter_callback["คอลแบ็ก pre/post"]
altitude["อัลติจูด"]
load_order_group["กลุ่มลำดับโหลด"]
fltmc["fltmc"]
altitude_request["การยื่นขออัลติจูด"]
procmon["Process Monitor (procmon.exe)"]
antivirus_minifilter["มินิฟิลเตอร์ป้องกันไวรัส"]
cloud_filter["ฟิลเตอร์ไฟล์คลาวด์ (cldflt)"]
onedrive_files_on_demand["ไฟล์ตามความต้องการของ OneDrive"]
fast_io["Fast I/O"]
scan_performance_cost["ต้นทุนสมรรถนะจากการสแกน"]
exclusion_setting["การตั้งค่ายกเว้น (ยกเว้นโฟลเดอร์)"]
reduced_protection["ระดับการป้องกันที่ลดลง"]
dev_drive["Dev Drive"]
frame["เฟรมของ FltMgr"]
driver_object["อ็อบเจ็กต์ไดรเวอร์"]
legacy_filter_driver -->|"อิมพลีเมนต์"| filesystem_filter_driver
minifilter -->|"อิมพลีเมนต์"| filesystem_filter_driver
minifilter -->|"เป็นรุ่นถัดจาก"| legacy_filter_driver
legacy_filter_driver -->|"ต้องมี"| device_stack
legacy_filter_driver -->|"อาจก่อให้เกิด"| load_order_instability
minifilter -.->|"ป้องกัน"| load_order_instability
minifilter -->|"ต้องมี"| filter_manager
filter_manager -->|"ใช้"| minifilter_callback
minifilter -->|"ใช้"| minifilter_callback
minifilter -->|"กำหนดค่าด้วย"| altitude
altitude -->|"กำหนดค่าด้วย"| load_order_group
altitude -->|"ตรวจยืนยันด้วย"| fltmc
altitude -.->|"ต้องมี"| altitude_request
altitude_request -->|"ควรทำก่อน"| minifilter
minifilter -->|"ตรวจยืนยันด้วย"| fltmc
legacy_filter_driver -->|"ตรวจยืนยันด้วย"| fltmc
procmon -->|"ใช้"| minifilter
procmon -->|"ใช้"| minifilter_callback
antivirus_minifilter -->|"ใช้"| minifilter_callback
antivirus_minifilter -->|"กำหนดค่าด้วย"| altitude
cloud_filter -->|"ทำอัตโนมัติ"| onedrive_files_on_demand
minifilter -.->|"ใช้"| fast_io
antivirus_minifilter -.->|"อาจก่อให้เกิด"| scan_performance_cost
exclusion_setting -->|"บรรเทา"| scan_performance_cost
exclusion_setting -->|"อาจก่อให้เกิด"| reduced_protection
antivirus_minifilter -->|"กำหนดค่าด้วย"| exclusion_setting
dev_drive -->|"บรรเทา"| scan_performance_cost
dev_drive -->|"บรรเทา"| reduced_protection
antivirus_minifilter -->|"แนวทางที่แนะนำสำหรับ"| dev_drive
filter_manager -->|"ใช้"| frame
frame -->|"ตรวจยืนยันด้วย"| fltmc
legacy_filter_driver -->|"ใช้"| driver_object
minifilter -->|"ใช้"| driver_object
filter_manager -->|"ต้องมี"| device_stack
filter_manager -->|"ใช้"| driver_object
ในแผนภาพ เส้นทึบหมายถึงความสัมพันธ์ที่ถือเสมอ และเส้นประหมายถึงความสัมพันธ์ที่มีเงื่อนไข (เงื่อนไขอยู่ในการอธิบายของแต่ละความสัมพันธ์ในหน้าละเอียด) รายการความสัมพันธ์ทั้งหมด (รวม 35 รายการ พร้อมหลักฐานและระดับความเชื่อมั่น) และนิยามของแนวคิดหลักรวบรวมไว้ที่ หน้าละเอียดของแผนที่ความรู้ (เป็นภาษาญี่ปุ่น) ข้อมูล: JSON-LD / Turtle
2. ประวัติของผู้ที่แทรกกลาง — จากฟิลเตอร์รุ่นเก่าสู่ FltMgr
ไดรเวอร์ฟิลเตอร์ระบบไฟล์คือ ไดรเวอร์ที่แย่งคำขอที่มุ่งระบบไฟล์ (หรือวอลุ่มใต้ระบบนั้น) ได้ บันทึกคำขอ เฝ้า เปลี่ยนเนื้อหา ไปจนปฏิเสธหรือประมวลผลแทน ── เป็นฐานของซอฟต์แวร์อย่างป้องกันไวรัส การเข้ารหัส สำรอง หน่วยความจำแบบชั้น1
วิธีอิมพลีเมนต์เก่า (ฟิลเตอร์รุ่นเก่า) คือวิธีซ้อนอ็อบเจ็กต์อุปกรณ์ของตนลงสแตกอุปกรณ์ที่เห็นในตอนที่ 1 โดยตรง ในฐานะกลไกตรงไปตรงมา แต่ในงานจริงเต็มไปด้วยปัญหา ── ลำดับที่ถูกซ้อนพึ่งลำดับโหลดจึงรับประกันยาก เมื่อซ้อนแล้วถอดออกอย่างปลอดภัยไม่ได้ (ถอดไม่ได้) เป็นแหล่งบั๊กความเข้ากันระหว่างฟิลเตอร์
ดังนั้น Windows จึงนำ Filter Manager (FltMgr) เข้า FltMgr เองยืนในสแตกเป็นฟิลเตอร์ที่มากับ OS และฟังก์ชันฟิลเตอร์แต่ละตัว ลงทะเบียนคอลแบ็ก กับ FltMgr ในฐานะ มินิฟิลเตอร์2
flowchart TB
subgraph OLD["วิธีรุ่นเก่า"]
L1["ฟิลเตอร์รุ่นเก่า A"]
L2["ฟิลเตอร์รุ่นเก่า B"]
LFS1["ระบบไฟล์"]
L1 --> L2
L2 --> LFS1
NOTE1["ลำดับขึ้นกับลำดับโหลด<br/>ถอดออกอย่างปลอดภัยไม่ได้"]
end
subgraph NEW["วิธีมินิฟิลเตอร์ (มาตรฐานปัจจุบัน)"]
FM["Filter Manager (FltMgr)<br/>มากับ OS ผู้ที่ยืนในสแตกมีแค่นี้"]
M1["มินิฟิลเตอร์ A (อัลติจูดสูง)"]
M2["มินิฟิลเตอร์ B (อัลติจูดต่ำ)"]
LFS2["ระบบไฟล์"]
FM -. "ลงทะเบียนคอลแบ็ก" .- M1
FM -. "ลงทะเบียนคอลแบ็ก" .- M2
FM --> LFS2
NOTE2["ลำดับเด็ดขาดด้วยอัลติจูด<br/>โหลดได้ทุกจังหวะ<br/>(ฟิลเตอร์ที่รองรับถอดออกได้ด้วย)"]
end
ภาพ 1: การผลัดรุ่น จาก «ซ้อน» ในสแตก ไปวิธี «ลงทะเบียน» กับ FltMgr
ข้อดีของวิธีมินิฟิลเตอร์ถูกแจกอย่างเป็นทางการ ── โหลดได้ทุกเมื่อ ควบคุมลำดับได้ และฟิลเตอร์ที่อิมพลีเมนต์คอลแบ็กถอดออก ก็ถอดได้ขณะทำงาน (ฟิลเตอร์ที่ไม่ได้อิมพลีเมนต์หรือปฏิเสธ ถอดไม่ได้)3 เพื่ออยู่ร่วมกับฟิลเตอร์รุ่นเก่า FltMgr ยืนได้หลายจุดในสแตกเป็นหลาย «เฟรม» และมินิฟิลเตอร์เมื่อโหลดใหม่หลังถอดออก กลับตำแหน่งเดิม (อัลติจูดเดิม) ถูกรับประกัน2 ซอฟต์แวร์ป้องกันไวรัส เฝ้า ซิงค์สมัยใหม่ เกือบทั้งหมดคือมินิฟิลเตอร์นี้
3. การเคลื่อนของมินิฟิลเตอร์ — คอลแบ็ก pre/post
มินิฟิลเตอร์ประกาศกับ FltMgr ว่า «สนใจการดำเนินการใด» เช่น สนใจแค่ IRP_MJ_CREATE (เปิด) กับ IRP_MJ_WRITE (เขียน) จากนั้นทุกครั้งที่การดำเนินการนั้นไหล ก่อนการดำเนินการ (คอลแบ็ก pre) และ หลังการดำเนินการ (คอลแบ็ก post) ถูกเรียก
sequenceDiagram
participant IOM as I/O Manager
participant FM as FltMgr
participant A as มินิฟิลเตอร์ A<br/>(อัลติจูดสูง)
participant B as มินิฟิลเตอร์ B<br/>(อัลติจูดต่ำ)
participant FS as NTFS
IOM->>FM: คำขอ (IRP_MJ_CREATE ฯลฯ โลกของตอนที่ 1)
FM->>A: คอลแบ็ก pre
FM->>B: คอลแบ็ก pre
FM->>FS: ไประบบไฟล์
FS-->>FM: ผลการประมวลผล
FM-->>B: คอลแบ็ก post
FM-->>A: คอลแบ็ก post
FM-->>IOM: จบ (สู่กระแสการจบของตอนที่ 1)
ภาพ 2: คอลแบ็ก pre/post ขาไปถูกเรียกจากอัลติจูดสูงไปต่ำ ขากลับกลับลำดับ
แต่ละคอลแบ็กทำอะไรได้ โครงเดียวกับ «สามทางเลือกของไดรเวอร์» ในตอนที่ 1 หมวด 4.3 ถูกให้ด้วย API ที่ปลอดภัยกว่า
flowchart TB
PRE["คอลแบ็ก pre ถูกเรียก"]
Q{"จะทำอย่างไรกับการดำเนินการนี้"}
PASS["ปล่อยผ่าน<br/>(ถ้าไม่ต้องการ post ก็ประกาศได้)"]
DENY["ปฏิเสธ<br/>คืนการปฏิเสธการเข้าถึงทันที<br/>ตัวอย่าง: ตรวจพบไวรัส ห้ามเขียน"]
DONE["ทำให้จบเอง<br/>ตัวอย่าง: ฟิลเตอร์คลาวด์<br/>ดึงตัวจริงมาส่ง"]
MOD["แก้พารามิเตอร์หรือเนื้อหาแล้วปล่อยไหล<br/>ตัวอย่าง: ฟิลเตอร์เข้ารหัส"]
PRE --> Q
Q --> PASS
Q --> DENY
Q --> DONE
Q --> MOD
ภาพ 3: ทางเลือกของคอลแบ็ก pre «ดู・หยุด・ทำแทน・แก้» ทำได้อย่างเป็นทางการทั้งหมด
แล้วการบ้านของตอนที่ 4 ถูกเก็บตรงนี้ ── มินิฟิลเตอร์ยืนที่ Fast I/O (ทางลัดที่ไม่สร้าง IRP) ได้ด้วย เพราะ FltMgr ใส่กลไกคอลแบ็กบนเส้นทาง Fast I/O ด้วย จึงไม่มีเรื่องแบบยุครุ่นเก่าที่ «ถ้าถูกเดินทางลัดจะมองไม่เห็น» เหตุที่ล็อกของ Procmon มีแม้แถว FASTIO_ ก็เพราะตำแหน่งยืนนี้
4. อัลติจูด — «ความสูง» กำหนดลำดับ
เมื่อหลายฟิลเตอร์สนใจการดำเนินการเดียวกัน ใครดูก่อน คือปัญหาใหญ่ ถ้าป้องกันไวรัสไม่ดูก่อนการเข้ารหัส จะต้องสแกนไซเฟอร์เท็กซ์ และเครื่องมือเฝ้าถ้าไม่อยู่เหนือทุกคนจะสังเกตภาพรวมไม่ได้
สิ่งที่กำหนดลำดับนี้คือ อัลติจูด (altitude: ความสูง) แต่ละชนิดฟิลเตอร์มี กลุ่มลำดับโหลด และแถบหมายเลขถูกนิยาม พูดให้ถูก หน่วยที่ได้อัลติจูดไม่ใช่ไดรเวอร์ทั้งก้อน แต่เป็น «อินสแตนซ์» ของมินิฟิลเตอร์ที่ติดวอลุ่ม หมายเลขไม่ซ้ำ และตัวเลขใหญ่กว่าอยู่บนของสแตก (ใกล้แอป)4 ไดรเวอร์หนึ่งตัวมีนิยามอินสแตนซ์หลายอันและปรากฏที่ความสูงต่างกันได้ นั่นคือเหตุที่รายการของ fltmc instances เป็นหน่วยอินสแตนซ์
flowchart TB
APP["ใกล้แอป (ตัวเลขใหญ่)"]
G1["FSFilter Activity Monitor: 360000〜389999<br/>สังเกต・บันทึก I/O (Procmon อยู่ที่นี่)"]
G2["FSFilter Undelete: 340000〜349999<br/>กู้ไฟล์ที่ลบ"]
G3["FSFilter Anti-Virus: 320000〜329999<br/>ตรวจและกำจัดไวรัส"]
G4["FSFilter Replication: 300000〜309999<br/>ทำสำเนาไประยะไกล"]
G5["FSFilter Continuous Backup: 280000〜289999<br/>สำรองต่อเนื่อง"]
G6["ต่อไปข้างล่าง: Content Screener /<br/>Quota Management / System Recovery /<br/>แถบเข้ารหัส・บีบอัด ฯลฯ ต่อ"]
FS["ใกล้ระบบไฟล์ (ตัวเลขเล็ก)"]
APP --> G1 --> G2 --> G3 --> G4 --> G5 --> G6 --> FS
ภาพ 4: แถบอัลติจูด (คัดมา) แต่ละวัตถุประสงค์มี «ความสูงที่ควรยืน» กำหนดไว้
สำคัญคือ หมายเลขนี้ถูก กำหนดและจัดการโดย Microsoft5 ผู้ขายไม่ตั้งชื่อเอง แต่ยื่นขอแล้วรับ ── ดังนั้นทุกพีซีจึงรักษาความเป็นระเบียบ «การเฝ้าอยู่เหนือป้องกันไวรัส ป้องกันไวรัสอยู่เหนือการเข้ารหัส» นี่คือคำตอบต่อ «กาชาลำดับโหลด» ของยุครุ่นเก่า
ที่ยื่นขอเมื่อทำมินิฟิลเตอร์ของบริษัทเอง สำหรับนักพัฒนา เขียนแค่ก้าวถัดไป อัลติจูดยื่นตามขั้นตอน 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
:: View 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 ยืนยันได้ด้วยตัวเลขตรง ๆ และ เมื่อเปิด Procmon แล้วรัน fltmc อีกครั้ง จะมีแถวที่ขึ้นต้นด้วย PROCMON เพิ่มหนึ่งแถวในแถบ Activity Monitor (360000〜389999)
ใบหน้าต่างตามสภาพแวดล้อม แต่ผู้อยู่แบบฉบับคือขาประจำของซีรีส์นี้
WdFilter── มินิฟิลเตอร์ของ Microsoft Defender อยู่แถบ Anti-Virus บนพีซีจำนวนมาก คือด่านที่ I/O ไฟล์ทั้งหมดต้องผ่านcldflt── ฟิลเตอร์ไฟล์คลาวด์ กองปฏิบัติการของไฟล์ตามความต้องการของ OneDrive และเมื่อจุดรีพาร์ส (ตัวยึดที่) ที่เห็นในตอนที่ 5 ถูกเปิด จะจัดตัวจริงให้10PROCMON24(ฯลฯ) ── มินิฟิลเตอร์ชั่วคราวในแถบ Activity Monitor ที่ปรากฏเฉพาะตอน Process Monitor ทำงาน เคล็ดที่ Procmon เห็น I/O ทั้งหมดคืออันนี้11 ลองรันfltmcก่อนและหลังเปิดแล้วเทียบ- นอกนั้น ซอฟต์แวร์สำรอง ผลิตภัณฑ์เข้ารหัส (กันรั่วข้อมูล) EDR ที่เก็บเสมือน ── พีซีงานยิ่งมีผู้อยู่เพิ่ม
เมื่อมองเครื่องมือ Procmon ที่ใช้มาตั้งแต่ตอนที่ 1 จากนอกกล่องเครื่องมือในตอนสุดท้าย จะได้วงจรที่สะอาดว่า «ผู้สังเกตก็เป็นผู้อยู่ของกลไกเดียวกับที่ถูกสังเกต»
6. ป้องกันไวรัสใช้เวลาตรงไหน
ผลในงานจริงของฟิลเตอร์ที่ใหญ่ที่สุดคือต้นทุนการสแกนของป้องกันไวรัส แผนภาพว่าเวลาเกิดตรงไหน (รายละเอียดต่างตามผลิตภัณฑ์ ด้านล่างเป็นรูปแบบฉบับ)
sequenceDiagram
participant App as แอป
participant AV as มินิฟิลเตอร์ AV
participant FS as NTFS
App->>AV: เปิดไฟล์
Note over AV: pre-create: ตัดสินพาธหรือนโยบายล่วงหน้า
AV->>FS: ปล่อยผ่าน (ทำการเปิด)
FS-->>AV: เปิดสำเร็จ (post-create)
Note over AV: ถ้าเป็นไฟล์ที่ยังไม่สแกน<br/>สแกนเนื้อในตรงนี้<br/>ถ้ามีปัญหาเพิกถอนการเปิด<br/>── สาเหตุหลักที่เปิดช้า
AV-->>App: ถ้าไม่มีปัญหา แฮนเดิลถูกคืน
App->>AV: เขียน・ปิด
Note over AV: ไฟล์ที่ถูกเปลี่ยน<br/>เข้าเป้าสแกนใหม่ตอนปิด ฯลฯ
Note over App,FS: ไฟล์เล็กจำนวนมาก (ผลระหว่างของบิลด์ ฯลฯ)<br/>การไปกลับนี้กองตามจำนวนไฟล์
ภาพ 5: จุดเกิดต้นทุนสแกน ต่อไฟล์น้อย แต่ถ้าหลายหมื่นไฟล์จะกลายเป็นต้นทุนหลัก
จากนี้ หัวข้องานจริงสองอย่างเข้าใจได้ถูก
ความหมายทางเทคนิคของการตั้งค่ายกเว้น สำหรับ I/O ของพาธที่ตรงรายการยกเว้น การสแกนของฟิลเตอร์ถูกข้าม ฟิลเตอร์ไม่หายจากสแตก ความจริงคือการตัดสิน «ไม่ตรวจ» เกิดเร็วขึ้น และมีข้อจำกัดสำคัญอีกอย่าง ── การยกเว้นมีผลแค่ฟิลเตอร์ของผลิตภัณฑ์ที่ถือการตั้งค่านั้น การตั้งค่ายกเว้นของ Microsoft Defender เปลี่ยนการสแกนของ WdFilter ไม่มีผลใด ๆ ต่อพฤติกรรมของมินิฟิลเตอร์อื่นที่อยู่ร่วม (ป้องกันไวรัสค่ายอื่น EDR สำรอง การเข้ารหัส ฯลฯ) เมื่อ «ใส่ยกเว้นแล้วยังช้า» ให้สงสัยว่าผู้อยู่อื่นกำลังใช้เวลา (การเทียบ fltmc ของหมวด 7) ผลใหญ่ ในทางกลับกัน การยกเว้นทำให้การป้องกันที่นั่นอ่อนลงอย่างชัวร์ เอกสารของ Microsoft ก็เตือนซ้ำว่าการยกเว้นลดการป้องกัน จึงควรรักษาให้น้อยสุดหลังประเมินความเสี่ยง6 งานปฏิบัติของการรับมือตรวจผิดกับผลต่อสมรรถนะ อยู่ใน «เมื่อแอป Windows ที่พัฒนาเองถูกจัดเป็นไวรัส»
คำตอบใหม่คือ Dev Drive วอลุ่มเฉพาะที่ออกแบบเพื่อเวิร์กโหลดพัฒนา (ไฟล์เล็กจำนวนมาก) ซึ่ง Microsoft Defender ทำงานใน โหมดสมรรถนะ (สแกนอะซิงโครนัส) ถูกจัดเป็น ทางเลือกที่ปลอดภัยกว่า การยกเว้นโฟลเดอร์ ตามค่าเริ่มต้นไม่มีฟิลเตอร์เพิ่มถูกติด ในทางกลับกันก็ระบุคำเตือนแรงต่อการดำเนินงานที่ถอดฟิลเตอร์ทั้งหมด7 นี่คือคำตอบที่ Microsoft แนะนำปัจจุบันต่อ «อยากให้บิลด์เร็วแต่กลัวการยกเว้น»
7. ขั้นตอนสอบสวน «ช้าแค่สภาพแวดล้อมนั้น»
เครื่องมือที่กองในซีรีส์ ท้ายนี้รวมเป็นขั้นตอนเดียว
flowchart TB
S["อาการ: แอปเดียวกันแต่สภาพแวดล้อมหนึ่ง<br/>การเข้าถึงไฟล์ช้า"]
P1["ดูคอลัมน์ Duration ของ Procmon<br/>การดำเนินการใด (IRP_MJ_CREATE? WRITE?)<br/>ที่เวลาหายไป"]
Q1{"การดำเนินการเฉพาะช้าสม่ำเสมอ?"}
F1["เทียบ fltmc instances กับสภาพแวดล้อมที่เร็ว<br/>ดูผลต่างของโครงฟิลเตอร์"]
Q2{"ฟิลเตอร์ที่เป็นผลต่างเป็นสาเหตุ?"}
A1["การตั้งค่ายกเว้น (คู่การประเมินความเสี่ยง) หรือ<br/>พิจารณา Dev Drive・ปรึกษาผู้ขาย"]
A2["สงสัยนอกฟิลเตอร์:<br/>แคช (ตอนที่ 4)・การแตกกระจายหรือ MFT (ตอนที่ 5)・<br/>ปลายเครือข่าย (UNC)・อุปกรณ์เอง"]
S --> P1 --> Q1
Q1 -->|"ใช่"| F1 --> Q2
Q2 -->|"ใช่"| A1
Q2 -->|"ไม่"| A2
Q1 -->|"ไม่ (กระจัดกระจาย)"| A2
ภาพ 6: การแยกความช้าจากฟิลเตอร์ กุญแจคือ «เวลาต่อหน่วยการดำเนินการ» กับ «ผลต่างโครงฟิลเตอร์ระหว่างสภาพแวดล้อม»
จุดมีสอง ข้อแรก Procmon มีเวลาต่อหน่วยการดำเนินการ (Duration) ถ้าแยก «ช้า» เป็น «การดำเนินการใดช้า» การตามคนร้ายจบครึ่งหนึ่ง ข้อสอง ความต่างสภาพแวดล้อมมักเป็นความต่างของโครงฟิลเตอร์ เครื่องพัฒนากับเครื่องงานจริง พีซีบริษัทกับพีซีลูกค้า ── แค่เรียงเอาต์พุต fltmc ก็เห็นตัวเลือกที่ควรสงสัย
สามก้าวแรกเมื่อยังไม่เคยแตะ Procmon คอลัมน์ Duration ตามค่าเริ่มต้นไม่ถูกแสดง จึงเขียนแค่การดำเนินการเพื่อไม่ให้ติดตรงนี้
- เปิด
Procmon.exeในฐานะผู้ดูแล - เปิด Options เมนู > Select Columns… แล้วติ๊ก Duration จากรายการคอลัมน์
- ใน Filter เมนู > Filter… (Ctrl+L) ใส่
Process Name/is/ ชื่อ exe เป้าหมาย /Includeแล้ว กดปุ่ม Add ก่อน ค่อย OK (ไม่กด Add เงื่อนไขไม่เข้า)
จากนั้นคลิกคอลัมน์ Duration เพื่อเรียง การดำเนินการที่กินเวลาจะรวมด้านบน ถ้าจะรวมต่อโพรเซสหรือต่อไฟล์ ใช้ Tools เมนู > File Summary ได้ด้วย การดำเนินการ ProcMon โดยรวมอยู่ใน «คู่มือปฏิบัติ Process Monitor (ProcMon)»
8. การเก็บงานซีรีส์ — แผนที่หกตอน
ครบแล้ว เปิดทุกกล่องของแผนที่ที่วาดในตอนที่ 1 รวมทั้งก้อนเป็นแผ่นเดียว
flowchart TB
APP["แอปพลิเคชัน<br/>ReadFile / WriteFile / async-await"]
API["ตอนที่ 2: I/O ซิงค์・อะซิงค์<br/>โหมดของแฮนเดิลกับ OVERLAPPED"]
IOCP["ตอนที่ 3: IOCP กับเธรดพูล .NET<br/>การรับการจบกับการรันความต่อเนื่อง"]
IOM["ตอนที่ 1: I/O Manager กับ IRP<br/>การแก้ชื่อ・สามอ็อบเจ็กต์・สแตกอุปกรณ์"]
FLT["ตอนที่ 6: ฟิลเตอร์กับมินิฟิลเตอร์<br/>FltMgr・อัลติจูด・pre/post"]
CACHE["ตอนที่ 4: Cache Manager<br/>วิว 256KB・lazy writer・Fast I/O<br/>(ทำงานร่วมกับ NTFS)"]
NTFS["ตอนที่ 5: NTFS<br/>MFT・สตรีม・ลิงก์・สองวารสาร"]
HW["สแตกที่เก็บกับอุปกรณ์"]
APP --> API
API --> IOM
IOCP -. "การจบกลับมาที่นี่" .-> APP
IOM --> FLT
FLT --> NTFS
NTFS -. "I/O ที่แคชเปิดทำงานร่วม<br/>(ระบบไฟล์เรียกฟังก์ชันแคช)" .- CACHE
NTFS --> HW
HW -. "อินเทอร์รัปต์→จบ (ตอนที่ 1)" .-> IOCP
ภาพ 7: แผนที่ทั้งซีรีส์ Cache Manager ไม่ใช่ «ชั้นที่ผ่าน» แต่เป็นคู่ที่ทำงานร่วมกับระบบไฟล์ และเมื่อแคชพลาด คำขอจาก NTFS ไปที่เก็บจะออก
- ตอนที่ 1: ภาพรวม ── การอ่านเขียนทั้งหมดกลายเป็น IRP
- ตอนที่ 2: ซิงค์/อะซิงค์ ── ความหมายจริงของ OVERLAPPED
- ตอนที่ 3: IOCP ── ชั้นใต้ async/await
- ตอนที่ 4: แคช ── WriteFile ของคุณไปถึงดิสก์เมื่อใด
- ตอนที่ 5: NTFS ── เข้าใจระบบไฟล์จาก MFT
- ตอนที่ 6: ฟิลเตอร์กับมินิฟิลเตอร์ (บทความนี้) ── เหตุที่ Procmon และการสแกนไวรัสแทรก I/O ได้
9. สรุป — ปิดซีรีส์
สรุปตอนสุดท้าย
- การแทรก I/O คือจุดขยายที่ OS รับรองอย่างเป็นทางการ และมาตรฐานปัจจุบันคือ การลงทะเบียนคอลแบ็กกับ FltMgr (มินิฟิลเตอร์) ลำดับถูกกำหนดเด็ดขาดด้วยอัลติจูด และ Microsoft กำหนดและจัดการหมายเลข245
- การเคลื่อนคือ คอลแบ็ก pre/post ปล่อยผ่าน ปฏิเสธ ทำแทน แก้ได้ และยืนที่ Fast I/O ได้ด้วย Procmon, Defender, OneDrive ล้วนเป็นผู้อยู่ของกลไกเดียวกัน11110
- การตั้งค่ายกเว้น = การข้ามสแกน และเป็นการแลกกับการป้องกัน สำหรับวอลุ่มพัฒนามีทางเลือกที่ปลอดภัยกว่าคือ Dev Drive (สแกนอะซิงโครนัส)67
- «ช้าแค่สภาพแวดล้อมนั้น» แยกจาก Duration ของ Procmon กับผลต่างโครง
fltmc── เครื่องมือของซีรีส์กลายเป็นขั้นตอนสอบสวนตรง ๆ
แล้วข้อสรุปทั้งซีรีส์ถ้าพูดหนึ่งบรรทัด คือดังนี้ ── I/O ของ Windows ถูกออกแบบอย่างสอดคล้อง ให้กำหนดปลายทางด้วยเนมสเปซ ทำให้คำขอเป็นแพ็กเก็ต (IRP) ให้ไหลระหว่างชั้น และให้แต่ละชั้นเลือก «ดู・รับฝาก・ทำแทน» ได้ ใต้หนึ่งบรรทัดของ File.ReadAllText โครงสร้างหกตอนนี้ทำงานทุกครั้ง แทนการท่องพฤติกรรมของ API ให้ «ควรเป็นเช่นนั้น» จากแผนที่นี้ได้ ── นั่นคือพลังที่อยากให้ได้จากซีรีส์นี้ ขอบคุณที่ร่วมเดินทางยาว
บทความที่เกี่ยวข้อง
- เชิงลึกของ Windows I/O (ตอนที่ 1) — การอ่านเขียนทั้งหมดกลายเป็น IRP: ภาพรวมของระบบ I/O
- เชิงลึกของ Windows I/O (ตอนที่ 4) — Cache Manager: WriteFile ของคุณไปถึงดิสก์เมื่อใด
- เชิงลึกของ Windows I/O (ตอนที่ 5) — โครงสร้างภายในของ NTFS: เข้าใจระบบไฟล์จาก MFT
- คู่มือปฏิบัติ Process Monitor (ProcMon) — ระบุ «การตั้งค่าไม่ถูกอ่าน» «ACCESS DENIED» ใน 10 นาที
- เมื่อแอป Windows ที่พัฒนาเองถูกจัดเป็นไวรัส — การรับมือตรวจผิดของ Microsoft Defender และการอยู่กับผลต่อสมรรถนะ
- ปฏิบัติ Process Explorer / Handle / VMMap — ตามแฮงก์ รั่ว และ «ไฟล์กำลังถูกใช้» จากสถานะขณะนี้
- รายการตรวจความปลอดภัยขั้นต่ำของแอป Windows
ด้านให้คำปรึกษาที่เกี่ยวข้อง
KomuraSoft LLC รับงานสอบสวนปัญหาสมรรถนะและบั๊กของแอปธุรกิจ Windows ที่เกี่ยวไดรเวอร์ฟิลเตอร์ เช่น «ช้าแค่สภาพแวดล้อมหนึ่ง» «ซอฟต์แวร์ความปลอดภัยไปชนกับแอปของตน»
ลิงก์อ้างอิง
-
Microsoft Learn, About file system filter drivers. ว่าด้วยไดรเวอร์ฟิลเตอร์ระบบไฟล์ที่เป็นไดรเวอร์ทางเลือกที่แย่ง (intercept) คำขอที่มุ่งระบบไฟล์หรือไดรเวอร์ฟิลเตอร์อื่นได้ การแย่งคำขอที่ขยายหรือแทนฟังก์ชันก่อนส่งไปปลายทางเดิม และบันทึกคำขอ เฝ้า เปลี่ยนข้อมูล กันการกระทำได้ และยูทิลิตีป้องกันไวรัส โปรแกรมเข้ารหัส ระบบจัดการหน่วยความจำแบบชั้น เป็นตัวอย่างของไดรเวอร์ฟิลเตอร์ ↩ ↩2 ↩3
-
Microsoft Learn, Filter Manager Concepts. ว่าด้วย Filter Manager (FltMgr) ที่เป็นไดรเวอร์โหมดเคอร์เนลที่มากับ Windows และเปิดฟังก์ชันที่ทำให้การพัฒนามินิฟิลเตอร์ง่าย มินิฟิลเตอร์ที่ลงทะเบียนการประมวลผลก่อนและหลังการดำเนินการ I/O (คอลแบ็ก pre/post) ได้ FltMgr ที่ติดได้หลายจุดของสแตก I/O เป็นเฟรมเพื่ออยู่ร่วมกับฟิลเตอร์รุ่นเก่า และมินิฟิลเตอร์ที่เมื่อถอดออกแล้วโหลดใหม่ก็กลับเฟรมเดิมอัลติจูดเดิม ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Advantages of the Filter Manager Model. ว่าด้วยข้อดีที่โมเดลมินิฟิลเตอร์มีเหนือโมเดลฟิลเตอร์รุ่นเก่า การควบคุมลำดับโหลดฟิลเตอร์ได้ดีกว่า มินิฟิลเตอร์ต่างจากฟิลเตอร์รุ่นเก่าที่โหลดได้ทุกจังหวะ ถอดออกได้ และการเชื่อมวอลุ่ม DAX ฯลฯ ↩ ↩2
-
Microsoft Learn, Load order groups and altitudes for minifilter drivers. ว่าด้วยกลุ่มลำดับโหลดตามวัตถุประสงค์ที่ถูกนิยามสำหรับฟิลเตอร์ระบบไฟล์ แต่ละกลุ่มถูกกำหนดช่วงอัลติจูด ไดรเวอร์ฟิลเตอร์ทั้งหมดมีตัวระบุอัลติจูดที่ไม่ซ้ำซึ่งกำหนดตำแหน่งสัมพัทธ์ต่อฟิลเตอร์อื่นในสแตก I/O และตัวอย่างกลุ่มอย่าง FSFilter Activity Monitor (360000〜389999 การสังเกตและรายงาน I/O) FSFilter Undelete (340000〜349999) FSFilter Anti-Virus (320000〜329999 การตรวจและกำจัดไวรัสระหว่าง I/O ไฟล์) FSFilter Replication (300000〜309999) FSFilter Continuous Backup (280000〜289999) เป็นต้น ↩ ↩2 ↩3
-
Microsoft Learn, Allocated altitudes. ว่าด้วยอัลติจูดของมินิฟิลเตอร์ที่ถูกกำหนดและจัดการโดย Microsoft และมีรายการอัลติจูดที่กำหนดแล้วถูกเผยแพร่ ในรายการนั้น WdFilter.sys อยู่ในกลุ่ม FSFilter Anti-Virus ที่ 328010 และ cldflt.sys อยู่ในกลุ่ม FSFilter Top ที่ 409500 ↩ ↩2 ↩3
-
Microsoft Learn, Configure and validate exclusions for Microsoft Defender Antivirus. ว่าด้วยการตั้งค่ายกเว้นของ Microsoft Defender ที่ทำให้ไฟล์ โฟลเดอร์ โพรเซสที่เป็นเป้ายกเว้นหลุดจากเป้าสแกน และการยกเว้นที่ลดระดับการป้องกัน จึงควรถูกกำหนดอย่างระมัดระวังหลังประเมินความจำเป็น ตามที่ถูกเตือนซ้ำ ↩ ↩2 ↩3
-
Microsoft Learn, Set up a Dev Drive on Windows 11. ว่าด้วย Dev Drive ที่เป็นวอลุ่มออกแบบเพื่อเวิร์กโหลดพัฒนา Microsoft Defender ที่ทำงานในโหมดสมรรถนะ (สแกนอะซิงโครนัส) การถูกจัดเป็นทางเลือกที่ปลอดภัยต่อการยกเว้นโฟลเดอร์ (secure alternative to folder exclusions) โดยคำนึงความเร็วและสมรรถนะ ฟิลเตอร์เพิ่มที่ไม่ถูกติด Dev Drive ตามค่าเริ่มต้น และการดำเนินงานที่ถอดฟิลเตอร์ป้องกันไวรัสที่ถูกเตือนว่าเป็นความเสี่ยงความปลอดภัยร้ายแรง ↩ ↩2 ↩3
-
Microsoft Learn, Request a Filter Altitude Identifier. ว่าด้วยการยื่นขออัลติจูดฟิลเตอร์ใหม่ที่ทำด้วยการส่งอีเมลข้อความ ASCII หัวข้อ «Filter altitude request» ไป fsfcomm@microsoft.com ต้องกรอกชื่อบริษัท อีเมลติดต่อ (นามแฝงบริษัทระยะยาว ไม่ใช่บุคคล) ชื่อผลิตภัณฑ์ URL ผลิตภัณฑ์ คำอธิบายฟิลเตอร์ ชื่อไฟล์ฟิลเตอร์ ชนิดฟิลเตอร์ ชนิดสตาร์ต กลุ่มลำดับโหลดที่ต้องการ อัลติจูดที่ต้องการ ทั้งหมด ควรคาดเวลาดำเนินการ 30 วันทำการ และไม่มีช่องยื่นขอนอกขั้นตอนนี้ Microsoft อาจกำหนดอัลติจูดต่างจากที่ต้องการ และถ้ามีอัลติจูดจำนวนเต็มอยู่แล้ว สร้างอัลติจูดของตนที่มีทศนิยมในกลุ่มลำดับโหลดเดียวกันได้ แจ้งทีหลังก็พอ ↩ ↩2
-
Microsoft Learn, Blocking legacy file system filter drivers. ว่าด้วยการรัน
fltmc filtersจากพรอมต์คำสั่งที่ยกสิทธิ์ ที่ออกรายการฟิลเตอร์ 4 คอลัมน์ «Filter Name / Num Instances / Altitude / Frame» สิ่งที่คอลัมน์ Frame เป็น<Legacy>คือไดรเวอร์ฟิลเตอร์ระบบไฟล์รุ่นเก่าที่ไม่ผ่าน FltMgr และมินิฟิลเตอร์มีตัวเลข (0 ฯลฯ) ใน Frame ↩ ↩2 -
Microsoft Learn, Cloud Files API. ว่าด้วย Cloud Files API (ฟิลเตอร์คลาวด์) ที่เป็นฐานของเอนจินซิงค์ซึ่งแสดงไฟล์บนคลาวด์เป็นตัวยึดที่ในเครื่องท้องถิ่น แล้วดึงตัวจริงเมื่อเข้าถึง (ไฟล์ตามความต้องการของ OneDrive ฯลฯ) ↩ ↩2
-
Microsoft Learn, Process Monitor - Sysinternals. ว่าด้วย Process Monitor ที่เป็นเครื่องมือเฝ้าขั้นสูงซึ่งแสดงกิจกรรมของระบบไฟล์ รีจิสทรี โพรเซส/เธรดแบบเรียลไทม์ (ตามที่กล่าวในบทความ ขณะทำงานสังเกตได้ว่าปรากฏเป็นมินิฟิลเตอร์ในรายการ fltmc) ↩ ↩2
บทความที่เกี่ยวข้อง
บทความล่าสุดที่มีแท็กเดียวกัน เพื่อเจาะลึกหัวข้อใกล้เคียง
เชิงลึกของ Windows I/O (ตอนที่ 5) — โครงสร้างภายในของ NTFS: เข้าใจระบบไฟล์จาก MFT
ตอนที่ 5 ของซีรีส์ที่อธิบายโครงสร้างภายในของ NTFS ด้วยแผนภาพ จัดจากมุมนักพัฒนา ทั้ง MFT กับเรกคอร์ดไฟล์ สตรีมข้อมูลหลายอัน (Zone.Identifi...
เชิงลึกของ Windows I/O (ตอนที่ 4) — Cache Manager: WriteFile ของคุณไปถึงดิสก์เมื่อใด
ตอนที่ 4 ของซีรีส์ที่อธิบาย Cache Manager ของ Windows ด้วยแผนภาพ จัดแคชที่อิมพลีเมนต์เป็นการแมปไฟล์ การอ่านล่วงหน้ากับการเขียนแบบหน่วง กา...
เชิงลึกของการจำลองเสมือนบน Windows (ตอนที่ 2) — หน่วยความจำที่แม้เคอร์เนลก็มองไม่เห็น: กลไกของ VBS, HVCI และ Credential Guard
เมื่อติดตั้งใหม่บนฮาร์ดแวร์ที่รองรับ VBS จะเปิดตามค่าเริ่มต้น และใช้ hypervisor กับ SLAT สร้างการแยกที่แข็งกว่าเคอร์เนล บทความนี้อธิบายโค...
Named Pipe ในทางปฏิบัติ — IPC มาตรฐานของ Windows ตั้งแต่การออกแบบถึงความปลอดภัย
คู่มือเชิงปฏิบัติเรื่อง named pipe ซึ่งเป็นการสื่อสารระหว่างโปรเซสมาตรฐานของ Windows บทความนี้จัดระเบียบจากแหล่งปฐมภูมิ ทั้งการเลือกระหว่...
เลือกบัญชีบริการ Windows — LocalSystem, บัญชีเสมือน และ gMSA
ยังรันบริการ Windows เป็น LocalSystem อยู่หรือไม่ บทความนี้เปรียบเทียบสิทธิ์และตัวตนเครือข่ายของ LocalService, NetworkService, บัญชีเสมือ...
หัวข้อที่เกี่ยวข้อง
หน้าเหล่านี้วางหัวข้อไว้ในบริบทที่กว้างขึ้นของบริการและการตัดสินใจ
หัวข้อเทคนิคของ Windows
ประตูสู่การพัฒนา Windows การตรวจสอบบั๊ก และการใช้ประโยชน์จากสินทรัพย์เดิม
บริการที่เกี่ยวข้องกับหัวข้อนี้
บทความนี้เกี่ยวข้องโดยตรงกับบริการต่อไปนี้
พัฒนาแอป Windows
แอปธุรกิจ การเชื่อมต่ออุปกรณ์ และเครื่องมือสื่อสาร ตั้งแต่ความต้องการจนถึงการพัฒนา
คำถามที่พบบ่อย
คำถามที่มักพบในการปรึกษาเกี่ยวกับหัวข้อของบทความนี้
- ไดรเวอร์ฟิลเตอร์ระบบไฟล์กับมินิฟิลเตอร์ต่างกันอย่างไร?
- ทั้งคู่คือ «ไดรเวอร์ที่แทรกคำขอ I/O ไประบบไฟล์» แต่รุ่นของวิธีแทรกต่างกัน ฟิลเตอร์รุ่นเก่าซ้อนอ็อบเจ็กต์อุปกรณ์ของตนลงสแตกอุปกรณ์ของระบบไฟล์โดยตรง ตำแหน่งถูกกำหนดด้วยลำดับโหลดจึงรับประกันลำดับยาก และมีปัญหาอย่างถอดออกอย่างปลอดภัยไม่ได้เมื่อโหลดแล้ว มินิฟิลเตอร์ซึ่งเป็นมาตรฐานปัจจุบัน คือวิธีลงทะเบียนคอลแบ็กกับ Filter Manager (FltMgr) ที่มากับ Windows ว่า «เรียกก่อนและหลังการดำเนินการนี้» ตำแหน่งถูกกำหนดเด็ดขาดด้วยหมายเลขที่เรียกอัลติจูด โหลดได้ทุกจังหวะ และฟิลเตอร์ที่อิมพลีเมนต์คอลแบ็กถอดออก ก็ถอดได้ขณะทำงาน ฟิลเตอร์สมัยใหม่เกือบทั้งหมด ── ป้องกันไวรัส การเข้ารหัส เครื่องมือเฝ้า การซิงค์คลาวด์ ── ถูกอิมพลีเมนต์เป็นมินิฟิลเตอร์
- ทำไมซอฟต์แวร์ป้องกันไวรัสจึงตรวจการเข้าถึงไฟล์ทั้งหมดได้?
- เพราะ OS จัดจุดขยายอย่างเป็นทางการเพื่อเรื่องนี้ มินิฟิลเตอร์ลงทะเบียนโค้ดที่ถูกเรียกก่อน (คอลแบ็ก pre) และหลัง (คอลแบ็ก post) การดำเนินการอย่างเปิด อ่าน เขียน กับ Filter Manager ได้ ฟิลเตอร์ป้องกันไวรัสอยู่ที่แถบอัลติจูดสำหรับแอนติไวรัส (320000〜329999) และตัวอย่างเช่น สแกนเนื้อในทันทีหลังเปิดไฟล์สำเร็จ (post-create) แล้วถ้ามีปัญหา เพิกถอนการเปิดนั้นให้การเข้าถึงล้มได้ ตามที่เห็นในตอนที่ 1 ของซีรีส์ I/O ไฟล์ทั้งหมดไหลลงสแตกอุปกรณ์ ดังนั้นยืนที่ตำแหน่งที่กำหนดบนทางนั้น ก็ตรวจการเข้าถึงทั้งหมดได้ ── ไม่ใช่แฮ็ก แต่เป็นกลไกที่ถูกใส่ในการออกแบบของ OS
- การตั้งค่ายกเว้นของซอฟต์แวร์ป้องกันไวรัส (ยกเว้นโฟลเดอร์) ทำอะไรทางเทคนิค?
- สำหรับ I/O ไปพาธที่ตรงกับรายการยกเว้น ทำให้ฟิลเตอร์ของผลิตภัณฑ์นั้นข้ามการสแกนที่มันทำ ฟิลเตอร์เองไม่หายจากสแตก ความเข้าใจที่ใกล้จริงคือ การตัดสิน «ไม่ตรวจพาธนี้» เกิดเร็วขึ้น ข้อจำกัดสำคัญคือ การยกเว้นมีผลแค่ฟิลเตอร์ของผลิตภัณฑ์ที่ถือการตั้งค่านั้น ตัวอย่างเช่น การตั้งค่ายกเว้นของ Microsoft Defender เปลี่ยนการสแกนของฟิลเตอร์ Defender (WdFilter) ไม่กระทบพฤติกรรมของมินิฟิลเตอร์อื่นที่อยู่ร่วม ── ป้องกันไวรัสค่ายอื่น EDR สำรอง ฯลฯ แต่ละผลิตภัณฑ์ต้องมีการตั้งค่ายกเว้นของตน และเมื่อ «ยกเว้นแล้วแต่ยังช้า» ฟิลเตอร์อื่นอาจเป็นสาเหตุ นอกจากนี้ ตามที่เอกสารของ Microsoft เตือนซ้ำ การยกเว้นทำให้การป้องกันที่นั่นอ่อนลง จึงควรรักษาให้น้อยสุดคู่กับการประเมินความเสี่ยง สำหรับงานพัฒนา การพิจารณา Dev Drive (โหมดสมรรถนะ = สแกนอะซิงโครนัส) ที่ถูกออกแบบเป็นทางเลือกที่ปลอดภัยกว่าการยกเว้นโฟลเดอร์ ก็มีค่า
- Process Monitor บันทึก I/O ทั้งหมดได้อย่างไร?
- เพราะ Procmon เองตอนเริ่ม ลงทะเบียนตนกับ Filter Manager เป็นมินิฟิลเตอร์ในแถบอัลติจูดสำหรับ Activity Monitor เมื่อ Procmon ทำงานอยู่ รัน fltmc จากพรอมต์คำสั่งที่ยกสิทธิ์ จะยืนยันได้ว่าฟิลเตอร์ที่ชื่อขึ้นต้นด้วย PROCMON ปรากฏในรายการ ในฐานะมินิฟิลเตอร์ มันยืนที่ pre/post ของการดำเนินการ I/O ทุกวอลุ่มได้ จึงบันทึกได้โดยไม่ตกหล่นว่าโพรเซสใดทำอะไรกับไฟล์ใด เหตุที่คำ IRP และ Fast I/O ที่ตามมาในซีรีส์โผล่ตรงในจอ Procmon ก็เพราะมันสังเกตจากตำแหน่งที่ยืนบนทางของ I/O เอง
- เมื่อบิลด์บนเครื่องพัฒนาช้า ควรสงสัยไดรเวอร์ฟิลเตอร์ไหม?
- คุ้มที่จะสงสัยมาก บิลด์คือก้อนของการสร้าง อ่าน เขียน ลบไฟล์เล็กจำนวนมาก และแต่ละอันกลายเป็นเป้าตรวจของกลุ่มฟิลเตอร์ (โดยเฉพาะการสแกนป้องกันไวรัส) จึงเป็นเวิร์กโหลดที่ต้นทุนฟิลเตอร์โผล่ง่ายที่สุด การสอบสวนพื้นฐานคือดูคอลัมน์ Duration ของ Procmon ว่าเวลาหายไปที่การดำเนินการใด แล้วเทียบความต่างของโครงฟิลเตอร์ระหว่างสภาพแวดล้อมด้วย fltmc instances มาตรการ นอกจากการตั้งค่ายกเว้นหลังประเมินความเสี่ยง ยังมีการใช้ Dev Drive ที่ออกแบบเฉพาะวอลุ่มพัฒนา บน Dev Drive การป้องกันไวรัสทำงานในโหมดสมรรถนะ (สแกนอะซิงโครนัส) และ Microsoft จัดว่าเป็นทางเลือกที่ปลอดภัยกว่าการตั้งค่ายกเว้น