ReactOS 0.4.15-dev-7961-gdcf9eb0
ZwAllocateVirtualMemory.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite ZwAllocateVirtualMemory/ZwFreeVirtualMemory
5 * PROGRAMMER: Nikolay Borisov <nib9@aber.ac.uk>
6 */
7
8#include <kmt_test.h>
9
10#define ROUND_DOWN(n,align) (((ULONG_PTR)n) & ~((align) - 1l))
11#define DEFAULT_ALLOC_SIZE 200
12#define IGNORE -1
13#define PAGE_NOPROT 0x0 //MEM_RESERVE has this type of "protection"
14
15/* These are being used in ZwMapViewOfSection as well */
16const char TestString[] = "TheLongBrownFoxJumpedTheWhiteRabbitTheLongBrownFoxJumpedTheWhiteRabbitTheLongBrownFoxJumpedTheWhiteRabbitTheLongBrownFoxJumpedTheWhiteRabbitTheLongBrownFoxJumpedTheWhiteRabbitTheLongBrownFoxJumpedThe";
18
20
21typedef struct _TEST_CONTEXT
22{
27 PVOID Bases[1024];
30
31
32#define ALLOC_MEMORY_WITH_FREE(ProcessHandle, BaseAddress, ZeroBits, RegionSize, AllocationType, Protect, RetStatus, FreeStatus) \
33 do { \
34 PVOID __BaseSave = BaseAddress; \
35 Status = ZwAllocateVirtualMemory(ProcessHandle, &BaseAddress, ZeroBits, &RegionSize, AllocationType, Protect); \
36 ok_eq_hex(Status, RetStatus); \
37 if (__BaseSave != NULL) \
38 ok_eq_pointer(BaseAddress, __BaseSave); \
39 else if (!NT_SUCCESS(Status)) \
40 ok_eq_pointer(BaseAddress, NULL); \
41 RegionSize = 0; \
42 Status = ZwFreeVirtualMemory(ProcessHandle, &BaseAddress, &RegionSize, MEM_RELEASE); \
43 if (FreeStatus != IGNORE) ok_eq_hex(Status, FreeStatus); \
44 BaseAddress = NULL; \
45 RegionSize = DEFAULT_ALLOC_SIZE; \
46 } while (0) \
47
48
49
50static
53{
54 PUCHAR Array = Buffer;
55 SIZE_T i;
56
57 for (i = 0; i < Size; i++)
58 {
59 if (Array[i] != Value)
60 {
61 trace("Expected %x, found %x at offset %lu\n", Value, Array[i], (ULONG)i);
62 return FALSE;
63 }
64 }
65 return TRUE;
66}
67
68static
71{
72 SIZE_T Match = 0;
73
76 KmtEndSeh(ExpectedStatus);
77
78 return Match;
79}
80
81static
82VOID
84{
85 //do a little bit of writing/reading to memory
86 SIZE_T Match = 0;
87
90 KmtEndSeh(ExpectedStatus);
91
92 Match = CheckBufferRead(Source, Destination, Length, ExpectedStatus);
93 if (ExpectedStatus == STATUS_SUCCESS) ok_eq_int(Match, Length);
94}
95
96
97static
98VOID
100{
102 PVOID Base = NULL;
104
105 //HANDLE TESTS
109
110 //BASE ADDRESS TESTS
111 Base = (PVOID)0x00567A20;
113
114 Base = (PVOID) 0x60000000;
116
117 Base = (PVOID)((char *)MmSystemRangeStart + 200);
119
120 /* http://jira.reactos.org/browse/CORE-6814 */
121 RegionSize = 0x1000;
124
125 //ZERO BITS TESTS
130
131 //REGION SIZE TESTS
133 RegionSize = -1;
135 RegionSize = 0;
137 RegionSize = 0xFFFFFFFF; // 4 gb is invalid
139
140 //Allocation type tests
155
156 //Memory protection tests
160 {
163 }
165}
166
167
168static
171{
173 PVOID Base = NULL;
175
177 //Normal operation
179 Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &RegionSize, MEM_COMMIT, PAGE_READWRITE);
180 ok_eq_size(RegionSize, 4096);
181
182 //check for the zero-filled pages
183 ok_bool_true(CheckBuffer(Base, RegionSize, 0), "The buffer is not zero-filled");
184
186
187 // try freeing
188 RegionSize = 0;
189 Status = ZwFreeVirtualMemory(NtCurrentProcess(), &Base, &RegionSize, MEM_RELEASE);
192
194 // COMMIT AND RESERVE SCENARIO AND STATE CHANGE
196 //reserve and then commit
197 Base = NULL;
199 Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &RegionSize, MEM_RESERVE, PAGE_READWRITE);
202
203
204 Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &RegionSize, MEM_COMMIT, PAGE_READWRITE);
207
208 RegionSize = 0;
209 ZwFreeVirtualMemory(NtCurrentProcess(), &Base, &RegionSize, MEM_RELEASE);
210
212 // TRY READING/WRITING TO INVALID PROTECTION PAGES
215 Base = NULL;
216 ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &RegionSize, (MEM_COMMIT | MEM_RESERVE), PAGE_NOACCESS);
217
221
224
225 RegionSize = 0;
226 ZwFreeVirtualMemory(NtCurrentProcess(), &Base, &RegionSize, MEM_RELEASE);
227
228 ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &RegionSize, (MEM_COMMIT | MEM_RESERVE), PAGE_READONLY);
232
234
235 ok_bool_true(CheckBuffer(Base, TestStringSize, 0), "Couldn't read a read-only buffer");
236
237 RegionSize = 0;
238 ZwFreeVirtualMemory(NtCurrentProcess(), &Base, &RegionSize, MEM_RELEASE);
239
241 // GUARD PAGES
243
244 RegionSize = 1000;
245 Base = NULL;
246 ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &RegionSize, (MEM_COMMIT | MEM_RESERVE), (PAGE_GUARD | PAGE_READWRITE));
247
252
254
258
259 RegionSize = 0;
260 ZwFreeVirtualMemory(NtCurrentProcess(), &Base, &RegionSize, MEM_RELEASE);
261
262 return Status;
263}
264
265
266static
267VOID
269{
271 SIZE_T RegionSize = 200;
272 PVOID Base = (PVOID) 0x60025000;
273 PVOID ActualStartingAddress = (PVOID)ROUND_DOWN(Base, MM_ALLOCATION_GRANULARITY); //it is rounded down to the nearest allocation granularity (64k) address
274 PVOID EndingAddress = (PVOID)(((ULONG_PTR)Base + RegionSize - 1) | (PAGE_SIZE - 1));
275 SIZE_T ActualSize = BYTES_TO_PAGES((ULONG_PTR)EndingAddress - (ULONG_PTR)ActualStartingAddress) * PAGE_SIZE; //calculates the actual size based on the required pages
276
277 // allocate the memory
278 Status = ZwAllocateVirtualMemory(NtCurrentProcess(), (PVOID *)&Base, 0, &RegionSize, (MEM_COMMIT | MEM_RESERVE), PAGE_READWRITE);
280 ok_eq_size(RegionSize, ActualSize);
281 ok_eq_ulong(Base, ActualStartingAddress);
282 Test_NtQueryVirtualMemory(ActualStartingAddress, ActualSize, MEM_COMMIT, PAGE_READWRITE);
283
284 // try freeing
285 RegionSize = 0;
286 Status = ZwFreeVirtualMemory(NtCurrentProcess(), (PVOID *)&Base, &RegionSize, MEM_RELEASE);
288 ok_eq_ulong(RegionSize, ActualSize);
289}
290
291
292static
295{
297 NTSTATUS ReturnStatus = STATUS_SUCCESS;
298 static PVOID bases[1024]; //assume we are going to allocate only 5 gigs. static here means the arrays is not allocated on the stack but in the BSS segment of the driver
299 ULONG Index = 0;
300 PVOID Base = NULL;
301 SIZE_T RegionSize = 5 * 1024 * 1024; // 5 megabytes;
302
303 RtlZeroMemory(bases, sizeof(bases));
304
305 for (Index = 0; Index < RTL_NUMBER_OF(bases) && NT_SUCCESS(Status); Index++)
306 {
307 Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &RegionSize, AllocationType, PAGE_READWRITE);
308
309 bases[Index] = Base;
310 if ((Index % 10) == 0)
311 {
313 {
315 }
316 else
317 {
319 }
320 }
321
322 Base = NULL;
323 }
324
325 trace("Finished reserving. Error code %x. Chunks allocated: %d\n", Status, Index );
326
327 ReturnStatus = Status;
328
329 //free the allocated memory so that we can continue with the tests
331 Index = 0;
332 while (NT_SUCCESS(Status) && Index < RTL_NUMBER_OF(bases))
333 {
334 RegionSize = 0;
335 Status = ZwFreeVirtualMemory(NtCurrentProcess(), &bases[Index], &RegionSize, MEM_RELEASE);
336 bases[Index++] = NULL;
337 }
338
339 return ReturnStatus;
340}
341
342
343static
344VOID
345NTAPI
347{
349 PTEST_CONTEXT Context = (PTEST_CONTEXT)StartContext;
350 ULONG Index = 0;
351 PVOID Base = NULL;
352
353 PAGED_CODE();
354
355 RtlZeroMemory(Context->Bases, sizeof(Context->Bases));
356
357 Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &Context->RegionSize, Context->AllocationType, Context->Protect);
358 ZwFreeVirtualMemory(NtCurrentProcess(), &Base, &Context->RegionSize, MEM_RELEASE);
359 Base = NULL;
360
361 //if the previous allocation has failed there is no need to do the loop
362 while (NT_SUCCESS(Status) && Index < RTL_NUMBER_OF(Context->Bases))
363 {
364 Status = ZwAllocateVirtualMemory(NtCurrentProcess(), &Base, 0, &Context->RegionSize, Context->AllocationType, Context->Protect);
365
366 Context->Bases[Index] = Base;
367 if ((Index % 10) == 0)
368 {
369 if (Context->AllocationType == MEM_COMMIT)
370 {
372 }
373 else
374 {
376 }
377 }
378
379 Base = NULL;
380 Index++;
381 }
382
383 trace("[SYSTEM THREAD %d]. Error code %x. Chunks allocated: %d\n", Context->ThreadId, Status, Index);
384
385 //free the allocated memory so that we can continue with the tests
387 Index = 0;
388 while (NT_SUCCESS(Status) && Index < RTL_NUMBER_OF(Context->Bases))
389 {
390 Context->RegionSize = 0;
391 Status = ZwFreeVirtualMemory(NtCurrentProcess(), &Context->Bases[Index], &Context->RegionSize, MEM_RELEASE);
392 Context->Bases[Index++] = NULL;
393 }
394
396}
397
398
399static
400VOID
402{
403 PAGED_CODE();
404
406 Ctx->Protect = Protect;
407 Ctx->RegionSize = RegionSize;
408 Ctx->ThreadId = ThreadId;
409}
410
411
412static
413VOID
415{
419 PVOID ThreadObjects[2] = { NULL };
421 PTEST_CONTEXT StartContext1;
422 PTEST_CONTEXT StartContext2;
423
424 PAGED_CODE();
425
426 StartContext1 = ExAllocatePoolWithTag(PagedPool, sizeof(TEST_CONTEXT), 'tXTC');
427 StartContext2 = ExAllocatePoolWithTag(PagedPool, sizeof(TEST_CONTEXT), 'tXTC');
428 if (StartContext1 == NULL || StartContext2 == NULL)
429 {
430 trace("Error allocating space for context structs\n");
431 goto cleanup;
432 }
433
434 KmtInitTestContext(StartContext1, 1, 1 * 1024 * 1024, MEM_COMMIT, PAGE_READWRITE);
435 KmtInitTestContext(StartContext2, 2, 3 * 1024 * 1024, MEM_COMMIT, PAGE_READWRITE);
437
439 if (!NT_SUCCESS(Status))
440 {
441 trace("Error creating thread1\n");
442 goto cleanup;
443 }
444
446 if (!NT_SUCCESS(Status))
447 {
448 trace("error referencing thread1\n");
449 goto cleanup;
450 }
451
453 if (!NT_SUCCESS(Status))
454 {
455 trace("Error creating thread2\n");
456 goto cleanup;
457 }
458
460 if (!NT_SUCCESS(Status))
461 {
462 trace("error referencing thread2\n");
463 goto cleanup;
464 }
465
466cleanup:
467
468 if (ThreadObjects[0])
470
471 if (StartContext1 != NULL)
472 ExFreePoolWithTag(StartContext1, 'tXTC');
473
474 if (ThreadObjects[1])
476
477 if (StartContext2 != NULL)
478 ExFreePoolWithTag(StartContext2, 'tXTC');
479
480 if (ThreadObjects[0] != NULL)
481 ObDereferenceObject(ThreadObjects[0]);
482
483 if (ThreadObjects[1] != NULL)
484 ObDereferenceObject(ThreadObjects[1]);
485
488
491}
492
493
494START_TEST(ZwAllocateVirtualMemory)
495{
497
499
501
503
506
510
512}
#define PAGED_CODE()
unsigned char BOOLEAN
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
static DWORD WINAPI Thread2(_Inout_opt_ PVOID Parameter)
static DWORD WINAPI Thread1(_Inout_opt_ PVOID Parameter)
static VOID SystemProcessTest(VOID)
struct _TEST_CONTEXT TEST_CONTEXT
static VOID CustomBaseAllocation(VOID)
#define ALLOC_MEMORY_WITH_FREE(ProcessHandle, BaseAddress, ZeroBits, RegionSize, AllocationType, Protect, RetStatus, FreeStatus)
#define PAGE_NOPROT
static VOID KmtInitTestContext(PTEST_CONTEXT Ctx, SHORT ThreadId, ULONG RegionSize, ULONG AllocationType, ULONG Protect)
static VOID NTAPI SystemProcessTestWorker(PVOID StartContext)
#define ROUND_DOWN(n, align)
static SIZE_T CheckBufferRead(CONST VOID *Source, CONST VOID *Destination, SIZE_T Length, NTSTATUS ExpectedStatus)
struct _TEST_CONTEXT * PTEST_CONTEXT
static VOID CheckBufferReadWrite(PVOID Destination, CONST VOID *Source, SIZE_T Length, NTSTATUS ExpectedStatus)
const ULONG TestStringSize
#define DEFAULT_ALLOC_SIZE
static NTSTATUS StressTesting(ULONG AllocationType)
const char TestString[]
static VOID SimpleErrorChecks(VOID)
static NTSTATUS SimpleAllocation(VOID)
static BOOLEAN CheckBuffer(PVOID Buffer, SIZE_T Size, UCHAR Value)
#define ok_eq_hex(value, expected)
Definition: apitest.h:77
#define ok_eq_ulong(value, expected)
Definition: apitest.h:63
#define ok_bool_true(value, desc)
Definition: apitest.h:78
#define ok_eq_size(value, expected)
Definition: apitest.h:69
#define ok_eq_int(value, expected)
Definition: apitest.h:60
#define trace
Definition: atltest.h:70
#define START_TEST(x)
Definition: atltest.h:75
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define PAGE_READONLY
Definition: compat.h:138
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
static void cleanup(void)
Definition: main.c:1335
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define KmtStartSeh()
Definition: kmt_test.h:282
#define Test_NtQueryVirtualMemory(BaseAddress, Size, AllocationType, ProtectionType)
Definition: kmt_test.h:72
#define KmtEndSeh(ExpectedStatus)
Definition: kmt_test.h:288
BOOLEAN KmtIsCheckedBuild
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
#define KernelMode
Definition: asm.h:34
#define MM_ALLOCATION_GRANULARITY
Definition: mmtypes.h:36
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG AllocationType
Definition: mmfuncs.h:410
__kernel_entry _Inout_ _Inout_ PSIZE_T RegionSize
Definition: mmfuncs.h:172
#define MEM_PHYSICAL
Definition: mmtypes.h:87
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3004
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2439
#define MEM_TOP_DOWN
Definition: nt_native.h:1321
#define THREAD_ALL_ACCESS
Definition: nt_native.h:1339
#define PAGE_WRITECOPY
Definition: nt_native.h:1305
#define PAGE_READWRITE
Definition: nt_native.h:1304
#define MEM_RESET
Definition: nt_native.h:1320
#define NtCurrentProcess()
Definition: nt_native.h:1657
#define PAGE_EXECUTE_WRITECOPY
Definition: nt_native.h:1309
#define MEM_RESERVE
Definition: nt_native.h:1314
#define MEM_RELEASE
Definition: nt_native.h:1316
#define MEM_COMMIT
Definition: nt_native.h:1313
#define PAGE_NOACCESS
Definition: nt_native.h:1302
#define PAGE_GUARD
Definition: nt_native.h:1310
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define MmSystemRangeStart
Definition: mm.h:32
NTSTATUS NTAPI PsTerminateSystemThread(IN NTSTATUS ExitStatus)
Definition: kill.c:1145
POBJECT_TYPE PsThreadType
Definition: thread.c:20
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
Definition: thread.c:602
#define STATUS_INVALID_HANDLE
Definition: ntstatus.h:245
#define STATUS_UNABLE_TO_DELETE_SECTION
Definition: ntstatus.h:264
#define STATUS_MEMORY_NOT_ALLOCATED
Definition: ntstatus.h:396
#define STATUS_INVALID_PARAMETER_4
Definition: ntstatus.h:478
#define STATUS_INVALID_PARAMETER_2
Definition: ntstatus.h:476
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:242
#define STATUS_CONFLICTING_ADDRESSES
Definition: ntstatus.h:261
#define STATUS_INVALID_PAGE_PROTECTION
Definition: ntstatus.h:305
#define STATUS_GUARD_PAGE_VIOLATION
Definition: ntstatus.h:182
#define STATUS_INVALID_PARAMETER_3
Definition: ntstatus.h:477
#define STATUS_INVALID_PARAMETER_5
Definition: ntstatus.h:479
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
#define CONST
Definition: pedump.c:81
short SHORT
Definition: pedump.c:59
KMT_TESTFUNC Test_ZwAllocateVirtualMemory
Definition: testlist.c:85
#define STATUS_SUCCESS
Definition: shellext.h:65
EH_STD::basic_string< char, EH_STD::char_traits< char >, eh_allocator(char) > TestString
Definition: test_string.cpp:30
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
@ Executive
Definition: ketypes.h:415
#define BYTES_TO_PAGES(Size)
#define PAGE_WRITECOMBINE
Definition: mmtypes.h:78
#define ObDereferenceObject
Definition: obfuncs.h:203
unsigned char UCHAR
Definition: xmlstorage.h:181
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG _In_ ULONG Protect
Definition: zwfuncs.h:221