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

+33 -33
View File
@@ -69,11 +69,11 @@ static KSTATUS RtlReset(RTL816X_DEVICE* r) {
RtlWrite8(r, RTL_REG_CHIP_CMD, RTL_CMD_RESET);
for (uint32_t i = 0; i < 1000; i++) {
if ((RtlRead8(r, RTL_REG_CHIP_CMD) & RTL_CMD_RESET) == 0)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if (gHal->Timer.Stall)
gHal->Timer.Stall(1000);
}
return STATUS_TIMEOUT;
return NTLSTATUS_TIMEOUT;
}
// Implements the rtl Read Mac operation.
@@ -91,7 +91,7 @@ static KSTATUS RtlAllocateDma(RTL816X_DEVICE* r) {
r->TxBuffersPhys = MmPfnAllocateContiguous(RTL_TXBUF_PAGES, MmPfnUseDma);
if (!r->RxRingPhys || !r->TxRingPhys || !r->RxBuffersPhys || !r->TxBuffersPhys)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
r->RxRing = (RTL_DESC*)gHal->PhysToVirt(r->RxRingPhys);
r->TxRing = (RTL_DESC*)gHal->PhysToVirt(r->TxRingPhys);
@@ -108,7 +108,7 @@ static KSTATUS RtlAllocateDma(RTL816X_DEVICE* r) {
(unsigned long long)r->TxRingPhys,
(unsigned long long)r->RxBuffersPhys,
(unsigned long long)r->TxBuffersPhys);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the rtl Init Descriptors operation.
@@ -229,24 +229,24 @@ static void RtlDpcRoutine(KDPC* dpc, void* context, void* systemArgument1, void*
// Implements the rtl Register Device operation.
static KSTATUS RtlRegisterDevice(RTL816X_DEVICE* r) {
if (!r) return STATUS_INVALID_PARAMETER;
if (!r) return NTLSTATUS_INVALID_PARAMETER;
uintptr_t flags = KeAcquireSpinlock(&gRtl816xRegistryLock);
for (uint32_t i = 0; i < gRtl816xDeviceCount; i++) {
if (gRtl816xDevices[i] == r) {
KeReleaseSpinlock(&gRtl816xRegistryLock, flags);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
}
if (gRtl816xDeviceCount >= RTL816X_MAX_DEVICES) {
KeReleaseSpinlock(&gRtl816xRegistryLock, flags);
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
}
gRtl816xDevices[gRtl816xDeviceCount++] = r;
KeReleaseSpinlock(&gRtl816xRegistryLock, flags);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the rtl Unregister Device operation.
@@ -297,15 +297,15 @@ static void RtlIsr(void) {
// Implements the rtl Send Frame operation.
static KSTATUS RtlSendFrame(NET_DEVICE* device, const void* frame, size_t length) {
if (!device || !frame)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (length > NET_ETHERNET_MAX_FRAME)
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
if (length < NET_ETHERNET_HEADER_LENGTH)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
RTL816X_DEVICE* r = (RTL816X_DEVICE*)device->DriverContext;
if (!r || !r->Started || r->Removed || r->SurpriseRemoved)
return STATUS_OBJECT_DEAD;
return NTLSTATUS_OBJECT_DEAD;
uintptr_t flags = KeAcquireSpinlock(&r->TxLock);
uint32_t index = r->TxIndex;
@@ -313,7 +313,7 @@ static KSTATUS RtlSendFrame(NET_DEVICE* device, const void* frame, size_t length
uint32_t opts = d->opts1;
if (opts & RTL_DESC_OWN) {
KeReleaseSpinlock(&r->TxLock, flags);
return STATUS_QUEUE_FULL;
return NTLSTATUS_QUEUE_FULL;
}
size_t wireLength = length < NET_ETHERNET_MIN_FRAME ? NET_ETHERNET_MIN_FRAME : length;
@@ -331,13 +331,13 @@ static KSTATUS RtlSendFrame(NET_DEVICE* device, const void* frame, size_t length
r->TxIndex = (index + 1) % RTL_TX_COUNT;
KeReleaseSpinlock(&r->TxLock, flags);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the rtl Select Register Bar operation.
static KSTATUS RtlSelectRegisterBar(RTL816X_DEVICE* r) {
if (!r || !r->Pdo)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
PCI_BAR best;
PCI_BAR fallback;
@@ -379,12 +379,12 @@ static KSTATUS RtlSelectRegisterBar(RTL816X_DEVICE* r) {
(unsigned long long)best.Base,
(unsigned long long)r->RegisterBytes,
r->Mmio);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
if (best.Type == PciBarIo) {
if (best.Base > 0xFFFFu)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
r->RegisterBar = best;
r->RegisterBytes = best.Length;
@@ -394,18 +394,18 @@ static KSTATUS RtlSelectRegisterBar(RTL816X_DEVICE* r) {
best.Index,
r->IoBase,
(unsigned long long)r->RegisterBytes);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
return STATUS_NOT_FOUND;
return NTLSTATUS_NOT_FOUND;
}
// Implements the rtl Start Device operation.
static KSTATUS RtlStartDevice(RTL816X_DEVICE* r) {
if (!r || r->Magic != RTL816X_DEVICE_MAGIC || !r->Pdo || !r->Fdo)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (r->Started)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
KSTATUS st = PciGetDeviceInfo(r->Pdo, &r->PciInfo);
if (!KSUCCESS(st)) {
@@ -438,7 +438,7 @@ static KSTATUS RtlStartDevice(RTL816X_DEVICE* r) {
st = PciGetInterrupt(r->Pdo, &r->Irq);
if (!KSUCCESS(st) || r->Irq == 0xFFu) {
DbgPrint("RTL816X: no legacy PCI IRQ line wired\n");
return KSUCCESS(st) ? STATUS_NOT_SUPPORTED : st;
return KSUCCESS(st) ? NTLSTATUS_NOT_SUPPORTED : st;
}
st = RtlReset(r);
@@ -483,21 +483,21 @@ static KSTATUS RtlStartDevice(RTL816X_DEVICE* r) {
}
DbgPrint("RTL816X: initialized; RX/TX enabled on IRQ %u\n", r->Irq);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Dispatches pnp.
KSTATUS Rtl816xDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
if (!device || !irp || !device->DeviceExtension)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
RTL816X_DEVICE* r = (RTL816X_DEVICE*)device->DeviceExtension;
if (r->Magic != RTL816X_DEVICE_MAGIC)
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;
switch ((IO_PNP_MINOR_FUNCTION)ios->MinorFunction) {
case IRP_MN_START_DEVICE:
@@ -505,14 +505,14 @@ KSTATUS Rtl816xDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_CANCEL_REMOVE_DEVICE:
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
case IRP_MN_SURPRISE_REMOVAL:
r->SurpriseRemoved = true;
device->PnpState = DevicePnpSurpriseRemoved;
if (r->Started)
RtlWrite16(r, RTL_REG_INTR_MASK, 0);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
case IRP_MN_REMOVE_DEVICE:
r->Removed = true;
@@ -522,7 +522,7 @@ KSTATUS Rtl816xDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
RtlUnregisterDevice(r);
IoDetachDevice(device);
IoDeleteDevice(device);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
default:
return IoForwardIrpToLower(device, irp);
@@ -532,7 +532,7 @@ KSTATUS Rtl816xDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
// Implements the add Device operation.
KSTATUS Rtl816xAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject) {
if (!driver || !physicalDeviceObject || physicalDeviceObject->Type != DeviceObjectPhysical)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
DEVICE_OBJECT* fdo = (DEVICE_OBJECT*)0;
KSTATUS st = IoCreateDevice(driver, sizeof(RTL816X_DEVICE), &fdo);
@@ -551,17 +551,17 @@ KSTATUS Rtl816xAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObj
r->LowerDevice = IoAttachDeviceToDeviceStack(fdo, physicalDeviceObject);
if (!r->LowerDevice) {
IoDeleteDevice(fdo);
return STATUS_FAILURE;
return NTLSTATUS_FAILURE;
}
DbgPrint("RTL816X: FDO attached to %v\n", physicalDeviceObject->Name);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the driver Entry operation.
KSTATUS DriverEntry(const HAL_API* hal) {
if (!hal)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
DbgPrint("RTL816X: driver loading...\n");
gHal = hal;