58 trace(
"Unsupported NTDDI version 0x%lx\n", NtDdiVersion);
63#define GetTypeIndex(TypeName, NtDdiVersion) \
64 (TypeIndex_ ## TypeName[GetNtDdiIndex(NtDdiVersion)])
93#define ok_eq_ustr(value, expected) ok(RtlEqualUnicodeString(value, expected, FALSE), #value " = \"%wZ\", expected \"%%wZ\"\n", value, expected)
95#define CheckObjectType(TypeName, Variable, Flags, InvalidAttr, \
96 ReadMapping, WriteMapping, ExecMapping, AllMapping, \
99 OBJECT_TYPE* ObjectType; \
100 UNICODE_STRING Name; \
102 BOOLEAN UseDefault = ((Flags) & OBT_NO_DEFAULT) == 0; \
103 BOOLEAN CustomSecurityProc = ((Flags) & OBT_CUSTOM_SECURITY_PROC) != 0; \
104 BOOLEAN SecurityRequired = ((Flags) & OBT_SECURITY_REQUIRED) != 0; \
105 BOOLEAN CaseInsensitive = ((Flags) & OBT_CASE_INSENSITIVE) != 0; \
106 BOOLEAN MaintainTypeList = ((Flags) & OBT_MAINTAIN_TYPE_LIST) != 0; \
107 BOOLEAN MaintainHandleCount = ((Flags) & OBT_MAINTAIN_HANDLE_COUNT) != 0; \
108 POOL_TYPE PoolType = ((Flags) & OBT_PAGED_POOL) ? PagedPool : NonPagedPool; \
109 BOOLEAN CustomKey = ((Flags) & OBT_CUSTOM_KEY) != 0; \
110 ULONG Index = GetTypeIndex(TypeName, NtDdiVersion); \
112 trace(#TypeName "\n"); \
113 ObjectType = (OBJECT_TYPE*)GetObjectType(L"\\ObjectTypes\\" L ## #TypeName); \
114 ok(ObjectType != NULL, "ObjectType = NULL\n"); \
115 if (!skip(ObjectType != NULL, "No ObjectType\n")) \
117 ok(!Variable || (OBJECT_TYPE*)Variable == (OBJECT_TYPE*)ObjectType, \
118 #Variable "is %p, expected %p\n", Variable, ObjectType); \
119 RtlInitUnicodeString(&Name, L ## #TypeName); \
120 ok_eq_ustr(&ObjectType->Name, &Name); \
121 ok_eq_ulong(ObjectType->Index, Index); \
125 ok_eq_pointer(ObjectType->DefaultObject, ObpDefaultObject); \
131 ok(ObjectType->HighWaterNumberOfObjects >= ObjectType->TotalNumberOfObjects,\
132 "%lu objects, but high water %lu\n", \
133 ObjectType->TotalNumberOfObjects, ObjectType->HighWaterNumberOfObjects); \
134 ok(ObjectType->HighWaterNumberOfHandles >= ObjectType->TotalNumberOfHandles,\
135 "%lu handles, but high water %lu\n", \
136 ObjectType->TotalNumberOfHandles, ObjectType->HighWaterNumberOfHandles); \
137 ok_eq_ulong(ObjectType->TypeInfo.Length, sizeof(OBJECT_TYPE_INITIALIZER)); \
138 ok_eq_bool(ObjectType->TypeInfo.UseDefaultObject, UseDefault); \
139 ok_eq_bool(ObjectType->TypeInfo.CaseInsensitive, CaseInsensitive); \
140 ok_eq_hex(ObjectType->TypeInfo.InvalidAttributes, InvalidAttr); \
141 ok_eq_hex(ObjectType->TypeInfo.GenericMapping.GenericRead, ReadMapping); \
142 ok_eq_hex(ObjectType->TypeInfo.GenericMapping.GenericWrite, WriteMapping); \
143 ok_eq_hex(ObjectType->TypeInfo.GenericMapping.GenericExecute, ExecMapping); \
144 ok_eq_hex(ObjectType->TypeInfo.GenericMapping.GenericAll, AllMapping); \
145 ok_eq_hex(ObjectType->TypeInfo.ValidAccessMask, ValidMask); \
146 ok_eq_bool(ObjectType->TypeInfo.SecurityRequired, SecurityRequired); \
147 ok_eq_bool(ObjectType->TypeInfo.MaintainHandleCount, MaintainHandleCount); \
148 ok_eq_bool(ObjectType->TypeInfo.MaintainTypeList, MaintainTypeList); \
149 ok_eq_ulong(ObjectType->TypeInfo.PoolType, PoolType); \
157 if (CustomSecurityProc) \
158 ok(ObjectType->TypeInfo.SecurityProcedure != NULL, \
159 "No Security Proc\n"); \
161 ok_eq_pointer(ObjectType->TypeInfo.SecurityProcedure, \
162 SeDefaultObjectMethod); \
165 Key = *(PULONG)#TypeName; \
166 if (sizeof(#TypeName) <= 4) Key |= ' ' << 24; \
167 if (sizeof(#TypeName) <= 3) Key |= ' ' << 16; \
168 if (sizeof(#TypeName) <= 2) Key |= ' ' << 8; \
170 ok_eq_hex(ObjectType->Key, Key); \
171 ObDereferenceObject(ObjectType); \
175#define ObpDirectoryObjectType NULL
176#define ObpSymbolicLinkObjectType NULL
177#define DbgkDebugObjectType NULL
178#define ExEventPairObjectType NULL
179#define ExMutantObjectType NULL
180#define ExCallbackObjectType NULL
181#define ExTimerObjectType NULL
182#define ExProfileObjectType NULL
183#define ExpKeyedEventObjectType NULL
184#define CmpKeyObjectType NULL
185#define LpcWaitablePortObjectType NULL
186#define IoControllerObjectType NULL
187#define IoCompletionObjectType NULL
188#define WmipGuidObjectType NULL
190#define OBT_NO_DEFAULT 0x01
191#define OBT_CUSTOM_SECURITY_PROC 0x02
192#define OBT_SECURITY_REQUIRED 0x04
193#define OBT_CASE_INSENSITIVE 0x08
194#define OBT_MAINTAIN_TYPE_LIST 0x10
195#define OBT_MAINTAIN_HANDLE_COUNT 0x20
196#define OBT_PAGED_POOL 0x40
197#define OBT_CUSTOM_KEY 0x80
199#define TAG(x) RtlUlongByteSwap(x)
201template<
unsigned NtDdiVersion>
221#ifdef _PROPER_NT_NDK_EXPORTS
222#define ObpTypeObjectType *ObpTypeObjectType
223#define ObpDirectoryObjectType *ObpDirectoryObjectType
224#define ObpSymbolicLinkObjectType *ObpSymbolicLinkObjectType
225#define PsJobType *PsJobType
226#define DbgkDebugObjectType *DbgkDebugObjectType
227#define ExEventPairObjectType *ExEventPairObjectType
228#define ExMutantObjectType *ExMutantObjectType
229#define ExCallbackObjectType *ExCallbackObjectType
230#define ExTimerObjectType *ExTimerObjectType
231#define ExProfileObjectType *ExProfileObjectType
232#define ExpKeyedEventObjectType *ExpKeyedEventObjectType
233#define ExWindowStationObjectType *ExWindowStationObjectType
234#define ExDesktopObjectType *ExDesktopObjectType
235#define MmSectionObjectType *MmSectionObjectType
236#define CmpKeyObjectType *CmpKeyObjectType
237#define LpcPortObjectType *LpcPortObjectType
238#define LpcWaitablePortObjectType *LpcWaitablePortObjectType
239#define IoAdapterObjectType *IoAdapterObjectType
240#define IoControllerObjectType *IoControllerObjectType
241#define IoDeviceObjectType *IoDeviceObjectType
242#define IoDriverObjectType *IoDriverObjectType
243#define IoCompletionObjectType *IoCompletionObjectType
244#define WmipGuidObjectType *WmipGuidObjectType
247#define DIR_SEC_REQUIRED ((NtDdiVersion >= NTDDI_VISTA) ? OBT_SECURITY_REQUIRED : 0)
248#define TOKEN_GENERIC_READ ((NtDdiVersion >= NTDDI_VISTA) ? 0x02001a : 0x020008)
249#define TOKEN_GENERIC_WRITE ((NtDdiVersion >= NTDDI_VISTA) ? 0x0201e0 : 0x0200e0)
250#define TOKEN_GENERIC_EXECUTE ((NtDdiVersion >= NTDDI_VISTA) ? 0x020005 : 0x020000)
251#define PROCESS_GENERIC_WRITE ((NtDdiVersion >= NTDDI_VISTA) ? 0x020bea : 0x020beb)
252#define PROCESS_GENERIC_EXECUTE ((NtDdiVersion >= NTDDI_VISTA) ? 0x121001 : 0x120000)
253#define PROCESS_GENERIC_ALL ((NtDdiVersion >= NTDDI_VISTA) ? 0x001fffff : 0x1f0fff)
254#define THREAD_GENERIC_WRITE ((NtDdiVersion >= NTDDI_VISTA) ? 0x020437 : 0x020037)
255#define THREAD_GENERIC_EXECUTE ((NtDdiVersion >= NTDDI_VISTA) ? 0x120800 : 0x120000)
256#define THREAD_GENERIC_ALL ((NtDdiVersion >= NTDDI_VISTA) ? 0x1fffff : 0x1f03ff)
257#define JOB_GENERIC_ALL ((NtDdiVersion >= NTDDI_VISTA) ? 0x1f001f : 0x1f03ff)
258#define KEY_GENERIC_EXECUTE ((NtDdiVersion >= NTDDI_VISTA) ? 0x020039 : 0x020019)
259#define PROCESS_INDEX ((NtDdiVersion >= NTDDI_VISTA) ? 6 : 5)
279 0x130, 0x020303, 0x02001c, 0x020060, 0x0f037f, 0x0f037f);
281 0x130, 0x020041, 0x0200be, 0x020100, 0x0f01ff, 0x0f01ff);
295 0x100, 0x120089, 0x120116, 0x1200a0, 0x1f01ff, 0x1f01ff);
299 0x130, 0x120089, 0x120116, 0x1200a0, 0x1f01ff, 0x1f01ff);
301 0x100, 0x000001, 0x000002, 0x000010, 0x120fff, 0x1f0fff);
333 switch (NtDdiVersion)
336 TestObjectTypes<NTDDI_WS03>();
339 TestObjectTypes<NTDDI_VISTA>();
344 TestObjectTypes<NTDDI_VISTASP1>();
347 TestObjectTypes<NTDDI_WIN7>();
350 skip(
FALSE,
"Unsupported NTDDI version: 0x%lx\n", NtDdiVersion);
const UCHAR TypeIndex_Semaphore[]
#define ObpDirectoryObjectType
const UCHAR TypeIndex_Section[]
#define KEY_GENERIC_EXECUTE
static ULONG GetNtDdiIndex(ULONG NtDdiVersion)
#define TOKEN_GENERIC_EXECUTE
const UCHAR TypeIndex_WaitablePort[]
#define IoCompletionObjectType
const UCHAR TypeIndex_Timer[]
const UCHAR TypeIndex_KeyedEvent[]
const UCHAR TypeIndex_Process[]
const UCHAR TypeIndex_DebugObject[]
const UCHAR TypeIndex_Job[]
#define ExProfileObjectType
#define WmipGuidObjectType
#define TOKEN_GENERIC_READ
#define IoControllerObjectType
const UCHAR TypeIndex_Adapter[]
const UCHAR TypeIndex_SymbolicLink[]
#define OBT_CUSTOM_SECURITY_PROC
const UCHAR TypeIndex_FilterCommunicationPort[]
const UCHAR TypeIndex_Key[]
const UCHAR TypeIndex_Token[]
#define ExEventPairObjectType
#define THREAD_GENERIC_WRITE
#define PROCESS_GENERIC_WRITE
#define THREAD_GENERIC_EXECUTE
const UCHAR TypeIndex_Directory[]
const UCHAR TypeIndex_Device[]
#define OBT_CASE_INSENSITIVE
const UCHAR TypeIndex_File[]
#define LpcWaitablePortObjectType
const UCHAR TypeIndex_FilterConnectionPort[]
static VOID TestObjectTypes(VOID)
#define ExTimerObjectType
const UCHAR TypeIndex_Type[]
#define OBT_MAINTAIN_HANDLE_COUNT
#define OBT_MAINTAIN_TYPE_LIST
const UCHAR TypeIndex_Callback[]
const UCHAR TypeIndex_Driver[]
#define PROCESS_GENERIC_EXECUTE
const UCHAR TypeIndex_Controller[]
const UCHAR TypeIndex_Thread[]
#define ObpSymbolicLinkObjectType
const UCHAR TypeIndex_WindowStation[]
#define DbgkDebugObjectType
#define OBT_SECURITY_REQUIRED
const UCHAR TypeIndex_Profile[]
#define TOKEN_GENERIC_WRITE
#define ExpKeyedEventObjectType
#define ExCallbackObjectType
#define ExMutantObjectType
#define CheckObjectType(TypeName, Variable, Flags, InvalidAttr, ReadMapping, WriteMapping, ExecMapping, AllMapping, ValidMask)
#define PROCESS_GENERIC_ALL
const UCHAR TypeIndex_IoCompletion[]
const UCHAR TypeIndex_Event[]
#define THREAD_GENERIC_ALL
static POBJECT_TYPE GetObjectType(IN PCWSTR TypeName)
const UCHAR TypeIndex_Mutant[]
const UCHAR TypeIndex_Desktop[]
const UCHAR TypeIndex_EventPair[]
const UCHAR TypeIndex_WmiGuid[]
const UCHAR TypeIndex_Port[]
#define ok_eq_pointer(value, expected)
#define ok_eq_hex(value, expected)
static ULONG GetNTDDIVersion(VOID)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
static CHAR Desktop[MAX_PATH]
static const WCHAR SymbolicLink[]
NTSTATUS NTAPI IoCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Ctx)
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
POBJECT_TYPE IoDeviceObjectType
POBJECT_TYPE IoFileObjectType
POBJECT_TYPE LpcPortObjectType
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSTATUS(NTAPI * OB_SECURITY_METHOD)(_In_ PVOID Object, _In_ SECURITY_OPERATION_CODE OperationType, _In_ PSECURITY_INFORMATION SecurityInformation, _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_ PULONG CapturedLength, _Inout_ PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor, _In_ POOL_TYPE PoolType, _In_ PGENERIC_MAPPING GenericMapping)
_In_ BOOLEAN _In_ USHORT Directory
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
POBJECT_TYPE ExEventObjectType
NTSTATUS NTAPI SeDefaultObjectMethod(_In_ PVOID Object, _In_ SECURITY_OPERATION_CODE OperationType, _In_ PSECURITY_INFORMATION SecurityInformation, _Inout_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Inout_opt_ PULONG ReturnLength, _Inout_opt_ PSECURITY_DESCRIPTOR *OldSecurityDescriptor, _In_ POOL_TYPE PoolType, _In_ PGENERIC_MAPPING GenericMapping)
POBJECT_TYPE IoDeviceHandlerObjectType
POBJECT_TYPE IoAdapterObjectType
POBJECT_TYPE IoDriverObjectType
POBJECT_TYPE PsProcessType
POBJECT_TYPE PsThreadType
POBJECT_TYPE SeTokenObjectType
POBJECT_TYPE ObpTypeObjectType
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 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
POBJECT_TYPE MmSectionObjectType
POBJECT_TYPE ExSemaphoreObjectType
OB_SECURITY_METHOD SecurityProcedure
OBJECT_TYPE_INITIALIZER TypeInfo
_Must_inspect_result_ _In_ WDFDEVICE Device
_Must_inspect_result_ _In_ WDFDRIVER Driver
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
POBJECT_TYPE ExDesktopObjectType
POBJECT_TYPE ExWindowStationObjectType
#define ObDereferenceObject