// USB driver package entry point. This file registers the USB bus, class, hub, HID, storage, and xHCI drivers. #include "usb.h" DRIVER_OBJECT gXhciDriver; const NTL_DDK* gUsbDdk; static const IO_DEVICE_ID gXhciIds[] = { { IoBusPci, { "PCI\\CC_0C0330", sizeof("PCI\\CC_0C0330") - 1 } }, }; static const IO_DRIVER_ID_TABLE gXhciIdTable = { gXhciIds, sizeof(gXhciIds) / sizeof(gXhciIds[0]), }; const char* UsbControllerName(uint8_t progIf) { switch (progIf) { case 0x00: return "UHCI"; case 0x10: return "OHCI"; case 0x20: return "EHCI"; case 0x30: return "xHCI"; default: return "USB"; } } // Initializes xhci Driver. static KSTATUS UsbInitializeXhciDriver(void) { memset(&gXhciDriver, 0, sizeof(gXhciDriver)); IoInitializeDriverObject(&gXhciDriver, SYS_SV_LITERAL("xhci")); gXhciDriver.IdTable = &gXhciIdTable; gXhciDriver.DriverAddDevice = XhciAddDevice; gXhciDriver.MajorFunction[IRP_MJ_PNP] = XhciDispatchPnp; return IoRegisterDriverObject(&gXhciDriver); } // Implements the driver Entry operation. KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { (void)init; if (!ddk || !ddk->Dma || !ddk->Timer) return NTLSTATUS_INVALID_PARAMETER; DbgPrint("usb: driver loading\n"); gUsbDdk = ddk; KSTATUS st = UsbInitializeBusModel(); if (!KSUCCESS(st)) { DbgPrint("usb: bus model initialisation failed st=0x%x\n", st); return st; } st = UsbInitializeCompositeDriver(); if (!KSUCCESS(st)) { DbgPrint("usb: composite driver initialisation failed st=0x%x\n", st); return st; } st = UsbInitializeHidDriver(); if (!KSUCCESS(st)) { DbgPrint("usb: HID driver initialisation failed st=0x%x\n", st); return st; } st = UsbInitializeStorageDriver(); if (!KSUCCESS(st)) { DbgPrint("usb: storage driver initialisation failed st=0x%x\n", st); return st; } st = UsbInitializeHubDriver(); if (!KSUCCESS(st)) { DbgPrint("usb: hub driver initialisation failed st=0x%x\n", st); return st; } st = UsbInitializeXhciDriver(); if (!KSUCCESS(st)) { DbgPrint("usb: xHCI driver initialisation failed st=0x%x\n", st); return st; } DbgPrint("usb: driver initialized\n"); return NTLSTATUS_SUCCESS; }