struct _EPROCESS;
+typedef enum _OB_OPEN_REASON
+{
+ ObCreateHandle,
+ ObOpenHandle,
+ ObDuplicateHandle,
+ ObInheritHandle,
+ ObMaxOpenReason
+} OB_OPEN_REASON;
+
+/* TEMPORARY HACK */
+typedef NTSTATUS
+(STDCALL *OB_CREATE_METHOD)(
+ PVOID ObjectBody,
+ PVOID Parent,
+ PWSTR RemainingPath,
+ struct _OBJECT_ATTRIBUTES* ObjectAttributes);
+
+/* Object Callbacks */
+typedef NTSTATUS
+(STDCALL *OB_OPEN_METHOD)(
+ OB_OPEN_REASON Reason,
+ PVOID ObjectBody,
+ PEPROCESS Process,
+ ULONG HandleCount,
+ ACCESS_MASK GrantedAccess);
+
+typedef NTSTATUS
+(STDCALL *OB_PARSE_METHOD)(
+ PVOID Object,
+ PVOID *NextObject,
+ PUNICODE_STRING FullPath,
+ PWSTR *Path,
+ ULONG Attributes);
+
+typedef VOID
+(STDCALL *OB_DELETE_METHOD)(
+ PVOID DeletedObject);
+
+typedef VOID
+(STDCALL *OB_CLOSE_METHOD)(
+ PVOID ClosedObject,
+ ULONG HandleCount);
+
+typedef VOID
+(STDCALL *OB_DUMP_METHOD)(
+ VOID);
+
+typedef NTSTATUS
+(STDCALL *OB_OKAYTOCLOSE_METHOD)(
+ VOID);
+
+typedef NTSTATUS
+(STDCALL *OB_QUERYNAME_METHOD)(
+ PVOID ObjectBody,
+ POBJECT_NAME_INFORMATION ObjectNameInfo,
+ ULONG Length,
+ PULONG ReturnLength);
+
+typedef PVOID
+(STDCALL *OB_FIND_METHOD)(
+ PVOID WinStaObject,
+ PWSTR Name,
+ ULONG Attributes);
+
+typedef NTSTATUS
+(STDCALL *OB_SECURITY_METHOD)(
+ PVOID ObjectBody,
+ SECURITY_OPERATION_CODE OperationCode,
+ SECURITY_INFORMATION SecurityInformation,
+ PSECURITY_DESCRIPTOR SecurityDescriptor,
+ PULONG BufferLength);
+
+typedef struct _OBJECT_HEADER_NAME_INFO
+{
+ struct _DIRECTORY_OBJECT *Directory;
+ UNICODE_STRING Name;
+ ULONG QueryReferences;
+ ULONG Reserved2;
+ ULONG DbgReferenceCount;
+} OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
+
+typedef struct _OBJECT_CREATE_INFORMATION
+{
+ ULONG Attributes;
+ HANDLE RootDirectory;
+ PVOID ParseContext;
+ KPROCESSOR_MODE ProbeMode;
+ ULONG PagedPoolCharge;
+ ULONG NonPagedPoolCharge;
+ ULONG SecurityDescriptorCharge;
+ PSECURITY_DESCRIPTOR SecurityDescriptor;
+ PSECURITY_QUALITY_OF_SERVICE SecurityQos;
+ SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
+} OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
+
+typedef struct _OBJECT_TYPE_INITIALIZER
+{
+ WORD Length;
+ UCHAR UseDefaultObject;
+ UCHAR CaseInsensitive;
+ ULONG InvalidAttributes;
+ GENERIC_MAPPING GenericMapping;
+ ULONG ValidAccessMask;
+ UCHAR SecurityRequired;
+ UCHAR MaintainHandleCount;
+ UCHAR MaintainTypeList;
+ POOL_TYPE PoolType;
+ ULONG DefaultPagedPoolCharge;
+ ULONG DefaultNonPagedPoolCharge;
+ OB_DUMP_METHOD DumpProcedure;
+ OB_OPEN_METHOD OpenProcedure;
+ OB_CLOSE_METHOD CloseProcedure;
+ OB_DELETE_METHOD DeleteProcedure;
+ OB_PARSE_METHOD ParseProcedure;
+ OB_SECURITY_METHOD SecurityProcedure;
+ OB_QUERYNAME_METHOD QueryNameProcedure;
+ OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
+} OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
+
+typedef struct _OBJECT_TYPE
+{
+ ERESOURCE Mutex; /* Used to lock the Object Type */
+ LIST_ENTRY TypeList; /* Links all the Types Together for Debugging */
+ UNICODE_STRING Name; /* Name of the Type */
+ PVOID DefaultObject; /* What Object to use during a Wait (ie, FileObjects wait on FileObject->Event) */
+ ULONG Index; /* Index of this Type in the Object Directory */
+ ULONG TotalNumberOfObjects; /* Total number of objects of this type */
+ ULONG TotalNumberOfHandles; /* Total number of handles of this type */
+ ULONG HighWaterNumberOfObjects; /* Peak number of objects of this type */
+ ULONG HighWaterNumberOfHandles; /* Peak number of handles of this type */
+ OBJECT_TYPE_INITIALIZER TypeInfo; /* Information captured during type creation */
+ ULONG Key; /* Key to use when allocating objects of this type */
+ ERESOURCE ObjectLocks[4]; /* Locks for locking the Objects */
+} OBJECT_TYPE;
+
+typedef struct _OBJECT_HANDLE_COUNT_ENTRY
+{
+ struct _EPROCESS *Process;
+ ULONG HandleCount;
+} OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
+
+typedef struct _OBJECT_HANDLE_COUNT_DATABASE
+{
+ ULONG CountEntries;
+ POBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
+} OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
+
+typedef struct _OBJECT_HEADER_HANDLE_INFO
+{
+ union {
+ POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
+ OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
+ };
+} OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
+
+typedef struct _OBJECT_HEADER_CREATOR_INFO
+{
+ LIST_ENTRY TypeList;
+ PVOID CreatorUniqueProcess;
+ USHORT CreatorBackTraceIndex;
+ USHORT Reserved;
+} OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
+
typedef PVOID POBJECT;
typedef struct _QUAD