Ndis filter driver part 2
בפוסט הקודם דיברתי על מרחב הבעיה , פתרונות אפשריים ותאור הDriver בקליפת אגוז ,הפוסט הזה אני אמשיך וארחיב לגבי המימוש .
לאחר שהעתקנו אלינו את הדוגמא של הDriver מה DDK מ
C:\WinDDK\7600.16385.1\src\network\ndis\filter
קימפלנו את ה code של Driver (עדיין עם build בסביבת command כשאצלנו בחברה יוצאים לסרט לתכנתי הdrivers מקרינים במיוחד סרטים מהתקופה של הכלים בהם הם עובדים רק בשבוע שעבר היה זה מבצע באנטבה עם יורם גאון ואריק שני. אנו מתאפקים עוד קצת עד שvisual studio 11 ישוחרר ותכנתי ה drivers יקפצו 30 שנה קדימה)
והתקנו את ה filter driver או virtual machine או במחשב אחר .
(בVirtual machine יש להקפיד שהקונפיגורציה של הרשת תהייה חיבור מלא אחרת זה לא יעבוד )
ההתקנה מאוד פשוטה מהNetwork connections .

לאחר שהתקנו את ה driver אנו רוצים לראות שאכן ה driver עובד והודעות שנשלחות לNIC אכן עוברות דרך ה Filter Driver שלנו .
הContainer של הודעות המידע (בשונה מהודעות הoid עליהן ארחיב פעם אחרת ) שעוברות ב Ndis drviers לסוגיו (אם זה בminiports , Filters ,protocols driverts etc' ) הינו struct מסוג Network buffers list .
מבנה ה Network buffer list

הפרמטר של ה NetBufferLists בcallbacks של :
SendNetBufferListsHandler, ReturnNetBufferListsHandler, SendNetBufferListsCompleteHandler ReceiveNetBufferListsHandler
מורכב מ linked list של NET_BUFFER_LIST struct
כל NetBufferList מצביע על struct של linked list of NET_BUFFER
אשר מצביע על Strcut של MDL linked list
כל MDL strcut מצביע על buffer של מידע .
על מנת להרגיש את הפעולה של ה filter יצרתי תוכנית קצרה ששולחת הודעת udp ,העדפתי udp כי כמות המידע שזורמת בהודעת udp קטנה בהרבה מזו של tcp אין צורך בתעבורת handshake וכד
בכוונה אני עוצר את התוכנית רגע לפני שליחת ההודעה על מנת להימנע לעצור ב breakpoints שנגרמים כתוצאה מביצוע פעולת GetHostEntery .

לעניות דעתי כלי ה Debug של ndis שמוכלים ב Ndiskd.dll מאוד חזקים ומאפשרים ניתוח מהיר ופשוט של הן המידע והן הstack של ה ndis
http://msdn.microsoft.com/en-us/library/windows/hardware/ff552270(v=vs.85).aspx
אחרי שהתחברתי למחשב שמריץ את הfilter driver טענתי symbols והרצתי את תוכנית הבדיקה ,אני שם breakpoint בcallback של FilterSendNetBufferList

מיד אחרי שליחת ההודעה אני נעצר ב breakpoint

באמצאות כלי הdebug של ndis בחנתי את תוכן ההודעה .
פקודת ndiskd.nbl פורסת אוטומטית את הnbl בהינתן ה Address של ה nbl הראשון .
כפי שרואים באיור הבא ההודעה מורכבת משני mdl ים אחד מכיל את הheader של הודעת הudp והשני את הpayload של המידע ששלחנו .

הNBL מכיל metadata נוסף כדוגמת ה SourceHandle המוצג באיור הבא ממנו ניתן ללמוד על מיקום ה driver שלנו בndis stack ואיך ה ndis stack בנוי ומורכב .
