84 lines
3.2 KiB
C
84 lines
3.2 KiB
C
|
|
#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);
|