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

+172 -172
View File
@@ -134,21 +134,21 @@ static NET_STACK_PROVIDER gLwipProvider = {
// Implements the err To Status operation.
static KSTATUS LwipErrToStatus(err_t err) {
switch (err) {
case ERR_OK: return STATUS_SUCCESS;
case ERR_MEM: return STATUS_NO_MEMORY;
case ERR_BUF: return STATUS_BUFFER_TOO_SMALL;
case ERR_TIMEOUT: return STATUS_TIMEOUT;
case ERR_WOULDBLOCK:return STATUS_WOULD_BLOCK;
case ERR_RTE: return STATUS_NOT_FOUND;
case ERR_VAL: return STATUS_INVALID_PARAMETER;
case ERR_ARG: return STATUS_INVALID_PARAMETER;
case ERR_USE: return STATUS_ALREADY_EXISTS;
case ERR_ISCONN: return STATUS_ALREADY_EXISTS;
case ERR_CONN: return STATUS_OBJECT_DEAD;
case ERR_CLSD: return STATUS_OBJECT_DEAD;
case ERR_ABRT: return STATUS_OBJECT_DEAD;
case ERR_RST: return STATUS_OBJECT_DEAD;
default: return STATUS_FAILURE;
case ERR_OK: return NTLSTATUS_SUCCESS;
case ERR_MEM: return NTLSTATUS_NO_MEMORY;
case ERR_BUF: return NTLSTATUS_BUFFER_TOO_SMALL;
case ERR_TIMEOUT: return NTLSTATUS_TIMEOUT;
case ERR_WOULDBLOCK:return NTLSTATUS_WOULD_BLOCK;
case ERR_RTE: return NTLSTATUS_NOT_FOUND;
case ERR_VAL: return NTLSTATUS_INVALID_PARAMETER;
case ERR_ARG: return NTLSTATUS_INVALID_PARAMETER;
case ERR_USE: return NTLSTATUS_ALREADY_EXISTS;
case ERR_ISCONN: return NTLSTATUS_ALREADY_EXISTS;
case ERR_CONN: return NTLSTATUS_OBJECT_DEAD;
case ERR_CLSD: return NTLSTATUS_OBJECT_DEAD;
case ERR_ABRT: return NTLSTATUS_OBJECT_DEAD;
case ERR_RST: return NTLSTATUS_OBJECT_DEAD;
default: return NTLSTATUS_FAILURE;
}
}
@@ -199,36 +199,36 @@ static KSTATUS LwipGetSettingIpv4(const char* section, const char* key,
ip4_addr_t* out, int required) {
char value[LWIP_SETTINGS_VALUE_MAX];
KSTATUS st = KeGetSettingString(section, key, value, sizeof(value));
if (st == STATUS_NOT_FOUND && !required)
return STATUS_NOT_FOUND;
if (st == NTLSTATUS_NOT_FOUND && !required)
return NTLSTATUS_NOT_FOUND;
if (!KSUCCESS(st))
return st;
if (!LwipParseIpv4(value, out)) {
DbgPrint("lwIP: invalid IPv4 setting [%s] %s=%s\n", section, key, value);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
static KSTATUS LwipGetSettingIpv6(const char* section, const char* key,
ip6_addr_t* out, int required) {
char value[LWIP_SETTINGS_VALUE_MAX];
KSTATUS st = KeGetSettingString(section, key, value, sizeof(value));
if (st == STATUS_NOT_FOUND && !required)
return STATUS_NOT_FOUND;
if (st == NTLSTATUS_NOT_FOUND && !required)
return NTLSTATUS_NOT_FOUND;
if (!KSUCCESS(st))
return st;
if (!ip6addr_aton(value, out)) {
DbgPrint("lwIP: invalid IPv6 setting [%s] %s=%s\n", section, key, value);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
static KSTATUS LwipLoadIpv6Config(const char* section, LWIP_NETIF_CONFIG* cfg) {
char mode[LWIP_SETTINGS_VALUE_MAX];
KSTATUS st = KeGetSettingString(section, "ipv6", mode, sizeof(mode));
if (st == STATUS_NOT_FOUND) {
if (st == NTLSTATUS_NOT_FOUND) {
cfg->EnableIpv6 = 1;
cfg->Ipv6Autoconfig = 1;
} else if (!KSUCCESS(st)) {
@@ -246,40 +246,40 @@ static KSTATUS LwipLoadIpv6Config(const char* section, LWIP_NETIF_CONFIG* cfg) {
return st;
} else {
DbgPrint("lwIP: invalid IPv6 mode [%s] ipv6=%s\n", section, mode);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
if (!cfg->EnableIpv6)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
st = LwipGetSettingIpv6(section, "dns6", &cfg->Dns6, 0);
if (KSUCCESS(st))
cfg->HasDns6 = 1;
else if (st != STATUS_NOT_FOUND)
else if (st != NTLSTATUS_NOT_FOUND)
return st;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Copies section Name.
static KSTATUS LwipCopySectionName(char* out, size_t outSize, const char* prefix, const char* name) {
if (!out || !outSize || !prefix || !name)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
size_t prefixLen = strlen(prefix);
size_t nameLen = strlen(name);
if (prefixLen + nameLen + 1 > outSize)
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
memcpy(out, prefix, prefixLen);
memcpy(out + prefixLen, name, nameLen + 1);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Loads config From Section.
static KSTATUS LwipLoadConfigFromSection(const char* section, LWIP_NETIF_CONFIG* cfg) {
if (!section || !cfg)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
char mode[LWIP_SETTINGS_VALUE_MAX];
KSTATUS st = KeGetSettingString(section, "mode", mode, sizeof(mode));
@@ -289,7 +289,7 @@ static KSTATUS LwipLoadConfigFromSection(const char* section, LWIP_NETIF_CONFIG*
memset(cfg, 0, sizeof(*cfg));
size_t sectionLen = strlen(section);
if (sectionLen >= sizeof(cfg->Section))
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
memcpy(cfg->Section, section, sectionLen + 1);
if (strcmp(mode, "static") == 0) {
@@ -311,19 +311,19 @@ static KSTATUS LwipLoadConfigFromSection(const char* section, LWIP_NETIF_CONFIG*
st = LwipGetSettingIpv4(section, "dns", &cfg->Dns4, 0);
if (KSUCCESS(st))
cfg->HasDns4 = 1;
else if (st != STATUS_NOT_FOUND)
else if (st != NTLSTATUS_NOT_FOUND)
return st;
return LwipLoadIpv6Config(section, cfg);
}
DbgPrint("lwIP: invalid network mode [%s] mode=%s\n", section, mode);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
// Loads netif Config.
static KSTATUS LwipLoadNetifConfig(const NET_DEVICE* device, LWIP_NETIF_CONFIG* cfg) {
if (!device || !cfg)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
char section[64];
KSTATUS st = LwipCopySectionName(section, sizeof(section),
@@ -333,9 +333,9 @@ static KSTATUS LwipLoadNetifConfig(const NET_DEVICE* device, LWIP_NETIF_CONFIG*
st = LwipLoadConfigFromSection(section, cfg);
if (KSUCCESS(st))
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if (st != STATUS_NOT_FOUND) {
if (st != NTLSTATUS_NOT_FOUND) {
DbgPrint("lwIP: invalid settings for [%s] (0x%x)\n", section, st);
return st;
}
@@ -347,13 +347,13 @@ static KSTATUS LwipLoadNetifConfig(const NET_DEVICE* device, LWIP_NETIF_CONFIG*
return st;
}
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the socket Lock operation.
static KSTATUS LwipSocketLock(LWIP_PROVIDER_SOCKET* s) {
if (!s || !s->Lock)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
return KeWaitSemaphore(s->Lock);
}
@@ -407,12 +407,12 @@ static void LwipSocketCallback(struct netconn* conn, enum netconn_evt evt, u16_t
static KSTATUS LwipSocketAllocateWithConn(uint32_t domain, uint32_t type, uint32_t protocol,
struct netconn* conn, LWIP_PROVIDER_SOCKET** out) {
if (!conn || !out)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
*out = NULL;
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)MmAllocatePool(sizeof(*s));
if (!s)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
memset(s, 0, sizeof(*s));
KSTATUS st = KeSemaphoreCreate(1, 1, &s->Lock);
@@ -430,7 +430,7 @@ static KSTATUS LwipSocketAllocateWithConn(uint32_t domain, uint32_t type, uint32
netconn_set_recvtimeout(conn, 0);
netconn_set_sendtimeout(conn, 0);
*out = s;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
@@ -452,13 +452,13 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
volatile uint8_t* cancelRequested,
err_t* errOut) {
if (!s || !s->Conn || !bufferOut || !errOut)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
*bufferOut = NULL;
*errOut = ERR_OK;
if (!cancelRequested || s->NonBlocking) {
*errOut = netconn_recv(s->Conn, bufferOut);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
uint32_t originalTimeout = s->ReceiveTimeoutMs;
@@ -466,7 +466,7 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
for (;;) {
if (LwipSocketCancelRequested(cancelRequested)) {
netconn_set_recvtimeout(s->Conn, originalTimeout);
return STATUS_CANCELLED;
return NTLSTATUS_CANCELLED;
}
uint32_t remaining = 0;
@@ -474,7 +474,7 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
if (elapsed >= originalTimeout) {
netconn_set_recvtimeout(s->Conn, originalTimeout);
*errOut = ERR_TIMEOUT;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
remaining = originalTimeout - elapsed;
}
@@ -485,7 +485,7 @@ static KSTATUS LwipSocketWaitRecvNetbuf(LWIP_PROVIDER_SOCKET* s,
if (err != ERR_TIMEOUT) {
netconn_set_recvtimeout(s->Conn, originalTimeout);
*errOut = err;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
elapsed += slice;
@@ -498,13 +498,13 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
volatile uint8_t* cancelRequested,
err_t* errOut) {
if (!s || !s->Conn || !acceptedOut || !errOut)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
*acceptedOut = NULL;
*errOut = ERR_OK;
if (!cancelRequested || s->NonBlocking) {
*errOut = netconn_accept(s->Conn, acceptedOut);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
uint32_t originalTimeout = s->ReceiveTimeoutMs;
@@ -512,7 +512,7 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
for (;;) {
if (LwipSocketCancelRequested(cancelRequested)) {
netconn_set_recvtimeout(s->Conn, originalTimeout);
return STATUS_CANCELLED;
return NTLSTATUS_CANCELLED;
}
uint32_t remaining = 0;
@@ -520,7 +520,7 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
if (elapsed >= originalTimeout) {
netconn_set_recvtimeout(s->Conn, originalTimeout);
*errOut = ERR_TIMEOUT;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
remaining = originalTimeout - elapsed;
}
@@ -531,7 +531,7 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
if (err != ERR_TIMEOUT) {
netconn_set_recvtimeout(s->Conn, originalTimeout);
*errOut = err;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
elapsed += slice;
@@ -539,9 +539,9 @@ static KSTATUS LwipSocketWaitAccept(LWIP_PROVIDER_SOCKET* s,
}
static int LwipSocketAddressValid(const SYS_SOCKET_ADDRESS_K* address, size_t addressSize) {
if (!address || addressSize < sizeof(SYS_SOCKET_ADDRESS_K))
if (!address || addressSize != sizeof(SYS_SOCKET_ADDRESS_K))
return 0;
if (address->Size < sizeof(SYS_SOCKET_ADDRESS_K))
if (address->Size != sizeof(SYS_SOCKET_ADDRESS_K))
return 0;
return address->Family == SYS_AF_INET || address->Family == SYS_AF_INET6;
}
@@ -559,10 +559,10 @@ static int LwipSocketFamilyMatches(const LWIP_PROVIDER_SOCKET* s, const SYS_SOCK
// Implements the socket Make Ip operation.
static KSTATUS LwipSocketMakeIp(const SYS_SOCKET_ADDRESS_K* address, ip_addr_t* out) {
if (!address || !out)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (address->Family == SYS_AF_INET) {
IP_ADDR4(out, address->Address[0], address->Address[1], address->Address[2], address->Address[3]);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
if (address->Family == SYS_AF_INET6) {
uint32_t a0 = ((uint32_t)address->Address[0] << 24) | ((uint32_t)address->Address[1] << 16) |
@@ -575,9 +575,9 @@ static KSTATUS LwipSocketMakeIp(const SYS_SOCKET_ADDRESS_K* address, ip_addr_t*
((uint32_t)address->Address[14] << 8) | (uint32_t)address->Address[15];
IP_ADDR6_HOST(out, a0, a1, a2, a3);
ip6_addr_set_zone(ip_2_ip6(out), (u8_t)address->ScopeId);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
// Implements the socket Fill Address operation.
@@ -756,9 +756,9 @@ static void LwipInitDone(void* arg) {
// Implements the stack Initialize operation.
static KSTATUS LwipStackInitialize(const HAL_API* hal) {
if (gLwipInitialized)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if (!hal || !hal->Timer.QueryTicks)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
LwipPortSetTimerQuery(hal->Timer.QueryTicks);
@@ -775,24 +775,24 @@ static KSTATUS LwipStackInitialize(const HAL_API* hal) {
gLwipInitialized = 1;
DbgPrint("lwIP: tcpip thread initialized\n");
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Attach Device operation.
static KSTATUS LwipProviderAttachDevice(NET_DEVICE* device) {
if (!gLwipInitialized)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (!device || device->Index >= LWIP_MAX_NETIFS)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (device->HardwareAddressLength != NET_ETHERNET_ADDRESS_LENGTH)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (gBindings[device->Index])
return STATUS_ALREADY_EXISTS;
return NTLSTATUS_ALREADY_EXISTS;
LWIP_BINDING* b = (LWIP_BINDING*)MmAllocatePool(sizeof(*b));
if (!b)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
memset(b, 0, sizeof(*b));
b->Device = device;
@@ -818,13 +818,13 @@ static KSTATUS LwipProviderAttachDevice(NET_DEVICE* device) {
if (err == ERR_OK)
st = KeWaitSemaphore(done);
else
st = STATUS_FAILURE;
st = NTLSTATUS_FAILURE;
ObDereferenceObject(&done->Header);
if (!KSUCCESS(st) || ctx.Result != ERR_OK) {
MmFreePool(b);
return KSUCCESS(st) ? STATUS_FAILURE : st;
return KSUCCESS(st) ? NTLSTATUS_FAILURE : st;
}
gBindings[device->Index] = b;
@@ -834,79 +834,79 @@ static KSTATUS LwipProviderAttachDevice(NET_DEVICE* device) {
b->Config.Section,
b->Config.UseDhcp ? "dhcp" : "static",
b->Config.EnableIpv6 ? (b->Config.HasStaticIpv6 ? "static" : "auto") : "off");
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Receive Frame operation.
static KSTATUS LwipProviderReceiveFrame(NET_DEVICE* device, const void* frame, size_t length) {
if (!gLwipInitialized)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (!device || device->Index >= LWIP_MAX_NETIFS || !frame)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
LWIP_BINDING* b = gBindings[device->Index];
if (!b || !b->Attached)
return STATUS_NOT_FOUND;
return NTLSTATUS_NOT_FOUND;
if (length < NET_ETHERNET_HEADER_LENGTH || length > NET_ETHERNET_MAX_FRAME)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
struct pbuf* p = pbuf_alloc(PBUF_RAW, (u16_t)length, PBUF_POOL);
if (!p)
p = pbuf_alloc(PBUF_RAW, (u16_t)length, PBUF_RAM);
if (!p)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
if (pbuf_take(p, frame, (u16_t)length) != ERR_OK) {
pbuf_free(p);
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
}
err_t err = b->Netif.input(p, &b->Netif);
if (err != ERR_OK) {
pbuf_free(p);
return STATUS_FAILURE;
return NTLSTATUS_FAILURE;
}
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Socket Create operation.
static KSTATUS LwipProviderSocketCreate(uint32_t domain, uint32_t type, uint32_t protocol, void** outSocket) {
if (!outSocket)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
*outSocket = NULL;
if (!gLwipInitialized)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (domain != SYS_AF_INET && domain != SYS_AF_INET6)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
int ipv6 = domain == SYS_AF_INET6;
enum netconn_type netconnType;
u8_t rawProtocol = 0;
if (type == SYS_SOCK_STREAM) {
if (protocol != 0 && protocol != SYS_IPPROTO_TCP)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
netconnType = ipv6 ? NETCONN_TCP_IPV6 : NETCONN_TCP;
protocol = SYS_IPPROTO_TCP;
} else if (type == SYS_SOCK_DGRAM) {
if (protocol != 0 && protocol != SYS_IPPROTO_UDP)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
netconnType = ipv6 ? NETCONN_UDP_IPV6 : NETCONN_UDP;
protocol = SYS_IPPROTO_UDP;
} else if (type == SYS_SOCK_RAW) {
if ((!ipv6 && protocol != SYS_IPPROTO_ICMP) || (ipv6 && protocol != SYS_IPPROTO_ICMPV6))
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
netconnType = ipv6 ? NETCONN_RAW_IPV6 : NETCONN_RAW;
rawProtocol = ipv6 ? IP6_NEXTH_ICMP6 : IP_PROTO_ICMP;
} else {
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
struct netconn* conn = netconn_new_with_proto_and_callback(netconnType, rawProtocol, NULL);
if (!conn)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
LWIP_PROVIDER_SOCKET* s = NULL;
KSTATUS st = LwipSocketAllocateWithConn(domain, type, protocol, conn, &s);
@@ -916,7 +916,7 @@ static KSTATUS LwipProviderSocketCreate(uint32_t domain, uint32_t type, uint32_t
}
*outSocket = s;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Socket Close operation.
@@ -950,13 +950,13 @@ static void LwipProviderSocketClose(void* socket) {
static KSTATUS LwipProviderBind(void* socket, const SYS_SOCKET_ADDRESS_K* address, size_t addressSize) {
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
if (!s || !address)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (!LwipSocketAddressValid(address, addressSize))
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
if ((s->Type != SYS_SOCK_STREAM && s->Type != SYS_SOCK_DGRAM) || !s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (!LwipSocketFamilyMatches(s, address))
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -964,7 +964,7 @@ static KSTATUS LwipProviderBind(void* socket, const SYS_SOCKET_ADDRESS_K* addres
if (s->Connected || s->Listening || s->ShutdownRead || s->ShutdownWrite) {
LwipSocketUnlock(s);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
ip_addr_t ip;
@@ -985,9 +985,9 @@ static KSTATUS LwipProviderBind(void* socket, const SYS_SOCKET_ADDRESS_K* addres
static KSTATUS LwipProviderListen(void* socket, uint32_t backlog) {
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
if (!s)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (s->Type != SYS_SOCK_STREAM || !s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (backlog > 255u)
backlog = 255u;
@@ -997,7 +997,7 @@ static KSTATUS LwipProviderListen(void* socket, uint32_t backlog) {
if (s->Connected || s->ShutdownRead || s->ShutdownWrite) {
LwipSocketUnlock(s);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
err_t err = netconn_listen_with_backlog(s->Conn, (u8_t)backlog);
@@ -1014,13 +1014,13 @@ static KSTATUS LwipProviderListen(void* socket, uint32_t backlog) {
static KSTATUS LwipProviderAccept(void* socket, void** acceptedOut, SYS_SOCKET_ADDRESS_K* remoteOut, volatile uint8_t* cancelRequested) {
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
if (!s || !acceptedOut)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
*acceptedOut = NULL;
if (remoteOut)
memset(remoteOut, 0, sizeof(*remoteOut));
if (s->Type != SYS_SOCK_STREAM || !s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -1028,7 +1028,7 @@ static KSTATUS LwipProviderAccept(void* socket, void** acceptedOut, SYS_SOCKET_A
if (!s->Listening || s->ShutdownRead || s->ShutdownWrite) {
LwipSocketUnlock(s);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
struct netconn* acceptedConn = NULL;
@@ -1041,7 +1041,7 @@ static KSTATUS LwipProviderAccept(void* socket, void** acceptedOut, SYS_SOCKET_A
if (err != ERR_OK)
return LwipErrToStatus(err);
if (!acceptedConn)
return STATUS_FAILURE;
return NTLSTATUS_FAILURE;
LWIP_PROVIDER_SOCKET* accepted = NULL;
st = LwipSocketAllocateWithConn(s->Domain, s->Type, s->Protocol, acceptedConn, &accepted);
@@ -1066,20 +1066,20 @@ static KSTATUS LwipProviderAccept(void* socket, void** acceptedOut, SYS_SOCKET_A
}
*acceptedOut = accepted;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Connect operation.
static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* address, size_t addressSize, volatile uint8_t* cancelRequested) {
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
if (!s || !address)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (!LwipSocketAddressValid(address, addressSize))
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
if ((s->Type != SYS_SOCK_STREAM && s->Type != SYS_SOCK_DGRAM) || !s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (!LwipSocketFamilyMatches(s, address))
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -1087,11 +1087,11 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
if (s->Listening) {
LwipSocketUnlock(s);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
if (s->ShutdownRead || s->ShutdownWrite) {
LwipSocketUnlock(s);
return STATUS_OBJECT_DEAD;
return NTLSTATUS_OBJECT_DEAD;
}
ip_addr_t ip;
@@ -1117,7 +1117,7 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
netconn_set_nonblocking(s->Conn, wasNonBlocking || s->NonBlocking);
s->Connected = 1;
LwipSocketUnlock(s);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
if (err != ERR_INPROGRESS) {
netconn_set_nonblocking(s->Conn, wasNonBlocking || s->NonBlocking);
@@ -1132,7 +1132,7 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
s->ShutdownWrite = 1;
netconn_set_nonblocking(s->Conn, wasNonBlocking || s->NonBlocking);
LwipSocketUnlock(s);
return STATUS_CANCELLED;
return NTLSTATUS_CANCELLED;
}
if (s->Conn->state != NETCONN_CONNECT) {
@@ -1141,7 +1141,7 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add
if (err == ERR_OK) {
s->Connected = 1;
LwipSocketUnlock(s);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
LwipSocketUnlock(s);
return LwipErrToStatus(err);
@@ -1161,15 +1161,15 @@ static KSTATUS LwipProviderSend(void* socket, const void* buffer, size_t length,
if (sentOut)
*sentOut = 0;
if (!s || (!buffer && length))
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (flags != 0)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (length > LWIP_PROVIDER_SOCKET_IO_MAX_BYTES)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (length == 0)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if (s->Type != SYS_SOCK_STREAM || !s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -1177,11 +1177,11 @@ static KSTATUS LwipProviderSend(void* socket, const void* buffer, size_t length,
if (s->Listening) {
LwipSocketUnlock(s);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
if (s->ShutdownWrite) {
LwipSocketUnlock(s);
return STATUS_OBJECT_DEAD;
return NTLSTATUS_OBJECT_DEAD;
}
size_t written = 0;
@@ -1236,7 +1236,7 @@ static KSTATUS LwipReceiveFromBuffered(LWIP_PROVIDER_SOCKET* s, uint8_t* out,
if (copiedOut)
*copiedOut = copied;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Receive operation.
@@ -1245,15 +1245,15 @@ static KSTATUS LwipProviderReceive(void* socket, void* buffer, size_t length, ui
if (receivedOut)
*receivedOut = 0;
if (!s || (!buffer && length))
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (flags != 0)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (length > LWIP_PROVIDER_SOCKET_IO_MAX_BYTES)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (length == 0)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if (s->Type != SYS_SOCK_STREAM || !s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -1261,11 +1261,11 @@ static KSTATUS LwipProviderReceive(void* socket, void* buffer, size_t length, ui
if (s->Listening) {
LwipSocketUnlock(s);
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
if (s->ShutdownRead) {
LwipSocketUnlock(s);
return STATUS_OBJECT_DEAD;
return NTLSTATUS_OBJECT_DEAD;
}
size_t copied = 0;
@@ -1288,7 +1288,7 @@ static KSTATUS LwipProviderReceive(void* socket, void* buffer, size_t length, ui
if (receivedOut)
*receivedOut = 0;
LwipSocketUnlock(s);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
if (err != ERR_OK) {
LwipSocketUnlock(s);
@@ -1308,7 +1308,7 @@ static KSTATUS LwipProviderReceive(void* socket, void* buffer, size_t length, ui
*receivedOut = copied;
LwipSocketUnlock(s);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
static KSTATUS LwipProviderSendTo(void* socket, const void* buffer, size_t length, uint32_t flags,
@@ -1317,21 +1317,21 @@ static KSTATUS LwipProviderSendTo(void* socket, const void* buffer, size_t lengt
if (sentOut)
*sentOut = 0;
if (!s || (!buffer && length) || !remote)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (!LwipSocketAddressValid(remote, remoteSize))
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
if (flags != 0)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (s->Type == SYS_SOCK_DGRAM && length > LWIP_PROVIDER_SOCKET_UDP_MAX_BYTES)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (s->Type == SYS_SOCK_RAW && length > LWIP_PROVIDER_SOCKET_RAW_MAX_BYTES)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (!LwipSocketFamilyMatches(s, remote))
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (length == 0)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if ((s->Type != SYS_SOCK_DGRAM && s->Type != SYS_SOCK_RAW) || !s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -1339,13 +1339,13 @@ static KSTATUS LwipProviderSendTo(void* socket, const void* buffer, size_t lengt
if (s->ShutdownWrite) {
LwipSocketUnlock(s);
return STATUS_OBJECT_DEAD;
return NTLSTATUS_OBJECT_DEAD;
}
struct netbuf* nb = netbuf_new();
if (!nb) {
LwipSocketUnlock(s);
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
}
err_t err = netbuf_ref(nb, buffer, (u16_t)length);
@@ -1372,17 +1372,17 @@ static KSTATUS LwipProviderReceiveFrom(void* socket, void* buffer, size_t length
if (receivedOut)
*receivedOut = 0;
if (!s || (!buffer && length))
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (flags != 0)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (s->Type == SYS_SOCK_DGRAM && length > LWIP_PROVIDER_SOCKET_UDP_MAX_BYTES)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (s->Type == SYS_SOCK_RAW && length > LWIP_PROVIDER_SOCKET_RAW_MAX_BYTES)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (length == 0)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
if ((s->Type != SYS_SOCK_DGRAM && s->Type != SYS_SOCK_RAW) || !s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -1390,7 +1390,7 @@ static KSTATUS LwipProviderReceiveFrom(void* socket, void* buffer, size_t length
if (s->ShutdownRead) {
LwipSocketUnlock(s);
return STATUS_OBJECT_DEAD;
return NTLSTATUS_OBJECT_DEAD;
}
struct netbuf* nb = NULL;
@@ -1406,7 +1406,7 @@ static KSTATUS LwipProviderReceiveFrom(void* socket, void* buffer, size_t length
}
if (!nb) {
LwipSocketUnlock(s);
return STATUS_FAILURE;
return NTLSTATUS_FAILURE;
}
size_t copied = 0;
@@ -1448,11 +1448,11 @@ static KSTATUS LwipProviderReceiveFrom(void* socket, void* buffer, size_t length
static KSTATUS LwipProviderSetOption(void* socket, uint32_t option, const void* value, size_t valueSize) {
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
if (!s || !value)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (valueSize != sizeof(uint32_t))
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
if (!s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
uint32_t v = 0;
memcpy(&v, value, sizeof(v));
@@ -1476,11 +1476,11 @@ static KSTATUS LwipProviderSetOption(void* socket, uint32_t option, const void*
break;
default:
LwipSocketUnlock(s);
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
LwipSocketUnlock(s);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Get Option operation.
@@ -1489,11 +1489,11 @@ static KSTATUS LwipProviderGetOption(void* socket, uint32_t option, void* value,
if (actualSizeOut)
*actualSizeOut = sizeof(uint32_t);
if (!s || !value)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (valueSize < sizeof(uint32_t))
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
if (!s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -1512,19 +1512,19 @@ static KSTATUS LwipProviderGetOption(void* socket, uint32_t option, void* value,
break;
default:
LwipSocketUnlock(s);
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
memcpy(value, &v, sizeof(v));
LwipSocketUnlock(s);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Poll operation.
static KSTATUS LwipProviderPoll(void* socket, uint32_t events, uint32_t* returnedEventsOut) {
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
if (!s || !returnedEventsOut)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
uint32_t revents = 0;
KSTATUS st = LwipSocketLock(s);
@@ -1534,7 +1534,7 @@ static KSTATUS LwipProviderPoll(void* socket, uint32_t events, uint32_t* returne
if (!s->Conn) {
*returnedEventsOut = SYS_POLL_INVALID;
LwipSocketUnlock(s);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
err_t lastErr = netconn_err(s->Conn);
@@ -1556,18 +1556,18 @@ static KSTATUS LwipProviderPoll(void* socket, uint32_t events, uint32_t* returne
*returnedEventsOut = revents;
LwipSocketUnlock(s);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the provider Shutdown operation.
static KSTATUS LwipProviderShutdown(void* socket, uint32_t how) {
LWIP_PROVIDER_SOCKET* s = (LWIP_PROVIDER_SOCKET*)socket;
if (!s)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (how != SYS_SHUTDOWN_READ && how != SYS_SHUTDOWN_WRITE && how != SYS_SHUTDOWN_BOTH)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (!s->Conn)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS st = LwipSocketLock(s);
if (!KSUCCESS(st))
@@ -1588,9 +1588,9 @@ static KSTATUS LwipProviderShutdown(void* socket, uint32_t how) {
// Implements the provider Resolve Host operation.
static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SOCKET_ADDRESS_K* addressOut) {
if (!name || !addressOut)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (!gLwipInitialized)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
u8_t dnsType;
if (family == SYS_AF_INET)
@@ -1598,7 +1598,7 @@ static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SO
else if (family == SYS_AF_INET6)
dnsType = NETCONN_DNS_IPV6;
else
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
ip_addr_t resolved;
err_t err = netconn_gethostbyname_addrtype(name, &resolved, dnsType);
@@ -1606,17 +1606,17 @@ static KSTATUS LwipProviderResolveHost(const char* name, uint32_t family, SYS_SO
return LwipErrToStatus(err);
if ((family == SYS_AF_INET && !IP_IS_V4(&resolved)) ||
(family == SYS_AF_INET6 && !IP_IS_V6(&resolved)))
return STATUS_NOT_FOUND;
return NTLSTATUS_NOT_FOUND;
LwipSocketFillAddress(addressOut, &resolved, 0);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Dispatches a provider-private socket request carried by an IRP.
static KSTATUS LwipDispatchSocketRequest(NET_SOCKET_IRP_REQUEST* request) {
if (!request || request->Size != sizeof(*request))
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
switch (request->Operation) {
case NetSocketIrpCreate:
@@ -1626,7 +1626,7 @@ static KSTATUS LwipDispatchSocketRequest(NET_SOCKET_IRP_REQUEST* request) {
request->u.Create.ProviderSocketOut);
case NetSocketIrpClose:
LwipProviderSocketClose(request->u.Close.Socket);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
case NetSocketIrpBind:
return LwipProviderBind(request->u.Bind.Socket,
request->u.Bind.Address,
@@ -1696,7 +1696,7 @@ static KSTATUS LwipDispatchSocketRequest(NET_SOCKET_IRP_REQUEST* request) {
request->u.ResolveHost.Family,
request->u.ResolveHost.AddressOut);
default:
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
}
}
@@ -1705,11 +1705,11 @@ static KSTATUS LwipDispatchInternalDeviceControl(DEVICE_OBJECT* device, IRP* irp
(void)device;
IO_STACK_LOCATION* ios = IoGetCurrentIrpStackLocation(irp);
if (!ios)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (ios->Parameters.DeviceIoControl.IoControlCode != NET_IOCTL_SOCKET)
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
if (ios->Parameters.DeviceIoControl.InputLength < sizeof(NET_SOCKET_IRP_REQUEST))
return STATUS_BUFFER_TOO_SMALL;
return NTLSTATUS_BUFFER_TOO_SMALL;
NET_SOCKET_IRP_REQUEST* request = (NET_SOCKET_IRP_REQUEST*)ios->Parameters.DeviceIoControl.InputBuffer;
return LwipDispatchSocketRequest(request);
@@ -1757,5 +1757,5 @@ KSTATUS DriverEntry(const HAL_API* hal) {
}
DbgPrint("lwIP: driver initialized\n");
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}