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
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <ntlite/syscall.h>
|
||||
|
||||
// Prints one NUL-terminated string to the kernel console.
|
||||
@@ -70,50 +71,63 @@ static void expect_status(const char* what, uint32_t got, uint32_t expected) {
|
||||
static void check_fixed_stats(void) {
|
||||
size_t required = 0;
|
||||
uint32_t status = SysQueryKernelStats(SYS_KERNEL_STATS_SCHEDULER, 0, 0, &required);
|
||||
if (status != STATUS_SUCCESS) fail_status("scheduler size", status);
|
||||
if (status != NTLSTATUS_SUCCESS) fail_status("scheduler size", status);
|
||||
if (required != sizeof(SYS_SCHEDULER_STATS)) fail("scheduler required size mismatch");
|
||||
|
||||
uint8_t small[sizeof(SYS_SCHEDULER_STATS) - 1u];
|
||||
size_t smallRequired = 0;
|
||||
status = SysQueryKernelStats(SYS_KERNEL_STATS_SCHEDULER, small, sizeof(small), &smallRequired);
|
||||
expect_status("scheduler small buffer", status, STATUS_BUFFER_TOO_SMALL);
|
||||
expect_status("scheduler small buffer", status, NTLSTATUS_BUFFER_TOO_SMALL);
|
||||
if (smallRequired != sizeof(SYS_SCHEDULER_STATS)) fail("scheduler small required mismatch");
|
||||
|
||||
SYS_SCHEDULER_STATS scheduler;
|
||||
status = SysQueryKernelStats(SYS_KERNEL_STATS_SCHEDULER, &scheduler, sizeof(scheduler), 0);
|
||||
if (status != STATUS_SUCCESS) fail_status("scheduler exact", status);
|
||||
if (status != NTLSTATUS_SUCCESS) fail_status("scheduler exact", status);
|
||||
if (scheduler.Size != sizeof(scheduler)) fail("scheduler size field mismatch");
|
||||
if (scheduler.Version != SYS_STATS_VERSION) fail("scheduler version mismatch");
|
||||
|
||||
SYS_FILESYSTEM_STATS filesystem;
|
||||
status = SysQueryKernelStats(SYS_KERNEL_STATS_FILESYSTEM, &filesystem, sizeof(filesystem), 0);
|
||||
if (status != STATUS_SUCCESS) fail_status("filesystem exact", status);
|
||||
if (status != NTLSTATUS_SUCCESS) fail_status("filesystem exact", status);
|
||||
if (filesystem.Size != sizeof(filesystem)) fail("filesystem size field mismatch");
|
||||
if (filesystem.Version != SYS_STATS_VERSION) fail("filesystem version mismatch");
|
||||
|
||||
SYS_EXCEPTION_STATS exceptionStats;
|
||||
status = SysQueryKernelStats(SYS_KERNEL_STATS_EXCEPTION, &exceptionStats, sizeof(exceptionStats), 0);
|
||||
if (status != NTLSTATUS_SUCCESS) fail_status("exception exact", status);
|
||||
if (exceptionStats.Size != sizeof(exceptionStats)) fail("exception size field mismatch");
|
||||
if (exceptionStats.Version != SYS_STATS_VERSION) fail("exception version mismatch");
|
||||
}
|
||||
|
||||
// Verifies CPU stats use a size-reported trailing-record layout.
|
||||
static void check_cpu_stats(void) {
|
||||
size_t required = 0;
|
||||
uint32_t status = SysQueryKernelStats(SYS_KERNEL_STATS_CPU, 0, 0, &required);
|
||||
if (status != STATUS_SUCCESS) fail_status("cpu size", status);
|
||||
if (status != NTLSTATUS_SUCCESS) fail_status("cpu size", status);
|
||||
if (required < sizeof(SYS_CPU_STATS) + sizeof(SYS_CPU_STAT)) fail("cpu required size too small");
|
||||
|
||||
SYS_CPU_STATS headerOnly;
|
||||
size_t smallRequired = 0;
|
||||
status = SysQueryKernelStats(SYS_KERNEL_STATS_CPU, &headerOnly, sizeof(headerOnly), &smallRequired);
|
||||
expect_status("cpu header-only buffer", status, STATUS_BUFFER_TOO_SMALL);
|
||||
expect_status("cpu header-only buffer", status, NTLSTATUS_BUFFER_TOO_SMALL);
|
||||
if (smallRequired != required) fail("cpu small required mismatch");
|
||||
|
||||
void* buffer = 0;
|
||||
size_t pages = (required + 4095u) / 4096u;
|
||||
if (pages == 0) pages = 1;
|
||||
status = SysAllocVm(0, pages, SYS_VM_READWRITE, SYS_VM_FLAG_NONE, &buffer);
|
||||
if (status != STATUS_SUCCESS || !buffer) fail_status("cpu buffer alloc", status);
|
||||
SYS_ALLOC_VM_REQUEST allocReq;
|
||||
memset(&allocReq, 0, sizeof(allocReq));
|
||||
allocReq.Size = sizeof(allocReq);
|
||||
allocReq.PageCount = pages;
|
||||
allocReq.Protect = SYS_VM_READWRITE;
|
||||
allocReq.Flags = SYS_VM_FLAG_NONE;
|
||||
allocReq.BaseOut = &buffer;
|
||||
status = SysAllocVm(&allocReq);
|
||||
if (status != NTLSTATUS_SUCCESS || !buffer) fail_status("cpu buffer alloc", status);
|
||||
|
||||
SYS_CPU_STATS* cpu = (SYS_CPU_STATS*)buffer;
|
||||
status = SysQueryKernelStats(SYS_KERNEL_STATS_CPU, cpu, pages * 4096u, 0);
|
||||
if (status != STATUS_SUCCESS) {
|
||||
if (status != NTLSTATUS_SUCCESS) {
|
||||
SysFreeVm(buffer);
|
||||
fail_status("cpu exact", status);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user