mirror of
https://github.com/reactos/reactos.git
synced 2024-08-03 18:10:54 +00:00
[KMTESTS:MM]
Test various sizes with MmMapLockedPagesSpecifyCache() to show that behavior is strictly identical. This was designed/tested under W2K3. CORE-8204 svn path=/trunk/; revision=74759
This commit is contained in:
parent
440e3c69e4
commit
63eb4b623a
|
@ -20,10 +20,12 @@ typedef struct _READ_BUFFER
|
||||||
{
|
{
|
||||||
USHORT Length;
|
USHORT Length;
|
||||||
PVOID Buffer;
|
PVOID Buffer;
|
||||||
USHORT Pattern;
|
ULONG Pattern;
|
||||||
} READ_BUFFER, *PREAD_BUFFER;
|
} READ_BUFFER, *PREAD_BUFFER;
|
||||||
|
|
||||||
#define IOCTL_QUERY_BUFFER 1
|
#define IOCTL_QUERY_BUFFER 1
|
||||||
#define IOCTL_READ_BUFFER 2
|
#define IOCTL_READ_BUFFER 2
|
||||||
|
|
||||||
|
#define WRITE_PATTERN 0xA4A5A6A7
|
||||||
|
|
||||||
#endif /* !defined _KMTEST_MMMAPLOCKEDPAGESSPECIFYCACHE_H_ */
|
#endif /* !defined _KMTEST_MMMAPLOCKEDPAGESSPECIFYCACHE_H_ */
|
||||||
|
|
|
@ -122,7 +122,7 @@ TestMessageHandler(
|
||||||
Length = QueryBuffer->Length;
|
Length = QueryBuffer->Length;
|
||||||
ok(Length > 0, "Null size!\n");
|
ok(Length > 0, "Null size!\n");
|
||||||
|
|
||||||
CurrentBuffer = ExAllocatePoolWithTag(NonPagedPool, Length + 0x8, 'MLPC');
|
CurrentBuffer = ExAllocatePoolWithTag(NonPagedPool, Length, 'MLPC');
|
||||||
ok(CurrentBuffer != NULL, "ExAllocatePool failed!\n");
|
ok(CurrentBuffer != NULL, "ExAllocatePool failed!\n");
|
||||||
CurrentUser = NULL;
|
CurrentUser = NULL;
|
||||||
if (!skip(CurrentBuffer != NULL, "ExAllocatePool failed!\n"))
|
if (!skip(CurrentBuffer != NULL, "ExAllocatePool failed!\n"))
|
||||||
|
@ -195,14 +195,15 @@ TestMessageHandler(
|
||||||
if (ReadBuffer->Buffer != NULL)
|
if (ReadBuffer->Buffer != NULL)
|
||||||
{
|
{
|
||||||
USHORT i;
|
USHORT i;
|
||||||
PUSHORT KBuffer = MmGetSystemAddressForMdlSafe(CurrentMdl, NormalPagePriority);
|
PULONG KBuffer = MmGetSystemAddressForMdlSafe(CurrentMdl, NormalPagePriority);
|
||||||
ok(KBuffer != NULL, "Failed to get kmode ptr\n");
|
ok(KBuffer != NULL, "Failed to get kmode ptr\n");
|
||||||
|
ok(ReadBuffer->Length % sizeof(ULONG) == 0, "Invalid size: %d\n", ReadBuffer->Length);
|
||||||
|
|
||||||
if (!skip(Buffer != NULL, "Failed to get kmode ptr\n"))
|
if (!skip(Buffer != NULL, "Failed to get kmode ptr\n"))
|
||||||
{
|
{
|
||||||
for (i = 0; i < ReadBuffer->Length / sizeof(USHORT); ++i)
|
for (i = 0; i < ReadBuffer->Length / sizeof(ULONG); ++i)
|
||||||
{
|
{
|
||||||
ok_eq_ulong((ULONG)KBuffer[i], (ULONG)ReadBuffer->Pattern);
|
ok_eq_ulong(KBuffer[i], ReadBuffer->Pattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,44 +9,201 @@
|
||||||
|
|
||||||
#include "MmMapLockedPagesSpecifyCache.h"
|
#include "MmMapLockedPagesSpecifyCache.h"
|
||||||
|
|
||||||
|
#define SET_BUFFER_LENGTH(Var, Length) \
|
||||||
|
{ \
|
||||||
|
C_ASSERT(((Length) % sizeof(ULONG)) == 0); \
|
||||||
|
Var = (Length); \
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(MmMapLockedPagesSpecifyCache)
|
START_TEST(MmMapLockedPagesSpecifyCache)
|
||||||
{
|
{
|
||||||
QUERY_BUFFER QueryBuffer;
|
QUERY_BUFFER QueryBuffer;
|
||||||
READ_BUFFER ReadBuffer;
|
READ_BUFFER ReadBuffer;
|
||||||
DWORD Length;
|
DWORD Length;
|
||||||
USHORT i;
|
USHORT i;
|
||||||
PUSHORT Buffer;
|
PULONG Buffer;
|
||||||
|
USHORT BufferLength;
|
||||||
|
|
||||||
KmtLoadDriver(L"MmMapLockedPagesSpecifyCache", FALSE);
|
KmtLoadDriver(L"MmMapLockedPagesSpecifyCache", FALSE);
|
||||||
KmtOpenDriver();
|
KmtOpenDriver();
|
||||||
|
|
||||||
QueryBuffer.Length = 0x100;
|
// Less than a page
|
||||||
|
SET_BUFFER_LENGTH(BufferLength, 2048);
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
QueryBuffer.Buffer = NULL;
|
QueryBuffer.Buffer = NULL;
|
||||||
QueryBuffer.Cached = FALSE;
|
QueryBuffer.Cached = FALSE;
|
||||||
Length = sizeof(QUERY_BUFFER);
|
Length = sizeof(QUERY_BUFFER);
|
||||||
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
ok_eq_int(QueryBuffer.Length, 0x100);
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
ok_eq_pointer(QueryBuffer.Buffer, NULL);
|
ok_eq_pointer(QueryBuffer.Buffer, NULL);
|
||||||
|
|
||||||
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
Length = 0;
|
Length = 0;
|
||||||
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
QueryBuffer.Length = 0x100;
|
QueryBuffer.Length = BufferLength;
|
||||||
QueryBuffer.Buffer = NULL;
|
QueryBuffer.Buffer = NULL;
|
||||||
QueryBuffer.Cached = TRUE;
|
QueryBuffer.Cached = TRUE;
|
||||||
Length = sizeof(QUERY_BUFFER);
|
Length = sizeof(QUERY_BUFFER);
|
||||||
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
ok_eq_int(QueryBuffer.Length, 0x100);
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
ok(QueryBuffer.Buffer != NULL, "Buffer is NULL\n");
|
ok(QueryBuffer.Buffer != NULL, "Buffer is NULL\n");
|
||||||
|
|
||||||
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
if (!skip(QueryBuffer.Buffer != NULL, "Buffer is NULL\n"))
|
if (!skip(QueryBuffer.Buffer != NULL, "Buffer is NULL\n"))
|
||||||
{
|
{
|
||||||
ReadBuffer.Pattern = 0xA7;
|
ReadBuffer.Pattern = WRITE_PATTERN;
|
||||||
ReadBuffer.Length = QueryBuffer.Length;
|
ReadBuffer.Length = QueryBuffer.Length;
|
||||||
Buffer = QueryBuffer.Buffer;
|
Buffer = QueryBuffer.Buffer;
|
||||||
for (i = 0; i < ReadBuffer.Length / sizeof(USHORT); ++i)
|
for (i = 0; i < ReadBuffer.Length / sizeof(ULONG); ++i)
|
||||||
|
{
|
||||||
|
Buffer[i] = ReadBuffer.Pattern;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Length = 0;
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
|
// 1 page
|
||||||
|
SET_BUFFER_LENGTH(BufferLength, 4096);
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
|
QueryBuffer.Buffer = NULL;
|
||||||
|
QueryBuffer.Cached = FALSE;
|
||||||
|
Length = sizeof(QUERY_BUFFER);
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
|
ok_eq_pointer(QueryBuffer.Buffer, NULL);
|
||||||
|
|
||||||
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
|
Length = 0;
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
|
QueryBuffer.Buffer = NULL;
|
||||||
|
QueryBuffer.Cached = TRUE;
|
||||||
|
Length = sizeof(QUERY_BUFFER);
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
|
ok(QueryBuffer.Buffer != NULL, "Buffer is NULL\n");
|
||||||
|
|
||||||
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
|
if (!skip(QueryBuffer.Buffer != NULL, "Buffer is NULL\n"))
|
||||||
|
{
|
||||||
|
ReadBuffer.Pattern = WRITE_PATTERN;
|
||||||
|
ReadBuffer.Length = QueryBuffer.Length;
|
||||||
|
Buffer = QueryBuffer.Buffer;
|
||||||
|
for (i = 0; i < ReadBuffer.Length / sizeof(ULONG); ++i)
|
||||||
|
{
|
||||||
|
Buffer[i] = ReadBuffer.Pattern;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Length = 0;
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
|
// more than 1 page
|
||||||
|
SET_BUFFER_LENGTH(BufferLength, 4096 + 2048);
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
|
QueryBuffer.Buffer = NULL;
|
||||||
|
QueryBuffer.Cached = FALSE;
|
||||||
|
Length = sizeof(QUERY_BUFFER);
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
|
ok_eq_pointer(QueryBuffer.Buffer, NULL);
|
||||||
|
|
||||||
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
|
Length = 0;
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
|
QueryBuffer.Buffer = NULL;
|
||||||
|
QueryBuffer.Cached = TRUE;
|
||||||
|
Length = sizeof(QUERY_BUFFER);
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
|
ok(QueryBuffer.Buffer != NULL, "Buffer is NULL\n");
|
||||||
|
|
||||||
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
|
if (!skip(QueryBuffer.Buffer != NULL, "Buffer is NULL\n"))
|
||||||
|
{
|
||||||
|
ReadBuffer.Pattern = WRITE_PATTERN;
|
||||||
|
ReadBuffer.Length = QueryBuffer.Length;
|
||||||
|
Buffer = QueryBuffer.Buffer;
|
||||||
|
for (i = 0; i < ReadBuffer.Length / sizeof(ULONG); ++i)
|
||||||
|
{
|
||||||
|
Buffer[i] = ReadBuffer.Pattern;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Length = 0;
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
|
// 2 pages
|
||||||
|
SET_BUFFER_LENGTH(BufferLength, 2 * 4096);
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
|
QueryBuffer.Buffer = NULL;
|
||||||
|
QueryBuffer.Cached = FALSE;
|
||||||
|
Length = sizeof(QUERY_BUFFER);
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
|
ok_eq_pointer(QueryBuffer.Buffer, NULL);
|
||||||
|
|
||||||
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
|
Length = 0;
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
|
QueryBuffer.Buffer = NULL;
|
||||||
|
QueryBuffer.Cached = TRUE;
|
||||||
|
Length = sizeof(QUERY_BUFFER);
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
|
ok(QueryBuffer.Buffer != NULL, "Buffer is NULL\n");
|
||||||
|
|
||||||
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
|
if (!skip(QueryBuffer.Buffer != NULL, "Buffer is NULL\n"))
|
||||||
|
{
|
||||||
|
ReadBuffer.Pattern = WRITE_PATTERN;
|
||||||
|
ReadBuffer.Length = QueryBuffer.Length;
|
||||||
|
Buffer = QueryBuffer.Buffer;
|
||||||
|
for (i = 0; i < ReadBuffer.Length / sizeof(ULONG); ++i)
|
||||||
|
{
|
||||||
|
Buffer[i] = ReadBuffer.Pattern;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Length = 0;
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
|
// more than 2 pages
|
||||||
|
SET_BUFFER_LENGTH(BufferLength, 2 * 4096 + 2048);
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
|
QueryBuffer.Buffer = NULL;
|
||||||
|
QueryBuffer.Cached = FALSE;
|
||||||
|
Length = sizeof(QUERY_BUFFER);
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
|
ok_eq_pointer(QueryBuffer.Buffer, NULL);
|
||||||
|
|
||||||
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
|
Length = 0;
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER, &ReadBuffer, sizeof(READ_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
|
||||||
|
QueryBuffer.Length = BufferLength;
|
||||||
|
QueryBuffer.Buffer = NULL;
|
||||||
|
QueryBuffer.Cached = TRUE;
|
||||||
|
Length = sizeof(QUERY_BUFFER);
|
||||||
|
ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER, &QueryBuffer, sizeof(QUERY_BUFFER), &Length) == ERROR_SUCCESS, "\n");
|
||||||
|
ok_eq_int(QueryBuffer.Length, BufferLength);
|
||||||
|
ok(QueryBuffer.Buffer != NULL, "Buffer is NULL\n");
|
||||||
|
|
||||||
|
ReadBuffer.Buffer = QueryBuffer.Buffer;
|
||||||
|
if (!skip(QueryBuffer.Buffer != NULL, "Buffer is NULL\n"))
|
||||||
|
{
|
||||||
|
ReadBuffer.Pattern = WRITE_PATTERN;
|
||||||
|
ReadBuffer.Length = QueryBuffer.Length;
|
||||||
|
Buffer = QueryBuffer.Buffer;
|
||||||
|
for (i = 0; i < ReadBuffer.Length / sizeof(ULONG); ++i)
|
||||||
{
|
{
|
||||||
Buffer[i] = ReadBuffer.Pattern;
|
Buffer[i] = ReadBuffer.Pattern;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue