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

+34 -34
View File
@@ -68,11 +68,11 @@ static KSTATUS Rtl8139Reset(RTL8139_DEVICE* r) {
Rtl8139Write8(r, RTL8139_REG_CMD, RTL8139_CMD_RST);
for (uint32_t i = 0; i < 1000; i++) {
if ((Rtl8139Read8(r, RTL8139_REG_CMD) & RTL8139_CMD_RST) == 0)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if (gHal->Timer.Stall)
gHal->Timer.Stall(1000);
}
return STATUS_TIMEOUT;
return NTLSTATUS_TIMEOUT;
}
// Returns mac.
@@ -87,14 +87,14 @@ static KSTATUS Rtl8139AllocateDma(RTL8139_DEVICE* r) {
r->RxPhys = MmPfnAllocateContiguous(RTL8139_RX_PAGES, MmPfnUseDma);
r->TxPhys = MmPfnAllocateContiguous(RTL8139_TX_PAGES, MmPfnUseDma);
if (!r->RxPhys || !r->TxPhys)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
// RTL8139 has 32-bit DMA address registers. This is fine for typical QEMU
// and low-memory hobby OS configs, but make failure explicit.
if ((r->RxPhys + RTL8139_RX_ALLOC_SIZE - 1) > 0xFFFFFFFFULL ||
(r->TxPhys + RTL8139_TX_SLOTS * RTL8139_TX_BUF_SIZE - 1) > 0xFFFFFFFFULL) {
DbgPrint("RTL8139: DMA allocation above 4GiB is not supported by this NIC\n");
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
r->RxBuffer = (uint8_t*)gHal->PhysToVirt(r->RxPhys);
@@ -105,7 +105,7 @@ static KSTATUS Rtl8139AllocateDma(RTL8139_DEVICE* r) {
DbgPrint("RTL8139: rx=0x%016llX tx=0x%016llX\n",
(unsigned long long)r->RxPhys,
(unsigned long long)r->TxPhys);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the rx Read16 operation.
@@ -226,24 +226,24 @@ static void Rtl8139DpcRoutine(KDPC* dpc, void* context, void* systemArgument1, v
// Registers device.
static KSTATUS Rtl8139RegisterDevice(RTL8139_DEVICE* r) {
if (!r) return STATUS_INVALID_PARAMETER;
if (!r) return NTLSTATUS_INVALID_PARAMETER;
uintptr_t flags = KeAcquireSpinlock(&gRtl8139RegistryLock);
for (uint32_t i = 0; i < gRtl8139DeviceCount; i++) {
if (gRtl8139Devices[i] == r) {
KeReleaseSpinlock(&gRtl8139RegistryLock, flags);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
}
if (gRtl8139DeviceCount >= RTL8139_MAX_DEVICES) {
KeReleaseSpinlock(&gRtl8139RegistryLock, flags);
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
}
gRtl8139Devices[gRtl8139DeviceCount++] = r;
KeReleaseSpinlock(&gRtl8139RegistryLock, flags);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the unregister Device operation.
@@ -294,15 +294,15 @@ static void Rtl8139Isr(void) {
// Implements the send Frame operation.
static KSTATUS Rtl8139SendFrame(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;
RTL8139_DEVICE* r = (RTL8139_DEVICE*)device->DriverContext;
if (!r)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
uintptr_t flags = KeAcquireSpinlock(&r->TxLock);
uint32_t slot = r->TxSlot;
@@ -311,7 +311,7 @@ static KSTATUS Rtl8139SendFrame(NET_DEVICE* device, const void* frame, size_t le
// Writing a command with OWN cleared hands the slot to the NIC.
if (!(tsd & RTL8139_TSD_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;
@@ -325,13 +325,13 @@ static KSTATUS Rtl8139SendFrame(NET_DEVICE* device, const void* frame, size_t le
r->TxSlot = (slot + 1u) % RTL8139_TX_SLOTS;
KeReleaseSpinlock(&r->TxLock, flags);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the select Register Bar operation.
static KSTATUS Rtl8139SelectRegisterBar(RTL8139_DEVICE* r) {
if (!r || !r->Pdo)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
PCI_BAR best;
PCI_BAR fallback;
@@ -373,12 +373,12 @@ static KSTATUS Rtl8139SelectRegisterBar(RTL8139_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;
@@ -388,18 +388,18 @@ static KSTATUS Rtl8139SelectRegisterBar(RTL8139_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;
}
// Starts device.
static KSTATUS Rtl8139StartDevice(RTL8139_DEVICE* r) {
if (!r || r->Magic != RTL8139_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)) {
@@ -432,7 +432,7 @@ static KSTATUS Rtl8139StartDevice(RTL8139_DEVICE* r) {
st = PciGetInterrupt(r->Pdo, &r->Irq);
if (!KSUCCESS(st) || r->Irq == 0xFFu) {
DbgPrint("RTL8139: no legacy PCI IRQ line wired\n");
return KSUCCESS(st) ? STATUS_NOT_SUPPORTED : st;
return KSUCCESS(st) ? NTLSTATUS_NOT_SUPPORTED : st;
}
Rtl8139Write8(r, RTL8139_REG_CONFIG1, 0x00);
@@ -477,21 +477,21 @@ static KSTATUS Rtl8139StartDevice(RTL8139_DEVICE* r) {
}
DbgPrint("RTL8139: initialized; RX/TX enabled on IRQ %u\n", r->Irq);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Dispatches pnp.
KSTATUS Rtl8139DispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
if (!device || !irp || !device->DeviceExtension)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
RTL8139_DEVICE* r = (RTL8139_DEVICE*)device->DeviceExtension;
if (r->Magic != RTL8139_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:
@@ -499,14 +499,14 @@ KSTATUS Rtl8139DispatchPnp(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)
Rtl8139Write16(r, RTL8139_REG_IMR, 0);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
case IRP_MN_REMOVE_DEVICE:
r->Removed = true;
@@ -516,7 +516,7 @@ KSTATUS Rtl8139DispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
Rtl8139UnregisterDevice(r);
IoDetachDevice(device);
IoDeleteDevice(device);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
default:
return IoForwardIrpToLower(device, irp);
@@ -526,7 +526,7 @@ KSTATUS Rtl8139DispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
// Implements the add Device operation.
KSTATUS Rtl8139AddDevice(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(RTL8139_DEVICE), &fdo);
@@ -545,17 +545,17 @@ KSTATUS Rtl8139AddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObj
r->LowerDevice = IoAttachDeviceToDeviceStack(fdo, physicalDeviceObject);
if (!r->LowerDevice) {
IoDeleteDevice(fdo);
return STATUS_FAILURE;
return NTLSTATUS_FAILURE;
}
DbgPrint("RTL8139: 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("RTL8139: driver loading...\n");
gHal = hal;