implement user mode catchable exceptions, refactor system status codes to use NTLSTATUS_ prefix, update build scripts to use shared literal macros for linker arguments, update named queue lifetime cleanup to include KeNamedQueueUnpublishHandle.

This commit is contained in:
maksw committed 2026-06-27 20:38:43 +02:00
1 parent 1f5477cf66
commit b7fcfce6f7
140 files changed
+7649 -3943

No files matched your search

+48 -48
View File
@@ -54,15 +54,15 @@ static KSTATUS UsbHubEnumerateRootPortWithRetries(USB_HUB_EXTENSION* hub,
uint8_t* outSlot) {
if (outSlot) *outSlot = 0;
if (!hub || !xhci || port == 0 || port > USB_ROOT_HUB_MAX_PORTS)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS last = STATUS_DEVICE_ERROR;
KSTATUS last = NTLSTATUS_DEVICE_ERROR;
uint8_t maxAttempts = USB_ROOT_PORT_ENUM_RETRIES;
if (maxAttempts == 0) maxAttempts = 1;
for (uint8_t attempt = 1; attempt <= maxAttempts; attempt++) {
if (!UsbHubRootPortConnected(xhci, port))
return STATUS_NOT_FOUND;
return NTLSTATUS_NOT_FOUND;
uint8_t slot = 0;
last = XhciEnumeratePortEx(xhci, port, &slot);
@@ -70,7 +70,7 @@ static KSTATUS UsbHubEnumerateRootPortWithRetries(USB_HUB_EXTENSION* hub,
if (outSlot) *outSlot = slot;
hub->RootPortFailCount[port] = 0;
hub->RootPortState[port] = UsbHubPortChildPresent;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
hub->RootPortFailCount[port] = attempt;
@@ -82,7 +82,7 @@ static KSTATUS UsbHubEnumerateRootPortWithRetries(USB_HUB_EXTENSION* hub,
// enumerations. Descriptor/control timeouts are not retried here; they
// are usually dead/firmware-owned ports and retrying them stalls boot.
if (last != STATUS_DEVICE_ERROR || attempt == maxAttempts)
if (last != NTLSTATUS_DEVICE_ERROR || attempt == maxAttempts)
break;
DbgPrint("usb-hub: root port %u enumeration attempt %u failed st=0x%x; retrying\n",
@@ -219,7 +219,7 @@ static KSTATUS UsbHubControlIn(USB_HUB_EXTENSION* hub,
PHYSICAL_ADDRESS bufferPhys,
uint16_t length) {
if (!hub || !hub->LowerDevice || !buffer || !bufferPhys || !length)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
USB_URB urb;
memset(&urb, 0, sizeof(urb));
@@ -243,7 +243,7 @@ static KSTATUS UsbHubControlNoData(USB_HUB_EXTENSION* hub,
uint16_t value,
uint16_t index) {
if (!hub || !hub->LowerDevice)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
USB_URB urb;
memset(&urb, 0, sizeof(urb));
@@ -261,7 +261,7 @@ static KSTATUS UsbHubControlNoData(USB_HUB_EXTENSION* hub,
// Implements the hub Read Descriptor operation.
static KSTATUS UsbHubReadDescriptor(USB_HUB_EXTENSION* hub, USB_HUB_DESCRIPTOR* outDesc) {
if (!hub || !outDesc || !hub->ChangeBitmap || !hub->ChangeBitmapPhys)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
memset(hub->ChangeBitmap, 0, USB_HUB_CHANGE_BITMAP_BYTES);
KSTATUS st = UsbHubControlIn(hub,
@@ -277,14 +277,14 @@ static KSTATUS UsbHubReadDescriptor(USB_HUB_EXTENSION* hub, USB_HUB_DESCRIPTOR*
memcpy(outDesc, hub->ChangeBitmap, sizeof(USB_HUB_DESCRIPTOR));
if (outDesc->bDescriptorType != USB_DESC_HUB || outDesc->bNbrPorts == 0)
return STATUS_DEVICE_ERROR;
return STATUS_SUCCESS;
return NTLSTATUS_DEVICE_ERROR;
return NTLSTATUS_SUCCESS;
}
// Implements the hub Get Port Status operation.
static KSTATUS UsbHubGetPortStatus(USB_HUB_EXTENSION* hub, uint8_t port, USB_HUB_PORT_STATUS* outStatus) {
if (!hub || !outStatus || port == 0)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
memset(hub->ChangeBitmap, 0, USB_HUB_CHANGE_BITMAP_BYTES);
KSTATUS st = UsbHubControlIn(hub,
@@ -299,7 +299,7 @@ static KSTATUS UsbHubGetPortStatus(USB_HUB_EXTENSION* hub, uint8_t port, USB_HUB
return st;
memcpy(outStatus, hub->ChangeBitmap, sizeof(USB_HUB_PORT_STATUS));
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the hub Set Port Feature operation.
@@ -333,7 +333,7 @@ static uint8_t UsbHubSpeedFromPortStatus(uint16_t status) {
static KSTATUS UsbHubResetExternalPort(USB_HUB_EXTENSION* hub, uint8_t port, uint8_t* outSpeed) {
if (outSpeed) *outSpeed = 0;
if (!hub || port == 0)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
(void)UsbHubClearPortFeature(hub, port, USB_HUB_PORT_FEAT_C_CONNECTION);
(void)UsbHubClearPortFeature(hub, port, USB_HUB_PORT_FEAT_C_ENABLE);
@@ -361,13 +361,13 @@ static KSTATUS UsbHubResetExternalPort(USB_HUB_EXTENSION* hub, uint8_t port, uin
if (!KSUCCESS(st))
return st;
if (!(ps.Status & USB_HUB_PORT_STATUS_CONNECTION))
return STATUS_NOT_FOUND;
return NTLSTATUS_NOT_FOUND;
if (!(ps.Status & USB_HUB_PORT_STATUS_ENABLE))
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
if (outSpeed)
*outSpeed = UsbHubSpeedFromPortStatus(ps.Status);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the hub Handle External Port Change operation.
@@ -568,17 +568,17 @@ static void UsbHubWorker(void* arg) {
// Implements the hub Do Root Port Scan operation.
static KSTATUS UsbHubDoRootPortScan(USB_HCD* hcd) {
if (!hcd || !hcd->RootHubContext)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
USB_HUB_EXTENSION* hub = (USB_HUB_EXTENSION*)hcd->RootHubContext;
if (!hub->Started)
return STATUS_OBJECT_DEAD;
return NTLSTATUS_OBJECT_DEAD;
uint32_t attempted = 0;
uint32_t configured = 0;
XHCI_CONTROLLER* xhci = (XHCI_CONTROLLER*)hcd->ControllerContext;
if (!xhci || !xhci->Op)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
for (uint8_t port = 1; port <= hub->PortCount; port++) {
uint32_t portsc = XhciRead32(xhci->Op, XhciPortReg(port));
@@ -609,16 +609,16 @@ static KSTATUS UsbHubDoRootPortScan(USB_HCD* hcd) {
DbgPrint("usb-hub: root-port scan complete; attempted=%u configured=%u\n", attempted, configured);
hub->InitialScanComplete = true;
hub->InitialScanInProgress = false;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the hub Schedule Root Scan operation.
KSTATUS UsbHubScheduleRootScan(USB_HCD* hcd) {
if (!hcd || !hcd->RootHubContext)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
USB_HUB_EXTENSION* hub = (USB_HUB_EXTENSION*)hcd->RootHubContext;
if (hub->Kind != UsbHubKindRoot || !hub->Started)
return STATUS_OBJECT_DEAD;
return NTLSTATUS_OBJECT_DEAD;
uintptr_t flags = KeAcquireSpinlock(&hub->PendingLock);
if (!hub->InitialScanComplete && !hub->InitialScanInProgress)
@@ -627,7 +627,7 @@ KSTATUS UsbHubScheduleRootScan(USB_HCD* hcd) {
if (hub->WorkerSemaphore)
KeSignalSemaphore(hub->WorkerSemaphore);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the hub Queue Root Port Change operation.
@@ -641,7 +641,7 @@ void UsbHubQueueRootPortChange(USB_HCD* hcd, uint8_t port) {
// Implements the hub Scan External Ports operation.
static KSTATUS UsbHubScanExternalPorts(USB_HUB_EXTENSION* hub) {
if (!hub || hub->Kind != UsbHubKindExternal)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
uint32_t attempted = 0;
uint32_t configured = 0;
@@ -663,7 +663,7 @@ static KSTATUS UsbHubScanExternalPorts(USB_HUB_EXTENSION* hub) {
}
DbgPrint("usb-hub: external hub slot=%u scan complete; attempted=%u configured=%u\n",
hub->Device ? hub->Device->SlotId : 0, attempted, configured);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the hub Find Interrupt In operation.
@@ -742,7 +742,7 @@ static void UsbHubArmExternalInterrupt(USB_HUB_EXTENSION* hub) {
hub->ChangeUrb.CompleteContext = hub;
KSTATUS st = UsbSubmitUrbAsync(hub->LowerDevice, &hub->ChangeUrb);
if (st == STATUS_PENDING) {
if (st == NTLSTATUS_PENDING) {
hub->ChangeUrbPending = true;
} else if (!KSUCCESS(st)) {
DbgPrint("usb-hub: slot=%u interrupt arm failed st=0x%x\n",
@@ -776,17 +776,17 @@ static KSTATUS UsbHubStartRootDevice(DEVICE_OBJECT* device, USB_HUB_EXTENSION* h
hub->HubPdo->PnpState = DevicePnpStarted;
DbgPrint("usb-hub: root hub started ports=%u\n", hub->PortCount);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the hub Start External Device operation.
static KSTATUS UsbHubStartExternalDevice(DEVICE_OBJECT* device, USB_HUB_EXTENSION* hub) {
if (!hub || !hub->Device)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
hub->ChangeBitmap = (uint8_t*)UsbAllocateDmaBuffer(hub->Device, 1, &hub->ChangeBitmapPhys);
if (!hub->ChangeBitmap)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
USB_HUB_DESCRIPTOR desc;
memset(&desc, 0, sizeof(desc));
@@ -846,13 +846,13 @@ static KSTATUS UsbHubStartExternalDevice(DEVICE_OBJECT* device, USB_HUB_EXTENSIO
(void)UsbHubScanExternalPorts(hub);
UsbHubArmExternalInterrupt(hub);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the hub Start Device operation.
static KSTATUS UsbHubStartDevice(DEVICE_OBJECT* device, USB_HUB_EXTENSION* hub) {
if (!device || !hub || hub->Started)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if (hub->Kind == UsbHubKindRoot)
return UsbHubStartRootDevice(device, hub);
@@ -862,20 +862,20 @@ static KSTATUS UsbHubStartDevice(DEVICE_OBJECT* device, USB_HUB_EXTENSION* hub)
// Implements the hub Dispatch Pnp operation.
KSTATUS UsbHubDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
if (!device || !irp)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
IO_STACK_LOCATION* ios = IoGetCurrentIrpStackLocation(irp);
if (!ios || ios->MajorFunction != IRP_MJ_PNP)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
USB_HUB_EXTENSION* hub = (USB_HUB_EXTENSION*)device->DeviceExtension;
KSTATUS st = STATUS_SUCCESS;
KSTATUS st = NTLSTATUS_SUCCESS;
switch ((IO_PNP_MINOR_FUNCTION)ios->MinorFunction) {
case IRP_MN_START_DEVICE:
st = UsbHubStartDevice(device, hub);
if (!KSUCCESS(st)) {
IoCompleteRequest(irp, st, 0);
return STATUS_PENDING;
return NTLSTATUS_PENDING;
}
return IoForwardIrpToLower(device, irp);
@@ -940,19 +940,19 @@ KSTATUS UsbHubDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
}
}
KSTATUS lower = hub && hub->LowerDevice ? IoForwardIrpToLower(device, irp) : STATUS_SUCCESS;
KSTATUS lower = hub && hub->LowerDevice ? IoForwardIrpToLower(device, irp) : NTLSTATUS_SUCCESS;
if (hub && hub->LowerDevice) {
IoDetachDevice(device);
hub->LowerDevice = (DEVICE_OBJECT*)0;
}
IoDeleteDevice(device);
if (lower == STATUS_NOT_SUPPORTED) {
IoCompleteRequest(irp, STATUS_SUCCESS, 0);
return STATUS_PENDING;
if (lower == NTLSTATUS_NOT_SUPPORTED) {
IoCompleteRequest(irp, NTLSTATUS_SUCCESS, 0);
return NTLSTATUS_PENDING;
}
if (lower != STATUS_PENDING && !KSUCCESS(lower)) {
if (lower != NTLSTATUS_PENDING && !KSUCCESS(lower)) {
IoCompleteRequest(irp, lower, 0);
return STATUS_PENDING;
return NTLSTATUS_PENDING;
}
return lower;
}
@@ -965,11 +965,11 @@ KSTATUS UsbHubDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
// Implements the hub Add Device operation.
KSTATUS UsbHubAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject) {
if (!driver || !physicalDeviceObject || physicalDeviceObject->Type != DeviceObjectPhysical)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
USB_PDO_EXTENSION* pdoExt = (USB_PDO_EXTENSION*)physicalDeviceObject->DeviceExtension;
if (!pdoExt)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
USB_HUB_KIND kind;
USB_DEVICE* usbDevice = (USB_DEVICE*)0;
@@ -983,16 +983,16 @@ KSTATUS UsbHubAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObje
usbDevice = pdoExt->Device;
intr = UsbHubFindInterruptIn(pdoExt);
if (!intr)
return STATUS_NOT_FOUND;
return NTLSTATUS_NOT_FOUND;
} else if (pdoExt->Kind == UsbPdoInterface && pdoExt->Device &&
pdoExt->InterfaceDescriptor.bInterfaceClass == USB_CLASS_HUB) {
kind = UsbHubKindExternal;
usbDevice = pdoExt->Device;
intr = UsbHubFindInterruptIn(pdoExt);
if (!intr)
return STATUS_NOT_FOUND;
return NTLSTATUS_NOT_FOUND;
} else {
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
DEVICE_OBJECT* fdo = (DEVICE_OBJECT*)0;
@@ -1034,7 +1034,7 @@ KSTATUS UsbHubAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObje
IoDestroyRemoveLock(&hub->RemoveLock);
hub->RemoveLockReady = false;
IoDeleteDevice(fdo);
return STATUS_FAILURE;
return NTLSTATUS_FAILURE;
}
if (kind == UsbHubKindRoot) {
@@ -1045,7 +1045,7 @@ KSTATUS UsbHubAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObje
hub->Device ? hub->Device->SlotId : 0,
hub->InterruptEndpointAddress);
}
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Initializes hub Driver.