2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite MmMapLockedPagesSpecifyCache test user-mode part
5 * PROGRAMMER: Pierre Schweitzer <pierre@reactos.org>
10 #include "MmMapLockedPagesSpecifyCache.h"
12 #define SET_BUFFER_LENGTH(Var, Length) \
14 C_ASSERT(((Length) % sizeof(ULONG)) == 0); \
18 #define FILL_QUERY_BUFFER(QueryBuffer, BufferLength, UseCache) \
20 QueryBuffer.Length = BufferLength; \
21 QueryBuffer.Buffer = NULL; \
22 QueryBuffer.Cached = UseCache; \
25 #define FILL_READ_BUFFER(QueryBuffer, ReadBuffer) \
28 ReadBuffer.Buffer = QueryBuffer.Buffer; \
29 if (!skip(QueryBuffer.Buffer != NULL, "Buffer is NULL\n")) \
31 ReadBuffer.Pattern = WRITE_PATTERN; \
32 ReadBuffer.Length = QueryBuffer.Length; \
33 Buffer = QueryBuffer.Buffer; \
34 for (i = 0; i < ReadBuffer.Length / sizeof(ULONG); ++i) \
36 Buffer[i] = ReadBuffer.Pattern; \
41 #define CHECK_ALLOC(MappedBuffer, BufferLength) \
46 BaseAddress = MappedBuffer; \
47 Size = BufferLength; \
48 Status = NtAllocateVirtualMemory(NtCurrentProcess(), \
54 ok_eq_hex(Status, STATUS_CONFLICTING_ADDRESSES); \
55 BaseAddress = MappedBuffer; \
57 Status = NtFreeVirtualMemory(NtCurrentProcess(), \
61 ok_eq_hex(Status, STATUS_UNABLE_TO_DELETE_SECTION); \
62 BaseAddress = MappedBuffer; \
64 Status = NtFreeVirtualMemory(NtCurrentProcess(), \
68 ok_eq_hex(Status, STATUS_UNABLE_TO_DELETE_SECTION); \
69 Status = NtUnmapViewOfSection(NtCurrentProcess(), \
71 ok_eq_hex(Status, STATUS_NOT_MAPPED_VIEW); \
74 START_TEST(MmMapLockedPagesSpecifyCache
)
76 QUERY_BUFFER QueryBuffer
;
77 READ_BUFFER ReadBuffer
;
82 KmtLoadDriver(L
"MmMapLockedPagesSpecifyCache", FALSE
);
86 SET_BUFFER_LENGTH(BufferLength
, 2048);
87 Length
= sizeof(QUERY_BUFFER
);
88 FILL_QUERY_BUFFER(QueryBuffer
, BufferLength
, FALSE
);
89 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
90 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
91 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
92 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
95 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
96 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
98 Length
= sizeof(QUERY_BUFFER
);
99 FILL_QUERY_BUFFER(QueryBuffer
, BufferLength
, TRUE
);
100 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
101 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
102 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
103 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
106 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
107 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
110 SET_BUFFER_LENGTH(BufferLength
, 4096);
111 Length
= sizeof(QUERY_BUFFER
);
112 FILL_QUERY_BUFFER(QueryBuffer
, BufferLength
, FALSE
);
113 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
114 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
115 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
116 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
119 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
120 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
122 Length
= sizeof(QUERY_BUFFER
);
123 FILL_QUERY_BUFFER(QueryBuffer
, BufferLength
, TRUE
);
124 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
125 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
126 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
127 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
130 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
131 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
134 SET_BUFFER_LENGTH(BufferLength
, 4096 + 2048);
135 Length
= sizeof(QUERY_BUFFER
);
136 FILL_QUERY_BUFFER(QueryBuffer
, BufferLength
, FALSE
);
137 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
138 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
139 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
140 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
143 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
144 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
146 Length
= sizeof(QUERY_BUFFER
);
147 FILL_QUERY_BUFFER(QueryBuffer
, BufferLength
, TRUE
);
148 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
149 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
150 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
151 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
154 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
155 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
158 SET_BUFFER_LENGTH(BufferLength
, 2 * 4096);
159 Length
= sizeof(QUERY_BUFFER
);
160 FILL_QUERY_BUFFER(QueryBuffer
, BufferLength
, FALSE
);
161 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
162 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
163 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
164 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
167 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
168 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
170 Length
= sizeof(QUERY_BUFFER
);
171 FILL_QUERY_BUFFER(QueryBuffer
, BufferLength
, TRUE
);
172 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
173 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
174 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
175 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
178 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
179 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
182 SET_BUFFER_LENGTH(BufferLength
, 2 * 4096 + 2048);
183 QueryBuffer
.Length
= BufferLength
;
184 QueryBuffer
.Buffer
= NULL
;
185 QueryBuffer
.Cached
= FALSE
;
186 Length
= sizeof(QUERY_BUFFER
);
187 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
188 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
189 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
190 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
193 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
194 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
196 QueryBuffer
.Length
= BufferLength
;
197 QueryBuffer
.Buffer
= NULL
;
198 QueryBuffer
.Cached
= TRUE
;
199 Length
= sizeof(QUERY_BUFFER
);
200 ok(KmtSendBufferToDriver(IOCTL_QUERY_BUFFER
, &QueryBuffer
, sizeof(QUERY_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");
201 ok_eq_int(QueryBuffer
.Length
, BufferLength
);
202 ok(QueryBuffer
.Buffer
!= NULL
, "Buffer is NULL\n");
203 CHECK_ALLOC(QueryBuffer
.Buffer
, BufferLength
);
206 FILL_READ_BUFFER(QueryBuffer
, ReadBuffer
);
207 ok(KmtSendBufferToDriver(IOCTL_READ_BUFFER
, &ReadBuffer
, sizeof(READ_BUFFER
), &Length
) == ERROR_SUCCESS
, "\n");