17#define CheckObject(Handle, Pointers, Handles) do \
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); \
69 DPRINT(
"DumpProc() called\n");
83 DPRINT(
"OpenProc() 0x%p, OpenReason %d, HandleCount %lu, AccessMask 0x%lX\n",
100 DPRINT(
"OpenProc() 0x%p, OpenReason %d, HandleCount %lu, AccessMask 0x%lX\n",
116 DPRINT(
"CloseProc() 0x%p, ProcessHandleCount %lu, SystemHandleCount %lu, AccessMask 0x%lX\n",
146 DPRINT(
"ParseProc() called\n");
162 DPRINT(
"OkayToCloseProc() 0x%p, Handle 0x%p, AccessMask 0x%lX\n",
179 DPRINT(
"QueryNameProc() 0x%p, HasObjectName %d, Len %lu, AccessMask 0x%lX\n",
183 ObjectNameInfo =
NULL;
188template<
unsigned NtDdiVersion>
200 WCHAR DirectoryName[
sizeof "\\ObjectTypes\\" - 1];
218 ObTypeInitializer[
i].Length =
sizeof ObTypeInitializer[
i];
220 ObTypeInitializer[
i].MaintainHandleCount =
TRUE;
232 using OPEN_PROCEDURE =
decltype(ObTypeInitializer[
i].OpenProcedure);
233 ObTypeInitializer[
i].CloseProcedure =
CloseProc;
235 ObTypeInitializer[
i].DumpProcedure =
DumpProc;
236 ObTypeInitializer[
i].OpenProcedure = UseNT6Callbacks ? (OPEN_PROCEDURE)
OpenProc_NT6 : (OPEN_PROCEDURE)
OpenProc;
237 ObTypeInitializer[
i].ParseProcedure =
ParseProc;
251 ok(ObjectTypeHandle !=
NULL,
"ObjectTypeHandle = NULL\n");
258 using OPEN_PROCEDURE =
decltype(ObTypes[
i]->TypeInfo.OpenProcedure);
259 ObTypes[
i]->TypeInfo.CloseProcedure =
CloseProc;
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;
272 ok(ObTypes[
i] !=
NULL,
"ObType = NULL\n");
291#define CheckCounts(OpenCount, CloseCount, DeleteCount, ParseCount, \
292 OkayToCloseCount, QueryNameCount) do \
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); \
303#define SaveCounts(Save) memcpy(&Save, &Counts, sizeof Counts)
306#define NUM_OBTYPES2 2
308template<
unsigned NtDdiVersion>
392 if (
skip(Clean,
"Not cleaning up, as requested. Use ObTypeClean to clean up\n"))
415 if (!AlternativeMethod)
418 if (!
skip(ObTypes[
i] !=
NULL,
"No object type to delete\n"))
429 if (!
skip(ObTypes[
i] !=
NULL,
"No object type to delete\n"))
439 DPRINT(
"Reference Name %wZ = %p, ObTypes[%d] = %p\n",
440 ObPathName[
i], TypeObject,
i, ObTypes[
i]);
447template<
unsigned NtDdiVersion>
458 Status = ObtCreateObjectTypes<NtDdiVersion>();
462 DPRINT(
"ObtCreateDirectory() done\n");
464 if (!
skip(ObTypes[0] !=
NULL,
"No object types!\n"))
465 ObtCreateObjects<NtDdiVersion>();
466 DPRINT(
"ObtCreateObjects() done\n");
478 switch (NtDdiVersion)
481 TestObjectType_<NTDDI_WS03>(Clean);
484 TestObjectType_<NTDDI_VISTA>(Clean);
489 TestObjectType_<NTDDI_VISTASP1>(Clean);
492 TestObjectType_<NTDDI_WIN7>(Clean);
495 skip(
FALSE,
"Unsupported NTDDI version: 0x%lx\n", NtDdiVersion);
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
static VOID TestObjectType_(IN BOOLEAN Clean)
static VOID ObtCreateDirectory(VOID)
static OBJECT_ATTRIBUTES ObDirectoryAttributes
static VOID ObtCreateObjects(VOID)
static UNICODE_STRING ObDirectoryName
#define CheckCounts(OpenCount, CloseCount, DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount)
struct _MY_OBJECT2 * PMY_OBJECT2
static HANDLE ObHandle1[NUM_OBTYPES]
static VOID TestObjectType(IN BOOLEAN Clean)
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)
static NTSTATUS ObtCreateObjectTypes(VOID)
#define CheckObject(Handle, Pointers, Handles)
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)
struct _MY_OBJECT1 * PMY_OBJECT1
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)
static PVOID ObBody[NUM_OBTYPES]
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)
static OBJECT_ATTRIBUTES ObAttributes[NUM_OBTYPES]
static VOID ObtClose(BOOLEAN Clean, BOOLEAN AlternativeMethod)
static UNICODE_STRING ObTypeName[NUM_OBTYPES]
static NTSTATUS NTAPI OpenProc(IN OB_OPEN_REASON OpenReason, IN PEPROCESS Process, IN PVOID Object, IN ACCESS_MASK GrantedAccess, IN ULONG HandleCount)
static HANDLE DirectoryHandle
static UNICODE_STRING ObName[NUM_OBTYPES]
static VOID NTAPI DeleteProc(IN PVOID Object)
static VOID NTAPI DumpProc(IN PVOID Object, IN POB_DUMP_CONTROL DumpControl)
static BOOLEAN NTAPI OkayToCloseProc(IN PEPROCESS Process OPTIONAL, IN PVOID Object, IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
struct _MY_OBJECT1 MY_OBJECT1
static PVOID ObTypes_[NUM_OBTYPES]
#define ok_eq_hex(value, expected)
#define ok_eq_longptr(value, expected)
static ULONG GetNTDDIVersion(VOID)
_Inout_ PFCB _Inout_ PUNICODE_STRING RemainingName
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
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
#define InitializeObjectAttributes(p, n, a, r, s)
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
ACCESS_MASK * PACCESS_MASK
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define STANDARD_RIGHTS_ALL
#define OBJECT_TYPE_ALL_ACCESS
_In_ ULONG _In_ ULONG _In_ ULONG Length
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
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)
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)
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)
NTSTATUS NTAPI ObCreateObjectType(IN PUNICODE_STRING TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, IN PVOID Reserved, OUT POBJECT_TYPE *ObjectType)
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)
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)
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
#define _WIN32_WINNT_VISTA
PULONG MinorVersion OPTIONAL
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_OBJECT_NAME_NOT_FOUND
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
#define ObDereferenceObject
#define ObReferenceObject
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE AccessState
_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