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
@@ -75,7 +75,7 @@ static uint32_t open_existing_lockable(const char* path, uint32_t* fileOut) {
|
||||
SYS_FILE_FLAG_NONE,
|
||||
&h);
|
||||
uint32_t s = SysOpenFile(&req);
|
||||
if (s == STATUS_SUCCESS)
|
||||
if (s == NTLSTATUS_SUCCESS)
|
||||
*fileOut = h;
|
||||
return s;
|
||||
}
|
||||
@@ -98,13 +98,13 @@ static uint32_t create_temp_file(uint32_t* fileOut, const char** pathOut) {
|
||||
SYS_FILE_FLAG_NONE,
|
||||
&h);
|
||||
uint32_t s = SysOpenFile(&req);
|
||||
if (s == STATUS_SUCCESS) {
|
||||
if (s == NTLSTATUS_SUCCESS) {
|
||||
*fileOut = h;
|
||||
*pathOut = paths[i];
|
||||
return STATUS_SUCCESS;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
return STATUS_NOT_FOUND;
|
||||
return NTLSTATUS_NOT_FOUND;
|
||||
}
|
||||
|
||||
// Locks a range through the public request ABI.
|
||||
@@ -175,49 +175,49 @@ static void run_child(SYS_STRING_VIEW commandLine) {
|
||||
|
||||
uint32_t file = 0;
|
||||
uint32_t s = open_existing_lockable(path, &file);
|
||||
if (s != STATUS_SUCCESS)
|
||||
if (s != NTLSTATUS_SUCCESS)
|
||||
exit_now(3);
|
||||
|
||||
if (str_eq(mode, "excl-blocked")) {
|
||||
s = lock_range(file, SYS_FILE_LOCK_EXCLUSIVE, LOCK_OFFSET, LOCK_LENGTH, 0);
|
||||
SysCloseHandle(file);
|
||||
exit_now(s == STATUS_WOULD_BLOCK ? 0 : 4);
|
||||
exit_now(s == NTLSTATUS_WOULD_BLOCK ? 0 : 4);
|
||||
}
|
||||
|
||||
if (str_eq(mode, "excl-timeout")) {
|
||||
s = lock_range(file, SYS_FILE_LOCK_EXCLUSIVE, LOCK_OFFSET, LOCK_LENGTH, 20);
|
||||
SysCloseHandle(file);
|
||||
exit_now(s == STATUS_TIMEOUT ? 0 : 5);
|
||||
exit_now(s == NTLSTATUS_TIMEOUT ? 0 : 5);
|
||||
}
|
||||
|
||||
if (str_eq(mode, "excl-wait")) {
|
||||
s = lock_range(file, SYS_FILE_LOCK_EXCLUSIVE, LOCK_OFFSET, LOCK_LENGTH, SYS_WAIT_TIMEOUT_INFINITE);
|
||||
if (s == STATUS_SUCCESS)
|
||||
if (s == NTLSTATUS_SUCCESS)
|
||||
(void)unlock_range(file, LOCK_OFFSET, LOCK_LENGTH);
|
||||
SysCloseHandle(file);
|
||||
exit_now(s == STATUS_SUCCESS ? 0 : 6);
|
||||
exit_now(s == NTLSTATUS_SUCCESS ? 0 : 6);
|
||||
}
|
||||
|
||||
if (str_eq(mode, "shared-ok")) {
|
||||
s = lock_range(file, SYS_FILE_LOCK_SHARED, LOCK_OFFSET, LOCK_LENGTH, 0);
|
||||
if (s == STATUS_SUCCESS)
|
||||
if (s == NTLSTATUS_SUCCESS)
|
||||
(void)unlock_range(file, LOCK_OFFSET, LOCK_LENGTH);
|
||||
SysCloseHandle(file);
|
||||
exit_now(s == STATUS_SUCCESS ? 0 : 7);
|
||||
exit_now(s == NTLSTATUS_SUCCESS ? 0 : 7);
|
||||
}
|
||||
|
||||
if (str_eq(mode, "excl-nonoverlap")) {
|
||||
s = lock_range(file, SYS_FILE_LOCK_EXCLUSIVE, NONOVERLAP_OFFSET, LOCK_LENGTH, 0);
|
||||
if (s == STATUS_SUCCESS)
|
||||
if (s == NTLSTATUS_SUCCESS)
|
||||
(void)unlock_range(file, NONOVERLAP_OFFSET, LOCK_LENGTH);
|
||||
SysCloseHandle(file);
|
||||
exit_now(s == STATUS_SUCCESS ? 0 : 8);
|
||||
exit_now(s == NTLSTATUS_SUCCESS ? 0 : 8);
|
||||
}
|
||||
|
||||
if (str_eq(mode, "hold-exit")) {
|
||||
s = lock_range(file, SYS_FILE_LOCK_EXCLUSIVE, LOCK_OFFSET, LOCK_LENGTH, 0);
|
||||
SysCloseHandle(file);
|
||||
exit_now(s == STATUS_SUCCESS ? 0 : 9);
|
||||
exit_now(s == NTLSTATUS_SUCCESS ? 0 : 9);
|
||||
}
|
||||
|
||||
SysCloseHandle(file);
|
||||
@@ -251,14 +251,14 @@ static void run_child_expect_success(const char* mode, const char* path) {
|
||||
&child,
|
||||
};
|
||||
uint32_t s = SysCreateProcess(&req);
|
||||
if (s != STATUS_SUCCESS) fail_status("create child", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("create child", s);
|
||||
|
||||
s = SysWait(child, SYS_WAIT_FLAG_NONE);
|
||||
if (s != STATUS_SUCCESS) fail_status("wait child", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("wait child", s);
|
||||
|
||||
int32_t exitCode = 0;
|
||||
s = SysGetProcessExitCode(child, &exitCode);
|
||||
if (s != STATUS_SUCCESS) fail_status("query child", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("query child", s);
|
||||
SysCloseHandle(child);
|
||||
if (exitCode != 0) {
|
||||
print("file_lock_smoke: child ");
|
||||
@@ -282,12 +282,12 @@ static void test_validation(uint32_t file) {
|
||||
0,
|
||||
};
|
||||
uint32_t s = SysLockFile(&lockReq);
|
||||
if (s != STATUS_INVALID_PARAMETER) fail_status("bad lock size", s);
|
||||
if (s != NTLSTATUS_INVALID_PARAMETER) fail_status("bad lock size", s);
|
||||
|
||||
lockReq.Size = sizeof(lockReq);
|
||||
lockReq.Length = 0;
|
||||
s = SysLockFile(&lockReq);
|
||||
if (s != STATUS_INVALID_PARAMETER) fail_status("zero lock length", s);
|
||||
if (s != NTLSTATUS_INVALID_PARAMETER) fail_status("zero lock length", s);
|
||||
|
||||
SYS_UNLOCK_FILE_REQUEST unlockReq = {
|
||||
sizeof(unlockReq),
|
||||
@@ -297,12 +297,12 @@ static void test_validation(uint32_t file) {
|
||||
LOCK_LENGTH,
|
||||
};
|
||||
s = SysUnlockFile(&unlockReq);
|
||||
if (s != STATUS_NOT_FOUND) fail_status("unlock missing range", s);
|
||||
if (s != NTLSTATUS_NOT_FOUND) fail_status("unlock missing range", s);
|
||||
|
||||
lockReq.Length = LOCK_LENGTH;
|
||||
lockReq.FileHandle = 0xeeeeeeeeu;
|
||||
s = SysLockFile(&lockReq);
|
||||
if (s != STATUS_INVALID_HANDLE) fail_status("bad lock handle", s);
|
||||
if (s != NTLSTATUS_INVALID_HANDLE) fail_status("bad lock handle", s);
|
||||
}
|
||||
|
||||
// Program entry point.
|
||||
@@ -322,27 +322,27 @@ int main(void) {
|
||||
uint32_t file = 0;
|
||||
const char* path = 0;
|
||||
uint32_t s = create_temp_file(&file, &path);
|
||||
if (s != STATUS_SUCCESS) fail_status("create temp", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("create temp", s);
|
||||
|
||||
test_validation(file);
|
||||
|
||||
s = lock_range(file, SYS_FILE_LOCK_EXCLUSIVE, LOCK_OFFSET, LOCK_LENGTH, 0);
|
||||
if (s != STATUS_SUCCESS) fail_status("exclusive parent lock", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("exclusive parent lock", s);
|
||||
run_child_expect_success("excl-blocked", path);
|
||||
run_child_expect_success("excl-timeout", path);
|
||||
run_child_expect_success("excl-nonoverlap", path);
|
||||
s = unlock_range(file, LOCK_OFFSET, LOCK_LENGTH);
|
||||
if (s != STATUS_SUCCESS) fail_status("exclusive parent unlock", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("exclusive parent unlock", s);
|
||||
|
||||
s = lock_range(file, SYS_FILE_LOCK_SHARED, LOCK_OFFSET, LOCK_LENGTH, 0);
|
||||
if (s != STATUS_SUCCESS) fail_status("shared parent lock", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("shared parent lock", s);
|
||||
run_child_expect_success("shared-ok", path);
|
||||
run_child_expect_success("excl-blocked", path);
|
||||
s = unlock_range(file, LOCK_OFFSET, LOCK_LENGTH);
|
||||
if (s != STATUS_SUCCESS) fail_status("shared parent unlock", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("shared parent unlock", s);
|
||||
|
||||
s = lock_range(file, SYS_FILE_LOCK_EXCLUSIVE, LOCK_OFFSET, LOCK_LENGTH, 0);
|
||||
if (s != STATUS_SUCCESS) fail_status("blocking setup lock", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("blocking setup lock", s);
|
||||
SYS_PEB* selfPeb = SysGetPeb();
|
||||
if (!selfPeb || !selfPeb->ImagePath.Data || selfPeb->ImagePath.Length == 0) fail("missing self image");
|
||||
char command[CHILD_PREFIX_MAX + CHILD_PATH_MAX];
|
||||
@@ -350,23 +350,23 @@ int main(void) {
|
||||
uint32_t child = 0;
|
||||
SYS_CREATE_PROCESS_REQUEST createReq = { selfPeb->ImagePath, SysSvFromCstr(command), &child };
|
||||
s = SysCreateProcess(&createReq);
|
||||
if (s != STATUS_SUCCESS) fail_status("create blocking child", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("create blocking child", s);
|
||||
SysSleep(30);
|
||||
s = unlock_range(file, LOCK_OFFSET, LOCK_LENGTH);
|
||||
if (s != STATUS_SUCCESS) fail_status("wake unlock", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("wake unlock", s);
|
||||
s = SysWait(child, SYS_WAIT_FLAG_NONE);
|
||||
if (s != STATUS_SUCCESS) fail_status("wait blocking child", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("wait blocking child", s);
|
||||
int32_t exitCode = 0;
|
||||
s = SysGetProcessExitCode(child, &exitCode);
|
||||
if (s != STATUS_SUCCESS) fail_status("query blocking child", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("query blocking child", s);
|
||||
SysCloseHandle(child);
|
||||
if (exitCode != 0) fail("blocking child failed");
|
||||
|
||||
run_child_expect_success("hold-exit", path);
|
||||
s = lock_range(file, SYS_FILE_LOCK_EXCLUSIVE, LOCK_OFFSET, LOCK_LENGTH, 0);
|
||||
if (s != STATUS_SUCCESS) fail_status("exit released lock", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("exit released lock", s);
|
||||
s = unlock_range(file, LOCK_OFFSET, LOCK_LENGTH);
|
||||
if (s != STATUS_SUCCESS) fail_status("exit release cleanup unlock", s);
|
||||
if (s != NTLSTATUS_SUCCESS) fail_status("exit release cleanup unlock", s);
|
||||
|
||||
SysCloseHandle(file);
|
||||
delete_path(path);
|
||||
|
||||
Reference in new issue
Block a user