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:
1 parent
1f5477cf66
commit
b7fcfce6f7
140 files changed
+7649
-3943
No files matched your search
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user