ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

obtypes.h
Go to the documentation of this file.
00001 /*++ NDK Version: 0098
00002 
00003 Copyright (c) Alex Ionescu.  All rights reserved.
00004 
00005 Header Name:
00006 
00007     obtypes.h
00008 
00009 Abstract:
00010 
00011     Type definitions for the Object Manager
00012 
00013 Author:
00014 
00015     Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
00016 
00017 --*/
00018 
00019 #ifndef _OBTYPES_H
00020 #define _OBTYPES_H
00021 
00022 //
00023 // Dependencies
00024 //
00025 #include <umtypes.h>
00026 #ifndef NTOS_MODE_USER
00027 #include <extypes.h>
00028 #endif
00029 
00030 #ifdef NTOS_MODE_USER
00031 //
00032 // Definitions for Object Creation
00033 //
00034 #define OBJ_INHERIT                             0x00000002L
00035 #define OBJ_PERMANENT                           0x00000010L
00036 #define OBJ_EXCLUSIVE                           0x00000020L
00037 #define OBJ_CASE_INSENSITIVE                    0x00000040L
00038 #define OBJ_OPENIF                              0x00000080L
00039 #define OBJ_OPENLINK                            0x00000100L
00040 #define OBJ_KERNEL_HANDLE                       0x00000200L
00041 #define OBJ_FORCE_ACCESS_CHECK                  0x00000400L
00042 #define OBJ_VALID_ATTRIBUTES                    0x000007F2L
00043 
00044 #define InitializeObjectAttributes(p,n,a,r,s) { \
00045     (p)->Length = sizeof(OBJECT_ATTRIBUTES);    \
00046     (p)->RootDirectory = (r);                   \
00047     (p)->Attributes = (a);                      \
00048     (p)->ObjectName = (n);                      \
00049     (p)->SecurityDescriptor = (s);              \
00050     (p)->SecurityQualityOfService = NULL;       \
00051 }
00052 
00053 //
00054 // Number of custom-defined bits that can be attached to a handle
00055 //
00056 #define OBJ_HANDLE_TAGBITS                      0x3
00057 
00058 //
00059 // Directory Object Access Rights
00060 //
00061 #define DIRECTORY_QUERY                         0x0001
00062 #define DIRECTORY_TRAVERSE                      0x0002
00063 #define DIRECTORY_CREATE_OBJECT                 0x0004
00064 #define DIRECTORY_CREATE_SUBDIRECTORY           0x0008
00065 #define DIRECTORY_ALL_ACCESS                    (STANDARD_RIGHTS_REQUIRED | 0xF)
00066 
00067 //
00068 // Slash separator used in the OB Namespace (and Registry)
00069 //
00070 #define OBJ_NAME_PATH_SEPARATOR                 L'\\'
00071 
00072 //
00073 // Object Information Classes for NtQueryInformationObject
00074 //
00075 typedef enum _OBJECT_INFORMATION_CLASS
00076 {
00077     ObjectBasicInformation,
00078     ObjectNameInformation,
00079     ObjectTypeInformation,
00080     ObjectTypesInformation,
00081     ObjectHandleFlagInformation,
00082     ObjectSessionInformation,
00083     MaxObjectInfoClass
00084 } OBJECT_INFORMATION_CLASS;
00085 
00086 #else
00087 
00088 //
00089 // Object Flags
00090 //
00091 #define OB_FLAG_CREATE_INFO                     0x01
00092 #define OB_FLAG_KERNEL_MODE                     0x02
00093 #define OB_FLAG_CREATOR_INFO                    0x04
00094 #define OB_FLAG_EXCLUSIVE                       0x08
00095 #define OB_FLAG_PERMANENT                       0x10
00096 #define OB_FLAG_SECURITY                        0x20
00097 #define OB_FLAG_SINGLE_PROCESS                  0x40
00098 #define OB_FLAG_DEFER_DELETE                    0x80
00099 
00100 #define OBJECT_TO_OBJECT_HEADER(o)                          \
00101     CONTAINING_RECORD((o), OBJECT_HEADER, Body)
00102 
00103 #define OBJECT_HEADER_TO_NAME_INFO(h)                       \
00104     ((POBJECT_HEADER_NAME_INFO)(!(h)->NameInfoOffset ?      \
00105         NULL: ((PCHAR)(h) - (h)->NameInfoOffset)))
00106 
00107 #define OBJECT_HEADER_TO_HANDLE_INFO(h)                     \
00108     ((POBJECT_HEADER_HANDLE_INFO)(!(h)->HandleInfoOffset ?  \
00109         NULL: ((PCHAR)(h) - (h)->HandleInfoOffset)))
00110 
00111 #define OBJECT_HEADER_TO_QUOTA_INFO(h)                      \
00112     ((POBJECT_HEADER_QUOTA_INFO)(!(h)->QuotaInfoOffset ?    \
00113         NULL: ((PCHAR)(h) - (h)->QuotaInfoOffset)))
00114 
00115 #define OBJECT_HEADER_TO_CREATOR_INFO(h)                    \
00116     ((POBJECT_HEADER_CREATOR_INFO)(!((h)->Flags &           \
00117         OB_FLAG_CREATOR_INFO) ? NULL: ((PCHAR)(h) -         \
00118         sizeof(OBJECT_HEADER_CREATOR_INFO))))
00119 
00120 #define OBJECT_HEADER_TO_EXCLUSIVE_PROCESS(h)               \
00121     ((!((h)->Flags & OB_FLAG_EXCLUSIVE)) ?                  \
00122         NULL: (((POBJECT_HEADER_QUOTA_INFO)((PCHAR)(h) -    \
00123         (h)->QuotaInfoOffset))->ExclusiveProcess))
00124 
00125 //
00126 // Reasons for Open Callback
00127 //
00128 typedef enum _OB_OPEN_REASON
00129 {
00130     ObCreateHandle,
00131     ObOpenHandle,
00132     ObDuplicateHandle,
00133     ObInheritHandle,
00134     ObMaxOpenReason
00135 } OB_OPEN_REASON;
00136 
00137 #endif
00138 
00139 //
00140 // Object Duplication Flags
00141 //
00142 #define DUPLICATE_SAME_ATTRIBUTES               0x00000004
00143 
00144 //
00145 // Number of hash entries in an Object Directory
00146 //
00147 #define NUMBER_HASH_BUCKETS                     37
00148 
00149 //
00150 // Types for DosDeviceDriveType
00151 //
00152 #define DOSDEVICE_DRIVE_UNKNOWN                 0
00153 #define DOSDEVICE_DRIVE_CALCULATE               1
00154 #define DOSDEVICE_DRIVE_REMOVABLE               2
00155 #define DOSDEVICE_DRIVE_FIXED                   3
00156 #define DOSDEVICE_DRIVE_REMOTE                  4
00157 #define DOSDEVICE_DRIVE_CDROM                   5
00158 #define DOSDEVICE_DRIVE_RAMDISK                 6
00159 
00160 //
00161 // Dump Control Structure for Object Debugging
00162 //
00163 typedef struct _OB_DUMP_CONTROL
00164 {
00165     PVOID Stream;
00166     ULONG Detail;
00167 } OB_DUMP_CONTROL, *POB_DUMP_CONTROL;
00168 
00169 #ifndef NTOS_MODE_USER
00170 
00171 //
00172 // Object Type Callbacks
00173 //
00174 typedef VOID
00175 (NTAPI *OB_DUMP_METHOD)(
00176     IN PVOID Object,
00177     IN POB_DUMP_CONTROL Control OPTIONAL
00178 );
00179 
00180 typedef NTSTATUS
00181 (NTAPI *OB_OPEN_METHOD)(
00182     IN OB_OPEN_REASON Reason,
00183     IN PEPROCESS Process OPTIONAL,
00184     IN PVOID ObjectBody,
00185     IN ACCESS_MASK GrantedAccess,
00186     IN ULONG HandleCount
00187 );
00188 
00189 typedef VOID
00190 (NTAPI *OB_CLOSE_METHOD)(
00191     IN PEPROCESS Process OPTIONAL,
00192     IN PVOID Object,
00193     IN ACCESS_MASK GrantedAccess,
00194     IN ULONG ProcessHandleCount,
00195     IN ULONG SystemHandleCount
00196 );
00197 
00198 typedef VOID
00199 (NTAPI *OB_DELETE_METHOD)(
00200     IN PVOID Object
00201 );
00202 
00203 typedef NTSTATUS
00204 (NTAPI *OB_PARSE_METHOD)(
00205     IN PVOID ParseObject,
00206     IN PVOID ObjectType,
00207     IN OUT PACCESS_STATE AccessState,
00208     IN KPROCESSOR_MODE AccessMode,
00209     IN ULONG Attributes,
00210     IN OUT PUNICODE_STRING CompleteName,
00211     IN OUT PUNICODE_STRING RemainingName,
00212     IN OUT PVOID Context OPTIONAL,
00213     IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
00214     OUT PVOID *Object
00215 );
00216 
00217 typedef NTSTATUS
00218 (NTAPI *OB_SECURITY_METHOD)(
00219     IN PVOID Object,
00220     IN SECURITY_OPERATION_CODE OperationType,
00221     IN PSECURITY_INFORMATION SecurityInformation,
00222     IN PSECURITY_DESCRIPTOR SecurityDescriptor,
00223     IN OUT PULONG CapturedLength,
00224     IN OUT PSECURITY_DESCRIPTOR *ObjectSecurityDescriptor,
00225     IN POOL_TYPE PoolType,
00226     IN PGENERIC_MAPPING GenericMapping
00227 );
00228 
00229 typedef NTSTATUS
00230 (NTAPI *OB_QUERYNAME_METHOD)(
00231     IN PVOID Object,
00232     IN BOOLEAN HasObjectName,
00233     OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
00234     IN ULONG Length,
00235     OUT PULONG ReturnLength,
00236     IN KPROCESSOR_MODE AccessMode
00237 );
00238 
00239 typedef BOOLEAN
00240 (NTAPI *OB_OKAYTOCLOSE_METHOD)(
00241     IN PEPROCESS Process OPTIONAL,
00242     IN PVOID Object,
00243     IN HANDLE Handle,
00244     IN KPROCESSOR_MODE AccessMode
00245 );
00246 
00247 #else
00248 
00249 //
00250 // Object Information Types for NtQueryInformationObject
00251 //
00252 typedef struct _OBJECT_NAME_INFORMATION
00253 {
00254     UNICODE_STRING Name;
00255 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
00256 
00257 #endif
00258 
00259 typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFORMATION
00260 {
00261     BOOLEAN Inherit;
00262     BOOLEAN ProtectFromClose;
00263 } OBJECT_HANDLE_ATTRIBUTE_INFORMATION, *POBJECT_HANDLE_ATTRIBUTE_INFORMATION;
00264 
00265 typedef struct _OBJECT_DIRECTORY_INFORMATION
00266 {
00267     UNICODE_STRING Name;
00268     UNICODE_STRING TypeName;
00269 } OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION;
00270 
00271 //
00272 // Object Type Information
00273 //
00274 typedef struct _OBJECT_TYPE_INFORMATION
00275 {
00276     UNICODE_STRING TypeName;
00277     ULONG TotalNumberOfObjects;
00278     ULONG TotalNumberOfHandles;
00279     ULONG TotalPagedPoolUsage;
00280     ULONG TotalNonPagedPoolUsage;
00281     ULONG TotalNamePoolUsage;
00282     ULONG TotalHandleTableUsage;
00283     ULONG HighWaterNumberOfObjects;
00284     ULONG HighWaterNumberOfHandles;
00285     ULONG HighWaterPagedPoolUsage;
00286     ULONG HighWaterNonPagedPoolUsage;
00287     ULONG HighWaterNamePoolUsage;
00288     ULONG HighWaterHandleTableUsage;
00289     ULONG InvalidAttributes;
00290     GENERIC_MAPPING GenericMapping;
00291     ULONG ValidAccessMask;
00292     BOOLEAN SecurityRequired;
00293     BOOLEAN MaintainHandleCount;
00294     ULONG PoolType;
00295     ULONG DefaultPagedPoolCharge;
00296     ULONG DefaultNonPagedPoolCharge;
00297 } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
00298 
00299 typedef struct _OBJECT_ALL_TYPES_INFORMATION
00300 {
00301     ULONG NumberOfTypes;
00302     //OBJECT_TYPE_INFORMATION TypeInformation[1];
00303 } OBJECT_ALL_TYPES_INFORMATION, *POBJECT_ALL_TYPES_INFORMATION;
00304 
00305 #ifdef NTOS_MODE_USER
00306 
00307 typedef struct _OBJECT_BASIC_INFORMATION
00308 {
00309     ULONG Attributes;
00310     ACCESS_MASK GrantedAccess;
00311     ULONG HandleCount;
00312     ULONG PointerCount;
00313     ULONG PagedPoolUsage;
00314     ULONG NonPagedPoolUsage;
00315     ULONG Reserved[3];
00316     ULONG NameInformationLength;
00317     ULONG TypeInformationLength;
00318     ULONG SecurityDescriptorLength;
00319     LARGE_INTEGER CreateTime;
00320 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
00321 
00322 #else
00323 
00324 typedef struct _OBJECT_CREATE_INFORMATION
00325 {
00326     ULONG Attributes;
00327     HANDLE RootDirectory;
00328     PVOID ParseContext;
00329     KPROCESSOR_MODE ProbeMode;
00330     ULONG PagedPoolCharge;
00331     ULONG NonPagedPoolCharge;
00332     ULONG SecurityDescriptorCharge;
00333     PSECURITY_DESCRIPTOR SecurityDescriptor;
00334     PSECURITY_QUALITY_OF_SERVICE SecurityQos;
00335     SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
00336 } OBJECT_CREATE_INFORMATION, *POBJECT_CREATE_INFORMATION;
00337 
00338 //
00339 // Object Type Initialize for ObCreateObjectType
00340 //
00341 typedef struct _OBJECT_TYPE_INITIALIZER
00342 {
00343     USHORT Length;
00344     BOOLEAN UseDefaultObject;
00345     BOOLEAN CaseInsensitive;
00346     ULONG InvalidAttributes;
00347     GENERIC_MAPPING GenericMapping;
00348     ULONG ValidAccessMask;
00349     BOOLEAN SecurityRequired;
00350     BOOLEAN MaintainHandleCount;
00351     BOOLEAN MaintainTypeList;
00352     POOL_TYPE PoolType;
00353     ULONG DefaultPagedPoolCharge;
00354     ULONG DefaultNonPagedPoolCharge;
00355     OB_DUMP_METHOD DumpProcedure;
00356     OB_OPEN_METHOD OpenProcedure;
00357     OB_CLOSE_METHOD CloseProcedure;
00358     OB_DELETE_METHOD DeleteProcedure;
00359     OB_PARSE_METHOD ParseProcedure;
00360     OB_SECURITY_METHOD SecurityProcedure;
00361     OB_QUERYNAME_METHOD QueryNameProcedure;
00362     OB_OKAYTOCLOSE_METHOD OkayToCloseProcedure;
00363 } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
00364 
00365 //
00366 // Object Type Object
00367 //
00368 typedef struct _OBJECT_TYPE
00369 {
00370     ERESOURCE Mutex;
00371     LIST_ENTRY TypeList;
00372     UNICODE_STRING Name;
00373     PVOID DefaultObject;
00374     ULONG Index;
00375     ULONG TotalNumberOfObjects;
00376     ULONG TotalNumberOfHandles;
00377     ULONG HighWaterNumberOfObjects;
00378     ULONG HighWaterNumberOfHandles;
00379     OBJECT_TYPE_INITIALIZER TypeInfo;
00380     ULONG Key;
00381     ERESOURCE ObjectLocks[4];
00382 } OBJECT_TYPE;
00383 
00384 //
00385 // Object Directory Structures
00386 //
00387 typedef struct _OBJECT_DIRECTORY_ENTRY
00388 {
00389     struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
00390     PVOID Object;
00391 #if (NTDDI_VERSION >= NTDDI_WS03)
00392     ULONG HashValue;
00393 #endif
00394 } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
00395 
00396 typedef struct _OBJECT_DIRECTORY
00397 {
00398     struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[NUMBER_HASH_BUCKETS];
00399 #if (NTDDI_VERSION < NTDDI_WINXP)
00400     ERESOURCE Lock;
00401 #else
00402     EX_PUSH_LOCK Lock;
00403 #endif
00404 #if (NTDDI_VERSION < NTDDI_WINXP)
00405     BOOLEAN CurrentEntryValid;
00406 #else
00407     struct _DEVICE_MAP *DeviceMap;
00408 #endif
00409     ULONG SessionId;
00410 #if (NTDDI_VERSION == NTDDI_WINXP)
00411     USHORT Reserved;
00412     USHORT SymbolicLinkUsageCount;
00413 #endif
00414 } OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
00415 
00416 //
00417 // Object Header Addon Information
00418 //
00419 typedef struct _OBJECT_HEADER_NAME_INFO
00420 {
00421     POBJECT_DIRECTORY Directory;
00422     UNICODE_STRING Name;
00423     ULONG QueryReferences;
00424     ULONG Reserved2;
00425     ULONG DbgReferenceCount;
00426 } OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
00427 
00428 typedef struct _OBJECT_HANDLE_COUNT_ENTRY
00429 {
00430     struct _EPROCESS *Process;
00431     ULONG HandleCount;
00432 } OBJECT_HANDLE_COUNT_ENTRY, *POBJECT_HANDLE_COUNT_ENTRY;
00433 
00434 typedef struct _OBJECT_HANDLE_COUNT_DATABASE
00435 {
00436     ULONG CountEntries;
00437     OBJECT_HANDLE_COUNT_ENTRY HandleCountEntries[1];
00438 } OBJECT_HANDLE_COUNT_DATABASE, *POBJECT_HANDLE_COUNT_DATABASE;
00439 
00440 typedef struct _OBJECT_HEADER_HANDLE_INFO
00441 {
00442     union
00443     {
00444         POBJECT_HANDLE_COUNT_DATABASE HandleCountDatabase;
00445         OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
00446     };
00447 } OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;
00448 
00449 typedef struct _OBJECT_HEADER_CREATOR_INFO
00450 {
00451     LIST_ENTRY TypeList;
00452     PVOID CreatorUniqueProcess;
00453     USHORT CreatorBackTraceIndex;
00454     USHORT Reserved;
00455 } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;
00456 
00457 typedef struct _OBJECT_HEADER_QUOTA_INFO
00458 {
00459     ULONG PagedPoolCharge;
00460     ULONG NonPagedPoolCharge;
00461     ULONG SecurityDescriptorCharge;
00462     PEPROCESS ExclusiveProcess;
00463 } OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO;
00464 
00465 //
00466 // Object Header
00467 //
00468 typedef struct _OBJECT_HEADER
00469 {
00470     LONG PointerCount;
00471     union
00472     {
00473         LONG HandleCount;
00474         volatile PVOID NextToFree;
00475     };
00476     POBJECT_TYPE Type;
00477     UCHAR NameInfoOffset;
00478     UCHAR HandleInfoOffset;
00479     UCHAR QuotaInfoOffset;
00480     UCHAR Flags;
00481     union
00482     {
00483         POBJECT_CREATE_INFORMATION ObjectCreateInfo;
00484         PVOID QuotaBlockCharged;
00485     };
00486     PSECURITY_DESCRIPTOR SecurityDescriptor;
00487     QUAD Body;
00488 } OBJECT_HEADER, *POBJECT_HEADER;
00489 
00490 //
00491 // Object Lookup Context
00492 //
00493 typedef struct _OBP_LOOKUP_CONTEXT
00494 {
00495     POBJECT_DIRECTORY Directory;
00496     PVOID Object;
00497     ULONG HashValue;
00498     USHORT HashIndex;
00499     BOOLEAN DirectoryLocked;
00500     ULONG LockStateSignature;
00501 } OBP_LOOKUP_CONTEXT, *POBP_LOOKUP_CONTEXT;
00502 
00503 //
00504 // Device Map
00505 //
00506 typedef struct _DEVICE_MAP
00507 {
00508     POBJECT_DIRECTORY DosDevicesDirectory;
00509     POBJECT_DIRECTORY GlobalDosDevicesDirectory;
00510     ULONG ReferenceCount;
00511     ULONG DriveMap;
00512     UCHAR DriveType[32];
00513 } DEVICE_MAP, *PDEVICE_MAP;
00514 
00515 //
00516 // Symbolic Link Object
00517 //
00518 typedef struct _OBJECT_SYMBOLIC_LINK
00519 {
00520     LARGE_INTEGER CreationTime;
00521     UNICODE_STRING LinkTarget;
00522     UNICODE_STRING LinkTargetRemaining;
00523     PVOID LinkTargetObject;
00524     ULONG DosDeviceDriveIndex;
00525 } OBJECT_SYMBOLIC_LINK, *POBJECT_SYMBOLIC_LINK;
00526 
00527 //
00528 // Kernel Exports
00529 //
00530 extern POBJECT_TYPE NTSYSAPI ObDirectoryType;
00531 extern PDEVICE_MAP NTSYSAPI ObSystemDeviceMap;
00532 
00533 #endif // !NTOS_MODE_USER
00534 
00535 #endif // _OBTYPES_H

Generated on Sat May 26 2012 04:29:39 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.