چگونه با Device Simulation Framework یک USB مجازی بسازیم
اخیرا برای پروژه ای می خواستم یک دستگاه مجازی USB بسازم. این دستگاه باید مثل دستگاه واقعی عمل می کرد. در واقع یکسری خصوصیاتی که در هنگام متصل کردن دستگاه USB به کامپیوتر (اصطلاحا host) بین این دو رد و بدل میشود را بتوان به طریقی شبیه سازی کرد. می دونستم داخل بسته WDK فرم ورکی وجود داره که این قبیل کارها را می توان با آن انجام داد ولی هیچ موقع فرصتی پیدا نمی کردم که باهاش کار کنم. به هر حال این پست معرفی است برای این فرم ورک.
دنبال آموزشی برای استفاده از این فرم ورک بودم که این مقاله را پیدا کردم که به نظرم برای معرفی این فرم ورک مناسب بود برای اینکه اینجا ترجمه ای ازش قرار بدهم.
این فرم ورک در کنار بخش های مختلفی که دارد دارای یک درایور از نوع Lower Filter Driver می باشد(قبلا مختصری در پست device stack توضیح دادم فیلتر درایور چیست). این درایور برای USB Controller در ویندوز نوشته شده است که کارش شبیه سازی تمام ارتباط ها و فعالیت هایی است که ویندوز با یک دستگاه واقعی USB انجام می دهد. در واقع از دید درایور هیچ تفاوتی بین دستگاه ایجاد شده با DSF و یک دستگاه واقعی وجود ندارد.
حالا چگونه این فرم ورک می تواند دستگاه USB را شبیه سازی کند بدون آنکه آن را بشناسد؟ در واقع این فرم ورک تمام ارتباطات انجام گرفته را به یک برنامه سطح کاربر انتقال می دهم که این برنامه سطح کاربر می تواند به هر زبانی که از COM (Component Object Model)
پشتیبانی می کند نوشته شود. به این صورت می توانید رفتار دستگاه شبیه سازی شده را کنترل کنید. در تصویر زیر ارتباط بین بخش های مختلف قابل مشاهده است. (عکس برگرفته از MSDN)
نصب DSF
DSF همراه بسته WDK است که از سایت ماکروسافت قابل دانلود می باشد (من در این پست در مورد WDK و لینک های دانلودش توضیحاتی داده ام). که فقط روی ویندوزهای نسخه XP Sp2 به بالا (نسخه های x64 هم شامل می شود) قابل نصب است. (در مقاله به این نکته اشاره می شود که DSF همراه WDK نصب نمی شود و باید جداگانه آن را نصب کرد. در WDK ورژن 7.1 اینگونه نیست ولی اگر ورژنی از WDK استفاده میکنید که به این صورت بود از پوشه dsf داخل WDK فایل dsfx86runtime.msi یا dsfx64runtime.msi را نصب کنید.).
بعد از نصب با cmd به مسیر زیر بروید
\Program Files\dsf\softehci
و این دستور را وارد کنید.
softehcicfg.exe
این دستور باعث ایجاد یک USB Controller مجازی در device tree (رجوع به آموزش در مورد device stack) می شود. که می توانید در Device Manager آن را ببینید. سیستم ممکن است از شما برای این دستگاه جدید درخواست درایور کند در این صورت مسیر C:\Windows را به آن بدهید. بعد از اینکه درایورها به درستی نصب شوند شما باید در Device Manager دو دستگاه جدید به نام های Microsoft USB 2.0 EHCI Host Controller Simulator و USB Root Hub را مانند شکل زیر ببینید.
استفاده از VBScript برای نوشتن دستگاه ها
برای شبیه سازی دستگاه ها، DSF یکسری componennts بر پایه آبجکتهای COM می سازد . مانند Devices, Configurations, Interfaces, Endpoints, Descriptors و غیره. اگر قبلا firmware برای USB نوشته باشید می دانید منظورم از این عبارات چیست (اگر اطلاعات بیشتری در این مورد می خواهید می توانید مستنداتی که اینجا قرار گرفته را بخوانید.). شما همچنین می توانید componennts های خود را بنویسید و هر دستگاه USB ای را شبیه سازی کنید. همراه frameware یکسری سورس از نحوه درست کردن این قبیل دستگاه ها قرار گرفته که از این مسیر بسته WDK قابل دسترسی هستند.
[WINDDK Directory Path]\src\test\dsf\usb
برای استفاده از هر کدام احتیاج به یک زبان برنامه نویسی دارید که از اینترفیس های COM پشتیبانی کند.
برای نمونه مثالی که برای کیبرد آماده شده است نگاهی بیاندازیم. برای این کار به مسیر زیر بروید
\Program Files\dsf\usbhid
و دستور زیر را وارد کنید
cscript Create1.1Kbd.wsf
یکسری مراحل است که باید دنبال کنید. اگر برای اولین بار است که این کار را انجام می دهید ویندوز ممکن است سوالی در مورد نصب درایورهای دستگاه های جدید از شما بپرسد. این اسکریپت این دو دستگاه با نام های Generic USB Hub و USB Microsoft Natural Keyboard را می سازد که که در تصویر پایین قابل مشاهده است
قبل از اینکه دستگاه ایجاد شده را حذف کنید می توانید با ابزار IRP_TRACKER نگاهی به IRP های رد بدل شده بیاندازید. برای این کار ابزار را اجرا کنید از منوی File گزینه Select Device را انتخاب کنید. بعد از لیست تیک کنار \Device\kbdclass را بزنید. با این کار IRPهایی مربوط به Keyboard را می توانیم مشاهده کنیم.
و با اجرای این دستور داخل یک cmd دیگر
cscript Use1.1Kbd.wsf
می توان به Keyboard جدید درخواست خود را ارسال کنید. با فشردن کلید های کیبرد خروجی این ابزار بعد از وارد کردن عبارت "Hello World"