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
@@ -82,7 +82,7 @@ __declspec(dllexport) char* realpath(const char* path, char* resolved_path) {
|
||||
&required,
|
||||
};
|
||||
uint32_t status = SysRealPath(&query);
|
||||
if (status != STATUS_SUCCESS) { errno = PosixStatusToErrno(status); return (char*)0; }
|
||||
if (status != NTLSTATUS_SUCCESS) { errno = PosixStatusToErrno(status); return (char*)0; }
|
||||
if (required == 0 || required > SYS_CWD_MAX) { errno = ERANGE; return (char*)0; }
|
||||
|
||||
char nativeResolved[SYS_CWD_MAX];
|
||||
@@ -95,7 +95,7 @@ __declspec(dllexport) char* realpath(const char* path, char* resolved_path) {
|
||||
&required,
|
||||
};
|
||||
status = SysRealPath(&request);
|
||||
if (status != STATUS_SUCCESS) { errno = PosixStatusToErrno(status); return (char*)0; }
|
||||
if (status != NTLSTATUS_SUCCESS) { errno = PosixStatusToErrno(status); return (char*)0; }
|
||||
|
||||
char posix[SYS_CWD_MAX];
|
||||
NativeToPosix(nativeResolved, posix, sizeof(posix));
|
||||
|
||||
@@ -58,7 +58,7 @@ __declspec(dllexport) void* dlopen(const char* filename, int flags) {
|
||||
req.ModuleHandleOut = &handle;
|
||||
|
||||
uint32_t status = SysLoadModule(&req);
|
||||
if (status != STATUS_SUCCESS || handle == 0) {
|
||||
if (status != NTLSTATUS_SUCCESS || handle == 0) {
|
||||
DlSetStatusError("dlopen failed", status);
|
||||
return 0;
|
||||
}
|
||||
@@ -84,7 +84,7 @@ __declspec(dllexport) void* dlsym(void* handle, const char* symbol) {
|
||||
req.AddressOut = &address;
|
||||
|
||||
uint32_t status = SysGetModuleExport(&req);
|
||||
if (status != STATUS_SUCCESS || address == 0) {
|
||||
if (status != NTLSTATUS_SUCCESS || address == 0) {
|
||||
DlSetStatusError("dlsym failed", status);
|
||||
return 0;
|
||||
}
|
||||
@@ -102,7 +102,7 @@ __declspec(dllexport) int dlclose(void* handle) {
|
||||
}
|
||||
|
||||
uint32_t status = SysUnloadModule((uint32_t)(uintptr_t)handle);
|
||||
if (status != STATUS_SUCCESS) {
|
||||
if (status != NTLSTATUS_SUCCESS) {
|
||||
DlSetStatusError("dlclose failed", status);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -9,23 +9,23 @@ int errno = 0;
|
||||
// Implements the status To Errno operation.
|
||||
int PosixStatusToErrno(uint32_t s) {
|
||||
switch (s) {
|
||||
case STATUS_SUCCESS: return 0;
|
||||
case STATUS_NOT_SUPPORTED: return ENOSYS;
|
||||
case STATUS_TIMEOUT: return EAGAIN;
|
||||
case STATUS_WOULD_BLOCK: return EAGAIN;
|
||||
case STATUS_INVALID_PARAMETER: return EINVAL;
|
||||
case STATUS_INVALID_HANDLE: return EBADF;
|
||||
case STATUS_BUFFER_TOO_SMALL: return ERANGE;
|
||||
case STATUS_NO_MEMORY: return ENOMEM;
|
||||
case STATUS_ACCESS_DENIED: return EACCES;
|
||||
case STATUS_NOT_FOUND: return ENOENT;
|
||||
case STATUS_ALREADY_EXISTS: return EEXIST;
|
||||
case STATUS_OBJECT_NAME_COLLISION: return EEXIST;
|
||||
case STATUS_OBJECT_DEAD: return ECONNRESET;
|
||||
case STATUS_QUEUE_FULL: return EAGAIN;
|
||||
case STATUS_QUEUE_EMPTY: return EAGAIN;
|
||||
case STATUS_CANCELLED: return ECANCELED;
|
||||
case STATUS_NO_MORE_FILES: return ENOENT;
|
||||
case NTLSTATUS_SUCCESS: return 0;
|
||||
case NTLSTATUS_NOT_SUPPORTED: return ENOSYS;
|
||||
case NTLSTATUS_TIMEOUT: return EAGAIN;
|
||||
case NTLSTATUS_WOULD_BLOCK: return EAGAIN;
|
||||
case NTLSTATUS_INVALID_PARAMETER: return EINVAL;
|
||||
case NTLSTATUS_INVALID_HANDLE: return EBADF;
|
||||
case NTLSTATUS_BUFFER_TOO_SMALL: return ERANGE;
|
||||
case NTLSTATUS_NO_MEMORY: return ENOMEM;
|
||||
case NTLSTATUS_ACCESS_DENIED: return EACCES;
|
||||
case NTLSTATUS_NOT_FOUND: return ENOENT;
|
||||
case NTLSTATUS_ALREADY_EXISTS: return EEXIST;
|
||||
case NTLSTATUS_OBJECT_NAME_COLLISION: return EEXIST;
|
||||
case NTLSTATUS_OBJECT_DEAD: return ECONNRESET;
|
||||
case NTLSTATUS_QUEUE_FULL: return EAGAIN;
|
||||
case NTLSTATUS_QUEUE_EMPTY: return EAGAIN;
|
||||
case NTLSTATUS_CANCELLED: return ECANCELED;
|
||||
case NTLSTATUS_NO_MORE_FILES: return ENOENT;
|
||||
default: return EIO;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ __declspec(dllexport) void clearscreen(void) {
|
||||
// Implements the clearkeyboard operation.
|
||||
__declspec(dllexport) void clearkeyboard(void) {
|
||||
INPUT_KEY key;
|
||||
while (SysPollKeyboard(&key) == STATUS_SUCCESS) {
|
||||
while (SysPollKeyboard(&key) == NTLSTATUS_SUCCESS) {
|
||||
char ignored;
|
||||
(void)SysReadKeyboardChar(&ignored);
|
||||
}
|
||||
@@ -90,7 +90,7 @@ __declspec(dllexport) ssize_t read(int fd, void* buf, size_t count) {
|
||||
char* dst = (char*)buf;
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
uint32_t s = SysReadKeyboardChar(&dst[i]);
|
||||
if (s != STATUS_SUCCESS) { errno = PosixStatusToErrno(s); return -1; }
|
||||
if (s != NTLSTATUS_SUCCESS) { errno = PosixStatusToErrno(s); return -1; }
|
||||
if (dst[i] == '\n' || dst[i] == '\r') return (ssize_t)(i + 1);
|
||||
}
|
||||
return (ssize_t)count;
|
||||
|
||||
@@ -52,7 +52,7 @@ __declspec(dllexport) void* mmap(void* addr, size_t length, int prot,
|
||||
uint32_t mapping = 0;
|
||||
uint32_t s = SysCreateFileMapping(e->KHandle, protect, SYS_MAP_FLAG_NONE,
|
||||
maxSize, &mapping);
|
||||
if (s != STATUS_SUCCESS) {
|
||||
if (s != NTLSTATUS_SUCCESS) {
|
||||
errno = PosixStatusToErrno(s);
|
||||
return MAP_FAILED;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ __declspec(dllexport) void* mmap(void* addr, size_t length, int prot,
|
||||
PosixProtToSysMapAccess(prot, flags),
|
||||
SYS_MAP_FLAG_NONE, &base);
|
||||
SysCloseHandle(mapping);
|
||||
if (s != STATUS_SUCCESS) {
|
||||
if (s != NTLSTATUS_SUCCESS) {
|
||||
errno = PosixStatusToErrno(s);
|
||||
return MAP_FAILED;
|
||||
}
|
||||
@@ -73,7 +73,7 @@ __declspec(dllexport) int munmap(void* addr, size_t length) {
|
||||
(void)length;
|
||||
if (!addr) { errno = EINVAL; return -1; }
|
||||
uint32_t s = SysFreeVm(addr);
|
||||
if (s != STATUS_SUCCESS) { errno = PosixStatusToErrno(s); return -1; }
|
||||
if (s != NTLSTATUS_SUCCESS) { errno = PosixStatusToErrno(s); return -1; }
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -535,7 +535,14 @@ __declspec(dllexport) int poll(struct pollfd* fds, nfds_t nfds, int timeout) {
|
||||
|
||||
size_t ready = 0;
|
||||
uint32_t timeoutMs = timeout < 0 ? SYS_POLL_TIMEOUT_INFINITE : (uint32_t)timeout;
|
||||
uint32_t s = SysPoll(kfds, nfds, timeoutMs, &ready);
|
||||
SYS_POLL_REQUEST req;
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.Size = sizeof(req);
|
||||
req.TimeoutMs = timeoutMs;
|
||||
req.Fds = kfds;
|
||||
req.Count = nfds;
|
||||
req.ReadyOut = &ready;
|
||||
KSTATUS s = SysPoll(&req);
|
||||
if (s != 0) {
|
||||
free(kfds);
|
||||
errno = PosixStatusToErrno(s);
|
||||
|
||||
Reference in new issue
Block a user