#include "usb.h" #include "usbioctl.h" #include "Usbdlib.h" #pragma once // HID Descriptor ŸÀÔ Á¤ÀÇ (USB Ç¥ÁØ) #define USB_DESCRIPTOR_TYPE_HID 0x21 #define MAX_HID_INTERFACES 8 // HID Descriptor ±¸Á¶Ã¼ Á¤ÀÇ #pragma pack(push, 1) typedef struct _USB_HID_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; // 0x21 USHORT bcdHID; // HID Spec Version (e.g., 0x0111 for 1.11) UCHAR bCountryCode; UCHAR bNumDescriptors; // Number of class descriptors (usually 1 for Report Desc) struct { UCHAR bDescriptorType; // Report Descriptor Type (0x22) USHORT wDescriptorLength; // Report Descriptor Length } DescriptorList[1]; } USB_HID_DESCRIPTOR, * PUSB_HID_DESCRIPTOR; #pragma pack(pop) typedef struct _HID_INTERFACE_ENTRY { UCHAR InterfaceNumber; // ÇØ´ç HID°¡ ¼ÓÇÑ ÀÎÅÍÆäÀ̽º ¹øÈ£ PUSB_HID_DESCRIPTOR HidDesc; // HID Descriptor Æ÷ÀÎÅÍ (ConfigDesc ³»ºÎ À§Ä¡) } HID_INTERFACE_ENTRY, * PHID_INTERFACE_ENTRY; typedef struct _USB_PARSED_INFO { USB_DEVICE_DESCRIPTOR DeviceDesc; PWCHAR ManufacturerStr; PWCHAR ProductStr; PWCHAR SerialNumberStr; PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc; ULONG ConfigDescSize; // ----------------------------------------- // 1. [CC ÀÎÁõ ¿ä±¸»çÇ×] HID »ó¼¼ ºÐ·ù Ç÷¡±× // ----------------------------------------- BOOLEAN IsBootKeyboard; // ¿Ïº®ÇÑ Ç¥ÁØ Å°º¸µå (SubClass 1, Protocol 1) BOOLEAN IsBootMouse; // ¿Ïº®ÇÑ Ç¥ÁØ ¸¶¿ì½º (SubClass 1, Protocol 2) BOOLEAN IsCustomHID; // ±âŸ Ä¿½ºÅÒ HID (SubClass 0, Protocol 0 - ¹ÙÄÚµå, ÅÍÄ¡ µî) BOOLEAN IsAbnormalHID; // ½ºÆå¿¡ ¸ÂÁö ¾Ê´Â ºñÁ¤»ó HID UCHAR OtherHidSubClass; UCHAR OtherHidProtocol; // ----------------------------------------- // 2. [¸Åü Á¦¾î ¿ä±¸»çÇ×] ÁÖ¿ä µð¹ÙÀ̽º Ŭ·¡½º // ----------------------------------------- BOOLEAN IsMassStorage; // 0x08: USB ¸Þ¸ð¸®, ¿ÜÀåÇϵå BOOLEAN IsAudio; // 0x01: USB ½ºÇÇÄ¿, Çìµå¼Â BOOLEAN IsPrinter; // 0x07: USB ÇÁ¸°ÅÍ BOOLEAN IsImageOrVideo; // 0x06 (Image), 0x0E (Video): À¥Ä·, ½º¸¶Æ®Æù MTP ÀϺΠBOOLEAN IsHub; // 0x09: USB Çãºê BOOLEAN IsCDC; // 0x02: Åë½Å ÀåÄ¡ (½º¸¶Æ®Æù Å×´õ¸µ, °¡»ó ½Ã¸®¾ó) BOOLEAN IsCompositeDevice; // º¹ÇÕ ÀåÄ¡ ¿©ºÎ ULONG FoundClassCount; // ¹ß°ßµÈ °íÀ¯ ÀÎÅÍÆäÀ̽º °³¼ö // ----------------------------------------- // 3. [¾ÈƼ ÇØÅ·] BadUSB ŽÁö¿ë Ä«¿îÅÍ ¹× Ç÷¡±× // ----------------------------------------- ULONG TotalEndpoints; // Àüü ¿£µåÆ÷ÀÎÆ® °³¼ö ULONG InterruptEndpoints; // ÀÎÅÍ·´Æ® ¿£µåÆ÷ÀÎÆ® °³¼ö ULONG BulkEndpoints; // ´ë¿ë·® Àü¼Û ¿£µåÆ÷ÀÎÆ® °³¼ö BOOLEAN HasMixedEndpoints; // Bulk¿Í Interrupt°¡ ¼¯¿© ÀÖ´ÂÁö ¿©ºÎ (±¸Çü CheckBADUSB ¾ÆÀ̵ð¾î) BOOLEAN IsBadUSB; // ÃÖÁ¾ BadUSB È®Á¤ Ç÷¡±× (TRUE¸é Â÷´Ü) // HID ºÎ°¡ Á¤º¸ º¸°ü¿ë ULONG HidInterfaceCount; HID_INTERFACE_ENTRY HidEntries[MAX_HID_INTERFACES]; } USB_PARSED_INFO, * PUSB_PARSED_INFO; // ÇÔ¼ö ¿øÇü ¼±¾ð NTSTATUS CollectUsbDeviceInfo(IN PDEVICE_OBJECT DeviceObject, OUT PUSB_PARSED_INFO* ppInfo); VOID FreeUsbDeviceInfo(IN PUSB_PARSED_INFO pInfo); VOID PrintUsbParsedInfo(IN PUSB_PARSED_INFO pInfo);