add a realtime scheduler class and priority-inheritance mutexes with timeouts and abandonment, add an HDA audio driver and a SYS_AUDIO_* syscall family, flesh out kernel32 with Win32 threads, events, mutexes, critical sections, and condition variables, add SYS_RESUME_THREAD for suspended thread creation, add KeInitializeMemoryTypes to reprogram MTRRs and install a canonical PAT for WB/WC/UC control, rework the display pipeline with a pitched present path and console output flush, bring back disk.vhd with mtools since vvfat fucking sucks, harden AHCI with serialized cache flush, USB mass storage with SCSI sense-data decoding, and xHCI with cleaner DMA teardown, fix the last stray for(;;) in HalStopProcessor to while(true), pile on smoke tests for audio, win32 sync primitives, and thread suspend, implement AHCI timeout, kill readahead since it was desperetaly trying to murder me, fix doom sound x2.

This commit is contained in:
maksw committed 2026-08-11 18:38:36 +02:00
1 parent 8b254f84f4
commit 4add6789ba
177 files changed
+22565 -3070

No files matched your search

+106 -10
View File
@@ -4,6 +4,7 @@
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#include <intrin.h>
#include <ntlite/ddk/ddk.h>
#include <ntlite/status.h>
@@ -74,6 +75,15 @@ typedef struct LWIP_ATTACH_CTX {
err_t Result;
} LWIP_ATTACH_CTX;
typedef struct LWIP_RESOLVE_CONTEXT {
SEMAPHORE* Done;
volatile long References;
err_t Result;
u8_t DnsType;
ip_addr_t Address;
char Name[DNS_MAX_NAME_LENGTH];
} LWIP_RESOLVE_CONTEXT;
typedef struct LWIP_PROVIDER_SOCKET {
SEMAPHORE* Lock;
struct netconn* Conn;
@@ -118,6 +128,9 @@ static KSTATUS LwipProviderShutdown(void* socket, uint32_t how);
static KSTATUS LwipProviderSetOption(void* socket, uint32_t option, const void* value, size_t valueSize);
static KSTATUS LwipProviderGetOption(void* socket, uint32_t option, void* value, size_t valueSize, size_t* actualSizeOut);
static KSTATUS LwipProviderPoll(void* socket, uint32_t events, uint32_t* returnedEventsOut);
static void LwipResolveRelease(LWIP_RESOLVE_CONTEXT* context);
static void LwipResolveDnsDoneCallback(const char* name, const ip_addr_t* address, void* argument);
static void LwipResolveStartCallback(void* argument);
static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SOCKET_ADDRESS_K* addressOut);
static KSTATUS LwipDispatchInternalDeviceControl(DEVICE_OBJECT* device, IRP* irp);
@@ -355,7 +368,7 @@ static KSTATUS LwipLoadNetifConfig(const NET_DEVICE* device, LWIP_NETIF_CONFIG*
static KSTATUS LwipSocketLock(LWIP_PROVIDER_SOCKET* s) {
if (!s || !s->Lock)
return NTLSTATUS_INVALID_PARAMETER;
return KeWaitSemaphore(s->Lock);
return KeWaitSemaphore(s->Lock, KE_WAIT_INFINITE);
}
// Implements the socket Unlock operation.
@@ -464,7 +477,7 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
uint32_t originalTimeout = s->ReceiveTimeoutMs;
uint32_t elapsed = 0;
for (;;) {
while (true) {
if (LwipSocketCancelRequested(cancelRequested)) {
netconn_set_recvtimeout(s->Conn, originalTimeout);
return NTLSTATUS_CANCELLED;
@@ -510,7 +523,7 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
uint32_t originalTimeout = s->ReceiveTimeoutMs;
uint32_t elapsed = 0;
for (;;) {
while (true) {
if (LwipSocketCancelRequested(cancelRequested)) {
netconn_set_recvtimeout(s->Conn, originalTimeout);
return NTLSTATUS_CANCELLED;
@@ -778,7 +791,7 @@ static KSTATUS LwipStackInitialize(const NTL_DDK* ddk) {
return st;
tcpip_init(LwipInitDone, done);
st = KeWaitSemaphore(done);
st = KeWaitSemaphore(done, KE_WAIT_INFINITE);
ObDereferenceObject(&done->Header);
if (!KSUCCESS(st))
return st;
@@ -826,7 +839,7 @@ static KSTATUS LwipProviderAttachDevice(NET_DEVICE* device) {
err_t err = tcpip_callback(LwipAttachCallback, &ctx);
if (err == ERR_OK)
st = KeWaitSemaphore(done);
st = KeWaitSemaphore(done, KE_WAIT_INFINITE);
else
st = NTLSTATUS_FAILURE;
@@ -1135,7 +1148,7 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
return LwipErrToStatus(err);
}
for (;;) {
while (true) {
if (LwipSocketCancelRequested(cancelRequested)) {
(void)netconn_close(s->Conn);
s->ShutdownRead = 1;
@@ -1595,6 +1608,51 @@ static KSTATUS LwipProviderShutdown(void* socket, uint32_t how) {
return LwipErrToStatus(err);
}
// Releases one resolver owner and destroys the request after the final callback or waiter leaves.
static void LwipResolveRelease(LWIP_RESOLVE_CONTEXT* context) {
if (!context)
return;
if (_InterlockedDecrement(&context->References) != 0)
return;
if (context->Done)
ObDereferenceObject(&context->Done->Header);
MmFreePool(context);
}
// Completes an asynchronous DNS lookup without retaining the caller's kernel stack.
static void LwipResolveDnsDoneCallback(const char* name, const ip_addr_t* address, void* argument) {
LWIP_RESOLVE_CONTEXT* context = (LWIP_RESOLVE_CONTEXT*)argument;
(void)name;
if (address) {
context->Address = *address;
context->Result = ERR_OK;
} else {
context->Result = ERR_VAL;
}
KeSignalSemaphore(context->Done);
LwipResolveRelease(context);
}
// Starts one DNS lookup in the tcpip thread and transfers its resolver reference to the callback.
static void LwipResolveStartCallback(void* argument) {
LWIP_RESOLVE_CONTEXT* context = (LWIP_RESOLVE_CONTEXT*)argument;
err_t err = dns_gethostbyname_addrtype(context->Name,
&context->Address,
LwipResolveDnsDoneCallback,
context,
context->DnsType);
context->Result = err;
if (err == ERR_INPROGRESS)
return;
KeSignalSemaphore(context->Done);
LwipResolveRelease(context);
}
// Implements the provider Resolve Host operation.
static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SOCKET_ADDRESS_K* addressOut) {
if (!name || !addressOut)
@@ -1610,10 +1668,48 @@ static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SO
else
return NTLSTATUS_NOT_SUPPORTED;
ip_addr_t resolved;
err_t err = netconn_gethostbyname_addrtype(name, &resolved, dnsType);
if (err != ERR_OK)
return LwipErrToStatus(err);
size_t nameLength = strlen(name);
if (nameLength == 0 || nameLength >= DNS_MAX_NAME_LENGTH)
return NTLSTATUS_INVALID_PARAMETER;
LWIP_RESOLVE_CONTEXT* context =
(LWIP_RESOLVE_CONTEXT*)MmAllocatePool(sizeof(*context));
if (!context)
return NTLSTATUS_NO_MEMORY;
memset(context, 0, sizeof(*context));
memcpy(context->Name, name, nameLength + 1);
context->References = 2;
context->Result = ERR_INPROGRESS;
context->DnsType = dnsType;
KSTATUS status = KeSemaphoreCreate(0, 1, &context->Done);
if (!KSUCCESS(status)) {
MmFreePool(context);
return status;
}
err_t queueError = tcpip_try_callback(LwipResolveStartCallback, context);
if (queueError != ERR_OK) {
LwipResolveRelease(context);
LwipResolveRelease(context);
return LwipErrToStatus(queueError);
}
status = KeWaitSemaphore(context->Done, KE_WAIT_INFINITE);
if (!KSUCCESS(status)) {
DbgPrint("lwIP: resolve waiter left name=%s status=0x%x; DNS request remains active\n",
context->Name,
status);
LwipResolveRelease(context);
return status;
}
err_t result = context->Result;
ip_addr_t resolved = context->Address;
LwipResolveRelease(context);
if (result != ERR_OK)
return LwipErrToStatus(result);
if ((family == SYS_AF_INET && !IP_IS_V4(&resolved)) ||
(family == SYS_AF_INET6 && !IP_IS_V6(&resolved)))
return NTLSTATUS_NOT_FOUND;
+14 -23
View File
@@ -117,19 +117,14 @@ u32_t sys_arch_sem_wait(sys_sem_t* sem, u32_t timeout) {
u32_t start = sys_now();
if (timeout == 0) {
KSTATUS st = KeWaitSemaphore((*sem)->Sem);
KSTATUS st = KeWaitSemaphore((*sem)->Sem, KE_WAIT_INFINITE);
return KSUCCESS(st) ? (u32_t)(sys_now() - start) : SYS_ARCH_TIMEOUT;
}
for (;;) {
if (KSUCCESS(KeTrySemaphore((*sem)->Sem)))
return (u32_t)(sys_now() - start);
if ((u32_t)(sys_now() - start) >= timeout)
return SYS_ARCH_TIMEOUT;
KeYield();
}
KSTATUS status = KeWaitSemaphore((*sem)->Sem, timeout);
return KSUCCESS(status)
? (u32_t)(sys_now() - start)
: SYS_ARCH_TIMEOUT;
}
// Implements the sys sem free operation.
@@ -165,7 +160,7 @@ err_t sys_mutex_new(sys_mutex_t* mutex) {
// Implements the sys mutex lock operation.
void sys_mutex_lock(sys_mutex_t* mutex) {
if (mutex && *mutex && (*mutex)->Sem)
(void)KeWaitSemaphore((*mutex)->Sem);
(void)KeWaitSemaphore((*mutex)->Sem, KE_WAIT_INFINITE);
}
// Implements the sys mutex unlock operation.
@@ -279,28 +274,23 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t* mbox, void** msg, u32_t timeout) {
u32_t start = sys_now();
if (timeout == 0) {
KSTATUS st = KeWaitSemaphore((*mbox)->Items);
KSTATUS st = KeWaitSemaphore((*mbox)->Items, KE_WAIT_INFINITE);
if (!KSUCCESS(st))
return SYS_ARCH_TIMEOUT;
return LwipMboxPopAfterItem(mbox, msg, (u32_t)(sys_now() - start));
}
for (;;) {
if (KSUCCESS(KeTrySemaphore((*mbox)->Items)))
return LwipMboxPopAfterItem(mbox, msg, (u32_t)(sys_now() - start));
if ((u32_t)(sys_now() - start) >= timeout)
return SYS_ARCH_TIMEOUT;
KeYield();
}
KSTATUS status = KeWaitSemaphore((*mbox)->Items, timeout);
if (!KSUCCESS(status))
return SYS_ARCH_TIMEOUT;
return LwipMboxPopAfterItem(mbox, msg, (u32_t)(sys_now() - start));
}
u32_t sys_arch_mbox_tryfetch(sys_mbox_t* mbox, void** msg) {
if (!mbox || !*mbox || !(*mbox)->Valid)
return SYS_MBOX_EMPTY;
if (!KSUCCESS(KeTrySemaphore((*mbox)->Items)))
if (!KSUCCESS(KeWaitSemaphore((*mbox)->Items, 0)))
return SYS_MBOX_EMPTY;
return LwipMboxPopAfterItem(mbox, msg, 0);
@@ -347,9 +337,10 @@ sys_thread_t sys_thread_new(const char* name, lwip_thread_fn thread, void* arg,
// function pointer that lwIP supplied, with exactly the argument it supplied.
THREAD* t = 0;
const KE_THREAD_CREATE_PARAMETERS parameters = KE_THREAD_CREATE_NORMAL(kp);
KSTATUS st = KeCreateKernelThread((uintptr_t)thread,
(uintptr_t)arg,
kp,
&parameters,
&t);
if (!KSUCCESS(st))
KePanic(KE_PANIC_CODE_DRIVER, "lwIP: failed to create kernel thread: 0x%x\n", st);