ReactOS 0.4.16-dev-340-g0540c21
ObReference.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 Object Referencing test
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8#include <kmt_test.h>
9#define NDEBUG
10#include <debug.h>
11
12#define CheckObject(Handle, Pointers, Handles) do \
13{ \
14 PUBLIC_OBJECT_BASIC_INFORMATION ObjectInfo; \
15 Status = ZwQueryObject(Handle, ObjectBasicInformation, \
16 &ObjectInfo, sizeof ObjectInfo, NULL); \
17 ok_eq_hex(Status, STATUS_SUCCESS); \
18 ok_eq_ulong(ObjectInfo.PointerCount, Pointers); \
19 ok_eq_ulong(ObjectInfo.HandleCount, Handles); \
20} while (0)
21
23
24static
25VOID
29 IN PUNICODE_STRING NameUpper OPTIONAL,
30 IN BOOLEAN CaseSensitive,
31 IN ULONG AdditionalReferences,
32 IN BOOLEAN Permanent)
33{
35 LONG_PTR Ret;
37 PVOID Object2 = NULL;
38 PVOID Object3 = NULL;
39 PVOID Object4 = NULL;
40
41 CheckObject(Handle, 2LU + AdditionalReferences, 1LU);
42
45 ok(Object != NULL, "ObReferenceObjectByHandle returned NULL object\n");
46 CheckObject(Handle, 3LU + AdditionalReferences, 1LU);
47
50 ok(Object != NULL, "ObReferenceObjectByHandle returned NULL object\n");
51 ok_eq_pointer(Object, Object2);
52 CheckObject(Handle, 4LU + AdditionalReferences, 1LU);
53
54 if (!skip(Object != NULL, "No object to reference!\n"))
55 {
57 ok_eq_longptr(Ret, (LONG_PTR)4 + AdditionalReferences);
58 CheckObject(Handle, 5LU + AdditionalReferences, 1LU);
59
61 ok_eq_longptr(Ret, (LONG_PTR)5 + AdditionalReferences);
62 CheckObject(Handle, 6LU + AdditionalReferences, 1LU);
63
66 CheckObject(Handle, 7LU + AdditionalReferences, 1LU);
67
70 CheckObject(Handle, 8LU + AdditionalReferences, 1LU);
71
73 ok_eq_longptr(Ret, (LONG_PTR)6 + AdditionalReferences);
74 CheckObject(Handle, 7LU + AdditionalReferences, 1LU);
75
77 ok_eq_longptr(Ret, (LONG_PTR)5 + AdditionalReferences);
78 CheckObject(Handle, 6LU + AdditionalReferences, 1LU);
79
81 ok_eq_longptr(Ret, (LONG_PTR)4 + AdditionalReferences);
82 CheckObject(Handle, 5LU + AdditionalReferences, 1LU);
83
85 ok_eq_longptr(Ret, (LONG_PTR)3 + AdditionalReferences);
86 CheckObject(Handle, 4LU + AdditionalReferences, 1LU);
87 }
88
89 if (Name && !skip(ObDirectoryObjectType != NULL, "No directory object type\n"))
90 {
93 CheckObject(Handle, 5LU + AdditionalReferences, 1LU);
94 }
95
96 if (NameUpper && !skip(ObDirectoryObjectType != NULL, "No directory object type\n"))
97 {
100 CheckObject(Handle, 5LU + AdditionalReferences + !CaseSensitive, 1LU);
101 }
102
103 if (NameUpper && !skip(Object4 != NULL, "No object to dereference\n"))
104 {
105 Ret = ObDereferenceObject(Object4);
106 ok_eq_longptr(Ret, (LONG_PTR)4 + AdditionalReferences);
107 CheckObject(Handle, 5LU + AdditionalReferences, 1LU);
108 }
109 if (Name && !skip(Object3 != NULL, "No object to dereference\n"))
110 {
111 Ret = ObDereferenceObject(Object3);
112 ok_eq_longptr(Ret, (LONG_PTR)3 + AdditionalReferences);
113 CheckObject(Handle, 4LU + AdditionalReferences, 1LU);
114 }
115 if (!skip(Object2 != NULL, "No object to dereference\n"))
116 {
117 Ret = ObDereferenceObject(Object2);
118 ok_eq_longptr(Ret, (LONG_PTR)2 + AdditionalReferences);
119 CheckObject(Handle, 3LU + AdditionalReferences, 1LU);
120 }
121 if (!skip(Object != NULL, "No object to dereference\n"))
122 {
124 ok_eq_longptr(Ret, (LONG_PTR)1 + AdditionalReferences);
125 CheckObject(Handle, 2LU + AdditionalReferences, 1LU);
126 }
127
128 CheckObject(Handle, 2LU + AdditionalReferences, 1LU);
129
130 if (Permanent)
131 {
134 CheckObject(Handle, 2LU + AdditionalReferences, 1LU);
135
138 CheckObject(Handle, 2LU + AdditionalReferences, 1LU);
139 }
140}
141
142START_TEST(ObReference)
143{
148 UNICODE_STRING NameUpper, *pNameUpper;
149 ULONG i;
150 struct
151 {
152 PWSTR Name;
153 ULONG Flags;
154 ULONG AdditionalReferences;
155 } Tests[] =
156 {
157 { NULL, 0, 0 },
159 { NULL, OBJ_KERNEL_HANDLE, 0 },
160 { NULL, OBJ_PERMANENT, 0 },
165 { L"\\YayDirectory0", 0, 1 },
166 { L"\\YayDirectory1", OBJ_CASE_INSENSITIVE, 1 },
167 { L"\\YayDirectory2", OBJ_KERNEL_HANDLE, 1 },
168 { L"\\YayDirectory3", OBJ_PERMANENT, 1 },
169 { L"\\YayDirectory4", OBJ_CASE_INSENSITIVE | OBJ_PERMANENT, 1 },
170 { L"\\YayDirectory5", OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 1 },
171 { L"\\YayDirectory6", OBJ_KERNEL_HANDLE | OBJ_PERMANENT, 1 },
172 { L"\\YayDirectory7", OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE | OBJ_PERMANENT, 1 },
173 };
174 HANDLE ObjectTypeHandle;
175
176 /* ObReferenceObjectByName needs the object type... so get it... */
177 RtlInitUnicodeString(&Name, L"\\ObjectTypes\\Directory");
179 Status = ObOpenObjectByName(&ObjectAttributes, NULL, KernelMode, NULL, 0, NULL, &ObjectTypeHandle);
181 ok(ObjectTypeHandle != NULL, "ObjectTypeHandle = NULL\n");
182 if (!skip(Status == STATUS_SUCCESS && ObjectTypeHandle, "No handle\n"))
183 {
186 ok(ObDirectoryObjectType != NULL, "ObDirectoryObjectType = NULL\n");
187 Status = ZwClose(ObjectTypeHandle);
189 }
190
191 for (i = 0; i < sizeof Tests / sizeof Tests[0]; ++i)
192 {
193 DPRINT("Run %d\n", i);
194 if (Tests[i].Name)
195 {
197 pName = &Name;
198 Status = RtlUpcaseUnicodeString(&NameUpper, &Name, TRUE);
200 if (skip(Status == STATUS_SUCCESS, "No upper case name\n"))
201 pNameUpper = NULL;
202 else
203 pNameUpper = &NameUpper;
204 }
205 else
206 {
207 pName = NULL;
208 pNameUpper = NULL;
209 }
213 ok(DirectoryHandle != NULL, "DirectoryHandle = NULL\n");
214
215 if (!skip(Status == STATUS_SUCCESS && DirectoryHandle, "Cannot proceed without an object\n"))
216 {
217 TestReference(DirectoryHandle, pName, pNameUpper, FALSE, Tests[i].AdditionalReferences, (Tests[i].Flags & OBJ_PERMANENT) != 0);
218 /* try again for good measure */
219 TestReference(DirectoryHandle, pName, pNameUpper, FALSE, Tests[i].AdditionalReferences, FALSE);
220
224 }
225
226 if (pNameUpper)
227 RtlFreeUnicodeString(pNameUpper);
228 }
229
230 if (DirectoryHandle)
231 {
234 }
235
236 /* parameter tests */
237 /* bugcheck at APC_LEVEL
238 Status = ObReferenceObject(NULL);
239 Status = ObReferenceObjectByPointer(NULL, 0, NULL, UserMode);
240 Status = ObReferenceObjectByPointer(NULL, 0, NULL, KernelMode);*/
241
243 {
246 }
247}
static VOID TestReference(IN HANDLE Handle, IN PUNICODE_STRING Name OPTIONAL, IN PUNICODE_STRING NameUpper OPTIONAL, IN BOOLEAN CaseSensitive, IN ULONG AdditionalReferences, IN BOOLEAN Permanent)
Definition: ObReference.c:26
#define CheckObject(Handle, Pointers, Handles)
Definition: ObReference.c:12
static POBJECT_TYPE ObDirectoryObjectType
Definition: ObReference.c:22
static HANDLE DirectoryHandle
Definition: ObType.c:48
unsigned char BOOLEAN
struct test_data Tests[]
struct NameRec_ * Name
Definition: cdprocs.h:460
#define ok_eq_pointer(value, expected)
Definition: apitest.h:59
#define ok_eq_hex(value, expected)
Definition: apitest.h:77
#define ok_eq_longptr(value, expected)
Definition: apitest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
LONG NTSTATUS
Definition: precomp.h:26
#define U(x)
Definition: wordpad.c: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
NTSTATUS RtlUpcaseUnicodeString(PUNICODE_STRING dst, PUNICODE_STRING src, BOOLEAN Alloc)
Definition: string_lib.cpp:46
ULONG Handle
Definition: gdb_input.c:15
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 OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define OBJ_PERMANENT
Definition: winternl.h:226
static LPSTR pName
Definition: security.c:75
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define KernelMode
Definition: asm.h:34
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI NTSTATUS NTAPI ZwMakeTemporaryObject(_In_ HANDLE Handle)
NTSYSAPI NTSTATUS NTAPI ZwCreateDirectoryObject(_Out_ PHANDLE DirectoryHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define DIRECTORY_ALL_ACCESS
Definition: nt_native.h:1259
#define L(x)
Definition: ntvdm.h:50
NTSTATUS NTAPI ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN OUT PVOID ParseContext, OUT PHANDLE Handle)
Definition: obhandle.c:2532
NTSTATUS NTAPI ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath, IN ULONG Attributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext, OUT PVOID *ObjectPtr)
Definition: obref.c:409
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
NTSTATUS NTAPI ObReferenceObjectByPointer(IN PVOID Object, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode)
Definition: obref.c:381
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
uint16_t * PWSTR
Definition: typedefs.h:56
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define ObDereferenceObject
Definition: obfuncs.h:203
#define ObReferenceObject
Definition: obfuncs.h:204