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
+46
-46
@@ -51,11 +51,11 @@ static void NetIrpStatsComplete(KSTATUS status, bool asynchronous) {
|
||||
else
|
||||
gNetIrpStats.CompletedSynchronously++;
|
||||
|
||||
if (status == STATUS_CANCELLED)
|
||||
if (status == NTLSTATUS_CANCELLED)
|
||||
gNetIrpStats.Cancelled++;
|
||||
else if (status == STATUS_WOULD_BLOCK)
|
||||
else if (status == NTLSTATUS_WOULD_BLOCK)
|
||||
gNetIrpStats.WouldBlock++;
|
||||
else if (status == STATUS_TIMEOUT)
|
||||
else if (status == NTLSTATUS_TIMEOUT)
|
||||
gNetIrpStats.Timeout++;
|
||||
else if (KFAILED(status))
|
||||
gNetIrpStats.Failed++;
|
||||
@@ -193,7 +193,7 @@ static void NetAsyncSocketRequestCleanup(IO_ASYNC_REQUEST_OBJECT* async, void* c
|
||||
static KSTATUS NetCancelAsyncSocketRequest(IO_ASYNC_REQUEST_OBJECT* async, void* context) {
|
||||
(void)context;
|
||||
if (!async)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
NetIrpStatsCancelRequested();
|
||||
|
||||
@@ -206,19 +206,19 @@ static KSTATUS NetCancelAsyncSocketRequest(IO_ASYNC_REQUEST_OBJECT* async, void*
|
||||
IoAsyncRequestSetState(async, IoAsyncRequestCancelled);
|
||||
KeReleaseSpinlock(&gAsyncSocketQueueLock, flags);
|
||||
|
||||
IoCompleteAsyncRequest(async, STATUS_CANCELLED, 0);
|
||||
IoCompleteAsyncRequest(async, NTLSTATUS_CANCELLED, 0);
|
||||
ObDereferenceObject(&async->Header);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (state == IoAsyncRequestRunning) {
|
||||
IoAsyncRequestRequestCancel(async);
|
||||
KeReleaseSpinlock(&gAsyncSocketQueueLock, flags);
|
||||
return STATUS_PENDING;
|
||||
return NTLSTATUS_PENDING;
|
||||
}
|
||||
|
||||
KeReleaseSpinlock(&gAsyncSocketQueueLock, flags);
|
||||
return STATUS_OBJECT_DEAD;
|
||||
return NTLSTATUS_OBJECT_DEAD;
|
||||
}
|
||||
|
||||
// Removes one queued async socket request for the worker.
|
||||
@@ -256,7 +256,7 @@ static size_t NetAsyncSocketPublishAddress(NET_ASYNC_SOCKET_REQUEST_OBJECT* req,
|
||||
static void NetAsyncSocketExecute(NET_ASYNC_SOCKET_REQUEST_OBJECT* req,
|
||||
KSTATUS* statusOut,
|
||||
size_t* informationOut) {
|
||||
KSTATUS status = STATUS_INVALID_PARAMETER;
|
||||
KSTATUS status = NTLSTATUS_INVALID_PARAMETER;
|
||||
size_t information = 0;
|
||||
|
||||
if (!req || !statusOut || !informationOut)
|
||||
@@ -351,7 +351,7 @@ static void NetAsyncSocketExecute(NET_ASYNC_SOCKET_REQUEST_OBJECT* req,
|
||||
status = NetSocketGetOption(req->Socket, req->Option, req->OptionValue, req->OptionValueSize, &actual);
|
||||
if (KSUCCESS(status) && actual && req->UserOptionValue)
|
||||
memcpy(req->UserOptionValue, req->OptionValue, actual);
|
||||
if ((KSUCCESS(status) || status == STATUS_BUFFER_TOO_SMALL) && req->OptionActualSizeOut)
|
||||
if ((KSUCCESS(status) || status == NTLSTATUS_BUFFER_TOO_SMALL) && req->OptionActualSizeOut)
|
||||
*req->OptionActualSizeOut = actual;
|
||||
information = actual;
|
||||
break;
|
||||
@@ -367,7 +367,7 @@ static void NetAsyncSocketExecute(NET_ASYNC_SOCKET_REQUEST_OBJECT* req,
|
||||
}
|
||||
|
||||
default:
|
||||
status = STATUS_INVALID_PARAMETER;
|
||||
status = NTLSTATUS_INVALID_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -390,7 +390,7 @@ static void NetAsyncSocketWorker(void* arg) {
|
||||
if (!req)
|
||||
continue;
|
||||
|
||||
KSTATUS status = STATUS_CANCELLED;
|
||||
KSTATUS status = NTLSTATUS_CANCELLED;
|
||||
size_t information = 0;
|
||||
if (!IoAsyncRequestIsCancelRequested(&req->Async) &&
|
||||
IoAsyncRequestGetState(&req->Async) != IoAsyncRequestCancelled) {
|
||||
@@ -409,13 +409,13 @@ static KSTATUS NetEnsureAsyncSocketWorkerStarted(void) {
|
||||
uintptr_t flags = KeAcquireSpinlock(&gAsyncSocketInitLock);
|
||||
if (gAsyncSocketInitState == 2) {
|
||||
KeReleaseSpinlock(&gAsyncSocketInitLock, flags);
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
if (gAsyncSocketInitState == 1) {
|
||||
KeReleaseSpinlock(&gAsyncSocketInitLock, flags);
|
||||
while (gAsyncSocketInitState == 1)
|
||||
KeYield();
|
||||
return (gAsyncSocketInitState == 2) ? STATUS_SUCCESS : STATUS_FAILURE;
|
||||
return (gAsyncSocketInitState == 2) ? NTLSTATUS_SUCCESS : NTLSTATUS_FAILURE;
|
||||
}
|
||||
|
||||
gAsyncSocketInitState = 1;
|
||||
@@ -445,7 +445,7 @@ KSTATUS NetSocketSubmitAsyncKernel(const NET_ASYNC_SOCKET_SUBMIT* submit,
|
||||
if (requestOut)
|
||||
*requestOut = (NET_ASYNC_SOCKET_REQUEST_OBJECT*)0;
|
||||
if (!submit || !submit->OwnerProcess || !submit->Socket || !submit->Iosb)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
KSTATUS status = NetEnsureAsyncSocketWorkerStarted();
|
||||
if (!KSUCCESS(status))
|
||||
@@ -509,7 +509,7 @@ KSTATUS NetSocketSubmitAsyncKernel(const NET_ASYNC_SOCKET_SUBMIT* submit,
|
||||
*requestOut = req;
|
||||
else
|
||||
ObDereferenceObject(&req->Async.Header);
|
||||
return STATUS_PENDING;
|
||||
return NTLSTATUS_PENDING;
|
||||
}
|
||||
|
||||
// Returns the object header embedded in a socket async request.
|
||||
@@ -522,12 +522,12 @@ static KSTATUS NetSubmitSocketIrp(const NET_STACK_PROVIDER* provider,
|
||||
NET_SOCKET_IRP_REQUEST* request,
|
||||
IO_ASYNC_REQUEST_OBJECT* async) {
|
||||
if (!provider || !provider->StackDevice || !request)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (request->Size != sizeof(*request))
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (request->Operation == NetSocketIrpInvalid ||
|
||||
request->Operation >= NetSocketIrpOperationCount)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
request->CancelRequested = async ? &async->CancelRequested : (volatile uint8_t*)0;
|
||||
|
||||
@@ -551,7 +551,7 @@ static KSTATUS NetSubmitSocketIrp(const NET_STACK_PROVIDER* provider,
|
||||
st = IoSubmitIrp(provider->StackDevice, &irp);
|
||||
|
||||
bool asynchronous = false;
|
||||
if (st == STATUS_PENDING) {
|
||||
if (st == NTLSTATUS_PENDING) {
|
||||
asynchronous = true;
|
||||
NetIrpStatsPending();
|
||||
(void)KeWaitForEvent(event, 0);
|
||||
@@ -594,11 +594,11 @@ static KSTATUS NetSocketAllocate(const NET_STACK_PROVIDER* provider,
|
||||
uint32_t protocol,
|
||||
SOCKET_OBJECT** out) {
|
||||
if (!provider || !providerSocket || !out)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
SOCKET_OBJECT* socket = (SOCKET_OBJECT*)ObAllocateObject(ObjectTypeSocket, sizeof(SOCKET_OBJECT));
|
||||
if (!socket)
|
||||
return STATUS_NO_MEMORY;
|
||||
return NTLSTATUS_NO_MEMORY;
|
||||
|
||||
socket->Header.Destroy = NetSocketDestroy;
|
||||
socket->Provider = provider;
|
||||
@@ -607,7 +607,7 @@ static KSTATUS NetSocketAllocate(const NET_STACK_PROVIDER* provider,
|
||||
socket->Type = type;
|
||||
socket->Protocol = protocol;
|
||||
*out = socket;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Returns the provider and provider-private state behind a live socket object.
|
||||
@@ -615,24 +615,24 @@ static KSTATUS NetSocketGetProviderSocket(SOCKET_OBJECT* socket,
|
||||
const NET_STACK_PROVIDER** providerOut,
|
||||
void** providerSocketOut) {
|
||||
if (!socket || !providerOut || !providerSocketOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!socket->Provider || !socket->ProviderSocket)
|
||||
return STATUS_OBJECT_DEAD;
|
||||
return NTLSTATUS_OBJECT_DEAD;
|
||||
|
||||
*providerOut = socket->Provider;
|
||||
*providerSocketOut = socket->ProviderSocket;
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Creates a socket by submitting a create request to the active stack device.
|
||||
KSTATUS NetSocketCreate(uint32_t domain, uint32_t type, uint32_t protocol, SOCKET_OBJECT** out) {
|
||||
if (!out)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
*out = NULL;
|
||||
|
||||
const NET_STACK_PROVIDER* provider = NetGetStackProvider();
|
||||
if (!provider)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
|
||||
void* providerSocket = NULL;
|
||||
NET_SOCKET_IRP_REQUEST request;
|
||||
@@ -648,7 +648,7 @@ KSTATUS NetSocketCreate(uint32_t domain, uint32_t type, uint32_t protocol, SOCKE
|
||||
if (!KSUCCESS(st))
|
||||
return st;
|
||||
if (!providerSocket)
|
||||
return STATUS_FAILURE;
|
||||
return NTLSTATUS_FAILURE;
|
||||
|
||||
st = NetSocketAllocate(provider, providerSocket, domain, type, protocol, out);
|
||||
if (!KSUCCESS(st))
|
||||
@@ -696,7 +696,7 @@ KSTATUS NetSocketAccept(SOCKET_OBJECT* socket, SOCKET_OBJECT** acceptedOut,
|
||||
SYS_SOCKET_ADDRESS_K* remoteOut,
|
||||
IO_ASYNC_REQUEST_OBJECT* async) {
|
||||
if (!acceptedOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
*acceptedOut = NULL;
|
||||
|
||||
const NET_STACK_PROVIDER* provider = NULL;
|
||||
@@ -718,7 +718,7 @@ KSTATUS NetSocketAccept(SOCKET_OBJECT* socket, SOCKET_OBJECT** acceptedOut,
|
||||
if (!KSUCCESS(st))
|
||||
return st;
|
||||
if (!acceptedProviderSocket)
|
||||
return STATUS_FAILURE;
|
||||
return NTLSTATUS_FAILURE;
|
||||
|
||||
st = NetSocketAllocate(provider,
|
||||
acceptedProviderSocket,
|
||||
@@ -757,9 +757,9 @@ KSTATUS NetSocketSend(SOCKET_OBJECT* socket, const void* buffer, size_t length,
|
||||
if (sentOut)
|
||||
*sentOut = 0;
|
||||
if (!buffer && length)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (length > NET_SOCKET_IO_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
const NET_STACK_PROVIDER* provider = NULL;
|
||||
void* providerSocket = NULL;
|
||||
@@ -786,9 +786,9 @@ KSTATUS NetSocketReceive(SOCKET_OBJECT* socket, void* buffer, size_t length,
|
||||
if (receivedOut)
|
||||
*receivedOut = 0;
|
||||
if (!buffer && length)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (length > NET_SOCKET_IO_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
const NET_STACK_PROVIDER* provider = NULL;
|
||||
void* providerSocket = NULL;
|
||||
@@ -815,13 +815,13 @@ KSTATUS NetSocketSendTo(SOCKET_OBJECT* socket, const void* buffer, size_t length
|
||||
if (sentOut)
|
||||
*sentOut = 0;
|
||||
if (!buffer && length)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (socket && socket->Type == SYS_SOCK_DGRAM && length > NET_SOCKET_UDP_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (socket && socket->Type == SYS_SOCK_RAW && length > NET_SOCKET_RAW_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (socket && socket->Type != SYS_SOCK_DGRAM && socket->Type != SYS_SOCK_RAW)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
const NET_STACK_PROVIDER* provider = NULL;
|
||||
void* providerSocket = NULL;
|
||||
@@ -850,13 +850,13 @@ KSTATUS NetSocketReceiveFrom(SOCKET_OBJECT* socket, void* buffer, size_t length,
|
||||
if (receivedOut)
|
||||
*receivedOut = 0;
|
||||
if (!buffer && length)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (socket && socket->Type == SYS_SOCK_DGRAM && length > NET_SOCKET_UDP_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (socket && socket->Type == SYS_SOCK_RAW && length > NET_SOCKET_RAW_MAX_BYTES)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (socket && socket->Type != SYS_SOCK_DGRAM && socket->Type != SYS_SOCK_RAW)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
const NET_STACK_PROVIDER* provider = NULL;
|
||||
void* providerSocket = NULL;
|
||||
@@ -937,7 +937,7 @@ KSTATUS NetSocketGetOption(SOCKET_OBJECT* socket, uint32_t option, void* value,
|
||||
// Polls socket readiness through the stack device IRP path.
|
||||
KSTATUS NetSocketPoll(SOCKET_OBJECT* socket, uint32_t events, uint32_t* returnedEventsOut) {
|
||||
if (!returnedEventsOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
*returnedEventsOut = 0;
|
||||
|
||||
const NET_STACK_PROVIDER* provider = NULL;
|
||||
@@ -959,11 +959,11 @@ KSTATUS NetSocketPoll(SOCKET_OBJECT* socket, uint32_t events, uint32_t* returned
|
||||
// Resolves a host name through the stack device IRP path.
|
||||
KSTATUS NetResolveHost(const char* name, uint32_t family, SYS_SOCKET_ADDRESS_K* addressOut) {
|
||||
if (!name || !addressOut)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
const NET_STACK_PROVIDER* provider = NetGetStackProvider();
|
||||
if (!provider)
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
return NTLSTATUS_NOT_SUPPORTED;
|
||||
|
||||
NET_SOCKET_IRP_REQUEST request;
|
||||
memset(&request, 0, sizeof(request));
|
||||
|
||||
Reference in new issue
Block a user