From: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/ntoskrnl.exe/tests/Makefile.in | 2 +-
dlls/ntoskrnl.exe/tests/driver.c | 65 +++++++++++++++++++++++++++++
2 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/tests/Makefile.in b/dlls/ntoskrnl.exe/tests/Makefile.in
index ab1db85adbb..9c89e44e70a 100644
--- a/dlls/ntoskrnl.exe/tests/Makefile.in
+++ b/dlls/ntoskrnl.exe/tests/Makefile.in
@@ -1,7 +1,7 @@
TESTDLL = ntoskrnl.exe
IMPORTS = advapi32 crypt32 newdev setupapi user32 wintrust ws2_32 hid
-driver_IMPORTS = winecrt0 ntoskrnl hal
+driver_IMPORTS = winecrt0 ntoskrnl hal fltmgr
driver_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native
driver2_IMPORTS = winecrt0 ntoskrnl hal
driver2_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index d293889c823..66f5bb122be 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -32,6 +32,7 @@
#include "ddk/ntddk.h"
#include "ddk/ntifs.h"
#include "ddk/wdm.h"
+#include "ddk/fltkernel.h"
#include "driver.h"
@@ -2293,6 +2294,69 @@ static void test_permanence(void)
ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "got %#lx\n", status);
}
+static void test_default_security(void)
+{
+ PSECURITY_DESCRIPTOR sd = NULL;
+ NTSTATUS status;
+ PSID group = NULL, owner = NULL;
+ BOOLEAN isdefault, present;
+ PACL acl = NULL;
+ PACCESS_ALLOWED_ACE ace;
+ SID_IDENTIFIER_AUTHORITY auth = { SECURITY_NULL_SID_AUTHORITY };
+ PSID sid1, sid2;
+
+ status = FltBuildDefaultSecurityDescriptor(&sd, STANDARD_RIGHTS_ALL);
+ ok(status == STATUS_SUCCESS, "got %#lx\n", status);
+ ok(sd != NULL, "Failed to return descriptor\n");
+
+ status = RtlGetGroupSecurityDescriptor(sd, &group, &isdefault);
+ ok(status == STATUS_SUCCESS, "got %#lx\n", status);
+ ok(group == NULL, "group isn't NULL\n");
+
+ status = RtlGetOwnerSecurityDescriptor(sd, &owner, &isdefault);
+ ok(status == STATUS_SUCCESS, "got %#lx\n", status);
+ ok(owner == NULL, "owner isn't NULL\n");
+
+ status = RtlGetDaclSecurityDescriptor(sd, &present, &acl, &isdefault);
+ ok(status == STATUS_SUCCESS, "got %#lx\n", status);
+ ok(acl != NULL, "acl is NULL\n");
+ ok(acl->AceCount == 2, "got %d\n", acl->AceCount);
+
+ sid1 = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, RtlLengthRequiredSid(2));
+ RtlInitializeSid(sid1, &auth, 2);
+ *RtlSubAuthoritySid(sid1, 0) = SECURITY_BUILTIN_DOMAIN_RID;
+ *RtlSubAuthoritySid(sid1, 1) = DOMAIN_GROUP_RID_ADMINS;
+
+ sid2 = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, RtlLengthRequiredSid(1));
+ RtlInitializeSid(sid2, &auth, 1);
+ *RtlSubAuthoritySid(sid2, 0) = SECURITY_LOCAL_SYSTEM_RID;
+
+ /* SECURITY_BUILTIN_DOMAIN_RID */
+ status = RtlGetAce(acl, 0, (void**)&ace);
+ ok(status == STATUS_SUCCESS, "got %#lx\n", status);
+
+ ok(ace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE, "got %#x\n",
ace->Header.AceType);
+ ok(ace->Header.AceFlags == 0, "got %#x\n", ace->Header.AceFlags);
+ ok(ace->Mask == STANDARD_RIGHTS_ALL, "got %#lx\n", ace->Mask);
+
+ ok(RtlEqualSid(sid1, (PSID)&ace->SidStart), "SID not equal\n");
+
+ /* SECURITY_LOCAL_SYSTEM_RID */
+ status = RtlGetAce(acl, 1, (void**)&ace);
+ ok(status == STATUS_SUCCESS, "got %#lx\n", status);
+
+ ok(ace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE, "got %#x\n",
ace->Header.AceType);
+ ok(ace->Header.AceFlags == 0, "got %#x\n", ace->Header.AceFlags);
+ ok(ace->Mask == STANDARD_RIGHTS_ALL, "got %#lx\n", ace->Mask);
+
+ ok(RtlEqualSid(sid2, (PSID)&ace->SidStart), "SID not equal\n");
+
+ RtlFreeHeap(GetProcessHeap(), 0, sid1);
+ RtlFreeHeap(GetProcessHeap(), 0, sid2);
+
+ FltFreeSecurityDescriptor(sd);
+}
+
static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack)
{
void *buffer = irp->AssociatedIrp.SystemBuffer;
@@ -2336,6 +2400,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp,
IO_STACK_LOCATION *st
test_dpc();
test_process_memory(test_input);
test_permanence();
+ test_default_security();
IoMarkIrpPending(irp);
IoQueueWorkItem(work_item, main_test_task, DelayedWorkQueue, irp);
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/414