[KMTESTS] Kmtest fixes (#8308)

- [KMTEST:IOFILESYSTEM] Add support for NTFS
- [KMTEST:IODEVICEOBJECT] Work around a Windows 7 bug, account for struct size changes on x64, accept Vista+ behavior
- [KMTEST:EXPOOLS] Accept pool being promoted to NonPaged on Vista+, accept 2GB allocation on x64, guard an undocumented behavior
- [KMTEST:CMSECURITY] Add tests for Vista-Win8.1
This commit is contained in:
Mohammed al-Ramadany
2025-09-30 18:57:23 +03:00
committed by GitHub
parent b19eba558c
commit 2a0acdbadc
6 changed files with 506 additions and 117 deletions

View File

@@ -103,33 +103,36 @@ CheckKeySecurity__(
VCheckAcl__(Dacl, AceCount, FileAndLine, Arguments);
va_end(Arguments);
Sacl = NULL;
Status = RtlGetSaclSecurityDescriptor(SecurityDescriptor,
&Present,
&Sacl,
&Defaulted);
ok_eq_hex(Status, STATUS_SUCCESS);
ok(Present == FALSE, "SACL present for %ls\n", KeyName);
ok(Defaulted == FALSE, "SACL defaulted for %ls\n", KeyName);
ok(Sacl == NULL, "Sacl is %p for %ls\n", Sacl, KeyName);
/* Windows 8+ has SACLs for:
* \REGISTRY\MACHINE\SAM
* \REGISTRY\MACHINE\SECURITY
* \REGISTRY\MACHINE\SOFTWARE
* \REGISTRY\MACHINE\SYSTEM
* \REGISTRY\USER\.DEFAULT
* \REGISTRY\USER\S-1-5-18
* \REGISTRY\USER\S-1-5-20
*
* TODO: Investigate these SACLs and test accordingly.
*/
if (GetNTVersion() < _WIN32_WINNT_WIN8)
{
Sacl = NULL;
Status = RtlGetSaclSecurityDescriptor(SecurityDescriptor,
&Present,
&Sacl,
&Defaulted);
ok_eq_hex(Status, STATUS_SUCCESS);
ok(Present == FALSE, "SACL present for %ls\n", KeyName);
ok(Defaulted == FALSE, "SACL defaulted for %ls\n", KeyName);
ok(Sacl == NULL, "Sacl is %p for %ls\n", Sacl, KeyName);
}
}
ExFreePoolWithTag(SecurityDescriptor, 'dSmK');
ObCloseHandle(KeyHandle, KernelMode);
}
START_TEST(CmSecurity)
static void CmSecurity_WS03(PSID TerminalServerSid)
{
SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
PSID TerminalServerSid;
TerminalServerSid = ExAllocatePoolWithTag(PagedPool,
RtlLengthRequiredSid(1),
'iSmK');
if (TerminalServerSid != NULL)
{
RtlInitializeSid(TerminalServerSid, &NtSidAuthority, 1);
*RtlSubAuthoritySid(TerminalServerSid, 0) = SECURITY_TERMINAL_SERVER_RID;
}
CheckKeySecurity(L"\\REGISTRY",
4, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
@@ -252,6 +255,241 @@ START_TEST(CmSecurity)
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE |
OBJECT_INHERIT_ACE, SeExports->SeRestrictedSid, GENERIC_READ);
}
static void CmSecurity_Vista(PSID TerminalServerSid)
{
CheckKeySecurity(L"\\REGISTRY",
4, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeWorldSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\MACHINE",
4, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeWorldSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\HARDWARE",
4, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeWorldSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SAM",
8, ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, GENERIC_READ,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, GENERIC_ALL);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SECURITY",
2, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, WRITE_DAC | READ_CONTROL);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SOFTWARE",
8, ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, GENERIC_READ,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, GENERIC_ALL);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SYSTEM",
8, ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, GENERIC_READ,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, GENERIC_ALL);
CheckKeySecurity(L"\\REGISTRY\\USER",
4, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeWorldSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\USER\\.DEFAULT",
8, ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, GENERIC_READ,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, GENERIC_ALL);
CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-18",
8, ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, GENERIC_READ,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, GENERIC_ALL,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, INHERIT_ONLY_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, GENERIC_ALL);
CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-20",
4, ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeNetworkServiceSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ);
}
static void CmSecurity_Win8(PSID TerminalServerSid)
{
CheckKeySecurity(L"\\REGISTRY",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeWorldSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\MACHINE",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeWorldSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\HARDWARE",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeWorldSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SAM",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SECURITY",
2, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, WRITE_DAC | READ_CONTROL);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SOFTWARE",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SYSTEM",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\USER",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeWorldSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\USER\\.DEFAULT",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-18",
5, ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasUsersSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeCreatorOwnerSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, CONTAINER_INHERIT_ACE, SeExports->SeAllAppPackagesSid, KEY_READ);
CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-20",
5, ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeNetworkServiceSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeLocalSystemSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeAliasAdminsSid, KEY_ALL_ACCESS,
ACCESS_ALLOWED_ACE_TYPE, OBJECT_INHERIT_ACE |
CONTAINER_INHERIT_ACE, SeExports->SeRestrictedSid, KEY_READ,
ACCESS_ALLOWED_ACE_TYPE, 0, SeExports->SeAllAppPackagesSid, KEY_READ);
}
START_TEST(CmSecurity)
{
SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY};
PSID TerminalServerSid;
TerminalServerSid = ExAllocatePoolWithTag(PagedPool,
RtlLengthRequiredSid(1),
'iSmK');
if (TerminalServerSid != NULL)
{
RtlInitializeSid(TerminalServerSid, &NtSidAuthority, 1);
*RtlSubAuthoritySid(TerminalServerSid, 0) = SECURITY_TERMINAL_SERVER_RID;
}
switch (GetNTVersion())
{
case _WIN32_WINNT_WS03:
CmSecurity_WS03(TerminalServerSid);
break;
case _WIN32_WINNT_VISTA:
case _WIN32_WINNT_WIN7:
CmSecurity_Vista(TerminalServerSid);
break;
case _WIN32_WINNT_WIN8:
case _WIN32_WINNT_WINBLUE:
case _WIN32_WINNT_WIN10:
CmSecurity_Win8(TerminalServerSid);
break;
default:
if (GetNTVersion() < _WIN32_WINNT_WS03)
{
trace("Unknown NT version (0x%X < 0x%X), running WS03 tests...\n", GetNTVersion(), _WIN32_WINNT_WS03);
CmSecurity_WS03(TerminalServerSid);
}
else
{
trace("Unknown NT version (0x%X > 0x%X), running latest tests...\n", GetNTVersion(), _WIN32_WINNT_WIN10);
CmSecurity_Win8(TerminalServerSid);
}
break;
}
if (TerminalServerSid != NULL)
{

View File

@@ -12,7 +12,7 @@
#define TAG_POOLTEST 'tstP'
#define BASE_POOL_TYPE_MASK 1
#define BASE_POOL_TYPE_MASK 3
#define QUOTA_POOL_MASK 8
static
@@ -141,7 +141,6 @@ VOID
TestPoolQuota(VOID)
{
PEPROCESS Process = PsGetCurrentProcess();
PEPROCESS StoredProcess;
PVOID Memory;
LONG InitialRefCount;
LONG RefCount;
@@ -163,16 +162,23 @@ TestPoolQuota(VOID)
RefCount = GetRefCount(Process);
ok_eq_long(RefCount, InitialRefCount + 1);
/* A pointer to the process is found right before the next pool header */
StoredProcess = ((PVOID *)((ULONG_PTR)Memory + 2 * sizeof(LIST_ENTRY)))[-1];
ok_eq_pointer(StoredProcess, Process);
#ifdef _M_IX86
if (GetNTVersion() <= _WIN32_WINNT_WIN7)
{
/* For x86 NT 6.2 and older: a pointer to the process is found right before the next pool header */
PEPROCESS StoredProcess = ((PVOID *)((ULONG_PTR)Memory + 2 * sizeof(LIST_ENTRY)))[-1];
ok_eq_pointer(StoredProcess, Process);
}
#endif
/* Pool type should have QUOTA_POOL_MASK set */
PoolType = KmtGetPoolType(Memory);
ok(PoolType != 0, "PoolType is 0\n");
PoolType--;
ok(PoolType & QUOTA_POOL_MASK, "PoolType = %x\n", PoolType);
ok((PoolType & BASE_POOL_TYPE_MASK) == PagedPool, "PoolType = %x\n", PoolType);
ok((PoolType & BASE_POOL_TYPE_MASK) == PagedPool || // Win2k3
(PoolType & BASE_POOL_TYPE_MASK) == NonPagedPoolMustSucceed, // Vista+ promotes the memory allocation
"PoolType = %x\n", PoolType);
ExFreePoolWithTag(Memory, 'tQmK');
RefCount = GetRefCount(Process);
@@ -196,6 +202,16 @@ TestPoolQuota(VOID)
ok_eq_long(RefCount, InitialRefCount);
}
#ifdef _WIN64
KmtStartSeh()
Memory = ExAllocatePoolWithQuotaTag(PagedPool,
0x7FFFFFFF,
'tQmK');
ok(Memory != NULL, "Failed to get 2GB block: %p\n", Memory);
if (Memory)
ExFreePoolWithTag(Memory, 'tQmK');
KmtEndSeh(STATUS_SUCCESS);
#else
/* Function raises by default */
KmtStartSeh()
Memory = ExAllocatePoolWithQuotaTag(PagedPool,
@@ -214,6 +230,7 @@ TestPoolQuota(VOID)
if (Memory)
ExFreePoolWithTag(Memory, 'tQmK');
KmtEndSeh(STATUS_SUCCESS);
#endif // _WIN64
}
static

View File

@@ -181,9 +181,10 @@ TestDriverObject(
ok_eq_pointer(DriverObject->DriverExtension->DriverObject, DriverObject);
ok_eq_pointer(DriverObject->DriverExtension->AddDevice, NULL);
ok_eq_ulong(DriverObject->DriverExtension->Count, 0UL);
/* Windows 7 doesn't capitalize "Services" like all other versions before and after it. */
Equal = RtlEqualUnicodeString(RegistryPath,
&RegPath,
FALSE);
(GetNTVersion() == _WIN32_WINNT_WIN7) ? TRUE : FALSE);
ok(Equal, "RegistryPath is '%wZ'\n", RegistryPath);
ok((ULONG_PTR)RegistryPath % PAGE_SIZE == 0, "RegistryPath %p not page-aligned\n", RegistryPath);
ok_eq_pointer(RegistryPath->Buffer, (PWCHAR)(RegistryPath + 1));
@@ -193,7 +194,8 @@ TestDriverObject(
FALSE);
ok(Equal, "ServiceKeyName is '%wZ'\n", &DriverObject->DriverExtension->ServiceKeyName);
ok_eq_tag(KmtGetPoolTag(DriverObject->DriverExtension->ServiceKeyName.Buffer), ' oI');
ok_eq_uint((KmtGetPoolType(DriverObject->DriverExtension->ServiceKeyName.Buffer) - 1) & BASE_POOL_TYPE_MASK, NonPagedPool);
if (GetNTVersion() <= _WIN32_WINNT_WS03) // Not guaranteed on Vista+
ok_eq_uint((KmtGetPoolType(DriverObject->DriverExtension->ServiceKeyName.Buffer) - 1) & BASE_POOL_TYPE_MASK, NonPagedPool);
ok_eq_uint(DriverObject->DriverExtension->ServiceKeyName.MaximumLength, DriverObject->DriverExtension->ServiceKeyName.Length + sizeof(UNICODE_NULL));
ok_eq_uint(DriverObject->DriverExtension->ServiceKeyName.Buffer[DriverObject->DriverExtension->ServiceKeyName.Length / sizeof(WCHAR)], UNICODE_NULL);
Equal = RtlEqualUnicodeString(&DriverObject->DriverName,
@@ -348,7 +350,11 @@ TestDeviceCreated(
/* Check the device object members */
ok(DeviceObject->Type == 3, "Expected Type = 3, got %x\n", DeviceObject->Type);
ok(DeviceObject->Size == 0xb8, "Expected Size = 0xb8, got %x\n", DeviceObject->Size);
#ifdef _M_IX86
ok(DeviceObject->Size == 0xb8, "Expected Size = 0xb8, got 0x%x\n", DeviceObject->Size);
#else
ok(DeviceObject->Size == 0x150, "Expected Size = 0x150, got 0x%x\n", DeviceObject->Size);
#endif
ok(DeviceObject->ReferenceCount == 0, "Expected ReferenceCount = 0, got %lu\n",
DeviceObject->ReferenceCount);
ok(DeviceObject->DriverObject == ThisDriverObject,
@@ -368,17 +374,19 @@ TestDeviceCreated(
"Expected Flags DO_DEVICE_HAS_NAME | DO_DEVICE_INITIALIZING, got %lu\n", DeviceObject->Flags);
}
ok(DeviceObject->DeviceType == FILE_DEVICE_UNKNOWN,
"Expected DeviceType to match creation parameter FILE_DEVICE_UNKNWOWN, got %lu\n",
"Expected DeviceType to match creation parameter FILE_DEVICE_UNKNWOWN, got %lu\n",
DeviceObject->DeviceType);
ok(DeviceObject->ActiveThreadCount == 0, "Expected ActiveThreadCount = 0, got %lu\n", DeviceObject->ActiveThreadCount);
/* Check the extended extension */
extdev = (PEXTENDED_DEVOBJ_EXTENSION)DeviceObject->DeviceObjectExtension;
ok(extdev->ExtensionFlags == 0, "Expected Extended ExtensionFlags to be 0, got %lu\n", extdev->ExtensionFlags);
ok (extdev->Type == 13, "Expected Type of 13, got %d\n", extdev->Type);
ok (extdev->Size == 0, "Expected Size of 0, got %d\n", extdev->Size);
ok (extdev->DeviceObject == DeviceObject, "Expected DeviceOject to match newly created device %p, got %p\n",
DeviceObject, extdev->DeviceObject);
ok(extdev->ExtensionFlags == DOE_DEFAULT_SD_PRESENT || // Vista+
extdev->ExtensionFlags == 0, // WS03
"Expected Extended ExtensionFlags to be DOE_DEFAULT_SD_PRESENT or 0, got %lu\n", extdev->ExtensionFlags);
ok(extdev->Type == 13, "Expected Type of 13, got %d\n", extdev->Type);
ok(extdev->Size == 0, "Expected Size of 0, got %d\n", extdev->Size);
ok(extdev->DeviceObject == DeviceObject, "Expected DeviceOject to match newly created device %p, got %p\n",
DeviceObject, extdev->DeviceObject);
ok(extdev->AttachedTo == NULL, "Expected AttachTo to be NULL, got %p\n", extdev->AttachedTo);
ok(extdev->StartIoCount == 0, "Expected StartIoCount = 0, got %lu\n", extdev->StartIoCount);
ok(extdev->StartIoKey == 0, "Expected StartIoKey = 0, got %lu\n", extdev->StartIoKey);
@@ -396,7 +404,11 @@ TestDeviceDeletion(
/* Check the device object members */
ok(DeviceObject->Type == 3, "Expected Type = 3, got %d\n", DeviceObject->Type);
ok(DeviceObject->Size == 0xb8, "Expected Size = 0xb8, got %d\n", DeviceObject->Size);
#ifdef _M_IX86
ok(DeviceObject->Size == 0xb8, "Expected Size = 0xb8, got 0x%x\n", DeviceObject->Size);
#else
ok(DeviceObject->Size == 0x150, "Expected Size = 0x150, got 0x%x\n", DeviceObject->Size);
#endif
ok(DeviceObject->ReferenceCount == 0, "Expected ReferenceCount = 0, got %lu\n",
DeviceObject->ReferenceCount);
if (!Lower)
@@ -426,9 +438,9 @@ TestDeviceDeletion(
/* Check the extended extension */
extdev = (PEXTENDED_DEVOBJ_EXTENSION)DeviceObject->DeviceObjectExtension;
/* FIXME: Windows has the MSB set under some conditions, need to find out what this means */
ok((extdev->ExtensionFlags & 0x7fffffff) == DOE_UNLOAD_PENDING,
"Expected Extended ExtensionFlags to be DOE_UNLOAD_PENDING, got 0x%lx\n", extdev->ExtensionFlags);
ok((extdev->ExtensionFlags == (DOE_DEFAULT_SD_PRESENT | DOE_UNLOAD_PENDING) || // Vista+
extdev->ExtensionFlags & 0x7fffffff) == DOE_UNLOAD_PENDING, // WS03 FIXME: Windows has the MSB set under some conditions, need to find out what this means
"Unexpected Extended ExtensionFlags (0x%lx)\n", extdev->ExtensionFlags);
ok (extdev->Type == 13, "Expected Type of 13, got %d\n", extdev->Type);
ok (extdev->Size == 0, "Expected Size of 0, got %d\n", extdev->Size);
ok (extdev->DeviceObject == DeviceObject, "Expected DeviceOject to match newly created device %p, got %p\n",

View File

@@ -7,7 +7,14 @@
#include <kmt_test.h>
/* FIXME: Test this stuff on non-FAT volumes */
typedef enum
{
NTFS,
FAT32,
Unknown
} FSType;
static FSType g_Filesystem;
static
NTSTATUS
@@ -84,6 +91,8 @@ TestAllInformation(VOID)
ULONG NameLength;
PWCHAR Name;
UNICODE_STRING NamePart;
FILE_FS_ATTRIBUTE_INFORMATION* FsAttributeInfo;
ULONG FSAttributeBufferSize = sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 256;
InitializeObjectAttributes(&ObjectAttributes,
&FileName,
@@ -106,6 +115,51 @@ TestAllInformation(VOID)
if (skip(NT_SUCCESS(Status), "No file handle, %lx\n", Status))
return;
/* Find filesystem for the system */
FsAttributeInfo = ExAllocatePoolWithTag(PagedPool, FSAttributeBufferSize, 'sySF');
if (FsAttributeInfo == NULL)
{
ok(FALSE, "Failed to allocate memory to query the filesystem!\n");
ZwClose(FileHandle);
return;
}
Status = ZwQueryVolumeInformationFile(FileHandle,
&IoStatus,
FsAttributeInfo,
FSAttributeBufferSize,
FileFsAttributeInformation);
if (NT_SUCCESS(Status))
{
if (FsAttributeInfo->FileSystemNameLength >= 8 &&
RtlCompareMemory(FsAttributeInfo->FileSystemName, L"NTFS", 8) == 8)
{
g_Filesystem = NTFS;
trace("Filesystem: NTFS\n");
}
else if (FsAttributeInfo->FileSystemNameLength >= 10 &&
RtlCompareMemory(FsAttributeInfo->FileSystemName, L"FAT32", 10) == 10)
{
g_Filesystem = FAT32;
trace("Filesystem: FAT32\n");
}
else
{
UNICODE_STRING FsName;
FsName.Length = FsAttributeInfo->FileSystemNameLength;
FsName.MaximumLength = FsAttributeInfo->FileSystemNameLength;
FsName.Buffer = FsAttributeInfo->FileSystemName;
g_Filesystem = Unknown;
trace("Unknown filesystem: %wZ\n", &FsName);
}
}
else
{
ok(FALSE, "Failed to query filesystem: %lx\n", Status);
}
ExFreePoolWithTag(FsAttributeInfo, 'sySF');
/* NtQueryInformationFile doesn't do length checks for kernel callers in a free build */
if (KmtIsCheckedBuild)
{
@@ -193,7 +247,10 @@ TestAllInformation(VOID)
Length = FIELD_OFFSET(FILE_ALL_INFORMATION, NameInformation.FileName) + NameLength - 1;
Status = QueryFileInfo(FileHandle, (PVOID*)&FileAllInfo, &Length, FileAllInformation);
ok_eq_hex(Status, STATUS_BUFFER_OVERFLOW);
ok_eq_size(Length, FIELD_OFFSET(FILE_ALL_INFORMATION, NameInformation.FileName) + NameLength - 1);
if (g_Filesystem == FAT32)
ok_eq_size(Length, FIELD_OFFSET(FILE_ALL_INFORMATION, NameInformation.FileName) + NameLength - 1);
else if (g_Filesystem == NTFS)
ok_eq_size(Length, FIELD_OFFSET(FILE_ALL_INFORMATION, NameInformation.FileName) + NameLength - 2);
if (FileAllInfo)
KmtFreeGuarded(FileAllInfo);
@@ -226,7 +283,9 @@ TestAllInformation(VOID)
Status = QueryFileInfo(FileHandle, (PVOID*)&FileEofInfo, &Length, FileEndOfFileInformation);
// Checked build: STATUS_INVALID_INFO_CLASS, Free build: STATUS_INVALID_PARAMETER
ok(Status == STATUS_INVALID_PARAMETER || Status == STATUS_INVALID_INFO_CLASS, "Wrong Status = %lx\n", Status);
ok_eq_size(Length, (SIZE_T)0x5555555555555555ULL);
ok(Length == 0 || // Win10
Length == (SIZE_T)0x5555555555555555ULL, // Win2k3-Win8.1
"Invalid length (0x%X)\n", Length);
if (FileEofInfo)
KmtFreeGuarded(FileEofInfo);
@@ -302,69 +361,74 @@ VOID
TestRelativeNames(VOID)
{
NTSTATUS Status;
struct
typedef struct
{
PCWSTR ParentPathTemplate;
PCWSTR RelativePathTemplate;
BOOLEAN IsDirectory;
NTSTATUS Status;
BOOLEAN IsDirectory_FAT32;
NTSTATUS Status_FAT32;
BOOLEAN IsDirectory_NTFS;
NTSTATUS Status_NTFS;
BOOLEAN IsDrive;
} Tests[] =
} RelativeNameTest;
RelativeNameTest Tests[] =
{
{ NULL, L"C:\\", TRUE, STATUS_SUCCESS, TRUE },
{ NULL, L"C:\\\\", TRUE, STATUS_SUCCESS, TRUE },
{ NULL, L"C:\\\\\\", TRUE, STATUS_OBJECT_NAME_INVALID, TRUE },
{ NULL, L"C:\\ReactOS", TRUE, STATUS_SUCCESS },
{ NULL, L"C:\\ReactOS\\", TRUE, STATUS_SUCCESS },
{ NULL, L"C:\\ReactOS\\\\", TRUE, STATUS_SUCCESS },
{ NULL, L"C:\\ReactOS\\\\\\", TRUE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\\\ReactOS", TRUE, STATUS_SUCCESS },
{ NULL, L"C:\\\\ReactOS\\", TRUE, STATUS_SUCCESS },
{ NULL, L"C:\\ReactOS\\explorer.exe", FALSE, STATUS_SUCCESS },
{ NULL, L"C:\\ReactOS\\\\explorer.exe", FALSE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\explorer.exe\\", FALSE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\explorer.exe\\file", FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\explorer.exe\\\\", FALSE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS, TRUE },
{ NULL, L"C:\\\\", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS, TRUE },
{ NULL, L"C:\\\\\\", TRUE, STATUS_OBJECT_NAME_INVALID, TRUE, STATUS_OBJECT_NAME_INVALID,TRUE },
{ NULL, L"C:\\ReactOS", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS},
{ NULL, L"C:\\ReactOS\\", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS, },
{ NULL, L"C:\\ReactOS\\\\", TRUE, STATUS_SUCCESS, TRUE, STATUS_OBJECT_NAME_INVALID},
{ NULL, L"C:\\ReactOS\\\\\\", TRUE, STATUS_OBJECT_NAME_INVALID, TRUE, STATUS_OBJECT_NAME_INVALID},
{ NULL, L"C:\\\\ReactOS", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS},
{ NULL, L"C:\\\\ReactOS\\", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS },
{ NULL, L"C:\\ReactOS\\explorer.exe", FALSE, STATUS_SUCCESS, FALSE, STATUS_SUCCESS},
{ NULL, L"C:\\ReactOS\\\\explorer.exe", FALSE, STATUS_OBJECT_NAME_INVALID, FALSE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\explorer.exe\\", FALSE, STATUS_OBJECT_NAME_INVALID, FALSE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\explorer.exe\\file", FALSE, STATUS_OBJECT_PATH_NOT_FOUND, FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\explorer.exe\\\\", FALSE, STATUS_OBJECT_NAME_INVALID, TRUE, STATUS_OBJECT_NAME_INVALID },
/* This will never return STATUS_NOT_A_DIRECTORY. IsDirectory=TRUE is a little hacky but achieves that without special handling */
{ NULL, L"C:\\ReactOS\\explorer.exe\\\\\\", TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\", L"", TRUE, STATUS_SUCCESS },
{ L"C:\\", L"\\", TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\", L"ReactOS", TRUE, STATUS_SUCCESS },
{ L"C:\\", L"\\ReactOS", TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\", L"ReactOS\\", TRUE, STATUS_SUCCESS },
{ L"C:\\", L"\\ReactOS\\", TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\ReactOS", L"", TRUE, STATUS_SUCCESS },
{ L"C:\\ReactOS", L"explorer.exe", FALSE, STATUS_SUCCESS },
{ L"C:\\ReactOS\\explorer.exe", L"", FALSE, STATUS_SUCCESS },
{ L"C:\\ReactOS\\explorer.exe", L"file", FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\explorer.exe\\\\\\", TRUE, STATUS_OBJECT_NAME_INVALID, TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\", L"", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS },
{ L"C:\\", L"\\", TRUE, STATUS_OBJECT_NAME_INVALID, TRUE, STATUS_INVALID_PARAMETER },
{ L"C:\\", L"ReactOS", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS },
{ L"C:\\", L"\\ReactOS", TRUE, STATUS_OBJECT_NAME_INVALID, TRUE, STATUS_INVALID_PARAMETER },
{ L"C:\\", L"ReactOS\\", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS },
{ L"C:\\", L"\\ReactOS\\", TRUE, STATUS_OBJECT_NAME_INVALID, TRUE, STATUS_INVALID_PARAMETER },
{ L"C:\\ReactOS", L"", TRUE, STATUS_SUCCESS, TRUE, STATUS_SUCCESS },
{ L"C:\\ReactOS", L"explorer.exe", FALSE, STATUS_SUCCESS, FALSE, STATUS_SUCCESS },
{ L"C:\\ReactOS\\explorer.exe", L"", FALSE, STATUS_SUCCESS, FALSE, STATUS_SUCCESS },
{ L"C:\\ReactOS\\explorer.exe", L"file", FALSE, STATUS_OBJECT_PATH_NOT_FOUND, FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
/* Let's try some nonexistent things */
{ NULL, L"C:\\ReactOS\\IDoNotExist", FALSE, STATUS_OBJECT_NAME_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\IDoNotExist\\file", FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\IDoNotExist\\file?", FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\IDoNotExist\\file\\\\",TRUE,STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\IDoNotExist\\file\\\\\\",TRUE,STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\AmIInvalid?", FALSE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\.", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\.\\system32", TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ L"C:\\", L".", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ L"C:\\", L"..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ L"C:\\", L"...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ L"C:\\", L".\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ L"C:\\", L"..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ L"C:\\ReactOS", L".", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ L"C:\\ReactOS", L"..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ L"C:\\ReactOS", L"...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ L"C:\\ReactOS", L".\\system32", TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ L"C:\\ReactOS", L"..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\IDoNotExist", FALSE, STATUS_OBJECT_NAME_NOT_FOUND, FALSE, STATUS_OBJECT_NAME_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\IDoNotExist\\file", FALSE, STATUS_OBJECT_PATH_NOT_FOUND, FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\IDoNotExist\\file?", FALSE, STATUS_OBJECT_PATH_NOT_FOUND, FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\IDoNotExist\\file\\\\",TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\IDoNotExist\\file\\\\\\",TRUE,STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\AmIInvalid?", FALSE, STATUS_OBJECT_NAME_INVALID, FALSE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\.", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ NULL, L"C:\\ReactOS\\...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\.\\system32", TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:\\ReactOS\\..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\", L".", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\", L"..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\", L"...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ L"C:\\", L".\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ L"C:\\", L"..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\ReactOS", L".", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\ReactOS", L"..", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
{ L"C:\\ReactOS", L"...", TRUE, STATUS_OBJECT_NAME_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
{ L"C:\\ReactOS", L".\\system32", TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ L"C:\\ReactOS", L"..\\ReactOS", TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_OBJECT_NAME_INVALID },
/* Volume open */
{ NULL, L"C:", FALSE, STATUS_SUCCESS, TRUE },
{ L"C:", L"", FALSE, STATUS_SUCCESS, TRUE },
{ L"C:", L"\\", TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ L"C:", L"file", TRUE, STATUS_OBJECT_PATH_NOT_FOUND },
{ NULL, L"C:", FALSE, STATUS_SUCCESS, FALSE, STATUS_SUCCESS, TRUE },
{ L"C:", L"", FALSE, STATUS_SUCCESS, FALSE, STATUS_SUCCESS, TRUE },
{ L"C:", L"\\", TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_INVALID_PARAMETER },
{ L"C:", L"file", TRUE, STATUS_OBJECT_PATH_NOT_FOUND, TRUE, STATUS_INVALID_PARAMETER },
};
ULONG i;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatus;
@@ -423,9 +487,28 @@ TestRelativeNames(VOID)
if (skip(Buffer != NULL, "No buffer\n"))
return;
if (g_Filesystem == Unknown)
{
trace("Unknown filesystem, running NTFS tests!\n");
}
/* Finally run some tests! */
for (i = 0; i < RTL_NUMBER_OF(Tests); i++)
{
BOOLEAN isDirectory;
NTSTATUS expectedStatus;
if (g_Filesystem == FAT32)
{
isDirectory = Tests[i].IsDirectory_FAT32;
expectedStatus = Tests[i].Status_FAT32;
}
else /* Default to NTFS */
{
isDirectory = Tests[i].IsDirectory_NTFS;
expectedStatus = Tests[i].Status_NTFS;
}
/* Open parent directory first */
ParentHandle = NULL;
if (Tests[i].ParentPathTemplate)
@@ -476,8 +559,8 @@ TestRelativeNames(VOID)
&IoStatus,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
0);
ok(Status == Tests[i].Status,
"[%lu] Status = %lx, expected %lx\n", i, Status, Tests[i].Status);
ok(Status == expectedStatus,
"[%lu] Status = %lx, expected %lx\n", i, Status, expectedStatus);
if (NT_SUCCESS(Status))
ObCloseHandle(FileHandle, KernelMode);
@@ -488,12 +571,20 @@ TestRelativeNames(VOID)
&IoStatus,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_DIRECTORY_FILE);
if (Tests[i].IsDirectory || (!TrailingBackslash && !NT_SUCCESS(Tests[i].Status)))
ok(Status == Tests[i].Status,
"[%lu] Status = %lx, expected %lx\n", i, Status, Tests[i].Status);
if (isDirectory || (!TrailingBackslash && !NT_SUCCESS(expectedStatus)))
{
ok(Status == expectedStatus,
"[%lu] Status = %lx, expected %lx\n", i, Status, expectedStatus);
}
else
ok(Status == STATUS_NOT_A_DIRECTORY,
"[%lu] Status = %lx, expected STATUS_NOT_A_DIRECTORY\n", i, Status);
{
if (g_Filesystem == FAT32)
ok(Status == STATUS_NOT_A_DIRECTORY,
"[%lu] Status = %lx, expected STATUS_NOT_A_DIRECTORY\n", i, Status);
else if (g_Filesystem == NTFS)
ok(Status == STATUS_NOT_A_DIRECTORY || Status == STATUS_INVALID_PARAMETER,
"[%lu] Status = %lx, expected STATUS_NOT_A_DIRECTORY or STATUS_INVALID_PARAMETER\n", i, Status);
}
if (NT_SUCCESS(Status))
ObCloseHandle(FileHandle, KernelMode);
@@ -504,12 +595,12 @@ TestRelativeNames(VOID)
&IoStatus,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_NON_DIRECTORY_FILE);
if (Tests[i].IsDirectory && NT_SUCCESS(Tests[i].Status))
if (isDirectory && NT_SUCCESS(expectedStatus))
ok(Status == STATUS_FILE_IS_A_DIRECTORY,
"[%lu] Status = %lx, expected STATUS_FILE_IS_A_DIRECTORY\n", i, Status);
else
ok(Status == Tests[i].Status,
"[%lu] Status = %lx, expected %lx\n", i, Status, Tests[i].Status);
ok(Status == expectedStatus,
"[%lu] Status = %lx, expected %lx\n", i, Status, expectedStatus);
if (NT_SUCCESS(Status))
ObCloseHandle(FileHandle, KernelMode);
@@ -520,12 +611,20 @@ TestRelativeNames(VOID)
&IoStatus,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE);
if (Tests[i].Status == STATUS_OBJECT_NAME_INVALID && Tests[i].IsDrive)
ok(Status == STATUS_OBJECT_NAME_INVALID,
"[%lu] Status = %lx, expected STATUS_OBJECT_NAME_INVALID\n", i, Status);
if (expectedStatus == STATUS_OBJECT_NAME_INVALID && Tests[i].IsDrive)
{
if (g_Filesystem == FAT32)
ok(Status == STATUS_OBJECT_NAME_INVALID,
"[%lu] Status = %lx, expected STATUS_OBJECT_NAME_INVALID\n", i, Status);
else if (g_Filesystem == NTFS)
ok(Status == STATUS_INVALID_PARAMETER,
"[%lu] Status = %lx, expected STATUS_INVALID_PARAMETER\n", i, Status);
}
else
{
ok(Status == STATUS_INVALID_PARAMETER,
"[%lu] Status = %lx, expected STATUS_INVALID_PARAMETER\n", i, Status);
}
if (NT_SUCCESS(Status))
ObCloseHandle(FileHandle, KernelMode);
@@ -542,21 +641,21 @@ TestRelativeNames(VOID)
0,
NULL,
0);
if (Tests[i].Status == STATUS_OBJECT_NAME_NOT_FOUND)
if (expectedStatus == STATUS_OBJECT_NAME_NOT_FOUND)
ok(Status == STATUS_SUCCESS,
"[%lu] Status = %lx, expected STATUS_SUCCESS\n", i, Status);
else if (Tests[i].Status == STATUS_OBJECT_NAME_INVALID && Tests[i].IsDrive)
else if (expectedStatus == STATUS_OBJECT_NAME_INVALID && Tests[i].IsDrive)
ok(Status == STATUS_OBJECT_NAME_INVALID,
"[%lu] Status = %lx, expected STATUS_OBJECT_NAME_INVALID\n", i, Status);
else if (Tests[i].IsDrive)
ok(Status == STATUS_ACCESS_DENIED,
"[%lu] Status = %lx, expected STATUS_ACCESS_DENIED\n", i, Status);
else if (Tests[i].Status == STATUS_SUCCESS)
ok(Status == STATUS_OBJECT_NAME_COLLISION,
"[%lu] Status = %lx, expected STATUS_OBJECT_NAME_COLLISION\n", i, Status);
else if (expectedStatus == STATUS_SUCCESS)
ok(Status == STATUS_OBJECT_NAME_COLLISION || Status == STATUS_ACCESS_DENIED,
"[%lu] Status = %lx, expected STATUS_OBJECT_NAME_COLLISION or STATUS_ACCESS_DENIED\n", i, Status);
else
ok(Status == Tests[i].Status,
"[%lu] Status = %lx, expected %lx; %ls -- %ls\n", i, Status, Tests[i].Status, Tests[i].ParentPathTemplate, Tests[i].RelativePathTemplate);
ok(Status == expectedStatus,
"[%lu] Status = %lx, expected %lx; %ls -- %ls\n", i, Status, expectedStatus, Tests[i].ParentPathTemplate, Tests[i].RelativePathTemplate);
if (NT_SUCCESS(Status))
{
if (IoStatus.Information == FILE_CREATED)
@@ -745,6 +844,7 @@ Cleanup:
START_TEST(IoFilesystem)
{
/* TestAllInformation() has to be first since we detect the filesystem there */
TestAllInformation();
TestRelativeNames();
TestSharedCacheMap();

View File

@@ -151,6 +151,7 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType;
#define DOE_REMOVE_PENDING 0x4
#define DOE_REMOVE_PROCESSED 0x8
#define DOE_START_PENDING 0x10
#define DOE_DEFAULT_SD_PRESENT 0x800
//
// Device Object StartIo Flags

View File

@@ -1203,6 +1203,7 @@ typedef struct _TOKEN_ACCESS_INFORMATION {
#define TOKEN_UIACCESS 0x1000
#define TOKEN_NOT_LOW 0x2000
/* See: https://microsoft.github.io/windows-docs-rs/doc/windows/Wdk/Storage/FileSystem/struct.SE_EXPORTS.html */
typedef struct _SE_EXPORTS {
LUID SeCreateTokenPrivilege;
LUID SeAssignPrimaryTokenPrivilege;
@@ -1269,6 +1270,26 @@ typedef struct _SE_EXPORTS {
PSID SeHighMandatorySid;
PSID SeSystemMandatorySid;
PSID SeOwnerRightsSid;
#if (NTDDI_VERSION >= NTDDI_WIN8) || defined(__REACTOS__)
PSID SeAllAppPackagesSid;
PSID SeUserModeDriversSid;
#endif
#if (NTDDI_VERSION >= NTDDI_WIN10_RS4)
PSID SeProcTrustWinTcbSid;
#endif
#if (NTDDI_VERSION >= NTDDI_WIN8)
PSID SeTrustedInstallerSid;
#endif
#if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
LUID SeDelegateSessionUserImpersonatePrivilege;
#endif
#if (NTDDI_VERSION >= NTDDI_WIN11) // The version guard is a guess.
PSID SeAppSiloSid;
PSID SeAppSiloVolumeRootMinimalCapabilitySid;
PSID SeAppSiloProfilesRootMinimalCapabilitySid;
PSID SeAppSiloPromptForAccessCapabilitySid;
PSID SeAppSiloAccessToPublisherDirectoryCapabilitySid;
#endif
} SE_EXPORTS, *PSE_EXPORTS;
typedef NTSTATUS