ReactOS 0.4.17-dev-475-g46e69e6
ObType.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPLv2+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Ob Regressions KM-Test
5 * PROGRAMMER: Aleksey Bragin <aleksey@reactos.org>
6 * Thomas Faber <thomas.faber@reactos.org>
7 */
8
9/* TODO: split this into multiple tests! ObLife, ObHandle, ObName, ... */
10
11#include <kmt_test.h>
12#include "ObTypes.hpp"
13
14#define NDEBUG
15#include <debug.h>
16
17#define CheckObject(Handle, Pointers, Handles) do \
18{ \
19 PUBLIC_OBJECT_BASIC_INFORMATION ObjectInfo; \
20 Status = ZwQueryObject(Handle, ObjectBasicInformation, \
21 &ObjectInfo, sizeof ObjectInfo, NULL); \
22 ok_eq_hex(Status, STATUS_SUCCESS); \
23 ok_eq_ulong(ObjectInfo.PointerCount, Pointers); \
24 ok_eq_ulong(ObjectInfo.HandleCount, Handles); \
25} while (0)
26
27#define NUM_OBTYPES 5
28
29typedef struct _MY_OBJECT1
30{
33
34typedef struct _MY_OBJECT2
35{
39
49
50typedef struct _COUNTS
51{
61
62static
63VOID
67 IN POB_DUMP_CONTROL DumpControl)
68{
69 DPRINT("DumpProc() called\n");
70 ++Counts.Dump;
71}
72
73static
77 IN OB_OPEN_REASON OpenReason,
82{
83 DPRINT("OpenProc() 0x%p, OpenReason %d, HandleCount %lu, AccessMask 0x%lX\n",
84 Object, OpenReason, HandleCount, GrantedAccess);
85 ++Counts.Open;
86 return STATUS_SUCCESS;
87}
88
89static
93 _In_ OB_OPEN_REASON OpenReason,
99{
100 DPRINT("OpenProc() 0x%p, OpenReason %d, HandleCount %lu, AccessMask 0x%lX\n",
101 Object, OpenReason, HandleCount, *GrantedAccess);
102 ++Counts.Open;
103 return STATUS_SUCCESS;
104}
105
106static
107VOID
108NTAPI
114 IN ULONG SystemHandleCount)
115{
116 DPRINT("CloseProc() 0x%p, ProcessHandleCount %lu, SystemHandleCount %lu, AccessMask 0x%lX\n",
117 Object, ProcessHandleCount, SystemHandleCount, GrantedAccess);
118 ++Counts.Close;
119}
120
121static
122VOID
123NTAPI
126{
127 DPRINT("DeleteProc() 0x%p\n", Object);
128 ++Counts.Delete;
129}
130
131static
133NTAPI
135 IN PVOID ParseObject,
140 IN OUT PUNICODE_STRING CompleteName,
145{
146 DPRINT("ParseProc() called\n");
147 *Object = NULL;
148
149 ++Counts.Parse;
150 return STATUS_OBJECT_NAME_NOT_FOUND;//STATUS_SUCCESS;
151}
152
153static
155NTAPI
161{
162 DPRINT("OkayToCloseProc() 0x%p, Handle 0x%p, AccessMask 0x%lX\n",
165 return TRUE;
166}
167
168static
170NTAPI
173 IN BOOLEAN HasObjectName,
174 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
178{
179 DPRINT("QueryNameProc() 0x%p, HasObjectName %d, Len %lu, AccessMask 0x%lX\n",
180 Object, HasObjectName, Length, AccessMode);
182
183 ObjectNameInfo = NULL;
184 ReturnLength = 0;
186}
187
188template<unsigned NtDdiVersion>
189static
192{
193 static TOBJECT_TYPE_INITIALIZER<NtDdiVersion> ObTypeInitializer[NUM_OBTYPES];
195 OBJECT_TYPE** ObTypes = reinterpret_cast<OBJECT_TYPE**>(&ObTypes_);
196 INT i;
198 struct
199 {
200 WCHAR DirectoryName[sizeof "\\ObjectTypes\\" - 1];
201 WCHAR TypeName[15];
202 } Name;
204 HANDLE ObjectTypeHandle;
205 UNICODE_STRING ObjectPath;
206 BOOLEAN UseNT6Callbacks = (GetNTVersion() >= _WIN32_WINNT_VISTA);
207
208 RtlCopyMemory(&Name.DirectoryName, L"\\ObjectTypes\\", sizeof Name.DirectoryName);
209
210 for (i = 0; i < NUM_OBTYPES; ++i)
211 {
212 Status = RtlStringCbPrintfW(Name.TypeName, sizeof Name.TypeName, L"MyObjectType%x", i);
215 DPRINT("Creating object type %wZ\n", &ObTypeName[i]);
216
217 RtlZeroMemory(&ObTypeInitializer[i], sizeof ObTypeInitializer[i]);
218 ObTypeInitializer[i].Length = sizeof ObTypeInitializer[i];
219 ObTypeInitializer[i].PoolType = NonPagedPool;
220 ObTypeInitializer[i].MaintainHandleCount = TRUE;
221 ObTypeInitializer[i].ValidAccessMask = OBJECT_TYPE_ALL_ACCESS;
222
223 // Test for invalid parameter
224 // FIXME: Make it more exact, to see which params Win2k3 checks existence of.
225 // Vista+: This triggers a DbgBreakPoint() in the kernel
226 if (NtDdiVersion <= NTDDI_WS03)
227 {
228 Status = ObCreateObjectType(&ObTypeName[i], (POBJECT_TYPE_INITIALIZER)&ObTypeInitializer[i], NULL, (POBJECT_TYPE*)&ObTypes[i]);
230 }
231
232 using OPEN_PROCEDURE = decltype(ObTypeInitializer[i].OpenProcedure);
233 ObTypeInitializer[i].CloseProcedure = CloseProc;
234 ObTypeInitializer[i].DeleteProcedure = DeleteProc;
235 ObTypeInitializer[i].DumpProcedure = DumpProc;
236 ObTypeInitializer[i].OpenProcedure = UseNT6Callbacks ? (OPEN_PROCEDURE)OpenProc_NT6 : (OPEN_PROCEDURE)OpenProc;
237 ObTypeInitializer[i].ParseProcedure = ParseProc;
238 ObTypeInitializer[i].OkayToCloseProcedure = OkayToCloseProc;
239 ObTypeInitializer[i].QueryNameProcedure = QueryNameProc;
240 //ObTypeInitializer[i].SecurityProcedure = SecurityProc;
241
242 Status = ObCreateObjectType(&ObTypeName[i], (POBJECT_TYPE_INITIALIZER)&ObTypeInitializer[i], NULL, (POBJECT_TYPE*)&ObTypes[i]);
244 {
245 /* as we cannot delete the object types, get a pointer if they
246 * already exist */
247 RtlInitUnicodeString(&ObjectPath, Name.DirectoryName);
249 Status = ObOpenObjectByName(&ObjectAttributes, NULL, KernelMode, NULL, 0, NULL, &ObjectTypeHandle);
251 ok(ObjectTypeHandle != NULL, "ObjectTypeHandle = NULL\n");
252 if (!skip(Status == STATUS_SUCCESS && ObjectTypeHandle, "No handle\n"))
253 {
254 Status = ObReferenceObjectByHandle(ObjectTypeHandle, 0, NULL, KernelMode, (PVOID*)&ObTypes[i], NULL);
256 if (!skip(Status == STATUS_SUCCESS && ObTypes[i], "blah\n"))
257 {
258 using OPEN_PROCEDURE = decltype(ObTypes[i]->TypeInfo.OpenProcedure);
259 ObTypes[i]->TypeInfo.CloseProcedure = CloseProc;
260 ObTypes[i]->TypeInfo.DeleteProcedure = DeleteProc;
261 ObTypes[i]->TypeInfo.DumpProcedure = DumpProc;
262 ObTypes[i]->TypeInfo.OpenProcedure = UseNT6Callbacks ? (OPEN_PROCEDURE)OpenProc_NT6 : (OPEN_PROCEDURE)OpenProc;
263 ObTypes[i]->TypeInfo.ParseProcedure = ParseProc;
264 ObTypes[i]->TypeInfo.OkayToCloseProcedure = OkayToCloseProc;
265 ObTypes[i]->TypeInfo.QueryNameProcedure = QueryNameProc;
266 }
267 Status = ZwClose(ObjectTypeHandle);
268 }
269 }
270
272 ok(ObTypes[i] != NULL, "ObType = NULL\n");
273 }
274
275 return STATUS_SUCCESS;
276}
277
278static
279VOID
281{
283
284 RtlInitUnicodeString(&ObDirectoryName, L"\\ObtDirectory");
289}
290
291#define CheckCounts(OpenCount, CloseCount, DeleteCount, ParseCount, \
292 OkayToCloseCount, QueryNameCount) do \
293{ \
294 ok_eq_uint(Counts.Open, OpenCount); \
295 if (Counts.Open != OpenCount) __debugbreak(); \
296 ok_eq_uint(Counts.Close, CloseCount); \
297 ok_eq_uint(Counts.Delete, DeleteCount); \
298 ok_eq_uint(Counts.Parse, ParseCount); \
299 ok_eq_uint(Counts.OkayToClose, OkayToCloseCount); \
300 ok_eq_uint(Counts.QueryName, QueryNameCount); \
301} while (0)
302
303#define SaveCounts(Save) memcpy(&Save, &Counts, sizeof Counts)
304
305/* TODO: make this the same as NUM_OBTYPES */
306#define NUM_OBTYPES2 2
307
308template<unsigned NtDdiVersion>
309static
310VOID
312{
316 INT i;
318 ULONG ObjectSize[NUM_OBTYPES2] = { sizeof(MY_OBJECT1), sizeof(MY_OBJECT2) };
319
320 // Create two objects
321 for (i = 0; i < NUM_OBTYPES2; ++i)
322 {
323 ASSERT(sizeof Name[i] == MAX_PATH * sizeof(WCHAR));
324 Status = RtlStringCbPrintfW(Name[i], sizeof Name[i], L"\\ObtDirectory\\MyObject%d", i + 1);
328 }
330
331 for (i = 0; i < NUM_OBTYPES2; ++i)
332 {
335 }
336
338
339 // Insert them
340 for (i = 0; i < NUM_OBTYPES2; ++i)
341 {
343 Status = ObInsertObject(ObBody[i], NULL, Access[i], 0, &ObBody[i], &ObHandle1[i]);
345 ok(ObBody[i] != NULL, "Object body = NULL\n");
346 ok(ObHandle1[i] != NULL, "Handle = NULL\n");
347 CheckObject(ObHandle1[i], 3LU, 1LU);
348 CheckCounts(SaveCounts.Open + 1, SaveCounts.Close, SaveCounts.Delete, SaveCounts.Parse, SaveCounts.OkayToClose, SaveCounts.QueryName);
351 }
352
353 //DPRINT1("%d %d %d %d %d %d %d\n", DumpCount, OpenCount, CloseCount, DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount);
354 CheckCounts(SaveCounts.Open, SaveCounts.Close, SaveCounts.Delete, SaveCounts.Parse, SaveCounts.OkayToClose, SaveCounts.QueryName);
355}
356
357static
358VOID
360 BOOLEAN Clean,
361 BOOLEAN AlternativeMethod)
362{
363 PVOID* ObTypes = ObTypes_;
365 LONG_PTR Ret;
366 PVOID TypeObject;
367 INT i;
368 UNICODE_STRING ObPathName[NUM_OBTYPES];
370
371 // Close what we have opened and free what we allocated
372 for (i = 0; i < NUM_OBTYPES2; ++i)
373 {
374 if (!skip(ObBody[i] != NULL, "Nothing to dereference\n"))
375 {
376 if (ObHandle1[i]) CheckObject(ObHandle1[i], 3LU, 1LU);
377 Ret = ObReferenceObject(ObBody[i]);
378 if (ObHandle1[i]) CheckObject(ObHandle1[i], 4LU, 1LU);
380 ok_eq_longptr(Ret, (LONG_PTR)2);
381 if (ObHandle1[i]) CheckObject(ObHandle1[i], 3LU, 1LU);
382 ObBody[i] = NULL;
383 }
384 if (!skip(ObHandle1[i] != NULL, "Nothing to close\n"))
385 {
388 ObHandle1[i] = NULL;
389 }
390 }
391
392 if (skip(Clean, "Not cleaning up, as requested. Use ObTypeClean to clean up\n"))
393 return;
394
395 // Now we have to get rid of a directory object
396 // Since it is permanent, we have to firstly make it temporary
397 // and only then kill
398 // (this procedure is described in DDK)
399 if (!skip(DirectoryHandle != NULL, "No directory handle\n"))
400 {
402
406
410 }
411
412 /* we don't delete the object types we created. It makes Windows unstable.
413 * TODO: perhaps make it work in ROS anyway */
414 return;
415 if (!AlternativeMethod)
416 {
417 for (i = 0; i < NUM_OBTYPES; ++i)
418 if (!skip(ObTypes[i] != NULL, "No object type to delete\n"))
419 {
420 Ret = ObDereferenceObject(ObTypes[i]);
421 ok_eq_longptr(Ret, (LONG_PTR)0);
422 ObTypes[i] = NULL;
423 }
424 }
425 else
426 {
427 for (i = 0; i < NUM_OBTYPES; ++i)
428 {
429 if (!skip(ObTypes[i] != NULL, "No object type to delete\n"))
430 {
431 Status = RtlStringCbPrintfW(Name, sizeof Name, L"\\ObjectTypes\\MyObjectType%d", i);
432 RtlInitUnicodeString(&ObPathName[i], Name);
433 Status = ObReferenceObjectByName(&ObPathName[i], OBJ_CASE_INSENSITIVE, NULL, 0L, NULL, KernelMode, NULL, &TypeObject);
434
435 Ret = ObDereferenceObject(TypeObject);
436 ok_eq_longptr(Ret, (LONG_PTR)2);
437 Ret = ObDereferenceObject(TypeObject);
438 ok_eq_longptr(Ret, (LONG_PTR)1);
439 DPRINT("Reference Name %wZ = %p, ObTypes[%d] = %p\n",
440 ObPathName[i], TypeObject, i, ObTypes[i]);
441 ObTypes[i] = NULL;
442 }
443 }
444 }
445}
446
447template<unsigned NtDdiVersion>
448static
449VOID
451 IN BOOLEAN Clean)
452{
453 PVOID* ObTypes = ObTypes_;
455
456 RtlZeroMemory(&Counts, sizeof Counts);
457
458 Status = ObtCreateObjectTypes<NtDdiVersion>();
459 DPRINT("ObtCreateObjectTypes() %s\n", NT_SUCCESS(Status) ? "succeeded" : "failed");
460
462 DPRINT("ObtCreateDirectory() done\n");
463
464 if (!skip(ObTypes[0] != NULL, "No object types!\n"))
465 ObtCreateObjects<NtDdiVersion>();
466 DPRINT("ObtCreateObjects() done\n");
467
468 ObtClose(Clean, FALSE);
469}
470
471static
472VOID
474 IN BOOLEAN Clean)
475{
476 ULONG NtDdiVersion = GetNTDDIVersion();
477
478 switch (NtDdiVersion)
479 {
480 case NTDDI_WS03:
481 TestObjectType_<NTDDI_WS03>(Clean);
482 return;
483 case NTDDI_VISTA:
484 TestObjectType_<NTDDI_VISTA>(Clean);
485 return;
486 case NTDDI_VISTASP1:
487 case NTDDI_VISTASP2:
488 case NTDDI_VISTASP3:
489 TestObjectType_<NTDDI_VISTASP1>(Clean);
490 return;
491 case NTDDI_WIN7:
492 TestObjectType_<NTDDI_WIN7>(Clean);
493 return;
494 default:
495 skip(FALSE, "Unsupported NTDDI version: 0x%lx\n", NtDdiVersion);
496 return;
497 }
498}
499
501{
503}
504
505/* run this to see the objects created in user mode */
506START_TEST(ObTypeNoClean)
507{
509}
510
511/* run this to clean up after ObTypeNoClean */
512START_TEST(ObTypeClean)
513{
515}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
static VOID TestObjectType_(IN BOOLEAN Clean)
Definition: ObType.cpp:450
#define NUM_OBTYPES2
Definition: ObType.cpp:306
static VOID ObtCreateDirectory(VOID)
Definition: ObType.cpp:280
static OBJECT_ATTRIBUTES ObDirectoryAttributes
Definition: ObType.cpp:44
static VOID ObtCreateObjects(VOID)
Definition: ObType.cpp:311
static UNICODE_STRING ObDirectoryName
Definition: ObType.cpp:43
#define CheckCounts(OpenCount, CloseCount, DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount)
Definition: ObType.cpp:291
#define SaveCounts(Save)
Definition: ObType.cpp:303
struct _MY_OBJECT2 * PMY_OBJECT2
static HANDLE ObHandle1[NUM_OBTYPES]
Definition: ObType.cpp:47
static VOID TestObjectType(IN BOOLEAN Clean)
Definition: ObType.cpp:473
struct _COUNTS * PCOUNTS
struct _MY_OBJECT2 MY_OBJECT2
static VOID NTAPI CloseProc(IN PEPROCESS Process, IN PVOID Object, IN ACCESS_MASK GrantedAccess, IN ULONG ProcessHandleCount, IN ULONG SystemHandleCount)
Definition: ObType.cpp:109
static NTSTATUS ObtCreateObjectTypes(VOID)
Definition: ObType.cpp:191
#define CheckObject(Handle, Pointers, Handles)
Definition: ObType.cpp:17
static NTSTATUS NTAPI ParseProc(IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object)
Definition: ObType.cpp:134
struct _MY_OBJECT1 * PMY_OBJECT1
static COUNTS Counts
Definition: ObType.cpp:60
#define NUM_OBTYPES
Definition: ObType.cpp:27
static NTSTATUS NTAPI OpenProc_NT6(_In_ OB_OPEN_REASON OpenReason, _In_ KPROCESSOR_MODE AccessMode, _In_opt_ PEPROCESS Process, _In_ PVOID Object, _In_ PACCESS_MASK GrantedAccess, _In_ ULONG HandleCount)
Definition: ObType.cpp:92
static PVOID ObBody[NUM_OBTYPES]
Definition: ObType.cpp:46
static NTSTATUS NTAPI QueryNameProc(IN PVOID Object, IN BOOLEAN HasObjectName, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength, IN KPROCESSOR_MODE AccessMode)
Definition: ObType.cpp:171
static OBJECT_ATTRIBUTES ObAttributes[NUM_OBTYPES]
Definition: ObType.cpp:45
static VOID ObtClose(BOOLEAN Clean, BOOLEAN AlternativeMethod)
Definition: ObType.cpp:359
struct _COUNTS COUNTS
static UNICODE_STRING ObTypeName[NUM_OBTYPES]
Definition: ObType.cpp:41
static NTSTATUS NTAPI OpenProc(IN OB_OPEN_REASON OpenReason, IN PEPROCESS Process, IN PVOID Object, IN ACCESS_MASK GrantedAccess, IN ULONG HandleCount)
Definition: ObType.cpp:76
static HANDLE DirectoryHandle
Definition: ObType.cpp:48
static UNICODE_STRING ObName[NUM_OBTYPES]
Definition: ObType.cpp:42
static VOID NTAPI DeleteProc(IN PVOID Object)
Definition: ObType.cpp:124
static VOID NTAPI DumpProc(IN PVOID Object, IN POB_DUMP_CONTROL DumpControl)
Definition: ObType.cpp:65
static BOOLEAN NTAPI OkayToCloseProc(IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: ObType.cpp:156
struct _MY_OBJECT1 MY_OBJECT1
static PVOID ObTypes_[NUM_OBTYPES]
Definition: ObType.cpp:40
unsigned char BOOLEAN
Definition: actypes.h:127
#define ok_eq_hex(value, expected)
Definition: apitest.h:134
#define ok_eq_longptr(value, expected)
Definition: apitest.h:127
#define GetNTVersion()
Definition: apitest.h:17
static ULONG GetNTDDIVersion(VOID)
Definition: apitest.h:23
#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
_Inout_ PFCB _Inout_ PUNICODE_STRING RemainingName
Definition: cdprocs.h:802
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
LPWSTR Name
Definition: desk.c:124
#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:33
#define MAX_PATH
Definition: compat.h:34
#define L(x)
Definition: resources.c:13
#define NonPagedPool
Definition: env_spec_w32.h:307
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:24
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 ASSERT(a)
Definition: mode.c:44
ObjectType
Definition: metafile.c:88
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define KernelMode
Definition: asm.h:38
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)
enum _OB_OPEN_REASON OB_OPEN_REASON
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
ACCESS_MASK * PACCESS_MASK
Definition: nt_native.h:41
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
ULONG ACCESS_MASK
Definition: nt_native.h:40
#define STANDARD_RIGHTS_ALL
Definition: nt_native.h:69
#define OBJECT_TYPE_ALL_ACCESS
Definition: nt_native.h:1251
#define GENERIC_ALL
Definition: nt_native.h:92
#define DELETE
Definition: nt_native.h:57
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
OBJECT_TYPE
Definition: ntobjenum.h:13
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
NTSTATUS NTAPI ObInsertObject(IN PVOID Object, IN PACCESS_STATE AccessState OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG ObjectPointerBias, OUT PVOID *NewObject OPTIONAL, OUT PHANDLE Handle)
Definition: obhandle.c:2938
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:2535
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
Definition: oblife.c:1039
NTSTATUS NTAPI ObCreateObjectType(IN PUNICODE_STRING TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, IN PVOID Reserved, OUT POBJECT_TYPE *ObjectType)
Definition: oblife.c:1136
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:408
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:493
short WCHAR
Definition: pedump.c:58
unsigned short USHORT
Definition: pedump.c:61
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define OBJ_PERMANENT
Definition: winternl.h:226
#define NTDDI_VISTA
Definition: sdkddkver.h:103
#define NTDDI_WS03
Definition: sdkddkver.h:92
#define NTDDI_WIN7
Definition: sdkddkver.h:112
#define NTDDI_VISTASP2
Definition: sdkddkver.h:105
#define NTDDI_VISTASP3
Definition: sdkddkver.h:106
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
#define NTDDI_VISTASP1
Definition: sdkddkver.h:104
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
_In_ PVOID Context
Definition: storport.h:2269
USHORT QueryName
Definition: ObType.cpp:58
USHORT Open
Definition: ObType.cpp:53
USHORT Dump
Definition: ObType.cpp:52
USHORT Delete
Definition: ObType.cpp:55
USHORT OkayToClose
Definition: ObType.cpp:57
USHORT Parse
Definition: ObType.cpp:56
USHORT Close
Definition: ObType.cpp:54
ULONG Something1
Definition: ObType.cpp:31
ULONG Something1
Definition: ObType.cpp:36
ULONG SomeLong[10]
Definition: ObType.cpp:37
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
static ULONG HandleCount
Definition: uefidisk.c:67
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
@ ProcessHandleCount
Definition: winternl.h:1902
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396
#define ObDereferenceObject
Definition: obfuncs.h:203
#define ObReferenceObject
Definition: obfuncs.h:204
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE AccessState
Definition: sefuncs.h:417
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET _In_ PGENERIC_MAPPING _In_ KPROCESSOR_MODE _Out_ PACCESS_MASK GrantedAccess
Definition: sefuncs.h:20