Annotation of ntddk/inc/ntddk.h, revision 1.1.1.1

1.1       root        1: /*++ BUILD Version: 0166    // Increment this if a change has global effects
                      2: 
                      3: Copyright (c) 1990-1992  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     ntddk.h
                      8: 
                      9: Abstract:
                     10: 
                     11:     This module defines the NT types, constants, and functions that are
                     12:     exposed to device drivers.
                     13: 
                     14: Revision History:
                     15: 
                     16: --*/
                     17: 
                     18: #ifndef _NTDDK_
                     19: #define _NTDDK_
                     20: 
                     21: #define NT_INCLUDED
                     22: 
                     23: #include <excpt.h>
                     24: #include <ntdef.h>
                     25: #include <ntstatus.h>
                     26: #include <bugcodes.h>
                     27: #include <exlevels.h>
                     28: #include <ntiologc.h>
                     29: 
                     30: //
                     31: // Define types that are not exported.
                     32: //
                     33: 
                     34: typedef struct _KTHREAD *PKTHREAD;
                     35: typedef struct _ETHREAD *PETHREAD;
                     36: typedef struct _EPROCESS *PEPROCESS;
                     37: typedef struct _PEB *PPEB;
                     38: typedef struct _KINTERRUPT *PKINTERRUPT;
                     39: typedef struct _IO_TIMER *PIO_TIMER;
                     40: typedef struct _OBJECT_TYPE *POBJECT_TYPE;
                     41: 
                     42: #if defined(_ALPHA_)
                     43: PKTHREAD KeGetCurrentThread();
                     44: KIRQL KeGetCurrentIrql();
                     45: #endif // defined(_ALPHA_)
                     46: 
                     47: #if defined(MIPS)
                     48: #define KIPCR 0xfffff000
                     49: #define PCR ((volatile KPCR * const)KIPCR)
                     50: #define KeGetCurrentThread() PCR->CurrentThread
                     51: #define KeGetCurrentIrql() PCR->CurrentIrql
                     52: #endif // defined(MIPS)
                     53: 
                     54: #if defined(_M_IX86)
                     55: PKTHREAD KeGetCurrentThread();
                     56: 
                     57: KIRQL KeGetCurrentIrql();
                     58: #endif // defined(_M_IX86)
                     59: 
                     60: #define PsGetCurrentProcess() IoGetCurrentProcess()
                     61: #define PsGetCurrentThread() ((PETHREAD) (KeGetCurrentThread()))
                     62: extern PCCHAR KeNumberProcessors;
                     63: 
                     64: #ifndef DBG
                     65: #define DBG 0
                     66: #endif
                     67: 
                     68: #if DBG
                     69: #define IF_DEBUG if (TRUE)
                     70: #else
                     71: #define IF_DEBUG if (FALSE)
                     72: #endif
                     73: 
                     74: #if DEVL
                     75: //
                     76: // Global flag set by NtPartyByNumber(6) controls behaviour of
                     77: // NT.  See \nt\sdk\inc\ntexapi.h for flag definitions
                     78: //
                     79: 
                     80: extern ULONG NtGlobalFlag;
                     81: 
                     82: #define IF_NTOS_DEBUG( FlagName ) \
                     83:     if (NtGlobalFlag & (FLG_ ## FlagName))
                     84: 
                     85: #else
                     86: #define IF_NTOS_DEBUG( FlagName ) if (FALSE)
                     87: #endif
                     88: 
                     89: //
                     90: // Kernel definitions that need to be here for forward reference purposes
                     91: //
                     92: 
                     93: //
                     94: // Processor modes.
                     95: //
                     96: 
                     97: typedef CCHAR KPROCESSOR_MODE;
                     98: 
                     99: typedef enum _MODE {
                    100:     KernelMode,
                    101:     UserMode,
                    102:     MaximumMode
                    103: } MODE;
                    104: 
                    105: //
                    106: // APC function types
                    107: //
                    108: 
                    109: //
                    110: // Put in an empty definition for the KAPC so that the
                    111: // routines can reference it before it is declared.
                    112: //
                    113: 
                    114: struct _KAPC;
                    115: 
                    116: typedef
                    117: VOID
                    118: (*PKNORMAL_ROUTINE) (
                    119:     IN PVOID NormalContext,
                    120:     IN PVOID SystemArgument1,
                    121:     IN PVOID SystemArgument2
                    122:     );
                    123: 
                    124: typedef
                    125: VOID
                    126: (*PKKERNEL_ROUTINE) (
                    127:     IN struct _KAPC *Apc,
                    128:     IN OUT PKNORMAL_ROUTINE *NormalRoutine,
                    129:     IN OUT PVOID *NormalContext,
                    130:     IN OUT PVOID *SystemArgument1,
                    131:     IN OUT PVOID *SystemArgument2
                    132:     );
                    133: 
                    134: typedef
                    135: VOID
                    136: (*PKRUNDOWN_ROUTINE) (
                    137:     IN struct _KAPC *Apc
                    138:     );
                    139: 
                    140: typedef
                    141: BOOLEAN
                    142: (*PKSYNCHRONIZE_ROUTINE) (
                    143:     IN PVOID SynchronizeContext
                    144:     );
                    145: 
                    146: typedef
                    147: BOOLEAN
                    148: (*PKTRANSFER_ROUTINE) (
                    149:     VOID
                    150:     );
                    151: 
                    152: //
                    153: //
                    154: // Asynchronous Procedure Call (APC) object
                    155: //
                    156: 
                    157: typedef struct _KAPC {
                    158:     CSHORT Type;
                    159:     CSHORT Size;
                    160:     struct _KPROCESS *Process;
                    161:     struct _KTHREAD *Thread;
                    162:     LIST_ENTRY ApcListEntry;
                    163:     PKKERNEL_ROUTINE KernelRoutine;
                    164:     PKRUNDOWN_ROUTINE RundownRoutine;
                    165:     PKNORMAL_ROUTINE NormalRoutine;
                    166:     PVOID NormalContext;
                    167:     PVOID SystemArgument1;
                    168:     PVOID SystemArgument2;
                    169:     CCHAR ApcStateIndex;
                    170:     KPROCESSOR_MODE ApcMode;
                    171:     BOOLEAN Inserted;
                    172: } KAPC;
                    173: 
                    174: typedef KAPC *PKAPC;
                    175: 
                    176: //
                    177: // DPC routine
                    178: //
                    179: 
                    180: struct _KDPC;
                    181: 
                    182: typedef
                    183: VOID
                    184: (*PKDEFERRED_ROUTINE) (
                    185:     IN struct _KDPC *Dpc,
                    186:     IN PVOID DeferredContext,
                    187:     IN PVOID SystemArgument1,
                    188:     IN PVOID SystemArgument2
                    189:     );
                    190: 
                    191: //
                    192: // Deferred Procedure Call (DPC) object
                    193: //
                    194: 
                    195: typedef struct _KDPC {
                    196:     CSHORT Type;
                    197:     CSHORT Size;
                    198:     LIST_ENTRY DpcListEntry;
                    199:     PKDEFERRED_ROUTINE DeferredRoutine;
                    200:     PVOID DeferredContext;
                    201:     PVOID SystemArgument1;
                    202:     PVOID SystemArgument2;
                    203:     BOOLEAN Inserted;
                    204: } KDPC;
                    205: 
                    206: typedef KDPC *PKDPC;
                    207: 
                    208: //
                    209: // Power Notify Routine
                    210: //
                    211: 
                    212: typedef
                    213: VOID
                    214: (*PKNOTIFY_ROUTINE) (
                    215:     IN PVOID NotifyContext
                    216:     );
                    217: 
                    218: //
                    219: // I/O system definitions.
                    220: //
                    221: // Define a Memory Descriptor List (MDL)
                    222: //
                    223: // An MDL describes pages in a virtual buffer in terms of physical pages.  The
                    224: // pages associated with the buffer are described in an array that is allocated
                    225: // just after the MDL header structure itself.  In a future compiler this will
                    226: // be placed at:
                    227: //
                    228: //      ULONG Pages[];
                    229: //
                    230: // Until this declaration is permitted, however, one simply calculates the
                    231: // base of the array by adding one to the base MDL pointer:
                    232: //
                    233: //      Pages = (PULONG) (Mdl + 1);
                    234: //
                    235: // Notice that while in the context of the subject thread, the base virtual
                    236: // address of a buffer mapped by an MDL may be referenced using the following:
                    237: //
                    238: //      Mdl->StartVa | Mdl->ByteOffset
                    239: //
                    240: 
                    241: typedef struct _MDL {
                    242:     struct _MDL *Next;
                    243:     CSHORT Size;
                    244:     CSHORT MdlFlags;
                    245:     struct _EPROCESS *Process;
                    246:     PVOID MappedSystemVa;
                    247:     PVOID StartVa;
                    248:     ULONG ByteCount;
                    249:     ULONG ByteOffset;
                    250: } MDL, *PMDL;
                    251: 
                    252: #define MDL_MAPPED_TO_SYSTEM_VA     0x0001
                    253: #define MDL_PAGES_LOCKED            0x0002
                    254: #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
                    255: #define MDL_ALLOCATED_FROM_ZONE     0x0008
                    256: #define MDL_PARTIAL                 0x0010
                    257: #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
                    258: #define MDL_IO_PAGE_READ            0x0040
                    259: #define MDL_WRITE_OPERATION         0x0080
                    260: #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
                    261: #define MDL_LOCK_HELD               0x0200
                    262: 
                    263: #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA |     \
                    264:                            MDL_PAGES_LOCKED |            \
                    265:                            MDL_SOURCE_IS_NONPAGED_POOL | \
                    266:                            MDL_PARTIAL_HAS_BEEN_MAPPED | \
                    267:                            MDL_PARENT_MAPPED_SYSTEM_VA | \
                    268:                            MDL_LOCK_HELD )
                    269: 
                    270: 
                    271: //
                    272: // switch to DBG when appropriate
                    273: //
                    274: 
                    275: #if DBG
                    276: #define PAGED_CODE() \
                    277:     if (KeGetCurrentIrql() > APC_LEVEL) { \
                    278:        KdPrint(( "EX: Pageable code called at IRQL %d\n", KeGetCurrentIrql() )); \
                    279:         ASSERT(FALSE); \
                    280:         }
                    281: #else
                    282: #define PAGED_CODE()
                    283: #endif
                    284: 
                    285: //
                    286: //  Define an access token from a programmer's viewpoint.  The structure is
                    287: //  completely opaque and the programer is only allowed to have pointers
                    288: //  to tokens.
                    289: //
                    290: 
                    291: typedef PVOID PACCESS_TOKEN;            // winnt
                    292: 
                    293: //
                    294: // Pointer to a SECURITY_DESCRIPTOR  opaque data type.
                    295: //
                    296: 
                    297: typedef PVOID PSECURITY_DESCRIPTOR;     // winnt
                    298: 
                    299: //
                    300: // Define a pointer to the Security ID data type (an opaque data type)
                    301: //
                    302: 
                    303: typedef PVOID PSID;     // winnt
                    304: 
                    305: typedef ULONG ACCESS_MASK;
                    306: typedef ACCESS_MASK *PACCESS_MASK;
                    307: 
                    308: // end_winnt
                    309: //
                    310: //  The following are masks for the predefined standard access types
                    311: //
                    312: 
                    313: #define DELETE                           (0x00010000L)
                    314: #define READ_CONTROL                     (0x00020000L)
                    315: #define WRITE_DAC                        (0x00040000L)
                    316: #define WRITE_OWNER                      (0x00080000L)
                    317: #define SYNCHRONIZE                      (0x00100000L)
                    318: 
                    319: #define STANDARD_RIGHTS_REQUIRED         (0x000F0000L)
                    320: 
                    321: #define STANDARD_RIGHTS_READ             (READ_CONTROL)
                    322: #define STANDARD_RIGHTS_WRITE            (READ_CONTROL)
                    323: #define STANDARD_RIGHTS_EXECUTE          (READ_CONTROL)
                    324: 
                    325: #define STANDARD_RIGHTS_ALL              (0x001F0000L)
                    326: 
                    327: #define SPECIFIC_RIGHTS_ALL              (0x0000FFFFL)
                    328: 
                    329: //
                    330: // AccessSystemAcl access type
                    331: //
                    332: 
                    333: #define ACCESS_SYSTEM_SECURITY           (0x01000000L)
                    334: 
                    335: //
                    336: // MaximumAllowed access type
                    337: //
                    338: 
                    339: #define MAXIMUM_ALLOWED                  (0x02000000L)
                    340: 
                    341: //
                    342: //  These are the generic rights.
                    343: //
                    344: 
                    345: #define GENERIC_READ                     (0x80000000L)
                    346: #define GENERIC_WRITE                    (0x40000000L)
                    347: #define GENERIC_EXECUTE                  (0x20000000L)
                    348: #define GENERIC_ALL                      (0x10000000L)
                    349: 
                    350: 
                    351: //
                    352: //  Define the generic mapping array.  This is used to denote the
                    353: //  mapping of each generic access right to a specific access mask.
                    354: //
                    355: 
                    356: typedef struct _GENERIC_MAPPING {
                    357:     ACCESS_MASK GenericRead;
                    358:     ACCESS_MASK GenericWrite;
                    359:     ACCESS_MASK GenericExecute;
                    360:     ACCESS_MASK GenericAll;
                    361: } GENERIC_MAPPING;
                    362: typedef GENERIC_MAPPING *PGENERIC_MAPPING;
                    363: 
                    364: 
                    365: 
                    366: ////////////////////////////////////////////////////////////////////////
                    367: //                                                                    //
                    368: //                        LUID_AND_ATTRIBUTES                         //
                    369: //                                                                    //
                    370: ////////////////////////////////////////////////////////////////////////
                    371: //
                    372: //
                    373: 
                    374: 
                    375: #ifndef RC_INVOKED
                    376: #pragma pack(4)
                    377: #endif
                    378: 
                    379: typedef struct _LUID_AND_ATTRIBUTES {
                    380:     LUID Luid;
                    381:     ULONG Attributes;
                    382:     } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
                    383: typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
                    384: typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
                    385: 
                    386: #ifndef RC_INVOKED
                    387: #pragma pack()
                    388: #endif
                    389: 
                    390: // This is the *current* ACL revision
                    391: 
                    392: #define ACL_REVISION     (2)
                    393: 
                    394: // This is the history of ACL revisions.  Add a new one whenever
                    395: // ACL_REVISION is updated
                    396: 
                    397: #define ACL_REVISION1   (1)
                    398: #define ACL_REVISION2   (2)
                    399: 
                    400: typedef struct _ACL {
                    401:     UCHAR AclRevision;
                    402:     UCHAR Sbz1;
                    403:     USHORT AclSize;
                    404:     USHORT AceCount;
                    405:     USHORT Sbz2;
                    406: } ACL;
                    407: typedef ACL *PACL;
                    408: 
                    409: //
                    410: // Current security descriptor revision value
                    411: //
                    412: 
                    413: #define SECURITY_DESCRIPTOR_REVISION     (1)
                    414: #define SECURITY_DESCRIPTOR_REVISION1    (1)
                    415: 
                    416: //
                    417: // Privilege attributes
                    418: //
                    419: 
                    420: #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
                    421: #define SE_PRIVILEGE_ENABLED            (0x00000002L)
                    422: #define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)
                    423: 
                    424: //
                    425: // Privilege Set Control flags
                    426: //
                    427: 
                    428: #define PRIVILEGE_SET_ALL_NECESSARY    (1)
                    429: 
                    430: //
                    431: //  Privilege Set - This is defined for a privilege set of one.
                    432: //                  If more than one privilege is needed, then this structure
                    433: //                  will need to be allocated with more space.
                    434: //
                    435: //  Note: don't change this structure without fixing the INITIAL_PRIVILEGE_SET
                    436: //  structure (defined in se.h)
                    437: //
                    438: 
                    439: typedef struct _PRIVILEGE_SET {
                    440:     ULONG PrivilegeCount;
                    441:     ULONG Control;
                    442:     LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
                    443:     } PRIVILEGE_SET, * PPRIVILEGE_SET;
                    444: 
                    445: //
                    446: // These must be converted to LUIDs before use.
                    447: //
                    448: 
                    449: #define SE_MIN_WELL_KNOWN_PRIVILEGE       (2L)
                    450: #define SE_CREATE_TOKEN_PRIVILEGE         (2L)
                    451: #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE   (3L)
                    452: #define SE_LOCK_MEMORY_PRIVILEGE          (4L)
                    453: #define SE_INCREASE_QUOTA_PRIVILEGE       (5L)
                    454: #define SE_UNSOLICITED_INPUT_PRIVILEGE    (6L)
                    455: #define SE_TCB_PRIVILEGE                  (7L)
                    456: #define SE_SECURITY_PRIVILEGE             (8L)
                    457: #define SE_TAKE_OWNERSHIP_PRIVILEGE       (9L)
                    458: #define SE_LOAD_DRIVER_PRIVILEGE          (10L)
                    459: #define SE_SYSTEM_PROFILE_PRIVILEGE       (11L)
                    460: #define SE_SYSTEMTIME_PRIVILEGE           (12L)
                    461: #define SE_PROF_SINGLE_PROCESS_PRIVILEGE  (13L)
                    462: #define SE_INC_BASE_PRIORITY_PRIVILEGE    (14L)
                    463: #define SE_CREATE_PAGEFILE_PRIVILEGE      (15L)
                    464: #define SE_CREATE_PERMANENT_PRIVILEGE     (16L)
                    465: #define SE_BACKUP_PRIVILEGE               (17L)
                    466: #define SE_RESTORE_PRIVILEGE              (18L)
                    467: #define SE_SHUTDOWN_PRIVILEGE             (19L)
                    468: #define SE_DEBUG_PRIVILEGE                (20L)
                    469: #define SE_AUDIT_PRIVILEGE                (21L)
                    470: #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE   (22L)
                    471: #define SE_CHANGE_NOTIFY_PRIVILEGE        (23L)
                    472: #define SE_REMOTE_SHUTDOWN_PRIVILEGE      (24L)
                    473: #define SE_MAX_WELL_KNOWN_PRIVILEGE       (SE_REMOTE_SHUTDOWN_PRIVILEGE)
                    474: 
                    475: //
                    476: // Impersonation Level
                    477: //
                    478: // Impersonation level is represented by a pair of bits in Windows.
                    479: // If a new impersonation level is added or lowest value is changed from
                    480: // 0 to something else, fix the Windows CreateFile call.
                    481: //
                    482: 
                    483: typedef enum _SECURITY_IMPERSONATION_LEVEL {
                    484:     SecurityAnonymous,
                    485:     SecurityIdentification,
                    486:     SecurityImpersonation,
                    487:     SecurityDelegation
                    488:     } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
                    489: 
                    490: #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
                    491: 
                    492: #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
                    493: 
                    494: // end_nthal
                    495: //
                    496: // Security Tracking Mode
                    497: //
                    498: 
                    499: #define SECURITY_DYNAMIC_TRACKING      (TRUE)
                    500: #define SECURITY_STATIC_TRACKING       (FALSE)
                    501: 
                    502: typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
                    503:                     * PSECURITY_CONTEXT_TRACKING_MODE;
                    504: 
                    505: 
                    506: 
                    507: //
                    508: // Quality Of Service
                    509: //
                    510: 
                    511: typedef struct _SECURITY_QUALITY_OF_SERVICE {
                    512:     ULONG Length;
                    513:     SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
                    514:     SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
                    515:     BOOLEAN EffectiveOnly;
                    516:     } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;
                    517: 
                    518: 
                    519: //
                    520: // Used to represent information related to a thread impersonation
                    521: //
                    522: 
                    523: typedef struct _SE_IMPERSONATION_STATE {
                    524:     PACCESS_TOKEN Token;
                    525:     BOOLEAN CopyOnOpen;
                    526:     BOOLEAN EffectiveOnly;
                    527:     SECURITY_IMPERSONATION_LEVEL Level;
                    528: } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
                    529: 
                    530: 
                    531: typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
                    532: 
                    533: #define OWNER_SECURITY_INFORMATION       (0X00000001L)
                    534: #define GROUP_SECURITY_INFORMATION       (0X00000002L)
                    535: #define DACL_SECURITY_INFORMATION        (0X00000004L)
                    536: #define SACL_SECURITY_INFORMATION        (0X00000008L)
                    537: 
                    538: #define LOW_PRIORITY 0              // Lowest thread priority level
                    539: #define LOW_REALTIME_PRIORITY 16    // Lowest realtime priority level
                    540: #define HIGH_PRIORITY 31            // Highest thread priority level
                    541: #define MAXIMUM_PRIORITY 32         // Number of thread priority levels
                    542: // begin_winnt
                    543: #define MAXIMUM_WAIT_OBJECTS 64     // Maximum number of wait objects
                    544: 
                    545: #define MAXIMUM_SUSPEND_COUNT MAXCHAR // Maximum times thread can be suspended
                    546: // end_winnt
                    547: 
                    548: //
                    549: // Thread affinity
                    550: //
                    551: 
                    552: typedef ULONG KAFFINITY;
                    553: typedef KAFFINITY *PKAFFINITY;
                    554: 
                    555: //
                    556: // Thread priority
                    557: //
                    558: 
                    559: typedef LONG KPRIORITY;
                    560: 
                    561: //
                    562: // Spin Lock
                    563: //
                    564: 
                    565: typedef ULONG KSPIN_LOCK;  // winnt
                    566: 
                    567: typedef KSPIN_LOCK *PKSPIN_LOCK;
                    568: 
                    569: //
                    570: // Interrupt routine (first level dispatch)
                    571: //
                    572: 
                    573: typedef
                    574: VOID
                    575: (*PKINTERRUPT_ROUTINE) (
                    576:     VOID
                    577:     );
                    578: 
                    579: // begin_winnt
                    580: //
                    581: // for move macros
                    582: //
                    583: #include <string.h>
                    584: // end_winnt
                    585: //
                    586: // If debugging support enabled, define an ASSERT macro that works.  Otherwise
                    587: // define the ASSERT macro to expand to an empty expression.
                    588: //
                    589: 
                    590: #if DBG
                    591: VOID
                    592: NTAPI
                    593: RtlAssert(
                    594:     PVOID FailedAssertion,
                    595:     PVOID FileName,
                    596:     ULONG LineNumber,
                    597:     PCHAR Message
                    598:     );
                    599: 
                    600: #define ASSERT( exp ) \
                    601:     if (!(exp)) \
                    602:         RtlAssert( #exp, __FILE__, __LINE__, NULL )
                    603: 
                    604: #define ASSERTMSG( msg, exp ) \
                    605:     if (!(exp)) \
                    606:         RtlAssert( #exp, __FILE__, __LINE__, msg )
                    607: 
                    608: #else
                    609: #define ASSERT( exp )
                    610: #define ASSERTMSG( msg, exp )
                    611: #endif // DBG
                    612: 
                    613: //
                    614: //  Doubly-linked list manipulation routines.  Implemented as macros
                    615: //  but logically these are procedures.
                    616: //
                    617: 
                    618: //
                    619: //  VOID
                    620: //  InitializeListHead(
                    621: //      PLIST_ENTRY ListHead
                    622: //      );
                    623: //
                    624: 
                    625: #define InitializeListHead(ListHead) (\
                    626:     (ListHead)->Flink = (ListHead)->Blink = (ListHead))
                    627: 
                    628: //
                    629: //  BOOLEAN
                    630: //  IsListEmpty(
                    631: //      PLIST_ENTRY ListHead
                    632: //      );
                    633: //
                    634: 
                    635: #define IsListEmpty(ListHead) \
                    636:     ((ListHead)->Flink == (ListHead))
                    637: 
                    638: //
                    639: //  PLIST_ENTRY
                    640: //  RemoveHeadList(
                    641: //      PLIST_ENTRY ListHead
                    642: //      );
                    643: //
                    644: 
                    645: #define RemoveHeadList(ListHead) \
                    646:     (ListHead)->Flink;\
                    647:     {RemoveEntryList((ListHead)->Flink)}
                    648: 
                    649: //
                    650: //  PLIST_ENTRY
                    651: //  RemoveTailList(
                    652: //      PLIST_ENTRY ListHead
                    653: //      );
                    654: //
                    655: 
                    656: #define RemoveTailList(ListHead) \
                    657:     (ListHead)->Blink;\
                    658:     {RemoveEntryList((ListHead)->Blink)}
                    659: 
                    660: //
                    661: //  VOID
                    662: //  RemoveEntryList(
                    663: //      PLIST_ENTRY Entry
                    664: //      );
                    665: //
                    666: 
                    667: #define RemoveEntryList(Entry) {\
                    668:     PLIST_ENTRY _EX_Blink;\
                    669:     PLIST_ENTRY _EX_Flink;\
                    670:     _EX_Flink = (Entry)->Flink;\
                    671:     _EX_Blink = (Entry)->Blink;\
                    672:     _EX_Blink->Flink = _EX_Flink;\
                    673:     _EX_Flink->Blink = _EX_Blink;\
                    674:     }
                    675: 
                    676: //
                    677: //  VOID
                    678: //  InsertTailList(
                    679: //      PLIST_ENTRY ListHead,
                    680: //      PLIST_ENTRY Entry
                    681: //      );
                    682: //
                    683: 
                    684: #define InsertTailList(ListHead,Entry) {\
                    685:     PLIST_ENTRY _EX_Blink;\
                    686:     PLIST_ENTRY _EX_ListHead;\
                    687:     _EX_ListHead = (ListHead);\
                    688:     _EX_Blink = _EX_ListHead->Blink;\
                    689:     (Entry)->Flink = _EX_ListHead;\
                    690:     (Entry)->Blink = _EX_Blink;\
                    691:     _EX_Blink->Flink = (Entry);\
                    692:     _EX_ListHead->Blink = (Entry);\
                    693:     }
                    694: 
                    695: //
                    696: //  VOID
                    697: //  InsertHeadList(
                    698: //      PLIST_ENTRY ListHead,
                    699: //      PLIST_ENTRY Entry
                    700: //      );
                    701: //
                    702: 
                    703: #define InsertHeadList(ListHead,Entry) {\
                    704:     PLIST_ENTRY _EX_Flink;\
                    705:     PLIST_ENTRY _EX_ListHead;\
                    706:     _EX_ListHead = (ListHead);\
                    707:     _EX_Flink = _EX_ListHead->Flink;\
                    708:     (Entry)->Flink = _EX_Flink;\
                    709:     (Entry)->Blink = _EX_ListHead;\
                    710:     _EX_Flink->Blink = (Entry);\
                    711:     _EX_ListHead->Flink = (Entry);\
                    712:     }
                    713: 
                    714: //
                    715: //
                    716: //  PSINGLE_LIST_ENTRY
                    717: //  PopEntryList(
                    718: //      PSINGLE_LIST_ENTRY ListHead
                    719: //      );
                    720: //
                    721: 
                    722: #define PopEntryList(ListHead) \
                    723:     (ListHead)->Next;\
                    724:     {\
                    725:         PSINGLE_LIST_ENTRY FirstEntry;\
                    726:         FirstEntry = (ListHead)->Next;\
                    727:         if (FirstEntry != NULL) {     \
                    728:             (ListHead)->Next = FirstEntry->Next;\
                    729:         }                             \
                    730:     }
                    731: 
                    732: 
                    733: //
                    734: //  VOID
                    735: //  PushEntryList(
                    736: //      PSINGLE_LIST_ENTRY ListHead,
                    737: //      PSINGLE_LIST_ENTRY Entry
                    738: //      );
                    739: //
                    740: 
                    741: #define PushEntryList(ListHead,Entry) \
                    742:     (Entry)->Next = (ListHead)->Next; \
                    743:     (ListHead)->Next = (Entry)
                    744: 
                    745: //
                    746: // Subroutines for dealing with the Registry
                    747: //
                    748: 
                    749: typedef NTSTATUS (*PRTL_QUERY_REGISTRY_ROUTINE)(
                    750:     IN PWSTR ValueName,
                    751:     IN ULONG ValueType,
                    752:     IN PVOID ValueData,
                    753:     IN ULONG ValueLength,
                    754:     IN PVOID Context,
                    755:     IN PVOID EntryContext
                    756:     );
                    757: 
                    758: typedef struct _RTL_QUERY_REGISTRY_TABLE {
                    759:     PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
                    760:     ULONG Flags;
                    761:     PWSTR Name;
                    762:     PVOID EntryContext;
                    763:     ULONG DefaultType;
                    764:     PVOID DefaultData;
                    765:     ULONG DefaultLength;
                    766: 
                    767: } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
                    768: 
                    769: 
                    770: //
                    771: // The following flags specify how the Name field of a RTL_QUERY_REGISTRY_TABLE
                    772: // entry is interpreted.  A NULL name indicates the end of the table.
                    773: //
                    774: 
                    775: #define RTL_QUERY_REGISTRY_SUBKEY   0x00000001  // Name is a subkey and remainder of
                    776:                                                 // table or until next subkey are value
                    777:                                                 // names for that subkey to look at.
                    778: 
                    779: #define RTL_QUERY_REGISTRY_TOPKEY   0x00000002  // Reset current key to original key for
                    780:                                                 // this and all following table entries.
                    781: 
                    782: #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004  // Fail if no match found for this table
                    783:                                                 // entry.
                    784: 
                    785: #define RTL_QUERY_REGISTRY_NOVALUE  0x00000008  // Used to mark a table entry that has no
                    786:                                                 // value name, just wants a call out, not
                    787:                                                 // an enumeration of all values.
                    788: 
                    789: #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010  // Used to suppress the expansion of
                    790:                                                 // REG_MULTI_SZ into multiple callouts or
                    791:                                                 // to prevent the expansion of environment
                    792:                                                 // variable values in REG_EXPAND_SZ
                    793: 
                    794: #define RTL_QUERY_REGISTRY_DIRECT   0x00000020  // QueryRoutine field ignored.  EntryContext
                    795:                                                 // field points to location to store value.
                    796:                                                 // For null terminated strings, EntryContext
                    797:                                                 // points to UNICODE_STRING structure that
                    798:                                                 // that describes maximum size of buffer.
                    799:                                                 // If .Buffer field is NULL then a buffer is
                    800:                                                 // allocated.
                    801:                                                 //
                    802: 
                    803: #define RTL_QUERY_REGISTRY_DELETE   0x00000040  // Used to delete value keys after they
                    804:                                                 // are queried.
                    805: 
                    806: NTSTATUS
                    807: NTAPI
                    808: RtlQueryRegistryValues(
                    809:     IN ULONG RelativeTo,
                    810:     IN PWSTR Path,
                    811:     IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
                    812:     IN PVOID Context,
                    813:     IN PVOID Environment OPTIONAL
                    814:     );
                    815: 
                    816: NTSTATUS
                    817: NTAPI
                    818: RtlWriteRegistryValue(
                    819:     IN ULONG RelativeTo,
                    820:     IN PWSTR Path,
                    821:     IN PWSTR ValueName,
                    822:     IN ULONG ValueType,
                    823:     IN PVOID ValueData,
                    824:     IN ULONG ValueLength
                    825:     );
                    826: 
                    827: NTSTATUS
                    828: NTAPI
                    829: RtlDeleteRegistryValue(
                    830:     IN ULONG RelativeTo,
                    831:     IN PWSTR Path,
                    832:     IN PWSTR ValueName
                    833:     );
                    834: 
                    835: NTSTATUS
                    836: NTAPI
                    837: RtlCreateRegistryKey(
                    838:     IN ULONG RelativeTo,
                    839:     IN PWSTR Path
                    840:     );
                    841: 
                    842: NTSTATUS
                    843: NTAPI
                    844: RtlCheckRegistryKey(
                    845:     IN ULONG RelativeTo,
                    846:     IN PWSTR Path
                    847:     );
                    848: 
                    849: //
                    850: // The following values for the RelativeTo parameter determine what the
                    851: // Path parameter to RtlQueryRegistryValues is relative to.
                    852: //
                    853: 
                    854: #define RTL_REGISTRY_ABSOLUTE     0   // Path is a full path
                    855: #define RTL_REGISTRY_SERVICES     1   // \Registry\Machine\System\CurrentControlSet\Services
                    856: #define RTL_REGISTRY_CONTROL      2   // \Registry\Machine\System\CurrentControlSet\Control
                    857: #define RTL_REGISTRY_WINDOWS_NT   3   // \Registry\Machine\Software\Microsoft\Windows NT\CurrentVersion
                    858: #define RTL_REGISTRY_DEVICEMAP    4   // \Registry\Machine\Hardware\DeviceMap
                    859: #define RTL_REGISTRY_USER         5   // \Registry\User\CurrentUser
                    860: #define RTL_REGISTRY_MAXIMUM      6
                    861: #define RTL_REGISTRY_HANDLE       0x40000000    // Low order bits are registry handle
                    862: #define RTL_REGISTRY_OPTIONAL     0x80000000    // Indicates the key node is optional
                    863: 
                    864: NTSTATUS                                            
                    865: RtlIntegerToUnicodeString (                         
                    866:     ULONG Value,                                    
                    867:     ULONG Base,                                     
                    868:     PUNICODE_STRING String                          
                    869:     );                                              
                    870: //
                    871: //  String manipulation routines
                    872: //
                    873: 
                    874: VOID
                    875: NTAPI
                    876: RtlInitString(
                    877:     PSTRING DestinationString,
                    878:     PCSZ SourceString
                    879:     );
                    880: 
                    881: VOID
                    882: NTAPI
                    883: RtlInitAnsiString(
                    884:     PANSI_STRING DestinationString,
                    885:     PCSZ SourceString
                    886:     );
                    887: 
                    888: VOID
                    889: NTAPI
                    890: RtlInitUnicodeString(
                    891:     PUNICODE_STRING DestinationString,
                    892:     PCWSTR SourceString
                    893:     );
                    894: 
                    895: 
                    896: VOID
                    897: NTAPI
                    898: RtlCopyString(
                    899:     PSTRING DestinationString,
                    900:     PSTRING SourceString
                    901:     );
                    902: 
                    903: 
                    904: BOOLEAN
                    905: NTAPI
                    906: RtlEqualString(
                    907:     PSTRING String1,
                    908:     PSTRING String2,
                    909:     BOOLEAN CaseInSensitive
                    910:     );
                    911: 
                    912: 
                    913: VOID
                    914: NTAPI
                    915: RtlUpperString(
                    916:     PSTRING DestinationString,
                    917:     PSTRING SourceString
                    918:     );
                    919: 
                    920: //
                    921: // NLS String functions
                    922: //
                    923: 
                    924: NTSTATUS
                    925: NTAPI
                    926: RtlAnsiStringToUnicodeString(
                    927:     PUNICODE_STRING DestinationString,
                    928:     PANSI_STRING SourceString,
                    929:     BOOLEAN AllocateDestinationString
                    930:     );
                    931: 
                    932: 
                    933: NTSTATUS
                    934: NTAPI
                    935: RtlUnicodeStringToAnsiString(
                    936:     PANSI_STRING DestinationString,
                    937:     PUNICODE_STRING SourceString,
                    938:     BOOLEAN AllocateDestinationString
                    939:     );
                    940: 
                    941: 
                    942: LONG
                    943: NTAPI
                    944: RtlCompareUnicodeString(
                    945:     PUNICODE_STRING String1,
                    946:     PUNICODE_STRING String2,
                    947:     BOOLEAN CaseInSensitive
                    948:     );
                    949: 
                    950: 
                    951: BOOLEAN
                    952: NTAPI
                    953: RtlEqualUnicodeString(
                    954:     PUNICODE_STRING String1,
                    955:     PUNICODE_STRING String2,
                    956:     BOOLEAN CaseInSensitive
                    957:     );
                    958: 
                    959: 
                    960: NTSTATUS
                    961: NTAPI
                    962: RtlUpcaseUnicodeString(
                    963:     PUNICODE_STRING DestinationString,
                    964:     PUNICODE_STRING SourceString,
                    965:     BOOLEAN AllocateDestinationString
                    966:     );
                    967: 
                    968: 
                    969: VOID
                    970: NTAPI
                    971: RtlCopyUnicodeString(
                    972:     PUNICODE_STRING DestinationString,
                    973:     PUNICODE_STRING SourceString
                    974:     );
                    975: 
                    976: NTSTATUS
                    977: NTAPI
                    978: RtlAppendUnicodeStringToString (
                    979:     PUNICODE_STRING Destination,
                    980:     PUNICODE_STRING Source
                    981:     );
                    982: 
                    983: NTSTATUS
                    984: NTAPI
                    985: RtlAppendUnicodeToString (
                    986:     PUNICODE_STRING Destination,
                    987:     PWSTR Source
                    988:     );
                    989: 
                    990: 
                    991: VOID
                    992: NTAPI
                    993: RtlFreeUnicodeString(
                    994:     PUNICODE_STRING UnicodeString
                    995:     );
                    996: 
                    997: VOID
                    998: NTAPI
                    999: RtlFreeAnsiString(
                   1000:     PANSI_STRING AnsiString
                   1001:     );
                   1002: 
                   1003: 
                   1004: ULONG
                   1005: NTAPI
                   1006: RtlAnsiStringToUnicodeSize(
                   1007:     PANSI_STRING AnsiString
                   1008:     );
                   1009: 
                   1010: //
                   1011: // Fast primitives to compare, move, and zero memory
                   1012: //
                   1013: 
                   1014: // begin_winnt
                   1015: #ifdef _M_IX86
                   1016: #define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
                   1017: #define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
                   1018: #define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
                   1019: #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
                   1020: #else
                   1021: #define RtlCopyMemory(Destination,Source,Length) RtlMoveMemory((Destination),(Source),(Length))
                   1022: VOID
                   1023: NTAPI
                   1024: RtlMoveMemory (
                   1025:    PVOID Destination,
                   1026:    CONST VOID *Source,
                   1027:    ULONG Length
                   1028:    );
                   1029: 
                   1030: VOID
                   1031: NTAPI
                   1032: RtlFillMemory (
                   1033:    PVOID Destination,
                   1034:    ULONG Length,
                   1035:    UCHAR Fill
                   1036:    );
                   1037: 
                   1038: VOID
                   1039: NTAPI
                   1040: RtlZeroMemory (
                   1041:    PVOID Destination,
                   1042:    ULONG Length
                   1043:    );
                   1044: #endif
                   1045: // end_winnt
                   1046: 
                   1047: ULONG
                   1048: NTAPI
                   1049: RtlCompareMemory (
                   1050:     PVOID Source1,
                   1051:     PVOID Source2,
                   1052:     ULONG Length
                   1053:     );
                   1054: 
                   1055: 
                   1056: VOID                                        
                   1057: DbgBreakPoint(                              
                   1058:     VOID                                    
                   1059:     );                                      
                   1060: //
                   1061: // Define kernel debugger print prototypes and macros.
                   1062: //
                   1063: 
                   1064: #if DBG
                   1065: 
                   1066: #define KdPrint(_x_) DbgPrint _x_
                   1067: 
                   1068: #else
                   1069: 
                   1070: #define KdPrint(_x_)
                   1071: 
                   1072: #endif
                   1073: 
                   1074: #ifndef _DBGNT_
                   1075: ULONG
                   1076: DbgPrint(
                   1077:     PCH Format,
                   1078:     ...
                   1079:     );
                   1080: #endif // _DBGNT_
                   1081: //
                   1082: // Large integer arithmetic routines.
                   1083: //
                   1084: 
                   1085: //
                   1086: // Large integer add - 64-bits + 64-bits -> 64-bits
                   1087: //
                   1088: 
                   1089: LARGE_INTEGER
                   1090: NTAPI
                   1091: RtlLargeIntegerAdd (
                   1092:     LARGE_INTEGER Addend1,
                   1093:     LARGE_INTEGER Addend2
                   1094:     );
                   1095: 
                   1096: //
                   1097: // Enlarged integer multiply - 32-bits * 32-bits -> 64-bits
                   1098: //
                   1099: 
                   1100: LARGE_INTEGER
                   1101: NTAPI
                   1102: RtlEnlargedIntegerMultiply (
                   1103:     LONG Multiplicand,
                   1104:     LONG Multiplier
                   1105:     );
                   1106: 
                   1107: //
                   1108: // Unsigned enlarged integer multiply - 32-bits * 32-bits -> 64-bits
                   1109: //
                   1110: 
                   1111: LARGE_INTEGER
                   1112: NTAPI
                   1113: RtlEnlargedUnsignedMultiply (
                   1114:     ULONG Multiplicand,
                   1115:     ULONG Multiplier
                   1116:     );
                   1117: 
                   1118: //
                   1119: // Enlarged integer divide - 64-bits / 32-bits > 32-bits
                   1120: //
                   1121: 
                   1122: ULONG
                   1123: NTAPI
                   1124: RtlEnlargedUnsignedDivide (
                   1125:     IN ULARGE_INTEGER Dividend,
                   1126:     IN ULONG Divisor,
                   1127:     IN PULONG Remainder
                   1128:     );
                   1129: 
                   1130: //
                   1131: // Extended large integer magic divide - 64-bits / 32-bits -> 64-bits
                   1132: //
                   1133: 
                   1134: LARGE_INTEGER
                   1135: NTAPI
                   1136: RtlExtendedMagicDivide (
                   1137:     LARGE_INTEGER Dividend,
                   1138:     LARGE_INTEGER MagicDivisor,
                   1139:     CCHAR ShiftCount
                   1140:     );
                   1141: 
                   1142: //
                   1143: // Large Integer divide - 64-bits / 32-bits -> 64-bits
                   1144: //
                   1145: 
                   1146: LARGE_INTEGER
                   1147: NTAPI
                   1148: RtlExtendedLargeIntegerDivide (
                   1149:     LARGE_INTEGER Dividend,
                   1150:     ULONG Divisor,
                   1151:     PULONG Remainder
                   1152:     );
                   1153: 
                   1154: //
                   1155: // Large Integer divide - 64-bits / 32-bits -> 64-bits
                   1156: //
                   1157: 
                   1158: LARGE_INTEGER
                   1159: NTAPI
                   1160: RtlLargeIntegerDivide (
                   1161:     LARGE_INTEGER Dividend,
                   1162:     LARGE_INTEGER Divisor,
                   1163:     PLARGE_INTEGER Remainder
                   1164:     );
                   1165: 
                   1166: //
                   1167: // Extended integer multiply - 32-bits * 64-bits -> 64-bits
                   1168: //
                   1169: 
                   1170: LARGE_INTEGER
                   1171: NTAPI
                   1172: RtlExtendedIntegerMultiply (
                   1173:     LARGE_INTEGER Multiplicand,
                   1174:     LONG Multiplier
                   1175:     );
                   1176: 
                   1177: //
                   1178: // Large integer negation - -(64-bits)
                   1179: //
                   1180: 
                   1181: LARGE_INTEGER
                   1182: NTAPI
                   1183: RtlLargeIntegerNegate (
                   1184:     LARGE_INTEGER Subtrahend
                   1185:     );
                   1186: 
                   1187: //
                   1188: // Large integer subtract - 64-bits - 64-bits -> 64-bits.
                   1189: //
                   1190: 
                   1191: LARGE_INTEGER
                   1192: NTAPI
                   1193: RtlLargeIntegerSubtract (
                   1194:     LARGE_INTEGER Minuend,
                   1195:     LARGE_INTEGER Subtrahend
                   1196:     );
                   1197: 
                   1198: //
                   1199: // Large integer and - 64-bite & 64-bits -> 64-bits.
                   1200: //
                   1201: 
                   1202: #define RtlLargeIntegerAnd(Result, Source, Mask)   \
                   1203:         {                                           \
                   1204:             Result.HighPart = Source.HighPart & Mask.HighPart; \
                   1205:             Result.LowPart = Source.LowPart & Mask.LowPart; \
                   1206:         }
                   1207: 
                   1208: 
                   1209: //
                   1210: // Large integer conversion routines.
                   1211: //
                   1212: 
                   1213: //
                   1214: // Convert signed integer to large integer.
                   1215: //
                   1216: 
                   1217: LARGE_INTEGER
                   1218: NTAPI
                   1219: RtlConvertLongToLargeInteger (
                   1220:     LONG SignedInteger
                   1221:     );
                   1222: 
                   1223: //
                   1224: // Convert unsigned integer to large integer.
                   1225: //
                   1226: 
                   1227: LARGE_INTEGER
                   1228: NTAPI
                   1229: RtlConvertUlongToLargeInteger (
                   1230:     ULONG UnsignedInteger
                   1231:     );
                   1232: 
                   1233: 
                   1234: //
                   1235: // Large integer shift routines.
                   1236: //
                   1237: 
                   1238: LARGE_INTEGER
                   1239: NTAPI
                   1240: RtlLargeIntegerShiftLeft (
                   1241:     LARGE_INTEGER LargeInteger,
                   1242:     CCHAR ShiftCount
                   1243:     );
                   1244: 
                   1245: LARGE_INTEGER
                   1246: NTAPI
                   1247: RtlLargeIntegerShiftRight (
                   1248:     LARGE_INTEGER LargeInteger,
                   1249:     CCHAR ShiftCount
                   1250:     );
                   1251: 
                   1252: LARGE_INTEGER
                   1253: NTAPI
                   1254: RtlLargeIntegerArithmeticShift (
                   1255:     LARGE_INTEGER LargeInteger,
                   1256:     CCHAR ShiftCount
                   1257:     );
                   1258: 
                   1259: //
                   1260: // Large integer comparison routines.
                   1261: //
                   1262: // BOOLEAN
                   1263: // RtlLargeIntegerGreaterThan (
                   1264: //     LARGE_INTEGER Operand1,
                   1265: //     LARGE_INTEGER Operand2
                   1266: //     );
                   1267: //
                   1268: // BOOLEAN
                   1269: // RtlLargeIntegerGreaterThanOrEqualTo (
                   1270: //     LARGE_INTEGER Operand1,
                   1271: //     LARGE_INTEGER Operand2
                   1272: //     );
                   1273: //
                   1274: // BOOLEAN
                   1275: // RtlLargeIntegerEqualTo (
                   1276: //     LARGE_INTEGER Operand1,
                   1277: //     LARGE_INTEGER Operand2
                   1278: //     );
                   1279: //
                   1280: // BOOLEAN
                   1281: // RtlLargeIntegerNotEqualTo (
                   1282: //     LARGE_INTEGER Operand1,
                   1283: //     LARGE_INTEGER Operand2
                   1284: //     );
                   1285: //
                   1286: // BOOLEAN
                   1287: // RtlLargeIntegerLessThan (
                   1288: //     LARGE_INTEGER Operand1,
                   1289: //     LARGE_INTEGER Operand2
                   1290: //     );
                   1291: //
                   1292: // BOOLEAN
                   1293: // RtlLargeIntegerLessThanOrEqualTo (
                   1294: //     LARGE_INTEGER Operand1,
                   1295: //     LARGE_INTEGER Operand2
                   1296: //     );
                   1297: //
                   1298: // BOOLEAN
                   1299: // RtlLargeIntegerGreaterThanZero (
                   1300: //     LARGE_INTEGER Operand
                   1301: //     );
                   1302: //
                   1303: // BOOLEAN
                   1304: // RtlLargeIntegerGreaterOrEqualToZero (
                   1305: //     LARGE_INTEGER Operand
                   1306: //     );
                   1307: //
                   1308: // BOOLEAN
                   1309: // RtlLargeIntegerEqualToZero (
                   1310: //     LARGE_INTEGER Operand
                   1311: //     );
                   1312: //
                   1313: // BOOLEAN
                   1314: // RtlLargeIntegerNotEqualToZero (
                   1315: //     LARGE_INTEGER Operand
                   1316: //     );
                   1317: //
                   1318: // BOOLEAN
                   1319: // RtlLargeIntegerLessThanZero (
                   1320: //     LARGE_INTEGER Operand
                   1321: //     );
                   1322: //
                   1323: // BOOLEAN
                   1324: // RtlLargeIntegerLessOrEqualToZero (
                   1325: //     LARGE_INTEGER Operand
                   1326: //     );
                   1327: //
                   1328: 
                   1329: #define RtlLargeIntegerGreaterThan(X,Y) (                              \
                   1330:     (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
                   1331:     ((X).HighPart > (Y).HighPart)                                      \
                   1332: )
                   1333: 
                   1334: #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) (                      \
                   1335:     (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
                   1336:     ((X).HighPart > (Y).HighPart)                                       \
                   1337: )
                   1338: 
                   1339: #define RtlLargeIntegerEqualTo(X,Y) (                              \
                   1340:     !(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
                   1341: )
                   1342: 
                   1343: #define RtlLargeIntegerNotEqualTo(X,Y) (                          \
                   1344:     (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
                   1345: )
                   1346: 
                   1347: #define RtlLargeIntegerLessThan(X,Y) (                                 \
                   1348:     (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
                   1349:     ((X).HighPart < (Y).HighPart)                                      \
                   1350: )
                   1351: 
                   1352: #define RtlLargeIntegerLessThanOrEqualTo(X,Y) (                         \
                   1353:     (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
                   1354:     ((X).HighPart < (Y).HighPart)                                       \
                   1355: )
                   1356: 
                   1357: #define RtlLargeIntegerGreaterThanZero(X) (       \
                   1358:     (((X).HighPart == 0) && ((X).LowPart > 0)) || \
                   1359:     ((X).HighPart > 0 )                           \
                   1360: )
                   1361: 
                   1362: #define RtlLargeIntegerGreaterOrEqualToZero(X) ( \
                   1363:     (X).HighPart >= 0                            \
                   1364: )
                   1365: 
                   1366: #define RtlLargeIntegerEqualToZero(X) ( \
                   1367:     !((X).LowPart | (X).HighPart)       \
                   1368: )
                   1369: 
                   1370: #define RtlLargeIntegerNotEqualToZero(X) ( \
                   1371:     ((X).LowPart | (X).HighPart)           \
                   1372: )
                   1373: 
                   1374: #define RtlLargeIntegerLessThanZero(X) ( \
                   1375:     ((X).HighPart < 0)                   \
                   1376: )
                   1377: 
                   1378: #define RtlLargeIntegerLessOrEqualToZero(X) (           \
                   1379:     ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) \
                   1380: )
                   1381: 
                   1382: 
                   1383: //
                   1384: //  Time conversion routines
                   1385: //
                   1386: 
                   1387: typedef struct _TIME_FIELDS {
                   1388:     CSHORT Year;        // range [1601...]
                   1389:     CSHORT Month;       // range [1..12]
                   1390:     CSHORT Day;         // range [1..31]
                   1391:     CSHORT Hour;        // range [0..23]
                   1392:     CSHORT Minute;      // range [0..59]
                   1393:     CSHORT Second;      // range [0..59]
                   1394:     CSHORT Milliseconds;// range [0..999]
                   1395:     CSHORT Weekday;     // range [0..6] == [Sunday..Saturday]
                   1396: } TIME_FIELDS;
                   1397: typedef TIME_FIELDS *PTIME_FIELDS;
                   1398: 
                   1399: 
                   1400: VOID
                   1401: NTAPI
                   1402: RtlTimeToTimeFields (
                   1403:     PLARGE_INTEGER Time,
                   1404:     PTIME_FIELDS TimeFields
                   1405:     );
                   1406: 
                   1407: //
                   1408: // The following macros store and retrieve USHORTS and ULONGS from potentially
                   1409: // unaligned addresses, avoiding alignment faults.  they should probably be
                   1410: // rewritten in assembler
                   1411: //
                   1412: 
                   1413: #define SHORT_SIZE  (sizeof(USHORT))
                   1414: #define SHORT_MASK  (SHORT_SIZE - 1)
                   1415: #define LONG_SIZE       (sizeof(LONG))
                   1416: #define LONG_MASK       (LONG_SIZE - 1)
                   1417: #define LOWBYTE_MASK 0x00FF
                   1418: 
                   1419: #define FIRSTBYTE(VALUE)  (VALUE & LOWBYTE_MASK)
                   1420: #define SECONDBYTE(VALUE) ((VALUE >> 8) & LOWBYTE_MASK)
                   1421: #define THIRDBYTE(VALUE)  ((VALUE >> 16) & LOWBYTE_MASK)
                   1422: #define FOURTHBYTE(VALUE) ((VALUE >> 24) & LOWBYTE_MASK)
                   1423: 
                   1424: //
                   1425: // if MIPS Big Endian, order of bytes is reversed.
                   1426: //
                   1427: 
                   1428: #define SHORT_LEAST_SIGNIFICANT_BIT  0
                   1429: #define SHORT_MOST_SIGNIFICANT_BIT   1
                   1430: 
                   1431: #define LONG_LEAST_SIGNIFICANT_BIT       0
                   1432: #define LONG_3RD_MOST_SIGNIFICANT_BIT    1
                   1433: #define LONG_2ND_MOST_SIGNIFICANT_BIT    2
                   1434: #define LONG_MOST_SIGNIFICANT_BIT        3
                   1435: 
                   1436: //++
                   1437: //
                   1438: // VOID
                   1439: // RtlStoreUshort (
                   1440: //     PUSHORT ADDRESS
                   1441: //     USHORT VALUE
                   1442: //     )
                   1443: //
                   1444: // Routine Description:
                   1445: //
                   1446: // This macro stores a USHORT value in at a particular address, avoiding
                   1447: // alignment faults.
                   1448: //
                   1449: // Arguments:
                   1450: //
                   1451: //     ADDRESS - where to store USHORT value
                   1452: //     VALUE - USHORT to store
                   1453: //
                   1454: // Return Value:
                   1455: //
                   1456: //     none.
                   1457: //
                   1458: //--
                   1459: 
                   1460: #define RtlStoreUshort(ADDRESS,VALUE)                     \
                   1461:          if ((ULONG)ADDRESS & SHORT_MASK) {               \
                   1462:              ((PUCHAR) ADDRESS)[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(VALUE));    \
                   1463:              ((PUCHAR) ADDRESS)[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(VALUE));   \
                   1464:          }                                                \
                   1465:          else {                                           \
                   1466:              *((PUSHORT) ADDRESS) = (USHORT) VALUE;       \
                   1467:          }
                   1468: 
                   1469: 
                   1470: //++
                   1471: //
                   1472: // VOID
                   1473: // RtlStoreUlong (
                   1474: //     PULONG ADDRESS
                   1475: //     ULONG VALUE
                   1476: //     )
                   1477: //
                   1478: // Routine Description:
                   1479: //
                   1480: // This macro stores a ULONG value in at a particular address, avoiding
                   1481: // alignment faults.
                   1482: //
                   1483: // Arguments:
                   1484: //
                   1485: //     ADDRESS - where to store ULONG value
                   1486: //     VALUE - ULONG to store
                   1487: //
                   1488: // Return Value:
                   1489: //
                   1490: //     none.
                   1491: //
                   1492: // Note:
                   1493: //     Depending on the machine, we might want to call storeushort in the
                   1494: //     unaligned case.
                   1495: //
                   1496: //--
                   1497: 
                   1498: #define RtlStoreUlong(ADDRESS,VALUE)                      \
                   1499:          if ((ULONG)ADDRESS & LONG_MASK) {                \
                   1500:              ((PUCHAR) ADDRESS)[LONG_LEAST_SIGNIFICANT_BIT      ] = (UCHAR)(FIRSTBYTE(VALUE));    \
                   1501:              ((PUCHAR) ADDRESS)[LONG_3RD_MOST_SIGNIFICANT_BIT   ] = (UCHAR)(SECONDBYTE(VALUE));   \
                   1502:              ((PUCHAR) ADDRESS)[LONG_2ND_MOST_SIGNIFICANT_BIT   ] = (UCHAR)(THIRDBYTE(VALUE));    \
                   1503:              ((PUCHAR) ADDRESS)[LONG_MOST_SIGNIFICANT_BIT       ] = (UCHAR)(FOURTHBYTE(VALUE));   \
                   1504:          }                                                \
                   1505:          else {                                           \
                   1506:              *((PULONG) ADDRESS) = (ULONG) VALUE;         \
                   1507:          }
                   1508: 
                   1509: //++
                   1510: //
                   1511: // VOID
                   1512: // RtlRetrieveUshort (
                   1513: //     PUSHORT DESTINATION_ADDRESS
                   1514: //     PUSHORT SOURCE_ADDRESS
                   1515: //     )
                   1516: //
                   1517: // Routine Description:
                   1518: //
                   1519: // This macro retrieves a USHORT value from the SOURCE address, avoiding
                   1520: // alignment faults.  The DESTINATION address is assumed to be aligned.
                   1521: //
                   1522: // Arguments:
                   1523: //
                   1524: //     DESTINATION_ADDRESS - where to store USHORT value
                   1525: //     SOURCE_ADDRESS - where to retrieve USHORT value from
                   1526: //
                   1527: // Return Value:
                   1528: //
                   1529: //     none.
                   1530: //
                   1531: //--
                   1532: 
                   1533: #define RtlRetrieveUshort(DEST_ADDRESS,SRC_ADDRESS)                   \
                   1534:          if ((ULONG)SRC_ADDRESS & SHORT_MASK) {                       \
                   1535:              ((PUCHAR) DEST_ADDRESS)[0] = ((PUCHAR) SRC_ADDRESS)[0];  \
                   1536:              ((PUCHAR) DEST_ADDRESS)[1] = ((PUCHAR) SRC_ADDRESS)[1];  \
                   1537:          }                                                            \
                   1538:          else {                                                       \
                   1539:              *((PUSHORT) DEST_ADDRESS) = *((PUSHORT) SRC_ADDRESS);    \
                   1540:          }                                                            \
                   1541: 
                   1542: //++
                   1543: //
                   1544: // VOID
                   1545: // RtlRetrieveUlong (
                   1546: //     PULONG DESTINATION_ADDRESS
                   1547: //     PULONG SOURCE_ADDRESS
                   1548: //     )
                   1549: //
                   1550: // Routine Description:
                   1551: //
                   1552: // This macro retrieves a ULONG value from the SOURCE address, avoiding
                   1553: // alignment faults.  The DESTINATION address is assumed to be aligned.
                   1554: //
                   1555: // Arguments:
                   1556: //
                   1557: //     DESTINATION_ADDRESS - where to store ULONG value
                   1558: //     SOURCE_ADDRESS - where to retrieve ULONG value from
                   1559: //
                   1560: // Return Value:
                   1561: //
                   1562: //     none.
                   1563: //
                   1564: // Note:
                   1565: //     Depending on the machine, we might want to call retrieveushort in the
                   1566: //     unaligned case.
                   1567: //
                   1568: //--
                   1569: 
                   1570: #define RtlRetrieveUlong(DEST_ADDRESS,SRC_ADDRESS)                    \
                   1571:          if ((ULONG)SRC_ADDRESS & LONG_MASK) {                        \
                   1572:              ((PUCHAR) DEST_ADDRESS)[0] = ((PUCHAR) SRC_ADDRESS)[0];  \
                   1573:              ((PUCHAR) DEST_ADDRESS)[1] = ((PUCHAR) SRC_ADDRESS)[1];  \
                   1574:              ((PUCHAR) DEST_ADDRESS)[2] = ((PUCHAR) SRC_ADDRESS)[2];  \
                   1575:              ((PUCHAR) DEST_ADDRESS)[3] = ((PUCHAR) SRC_ADDRESS)[3];  \
                   1576:          }                                                            \
                   1577:          else {                                                       \
                   1578:              *((PULONG) DEST_ADDRESS) = *((PULONG) SRC_ADDRESS);      \
                   1579:          }
                   1580: //
                   1581: //  SecurityDescriptor RTL routine definitions
                   1582: //
                   1583: 
                   1584: NTSTATUS
                   1585: NTAPI
                   1586: RtlCreateSecurityDescriptor (
                   1587:     PSECURITY_DESCRIPTOR SecurityDescriptor,
                   1588:     ULONG Revision
                   1589:     );
                   1590: 
                   1591: NTSTATUS
                   1592: NTAPI
                   1593: RtlSetDaclSecurityDescriptor (
                   1594:     PSECURITY_DESCRIPTOR SecurityDescriptor,
                   1595:     BOOLEAN DaclPresent,
                   1596:     PACL Dacl,
                   1597:     BOOLEAN DaclDefaulted
                   1598:     );
                   1599: 
                   1600: //
                   1601: // Define the various device type values.  Note that values used by Microsoft
                   1602: // Corporation are in the range 0-32767, and 32768-65535 are reserved for use
                   1603: // by customers.
                   1604: //
                   1605: 
                   1606: #define DEVICE_TYPE ULONG
                   1607: 
                   1608: #define FILE_DEVICE_BEEP                0x00000001
                   1609: #define FILE_DEVICE_CD_ROM              0x00000002
                   1610: #define FILE_DEVICE_CD_ROM_FILE_SYSTEM  0x00000003
                   1611: #define FILE_DEVICE_CONTROLLER          0x00000004
                   1612: #define FILE_DEVICE_DATALINK            0x00000005
                   1613: #define FILE_DEVICE_DFS                 0x00000006
                   1614: #define FILE_DEVICE_DISK                0x00000007
                   1615: #define FILE_DEVICE_DISK_FILE_SYSTEM    0x00000008
                   1616: #define FILE_DEVICE_FILE_SYSTEM         0x00000009
                   1617: #define FILE_DEVICE_INPORT_PORT         0x0000000a
                   1618: #define FILE_DEVICE_KEYBOARD            0x0000000b
                   1619: #define FILE_DEVICE_MAILSLOT            0x0000000c
                   1620: #define FILE_DEVICE_MIDI_IN             0x0000000d
                   1621: #define FILE_DEVICE_MIDI_OUT            0x0000000e
                   1622: #define FILE_DEVICE_MOUSE               0x0000000f
                   1623: #define FILE_DEVICE_MULTI_UNC_PROVIDER  0x00000010
                   1624: #define FILE_DEVICE_NAMED_PIPE          0x00000011
                   1625: #define FILE_DEVICE_NETWORK             0x00000012
                   1626: #define FILE_DEVICE_NETWORK_BROWSER     0x00000013
                   1627: #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
                   1628: #define FILE_DEVICE_NULL                0x00000015
                   1629: #define FILE_DEVICE_PARALLEL_PORT       0x00000016
                   1630: #define FILE_DEVICE_PHYSICAL_NETCARD    0x00000017
                   1631: #define FILE_DEVICE_PRINTER             0x00000018
                   1632: #define FILE_DEVICE_SCANNER             0x00000019
                   1633: #define FILE_DEVICE_SERIAL_MOUSE_PORT   0x0000001a
                   1634: #define FILE_DEVICE_SERIAL_PORT         0x0000001b
                   1635: #define FILE_DEVICE_SCREEN              0x0000001c
                   1636: #define FILE_DEVICE_SOUND               0x0000001d
                   1637: #define FILE_DEVICE_STREAMS             0x0000001e
                   1638: #define FILE_DEVICE_TAPE                0x0000001f
                   1639: #define FILE_DEVICE_TAPE_FILE_SYSTEM    0x00000020
                   1640: #define FILE_DEVICE_TRANSPORT           0x00000021
                   1641: #define FILE_DEVICE_UNKNOWN             0x00000022
                   1642: #define FILE_DEVICE_VIDEO               0x00000023
                   1643: #define FILE_DEVICE_VIRTUAL_DISK        0x00000024
                   1644: #define FILE_DEVICE_WAVE_IN             0x00000025
                   1645: #define FILE_DEVICE_WAVE_OUT            0x00000026
                   1646: #define FILE_DEVICE_8042_PORT           0x00000027
                   1647: #define FILE_DEVICE_NETWORK_REDIRECTOR  0x00000028
                   1648: 
                   1649: //
                   1650: // Macro definition for defining IOCTL and FSCTL function control codes.  Note
                   1651: // that function codes 0-2047 are reserved for Microsoft Corporation, and
                   1652: // 2048-4095 are reserved for customers.
                   1653: //
                   1654: 
                   1655: #define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
                   1656:     ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
                   1657: )
                   1658: 
                   1659: //
                   1660: // Define the method codes for how buffers are passed for I/O and FS controls
                   1661: //
                   1662: 
                   1663: #define METHOD_BUFFERED                 0
                   1664: #define METHOD_IN_DIRECT                1
                   1665: #define METHOD_OUT_DIRECT               2
                   1666: #define METHOD_NEITHER                  3
                   1667: 
                   1668: //
                   1669: // Define the access check value for any access
                   1670: //
                   1671: //
                   1672: // The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in
                   1673: // ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these
                   1674: // constants *MUST* always be in sync.
                   1675: //
                   1676: 
                   1677: 
                   1678: #define FILE_ANY_ACCESS                 0
                   1679: #define FILE_READ_ACCESS          ( 0x0001 )    // file & pipe
                   1680: #define FILE_WRITE_ACCESS         ( 0x0002 )    // file & pipe
                   1681: 
                   1682: 
                   1683: // begin_winnt
                   1684: 
                   1685: //
                   1686: // Define access rights to files and directories
                   1687: //
                   1688: 
                   1689: //
                   1690: // The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in
                   1691: // devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these
                   1692: // constants *MUST* always be in sync.
                   1693: // The values are redefined in devioctl.h because they must be available to
                   1694: // both DOS and NT.
                   1695: //
                   1696: 
                   1697: #define FILE_READ_DATA            ( 0x0001 )    // file & pipe
                   1698: #define FILE_LIST_DIRECTORY       ( 0x0001 )    // directory
                   1699: 
                   1700: #define FILE_WRITE_DATA           ( 0x0002 )    // file & pipe
                   1701: #define FILE_ADD_FILE             ( 0x0002 )    // directory
                   1702: 
                   1703: #define FILE_APPEND_DATA          ( 0x0004 )    // file
                   1704: #define FILE_ADD_SUBDIRECTORY     ( 0x0004 )    // directory
                   1705: #define FILE_CREATE_PIPE_INSTANCE ( 0x0004 )    // named pipe
                   1706: 
                   1707: #define FILE_READ_EA              ( 0x0008 )    // file & directory
                   1708: 
                   1709: #define FILE_WRITE_EA             ( 0x0010 )    // file & directory
                   1710: 
                   1711: #define FILE_EXECUTE              ( 0x0020 )    // file
                   1712: #define FILE_TRAVERSE             ( 0x0020 )    // directory
                   1713: 
                   1714: #define FILE_DELETE_CHILD         ( 0x0040 )    // directory
                   1715: 
                   1716: #define FILE_READ_ATTRIBUTES      ( 0x0080 )    // all
                   1717: 
                   1718: #define FILE_WRITE_ATTRIBUTES     ( 0x0100 )    // all
                   1719: 
                   1720: #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
                   1721: 
                   1722: 
                   1723: #define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ     |\
                   1724:                                    FILE_READ_DATA           |\
                   1725:                                    FILE_READ_ATTRIBUTES     |\
                   1726:                                    FILE_READ_EA             |\
                   1727:                                    SYNCHRONIZE)
                   1728: 
                   1729: 
                   1730: #define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\
                   1731:                                    FILE_WRITE_DATA          |\
                   1732:                                    FILE_WRITE_ATTRIBUTES    |\
                   1733:                                    FILE_WRITE_EA            |\
                   1734:                                    FILE_APPEND_DATA         |\
                   1735:                                    SYNCHRONIZE)
                   1736: 
                   1737: 
                   1738: #define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE  |\
                   1739:                                    FILE_READ_ATTRIBUTES     |\
                   1740:                                    FILE_EXECUTE             |\
                   1741:                                    SYNCHRONIZE)
                   1742: 
                   1743: // end_winnt
                   1744: 
                   1745: 
                   1746: //
                   1747: // Define share access rights to files and directories
                   1748: //
                   1749: 
                   1750: #define FILE_SHARE_READ                 0x00000001  // winnt
                   1751: #define FILE_SHARE_WRITE                0x00000002  // winnt
                   1752: #define FILE_SHARE_DELETE               0x00000004
                   1753: #define FILE_SHARE_VALID_FLAGS          0x00000007
                   1754: 
                   1755: //
                   1756: // Define the file attributes values
                   1757: //
                   1758: // Note:  0x00000008 is reserved for use for the old DOS VOLID (volume ID)
                   1759: //        and is therefore not considered valid in NT.
                   1760: //
                   1761: // Note:  0x00000010 is reserved for use for the old DOS SUBDIRECTORY flag
                   1762: //        and is therefore not considered valid in NT.  This flag has
                   1763: //        been disassociated with file attributes since the other flags are
                   1764: //        protected with READ_ and WRITE_ATTRIBUTES access to the file.
                   1765: //
                   1766: // Note:  Note also that the order of these flags is set to allow both the
                   1767: //        FAT and the Pinball File Systems to directly set the attributes
                   1768: //        flags in attributes words without having to pick each flag out
                   1769: //        individually.  The order of these flags should not be changed!
                   1770: //
                   1771: 
                   1772: #define FILE_ATTRIBUTE_READONLY         0x00000001  // winnt
                   1773: #define FILE_ATTRIBUTE_HIDDEN           0x00000002  // winnt
                   1774: #define FILE_ATTRIBUTE_SYSTEM           0x00000004  // winnt
                   1775: #define FILE_ATTRIBUTE_DIRECTORY        0x00000010  // winnt
                   1776: #define FILE_ATTRIBUTE_ARCHIVE          0x00000020  // winnt
                   1777: #define FILE_ATTRIBUTE_NORMAL           0x00000080  // winnt
                   1778: #define FILE_ATTRIBUTE_TEMPORARY        0x00000100  // winnt
                   1779: #define FILE_ATTRIBUTE_ATOMIC_WRITE     0x00000200  // winnt
                   1780: #define FILE_ATTRIBUTE_XACTION_WRITE    0x00000400  // winnt
                   1781: #define FILE_ATTRIBUTE_VALID_FLAGS      0x000007b7
                   1782: 
                   1783: //
                   1784: // Define the create disposition values
                   1785: //
                   1786: 
                   1787: #define FILE_SUPERSEDE                  0x00000000
                   1788: #define FILE_OPEN                       0x00000001
                   1789: #define FILE_CREATE                     0x00000002
                   1790: #define FILE_OPEN_IF                    0x00000003
                   1791: #define FILE_OVERWRITE                  0x00000004
                   1792: #define FILE_OVERWRITE_IF               0x00000005
                   1793: #define FILE_MAXIMUM_DISPOSITION        0x00000005
                   1794: 
                   1795: //
                   1796: // Define the create/open option flags
                   1797: //
                   1798: 
                   1799: #define FILE_DIRECTORY_FILE              0x00000001
                   1800: #define FILE_WRITE_THROUGH               0x00000002
                   1801: #define FILE_SEQUENTIAL_ONLY             0x00000004
                   1802: #define FILE_NO_INTERMEDIATE_BUFFERING   0x00000008
                   1803: #define FILE_SYNCHRONOUS_IO_ALERT        0x00000010
                   1804: #define FILE_SYNCHRONOUS_IO_NONALERT     0x00000020
                   1805: #define FILE_NON_DIRECTORY_FILE          0x00000040
                   1806: #define FILE_CREATE_TREE_CONNECTION      0x00000080
                   1807: #define FILE_COMPLETE_IF_OPLOCKED        0x00000100
                   1808: #define FILE_NO_EA_KNOWLEDGE             0x00000200
                   1809: #define FILE_EIGHT_DOT_THREE_ONLY        0x00000400
                   1810: #define FILE_RANDOM_ACCESS               0x00000800
                   1811: #define FILE_DELETE_ON_CLOSE             0x00001000
                   1812: #define FILE_OPEN_BY_FILE_ID             0x00002000
                   1813: #define FILE_OPEN_FOR_BACKUP_INTENT      0x00004000
                   1814: #define FILE_VALID_OPTION_FLAGS          0x00007FFF
                   1815: #define FILE_VALID_PIPE_OPTION_FLAGS     0x00000032
                   1816: #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
                   1817: #define FILE_VALID_SET_FLAGS             0x00001036
                   1818: 
                   1819: //
                   1820: // Define the I/O status information return values for NtCreateFile/NtOpenFile
                   1821: //
                   1822: 
                   1823: #define FILE_SUPERSEDED                 0x00000000
                   1824: #define FILE_OPENED                     0x00000001
                   1825: #define FILE_CREATED                    0x00000002
                   1826: #define FILE_OVERWRITTEN                0x00000003
                   1827: #define FILE_EXISTS                     0x00000004
                   1828: #define FILE_DOES_NOT_EXIST             0x00000005
                   1829: 
                   1830: //
                   1831: // Define special ByteOffset parameters for read and write operations
                   1832: //
                   1833: 
                   1834: #define FILE_WRITE_TO_END_OF_FILE       0xffffffff
                   1835: #define FILE_USE_FILE_POINTER_POSITION  0xfffffffe
                   1836: 
                   1837: //
                   1838: // Define alignment requirement values
                   1839: //
                   1840: 
                   1841: #define FILE_BYTE_ALIGNMENT             0x00000000
                   1842: #define FILE_WORD_ALIGNMENT             0x00000001
                   1843: #define FILE_LONG_ALIGNMENT             0x00000003
                   1844: #define FILE_QUAD_ALIGNMENT             0x00000007
                   1845: #define FILE_OCTA_ALIGNMENT             0x0000000f
                   1846: #define FILE_32_BYTE_ALIGNMENT          0x0000001f
                   1847: #define FILE_64_BYTE_ALIGNMENT          0x0000003f
                   1848: #define FILE_128_BYTE_ALIGNMENT         0x0000007f
                   1849: #define FILE_256_BYTE_ALIGNMENT         0x000000ff
                   1850: #define FILE_512_BYTE_ALIGNMENT         0x000001ff
                   1851: 
                   1852: //
                   1853: // Define the maximum length of a filename string
                   1854: //
                   1855: 
                   1856: #define MAXIMUM_FILENAME_LENGTH         256
                   1857: 
                   1858: //
                   1859: // Define the various device characteristics flags
                   1860: //
                   1861: 
                   1862: #define FILE_REMOVABLE_MEDIA            0x00000001
                   1863: #define FILE_READ_ONLY_DEVICE           0x00000002
                   1864: #define FILE_FLOPPY_DISKETTE            0x00000004
                   1865: #define FILE_WRITE_ONCE_MEDIA           0x00000008
                   1866: #define FILE_REMOTE_DEVICE              0x00000010
                   1867: #define FILE_DEVICE_IS_MOUNTED          0x00000020
                   1868: 
                   1869: //
                   1870: // Define the base asynchronous I/O argument types
                   1871: //
                   1872: 
                   1873: typedef struct _IO_STATUS_BLOCK {
                   1874:     NTSTATUS Status;
                   1875:     ULONG Information;
                   1876: } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
                   1877: 
                   1878: //
                   1879: // Define an Asynchronous Procedure Call from I/O viewpoint
                   1880: //
                   1881: 
                   1882: typedef
                   1883: VOID
                   1884: (*PIO_APC_ROUTINE) (
                   1885:     IN PVOID ApcContext,
                   1886:     IN PIO_STATUS_BLOCK IoStatusBlock,
                   1887:     IN ULONG Reserved
                   1888:     );
                   1889: 
                   1890: //
                   1891: // Define the file information class values
                   1892: //
                   1893: // WARNING:  The order of the following values are assumed by the I/O system.
                   1894: //           Any changes made here should be reflected there as well.
                   1895: //
                   1896: 
                   1897: typedef enum _FILE_INFORMATION_CLASS {
                   1898:     FileDirectoryInformation = 1,
                   1899:     FileFullDirectoryInformation,
                   1900:     FileBothDirectoryInformation,
                   1901:     FileBasicInformation,
                   1902:     FileStandardInformation,
                   1903:     FileInternalInformation,
                   1904:     FileEaInformation,
                   1905:     FileAccessInformation,
                   1906:     FileNameInformation,
                   1907:     FileRenameInformation,
                   1908:     FileLinkInformation,
                   1909:     FileNamesInformation,
                   1910:     FileDispositionInformation,
                   1911:     FilePositionInformation,
                   1912:     FileFullEaInformation,
                   1913:     FileModeInformation,
                   1914:     FileAlignmentInformation,
                   1915:     FileAllInformation,
                   1916:     FileAllocationInformation,
                   1917:     FileEndOfFileInformation,
                   1918:     FileAlternateNameInformation,
                   1919:     FileStreamInformation,
                   1920:     FilePipeInformation,
                   1921:     FilePipeLocalInformation,
                   1922:     FilePipeRemoteInformation,
                   1923:     FileMailslotQueryInformation,
                   1924:     FileMailslotSetInformation,
                   1925:     FileMaximumInformation
                   1926: } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
                   1927: 
                   1928: //
                   1929: // Define the various structures which are returned on query operations
                   1930: //
                   1931: 
                   1932: typedef struct _FILE_BASIC_INFORMATION {                    
                   1933:     LARGE_INTEGER CreationTime;                             
                   1934:     LARGE_INTEGER LastAccessTime;                           
                   1935:     LARGE_INTEGER LastWriteTime;                            
                   1936:     LARGE_INTEGER ChangeTime;                               
                   1937:     ULONG FileAttributes;                                   
                   1938: } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;         
                   1939:                                                             
                   1940: typedef struct _FILE_STANDARD_INFORMATION {                 
                   1941:     LARGE_INTEGER AllocationSize;                           
                   1942:     LARGE_INTEGER EndOfFile;                                
                   1943:     ULONG NumberOfLinks;                                    
                   1944:     BOOLEAN DeletePending;                                  
                   1945:     BOOLEAN Directory;                                      
                   1946: } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;   
                   1947:                                                             
                   1948: typedef struct _FILE_POSITION_INFORMATION {                 
                   1949:     LARGE_INTEGER CurrentByteOffset;                        
                   1950: } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;   
                   1951:                                                             
                   1952: 
                   1953: typedef struct _FILE_FULL_EA_INFORMATION {
                   1954:     ULONG NextEntryOffset;
                   1955:     UCHAR Flags;
                   1956:     UCHAR EaNameLength;
                   1957:     USHORT EaValueLength;
                   1958:     CHAR EaName[1];
                   1959: } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
                   1960: 
                   1961: //
                   1962: // Define the file system information class values
                   1963: //
                   1964: // WARNING:  The order of the following values are assumed by the I/O system.
                   1965: //           Any changes made here should be reflected there as well.
                   1966: 
                   1967: typedef enum _FSINFOCLASS {
                   1968:     FileFsVolumeInformation = 1,
                   1969:     FileFsLabelInformation,
                   1970:     FileFsSizeInformation,
                   1971:     FileFsDeviceInformation,
                   1972:     FileFsAttributeInformation,
                   1973:     FileFsMaximumInformation
                   1974: } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
                   1975: 
                   1976: typedef struct _FILE_FS_DEVICE_INFORMATION {                    
                   1977:     DEVICE_TYPE DeviceType;                                     
                   1978:     ULONG Characteristics;                                      
                   1979: } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;     
                   1980:                                                                 
                   1981: //
                   1982: // Define the I/O bus interface types.
                   1983: //
                   1984: 
                   1985: typedef enum _INTERFACE_TYPE {
                   1986:     Internal,
                   1987:     Isa,
                   1988:     Eisa,
                   1989:     MicroChannel,
                   1990:     TurboChannel,
                   1991:     PCIBus,
                   1992:     VMEBus,
                   1993:     NuBus,
                   1994:     PCMCIABus,
                   1995:     CBus,
                   1996:     MPIBus,
                   1997:     MPSABus,
                   1998:     MaximumInterfaceType
                   1999: }INTERFACE_TYPE, *PINTERFACE_TYPE;
                   2000: 
                   2001: //
                   2002: // Define the DMA transfer widths.
                   2003: //
                   2004: 
                   2005: typedef enum _DMA_WIDTH {
                   2006:     Width8Bits,
                   2007:     Width16Bits,
                   2008:     Width32Bits,
                   2009:     MaximumDmaWidth
                   2010: }DMA_WIDTH, *PDMA_WIDTH;
                   2011: 
                   2012: //
                   2013: // Define DMA transfer speeds.
                   2014: //
                   2015: 
                   2016: typedef enum _DMA_SPEED {
                   2017:     Compatible,
                   2018:     TypeA,
                   2019:     TypeB,
                   2020:     TypeC,
                   2021:     MaximumDmaSpeed
                   2022: }DMA_SPEED, *PDMA_SPEED;
                   2023: 
                   2024: //
                   2025: // Define I/O Driver error log packet structure.  This structure is filled in
                   2026: // by the driver.
                   2027: //
                   2028: 
                   2029: typedef struct _IO_ERROR_LOG_PACKET {
                   2030:     UCHAR MajorFunctionCode;
                   2031:     UCHAR RetryCount;
                   2032:     USHORT DumpDataSize;
                   2033:     USHORT NumberOfStrings;
                   2034:     USHORT StringOffset;
                   2035:     USHORT EventCategory;
                   2036:     NTSTATUS ErrorCode;
                   2037:     ULONG UniqueErrorValue;
                   2038:     NTSTATUS FinalStatus;
                   2039:     ULONG SequenceNumber;
                   2040:     ULONG IoControlCode;
                   2041:     LARGE_INTEGER DeviceOffset;
                   2042:     ULONG DumpData[1];
                   2043: }IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
                   2044: 
                   2045: //
                   2046: // Define the I/O error log message.  This message is sent by the error log
                   2047: // thread over the lpc port.
                   2048: //
                   2049: 
                   2050: typedef struct _IO_ERROR_LOG_MESSAGE {
                   2051:     USHORT Type;
                   2052:     USHORT Size;
                   2053:     USHORT DriverNameLength;
                   2054:     LARGE_INTEGER TimeStamp;
                   2055:     ULONG DriverNameOffset;
                   2056:     IO_ERROR_LOG_PACKET EntryData;
                   2057: }IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
                   2058: 
                   2059: //
                   2060: // Define the maximum message size that will be sent over the LPC to the
                   2061: // application reading the error log entries.
                   2062: //
                   2063: 
                   2064: #define IO_ERROR_LOG_MESSAGE_LENGTH  PORT_MAXIMUM_MESSAGE_LENGTH
                   2065: 
                   2066: //
                   2067: // Define the maximum packet size a driver can allocate.
                   2068: //
                   2069: 
                   2070: #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH + sizeof(IO_ERROR_LOG_PACKET) -    \
                   2071:                         sizeof(IO_ERROR_LOG_MESSAGE) - (sizeof(WCHAR) * 40))
                   2072: 
                   2073: #define PORT_MAXIMUM_MESSAGE_LENGTH 256
                   2074: //
                   2075: // Registry Specific Access Rights.
                   2076: //
                   2077: 
                   2078: #define KEY_QUERY_VALUE         (0x0001)
                   2079: #define KEY_SET_VALUE           (0x0002)
                   2080: #define KEY_CREATE_SUB_KEY      (0x0004)
                   2081: #define KEY_ENUMERATE_SUB_KEYS  (0x0008)
                   2082: #define KEY_NOTIFY              (0x0010)
                   2083: #define KEY_CREATE_LINK         (0x0020)
                   2084: 
                   2085: #define KEY_READ                ((STANDARD_RIGHTS_READ       |\
                   2086:                                   KEY_QUERY_VALUE            |\
                   2087:                                   KEY_ENUMERATE_SUB_KEYS     |\
                   2088:                                   KEY_NOTIFY)                 \
                   2089:                                   &                           \
                   2090:                                  (~SYNCHRONIZE))
                   2091: 
                   2092: 
                   2093: #define KEY_WRITE               ((STANDARD_RIGHTS_WRITE      |\
                   2094:                                   KEY_SET_VALUE              |\
                   2095:                                   KEY_CREATE_SUB_KEY)         \
                   2096:                                   &                           \
                   2097:                                  (~SYNCHRONIZE))
                   2098: 
                   2099: #define KEY_EXECUTE             ((KEY_READ)                   \
                   2100:                                   &                           \
                   2101:                                  (~SYNCHRONIZE))
                   2102: 
                   2103: #define KEY_ALL_ACCESS          ((STANDARD_RIGHTS_ALL        |\
                   2104:                                   KEY_QUERY_VALUE            |\
                   2105:                                   KEY_SET_VALUE              |\
                   2106:                                   KEY_CREATE_SUB_KEY         |\
                   2107:                                   KEY_ENUMERATE_SUB_KEYS     |\
                   2108:                                   KEY_NOTIFY                 |\
                   2109:                                   KEY_CREATE_LINK)            \
                   2110:                                   &                           \
                   2111:                                  (~SYNCHRONIZE))
                   2112: 
                   2113: //
                   2114: // Open/Create Options
                   2115: //
                   2116: 
                   2117: #define REG_OPTION_RESERVED         (0x00000000L)   // Parameter is reserved
                   2118: 
                   2119: #define REG_OPTION_NON_VOLATILE     (0x00000000L)   // Key is preserved
                   2120:                                                     // when system is rebooted
                   2121: 
                   2122: #define REG_OPTION_VOLATILE         (0x00000001L)   // Key is not preserved
                   2123:                                                     // when system is rebooted
                   2124: 
                   2125: #define REG_OPTION_CREATE_LINK      (0x00000002L)   // Created key is a
                   2126:                                                     // symbolic link
                   2127: 
                   2128: #define REG_OPTION_BACKUP_RESTORE   (0x00000004L)   // open for backup or restore
                   2129:                                                     // special access rules
                   2130:                                                     // privilege required
                   2131: 
                   2132: #define REG_LEGAL_OPTION            \
                   2133:                 (REG_OPTION_RESERVED            |\
                   2134:                  REG_OPTION_NON_VOLATILE        |\
                   2135:                  REG_OPTION_VOLATILE            |\
                   2136:                  REG_OPTION_CREATE_LINK         |\
                   2137:                  REG_OPTION_BACKUP_RESTORE)
                   2138: 
                   2139: //
                   2140: // Key creation/open disposition
                   2141: //
                   2142: 
                   2143: #define REG_CREATED_NEW_KEY         (0x00000001L)   // New Registry Key created
                   2144: #define REG_OPENED_EXISTING_KEY     (0x00000002L)   // Existing Key opened
                   2145: 
                   2146: //
                   2147: // Key restore flags
                   2148: //
                   2149: 
                   2150: #define REG_WHOLE_HIVE_VOLATILE     (0x00000001L)   // Restore whole hive volatile
                   2151: #define REG_REFRESH_HIVE            (0x00000002L)   // Unwind changes to last flush
                   2152: 
                   2153: //
                   2154: // Key query structures
                   2155: //
                   2156: 
                   2157: typedef struct _KEY_BASIC_INFORMATION {
                   2158:     LARGE_INTEGER LastWriteTime;
                   2159:     ULONG   TitleIndex;
                   2160:     ULONG   NameLength;
                   2161:     WCHAR   Name[1];            // Variable length string
                   2162: } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
                   2163: 
                   2164: typedef struct _KEY_NODE_INFORMATION {
                   2165:     LARGE_INTEGER LastWriteTime;
                   2166:     ULONG   TitleIndex;
                   2167:     ULONG   ClassOffset;
                   2168:     ULONG   ClassLength;
                   2169:     ULONG   NameLength;
                   2170:     WCHAR   Name[1];            // Variable length string
                   2171: //          Class[1];           // Variable length string not declared
                   2172: } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
                   2173: 
                   2174: typedef struct _KEY_FULL_INFORMATION {
                   2175:     LARGE_INTEGER LastWriteTime;
                   2176:     ULONG   TitleIndex;
                   2177:     ULONG   ClassOffset;
                   2178:     ULONG   ClassLength;
                   2179:     ULONG   SubKeys;
                   2180:     ULONG   MaxNameLen;
                   2181:     ULONG   MaxClassLen;
                   2182:     ULONG   Values;
                   2183:     ULONG   MaxValueNameLen;
                   2184:     ULONG   MaxValueDataLen;
                   2185:     WCHAR   Class[1];           // Variable length
                   2186: } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
                   2187: 
                   2188: typedef enum _KEY_INFORMATION_CLASS {
                   2189:     KeyBasicInformation,
                   2190:     KeyNodeInformation,
                   2191:     KeyFullInformation
                   2192: } KEY_INFORMATION_CLASS;
                   2193: 
                   2194: typedef struct _KEY_WRITE_TIME_INFORMATION {
                   2195:     LARGE_INTEGER LastWriteTime;
                   2196: } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
                   2197: 
                   2198: typedef enum _KEY_SET_INFORMATION_CLASS {
                   2199:     KeyWriteTimeInformation
                   2200: } KEY_SET_INFORMATION_CLASS;
                   2201: 
                   2202: //
                   2203: // Value entry query structures
                   2204: //
                   2205: 
                   2206: typedef struct _KEY_VALUE_BASIC_INFORMATION {
                   2207:     ULONG   TitleIndex;
                   2208:     ULONG   Type;
                   2209:     ULONG   NameLength;
                   2210:     WCHAR   Name[1];            // Variable size
                   2211: } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
                   2212: 
                   2213: typedef struct _KEY_VALUE_FULL_INFORMATION {
                   2214:     ULONG   TitleIndex;
                   2215:     ULONG   Type;
                   2216:     ULONG   DataOffset;
                   2217:     ULONG   DataLength;
                   2218:     ULONG   NameLength;
                   2219:     WCHAR   Name[1];            // Variable size
                   2220: //          Data[1];            // Variable size data not declared
                   2221: } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
                   2222: 
                   2223: typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
                   2224:     ULONG   TitleIndex;
                   2225:     ULONG   Type;
                   2226:     ULONG   DataLength;
                   2227:     UCHAR   Data[1];            // Variable size
                   2228: } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
                   2229: 
                   2230: typedef enum _KEY_VALUE_INFORMATION_CLASS {
                   2231:     KeyValueBasicInformation,
                   2232:     KeyValueFullInformation,
                   2233:     KeyValuePartialInformation
                   2234: } KEY_VALUE_INFORMATION_CLASS;
                   2235: 
                   2236: 
                   2237: #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
                   2238: 
                   2239: //
                   2240: // Object Manager Object Type Specific Access Rights.
                   2241: //
                   2242: 
                   2243: #define OBJECT_TYPE_CREATE (0x0001)
                   2244: 
                   2245: #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
                   2246: 
                   2247: //
                   2248: // Object Manager Directory Specific Access Rights.
                   2249: //
                   2250: 
                   2251: #define DIRECTORY_QUERY                 (0x0001)
                   2252: #define DIRECTORY_TRAVERSE              (0x0002)
                   2253: #define DIRECTORY_CREATE_OBJECT         (0x0004)
                   2254: #define DIRECTORY_CREATE_SUBDIRECTORY   (0x0008)
                   2255: 
                   2256: #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
                   2257: 
                   2258: //
                   2259: // Object Manager Symbolic Link Specific Access Rights.
                   2260: //
                   2261: 
                   2262: #define SYMBOLIC_LINK_QUERY (0x0001)
                   2263: 
                   2264: #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
                   2265: 
                   2266: typedef struct _OBJECT_NAME_INFORMATION {               
                   2267:     UNICODE_STRING Name;                                
                   2268: } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;   
                   2269: 
                   2270: //
                   2271: // Section Information Structures.
                   2272: //
                   2273: 
                   2274: typedef enum _SECTION_INHERIT {
                   2275:     ViewShare = 1,
                   2276:     ViewUnmap = 2
                   2277: } SECTION_INHERIT;
                   2278: 
                   2279: //
                   2280: // Section Access Rights.
                   2281: //
                   2282: 
                   2283: // begin_winnt
                   2284: #define SECTION_QUERY       0x0001
                   2285: #define SECTION_MAP_WRITE   0x0002
                   2286: #define SECTION_MAP_READ    0x0004
                   2287: #define SECTION_MAP_EXECUTE 0x0008
                   2288: #define SECTION_EXTEND_SIZE 0x0010
                   2289: 
                   2290: #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
                   2291:                             SECTION_MAP_WRITE |      \
                   2292:                             SECTION_MAP_READ |       \
                   2293:                             SECTION_MAP_EXECUTE |    \
                   2294:                             SECTION_EXTEND_SIZE)
                   2295: // end_winnt
                   2296: 
                   2297: #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
                   2298: 
                   2299: #define PAGE_NOACCESS          0x01     // winnt
                   2300: #define PAGE_READONLY          0x02     // winnt
                   2301: #define PAGE_READWRITE         0x04     // winnt
                   2302: #define PAGE_WRITECOPY         0x08     // winnt
                   2303: #define PAGE_EXECUTE           0x10     // winnt
                   2304: #define PAGE_EXECUTE_READ      0x20     // winnt
                   2305: #define PAGE_EXECUTE_READWRITE 0x40     // winnt
                   2306: #define PAGE_EXECUTE_WRITECOPY 0x80     // winnt
                   2307: #define PAGE_GUARD            0x100     // winnt
                   2308: #define PAGE_NOCACHE          0x200     // winnt
                   2309: 
                   2310: #define MEM_TOP_DOWN       0x100000     
                   2311: #define MEM_LARGE_PAGES  0x20000000     
                   2312: #define THREAD_TERMINATE               (0x0001)  // winnt
                   2313: #define THREAD_SET_INFORMATION         (0x0020)  // winnt
                   2314: 
                   2315: #define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
                   2316:                                    0x3FF)
                   2317: 
                   2318: //
                   2319: // ClientId
                   2320: //
                   2321: 
                   2322: typedef struct _CLIENT_ID {
                   2323:     HANDLE UniqueProcess;
                   2324:     HANDLE UniqueThread;
                   2325: } CLIENT_ID;
                   2326: typedef CLIENT_ID *PCLIENT_ID;
                   2327: 
                   2328: #define NtCurrentProcess() ( (HANDLE) -1 )
                   2329: 
                   2330: #if defined(_X86_)
                   2331: //
                   2332: // Indicate that the i386 compiler supports the pragma textout construct.
                   2333: //
                   2334: 
                   2335: #define ALLOC_PRAGMA 1
                   2336: #define NORMAL_DISPATCH_LENGTH 106                  
                   2337: #define DISPATCH_LENGTH NORMAL_DISPATCH_LENGTH      
                   2338: //
                   2339: // Interrupt Request Level definitions
                   2340: //
                   2341: 
                   2342: #define PASSIVE_LEVEL 0             // Passive release level
                   2343: #define LOW_LEVEL 0                 // Lowest interrupt level
                   2344: #define APC_LEVEL 1                 // APC interrupt level
                   2345: #define DISPATCH_LEVEL 2            // Dispatcher level
                   2346: 
                   2347: #define PROFILE_LEVEL 27            // timer used for profiling.
                   2348: #define CLOCK1_LEVEL 28             // Interval clock 1 level - Not used on x86
                   2349: #define CLOCK2_LEVEL 28             // Interval clock 2 level
                   2350: #define IPI_LEVEL 29                // Interprocessor interrupt level
                   2351: #define POWER_LEVEL 30              // Power failure level
                   2352: #define HIGH_LEVEL 31               // Highest interrupt level
                   2353: 
                   2354: //
                   2355: // Get data cache fill size.
                   2356: //
                   2357: 
                   2358: #define KeGetDcacheFillSize() 1L
                   2359: 
                   2360: 
                   2361: #define KeFlushIoBuffers(Mdl, ReadOperation, DmaOperation)
                   2362: 
                   2363: //
                   2364: // i386 Specific portions of mm component
                   2365: //
                   2366: 
                   2367: //
                   2368: // Define the page size for the Intel 386 as 4096 (0x1000).
                   2369: //
                   2370: 
                   2371: #define PAGE_SIZE (ULONG)0x1000
                   2372: 
                   2373: //
                   2374: // Define the number of trailing zeroes in a page aligned virtual address.
                   2375: // This is used as the shift count when shifting virtual addresses to
                   2376: // virtual page numbers.
                   2377: //
                   2378: 
                   2379: #define PAGE_SHIFT 12L
                   2380: 
                   2381: //
                   2382: // The highest user address reserves 64K bytes for a guard
                   2383: // page.  This allows the probing of address from kernel mode to
                   2384: // only have to check the starting address for strucutures of 64k bytes
                   2385: // or less.
                   2386: //
                   2387: 
                   2388: #define MM_HIGHEST_USER_ADDRESS (PVOID)0x7FFEFFFF // temp should be 0xBFFEFFFF
                   2389: 
                   2390: #define MM_USER_PROBE_ADDRESS 0x7FFF0000    // starting address of guard page
                   2391: 
                   2392: //
                   2393: // The lowest user address reserves the low 64k.
                   2394: //
                   2395: 
                   2396: #define MM_LOWEST_USER_ADDRESS  (PVOID)0x00010000
                   2397: 
                   2398: //
                   2399: // The lowest address for system space.
                   2400: //
                   2401: 
                   2402: #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
                   2403: 
                   2404: //
                   2405: // Result type definition for i386.  (Machine specific enumerate type
                   2406: // which is return type for portable exinterlockedincrement/decrement
                   2407: // procedures.)  In general, you should use the enumerated type defined
                   2408: // in ex.h instead of directly referencing these constants.
                   2409: //
                   2410: 
                   2411: // Flags loaded into AH by LAHF instruction
                   2412: 
                   2413: #define EFLAG_SIGN      0x8000
                   2414: #define EFLAG_ZERO      0x4000
                   2415: #define EFLAG_SELECT    (EFLAG_SIGN | EFLAG_ZERO)
                   2416: 
                   2417: #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
                   2418: #define RESULT_ZERO     ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
                   2419: #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
                   2420: 
                   2421: //
                   2422: // Convert various portable ExInterlock apis into their architecural
                   2423: // equivalents.
                   2424: //
                   2425: 
                   2426: #define ExInterlockedIncrementLong(Addend,Lock) \
                   2427:         Exi386InterlockedIncrementLong(Addend)
                   2428: 
                   2429: #define ExInterlockedDecrementLong(Addend,Lock) \
                   2430:         Exi386InterlockedDecrementLong(Addend)
                   2431: 
                   2432: #define ExInterlockedExchangeUlong(Target,Value,Lock) \
                   2433:         Exi386InterlockedExchangeUlong(Target,Value)
                   2434: 
                   2435: //
                   2436: // Prototypes for architecural specific versions of Exi386 api
                   2437: //
                   2438: 
                   2439: //
                   2440: // Interlocked result type is portable, but its values are machine specific.
                   2441: // Constants for value are in i386.h, mips.h, etc.
                   2442: //
                   2443: 
                   2444: typedef enum _INTERLOCKED_RESULT {
                   2445:     ResultNegative = RESULT_NEGATIVE,
                   2446:     ResultZero     = RESULT_ZERO,
                   2447:     ResultPositive = RESULT_POSITIVE
                   2448: } INTERLOCKED_RESULT;
                   2449: 
                   2450: INTERLOCKED_RESULT
                   2451: Exi386InterlockedIncrementLong (
                   2452:     IN PLONG Addend
                   2453:     );
                   2454: 
                   2455: INTERLOCKED_RESULT
                   2456: Exi386InterlockedDecrementLong (
                   2457:     IN PLONG Addend
                   2458:     );
                   2459: 
                   2460: ULONG
                   2461: Exi386InterlockedExchangeUlong (
                   2462:     IN PULONG Target,
                   2463:     IN ULONG Value
                   2464:     );
                   2465: 
                   2466: VOID
                   2467: KeRaiseIrql (
                   2468:     IN KIRQL NewIrql,
                   2469:     OUT PKIRQL OldIrql
                   2470:     );
                   2471: 
                   2472: VOID
                   2473: KeLowerIrql (
                   2474:     IN KIRQL NewIrql
                   2475:     );
                   2476: 
                   2477: 
                   2478: #endif // defined(_X86_)
                   2479: 
                   2480: 
                   2481: #if defined(_MIPS_)
                   2482: 
                   2483: //
                   2484: // Indicate that the MIPS compiler supports the pragma textout construct.
                   2485: //
                   2486: 
                   2487: #define ALLOC_PRAGMA 1
                   2488: 
                   2489: //
                   2490: // MIPS specific interlocked operation result values.
                   2491: //
                   2492: 
                   2493: #define RESULT_ZERO 0
                   2494: #define RESULT_NEGATIVE -2
                   2495: #define RESULT_POSITIVE -1
                   2496: 
                   2497: //
                   2498: // Interlocked result type is portable, but its values are machine specific.
                   2499: // Constants for value are in i386.h, mips.h, etc.
                   2500: //
                   2501: 
                   2502: typedef enum _INTERLOCKED_RESULT {
                   2503:     ResultNegative = RESULT_NEGATIVE,
                   2504:     ResultZero     = RESULT_ZERO,
                   2505:     ResultPositive = RESULT_POSITIVE
                   2506: } INTERLOCKED_RESULT;
                   2507: 
                   2508: //
                   2509: // MIPS Interrupt Definitions.
                   2510: //
                   2511: // Define length on interupt object dispatch code in longwords.
                   2512: //
                   2513: 
                   2514: #define DISPATCH_LENGTH 4               // Length of dispatch code in instructions
                   2515: 
                   2516: //
                   2517: // Define Interrupt Request Levels.
                   2518: //
                   2519: 
                   2520: #define PASSIVE_LEVEL 0                 // Passive release level
                   2521: #define LOW_LEVEL 0                     // Lowest interrupt level
                   2522: #define APC_LEVEL 1                     // APC interrupt level
                   2523: #define DISPATCH_LEVEL 2                // Dispatcher level
                   2524: #define IPI_LEVEL 7                     // Interprocessor interrupt level
                   2525: #define POWER_LEVEL 7                   // Power failure level
                   2526: #define FLOAT_LEVEL 8                   // Floating interrupt level
                   2527: #define HIGH_LEVEL 8                    // Highest interrupt level
                   2528: 
                   2529: #if defined(R3000)
                   2530: 
                   2531: #define PROFILE_LEVEL 7                 // Profiling level
                   2532: 
                   2533: #endif
                   2534: 
                   2535: #if defined(R4000)
                   2536: 
                   2537: #define PROFILE_LEVEL 8                 // Profiling level
                   2538: 
                   2539: #endif
                   2540: 
                   2541: //
                   2542: // Define profile intervals.
                   2543: //
                   2544: 
                   2545: #if defined(R3000)
                   2546: 
                   2547: #define DEFAULT_PROFILE_INTERVAL (10 * 1000)  // 1 millisecond
                   2548: #define MAXIMUM_PROFILE_INTERVAL (10 * 1000 * 1000) // 1 second
                   2549: #define MINIMUM_PROFILE_INTERVAL (10 * 1000) // 1 millisecond
                   2550: 
                   2551: #endif
                   2552: 
                   2553: #if defined(R4000)
                   2554: 
                   2555: #define DEFAULT_PROFILE_COUNT 0x40000000 // ~= 20 seconds @50mhz
                   2556: #define DEFAULT_PROFILE_INTERVAL (10 * 500) // 500 microseconds
                   2557: #define MAXIMUM_PROFILE_INTERVAL (10 * 1000 * 1000) // 1 second
                   2558: #define MINIMUM_PROFILE_INTERVAL (10 * 40) // 40 microseconds
                   2559: 
                   2560: #endif
                   2561: 
                   2562: 
                   2563: //
                   2564: // Get data cache fill size.
                   2565: //
                   2566: 
                   2567: #define KeGetDcacheFillSize() PCR->DcacheFillSize
                   2568: 
                   2569: //
                   2570: // Cache and write buffer flush functions.
                   2571: //
                   2572: 
                   2573: VOID
                   2574: KeFlushIoBuffers (
                   2575:     IN PMDL Mdl,
                   2576:     IN BOOLEAN ReadOperation,
                   2577:     IN BOOLEAN DmaOperation
                   2578:     );
                   2579: 
                   2580: 
                   2581: VOID
                   2582: KeLowerIrql (
                   2583:     KIRQL NewIrql
                   2584:     );
                   2585: 
                   2586: VOID
                   2587: KeRaiseIrql (
                   2588:     KIRQL NewIrql,
                   2589:     PKIRQL OldIrql
                   2590:     );
                   2591: 
                   2592: //
                   2593: // I/O space read and write macros.
                   2594: //
                   2595: 
                   2596: #define READ_REGISTER_UCHAR(x) \
                   2597:     *(volatile UCHAR * const)(x)
                   2598: 
                   2599: #define READ_REGISTER_USHORT(x) \
                   2600:     *(volatile USHORT * const)(x)
                   2601: 
                   2602: #define READ_REGISTER_ULONG(x) \
                   2603:     *(volatile ULONG * const)(x)
                   2604: 
                   2605: #define READ_REGISTER_BUFFER_UCHAR(x, y, z) {                           \
                   2606:     PUCHAR registerBuffer = x;                                          \
                   2607:     PUCHAR readBuffer = y;                                              \
                   2608:     ULONG readCount;                                                    \
                   2609:     for (readCount = z; readCount--; readBuffer++, registerBuffer++) {  \
                   2610:         *readBuffer = *(volatile UCHAR * const)(registerBuffer);        \
                   2611:     }                                                                   \
                   2612: }
                   2613: 
                   2614: #define READ_REGISTER_BUFFER_USHORT(x, y, z) {                          \
                   2615:     PUSHORT registerBuffer = x;                                         \
                   2616:     PUSHORT readBuffer = y;                                             \
                   2617:     ULONG readCount;                                                    \
                   2618:     for (readCount = z; readCount--; readBuffer++, registerBuffer++) {  \
                   2619:         *readBuffer = *(volatile USHORT * const)(registerBuffer);       \
                   2620:     }                                                                   \
                   2621: }
                   2622: 
                   2623: #define READ_REGISTER_BUFFER_ULONG(x, y, z) {                           \
                   2624:     PULONG registerBuffer = x;                                          \
                   2625:     PULONG readBuffer = y;                                              \
                   2626:     ULONG readCount;                                                    \
                   2627:     for (readCount = z; readCount--; readBuffer++, registerBuffer++) {  \
                   2628:         *readBuffer = *(volatile ULONG * const)(registerBuffer);        \
                   2629:     }                                                                   \
                   2630: }
                   2631: 
                   2632: #define WRITE_REGISTER_UCHAR(x, y) {    \
                   2633:     *(volatile UCHAR * const)(x) = y;   \
                   2634:     KeFlushWriteBuffer();               \
                   2635: }
                   2636: 
                   2637: #define WRITE_REGISTER_USHORT(x, y) {   \
                   2638:     *(volatile USHORT * const)(x) = y;  \
                   2639:     KeFlushWriteBuffer();               \
                   2640: }
                   2641: 
                   2642: #define WRITE_REGISTER_ULONG(x, y) {    \
                   2643:     *(volatile ULONG * const)(x) = y;   \
                   2644:     KeFlushWriteBuffer();               \
                   2645: }
                   2646: 
                   2647: #define WRITE_REGISTER_BUFFER_UCHAR(x, y, z) {                            \
                   2648:     PUCHAR registerBuffer = x;                                            \
                   2649:     PUCHAR writeBuffer = y;                                               \
                   2650:     ULONG writeCount;                                                     \
                   2651:     for (writeCount = z; writeCount--; writeBuffer++, registerBuffer++) { \
                   2652:         *(volatile UCHAR * const)(registerBuffer) = *writeBuffer;         \
                   2653:     }                                                                     \
                   2654:     KeFlushWriteBuffer();                                                 \
                   2655: }
                   2656: 
                   2657: #define WRITE_REGISTER_BUFFER_USHORT(x, y, z) {                           \
                   2658:     PUSHORT registerBuffer = x;                                           \
                   2659:     PUSHORT writeBuffer = y;                                              \
                   2660:     ULONG writeCount;                                                     \
                   2661:     for (writeCount = z; writeCount--; writeBuffer++, registerBuffer++) { \
                   2662:         *(volatile USHORT * const)(registerBuffer) = *writeBuffer;        \
                   2663:     }                                                                     \
                   2664:     KeFlushWriteBuffer();                                                 \
                   2665: }
                   2666: 
                   2667: #define WRITE_REGISTER_BUFFER_ULONG(x, y, z) {                            \
                   2668:     PULONG registerBuffer = x;                                            \
                   2669:     PULONG writeBuffer = y;                                               \
                   2670:     ULONG writeCount;                                                     \
                   2671:     for (writeCount = z; writeCount--; writeBuffer++, registerBuffer++) { \
                   2672:         *(volatile ULONG * const)(registerBuffer) = *writeBuffer;         \
                   2673:     }                                                                     \
                   2674:     KeFlushWriteBuffer();                                                 \
                   2675: }
                   2676: 
                   2677: 
                   2678: #define READ_PORT_UCHAR(x) \
                   2679:     *(volatile UCHAR * const)(x)
                   2680: 
                   2681: #define READ_PORT_USHORT(x) \
                   2682:     *(volatile USHORT * const)(x)
                   2683: 
                   2684: #define READ_PORT_ULONG(x) \
                   2685:     *(volatile ULONG * const)(x)
                   2686: 
                   2687: #define READ_PORT_BUFFER_UCHAR(x, y, z) {                             \
                   2688:     PUCHAR readBuffer = y;                                            \
                   2689:     ULONG readCount;                                                  \
                   2690:     for (readCount = 0; readCount < z; readCount++, readBuffer++) {   \
                   2691:         *readBuffer = *(volatile UCHAR * const)(x);                   \
                   2692:     }                                                                 \
                   2693: }
                   2694: 
                   2695: #define READ_PORT_BUFFER_USHORT(x, y, z) {                            \
                   2696:     PUSHORT readBuffer = y;                                            \
                   2697:     ULONG readCount;                                                  \
                   2698:     for (readCount = 0; readCount < z; readCount++, readBuffer++) {   \
                   2699:         *readBuffer = *(volatile USHORT * const)(x);                  \
                   2700:     }                                                                 \
                   2701: }
                   2702: 
                   2703: #define READ_PORT_BUFFER_ULONG(x, y, z) {                             \
                   2704:     PULONG readBuffer = y;                                            \
                   2705:     ULONG readCount;                                                  \
                   2706:     for (readCount = 0; readCount < z; readCount++, readBuffer++) {   \
                   2707:         *readBuffer = *(volatile ULONG * const)(x);                   \
                   2708:     }                                                                 \
                   2709: }
                   2710: 
                   2711: #define WRITE_PORT_UCHAR(x, y) {        \
                   2712:     *(volatile UCHAR * const)(x) = y;   \
                   2713:     KeFlushWriteBuffer();               \
                   2714: }
                   2715: 
                   2716: #define WRITE_PORT_USHORT(x, y) {       \
                   2717:     *(volatile USHORT * const)(x) = y;  \
                   2718:     KeFlushWriteBuffer();               \
                   2719: }
                   2720: 
                   2721: #define WRITE_PORT_ULONG(x, y) {        \
                   2722:     *(volatile ULONG * const)(x) = y;   \
                   2723:     KeFlushWriteBuffer();               \
                   2724: }
                   2725: 
                   2726: #define WRITE_PORT_BUFFER_UCHAR(x, y, z) {                                \
                   2727:     PUCHAR writeBuffer = y;                                               \
                   2728:     ULONG writeCount;                                                     \
                   2729:     for (writeCount = 0; writeCount < z; writeCount++, writeBuffer++) {   \
                   2730:         *(volatile UCHAR * const)(x) = *writeBuffer;                      \
                   2731:         KeFlushWriteBuffer();                                             \
                   2732:     }                                                                     \
                   2733: }
                   2734: 
                   2735: #define WRITE_PORT_BUFFER_USHORT(x, y, z) {                               \
                   2736:     PUSHORT writeBuffer = y;                                              \
                   2737:     ULONG writeCount;                                                     \
                   2738:     for (writeCount = 0; writeCount < z; writeCount++, writeBuffer++) {   \
                   2739:         *(volatile USHORT * const)(x) = *writeBuffer;                     \
                   2740:         KeFlushWriteBuffer();                                             \
                   2741:     }                                                                     \
                   2742: }
                   2743: 
                   2744: #define WRITE_PORT_BUFFER_ULONG(x, y, z) {                                \
                   2745:     PULONG writeBuffer = y;                                               \
                   2746:     ULONG writeCount;                                                     \
                   2747:     for (writeCount = 0; writeCount < z; writeCount++, writeBuffer++) {   \
                   2748:         *(volatile ULONG * const)(x) = *writeBuffer;                      \
                   2749:         KeFlushWriteBuffer();                                             \
                   2750:     }                                                                     \
                   2751: }
                   2752: 
                   2753: //
                   2754: // Define the page size for the MIPS r3000 and r4000 as 4096 (0x1000).
                   2755: //
                   2756: 
                   2757: #define PAGE_SIZE (ULONG)0x1000
                   2758: 
                   2759: //
                   2760: // Define the number of trailing zeroes in a page aligned virtual address.
                   2761: // This is used as the shift count when shifting virtual addresses to
                   2762: // virtual page numbers.
                   2763: //
                   2764: 
                   2765: #define PAGE_SHIFT 12L
                   2766: 
                   2767: //
                   2768: // The highest user address reserves 64K bytes for a guard page. This
                   2769: // the probing of address from kernel mode to only have to check the
                   2770: // starting address for structures of 64k bytes or less.
                   2771: //
                   2772: 
                   2773: #define MM_HIGHEST_USER_ADDRESS (PVOID)0x7FFEFFFF // highest user address
                   2774: #define MM_USER_PROBE_ADDRESS 0x7FFF0000    // starting address of guard page
                   2775: 
                   2776: //
                   2777: // The lowest user address reserves the low 64k.
                   2778: //
                   2779: 
                   2780: #define MM_LOWEST_USER_ADDRESS  (PVOID)0x00010000
                   2781: 
                   2782: //
                   2783: // The lowest address for system space.
                   2784: //
                   2785: 
                   2786: #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
                   2787: #define SYSTEM_BASE 0xc0800000          // start of system space (no typecast)
                   2788: 
                   2789: #endif // defined(_MIPS_)
                   2790: 
                   2791: #if defined(_ALPHA_)
                   2792: 
                   2793: //
                   2794: // Include the alpha instruction definitions
                   2795: //
                   2796: 
                   2797: #include "alphaops.h"
                   2798: 
                   2799: //
                   2800: // Include reference machine definitions.
                   2801: //
                   2802: 
                   2803: #include "alpharef.h"
                   2804: 
                   2805: 
                   2806: //
                   2807: // Define length of interrupt vector table.
                   2808: //
                   2809: 
                   2810: #define MAXIMUM_VECTOR 256
                   2811: 
                   2812: //
                   2813: // Define bus error routine type.
                   2814: //
                   2815: 
                   2816: struct _EXCEPTION_RECORD;
                   2817: struct _KEXCEPTION_FRAME;
                   2818: struct _KTRAP_FRAME;
                   2819: 
                   2820: typedef
                   2821: BOOLEAN
                   2822: (*PKBUS_ERROR_ROUTINE) (
                   2823:     IN struct _EXCEPTION_RECORD *ExceptionRecord,
                   2824:     IN struct _KEXCEPTION_FRAME *ExceptionFrame,
                   2825:     IN struct _KTRAP_FRAME *TrapFrame
                   2826:     );
                   2827: 
                   2828: 
                   2829: #define PCR_MINOR_VERSION 1
                   2830: #define PCR_MAJOR_VERSION 1
                   2831: 
                   2832: typedef struct _KPCR {
                   2833: 
                   2834: //
                   2835: // Major and minor version numbers of the PCR.
                   2836: //
                   2837: 
                   2838:     ULONG MinorVersion;
                   2839:     ULONG MajorVersion;
                   2840: 
                   2841: //
                   2842: // Start of the architecturally defined section of the PCR. This section
                   2843: // may be directly addressed by vendor/platform specific PAL/HAL code and will
                   2844: // not change from version to version of NT.
                   2845: 
                   2846: //
                   2847: // PALcode information.
                   2848: //
                   2849: 
                   2850:     ULONGLONG PalBaseAddress;
                   2851:     ULONG PalMajorVersion;
                   2852:     ULONG PalMinorVersion;
                   2853:     ULONG PalSequenceVersion;
                   2854:     ULONG PalMajorSpecification;
                   2855:     ULONG PalMinorSpecification;
                   2856: 
                   2857: //
                   2858: // Firmware restart information.
                   2859: //
                   2860: 
                   2861:     ULONGLONG FirmwareRestartAddress;
                   2862:     PVOID RestartBlock;
                   2863: 
                   2864: //
                   2865: // Reserved per-processor region for the PAL (3K bytes).
                   2866: //
                   2867: 
                   2868:     ULONGLONG PalReserved[384];
                   2869: 
                   2870: //
                   2871: // Panic Stack Address.
                   2872: //
                   2873: 
                   2874:     ULONG PanicStack;
                   2875: 
                   2876: //
                   2877: // Processor parameters.
                   2878: //
                   2879: 
                   2880:     ULONG ProcessorType;
                   2881:     ULONG ProcessorRevision;
                   2882:     ULONG PhysicalAddressBits;
                   2883:     ULONG MaximumAddressSpaceNumber;
                   2884:     ULONG PageSize;
                   2885:     ULONG FirstLevelDcacheSize;
                   2886:     ULONG FirstLevelDcacheFillSize;
                   2887:     ULONG FirstLevelIcacheSize;
                   2888:     ULONG FirstLevelIcacheFillSize;
                   2889: 
                   2890: //
                   2891: // System Parameters.
                   2892: //
                   2893: 
                   2894:     ULONG FirmwareRevisionId;
                   2895:     UCHAR SystemType[8];
                   2896:     ULONG SystemVariant;
                   2897:     ULONG SystemRevision;
                   2898:     UCHAR SystemSerialNumber[16];
                   2899:     ULONG CycleClockPeriod;
                   2900:     ULONG SecondLevelCacheSize;
                   2901:     ULONG SecondLevelCacheFillSize;
                   2902:     ULONG ThirdLevelCacheSize;
                   2903:     ULONG ThirdLevelCacheFillSize;
                   2904:     ULONG FourthLevelCacheSize;
                   2905:     ULONG FourthLevelCacheFillSize;
                   2906: 
                   2907: //
                   2908: // Pointer to processor control block.
                   2909: //
                   2910: 
                   2911:     struct _KPRCB *Prcb;
                   2912: 
                   2913: //
                   2914: // Processor identification.
                   2915: //
                   2916: 
                   2917:     CCHAR Number;
                   2918:     KAFFINITY SetMember;
                   2919: 
                   2920: //
                   2921: // Reserved per-processor region for the HAL (.5K bytes).
                   2922: //
                   2923: 
                   2924:     ULONGLONG HalReserved[64];
                   2925: 
                   2926: //
                   2927: // IRQL mapping tables.
                   2928: //
                   2929: 
                   2930:     ULONG IrqlTable[8];
                   2931: 
                   2932: #define SFW_IMT_ENTRIES 4
                   2933: #define HDW_IMT_ENTRIES 128
                   2934: 
                   2935:     struct _IRQLMASK {
                   2936:         USHORT IrqlTableIndex;   // synchronization irql level
                   2937:         USHORT IDTIndex;         // vector in IDT
                   2938:     } IrqlMask[SFW_IMT_ENTRIES + HDW_IMT_ENTRIES];
                   2939: 
                   2940: //
                   2941: // Interrupt Dispatch Table (IDT).
                   2942: //
                   2943: 
                   2944:     PKINTERRUPT_ROUTINE InterruptRoutine[MAXIMUM_VECTOR];
                   2945: 
                   2946: //
                   2947: // Reserved vectors mask, these vectors cannot be attached to via
                   2948: // standard interrupt objects.
                   2949: //
                   2950: 
                   2951:     ULONG ReservedVectors;
                   2952: 
                   2953: //
                   2954: // Profiling data.
                   2955: //
                   2956: 
                   2957:     PLIST_ENTRY ProfileListHead;
                   2958:     ULONG ProfileInterval;
                   2959:     ULONG ProfileCount;
                   2960: 
                   2961: //
                   2962: // Pointer to machine check handler
                   2963: //
                   2964: 
                   2965:     PKBUS_ERROR_ROUTINE MachineCheckError;
                   2966: 
                   2967: //
                   2968: // DPC Stack.
                   2969: //
                   2970: 
                   2971:     ULONG DpcStack;
                   2972: 
                   2973: //
                   2974: // End of the architecturally defined section of the PCR. This section
                   2975: // may be directly addressed by vendor/platform specific HAL code and will
                   2976: // not change from version to version of NT.  Some of these values are
                   2977: // reserved for chip-specific palcode.
                   2978: } KPCR, *PKPCR; 
                   2979: //
                   2980: // length of dispatch code in interrupt template
                   2981: //
                   2982: #define DISPATCH_LENGTH 4
                   2983: 
                   2984: //
                   2985: // Define IRQL levels across the architecture.
                   2986: //
                   2987: 
                   2988: #define PASSIVE_LEVEL   0
                   2989: #define LOW_LEVEL       0
                   2990: #define APC_LEVEL       1
                   2991: #define DISPATCH_LEVEL  2
                   2992: #define HIGH_LEVEL      7
                   2993: 
                   2994: 
                   2995: //
                   2996: // Define Interlocked operation result values.
                   2997: //
                   2998: 
                   2999: #define RESULT_ZERO 0
                   3000: #define RESULT_NEGATIVE 1
                   3001: #define RESULT_POSITIVE 2
                   3002: 
                   3003: //
                   3004: // Interlocked result type is portable, but its values are machine specific.
                   3005: // Constants for value are in i386.h, mips.h, etc.
                   3006: //
                   3007: 
                   3008: typedef enum _INTERLOCKED_RESULT {
                   3009:     ResultNegative = RESULT_NEGATIVE,
                   3010:     ResultZero     = RESULT_ZERO,
                   3011:     ResultPositive = RESULT_POSITIVE
                   3012: } INTERLOCKED_RESULT;
                   3013: 
                   3014: 
                   3015: // there is a lot of other stuff that could go in here
                   3016: //   probe macros
                   3017: //   others
                   3018: 
                   3019: //
                   3020: // Define the page size for the Alpha ev4 and lca as 8k.
                   3021: //
                   3022: 
                   3023: #define PAGE_SIZE (ULONG)0x2000
                   3024: 
                   3025: //
                   3026: // Define the number of trailing zeroes in a page aligned virtual address.
                   3027: // This is used as the shift count when shifting virtual addresses to
                   3028: // virtual page numbers.
                   3029: //
                   3030: 
                   3031: #define PAGE_SHIFT 13L
                   3032: 
                   3033: 
                   3034: //
                   3035: // The highest user address reserves 64K bytes for a guard page. This
                   3036: // the probing of address from kernel mode to only have to check the
                   3037: // starting address for structures of 64k bytes or less.
                   3038: //
                   3039: 
                   3040: #define MM_HIGHEST_USER_ADDRESS (PVOID)0x7FFEFFFF // highest user address
                   3041: #define MM_USER_PROBE_ADDRESS 0x7FFF0000    // starting address of guard page
                   3042: 
                   3043: //
                   3044: // The lowest user address reserves the low 64k.
                   3045: //
                   3046: 
                   3047: #define MM_LOWEST_USER_ADDRESS  (PVOID)0x00010000
                   3048: 
                   3049: //
                   3050: // The lowest address for system space.
                   3051: //
                   3052: 
                   3053: #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
                   3054: //
                   3055: // Cache and write buffer flush functions.
                   3056: //
                   3057: 
                   3058: VOID
                   3059: KeFlushIoBuffers (
                   3060:     IN PMDL Mdl,
                   3061:     IN BOOLEAN ReadOperation,
                   3062:     IN BOOLEAN DmaOperation
                   3063:     );
                   3064: 
                   3065: VOID
                   3066: KeRaiseIrql (
                   3067:     IN KIRQL NewIrql,
                   3068:     OUT PKIRQL OldIrql
                   3069:     );
                   3070: 
                   3071: VOID
                   3072: KeLowerIrql (
                   3073:     IN KIRQL NewIrql
                   3074:     );
                   3075: 
                   3076: #endif // _ALPHA_
                   3077: 
                   3078: #ifdef _X86_
                   3079: 
                   3080: //
                   3081: // Disable these two pramas that evaluate to "sti" "cli" on x86 so that driver
                   3082: // writers to not leave them inadvertantly in their code.
                   3083: //
                   3084: 
                   3085: #if !defined(MIDL_PASS)
                   3086: #if !defined(_CFRONT_PASS_)
                   3087: #if !defined(RC_INVOKED)
                   3088: 
                   3089: #pragma warning(disable:4164)   // disable C4164 warning so that apps that
                   3090:                                 // build with /Od don't get weird errors !
                   3091: #pragma function(_enable)
                   3092: #pragma function(_disable)
                   3093: 
                   3094: #pragma warning(default:4164)   // reenable C4164 warning
                   3095: 
                   3096: #endif
                   3097: #endif
                   3098: #endif
                   3099: 
                   3100: 
                   3101: #ifdef _X86_
                   3102: 
                   3103: // begin_winnt
                   3104: 
                   3105: //
                   3106: //  Define the size of the 80387 save area, which is in the context frame.
                   3107: //
                   3108: 
                   3109: #define SIZE_OF_80387_REGISTERS      80
                   3110: 
                   3111: //
                   3112: // The following flags control the contents of the CONTEXT structure.
                   3113: //
                   3114: 
                   3115: #define CONTEXT_i386    0x00010000    // this assumes that i386 and
                   3116: #define CONTEXT_i486    0x00010000    // i486 have identical context records
                   3117: 
                   3118: #define CONTEXT_CONTROL         (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
                   3119: #define CONTEXT_INTEGER         (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
                   3120: #define CONTEXT_SEGMENTS        (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
                   3121: #define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x00000008L) // 387 state
                   3122: #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
                   3123: 
                   3124: #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER |\
                   3125:                       CONTEXT_SEGMENTS)
                   3126: 
                   3127: typedef struct _FLOATING_SAVE_AREA {
                   3128:     ULONG   ControlWord;
                   3129:     ULONG   StatusWord;
                   3130:     ULONG   TagWord;
                   3131:     ULONG   ErrorOffset;
                   3132:     ULONG   ErrorSelector;
                   3133:     ULONG   DataOffset;
                   3134:     ULONG   DataSelector;
                   3135:     UCHAR   RegisterArea[SIZE_OF_80387_REGISTERS];
                   3136:     ULONG   Cr0NpxState;
                   3137: } FLOATING_SAVE_AREA;
                   3138: 
                   3139: typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
                   3140: 
                   3141: //
                   3142: // Context Frame
                   3143: //
                   3144: //  This frame has a several purposes: 1) it is used as an argument to
                   3145: //  NtContinue, 2) is is used to constuct a call frame for APC delivery,
                   3146: //  and 3) it is used in the user level thread creation routines.
                   3147: //
                   3148: //  The layout of the record conforms to a standard call frame.
                   3149: //
                   3150: 
                   3151: typedef struct _CONTEXT {
                   3152: 
                   3153:     //
                   3154:     // The flags values within this flag control the contents of
                   3155:     // a CONTEXT record.
                   3156:     //
                   3157:     // If the context record is used as an input parameter, then
                   3158:     // for each portion of the context record controlled by a flag
                   3159:     // whose value is set, it is assumed that that portion of the
                   3160:     // context record contains valid context. If the context record
                   3161:     // is being used to modify a threads context, then only that
                   3162:     // portion of the threads context will be modified.
                   3163:     //
                   3164:     // If the context record is used as an IN OUT parameter to capture
                   3165:     // the context of a thread, then only those portions of the thread's
                   3166:     // context corresponding to set flags will be returned.
                   3167:     //
                   3168:     // The context record is never used as an OUT only parameter.
                   3169:     //
                   3170: 
                   3171:     ULONG ContextFlags;
                   3172: 
                   3173:     //
                   3174:     // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
                   3175:     // set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT
                   3176:     // included in CONTEXT_FULL.
                   3177:     //
                   3178: 
                   3179:     ULONG   Dr0;
                   3180:     ULONG   Dr1;
                   3181:     ULONG   Dr2;
                   3182:     ULONG   Dr3;
                   3183:     ULONG   Dr6;
                   3184:     ULONG   Dr7;
                   3185: 
                   3186:     //
                   3187:     // This section is specified/returned if the
                   3188:     // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
                   3189:     //
                   3190: 
                   3191:     FLOATING_SAVE_AREA FloatSave;
                   3192: 
                   3193:     //
                   3194:     // This section is specified/returned if the
                   3195:     // ContextFlags word contians the flag CONTEXT_SEGMENTS.
                   3196:     //
                   3197: 
                   3198:     ULONG   SegGs;
                   3199:     ULONG   SegFs;
                   3200:     ULONG   SegEs;
                   3201:     ULONG   SegDs;
                   3202: 
                   3203:     //
                   3204:     // This section is specified/returned if the
                   3205:     // ContextFlags word contians the flag CONTEXT_INTEGER.
                   3206:     //
                   3207: 
                   3208:     ULONG   Edi;
                   3209:     ULONG   Esi;
                   3210:     ULONG   Ebx;
                   3211:     ULONG   Edx;
                   3212:     ULONG   Ecx;
                   3213:     ULONG   Eax;
                   3214: 
                   3215:     //
                   3216:     // This section is specified/returned if the
                   3217:     // ContextFlags word contians the flag CONTEXT_CONTROL.
                   3218:     //
                   3219: 
                   3220:     ULONG   Ebp;
                   3221:     ULONG   Eip;
                   3222:     ULONG   SegCs;              // MUST BE SANITIZED
                   3223:     ULONG   EFlags;             // MUST BE SANITIZED
                   3224:     ULONG   Esp;
                   3225:     ULONG   SegSs;
                   3226: 
                   3227: } CONTEXT;
                   3228: 
                   3229: 
                   3230: 
                   3231: typedef CONTEXT *PCONTEXT;
                   3232: 
                   3233: // begin_ntminiport
                   3234: 
                   3235: #endif //_X86_
                   3236: 
                   3237: //
                   3238: // I/O space read and write macros.
                   3239: //
                   3240: //  These have to be actual functions on the 386, because we need
                   3241: //  to use assembler, but cannot return a value if we inline it.
                   3242: //
                   3243: //  The READ/WRITE_REGISTER_* calls manipulate I/O registers in MEMORY space.
                   3244: //  (Use x86 move instructions, with LOCK prefix to force correct behavior
                   3245: //   w.r.t. caches and write buffers.)
                   3246: //
                   3247: //  The READ/WRITE_PORT_* calls manipulate I/O registers in PORT space.
                   3248: //  (Use x86 in/out instructions.)
                   3249: //
                   3250: 
                   3251: UCHAR
                   3252: READ_REGISTER_UCHAR(
                   3253:     PUCHAR  Register
                   3254:     );
                   3255: 
                   3256: USHORT
                   3257: READ_REGISTER_USHORT(
                   3258:     PUSHORT Register
                   3259:     );
                   3260: 
                   3261: ULONG
                   3262: READ_REGISTER_ULONG(
                   3263:     PULONG  Register
                   3264:     );
                   3265: 
                   3266: VOID
                   3267: READ_REGISTER_BUFFER_UCHAR(
                   3268:     PUCHAR  Register,
                   3269:     PUCHAR  Buffer,
                   3270:     ULONG   Count
                   3271:     );
                   3272: 
                   3273: VOID
                   3274: READ_REGISTER_BUFFER_USHORT(
                   3275:     PUSHORT Register,
                   3276:     PUSHORT Buffer,
                   3277:     ULONG   Count
                   3278:     );
                   3279: 
                   3280: VOID
                   3281: READ_REGISTER_BUFFER_ULONG(
                   3282:     PULONG  Register,
                   3283:     PULONG  Buffer,
                   3284:     ULONG   Count
                   3285:     );
                   3286: 
                   3287: 
                   3288: VOID
                   3289: WRITE_REGISTER_UCHAR(
                   3290:     PUCHAR  Register,
                   3291:     UCHAR   Value
                   3292:     );
                   3293: 
                   3294: VOID
                   3295: WRITE_REGISTER_USHORT(
                   3296:     PUSHORT Register,
                   3297:     USHORT  Value
                   3298:     );
                   3299: 
                   3300: VOID
                   3301: WRITE_REGISTER_ULONG(
                   3302:     PULONG  Register,
                   3303:     ULONG   Value
                   3304:     );
                   3305: 
                   3306: VOID
                   3307: WRITE_REGISTER_BUFFER_UCHAR(
                   3308:     PUCHAR  Register,
                   3309:     PUCHAR  Buffer,
                   3310:     ULONG   Count
                   3311:     );
                   3312: 
                   3313: VOID
                   3314: WRITE_REGISTER_BUFFER_USHORT(
                   3315:     PUSHORT Register,
                   3316:     PUSHORT Buffer,
                   3317:     ULONG   Count
                   3318:     );
                   3319: 
                   3320: VOID
                   3321: WRITE_REGISTER_BUFFER_ULONG(
                   3322:     PULONG  Register,
                   3323:     PULONG  Buffer,
                   3324:     ULONG   Count
                   3325:     );
                   3326: 
                   3327: UCHAR
                   3328: READ_PORT_UCHAR(
                   3329:     PUCHAR  Port
                   3330:     );
                   3331: 
                   3332: USHORT
                   3333: READ_PORT_USHORT(
                   3334:     PUSHORT Port
                   3335:     );
                   3336: 
                   3337: ULONG
                   3338: READ_PORT_ULONG(
                   3339:     PULONG  Port
                   3340:     );
                   3341: 
                   3342: VOID
                   3343: READ_PORT_BUFFER_UCHAR(
                   3344:     PUCHAR  Port,
                   3345:     PUCHAR  Buffer,
                   3346:     ULONG   Count
                   3347:     );
                   3348: 
                   3349: VOID
                   3350: READ_PORT_BUFFER_USHORT(
                   3351:     PUSHORT Port,
                   3352:     PUSHORT Buffer,
                   3353:     ULONG   Count
                   3354:     );
                   3355: 
                   3356: VOID
                   3357: READ_PORT_BUFFER_ULONG(
                   3358:     PULONG  Port,
                   3359:     PULONG  Buffer,
                   3360:     ULONG   Count
                   3361:     );
                   3362: 
                   3363: VOID
                   3364: WRITE_PORT_UCHAR(
                   3365:     PUCHAR  Port,
                   3366:     UCHAR   Value
                   3367:     );
                   3368: 
                   3369: VOID
                   3370: WRITE_PORT_USHORT(
                   3371:     PUSHORT Port,
                   3372:     USHORT  Value
                   3373:     );
                   3374: 
                   3375: VOID
                   3376: WRITE_PORT_ULONG(
                   3377:     PULONG  Port,
                   3378:     ULONG   Value
                   3379:     );
                   3380: 
                   3381: VOID
                   3382: WRITE_PORT_BUFFER_UCHAR(
                   3383:     PUCHAR  Port,
                   3384:     PUCHAR  Buffer,
                   3385:     ULONG   Count
                   3386:     );
                   3387: 
                   3388: VOID
                   3389: WRITE_PORT_BUFFER_USHORT(
                   3390:     PUSHORT Port,
                   3391:     PUSHORT Buffer,
                   3392:     ULONG   Count
                   3393:     );
                   3394: 
                   3395: VOID
                   3396: WRITE_PORT_BUFFER_ULONG(
                   3397:     PULONG  Port,
                   3398:     PULONG  Buffer,
                   3399:     ULONG   Count
                   3400:     );
                   3401: 
                   3402: #endif // _X86_
                   3403: 
                   3404: #if defined(_MIPS_)
                   3405: //
                   3406: // Define unsupported "keywords".
                   3407: //
                   3408: 
                   3409: #define _cdecl
                   3410: 
                   3411: // begin_windbgkd
                   3412: 
                   3413: #if defined(_MIPS_)
                   3414: 
                   3415: #endif                          
                   3416: //
                   3417: // Define length of exception code dispatch vector.
                   3418: //
                   3419: 
                   3420: #define XCODE_VECTOR_LENGTH 32
                   3421: 
                   3422: //
                   3423: // Define length of interrupt vector table.
                   3424: //
                   3425: 
                   3426: #define MAXIMUM_VECTOR 256
                   3427: 
                   3428: //
                   3429: // Define bus error routine type.
                   3430: //
                   3431: 
                   3432: struct _EXCEPTION_RECORD;
                   3433: struct _KEXCEPTION_FRAME;
                   3434: struct _KTRAP_FRAME;
                   3435: 
                   3436: typedef
                   3437: VOID
                   3438: (*PKBUS_ERROR_ROUTINE) (
                   3439:     IN struct _EXCEPTION_RECORD *ExceptionRecord,
                   3440:     IN struct _KEXCEPTION_FRAME *ExceptionFrame,
                   3441:     IN struct _KTRAP_FRAME *TrapFrame,
                   3442:     IN PVOID VirtualAddress,
                   3443:     IN PHYSICAL_ADDRESS PhysicalAddress
                   3444:     );
                   3445: 
                   3446: //
                   3447: // Define Processor Control Region Structure.
                   3448: //
                   3449: 
                   3450: #define PCR_MINOR_VERSION 1
                   3451: #define PCR_MAJOR_VERSION 1
                   3452: 
                   3453: typedef struct _KPCR {
                   3454: 
                   3455: //
                   3456: // Major and minor version numbers of the PCR.
                   3457: //
                   3458: 
                   3459:     USHORT MinorVersion;
                   3460:     USHORT MajorVersion;
                   3461: 
                   3462: //
                   3463: // Start of the architecturally defined section of the PCR. This section
                   3464: // may be directly addressed by vendor/platform specific HAL code and will
                   3465: // not change from version to version of NT.
                   3466: //
                   3467: // Interrupt and error exception vectors.
                   3468: //
                   3469: 
                   3470:     PKINTERRUPT_ROUTINE InterruptRoutine[MAXIMUM_VECTOR];
                   3471:     PVOID XcodeDispatch[XCODE_VECTOR_LENGTH];
                   3472: 
                   3473: //
                   3474: // First and second level cache parameters.
                   3475: //
                   3476: 
                   3477:     ULONG FirstLevelDcacheSize;
                   3478:     ULONG FirstLevelDcacheFillSize;
                   3479:     ULONG FirstLevelIcacheSize;
                   3480:     ULONG FirstLevelIcacheFillSize;
                   3481:     ULONG SecondLevelDcacheSize;
                   3482:     ULONG SecondLevelDcacheFillSize;
                   3483:     ULONG SecondLevelIcacheSize;
                   3484:     ULONG SecondLevelIcacheFillSize;
                   3485: 
                   3486: //
                   3487: // Pointer to processor control block.
                   3488: //
                   3489: 
                   3490:     struct _KPRCB *Prcb;
                   3491: 
                   3492: //
                   3493: // Pointer to the thread environment block.
                   3494: //
                   3495: 
                   3496:     PVOID Teb;
                   3497: 
                   3498: //
                   3499: // Data cache alignment and fill size used for cache flushing and alignment.
                   3500: // These fields are set to the larger of the first and second level data
                   3501: // cache fill sizes.
                   3502: //
                   3503: 
                   3504:     ULONG DcacheAlignment;
                   3505:     ULONG DcacheFillSize;
                   3506: 
                   3507: //
                   3508: // Instruction cache alignment and fill size used for cache flushing and
                   3509: // alignment. These fields are set to the larger of the first and second
                   3510: // level data cache fill sizes.
                   3511: //
                   3512: 
                   3513:     ULONG IcacheAlignment;
                   3514:     ULONG IcacheFillSize;
                   3515: 
                   3516: //
                   3517: // Processor identification from PrId register.
                   3518: //
                   3519: 
                   3520:     ULONG ProcessorId;
                   3521: 
                   3522: //
                   3523: // Profiling data.
                   3524: //
                   3525: 
                   3526:     ULONG ProfileInterval;
                   3527:     ULONG ProfileCount;
                   3528: 
                   3529: //
                   3530: // Stall execution count and scale factor.
                   3531: //
                   3532: 
                   3533:     ULONG StallExecutionCount;
                   3534:     ULONG StallScaleFactor;
                   3535: 
                   3536: //
                   3537: // Spare cell.
                   3538: //
                   3539: 
                   3540:     ULONG Spare;
                   3541: 
                   3542: //
                   3543: // Pointers to bus error and parity error routines.
                   3544: //
                   3545: 
                   3546:     PKBUS_ERROR_ROUTINE DataBusError;
                   3547:     PKBUS_ERROR_ROUTINE InstructionBusError;
                   3548: 
                   3549: //
                   3550: // Cache policy, right justified, as read from the processor configuration
                   3551: // register at startup.
                   3552: //
                   3553: 
                   3554:     ULONG CachePolicy;
                   3555: 
                   3556: //
                   3557: // IRQL mapping tables.
                   3558: //
                   3559: 
                   3560:     UCHAR IrqlMask[32];
                   3561:     UCHAR IrqlTable[9];
                   3562: 
                   3563: //
                   3564: // Current IRQL.
                   3565: //
                   3566: 
                   3567:     UCHAR CurrentIrql;
                   3568: 
                   3569: //
                   3570: // Processor affinity mask.
                   3571: //
                   3572: 
                   3573:     KAFFINITY SetMember;
                   3574: 
                   3575: //
                   3576: // Reserved interrupt vector mask.
                   3577: //
                   3578: 
                   3579:     ULONG ReservedVectors;
                   3580: 
                   3581: //
                   3582: // Current state parameters.
                   3583: //
                   3584: 
                   3585:     struct _KTHREAD *CurrentThread;
                   3586: 
                   3587: //
                   3588: // Cache policy, PTE field aligned, as read from the processor configuration
                   3589: // register at startup.
                   3590: //
                   3591: 
                   3592:     ULONG AlignedCachePolicy;
                   3593: 
                   3594: //
                   3595: // Spare cell.
                   3596: //
                   3597: 
                   3598:     ULONG Spare0;
                   3599: 
                   3600: //
                   3601: // Space reserved for the system.
                   3602: //
                   3603: 
                   3604:     ULONG   SystemReserved[16];
                   3605: 
                   3606: //
                   3607: // Space reserved for the HAL
                   3608: //
                   3609: 
                   3610:     ULONG   HalReserved[16];
                   3611: 
                   3612: //
                   3613: // End of the architecturally defined section of the PCR. This section
                   3614: // may be directly addressed by vendor/platform specific HAL code and will
                   3615: // not change from version to version of NT.
                   3616: //
                   3617: } KPCR, *PKPCR;                     
                   3618: //
                   3619: // The following flags control the contents of the CONTEXT structure.
                   3620: //
                   3621: 
                   3622: #define CONTEXT_R4000   0x00010000    // r4000 context
                   3623: 
                   3624: #define CONTEXT_CONTROL         (CONTEXT_R4000 | 0x00000001L)
                   3625: #define CONTEXT_FLOATING_POINT  (CONTEXT_R4000 | 0x00000002L)
                   3626: #define CONTEXT_INTEGER         (CONTEXT_R4000 | 0x00000004L)
                   3627: 
                   3628: #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
                   3629: 
                   3630: //
                   3631: // Context Frame
                   3632: //
                   3633: //  N.B. This frame must be exactly a multiple of 16 bytes in length.
                   3634: //
                   3635: //  This frame has a several purposes: 1) it is used as an argument to
                   3636: //  NtContinue, 2) it is used to constuct a call frame for APC delivery,
                   3637: //  3) it is used to construct a call frame for exception dispatching
                   3638: //  in user mode, and 4) it is used in the user level thread creation
                   3639: //  routines.
                   3640: //
                   3641: //  The layout of the record conforms to a standard call frame.
                   3642: //
                   3643: 
                   3644: typedef struct _CONTEXT {
                   3645: 
                   3646:     //
                   3647:     // This section is always present and is used as an argument build
                   3648:     // area.
                   3649:     //
                   3650: 
                   3651:     ULONG Argument[4];
                   3652: 
                   3653:     //
                   3654:     // This section is specified/returned if the ContextFlags word contains
                   3655:     // the flag CONTEXT_FLOATING_POINT.
                   3656:     //
                   3657: 
                   3658:     ULONG FltF0;
                   3659:     ULONG FltF1;
                   3660:     ULONG FltF2;
                   3661:     ULONG FltF3;
                   3662:     ULONG FltF4;
                   3663:     ULONG FltF5;
                   3664:     ULONG FltF6;
                   3665:     ULONG FltF7;
                   3666:     ULONG FltF8;
                   3667:     ULONG FltF9;
                   3668:     ULONG FltF10;
                   3669:     ULONG FltF11;
                   3670:     ULONG FltF12;
                   3671:     ULONG FltF13;
                   3672:     ULONG FltF14;
                   3673:     ULONG FltF15;
                   3674:     ULONG FltF16;
                   3675:     ULONG FltF17;
                   3676:     ULONG FltF18;
                   3677:     ULONG FltF19;
                   3678:     ULONG FltF20;
                   3679:     ULONG FltF21;
                   3680:     ULONG FltF22;
                   3681:     ULONG FltF23;
                   3682:     ULONG FltF24;
                   3683:     ULONG FltF25;
                   3684:     ULONG FltF26;
                   3685:     ULONG FltF27;
                   3686:     ULONG FltF28;
                   3687:     ULONG FltF29;
                   3688:     ULONG FltF30;
                   3689:     ULONG FltF31;
                   3690: 
                   3691:     //
                   3692:     // This section is specified/returned if the ContextFlags word contains
                   3693:     // the flag CONTEXT_INTEGER.
                   3694:     //
                   3695:     // N.B. The registers gp, sp, and ra are defined in this section, but are
                   3696:     //  considered part of the control context rather than part of the integer
                   3697:     //  context.
                   3698:     //
                   3699:     // N.B. Register zero is not stored in the frame.
                   3700:     //
                   3701: 
                   3702:     ULONG IntZero;
                   3703:     ULONG IntAt;
                   3704:     ULONG IntV0;
                   3705:     ULONG IntV1;
                   3706:     ULONG IntA0;
                   3707:     ULONG IntA1;
                   3708:     ULONG IntA2;
                   3709:     ULONG IntA3;
                   3710:     ULONG IntT0;
                   3711:     ULONG IntT1;
                   3712:     ULONG IntT2;
                   3713:     ULONG IntT3;
                   3714:     ULONG IntT4;
                   3715:     ULONG IntT5;
                   3716:     ULONG IntT6;
                   3717:     ULONG IntT7;
                   3718:     ULONG IntS0;
                   3719:     ULONG IntS1;
                   3720:     ULONG IntS2;
                   3721:     ULONG IntS3;
                   3722:     ULONG IntS4;
                   3723:     ULONG IntS5;
                   3724:     ULONG IntS6;
                   3725:     ULONG IntS7;
                   3726:     ULONG IntT8;
                   3727:     ULONG IntT9;
                   3728:     ULONG IntK0;
                   3729:     ULONG IntK1;
                   3730:     ULONG IntGp;
                   3731:     ULONG IntSp;
                   3732:     ULONG IntS8;
                   3733:     ULONG IntRa;
                   3734:     ULONG IntLo;
                   3735:     ULONG IntHi;
                   3736: 
                   3737:     //
                   3738:     // This section is specified/returned if the ContextFlags word contains
                   3739:     // the flag CONTEXT_FLOATING_POINT.
                   3740:     //
                   3741: 
                   3742:     ULONG Fsr;
                   3743: 
                   3744:     //
                   3745:     // This section is specified/returned if the ContextFlags word contains
                   3746:     // the flag CONTEXT_CONTROL.
                   3747:     //
                   3748:     // N.B. The registers gp, sp, and ra are defined in the integer section,
                   3749:     //   but are considered part of the control context rather than part of
                   3750:     //   the integer context.
                   3751:     //
                   3752: 
                   3753:     ULONG Fir;
                   3754:     ULONG Psr;
                   3755: 
                   3756:     //
                   3757:     // The flags values within this flag control the contents of
                   3758:     // a CONTEXT record.
                   3759:     //
                   3760:     // If the context record is used as an input parameter, then
                   3761:     // for each portion of the context record controlled by a flag
                   3762:     // whose value is set, it is assumed that that portion of the
                   3763:     // context record contains valid context. If the context record
                   3764:     // is being used to modify a thread's context, then only that
                   3765:     // portion of the threads context will be modified.
                   3766:     //
                   3767:     // If the context record is used as an IN OUT parameter to capture
                   3768:     // the context of a thread, then only those portions of the thread's
                   3769:     // context corresponding to set flags will be returned.
                   3770:     //
                   3771:     // The context record is never used as an OUT only parameter.
                   3772:     //
                   3773: 
                   3774:     ULONG ContextFlags;
                   3775: 
                   3776:     ULONG Fill[2];
                   3777: } CONTEXT, *PCONTEXT;
                   3778: 
                   3779: #endif // defined(_MIPS_)
                   3780: #ifdef _ALPHA_                  
                   3781: //
                   3782: // The following flags control the contents of the CONTEXT structure.
                   3783: //
                   3784: 
                   3785: #define CONTEXT_PORTABLE_32BIT     0x00100000
                   3786: #define CONTEXT_ALPHA              0x00020000
                   3787: 
                   3788: #define CONTEXT_CONTROL         (CONTEXT_ALPHA | 0x00000001L)
                   3789: #define CONTEXT_FLOATING_POINT  (CONTEXT_ALPHA | 0x00000002L)
                   3790: #define CONTEXT_INTEGER         (CONTEXT_ALPHA | 0x00000004L)
                   3791: 
                   3792: #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
                   3793: 
                   3794: #ifndef _PORTABLE_32BIT_CONTEXT
                   3795: 
                   3796: //
                   3797: // Context Frame
                   3798: //
                   3799: //  This frame has a several purposes: 1) it is used as an argument to
                   3800: //  NtContinue, 2) it is used to construct a call frame for APC delivery,
                   3801: //  3) it is used to construct a call frame for exception dispatching
                   3802: //  in user mode, 4) it is used in the user level thread creation
                   3803: //  routines, and 5) it is used to to pass thread state to debuggers.
                   3804: //
                   3805: //  N.B. Because this record is used as a call frame, it must be EXACTLY
                   3806: //  a multiple of 16 bytes in length.
                   3807: //
                   3808: //  There are two variations of the context structure. This is the real one.
                   3809: //
                   3810: 
                   3811: typedef struct _CONTEXT {
                   3812: 
                   3813:     //
                   3814:     // This section is specified/returned if the ContextFlags word contains
                   3815:     // the flag CONTEXT_FLOATING_POINT.
                   3816:     //
                   3817: 
                   3818:     ULONGLONG FltF0;
                   3819:     ULONGLONG FltF1;
                   3820:     ULONGLONG FltF2;
                   3821:     ULONGLONG FltF3;
                   3822:     ULONGLONG FltF4;
                   3823:     ULONGLONG FltF5;
                   3824:     ULONGLONG FltF6;
                   3825:     ULONGLONG FltF7;
                   3826:     ULONGLONG FltF8;
                   3827:     ULONGLONG FltF9;
                   3828:     ULONGLONG FltF10;
                   3829:     ULONGLONG FltF11;
                   3830:     ULONGLONG FltF12;
                   3831:     ULONGLONG FltF13;
                   3832:     ULONGLONG FltF14;
                   3833:     ULONGLONG FltF15;
                   3834:     ULONGLONG FltF16;
                   3835:     ULONGLONG FltF17;
                   3836:     ULONGLONG FltF18;
                   3837:     ULONGLONG FltF19;
                   3838:     ULONGLONG FltF20;
                   3839:     ULONGLONG FltF21;
                   3840:     ULONGLONG FltF22;
                   3841:     ULONGLONG FltF23;
                   3842:     ULONGLONG FltF24;
                   3843:     ULONGLONG FltF25;
                   3844:     ULONGLONG FltF26;
                   3845:     ULONGLONG FltF27;
                   3846:     ULONGLONG FltF28;
                   3847:     ULONGLONG FltF29;
                   3848:     ULONGLONG FltF30;
                   3849:     ULONGLONG FltF31;
                   3850: 
                   3851:     //
                   3852:     // This section is specified/returned if the ContextFlags word contains
                   3853:     // the flag CONTEXT_INTEGER.
                   3854:     //
                   3855:     // N.B. The registers gp, sp, and ra are defined in this section, but are
                   3856:     //  considered part of the control context rather than part of the integer
                   3857:     //  context.
                   3858:     //
                   3859: 
                   3860:     ULONGLONG IntV0;    //  $0: return value register, v0
                   3861:     ULONGLONG IntT0;    //  $1: temporary registers, t0 - t7
                   3862:     ULONGLONG IntT1;    //  $2:
                   3863:     ULONGLONG IntT2;    //  $3:
                   3864:     ULONGLONG IntT3;    //  $4:
                   3865:     ULONGLONG IntT4;    //  $5:
                   3866:     ULONGLONG IntT5;    //  $6:
                   3867:     ULONGLONG IntT6;    //  $7:
                   3868:     ULONGLONG IntT7;    //  $8:
                   3869:     ULONGLONG IntS0;    //  $9: nonvolatile registers, s0 - s5
                   3870:     ULONGLONG IntS1;    // $10:
                   3871:     ULONGLONG IntS2;    // $11:
                   3872:     ULONGLONG IntS3;    // $12:
                   3873:     ULONGLONG IntS4;    // $13:
                   3874:     ULONGLONG IntS5;    // $14:
                   3875:     ULONGLONG IntFp;    // $15: frame pointer register, fp/s6
                   3876:     ULONGLONG IntA0;    // $16: argument registers, a0 - a5
                   3877:     ULONGLONG IntA1;    // $17:
                   3878:     ULONGLONG IntA2;    // $18:
                   3879:     ULONGLONG IntA3;    // $19:
                   3880:     ULONGLONG IntA4;    // $20:
                   3881:     ULONGLONG IntA5;    // $21:
                   3882:     ULONGLONG IntT8;    // $22: temporary registers, t8 - t11
                   3883:     ULONGLONG IntT9;    // $23:
                   3884:     ULONGLONG IntT10;   // $24:
                   3885:     ULONGLONG IntT11;   // $25:
                   3886:     ULONGLONG IntRa;    // $26: return address register, ra
                   3887:     ULONGLONG IntT12;   // $27: temporary register, t12
                   3888:     ULONGLONG IntAt;    // $28: assembler temp register, at
                   3889:     ULONGLONG IntGp;    // $29: global pointer register, gp
                   3890:     ULONGLONG IntSp;    // $30: stack pointer register, sp
                   3891:     ULONGLONG IntZero;  // $31: zero register, zero
                   3892: 
                   3893:     //
                   3894:     // This section is specified/returned if the ContextFlags word contains
                   3895:     // the flag CONTEXT_FLOATING_POINT.
                   3896:     //
                   3897: 
                   3898:     ULONGLONG Fpcr;     // floating point control register
                   3899:     ULONGLONG SoftFpcr; // software extension to FPCR
                   3900: 
                   3901:     //
                   3902:     // This section is specified/returned if the ContextFlags word contains
                   3903:     // the flag CONTEXT_CONTROL.
                   3904:     //
                   3905:     // N.B. The registers gp, sp, and ra are defined in the integer section,
                   3906:     //   but are considered part of the control context rather than part of
                   3907:     //   the integer context.
                   3908:     //
                   3909: 
                   3910:     ULONGLONG Fir;      // (fault instruction) continuation address
                   3911:     ULONG Psr;          // processor status
                   3912: 
                   3913:     //
                   3914:     // The flags values within this flag control the contents of
                   3915:     // a CONTEXT record.
                   3916:     //
                   3917:     // If the context record is used as an input parameter, then
                   3918:     // for each portion of the context record controlled by a flag
                   3919:     // whose value is set, it is assumed that that portion of the
                   3920:     // context record contains valid context. If the context record
                   3921:     // is being used to modify a thread's context, then only that
                   3922:     // portion of the threads context will be modified.
                   3923:     //
                   3924:     // If the context record is used as an IN OUT parameter to capture
                   3925:     // the context of a thread, then only those portions of the thread's
                   3926:     // context corresponding to set flags will be returned.
                   3927:     //
                   3928:     // The context record is never used as an OUT only parameter.
                   3929:     //
                   3930: 
                   3931:     ULONG ContextFlags;
                   3932:     ULONG Fill[4];      // padding for 16-byte stack frame alignment
                   3933: 
                   3934: } CONTEXT, *PCONTEXT;
                   3935: 
                   3936: #else
                   3937: 
                   3938: //
                   3939: // 32-bit Context Frame
                   3940: //
                   3941: //  This alternate version of the Alpha context structure parallels that
                   3942: //  of MIPS and IX86 in style for the first 64 entries: 32-bit machines
                   3943: //  can operate on the fields, and a value declared as a pointer to an
                   3944: //  array of int's can be used to index into the fields.  This makes life
                   3945: //  with windbg and ntsd vastly easier.
                   3946: //
                   3947: //  There are two parts: the first contains the lower 32-bits of each
                   3948: //  element in the 64-bit definition above.  The second part contains
                   3949: //  the upper 32-bits of each 64-bit element above.
                   3950: //
                   3951: //  The names in the first part are identical to the 64-bit names.
                   3952: //  The second part names are prefixed with "High".
                   3953: //
                   3954: //  1st half: at 32 bits each, (containing the low parts of 64-bit values)
                   3955: //      32 floats, 32 ints, fpcrs, fir, psr, contextflags
                   3956: //  2nd half: at 32 bits each
                   3957: //      32 floats, 32 ints, fpcrs, fir, fill
                   3958: //
                   3959: //  There is no external support for the 32-bit version of the context
                   3960: //  structure.  It is only used internally by windbg and ntsd.
                   3961: //
                   3962: //  This structure must be the same size as the 64-bit version above.
                   3963: //
                   3964: 
                   3965: typedef struct _CONTEXT {
                   3966: 
                   3967:     ULONG FltF0;
                   3968:     ULONG FltF1;
                   3969:     ULONG FltF2;
                   3970:     ULONG FltF3;
                   3971:     ULONG FltF4;
                   3972:     ULONG FltF5;
                   3973:     ULONG FltF6;
                   3974:     ULONG FltF7;
                   3975:     ULONG FltF8;
                   3976:     ULONG FltF9;
                   3977:     ULONG FltF10;
                   3978:     ULONG FltF11;
                   3979:     ULONG FltF12;
                   3980:     ULONG FltF13;
                   3981:     ULONG FltF14;
                   3982:     ULONG FltF15;
                   3983:     ULONG FltF16;
                   3984:     ULONG FltF17;
                   3985:     ULONG FltF18;
                   3986:     ULONG FltF19;
                   3987:     ULONG FltF20;
                   3988:     ULONG FltF21;
                   3989:     ULONG FltF22;
                   3990:     ULONG FltF23;
                   3991:     ULONG FltF24;
                   3992:     ULONG FltF25;
                   3993:     ULONG FltF26;
                   3994:     ULONG FltF27;
                   3995:     ULONG FltF28;
                   3996:     ULONG FltF29;
                   3997:     ULONG FltF30;
                   3998:     ULONG FltF31;
                   3999: 
                   4000:     ULONG IntV0;        //  $0: return value register, v0
                   4001:     ULONG IntT0;        //  $1: temporary registers, t0 - t7
                   4002:     ULONG IntT1;        //  $2:
                   4003:     ULONG IntT2;        //  $3:
                   4004:     ULONG IntT3;        //  $4:
                   4005:     ULONG IntT4;        //  $5:
                   4006:     ULONG IntT5;        //  $6:
                   4007:     ULONG IntT6;        //  $7:
                   4008:     ULONG IntT7;        //  $8:
                   4009:     ULONG IntS0;        //  $9: nonvolatile registers, s0 - s5
                   4010:     ULONG IntS1;        // $10:
                   4011:     ULONG IntS2;        // $11:
                   4012:     ULONG IntS3;        // $12:
                   4013:     ULONG IntS4;        // $13:
                   4014:     ULONG IntS5;        // $14:
                   4015:     ULONG IntFp;        // $15: frame pointer register, fp/s6
                   4016:     ULONG IntA0;        // $16: argument registers, a0 - a5
                   4017:     ULONG IntA1;        // $17:
                   4018:     ULONG IntA2;        // $18:
                   4019:     ULONG IntA3;        // $19:
                   4020:     ULONG IntA4;        // $20:
                   4021:     ULONG IntA5;        // $21:
                   4022:     ULONG IntT8;        // $22: temporary registers, t8 - t11
                   4023:     ULONG IntT9;        // $23:
                   4024:     ULONG IntT10;       // $24:
                   4025:     ULONG IntT11;       // $25:
                   4026:     ULONG IntRa;        // $26: return address register, ra
                   4027:     ULONG IntT12;       // $27: temporary register, t12
                   4028:     ULONG IntAt;        // $28: assembler temp register, at
                   4029:     ULONG IntGp;        // $29: global pointer register, gp
                   4030:     ULONG IntSp;        // $30: stack pointer register, sp
                   4031:     ULONG IntZero;      // $31: zero register, zero
                   4032: 
                   4033:     ULONG Fpcr;         // floating point control register
                   4034:     ULONG SoftFpcr;     // software extension to FPCR
                   4035: 
                   4036:     ULONG Fir;          // (fault instruction) continuation address
                   4037: 
                   4038:     ULONG Psr;          // processor status
                   4039:     ULONG ContextFlags;
                   4040: 
                   4041:     //
                   4042:     // Beginning of the "second half".
                   4043:     // The name "High" parallels the HighPart of a LargeInteger.
                   4044:     //
                   4045: 
                   4046:     ULONG HighFltF0;
                   4047:     ULONG HighFltF1;
                   4048:     ULONG HighFltF2;
                   4049:     ULONG HighFltF3;
                   4050:     ULONG HighFltF4;
                   4051:     ULONG HighFltF5;
                   4052:     ULONG HighFltF6;
                   4053:     ULONG HighFltF7;
                   4054:     ULONG HighFltF8;
                   4055:     ULONG HighFltF9;
                   4056:     ULONG HighFltF10;
                   4057:     ULONG HighFltF11;
                   4058:     ULONG HighFltF12;
                   4059:     ULONG HighFltF13;
                   4060:     ULONG HighFltF14;
                   4061:     ULONG HighFltF15;
                   4062:     ULONG HighFltF16;
                   4063:     ULONG HighFltF17;
                   4064:     ULONG HighFltF18;
                   4065:     ULONG HighFltF19;
                   4066:     ULONG HighFltF20;
                   4067:     ULONG HighFltF21;
                   4068:     ULONG HighFltF22;
                   4069:     ULONG HighFltF23;
                   4070:     ULONG HighFltF24;
                   4071:     ULONG HighFltF25;
                   4072:     ULONG HighFltF26;
                   4073:     ULONG HighFltF27;
                   4074:     ULONG HighFltF28;
                   4075:     ULONG HighFltF29;
                   4076:     ULONG HighFltF30;
                   4077:     ULONG HighFltF31;
                   4078: 
                   4079:     ULONG HighIntV0;        //  $0: return value register, v0
                   4080:     ULONG HighIntT0;        //  $1: temporary registers, t0 - t7
                   4081:     ULONG HighIntT1;        //  $2:
                   4082:     ULONG HighIntT2;        //  $3:
                   4083:     ULONG HighIntT3;        //  $4:
                   4084:     ULONG HighIntT4;        //  $5:
                   4085:     ULONG HighIntT5;        //  $6:
                   4086:     ULONG HighIntT6;        //  $7:
                   4087:     ULONG HighIntT7;        //  $8:
                   4088:     ULONG HighIntS0;        //  $9: nonvolatile registers, s0 - s5
                   4089:     ULONG HighIntS1;        // $10:
                   4090:     ULONG HighIntS2;        // $11:
                   4091:     ULONG HighIntS3;        // $12:
                   4092:     ULONG HighIntS4;        // $13:
                   4093:     ULONG HighIntS5;        // $14:
                   4094:     ULONG HighIntFp;        // $15: frame pointer register, fp/s6
                   4095:     ULONG HighIntA0;        // $16: argument registers, a0 - a5
                   4096:     ULONG HighIntA1;        // $17:
                   4097:     ULONG HighIntA2;        // $18:
                   4098:     ULONG HighIntA3;        // $19:
                   4099:     ULONG HighIntA4;        // $20:
                   4100:     ULONG HighIntA5;        // $21:
                   4101:     ULONG HighIntT8;        // $22: temporary registers, t8 - t11
                   4102:     ULONG HighIntT9;        // $23:
                   4103:     ULONG HighIntT10;       // $24:
                   4104:     ULONG HighIntT11;       // $25:
                   4105:     ULONG HighIntRa;        // $26: return address register, ra
                   4106:     ULONG HighIntT12;       // $27: temporary register, t12
                   4107:     ULONG HighIntAt;        // $28: assembler temp register, at
                   4108:     ULONG HighIntGp;        // $29: global pointer register, gp
                   4109:     ULONG HighIntSp;        // $30: stack pointer register, sp
                   4110:     ULONG HighIntZero;      // $31: zero register, zero
                   4111: 
                   4112:     ULONG HighFpcr;         // floating point control register
                   4113:     ULONG HighSoftFpcr;     // software extension to FPCR
                   4114:     ULONG HighFir;          // processor status
                   4115: 
                   4116:     double DoNotUseThisField; // to force quadword structure alignment
                   4117:     ULONG HighFill[2];      // padding for 16-byte stack frame alignment
                   4118: 
                   4119: } CONTEXT, *PCONTEXT;
                   4120: 
                   4121: //
                   4122: // These should name the fields in the _PORTABLE_32BIT structure
                   4123: // that overlay the Psr and ContextFlags in the normal structure.
                   4124: //
                   4125: 
                   4126: #define _QUAD_PSR_OFFSET   HighSoftFpcr
                   4127: #define _QUAD_FLAGS_OFFSET HighFir
                   4128: 
                   4129: #endif // _PORTABLE_32BIT_CONTEXT
                   4130: 
                   4131: //
                   4132: // I/O space read and write macros.
                   4133: //
                   4134: //  These have to be actual functions on Alpha, because we need
                   4135: //  to shift the VA and OR in the BYTE ENABLES.
                   4136: //
                   4137: //  These can become INLINEs if we require that ALL Alpha systems shift
                   4138: //  the same number of bits and have the SAME byte enables.
                   4139: //
                   4140: //  The READ/WRITE_REGISTER_* calls manipulate I/O registers in MEMORY space?
                   4141: //
                   4142: //  The READ/WRITE_PORT_* calls manipulate I/O registers in PORT space?
                   4143: //
                   4144: 
                   4145: UCHAR
                   4146: READ_REGISTER_UCHAR(
                   4147:     PUCHAR Register
                   4148:     );
                   4149: 
                   4150: USHORT
                   4151: READ_REGISTER_USHORT(
                   4152:     PUSHORT Register
                   4153:     );
                   4154: 
                   4155: ULONG
                   4156: READ_REGISTER_ULONG(
                   4157:     PULONG Register
                   4158:     );
                   4159: 
                   4160: VOID
                   4161: READ_REGISTER_BUFFER_UCHAR(
                   4162:     PUCHAR  Register,
                   4163:     PUCHAR  Buffer,
                   4164:     ULONG   Count
                   4165:     );
                   4166: 
                   4167: VOID
                   4168: READ_REGISTER_BUFFER_USHORT(
                   4169:     PUSHORT Register,
                   4170:     PUSHORT Buffer,
                   4171:     ULONG   Count
                   4172:     );
                   4173: 
                   4174: VOID
                   4175: READ_REGISTER_BUFFER_ULONG(
                   4176:     PULONG  Register,
                   4177:     PULONG  Buffer,
                   4178:     ULONG   Count
                   4179:     );
                   4180: 
                   4181: 
                   4182: VOID
                   4183: WRITE_REGISTER_UCHAR(
                   4184:     PUCHAR Register,
                   4185:     UCHAR   Value
                   4186:     );
                   4187: 
                   4188: VOID
                   4189: WRITE_REGISTER_USHORT(
                   4190:     PUSHORT Register,
                   4191:     USHORT  Value
                   4192:     );
                   4193: 
                   4194: VOID
                   4195: WRITE_REGISTER_ULONG(
                   4196:     PULONG Register,
                   4197:     ULONG   Value
                   4198:     );
                   4199: 
                   4200: VOID
                   4201: WRITE_REGISTER_BUFFER_UCHAR(
                   4202:     PUCHAR  Register,
                   4203:     PUCHAR  Buffer,
                   4204:     ULONG   Count
                   4205:     );
                   4206: 
                   4207: VOID
                   4208: WRITE_REGISTER_BUFFER_USHORT(
                   4209:     PUSHORT Register,
                   4210:     PUSHORT Buffer,
                   4211:     ULONG   Count
                   4212:     );
                   4213: 
                   4214: VOID
                   4215: WRITE_REGISTER_BUFFER_ULONG(
                   4216:     PULONG  Register,
                   4217:     PULONG  Buffer,
                   4218:     ULONG   Count
                   4219:     );
                   4220: 
                   4221: UCHAR
                   4222: READ_PORT_UCHAR(
                   4223:     PUCHAR Port
                   4224:     );
                   4225: 
                   4226: USHORT
                   4227: READ_PORT_USHORT(
                   4228:     PUSHORT Port
                   4229:     );
                   4230: 
                   4231: ULONG
                   4232: READ_PORT_ULONG(
                   4233:     PULONG  Port
                   4234:     );
                   4235: 
                   4236: VOID
                   4237: READ_PORT_BUFFER_UCHAR(
                   4238:     PUCHAR  Port,
                   4239:     PUCHAR  Buffer,
                   4240:     ULONG   Count
                   4241:     );
                   4242: 
                   4243: VOID
                   4244: READ_PORT_BUFFER_USHORT(
                   4245:     PUSHORT Port,
                   4246:     PUSHORT Buffer,
                   4247:     ULONG   Count
                   4248:     );
                   4249: 
                   4250: VOID
                   4251: READ_PORT_BUFFER_ULONG(
                   4252:     PULONG  Port,
                   4253:     PULONG  Buffer,
                   4254:     ULONG   Count
                   4255:     );
                   4256: 
                   4257: VOID
                   4258: WRITE_PORT_UCHAR(
                   4259:     PUCHAR  Port,
                   4260:     UCHAR   Value
                   4261:     );
                   4262: 
                   4263: VOID
                   4264: WRITE_PORT_USHORT(
                   4265:     PUSHORT Port,
                   4266:     USHORT  Value
                   4267:     );
                   4268: 
                   4269: VOID
                   4270: WRITE_PORT_ULONG(
                   4271:     PULONG  Port,
                   4272:     ULONG   Value
                   4273:     );
                   4274: 
                   4275: VOID
                   4276: WRITE_PORT_BUFFER_UCHAR(
                   4277:     PUCHAR  Port,
                   4278:     PUCHAR  Buffer,
                   4279:     ULONG   Count
                   4280:     );
                   4281: 
                   4282: VOID
                   4283: WRITE_PORT_BUFFER_USHORT(
                   4284:     PUSHORT Port,
                   4285:     PUSHORT Buffer,
                   4286:     ULONG   Count
                   4287:     );
                   4288: 
                   4289: VOID
                   4290: WRITE_PORT_BUFFER_ULONG(
                   4291:     PULONG  Port,
                   4292:     PULONG  Buffer,
                   4293:     ULONG   Count
                   4294:     );
                   4295: 
                   4296: #endif // _ALPHA_               // ntddk nthal
                   4297: 
                   4298: // begin_winnt
                   4299: //
                   4300: // Predefined Value Types.
                   4301: //
                   4302: 
                   4303: #define REG_NONE                    ( 0 )   // No value type
                   4304: #define REG_SZ                      ( 1 )   // Unicode nul terminated string
                   4305: #define REG_EXPAND_SZ               ( 2 )   // Unicode nul terminated string
                   4306:                                             // (with environment variable references)
                   4307: #define REG_BINARY                  ( 3 )   // Free form binary
                   4308: #define REG_DWORD                   ( 4 )   // 32-bit number
                   4309: #define REG_DWORD_LITTLE_ENDIAN     ( 4 )   // 32-bit number (same as REG_DWORD)
                   4310: #define REG_DWORD_BIG_ENDIAN        ( 5 )   // 32-bit number
                   4311: #define REG_LINK                    ( 6 )   // Symbolic Link (unicode)
                   4312: #define REG_MULTI_SZ                ( 7 )   // Multiple Unicode strings
                   4313: #define REG_RESOURCE_LIST           ( 8 )   // Resource list in the resource map
                   4314: #define REG_FULL_RESOURCE_DESCRIPTOR ( 9 )  // Resource list in the hardware description
                   4315: 
                   4316: //
                   4317: // Service Types (Bit Mask)
                   4318: //
                   4319: #define SERVICE_KERNEL_DRIVER          0x00000001
                   4320: #define SERVICE_FILE_SYSTEM_DRIVER     0x00000002
                   4321: #define SERVICE_ADAPTER                0x00000004
                   4322: #define SERVICE_RECOGNIZER_DRIVER      0x00000008
                   4323: 
                   4324: #define SERVICE_DRIVER                 (SERVICE_KERNEL_DRIVER | \
                   4325:                                         SERVICE_FILE_SYSTEM_DRIVER | \
                   4326:                                         SERVICE_RECOGNIZER_DRIVER)
                   4327: 
                   4328: #define SERVICE_WIN32_OWN_PROCESS      0x00000010
                   4329: #define SERVICE_WIN32_SHARE_PROCESS    0x00000020
                   4330: #define SERVICE_WIN32                  (SERVICE_WIN32_OWN_PROCESS | \
                   4331:                                         SERVICE_WIN32_SHARE_PROCESS)
                   4332: 
                   4333: #define SERVICE_TYPE_ALL               (SERVICE_WIN32  | \
                   4334:                                         SERVICE_ADAPTER | \
                   4335:                                         SERVICE_DRIVER)
                   4336: 
                   4337: //
                   4338: // Start Type
                   4339: //
                   4340: 
                   4341: #define SERVICE_BOOT_START             0x00000000
                   4342: #define SERVICE_SYSTEM_START           0x00000001
                   4343: #define SERVICE_AUTO_START             0x00000002
                   4344: #define SERVICE_DEMAND_START           0x00000003
                   4345: #define SERVICE_DISABLED               0x00000004
                   4346: 
                   4347: //
                   4348: // Error control type
                   4349: //
                   4350: #define SERVICE_ERROR_IGNORE           0x00000000
                   4351: #define SERVICE_ERROR_NORMAL           0x00000001
                   4352: #define SERVICE_ERROR_SEVERE           0x00000002
                   4353: #define SERVICE_ERROR_CRITICAL         0x00000003
                   4354: 
                   4355: //
                   4356: //
                   4357: // Define the registry driver node enumerations
                   4358: //
                   4359: 
                   4360: typedef enum _CM_SERVICE_NODE_TYPE {
                   4361:     DriverType               = SERVICE_KERNEL_DRIVER,
                   4362:     FileSystemType           = SERVICE_FILE_SYSTEM_DRIVER,
                   4363:     Win32ServiceOwnProcess   = SERVICE_WIN32_OWN_PROCESS,
                   4364:     Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
                   4365:     AdapterType              = SERVICE_ADAPTER,
                   4366:     RecognizerType           = SERVICE_RECOGNIZER_DRIVER
                   4367: } SERVICE_NODE_TYPE;
                   4368: 
                   4369: typedef enum _CM_SERVICE_LOAD_TYPE {
                   4370:     BootLoad    = SERVICE_BOOT_START,
                   4371:     SystemLoad  = SERVICE_SYSTEM_START,
                   4372:     AutoLoad    = SERVICE_AUTO_START,
                   4373:     DemandLoad  = SERVICE_DEMAND_START,
                   4374:     DisableLoad = SERVICE_DISABLED
                   4375: } SERVICE_LOAD_TYPE;
                   4376: 
                   4377: typedef enum _CM_ERROR_CONTROL_TYPE {
                   4378:     IgnoreError   = SERVICE_ERROR_IGNORE,
                   4379:     NormalError   = SERVICE_ERROR_NORMAL,
                   4380:     SevereError   = SERVICE_ERROR_SEVERE,
                   4381:     CriticalError = SERVICE_ERROR_CRITICAL
                   4382: } SERVICE_ERROR_TYPE;
                   4383: 
                   4384: // end_winnt
                   4385: 
                   4386: //
                   4387: // Resource List definitions
                   4388: //
                   4389: 
                   4390: //
                   4391: // Defines the Type in the RESOURCE_DESCRIPTOR
                   4392: //
                   4393: 
                   4394: typedef enum _CM_RESOURCE_TYPE {
                   4395:     CmResourceTypeNull = 0,    // Reserved
                   4396:     CmResourceTypePort,
                   4397:     CmResourceTypeInterrupt,
                   4398:     CmResourceTypeMemory,
                   4399:     CmResourceTypeDma,
                   4400:     CmResourceTypeDeviceSpecific
                   4401: } CM_RESOURCE_TYPE;
                   4402: 
                   4403: //
                   4404: // Defines the ShareDisposition in the RESOURCE_DESCRIPTOR
                   4405: //
                   4406: 
                   4407: typedef enum _CM_SHARE_DISPOSITION {
                   4408:     CmResourceShareUndetermined = 0,    // Reserved
                   4409:     CmResourceShareDeviceExclusive,
                   4410:     CmResourceShareDriverExclusive,
                   4411:     CmResourceShareShared
                   4412: } CM_SHARE_DISPOSITION;
                   4413: 
                   4414: //
                   4415: // Define the bit masks for Flags when type is CmResourceTypeInterrupt
                   4416: //
                   4417: 
                   4418: #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0
                   4419: #define CM_RESOURCE_INTERRUPT_LATCHED         1
                   4420: 
                   4421: //
                   4422: // Define the bit masks for Flags when type is CmResourceTypeInterrupt
                   4423: //
                   4424: 
                   4425: #define CM_RESOURCE_MEMORY_READ_WRITE 0
                   4426: #define CM_RESOURCE_MEMORY_READ_ONLY  1
                   4427: #define CM_RESOURCE_MEMORY_WRITE_ONLY 2
                   4428: 
                   4429: //
                   4430: // Define the bit masks for Flags when type is CmResourceTypePort
                   4431: //
                   4432: 
                   4433: #define CM_RESOURCE_PORT_MEMORY 0
                   4434: #define CM_RESOURCE_PORT_IO 1
                   4435: 
                   4436: //
                   4437: // This structure defines one type of resource used by a driver.
                   4438: //
                   4439: // There can only be *1* DeviceSpecificData block. It must be located at
                   4440: // the end of all resource descriptors in a full descriptor block.
                   4441: //
                   4442: 
                   4443: //
                   4444: // BUGBUG Make sure alignment is made properly by compiler; otherwise move
                   4445: // flags back to the top of the structure (common to all members of the
                   4446: // union).
                   4447: //
                   4448: 
                   4449: #pragma pack(4)
                   4450: typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
                   4451:     UCHAR Type;
                   4452:     UCHAR ShareDisposition;
                   4453:     USHORT Flags;
                   4454:     union {
                   4455: 
                   4456:         //
                   4457:         // Range of port numbers, inclusive. These are physical, bus
                   4458:         // relative. The value should be the same as the one passed to
                   4459:         // HalTranslateBusAddress().
                   4460:         //
                   4461: 
                   4462:         struct {
                   4463:             PHYSICAL_ADDRESS Start;
                   4464:             ULONG Length;
                   4465:         } Port;
                   4466: 
                   4467:         //
                   4468:         // IRQL and vector. Should be same values as were passed to
                   4469:         // HalGetInterruptVector().
                   4470:         //
                   4471: 
                   4472:         struct {
                   4473:             ULONG Level;
                   4474:             ULONG Vector;
                   4475:             ULONG Affinity;
                   4476:         } Interrupt;
                   4477: 
                   4478:         //
                   4479:         // Range of memory addresses, inclusive. These are physical, bus
                   4480:         // relative. The value should be the same as the one passed to
                   4481:         // HalTranslateBusAddress().
                   4482:         //
                   4483: 
                   4484:         struct {
                   4485:             PHYSICAL_ADDRESS Start;    // 64 bit physical addresses.
                   4486:             ULONG Length;
                   4487:         } Memory;
                   4488: 
                   4489:         //
                   4490:         // Physical DMA channel.
                   4491:         //
                   4492: 
                   4493:         struct {
                   4494:             ULONG Channel;
                   4495:             ULONG Port;
                   4496:             ULONG Reserved1;
                   4497:         } Dma;
                   4498: 
                   4499:         //
                   4500:         // Device Specific information defined by the driver.
                   4501:         // The DataSize field indicates the size of the data in bytes. The
                   4502:         // data is located immediately after the DeviceSpecificData field in
                   4503:         // the structure.
                   4504:         //
                   4505: 
                   4506:         struct {
                   4507:             ULONG DataSize;
                   4508:             ULONG Reserved1;
                   4509:             ULONG Reserved2;
                   4510:         } DeviceSpecificData;
                   4511:     } u;
                   4512: } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
                   4513: #pragma pack()
                   4514: 
                   4515: //
                   4516: // A Partial Resource List is what can be found in the ARC firmware
                   4517: // or will be generated by ntdetect.com.
                   4518: // The configuration manager will transform this structure into a Full
                   4519: // resource descriptor when it is about to store it in the regsitry.
                   4520: //
                   4521: // Note: There must a be a convention to the order of fields of same type,
                   4522: // (defined on a device by device basis) so that the fields can make sense
                   4523: // to a driver (i.e. when multiple memory ranges are necessary).
                   4524: //
                   4525: 
                   4526: typedef struct _CM_PARTIAL_RESOURCE_LIST {
                   4527:     USHORT Version;
                   4528:     USHORT Revision;
                   4529:     ULONG Count;
                   4530:     CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
                   4531: } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
                   4532: 
                   4533: //
                   4534: // A Full Resource Descriptor is what can be found in the registry.
                   4535: // This is what will be returned to a driver when it queries the registry
                   4536: // to get device information; it will be stored under a key in the hardware
                   4537: // description tree.
                   4538: //
                   4539: // Note: The BusNumber and Type are redundant information, but we will keep
                   4540: // it since it allows the driver _not_ to append it when it is creating
                   4541: // a resource list which could possibly span multiple buses.
                   4542: //
                   4543: // Note2: There must a be a convention to the order of fields of same type,
                   4544: // (defined on a device by device basis) so that the fields can make sense
                   4545: // to a driver (i.e. when multiple memory ranges are necessary).
                   4546: //
                   4547: 
                   4548: typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
                   4549:     INTERFACE_TYPE InterfaceType;
                   4550:     ULONG BusNumber;
                   4551:     CM_PARTIAL_RESOURCE_LIST PartialResourceList;
                   4552: } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
                   4553: 
                   4554: //
                   4555: // The Resource list is what will be stored by the drivers into the
                   4556: // resource map via the IO API.
                   4557: //
                   4558: 
                   4559: typedef struct _CM_RESOURCE_LIST {
                   4560:     ULONG Count;
                   4561:     CM_FULL_RESOURCE_DESCRIPTOR List[1];
                   4562: } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
                   4563: 
                   4564: //
                   4565: // Define the structures used to interpret configuration data of
                   4566: // \\Registry\machine\hardware\description tree.
                   4567: // Basically, these structures are used to interpret component
                   4568: // sepcific data.
                   4569: //
                   4570: 
                   4571: //
                   4572: // Define DEVICE_FLAGS
                   4573: //
                   4574: 
                   4575: typedef struct _DEVICE_FLAGS {
                   4576:     ULONG Failed : 1;
                   4577:     ULONG ReadOnly : 1;
                   4578:     ULONG Removable : 1;
                   4579:     ULONG ConsoleIn : 1;
                   4580:     ULONG ConsoleOut : 1;
                   4581:     ULONG Input : 1;
                   4582:     ULONG Output : 1;
                   4583: } DEVICE_FLAGS, *PDEVICE_FLAGS;
                   4584: 
                   4585: //
                   4586: // Define Component Information structure
                   4587: //
                   4588: 
                   4589: typedef struct _CM_COMPONENT_INFORMATION {
                   4590:     DEVICE_FLAGS Flags;
                   4591:     ULONG Version;
                   4592:     ULONG Key;
                   4593:     ULONG AffinityMask;
                   4594: } CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION;
                   4595: 
                   4596: //
                   4597: // The following structures are used to interpret x86
                   4598: // DeviceSpecificData of CM_PARTIAL_RESOURCE_DESCRIPTOR.
                   4599: // (Most of the structures are defined by BIOS.  They are
                   4600: // not aligned on word (or dword) boundary.
                   4601: //
                   4602: 
                   4603: //
                   4604: // Define the Rom Block structure
                   4605: //
                   4606: 
                   4607: typedef struct _CM_ROM_BLOCK {
                   4608:     ULONG Address;
                   4609:     ULONG Size;
                   4610: } CM_ROM_BLOCK, *PCM_ROM_BLOCK;
                   4611: 
                   4612: // begin_ntminiport
                   4613: 
                   4614: #pragma pack(1)
                   4615: 
                   4616: // end_ntminiport
                   4617: 
                   4618: //
                   4619: // Define INT13 driver parameter block
                   4620: //
                   4621: 
                   4622: typedef struct _CM_INT13_DRIVE_PARAMETER {
                   4623:     USHORT DriveSelect;
                   4624:     ULONG MaxCylinders;
                   4625:     USHORT SectorsPerTrack;
                   4626:     USHORT MaxHeads;
                   4627:     USHORT NumberDrives;
                   4628: } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
                   4629: 
                   4630: // begin_ntminiport
                   4631: 
                   4632: //
                   4633: // Define Mca POS data block for slot
                   4634: //
                   4635: 
                   4636: typedef struct _CM_MCA_POS_DATA {
                   4637:     USHORT AdapterId;
                   4638:     UCHAR PosData1;
                   4639:     UCHAR PosData2;
                   4640:     UCHAR PosData3;
                   4641:     UCHAR PosData4;
                   4642: } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
                   4643: 
                   4644: //
                   4645: // Memory configuration of eisa data block structure
                   4646: //
                   4647: 
                   4648: typedef struct _EISA_MEMORY_TYPE {
                   4649:     UCHAR ReadWrite: 1;
                   4650:     UCHAR Cached : 1;
                   4651:     UCHAR Reserved0 :1;
                   4652:     UCHAR Type:2;
                   4653:     UCHAR Shared:1;
                   4654:     UCHAR Reserved1 :1;
                   4655:     UCHAR MoreEntries : 1;
                   4656: } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
                   4657: 
                   4658: typedef struct _EISA_MEMORY_CONFIGURATION {
                   4659:     EISA_MEMORY_TYPE ConfigurationByte;
                   4660:     UCHAR DataSize;
                   4661:     USHORT AddressLowWord;
                   4662:     UCHAR AddressHighByte;
                   4663:     USHORT MemorySize;
                   4664: } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
                   4665: 
                   4666: 
                   4667: //
                   4668: // Interrupt configurationn of eisa data block structure
                   4669: //
                   4670: 
                   4671: typedef struct _EISA_IRQ_DESCRIPTOR {
                   4672:     UCHAR Interrupt : 4;
                   4673:     UCHAR Reserved :1;
                   4674:     UCHAR LevelTriggered :1;
                   4675:     UCHAR Shared : 1;
                   4676:     UCHAR MoreEntries : 1;
                   4677: } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
                   4678: 
                   4679: typedef struct _EISA_IRQ_CONFIGURATION {
                   4680:     EISA_IRQ_DESCRIPTOR ConfigurationByte;
                   4681:     UCHAR Reserved;
                   4682: } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
                   4683: 
                   4684: 
                   4685: //
                   4686: // DMA description of eisa data block structure
                   4687: //
                   4688: 
                   4689: typedef struct _DMA_CONFIGURATION_BYTE0 {
                   4690:     UCHAR Channel : 3;
                   4691:     UCHAR Reserved : 3;
                   4692:     UCHAR Shared :1;
                   4693:     UCHAR MoreEntries :1;
                   4694: } DMA_CONFIGURATION_BYTE0;
                   4695: 
                   4696: typedef struct _DMA_CONFIGURATION_BYTE1 {
                   4697:     UCHAR Reserved0 : 2;
                   4698:     UCHAR TransferSize : 2;
                   4699:     UCHAR Timing : 2;
                   4700:     UCHAR Reserved1 : 2;
                   4701: } DMA_CONFIGURATION_BYTE1;
                   4702: 
                   4703: typedef struct _EISA_DMA_CONFIGURATION {
                   4704:     DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
                   4705:     DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
                   4706: } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
                   4707: 
                   4708: 
                   4709: //
                   4710: // Port description of eisa data block structure
                   4711: //
                   4712: 
                   4713: typedef struct _EISA_PORT_DESCRIPTOR {
                   4714:     UCHAR NumberPorts : 5;
                   4715:     UCHAR Reserved :1;
                   4716:     UCHAR Shared :1;
                   4717:     UCHAR MoreEntries : 1;
                   4718: } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
                   4719: 
                   4720: typedef struct _EISA_PORT_CONFIGURATION {
                   4721:     EISA_PORT_DESCRIPTOR Configuration;
                   4722:     USHORT PortAddress;
                   4723: } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
                   4724: 
                   4725: 
                   4726: //
                   4727: // Eisa slot information definition
                   4728: // N.B. This structure is different from the one defined
                   4729: //      in ARC eisa addendum.
                   4730: //
                   4731: 
                   4732: typedef struct _CM_EISA_SLOT_INFORMATION {
                   4733:     UCHAR ReturnCode;
                   4734:     UCHAR ReturnFlags;
                   4735:     UCHAR MajorRevision;
                   4736:     UCHAR MinorRevision;
                   4737:     USHORT Checksum;
                   4738:     UCHAR NumberFunctions;
                   4739:     UCHAR FunctionInformation;
                   4740:     ULONG CompressedId;
                   4741: } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
                   4742: 
                   4743: 
                   4744: //
                   4745: // Eisa function information definition
                   4746: //
                   4747: 
                   4748: typedef struct _CM_EISA_FUNCTION_INFORMATION {
                   4749:     ULONG CompressedId;
                   4750:     UCHAR IdSlotFlags1;
                   4751:     UCHAR IdSlotFlags2;
                   4752:     UCHAR MinorRevision;
                   4753:     UCHAR MajorRevision;
                   4754:     UCHAR Selections[26];
                   4755:     UCHAR FunctionFlags;
                   4756:     UCHAR TypeString[80];
                   4757:     EISA_MEMORY_CONFIGURATION EisaMemory[9];
                   4758:     EISA_IRQ_CONFIGURATION EisaIrq[7];
                   4759:     EISA_DMA_CONFIGURATION EisaDma[4];
                   4760:     EISA_PORT_CONFIGURATION EisaPort[20];
                   4761:     UCHAR InitializationData[60];
                   4762: } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
                   4763: 
                   4764: #pragma pack()
                   4765: 
                   4766: //
                   4767: // Masks for EISA function information
                   4768: //
                   4769: 
                   4770: #define EISA_FUNCTION_ENABLED                   0x80
                   4771: #define EISA_FREE_FORM_DATA                     0x40
                   4772: #define EISA_HAS_PORT_INIT_ENTRY                0x20
                   4773: #define EISA_HAS_PORT_RANGE                     0x10
                   4774: #define EISA_HAS_DMA_ENTRY                      0x08
                   4775: #define EISA_HAS_IRQ_ENTRY                      0x04
                   4776: #define EISA_HAS_MEMORY_ENTRY                   0x02
                   4777: #define EISA_HAS_TYPE_ENTRY                     0x01
                   4778: #define EISA_HAS_INFORMATION                    EISA_HAS_PORT_RANGE + \
                   4779:                                                 EISA_HAS_DMA_ENTRY + \
                   4780:                                                 EISA_HAS_IRQ_ENTRY + \
                   4781:                                                 EISA_HAS_MEMORY_ENTRY + \
                   4782:                                                 EISA_HAS_TYPE_ENTRY
                   4783: 
                   4784: //
                   4785: // Masks for EISA memory configuration
                   4786: //
                   4787: 
                   4788: #define EISA_MORE_ENTRIES                       0x80
                   4789: #define EISA_SYSTEM_MEMORY                      0x00
                   4790: #define EISA_MEMORY_TYPE_RAM                    0x01
                   4791: 
                   4792: //
                   4793: // Returned error code for EISA bios call
                   4794: //
                   4795: 
                   4796: #define EISA_INVALID_SLOT                       0x80
                   4797: #define EISA_INVALID_FUNCTION                   0x81
                   4798: #define EISA_INVALID_CONFIGURATION              0x82
                   4799: #define EISA_EMPTY_SLOT                         0x83
                   4800: #define EISA_INVALID_BIOS_CALL                  0x86
                   4801: 
                   4802: // end_ntminiport
                   4803: 
                   4804: //
                   4805: // The following structures are used to interpret mips
                   4806: // DeviceSpecificData of CM_PARTIAL_RESOURCE_DESCRIPTOR.
                   4807: //
                   4808: 
                   4809: //
                   4810: // Device data records for adapters.
                   4811: //
                   4812: 
                   4813: //
                   4814: // The device data record for the Emulex SCSI controller.
                   4815: //
                   4816: 
                   4817: typedef struct _CM_SCSI_DEVICE_DATA {
                   4818:     USHORT Version;
                   4819:     USHORT Revision;
                   4820:     UCHAR HostIdentifier;
                   4821: } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
                   4822: 
                   4823: //
                   4824: // Device data records for controllers.
                   4825: //
                   4826: 
                   4827: //
                   4828: // The device data record for the Video controller.
                   4829: //
                   4830: 
                   4831: typedef struct _CM_VIDEO_DEVICE_DATA {
                   4832:     USHORT Version;
                   4833:     USHORT Revision;
                   4834:     ULONG VideoClock;
                   4835: } CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA;
                   4836: 
                   4837: //
                   4838: // The device data record for the SONIC network controller.
                   4839: //
                   4840: 
                   4841: typedef struct _CM_SONIC_DEVICE_DATA {
                   4842:     USHORT Version;
                   4843:     USHORT Revision;
                   4844:     USHORT DataConfigurationRegister;
                   4845:     UCHAR EthernetAddress[8];
                   4846: } CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA;
                   4847: 
                   4848: //
                   4849: // The device data record for the serial controller.
                   4850: //
                   4851: 
                   4852: typedef struct _CM_SERIAL_DEVICE_DATA {
                   4853:     USHORT Version;
                   4854:     USHORT Revision;
                   4855:     ULONG BaudClock;
                   4856: } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
                   4857: 
                   4858: //
                   4859: // Device data records for peripherals.
                   4860: //
                   4861: 
                   4862: //
                   4863: // The device data record for the Monitor peripheral.
                   4864: //
                   4865: 
                   4866: typedef struct _CM_MONITOR_DEVICE_DATA {
                   4867:     USHORT Version;
                   4868:     USHORT Revision;
                   4869:     USHORT HorizontalScreenSize;
                   4870:     USHORT VerticalScreenSize;
                   4871:     USHORT HorizontalResolution;
                   4872:     USHORT VerticalResolution;
                   4873:     USHORT HorizontalDisplayTimeLow;
                   4874:     USHORT HorizontalDisplayTime;
                   4875:     USHORT HorizontalDisplayTimeHigh;
                   4876:     USHORT HorizontalBackPorchLow;
                   4877:     USHORT HorizontalBackPorch;
                   4878:     USHORT HorizontalBackPorchHigh;
                   4879:     USHORT HorizontalFrontPorchLow;
                   4880:     USHORT HorizontalFrontPorch;
                   4881:     USHORT HorizontalFrontPorchHigh;
                   4882:     USHORT HorizontalSyncLow;
                   4883:     USHORT HorizontalSync;
                   4884:     USHORT HorizontalSyncHigh;
                   4885:     USHORT VerticalBackPorchLow;
                   4886:     USHORT VerticalBackPorch;
                   4887:     USHORT VerticalBackPorchHigh;
                   4888:     USHORT VerticalFrontPorchLow;
                   4889:     USHORT VerticalFrontPorch;
                   4890:     USHORT VerticalFrontPorchHigh;
                   4891:     USHORT VerticalSyncLow;
                   4892:     USHORT VerticalSync;
                   4893:     USHORT VerticalSyncHigh;
                   4894: } CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA;
                   4895: 
                   4896: //
                   4897: // The device data record for the Floppy peripheral.
                   4898: //
                   4899: 
                   4900: typedef struct _CM_FLOPPY_DEVICE_DATA {
                   4901:     USHORT Version;
                   4902:     USHORT Revision;
                   4903:     CHAR Size[8];
                   4904:     ULONG MaxDensity;
                   4905:     ULONG MountDensity;
                   4906:     //
                   4907:     // New data fields for version >= 2.0
                   4908:     //
                   4909:     UCHAR StepRateHeadUnloadTime;
                   4910:     UCHAR HeadLoadTime;
                   4911:     UCHAR MotorOffTime;
                   4912:     UCHAR SectorLengthCode;
                   4913:     UCHAR SectorPerTrack;
                   4914:     UCHAR ReadWriteGapLength;
                   4915:     UCHAR DataTransferLength;
                   4916:     UCHAR FormatGapLength;
                   4917:     UCHAR FormatFillCharacter;
                   4918:     UCHAR HeadSettleTime;
                   4919:     UCHAR MotorSettleTime;
                   4920:     UCHAR MaximumTrackValue;
                   4921:     UCHAR DataTransferRate;
                   4922: } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
                   4923: 
                   4924: //
                   4925: // The device data record for the Keyboard peripheral.
                   4926: // The KeyboardFlags is defined (by x86 BIOS INT 16h, function 02) as:
                   4927: //      bit 7 : Insert on
                   4928: //      bit 6 : Caps Lock on
                   4929: //      bit 5 : Num Lock on
                   4930: //      bit 4 : Scroll Lock on
                   4931: //      bit 3 : Alt Key is down
                   4932: //      bit 2 : Ctrl Key is down
                   4933: //      bit 1 : Left shift key is down
                   4934: //      bit 0 : Right shift key is down
                   4935: //
                   4936: 
                   4937: typedef struct _CM_KEYBOARD_DEVICE_DATA {
                   4938:     USHORT Version;
                   4939:     USHORT Revision;
                   4940:     UCHAR Type;
                   4941:     UCHAR Subtype;
                   4942:     USHORT KeyboardFlags;
                   4943: } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
                   4944: 
                   4945: //
                   4946: // Declaration of the structure for disk geometries
                   4947: //
                   4948: 
                   4949: typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
                   4950:     ULONG BytesPerSector;
                   4951:     ULONG NumberOfCylinders;
                   4952:     ULONG SectorsPerTrack;
                   4953:     ULONG NumberOfHeads;
                   4954: } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
                   4955: 
                   4956: //
                   4957: // Exception flag definitions.
                   4958: //
                   4959: 
                   4960: // begin_winnt
                   4961: #define EXCEPTION_NONCONTINUABLE 0x1    // Noncontinuable exception
                   4962: // end_winnt
                   4963: 
                   4964: //
                   4965: // Define maximum number of exception parameters.
                   4966: //
                   4967: 
                   4968: // begin_winnt
                   4969: #define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters
                   4970: 
                   4971: //
                   4972: // Exception record definition.
                   4973: //
                   4974: 
                   4975: typedef struct _EXCEPTION_RECORD {
                   4976:     /*lint -e18 */  // Don't complain about different definitions
                   4977:     NTSTATUS ExceptionCode;
                   4978:     /*lint +e18 */  // Resume checking for different definitions
                   4979:     ULONG ExceptionFlags;
                   4980:     struct _EXCEPTION_RECORD *ExceptionRecord;
                   4981:     PVOID ExceptionAddress;
                   4982:     ULONG NumberParameters;
                   4983:     ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
                   4984:     } EXCEPTION_RECORD;
                   4985: 
                   4986: typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
                   4987: 
                   4988: //
                   4989: // Typedef for pointer returned by exception_info()
                   4990: //
                   4991: 
                   4992: typedef struct _EXCEPTION_POINTERS {
                   4993:     PEXCEPTION_RECORD ExceptionRecord;
                   4994:     PCONTEXT ContextRecord;
                   4995: } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
                   4996: // end_winnt
                   4997: 
                   4998: //
                   4999: // Define configuration routine types.
                   5000: //
                   5001: // Configuration information.
                   5002: //
                   5003: 
                   5004: typedef enum _CONFIGURATION_TYPE {
                   5005:     ArcSystem,
                   5006:     CentralProcessor,
                   5007:     FloatingPointProcessor,
                   5008:     PrimaryIcache,
                   5009:     PrimaryDcache,
                   5010:     SecondaryIcache,
                   5011:     SecondaryDcache,
                   5012:     SecondaryCache,
                   5013:     EisaAdapter,
                   5014:     TcAdapter,
                   5015:     ScsiAdapter,
                   5016:     DtiAdapter,
                   5017:     MultiFunctionAdapter,
                   5018:     DiskController,
                   5019:     TapeController,
                   5020:     CdromController,
                   5021:     WormController,
                   5022:     SerialController,
                   5023:     NetworkController,
                   5024:     DisplayController,
                   5025:     ParallelController,
                   5026:     PointerController,
                   5027:     KeyboardController,
                   5028:     AudioController,
                   5029:     OtherController,
                   5030:     DiskPeripheral,
                   5031:     FloppyDiskPeripheral,
                   5032:     TapePeripheral,
                   5033:     ModemPeripheral,
                   5034:     MonitorPeripheral,
                   5035:     PrinterPeripheral,
                   5036:     PointerPeripheral,
                   5037:     KeyboardPeripheral,
                   5038:     TerminalPeripheral,
                   5039:     OtherPeripheral,
                   5040:     LinePeripheral,
                   5041:     NetworkPeripheral,
                   5042:     SystemMemory,
                   5043:     MaximumType
                   5044: } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
                   5045: 
                   5046: 
                   5047: //
                   5048: // Interrupt modes.
                   5049: //
                   5050: 
                   5051: typedef enum _KINTERRUPT_MODE {
                   5052:     LevelSensitive,
                   5053:     Latched
                   5054:     } KINTERRUPT_MODE;
                   5055: 
                   5056: //
                   5057: // Wait reasons
                   5058: //
                   5059: 
                   5060: typedef enum _KWAIT_REASON {
                   5061:     Executive,
                   5062:     FreePage,
                   5063:     PageIn,
                   5064:     PoolAllocation,
                   5065:     DelayExecution,
                   5066:     Suspended,
                   5067:     UserRequest,
                   5068:     WrExecutive,
                   5069:     WrFreePage,
                   5070:     WrPageIn,
                   5071:     WrPoolAllocation,
                   5072:     WrDelayExecution,
                   5073:     WrSuspended,
                   5074:     WrUserRequest,
                   5075:     WrEventPairHigh,
                   5076:     WrEventPairLow,
                   5077:     WrLpcReceive,
                   5078:     WrLpcReply,
                   5079:     WrVirtualMemory,
                   5080:     WrPageOut,
                   5081:     Spare1,
                   5082:     Spare2,
                   5083:     Spare3,
                   5084:     Spare4,
                   5085:     Spare5,
                   5086:     Spare6,
                   5087:     WrKernel,
                   5088:     MaximumWaitReason
                   5089:     } KWAIT_REASON;
                   5090: 
                   5091: //
                   5092: // Common dispatcher object header
                   5093: //
                   5094: 
                   5095: typedef struct _DISPATCHER_HEADER {
                   5096:     CSHORT Type;
                   5097:     CSHORT Size;
                   5098:     LONG SignalState;
                   5099:     LIST_ENTRY WaitListHead;
                   5100: } DISPATCHER_HEADER;
                   5101: 
                   5102: //
                   5103: // Wait block
                   5104: //
                   5105: 
                   5106: typedef struct _KWAIT_BLOCK {
                   5107:     LIST_ENTRY WaitListEntry;
                   5108:     struct _KTHREAD *Thread;
                   5109:     PVOID Object;
                   5110:     struct _KWAIT_BLOCK *NextWaitBlock;
                   5111:     CSHORT WaitKey;
                   5112:     WAIT_TYPE WaitType;
                   5113: } KWAIT_BLOCK, *PKWAIT_BLOCK;
                   5114: 
                   5115: //
                   5116: // Thread start function
                   5117: //
                   5118: 
                   5119: typedef
                   5120: VOID
                   5121: (*PKSTART_ROUTINE) (
                   5122:     IN PVOID StartContext
                   5123:     );
                   5124: 
                   5125: //
                   5126: // Kernel object structure definitions
                   5127: //
                   5128: 
                   5129: //
                   5130: // Device Queue object and entry
                   5131: //
                   5132: 
                   5133: typedef struct _KDEVICE_QUEUE {
                   5134:     CSHORT Type;
                   5135:     CSHORT Size;
                   5136:     LIST_ENTRY DeviceListHead;
                   5137:     KSPIN_LOCK Lock;
                   5138:     BOOLEAN Busy;
                   5139: } KDEVICE_QUEUE, *PKDEVICE_QUEUE;
                   5140: 
                   5141: typedef struct _KDEVICE_QUEUE_ENTRY {
                   5142:     LIST_ENTRY DeviceListEntry;
                   5143:     ULONG SortKey;
                   5144:     BOOLEAN Inserted;
                   5145: } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY;
                   5146: 
                   5147: //
                   5148: // Event object
                   5149: //
                   5150: 
                   5151: typedef struct _KEVENT {
                   5152:     DISPATCHER_HEADER Header;
                   5153: } KEVENT, *PKEVENT;
                   5154: 
                   5155: //
                   5156: // Define the interrupt service function type and the empty struct
                   5157: // type.
                   5158: //
                   5159: typedef
                   5160: BOOLEAN
                   5161: (*PKSERVICE_ROUTINE) (
                   5162:     IN struct _KINTERRUPT *Interrupt,
                   5163:     IN PVOID ServiceContext
                   5164:     );
                   5165: //
                   5166: // Mutex object
                   5167: //
                   5168: 
                   5169: typedef struct _KMUTEX {
                   5170:     DISPATCHER_HEADER Header;
                   5171:     LIST_ENTRY MutexListEntry;
                   5172:     struct _KTHREAD *OwnerThread;
                   5173:     ULONG Level;
                   5174: } KMUTEX;
                   5175: 
                   5176: typedef KMUTEX *PKMUTEX;
                   5177: 
                   5178: //
                   5179: // Power notify object
                   5180: //
                   5181: 
                   5182: typedef struct _KPOWER_NOTIFY {
                   5183:     CSHORT Type;
                   5184:     CSHORT Size;
                   5185:     LIST_ENTRY NotifyListEntry;
                   5186:     PKNOTIFY_ROUTINE NotifyRoutine;
                   5187:     PVOID NotifyContext;
                   5188:     BOOLEAN Inserted;
                   5189: } KPOWER_NOTIFY;
                   5190: 
                   5191: typedef KPOWER_NOTIFY *PKPOWER_NOTIFY;
                   5192: 
                   5193: //
                   5194: // Power status object
                   5195: //
                   5196: 
                   5197: typedef struct _KPOWER_STATUS {
                   5198:     CSHORT Type;
                   5199:     CSHORT Size;
                   5200:     LIST_ENTRY StatusListEntry;
                   5201:     PBOOLEAN Status;
                   5202:     BOOLEAN Inserted;
                   5203: } KPOWER_STATUS;
                   5204: 
                   5205: typedef KPOWER_STATUS *PKPOWER_STATUS;
                   5206: 
                   5207: //
                   5208: // Semaphore object
                   5209: //
                   5210: 
                   5211: typedef struct _KSEMAPHORE {
                   5212:     DISPATCHER_HEADER Header;
                   5213:     LONG Limit;
                   5214: } KSEMAPHORE;
                   5215: 
                   5216: typedef KSEMAPHORE *PKSEMAPHORE;
                   5217: 
                   5218: //
                   5219: // Timer object
                   5220: //
                   5221: 
                   5222: typedef struct _KTIMER {
                   5223:     DISPATCHER_HEADER Header;
                   5224:     ULARGE_INTEGER DueTime;
                   5225:     LIST_ENTRY TimerListEntry;
                   5226:     struct _KDPC *Dpc;
                   5227:     BOOLEAN Inserted;
                   5228: } KTIMER;
                   5229: 
                   5230: typedef KTIMER *PKTIMER;
                   5231: 
                   5232: //
                   5233: // DPC object
                   5234: //
                   5235: 
                   5236: VOID
                   5237: KeInitializeDpc (
                   5238:     IN PKDPC Dpc,
                   5239:     IN PKDEFERRED_ROUTINE DeferredRoutine,
                   5240:     IN PVOID DeferredContext
                   5241:     );
                   5242: 
                   5243: BOOLEAN
                   5244: KeInsertQueueDpc (
                   5245:     IN PKDPC Dpc,
                   5246:     IN PVOID SystemArgument1,
                   5247:     IN PVOID SystemArgument2
                   5248:     );
                   5249: 
                   5250: BOOLEAN
                   5251: KeRemoveQueueDpc (
                   5252:     IN PKDPC Dpc
                   5253:     );
                   5254: 
                   5255: //
                   5256: // Device queue object
                   5257: //
                   5258: 
                   5259: VOID
                   5260: KeInitializeDeviceQueue (
                   5261:     IN PKDEVICE_QUEUE DeviceQueue
                   5262:     );
                   5263: 
                   5264: BOOLEAN
                   5265: KeInsertDeviceQueue (
                   5266:     IN PKDEVICE_QUEUE DeviceQueue,
                   5267:     IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
                   5268:     );
                   5269: 
                   5270: BOOLEAN
                   5271: KeInsertByKeyDeviceQueue (
                   5272:     IN PKDEVICE_QUEUE DeviceQueue,
                   5273:     IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
                   5274:     IN ULONG SortKey
                   5275:     );
                   5276: 
                   5277: PKDEVICE_QUEUE_ENTRY
                   5278: KeRemoveDeviceQueue (
                   5279:     IN PKDEVICE_QUEUE DeviceQueue
                   5280:     );
                   5281: 
                   5282: PKDEVICE_QUEUE_ENTRY
                   5283: KeRemoveByKeyDeviceQueue (
                   5284:     IN PKDEVICE_QUEUE DeviceQueue,
                   5285:     IN ULONG SortKey
                   5286:     );
                   5287: 
                   5288: BOOLEAN
                   5289: KeRemoveEntryDeviceQueue (
                   5290:     IN PKDEVICE_QUEUE DeviceQueue,
                   5291:     IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
                   5292:     );
                   5293: 
                   5294: BOOLEAN                                             
                   5295: KeSynchronizeExecution (                            
                   5296:     IN PKINTERRUPT Interrupt,                       
                   5297:     IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,    
                   5298:     IN PVOID SynchronizeContext                     
                   5299:     );                                              
                   5300:                                                     
                   5301: //
                   5302: // Kernel dispatcher object functions
                   5303: //
                   5304: // Event Object
                   5305: //
                   5306: 
                   5307: VOID
                   5308: KeInitializeEvent (
                   5309:     IN PKEVENT Event,
                   5310:     IN EVENT_TYPE Type,
                   5311:     IN BOOLEAN State
                   5312:     );
                   5313: 
                   5314: LONG
                   5315: KeReadStateEvent (
                   5316:     IN PKEVENT Event
                   5317:     );
                   5318: 
                   5319: LONG
                   5320: KeResetEvent (
                   5321:     IN PKEVENT Event
                   5322:     );
                   5323: 
                   5324: LONG
                   5325: KeSetEvent (
                   5326:     IN PKEVENT Event,
                   5327:     IN KPRIORITY Increment,
                   5328:     IN BOOLEAN Wait
                   5329:     );
                   5330: 
                   5331: //
                   5332: // Mutex object
                   5333: //
                   5334: 
                   5335: VOID
                   5336: KeInitializeMutex (
                   5337:     IN PKMUTEX Mutex,
                   5338:     IN ULONG Level
                   5339:     );
                   5340: 
                   5341: LONG
                   5342: KeReadStateMutex (
                   5343:     IN PKMUTEX
                   5344:     );
                   5345: 
                   5346: LONG
                   5347: KeReleaseMutex (
                   5348:     IN PKMUTEX Mutex,
                   5349:     IN BOOLEAN Wait
                   5350:     );
                   5351: 
                   5352: //
                   5353: // Semaphore object
                   5354: //
                   5355: 
                   5356: VOID
                   5357: KeInitializeSemaphore (
                   5358:     IN PKSEMAPHORE Semaphore,
                   5359:     IN LONG Count,
                   5360:     IN LONG Limit
                   5361:     );
                   5362: 
                   5363: LONG
                   5364: KeReadStateSemaphore (
                   5365:     IN PKSEMAPHORE Semaphore
                   5366:     );
                   5367: 
                   5368: LONG
                   5369: KeReleaseSemaphore (
                   5370:     IN PKSEMAPHORE Semaphore,
                   5371:     IN KPRIORITY Increment,
                   5372:     IN LONG Adjustment,
                   5373:     IN BOOLEAN Wait
                   5374:     );
                   5375: 
                   5376: NTSTATUS                                            
                   5377: KeDelayExecutionThread (                            
                   5378:     IN KPROCESSOR_MODE WaitMode,                    
                   5379:     IN BOOLEAN Alertable,                           
                   5380:     IN PLARGE_INTEGER Interval                      
                   5381:     );                                              
                   5382:                                                     
                   5383: LONG                                                
                   5384: KeSetBasePriorityThread (                           
                   5385:     IN PKTHREAD Thread,                             
                   5386:     IN LONG Increment                               
                   5387:     );                                              
                   5388:                                                     
                   5389: KPRIORITY                                           
                   5390: KeSetPriorityThread (                               
                   5391:     IN PKTHREAD Thread,                             
                   5392:     IN KPRIORITY Priority                           
                   5393:     );                                              
                   5394:                                                     
                   5395: //
                   5396: // Timer object
                   5397: //
                   5398: 
                   5399: VOID
                   5400: KeInitializeTimer (
                   5401:     IN PKTIMER Timer
                   5402:     );
                   5403: 
                   5404: BOOLEAN
                   5405: KeCancelTimer (
                   5406:     IN PKTIMER
                   5407:     );
                   5408: 
                   5409: BOOLEAN
                   5410: KeReadStateTimer (
                   5411:     PKTIMER Timer
                   5412:     );
                   5413: 
                   5414: BOOLEAN
                   5415: KeSetTimer (
                   5416:     IN PKTIMER Timer,
                   5417:     IN LARGE_INTEGER DueTime,
                   5418:     IN PKDPC Dpc OPTIONAL
                   5419:     );
                   5420: 
                   5421: 
                   5422: NTSTATUS
                   5423: KeWaitForMultipleObjects (
                   5424:     IN ULONG Count,
                   5425:     IN PVOID Object[],
                   5426:     IN WAIT_TYPE WaitType,
                   5427:     IN KWAIT_REASON WaitReason,
                   5428:     IN KPROCESSOR_MODE WaitMode,
                   5429:     IN BOOLEAN Alertable,
                   5430:     IN PLARGE_INTEGER Timeout OPTIONAL,
                   5431:     IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
                   5432:     );
                   5433: 
                   5434: NTSTATUS
                   5435: KeWaitForSingleObject (
                   5436:     IN PVOID Object,
                   5437:     IN KWAIT_REASON WaitReason,
                   5438:     IN KPROCESSOR_MODE WaitMode,
                   5439:     IN BOOLEAN Alertable,
                   5440:     IN PLARGE_INTEGER Timeout OPTIONAL
                   5441:     );
                   5442: 
                   5443: //
                   5444: // spin lock functions
                   5445: //
                   5446: 
                   5447: VOID
                   5448: KeInitializeSpinLock (
                   5449:     IN PKSPIN_LOCK SpinLock
                   5450:     );
                   5451: 
                   5452: VOID
                   5453: KeAcquireSpinLock (
                   5454:     IN PKSPIN_LOCK SpinLock,
                   5455:     OUT PKIRQL OldIrql
                   5456:     );
                   5457: 
                   5458: VOID
                   5459: KeReleaseSpinLock (
                   5460:     IN PKSPIN_LOCK SpinLock,
                   5461:     IN KIRQL NewIrql
                   5462:     );
                   5463: 
                   5464: VOID
                   5465: KeAcquireSpinLockAtDpcLevel (
                   5466:     IN PKSPIN_LOCK SpinLock
                   5467:     );
                   5468: 
                   5469: VOID
                   5470: KeReleaseSpinLockFromDpcLevel (
                   5471:     IN PKSPIN_LOCK SpinLock
                   5472:     );
                   5473: 
                   5474: 
                   5475: //
                   5476: // Miscellaneous kernel functions
                   5477: //
                   5478: 
                   5479: VOID
                   5480: KeBugCheck (
                   5481:     IN ULONG BugCheckCode
                   5482:     );
                   5483: 
                   5484: VOID
                   5485: KeBugCheckEx(
                   5486:     IN ULONG BugCheckCode,
                   5487:     IN ULONG BugCheckParameter1,
                   5488:     IN ULONG BugCheckParameter2,
                   5489:     IN ULONG BugCheckParameter3,
                   5490:     IN ULONG BugCheckParameter4
                   5491:     );
                   5492: 
                   5493: VOID
                   5494: KeEnterKernelDebugger (
                   5495:     VOID
                   5496:     );
                   5497: 
                   5498: 
                   5499: VOID
                   5500: KeQuerySystemTime (
                   5501:     OUT PLARGE_INTEGER CurrentTime
                   5502:     );
                   5503: 
                   5504: VOID
                   5505: KeQueryTickCount (
                   5506:     OUT PLARGE_INTEGER CurrentCount
                   5507:     );
                   5508: 
                   5509: ULONG
                   5510: KeQueryTimeIncrement (
                   5511:     VOID
                   5512:     );
                   5513: 
                   5514: //
                   5515: // Define external data.
                   5516: //
                   5517: 
                   5518: extern BOOLEAN KdDebuggerNotPresent;
                   5519: extern BOOLEAN KdDebuggerEnabled;
                   5520: 
                   5521: //
                   5522: // Interlocked support routine definitions.
                   5523: //
                   5524: 
                   5525: LARGE_INTEGER
                   5526: ExInterlockedAddLargeInteger (
                   5527:     IN PLARGE_INTEGER Addend,
                   5528:     IN LARGE_INTEGER Increment,
                   5529:     IN PKSPIN_LOCK Lock
                   5530:     );
                   5531: 
                   5532: ULONG
                   5533: ExInterlockedAddUlong (
                   5534:     IN PULONG Addend,
                   5535:     IN ULONG Increment,
                   5536:     IN PKSPIN_LOCK Lock
                   5537:     );
                   5538: 
                   5539: PLIST_ENTRY
                   5540: ExInterlockedInsertHeadList (
                   5541:     IN PLIST_ENTRY ListHead,
                   5542:     IN PLIST_ENTRY ListEntry,
                   5543:     IN PKSPIN_LOCK Lock
                   5544:     );
                   5545: 
                   5546: PLIST_ENTRY
                   5547: ExInterlockedInsertTailList (
                   5548:     IN PLIST_ENTRY ListHead,
                   5549:     IN PLIST_ENTRY ListEntry,
                   5550:     IN PKSPIN_LOCK Lock
                   5551:     );
                   5552: 
                   5553: PLIST_ENTRY
                   5554: ExInterlockedRemoveHeadList (
                   5555:     IN PLIST_ENTRY ListHead,
                   5556:     IN PKSPIN_LOCK Lock
                   5557:     );
                   5558: 
                   5559: PSINGLE_LIST_ENTRY
                   5560: ExInterlockedPopEntryList (
                   5561:     IN PSINGLE_LIST_ENTRY ListHead,
                   5562:     IN PKSPIN_LOCK Lock
                   5563:     );
                   5564: 
                   5565: PSINGLE_LIST_ENTRY
                   5566: ExInterlockedPushEntryList (
                   5567:     IN PSINGLE_LIST_ENTRY ListHead,
                   5568:     IN PSINGLE_LIST_ENTRY ListEntry,
                   5569:     IN PKSPIN_LOCK Lock
                   5570:     );
                   5571: 
                   5572: INTERLOCKED_RESULT
                   5573: ExInterlockedIncrementLong (
                   5574:     IN PLONG Addend,
                   5575:     IN PKSPIN_LOCK Lock
                   5576:     );
                   5577: 
                   5578: INTERLOCKED_RESULT
                   5579: ExInterlockedDecrementLong (
                   5580:     IN PLONG Addend,
                   5581:     IN PKSPIN_LOCK Lock
                   5582:     );
                   5583: 
                   5584: ULONG
                   5585: ExInterlockedExchangeUlong (
                   5586:     IN PULONG Target,
                   5587:     IN ULONG Value,
                   5588:     IN PKSPIN_LOCK Lock
                   5589:     );
                   5590: 
                   5591: //
                   5592: // Pool Allocation routines (in pool.c)
                   5593: //
                   5594: 
                   5595: typedef enum _POOL_TYPE {
                   5596:     NonPagedPool,
                   5597:     PagedPool,
                   5598:     NonPagedPoolMustSucceed,
                   5599:     DontUseThisType,
                   5600:     NonPagedPoolCacheAligned,
                   5601:     PagedPoolCacheAligned,
                   5602:     NonPagedPoolCacheAlignedMustS,
                   5603:     MaxPoolType
                   5604:     } POOL_TYPE;
                   5605: 
                   5606: 
                   5607: PVOID
                   5608: ExAllocatePool(
                   5609:     IN POOL_TYPE PoolType,
                   5610:     IN ULONG NumberOfBytes
                   5611:     );
                   5612: 
                   5613: PVOID
                   5614: ExAllocatePoolWithQuota(
                   5615:     IN POOL_TYPE PoolType,
                   5616:     IN ULONG NumberOfBytes
                   5617:     );
                   5618: 
                   5619: VOID
                   5620: ExFreePool(
                   5621:     IN PVOID P
                   5622:     );
                   5623: 
                   5624: //
                   5625: // Worker Thread
                   5626: //
                   5627: 
                   5628: typedef enum _WORK_QUEUE_TYPE {
                   5629:     CriticalWorkQueue,
                   5630:     DelayedWorkQueue,
                   5631:     MaximumWorkQueue
                   5632: } WORK_QUEUE_TYPE;
                   5633: 
                   5634: typedef
                   5635: VOID
                   5636: (*PWORKER_THREAD_ROUTINE)(
                   5637:     IN PVOID Parameter
                   5638:     );
                   5639: 
                   5640: typedef struct _WORK_QUEUE_ITEM {
                   5641:     LIST_ENTRY List;
                   5642:     PWORKER_THREAD_ROUTINE WorkerRoutine;
                   5643:     PVOID Parameter;
                   5644: } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
                   5645: 
                   5646: 
                   5647: #define ExInitializeWorkItem(Item, Routine, Context) \
                   5648:     (Item)->WorkerRoutine = (Routine);               \
                   5649:     (Item)->Parameter = (Context);                   \
                   5650:     (Item)->List.Flink = NULL;
                   5651: 
                   5652: VOID
                   5653: ExQueueWorkItem(
                   5654:     IN PWORK_QUEUE_ITEM WorkItem,
                   5655:     IN WORK_QUEUE_TYPE QueueType
                   5656:     );
                   5657: 
                   5658: //
                   5659: // Zone Allocation
                   5660: //
                   5661: 
                   5662: typedef struct _ZONE_SEGMENT_HEADER {
                   5663:     SINGLE_LIST_ENTRY SegmentList;
                   5664:     PVOID Reserved;
                   5665: } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
                   5666: 
                   5667: typedef struct _ZONE_HEADER {
                   5668:     SINGLE_LIST_ENTRY FreeList;
                   5669:     SINGLE_LIST_ENTRY SegmentList;
                   5670:     ULONG BlockSize;
                   5671:     ULONG TotalSegmentSize;
                   5672: } ZONE_HEADER, *PZONE_HEADER;
                   5673: 
                   5674: 
                   5675: NTSTATUS
                   5676: ExInitializeZone(
                   5677:     IN PZONE_HEADER Zone,
                   5678:     IN ULONG BlockSize,
                   5679:     IN PVOID InitialSegment,
                   5680:     IN ULONG InitialSegmentSize
                   5681:     );
                   5682: 
                   5683: NTSTATUS
                   5684: ExExtendZone(
                   5685:     IN PZONE_HEADER Zone,
                   5686:     IN PVOID Segment,
                   5687:     IN ULONG SegmentSize
                   5688:     );
                   5689: 
                   5690: //++
                   5691: //
                   5692: // PVOID
                   5693: // ExAllocateFromZone(
                   5694: //     IN PZONE_HEADER Zone
                   5695: //     )
                   5696: //
                   5697: // Routine Description:
                   5698: //
                   5699: //     This routine removes an entry from the zone and returns a pointer to it.
                   5700: //
                   5701: // Arguments:
                   5702: //
                   5703: //     Zone - Pointer to the zone header controlling the storage from which the
                   5704: //         entry is to be allocated.
                   5705: //
                   5706: // Return Value:
                   5707: //
                   5708: //     The function value is a pointer to the storage allocated from the zone.
                   5709: //
                   5710: //--
                   5711: 
                   5712: #define ExAllocateFromZone(Zone) \
                   5713:     (PVOID)((Zone)->FreeList.Next); \
                   5714:     if ( (Zone)->FreeList.Next ) (Zone)->FreeList.Next = (Zone)->FreeList.Next->Next
                   5715: 
                   5716: 
                   5717: //++
                   5718: //
                   5719: // PVOID
                   5720: // ExFreeToZone(
                   5721: //     IN PZONE_HEADER Zone,
                   5722: //     IN PVOID Block
                   5723: //     )
                   5724: //
                   5725: // Routine Description:
                   5726: //
                   5727: //     This routine places the specified block of storage back onto the free
                   5728: //     list in the specified zone.
                   5729: //
                   5730: // Arguments:
                   5731: //
                   5732: //     Zone - Pointer to the zone header controlling the storage to which the
                   5733: //         entry is to be inserted.
                   5734: //
                   5735: //     Block - Pointer to the block of storage to be freed back to the zone.
                   5736: //
                   5737: // Return Value:
                   5738: //
                   5739: //     Pointer to previous block of storage that was at the head of the free
                   5740: //         list.  NULL implies the zone went from no available free blocks to
                   5741: //         at least one free block.
                   5742: //
                   5743: //--
                   5744: 
                   5745: #define ExFreeToZone(Zone,Block)                                    \
                   5746:     ( ((PSINGLE_LIST_ENTRY)(Block))->Next = (Zone)->FreeList.Next,  \
                   5747:       (Zone)->FreeList.Next = ((PSINGLE_LIST_ENTRY)(Block)),        \
                   5748:       ((PSINGLE_LIST_ENTRY)(Block))->Next                           \
                   5749:     )
                   5750: 
                   5751: 
                   5752: //++
                   5753: //
                   5754: // BOOLEAN
                   5755: // ExIsFullZone(
                   5756: //     IN PZONE_HEADER Zone
                   5757: //     )
                   5758: //
                   5759: // Routine Description:
                   5760: //
                   5761: //     This routine determines if the specified zone is full or not.  A zone
                   5762: //     is considered full if the free list is empty.
                   5763: //
                   5764: // Arguments:
                   5765: //
                   5766: //     Zone - Pointer to the zone header to be tested.
                   5767: //
                   5768: // Return Value:
                   5769: //
                   5770: //     TRUE if the zone is full and FALSE otherwise.
                   5771: //
                   5772: //--
                   5773: 
                   5774: #define ExIsFullZone(Zone) \
                   5775:     ( (Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY)NULL )
                   5776: 
                   5777: //++
                   5778: //
                   5779: // PVOID
                   5780: // ExInterlockedAllocateFromZone(
                   5781: //     IN PZONE_HEADER Zone,
                   5782: //     IN PKSPIN_LOCK Lock
                   5783: //     )
                   5784: //
                   5785: // Routine Description:
                   5786: //
                   5787: //     This routine removes an entry from the zone and returns a pointer to it.
                   5788: //     The removal is performed with the specified lock owned for the sequence
                   5789: //     to make it MP-safe.
                   5790: //
                   5791: // Arguments:
                   5792: //
                   5793: //     Zone - Pointer to the zone header controlling the storage from which the
                   5794: //         entry is to be allocated.
                   5795: //
                   5796: //     Lock - Pointer to the spin lock which should be obtained before removing
                   5797: //         the entry from the allocation list.  The lock is released before
                   5798: //         returning to the caller.
                   5799: //
                   5800: // Return Value:
                   5801: //
                   5802: //     The function value is a pointer to the storage allocated from the zone.
                   5803: //
                   5804: //--
                   5805: 
                   5806: #define ExInterlockedAllocateFromZone(Zone,Lock) \
                   5807:     (PVOID) ExInterlockedPopEntryList( &(Zone)->FreeList, Lock )
                   5808: 
                   5809: //++
                   5810: //
                   5811: // PVOID
                   5812: // ExInterlockedFreeToZone(
                   5813: //     IN PZONE_HEADER Zone,
                   5814: //     IN PVOID Block,
                   5815: //     IN PKSPIN_LOCK Lock
                   5816: //     )
                   5817: //
                   5818: // Routine Description:
                   5819: //
                   5820: //     This routine places the specified block of storage back onto the free
                   5821: //     list in the specified zone.  The insertion is performed with the lock
                   5822: //     owned for the sequence to make it MP-safe.
                   5823: //
                   5824: // Arguments:
                   5825: //
                   5826: //     Zone - Pointer to the zone header controlling the storage to which the
                   5827: //         entry is to be inserted.
                   5828: //
                   5829: //     Block - Pointer to the block of storage to be freed back to the zone.
                   5830: //
                   5831: //     Lock - Pointer to the spin lock which should be obtained before inserting
                   5832: //         the entry onto the free list.  The lock is released before returning
                   5833: //         to the caller.
                   5834: //
                   5835: // Return Value:
                   5836: //
                   5837: //     Pointer to previous block of storage that was at the head of the free
                   5838: //         list.  NULL implies the zone went from no available free blocks to
                   5839: //         at least one free block.
                   5840: //
                   5841: //--
                   5842: 
                   5843: #define ExInterlockedFreeToZone(Zone,Block,Lock) \
                   5844:     ExInterlockedPushEntryList( &(Zone)->FreeList, ((PSINGLE_LIST_ENTRY) (Block)), Lock )
                   5845: 
                   5846: //
                   5847: //  Shared resource function definitions (in resource.c).
                   5848: //
                   5849: //  Note that this structure is opaque, but we'll define it here
                   5850: //  so drivers can allocate the proper amount of memory for a resource.
                   5851: //
                   5852: 
                   5853: typedef ULONG ERESOURCE_THREAD;
                   5854: typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
                   5855: 
                   5856: typedef struct _ERESOURCE {
                   5857: 
                   5858:     //
                   5859:     //  First 8 bytes are used to align the next part of the structure
                   5860:     //  onto 16 bytes.  (typical case)
                   5861:     //
                   5862: 
                   5863:     LIST_ENTRY          SystemResourcesList;
                   5864: 
                   5865:     //
                   5866:     //  Next 128 bits of this structure are field which we know
                   5867:     //  we will hit to obtain this resource either shared or exclusive
                   5868:     //
                   5869: 
                   5870:     PERESOURCE_THREAD   OwnerThreads;
                   5871:     PUCHAR              OwnerCounts;
                   5872: 
                   5873:     USHORT              TableSize;
                   5874:     USHORT              ActiveCount;
                   5875: 
                   5876:     USHORT              Flag;
                   5877:     USHORT              TableRover;                 // (0 - 128 bits)
                   5878: 
                   5879:     //
                   5880:     //  Next 128 bits contain the initial counters and at least the
                   5881:     //  first initial thread (which is also highly updated)
                   5882:     //
                   5883: 
                   5884:     UCHAR               InitialOwnerCounts[4];
                   5885:     ERESOURCE_THREAD    InitialOwnerThreads[4];
                   5886: 
                   5887:     ULONG               Spare1;
                   5888: 
                   5889:     //
                   5890:     //  The rest is what ever was left.  The spinlock is in with
                   5891:     //  a part of the stucture we normally don't touch in the
                   5892:     //  hot paths (read or write)
                   5893:     //
                   5894: 
                   5895:     ULONG               ContentionCount;
                   5896: 
                   5897:     USHORT              NumberOfExclusiveWaiters;
                   5898:     USHORT              NumberOfSharedWaiters;
                   5899: 
                   5900:     KSEMAPHORE          SharedWaiters;
                   5901:     KEVENT              ExclusiveWaiters;
                   5902: 
                   5903:     KSPIN_LOCK          SpinLock;
                   5904: 
                   5905: #ifdef _X86_
                   5906:     ULONG CreatorBackTraceIndex;
                   5907:     USHORT Depth;
                   5908:     USHORT Reserved;
                   5909:     PVOID OwnerBackTrace[ 4 ];
                   5910: #else
                   5911:     ULONG Spare[ 6 ];
                   5912: #endif
                   5913: 
                   5914: } ERESOURCE;
                   5915: typedef ERESOURCE *PERESOURCE;
                   5916: 
                   5917: //
                   5918: //  Values for ERESOURCE.Flag
                   5919: //
                   5920: #define ResourceNeverExclusive          0x10
                   5921: #define ResourceReleaseByOtherThread    0x20
                   5922: #define ResourceOwnedExclusive          0x80
                   5923: 
                   5924: NTSTATUS
                   5925: ExInitializeResource(
                   5926:     IN PERESOURCE Resource
                   5927:     );
                   5928: 
                   5929: 
                   5930: BOOLEAN
                   5931: ExAcquireResourceExclusive(
                   5932:     IN PERESOURCE Resource,
                   5933:     IN BOOLEAN Wait
                   5934:     );
                   5935: 
                   5936: //
                   5937: //  VOID
                   5938: //  ExReleaseResource(
                   5939: //      IN PERESOURCE Resource
                   5940: //      );
                   5941: //
                   5942: 
                   5943: #define ExReleaseResource(R) (ExReleaseResourceForThread(R, ExGetCurrentResourceThread()))
                   5944: 
                   5945: VOID
                   5946: ExReleaseResourceForThread(
                   5947:     IN PERESOURCE Resource,
                   5948:     IN ERESOURCE_THREAD ResourceThreadId
                   5949:     );
                   5950: 
                   5951: 
                   5952: NTSTATUS
                   5953: ExDeleteResource (
                   5954:     IN PERESOURCE Resource
                   5955:     );
                   5956: 
                   5957: 
                   5958: //
                   5959: //  ERESOURCE_THREAD
                   5960: //  ExGetCurrentResourceThread(
                   5961: //      );
                   5962: //
                   5963: 
                   5964: #define ExGetCurrentResourceThread() ((ULONG)PsGetCurrentThread())
                   5965: 
                   5966: //
                   5967: // Priority increment definitions.  The comment for each definition gives
                   5968: // the names of the system services that use the definition when satisfying
                   5969: // a wait.
                   5970: //
                   5971: //
                   5972: // Priority increment when no I/O has been done.  This is used by device
                   5973: // and file system drivers when completing an IRP (IoCompleteRequest).
                   5974: //
                   5975: 
                   5976: #define IO_NO_INCREMENT                 0
                   5977: 
                   5978: //
                   5979: // Priority increment for completing CD-ROM I/O.  This is used by CD-ROM device
                   5980: // and file system drivers when completing an IRP (IoCompleteRequest)
                   5981: //
                   5982: 
                   5983: #define IO_CD_ROM_INCREMENT             1
                   5984: 
                   5985: //
                   5986: // Priority increment for completing disk I/O.  This is used by disk device
                   5987: // and file system drivers when completing an IRP (IoCompleteRequest)
                   5988: //
                   5989: 
                   5990: #define IO_DISK_INCREMENT               1
                   5991: 
                   5992: //
                   5993: // Priority increment for completing keyboard I/O.  This is used by keyboard
                   5994: // device drivers when completing an IRP (IoCompleteRequest)
                   5995: //
                   5996: 
                   5997: #define IO_KEYBOARD_INCREMENT           6
                   5998: 
                   5999: //
                   6000: // Priority increment for completing mailslot I/O.  This is used by the mail-
                   6001: // slot file system driver when completing an IRP (IoCompleteRequest).
                   6002: //
                   6003: 
                   6004: #define IO_MAILSLOT_INCREMENT           2
                   6005: 
                   6006: //
                   6007: // Priority increment for completing mouse I/O.  This is used by mouse device
                   6008: // drivers when completing an IRP (IoCompleteRequest)
                   6009: //
                   6010: 
                   6011: #define IO_MOUSE_INCREMENT              6
                   6012: 
                   6013: //
                   6014: // Priority increment for completing named pipe I/O.  This is used by the
                   6015: // named pipe file system driver when completing an IRP (IoCompleteRequest).
                   6016: //
                   6017: 
                   6018: #define IO_NAMED_PIPE_INCREMENT         2
                   6019: 
                   6020: //
                   6021: // Priority increment for completing network I/O.  This is used by network
                   6022: // device and network file system drivers when completing an IRP
                   6023: // (IoCompleteRequest).
                   6024: //
                   6025: 
                   6026: #define IO_NETWORK_INCREMENT            2
                   6027: 
                   6028: //
                   6029: // Priority increment for completing parallel I/O.  This is used by parallel
                   6030: // device drivers when completing an IRP (IoCompleteRequest)
                   6031: //
                   6032: 
                   6033: #define IO_PARALLEL_INCREMENT           1
                   6034: 
                   6035: //
                   6036: // Priority increment for completing serial I/O.  This is used by serial device
                   6037: // drivers when completing an IRP (IoCompleteRequest)
                   6038: //
                   6039: 
                   6040: #define IO_SERIAL_INCREMENT             2
                   6041: 
                   6042: //
                   6043: // Priority increment for completing sound I/O.  This is used by sound device
                   6044: // drivers when completing an IRP (IoCompleteRequest)
                   6045: //
                   6046: 
                   6047: #define IO_SOUND_INCREMENT              8
                   6048: 
                   6049: //
                   6050: // Priority increment for completing video I/O.  This is used by video device
                   6051: // drivers when completing an IRP (IoCompleteRequest)
                   6052: //
                   6053: 
                   6054: #define IO_VIDEO_INCREMENT              1
                   6055: 
                   6056: //
                   6057: // Priority increment used when satisfying a wait on an executive semaphore
                   6058: // (NtReleaseSemaphore)
                   6059: //
                   6060: 
                   6061: #define SEMAPHORE_INCREMENT             1
                   6062: 
                   6063: //
                   6064: // Define maximum disk transfer size to be used by MM and Cache Manager,
                   6065: // so that packet-oriented disk drivers can optimize their packet allocation
                   6066: // to this size.
                   6067: //
                   6068: 
                   6069: #define MM_MAXIMUM_DISK_IO_SIZE          (0x10000)
                   6070: 
                   6071: //++
                   6072: //
                   6073: // ULONG
                   6074: // ROUND_TO_PAGES (
                   6075: //     IN ULONG Size
                   6076: //     )
                   6077: //
                   6078: // Routine Description:
                   6079: //
                   6080: //     The ROUND_TO_PAGES macro takes a size in bytes and rounds it up to a
                   6081: //     multiple of the page size.
                   6082: //
                   6083: //     NOTE: This macro fails for values 0xFFFFFFFF - (PAGE_SIZE - 1).
                   6084: //
                   6085: // Arguments:
                   6086: //
                   6087: //     Size - Size in bytes to round up to a page multiple.
                   6088: //
                   6089: // Return Value:
                   6090: //
                   6091: //     Returns the size rounded up to a multiple of the page size.
                   6092: //
                   6093: //--
                   6094: 
                   6095: #define ROUND_TO_PAGES(Size)  (((ULONG)(Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
                   6096: 
                   6097: //++
                   6098: //
                   6099: // ULONG
                   6100: // BYTES_TO_PAGES (
                   6101: //     IN ULONG Size
                   6102: //     )
                   6103: //
                   6104: // Routine Description:
                   6105: //
                   6106: //     The BYTES_TO_PAGES macro takes the size in bytes and calculates the
                   6107: //     number of pages required to contain the bytes.
                   6108: //
                   6109: // Arguments:
                   6110: //
                   6111: //     Size - Size in bytes.
                   6112: //
                   6113: // Return Value:
                   6114: //
                   6115: //     Returns the number of pages required to contain the specified size.
                   6116: //
                   6117: //--
                   6118: 
                   6119: #define BYTES_TO_PAGES(Size)  (((ULONG)(Size) >> PAGE_SHIFT) + \
                   6120:                                (((ULONG)(Size) & (PAGE_SIZE - 1)) != 0))
                   6121: 
                   6122: //++
                   6123: //
                   6124: // ULONG
                   6125: // BYTE_OFFSET (
                   6126: //     IN PVOID Va
                   6127: //     )
                   6128: //
                   6129: // Routine Description:
                   6130: //
                   6131: //     The BYTE_OFFSET macro takes a virtual address and returns the byte offset
                   6132: //     of that address within the page.
                   6133: //
                   6134: // Arguments:
                   6135: //
                   6136: //     Va - Virtual address.
                   6137: //
                   6138: // Return Value:
                   6139: //
                   6140: //     Returns the byte offset portion of the virtual address.
                   6141: //
                   6142: //--
                   6143: 
                   6144: #define BYTE_OFFSET(Va) ((ULONG)(Va) & (PAGE_SIZE - 1))
                   6145: 
                   6146: //++
                   6147: //
                   6148: // PVOID
                   6149: // PAGE_ALIGN (
                   6150: //     IN PVOID Va
                   6151: //     )
                   6152: //
                   6153: // Routine Description:
                   6154: //
                   6155: //     The PAGE_ALIGN macro takes a virtual address and returns a page-aligned
                   6156: //     virtual address for that page.
                   6157: //
                   6158: // Arguments:
                   6159: //
                   6160: //     Va - Virtual address.
                   6161: //
                   6162: // Return Value:
                   6163: //
                   6164: //     Returns the page aligned virtual address.
                   6165: //
                   6166: //--
                   6167: 
                   6168: #define PAGE_ALIGN(Va) ((PVOID)((ULONG)(Va) & ~(PAGE_SIZE - 1)))
                   6169: 
                   6170: //++
                   6171: //
                   6172: // ULONG
                   6173: // ADDRESS_AND_SIZE_TO_SPAN_PAGES (
                   6174: //     IN PVOID Va,
                   6175: //     IN ULONG Size
                   6176: //     )
                   6177: //
                   6178: // Routine Description:
                   6179: //
                   6180: //     The ADDRESS_AND_SIZE_TO_SPAN_PAGES macro takes a virtual address and
                   6181: //     size and returns the number of pages spanned by the size.
                   6182: //
                   6183: // Arguments:
                   6184: //
                   6185: //     Va - Virtual address.
                   6186: //
                   6187: //     Size - Size in bytes.
                   6188: //
                   6189: // Return Value:
                   6190: //
                   6191: //     Returns the number of pages spanned by the size.
                   6192: //
                   6193: //--
                   6194: 
                   6195: #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size) \
                   6196:    ((((ULONG)((ULONG)(Size) - 1L) >> PAGE_SHIFT) + \
                   6197:    (((((ULONG)(Size-1)&(PAGE_SIZE-1)) + ((ULONG)Va & (PAGE_SIZE -1)))) >> PAGE_SHIFT)) + 1L)
                   6198: 
                   6199: 
                   6200: //++
                   6201: //
                   6202: // PVOID
                   6203: // MmGetMdlVirtualAddress (
                   6204: //     IN PMDL Mdl
                   6205: //     )
                   6206: //
                   6207: // Routine Description:
                   6208: //
                   6209: //     The MmGetMdlVirtualAddress returns the virual address of the buffer
                   6210: //     described by the Mdl.
                   6211: //
                   6212: // Arguments:
                   6213: //
                   6214: //     Mdl - Pointer to an MDL.
                   6215: //
                   6216: // Return Value:
                   6217: //
                   6218: //     Returns the virtual address of the buffer described by the Mdl
                   6219: //
                   6220: //--
                   6221: 
                   6222: #define MmGetMdlVirtualAddress(Mdl)  ((PVOID) ((PCHAR) (Mdl)->StartVa + (Mdl)->ByteOffset))
                   6223: 
                   6224: //++
                   6225: //
                   6226: // ULONG
                   6227: // MmGetMdlByteCount (
                   6228: //     IN PMDL Mdl
                   6229: //     )
                   6230: //
                   6231: // Routine Description:
                   6232: //
                   6233: //     The MmGetMdlByteCount returns the length in bytes of the buffer
                   6234: //     described by the Mdl.
                   6235: //
                   6236: // Arguments:
                   6237: //
                   6238: //     Mdl - Pointer to an MDL.
                   6239: //
                   6240: // Return Value:
                   6241: //
                   6242: //     Returns the byte count of the buffer described by the Mdl
                   6243: //
                   6244: //--
                   6245: 
                   6246: #define MmGetMdlByteCount(Mdl)  ((Mdl)->ByteCount)
                   6247: 
                   6248: typedef enum _MM_SYSTEM_SIZE {
                   6249:     MmSmallSystem,
                   6250:     MmMediumSystem,
                   6251:     MmLargeSystem
                   6252: } MM_SYSTEMSIZE;
                   6253: 
                   6254: MM_SYSTEMSIZE
                   6255: MmQuerySystemSize(
                   6256:     VOID
                   6257:     );
                   6258: 
                   6259: typedef enum _LOCK_OPERATION {
                   6260:     IoReadAccess,
                   6261:     IoWriteAccess,
                   6262:     IoModifyAccess
                   6263: } LOCK_OPERATION;
                   6264: 
                   6265: //
                   6266: // I/O support routines.
                   6267: //
                   6268: 
                   6269: VOID
                   6270: MmProbeAndLockPages (
                   6271:     IN OUT PMDL MemoryDescriptorList,
                   6272:     IN KPROCESSOR_MODE AccessMode,
                   6273:     IN LOCK_OPERATION Operation
                   6274:     );
                   6275: 
                   6276: VOID
                   6277: MmUnlockPages (
                   6278:     IN PMDL MemoryDescriptorList
                   6279:     );
                   6280: 
                   6281: VOID
                   6282: MmBuildMdlForNonPagedPool (
                   6283:     IN OUT PMDL MemoryDescriptorList
                   6284:     );
                   6285: 
                   6286: PVOID
                   6287: MmMapLockedPages (
                   6288:     IN PMDL MemoryDescriptorList,
                   6289:     IN KPROCESSOR_MODE AccessMode
                   6290:     );
                   6291: 
                   6292: VOID
                   6293: MmUnmapLockedPages (
                   6294:     IN PVOID BaseAddress,
                   6295:     IN PMDL MemoryDescriptorList
                   6296:     );
                   6297: 
                   6298: 
                   6299: PVOID
                   6300: MmMapIoSpace (
                   6301:     IN PHYSICAL_ADDRESS PhysicalAddress,
                   6302:     IN ULONG NumberOfBytes,
                   6303:     IN BOOLEAN CacheEnable
                   6304:     );
                   6305: 
                   6306: VOID
                   6307: MmUnmapIoSpace (
                   6308:     IN PVOID BaseAddress,
                   6309:     IN ULONG NumberOfBytes
                   6310:     );
                   6311: 
                   6312: PHYSICAL_ADDRESS
                   6313: MmGetPhysicalAddress (
                   6314:     IN PVOID BaseAddress
                   6315:     );
                   6316: 
                   6317: PVOID
                   6318: MmAllocateContiguousMemory (
                   6319:     IN ULONG NumberOfBytes,
                   6320:     IN PHYSICAL_ADDRESS HighestAcceptableAddress
                   6321:     );
                   6322: 
                   6323: VOID
                   6324: MmFreeContiguousMemory (
                   6325:     IN PVOID BaseAddress
                   6326:     );
                   6327: 
                   6328: PVOID
                   6329: MmAllocateNonCachedMemory (
                   6330:     IN ULONG NumberOfBytes
                   6331:     );
                   6332: 
                   6333: VOID
                   6334: MmFreeNonCachedMemory (
                   6335:     IN PVOID BaseAddress,
                   6336:     IN ULONG NumberOfBytes
                   6337:     );
                   6338: 
                   6339: BOOLEAN
                   6340: MmIsAddressValid (
                   6341:     IN PVOID VirtualAddress
                   6342:     );
                   6343: 
                   6344: BOOLEAN
                   6345: MmIsNonPagedSystemAddressValid (
                   6346:     IN PVOID VirtualAddress
                   6347:     );
                   6348: 
                   6349: 
                   6350: ULONG
                   6351: MmSizeOfMdl(
                   6352:     IN PVOID Base,
                   6353:     IN ULONG Length
                   6354:     );
                   6355: 
                   6356: PMDL
                   6357: MmCreateMdl(
                   6358:     IN PMDL MemoryDescriptorList OPTIONAL,
                   6359:     IN PVOID Base,
                   6360:     IN ULONG Length
                   6361:     );
                   6362: 
                   6363: //++
                   6364: //
                   6365: // VOID
                   6366: // MmInitializeMdl (
                   6367: //     IN PMDL MemoryDescriptorList,
                   6368: //     IN PVOID BaseVa,
                   6369: //     IN ULONG Length
                   6370: //     )
                   6371: //
                   6372: // Routine Description:
                   6373: //
                   6374: //     This routine initializes the header of a Memory Descriptor List (MDL).
                   6375: //
                   6376: // Arguments:
                   6377: //
                   6378: //     MemoryDescriptorList - Pointer to the MDL to initialize.
                   6379: //
                   6380: //     BaseVa - Base virtual address mapped by the MDL.
                   6381: //
                   6382: //     Length - Length, in bytes, of the buffer mapped by the MDL.
                   6383: //
                   6384: // Return Value:
                   6385: //
                   6386: //     None.
                   6387: //
                   6388: //--
                   6389: 
                   6390: #define MmInitializeMdl(MemoryDescriptorList, BaseVa, Length) { \
                   6391:     (MemoryDescriptorList)->Next = (PMDL) NULL; \
                   6392:     (MemoryDescriptorList)->Size = (CSHORT)(sizeof(MDL) +  \
                   6393:             (sizeof(ULONG) * ADDRESS_AND_SIZE_TO_SPAN_PAGES((BaseVa), (Length)))); \
                   6394:     (MemoryDescriptorList)->MdlFlags = 0; \
                   6395:     (MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN((BaseVa)); \
                   6396:     (MemoryDescriptorList)->ByteOffset = BYTE_OFFSET((BaseVa)); \
                   6397:     (MemoryDescriptorList)->ByteCount = (Length); \
                   6398:     }
                   6399: 
                   6400: //++
                   6401: //
                   6402: // PVOID
                   6403: // MmGetSystemAddressForMdl (
                   6404: //     IN PMDL MDL
                   6405: //     )
                   6406: //
                   6407: // Routine Description:
                   6408: //
                   6409: //     This routine returns the mapped address of an MDL, if the
                   6410: //     Mdl is not already mapped or a system address, it is mapped.
                   6411: //
                   6412: // Arguments:
                   6413: //
                   6414: //     MemoryDescriptorList - Pointer to the MDL to map.
                   6415: //
                   6416: // Return Value:
                   6417: //
                   6418: //     Returns the base address where the pages are mapped.  The base address
                   6419: //     has the same offset as the virtual address in the MDL.
                   6420: //
                   6421: //--
                   6422: 
                   6423: //#define MmGetSystemAddressForMdl(MDL)
                   6424: //     (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA)) ?
                   6425: //                             ((MDL)->MappedSystemVa) :
                   6426: //                ((((MDL)->MdlFlags & (MDL_SOURCE_IS_NONPAGED_POOL)) ?
                   6427: //                      ((PVOID)((ULONG)(MDL)->StartVa | (MDL)->ByteOffset)) :
                   6428: //                            (MmMapLockedPages((MDL),KernelMode)))))
                   6429: 
                   6430: #define MmGetSystemAddressForMdl(MDL)                                  \
                   6431:      (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |                    \
                   6432:                         MDL_SOURCE_IS_NONPAGED_POOL)) ?                \
                   6433:                              ((MDL)->MappedSystemVa) :                 \
                   6434:                              (MmMapLockedPages((MDL),KernelMode)))
                   6435: 
                   6436: //++
                   6437: //
                   6438: // VOID
                   6439: // MmPrepareMdlForReuse (
                   6440: //     IN PMDL MDL
                   6441: //     )
                   6442: //
                   6443: // Routine Description:
                   6444: //
                   6445: //     This routine will take all of the steps necessary to allow an MDL to be
                   6446: //     re-used.
                   6447: //
                   6448: // Arguments:
                   6449: //
                   6450: //     MemoryDescriptorList - Pointer to the MDL that will be re-used.
                   6451: //
                   6452: // Return Value:
                   6453: //
                   6454: //     None.
                   6455: //
                   6456: //--
                   6457: 
                   6458: #define MmPrepareMdlForReuse(MDL)                                       \
                   6459:     if (((MDL)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) {         \
                   6460:         ASSERT(((MDL)->MdlFlags & MDL_PARTIAL) != 0);                   \
                   6461:         MmUnmapLockedPages( (MDL)->MappedSystemVa, (MDL) );             \
                   6462:     } else if (((MDL)->MdlFlags & MDL_PARTIAL) == 0) {                  \
                   6463:         ASSERT(((MDL)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0);       \
                   6464:     }
                   6465: 
                   6466: 
                   6467: //
                   6468: //  Security operation codes
                   6469: //
                   6470: 
                   6471: typedef enum _SECURITY_OPERATION_CODE {
                   6472:     SetSecurityDescriptor,
                   6473:     QuerySecurityDescriptor,
                   6474:     DeleteSecurityDescriptor,
                   6475:     AssignSecurityDescriptor
                   6476:     } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
                   6477: 
                   6478: //
                   6479: //  Data structure used to capture subject security context
                   6480: //  for access validations and auditing.
                   6481: //
                   6482: //  THE FIELDS OF THIS DATA STRUCTURE SHOULD BE CONSIDERED OPAQUE
                   6483: //  BY ALL EXCEPT THE SECURITY ROUTINES.
                   6484: //
                   6485: 
                   6486: typedef struct _SECURITY_SUBJECT_CONTEXT {
                   6487:     PACCESS_TOKEN ClientToken;
                   6488:     SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
                   6489:     PACCESS_TOKEN PrimaryToken;
                   6490:     PVOID ProcessAuditId;
                   6491:     } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
                   6492: 
                   6493: ///////////////////////////////////////////////////////////////////////////////
                   6494: //                                                                           //
                   6495: //                  ACCESS_STATE and related structures                      //
                   6496: //                                                                           //
                   6497: ///////////////////////////////////////////////////////////////////////////////
                   6498: 
                   6499: //
                   6500: //  Initial Privilege Set - Room for three privileges, which should
                   6501: //  be enough for most applications.  This structure exists so that
                   6502: //  it can be imbedded in an ACCESS_STATE structure.  Use PRIVILEGE_SET
                   6503: //  for all other references to Privilege sets.
                   6504: //
                   6505: 
                   6506: #define INITIAL_PRIVILEGE_COUNT         3
                   6507: 
                   6508: typedef struct _INITIAL_PRIVILEGE_SET {
                   6509:     ULONG PrivilegeCount;
                   6510:     ULONG Control;
                   6511:     LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
                   6512:     } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
                   6513: 
                   6514: 
                   6515: 
                   6516: //
                   6517: // Combine the information that describes the state
                   6518: // of an access-in-progress into a single structure
                   6519: //
                   6520: 
                   6521: 
                   6522: typedef struct _ACCESS_STATE {
                   6523:    LUID OperationID;
                   6524:    BOOLEAN SecurityEvaluated;
                   6525:    BOOLEAN AuditHandleCreation;
                   6526:    BOOLEAN GenerateOnClose;
                   6527:    BOOLEAN PrivilegesAllocated;
                   6528:    ULONG Flags;
                   6529:    ACCESS_MASK RemainingDesiredAccess;
                   6530:    ACCESS_MASK PreviouslyGrantedAccess;
                   6531:    ACCESS_MASK OriginalDesiredAccess;
                   6532:    SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
                   6533:    PSECURITY_DESCRIPTOR SecurityDescriptor;
                   6534:    PPRIVILEGE_SET PrivilegesUsed;
                   6535:    union {
                   6536:       INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
                   6537:       PRIVILEGE_SET PrivilegeSet;
                   6538:       } Privileges;
                   6539:    } ACCESS_STATE, *PACCESS_STATE;
                   6540: 
                   6541: 
                   6542: NTSTATUS
                   6543: SeAssignSecurity (
                   6544:     IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
                   6545:     IN PSECURITY_DESCRIPTOR ExplicitDescriptor,
                   6546:     OUT PSECURITY_DESCRIPTOR *NewDescriptor,
                   6547:     IN BOOLEAN IsDirectoryObject,
                   6548:     IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
                   6549:     IN PGENERIC_MAPPING GenericMapping,
                   6550:     IN POOL_TYPE PoolType
                   6551:     );
                   6552: 
                   6553: NTSTATUS
                   6554: SeDeassignSecurity (
                   6555:     IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor
                   6556:     );
                   6557: 
                   6558: 
                   6559: BOOLEAN
                   6560: SeAccessCheck (
                   6561:     IN PSECURITY_DESCRIPTOR SecurityDescriptor,
                   6562:     IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
                   6563:     IN BOOLEAN SubjectContextLocked,
                   6564:     IN ACCESS_MASK DesiredAccess,
                   6565:     IN ACCESS_MASK PreviouslyGrantedAccess,
                   6566:     OUT PPRIVILEGE_SET *Privileges OPTIONAL,
                   6567:     IN PGENERIC_MAPPING GenericMapping,
                   6568:     IN KPROCESSOR_MODE AccessMode,
                   6569:     OUT PACCESS_MASK GrantedAccess,
                   6570:     OUT PNTSTATUS AccessStatus
                   6571:     );
                   6572: 
                   6573: BOOLEAN                                                         
                   6574: SeSinglePrivilegeCheck(                                         
                   6575:     LUID PrivilegeValue,                                        
                   6576:     KPROCESSOR_MODE PreviousMode                                
                   6577:     );                                                          
                   6578: //
                   6579: // System Thread and Process Creation and Termination
                   6580: //
                   6581: 
                   6582: NTSTATUS
                   6583: PsCreateSystemThread(
                   6584:     OUT PHANDLE ThreadHandle,
                   6585:     IN ULONG DesiredAccess,
                   6586:     IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
                   6587:     IN HANDLE ProcessHandle OPTIONAL,
                   6588:     OUT PCLIENT_ID ClientId OPTIONAL,
                   6589:     IN PKSTART_ROUTINE StartRoutine,
                   6590:     IN PVOID StartContext
                   6591:     );
                   6592: 
                   6593: NTSTATUS
                   6594: PsTerminateSystemThread(
                   6595:     IN NTSTATUS ExitStatus
                   6596:     );
                   6597: 
                   6598: //
                   6599: // Define I/O system data structure type codes.  Each major data structure in
                   6600: // the I/O system has a type code  The type field in each structure is at the
                   6601: // same offset.  The following values can be used to determine which type of
                   6602: // data structure a pointer refers to.
                   6603: //
                   6604: 
                   6605: #define IO_TYPE_ADAPTER                 0x00000001
                   6606: #define IO_TYPE_CONTROLLER              0x00000002
                   6607: #define IO_TYPE_DEVICE                  0x00000003
                   6608: #define IO_TYPE_DRIVER                  0x00000004
                   6609: #define IO_TYPE_FILE                    0x00000005
                   6610: #define IO_TYPE_IRP                     0x00000006
                   6611: #define IO_TYPE_MASTER_ADAPTER          0x00000007
                   6612: #define IO_TYPE_OPEN_PACKET             0x00000008
                   6613: #define IO_TYPE_TIMER                   0x00000009
                   6614: #define IO_TYPE_VPB                     0x0000000a
                   6615: #define IO_TYPE_ERROR_LOG               0x0000000b
                   6616: #define IO_TYPE_ERROR_MESSAGE           0x0000000c
                   6617: 
                   6618: //
                   6619: // Define the major function codes for IRPs.  The lower 128 codes, from 0x00 to
                   6620: // 0x7f are reserved to Microsoft.  The upper 128 codes, from 0x80 to 0xff, are
                   6621: // reserved to customers of Microsoft.
                   6622: //
                   6623: 
                   6624: #define IRP_MJ_CREATE                   0x00
                   6625: #define IRP_MJ_CREATE_NAMED_PIPE        0x01
                   6626: #define IRP_MJ_CLOSE                    0x02
                   6627: #define IRP_MJ_READ                     0x03
                   6628: #define IRP_MJ_WRITE                    0x04
                   6629: #define IRP_MJ_QUERY_INFORMATION        0x05
                   6630: #define IRP_MJ_SET_INFORMATION          0x06
                   6631: #define IRP_MJ_QUERY_EA                 0x07
                   6632: #define IRP_MJ_SET_EA                   0x08
                   6633: #define IRP_MJ_FLUSH_BUFFERS            0x09
                   6634: #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
                   6635: #define IRP_MJ_SET_VOLUME_INFORMATION   0x0b
                   6636: #define IRP_MJ_DIRECTORY_CONTROL        0x0c
                   6637: #define IRP_MJ_FILE_SYSTEM_CONTROL      0x0d
                   6638: #define IRP_MJ_DEVICE_CONTROL           0x0e
                   6639: #define IRP_MJ_INTERNAL_DEVICE_CONTROL  0x0f
                   6640: #define IRP_MJ_SHUTDOWN                 0x10
                   6641: #define IRP_MJ_LOCK_CONTROL             0x11
                   6642: #define IRP_MJ_CLEANUP                  0x12
                   6643: #define IRP_MJ_CREATE_MAILSLOT          0x13
                   6644: #define IRP_MJ_QUERY_SECURITY           0x14
                   6645: #define IRP_MJ_SET_SECURITY             0x15
                   6646: #define IRP_MJ_MAXIMUM_FUNCTION         0x15
                   6647: 
                   6648: //
                   6649: // Make the Scsi major code the same as internal device control.
                   6650: //
                   6651: 
                   6652: #define IRP_MJ_SCSI                     IRP_MJ_INTERNAL_DEVICE_CONTROL
                   6653: 
                   6654: //
                   6655: // Define the minor function codes for IRPs.  The lower 128 codes, from 0x00 to
                   6656: // 0x7f are reserved to Microsoft.  The upper 128 codes, from 0x80 to 0xff, are
                   6657: // reserved to customers of Microsoft.
                   6658: //
                   6659: 
                   6660: //
                   6661: // Directory control minor function codes
                   6662: //
                   6663: 
                   6664: #define IRP_MN_QUERY_DIRECTORY          0x01
                   6665: #define IRP_MN_NOTIFY_CHANGE_DIRECTORY  0x02
                   6666: 
                   6667: //
                   6668: // File system control minor function codes.  Note that "user request" is
                   6669: // assumed to be zero by both the I/O system and file systems.  Do not change
                   6670: // this value.
                   6671: //
                   6672: 
                   6673: #define IRP_MN_USER_FS_REQUEST          0x00
                   6674: #define IRP_MN_MOUNT_VOLUME             0x01
                   6675: #define IRP_MN_VERIFY_VOLUME            0x02
                   6676: #define IRP_MN_LOAD_FILE_SYSTEM         0x03
                   6677: 
                   6678: //
                   6679: // Lock control minor function codes
                   6680: //
                   6681: 
                   6682: #define IRP_MN_LOCK                     0x01
                   6683: #define IRP_MN_UNLOCK_SINGLE            0x02
                   6684: #define IRP_MN_UNLOCK_ALL               0x03
                   6685: #define IRP_MN_UNLOCK_ALL_BY_KEY        0x04
                   6686: 
                   6687: //
                   6688: // Read and Write minor function codes for file systems supporting Lan Manager
                   6689: // software.  All of these subfunction codes are invalid if the file has been
                   6690: // opened with FO_NO_INTERMEDIATE_BUFFERING.  They are also invalid in combi-
                   6691: // nation with synchronous calls (Irp Flag or file open option).
                   6692: //
                   6693: // Note that "normal" is assumed to be zero by both the I/O system and file
                   6694: // systems.  Do not change this value.
                   6695: //
                   6696: 
                   6697: #define IRP_MN_NORMAL                   0x00
                   6698: #define IRP_MN_DPC                      0x01
                   6699: #define IRP_MN_MDL                      0x02
                   6700: #define IRP_MN_COMPLETE                 0x04
                   6701: 
                   6702: #define IRP_MN_MDL_DPC                  (IRP_MN_MDL | IRP_MN_DPC)
                   6703: #define IRP_MN_COMPLETE_MDL             (IRP_MN_COMPLETE | IRP_MN_MDL)
                   6704: #define IRP_MN_COMPLETE_MDL_DPC         (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
                   6705: 
                   6706: //
                   6707: // Device Control Request minor function codes for SCSI support. Note that
                   6708: // user requests are assumed to be zero.
                   6709: //
                   6710: 
                   6711: #define IRP_MN_SCSI_CLASS               0x01
                   6712: 
                   6713: //
                   6714: // Define option flags for IoCreateFile.  Note that these values must be
                   6715: // exactly the same as the SL_... flags for a create function.  Note also
                   6716: // that there are flags that may be passed to IoCreateFile that are not
                   6717: // placed in the stack location for the create IRP.  These flags start in
                   6718: // the next byte.
                   6719: //
                   6720: 
                   6721: #define IO_FORCE_ACCESS_CHECK           0x0001
                   6722: #define IO_OPEN_PAGING_FILE             0x0002
                   6723: #define IO_OPEN_TARGET_DIRECTORY        0x0004
                   6724: 
                   6725: //
                   6726: // Define callout routine type for use in IoQueryDeviceDescription().
                   6727: //
                   6728: 
                   6729: typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
                   6730:     IN PVOID Context,
                   6731:     IN PUNICODE_STRING PathName,
                   6732:     IN INTERFACE_TYPE BusType,
                   6733:     IN ULONG BusNumber,
                   6734:     IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
                   6735:     IN CONFIGURATION_TYPE ControllerType,
                   6736:     IN ULONG ControllerNumber,
                   6737:     IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
                   6738:     IN CONFIGURATION_TYPE PeripheralType,
                   6739:     IN ULONG PeripheralNumber,
                   6740:     IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
                   6741:     );
                   6742: 
                   6743: //
                   6744: // Defines the order of the information in the array of
                   6745: // PKEY_VALUE_FULL_INFORMATION.
                   6746: //
                   6747: 
                   6748: typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
                   6749:     IoQueryDeviceIdentifier = 0,
                   6750:     IoQueryDeviceConfigurationData,
                   6751:     IoQueryDeviceComponentInformation,
                   6752:     IoQueryDeviceMaxData
                   6753: } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
                   6754: 
                   6755: //
                   6756: // Define the objects that can be created by IoCreateFile.
                   6757: //
                   6758: 
                   6759: typedef enum _CREATE_FILE_TYPE {
                   6760:     CreateFileTypeNone,
                   6761:     CreateFileTypeNamedPipe,
                   6762:     CreateFileTypeMailslot
                   6763: } CREATE_FILE_TYPE;
                   6764: 
                   6765: //
                   6766: // Define the structures used by the I/O system
                   6767: //
                   6768: 
                   6769: //
                   6770: // Define empty typedefs for the _IRP, _DEVICE_OBJECT, and _DRIVER_OBJECT
                   6771: // structures so they may be referenced by function types before they are
                   6772: // actually defined.
                   6773: //
                   6774: 
                   6775: struct _DEVICE_OBJECT;
                   6776: struct _DRIVER_OBJECT;
                   6777: struct _DRIVE_LAYOUT_INFORMATION;
                   6778: struct _DISK_PARTITION;
                   6779: struct _FILE_OBJECT;
                   6780: struct _IRP;
                   6781: struct _SCSI_REQUEST_BLOCK;
                   6782: 
                   6783: //
                   6784: // Define the I/O version of a DPC routine.
                   6785: //
                   6786: 
                   6787: typedef
                   6788: VOID
                   6789: (*PIO_DPC_ROUTINE) (
                   6790:     IN PKDPC Dpc,
                   6791:     IN struct _DEVICE_OBJECT *DeviceObject,
                   6792:     IN struct _IRP *Irp,
                   6793:     IN PVOID Context
                   6794:     );
                   6795: 
                   6796: //
                   6797: // Define driver timer routine type.
                   6798: //
                   6799: 
                   6800: typedef
                   6801: VOID
                   6802: (*PIO_TIMER_ROUTINE) (
                   6803:     IN struct _DEVICE_OBJECT *DeviceObject,
                   6804:     IN PVOID Context
                   6805:     );
                   6806: 
                   6807: //
                   6808: // Define driver initialization routine type.
                   6809: //
                   6810: 
                   6811: typedef
                   6812: NTSTATUS
                   6813: (*PDRIVER_INITIALIZE) (
                   6814:     IN struct _DRIVER_OBJECT *DriverObject,
                   6815:     IN PUNICODE_STRING RegistryPath
                   6816:     );
                   6817: 
                   6818: //
                   6819: // Define driver reinitialization routine type.
                   6820: //
                   6821: 
                   6822: typedef
                   6823: VOID
                   6824: (*PDRIVER_REINITIALIZE) (
                   6825:     IN struct _DRIVER_OBJECT *DriverObject,
                   6826:     IN PVOID Context,
                   6827:     IN ULONG Count
                   6828:     );
                   6829: 
                   6830: //
                   6831: // Define driver cancel routine type.
                   6832: //
                   6833: 
                   6834: typedef
                   6835: VOID
                   6836: (*PDRIVER_CANCEL) (
                   6837:     IN struct _DEVICE_OBJECT *DeviceObject,
                   6838:     IN struct _IRP *Irp
                   6839:     );
                   6840: 
                   6841: //
                   6842: // Define driver dispatch routine type.
                   6843: //
                   6844: 
                   6845: typedef
                   6846: NTSTATUS
                   6847: (*PDRIVER_DISPATCH) (
                   6848:     IN struct _DEVICE_OBJECT *DeviceObject,
                   6849:     IN struct _IRP *Irp
                   6850:     );
                   6851: 
                   6852: //
                   6853: // Define driver start I/O routine type.
                   6854: //
                   6855: 
                   6856: typedef
                   6857: VOID
                   6858: (*PDRIVER_STARTIO) (
                   6859:     IN struct _DEVICE_OBJECT *DeviceObject,
                   6860:     IN struct _IRP *Irp
                   6861:     );
                   6862: 
                   6863: //
                   6864: // Define driver unload routine type.
                   6865: //
                   6866: 
                   6867: typedef
                   6868: VOID
                   6869: (*PDRIVER_UNLOAD) (
                   6870:     IN struct _DRIVER_OBJECT *DriverObject
                   6871:     );
                   6872: 
                   6873: 
                   6874: //
                   6875: // Define fast I/O procedure prototypes.
                   6876: //
                   6877: // Fast I/O read and write procedures.
                   6878: //
                   6879: 
                   6880: typedef
                   6881: BOOLEAN
                   6882: (*PFAST_IO_CHECK_IF_POSSIBLE) (
                   6883:     IN struct _FILE_OBJECT *FileObject,
                   6884:     IN PLARGE_INTEGER FileOffset,
                   6885:     IN ULONG Length,
                   6886:     IN BOOLEAN Wait,
                   6887:     IN ULONG LockKey,
                   6888:     IN BOOLEAN CheckForReadOperation,
                   6889:     OUT PIO_STATUS_BLOCK IoStatus
                   6890:     );
                   6891: 
                   6892: typedef
                   6893: BOOLEAN
                   6894: (*PFAST_IO_READ) (
                   6895:     IN struct _FILE_OBJECT *FileObject,
                   6896:     IN PLARGE_INTEGER FileOffset,
                   6897:     IN ULONG Length,
                   6898:     IN BOOLEAN Wait,
                   6899:     IN ULONG LockKey,
                   6900:     OUT PVOID Buffer,
                   6901:     OUT PIO_STATUS_BLOCK IoStatus
                   6902:     );
                   6903: 
                   6904: typedef
                   6905: BOOLEAN
                   6906: (*PFAST_IO_WRITE) (
                   6907:     IN struct _FILE_OBJECT *FileObject,
                   6908:     IN PLARGE_INTEGER FileOffset,
                   6909:     IN ULONG Length,
                   6910:     IN BOOLEAN Wait,
                   6911:     IN ULONG LockKey,
                   6912:     IN PVOID Buffer,
                   6913:     OUT PIO_STATUS_BLOCK IoStatus
                   6914:     );
                   6915: 
                   6916: //
                   6917: // Fast I/O query basic and standard information procedures.
                   6918: //
                   6919: 
                   6920: typedef
                   6921: BOOLEAN
                   6922: (*PFAST_IO_QUERY_BASIC_INFO) (
                   6923:     IN struct _FILE_OBJECT *FileObject,
                   6924:     IN BOOLEAN Wait,
                   6925:     OUT PFILE_BASIC_INFORMATION Buffer,
                   6926:     OUT PIO_STATUS_BLOCK IoStatus
                   6927:     );
                   6928: 
                   6929: typedef
                   6930: BOOLEAN
                   6931: (*PFAST_IO_QUERY_STANDARD_INFO) (
                   6932:     IN struct _FILE_OBJECT *FileObject,
                   6933:     IN BOOLEAN Wait,
                   6934:     OUT PFILE_STANDARD_INFORMATION Buffer,
                   6935:     OUT PIO_STATUS_BLOCK IoStatus
                   6936:     );
                   6937: 
                   6938: //
                   6939: // Fast I/O lock and unlock procedures.
                   6940: //
                   6941: 
                   6942: typedef
                   6943: BOOLEAN
                   6944: (*PFAST_IO_LOCK) (
                   6945:     IN struct _FILE_OBJECT *FileObject,
                   6946:     IN PLARGE_INTEGER FileOffset,
                   6947:     IN PLARGE_INTEGER Length,
                   6948:     PEPROCESS ProcessId,
                   6949:     ULONG Key,
                   6950:     BOOLEAN FailImmediately,
                   6951:     BOOLEAN ExclusiveLock,
                   6952:     OUT PIO_STATUS_BLOCK IoStatus
                   6953:     );
                   6954: 
                   6955: typedef
                   6956: BOOLEAN
                   6957: (*PFAST_IO_UNLOCK_SINGLE) (
                   6958:     IN struct _FILE_OBJECT *FileObject,
                   6959:     IN PLARGE_INTEGER FileOffset,
                   6960:     IN PLARGE_INTEGER Length,
                   6961:     PEPROCESS ProcessId,
                   6962:     ULONG Key,
                   6963:     OUT PIO_STATUS_BLOCK IoStatus
                   6964:     );
                   6965: 
                   6966: typedef
                   6967: BOOLEAN
                   6968: (*PFAST_IO_UNLOCK_ALL) (
                   6969:     IN struct _FILE_OBJECT *FileObject,
                   6970:     PEPROCESS ProcessId,
                   6971:     OUT PIO_STATUS_BLOCK IoStatus
                   6972:     );
                   6973: 
                   6974: typedef
                   6975: BOOLEAN
                   6976: (*PFAST_IO_UNLOCK_ALL_BY_KEY) (
                   6977:     IN struct _FILE_OBJECT *FileObject,
                   6978:     PVOID ProcessId,
                   6979:     ULONG Key,
                   6980:     OUT PIO_STATUS_BLOCK IoStatus
                   6981:     );
                   6982: 
                   6983: //
                   6984: // Fast I/O device control procedure.
                   6985: //
                   6986: 
                   6987: typedef
                   6988: BOOLEAN
                   6989: (*PFAST_IO_DEVICE_CONTROL) (
                   6990:     IN struct _FILE_OBJECT *FileObject,
                   6991:     IN BOOLEAN Wait,
                   6992:     IN PVOID InputBuffer OPTIONAL,
                   6993:     IN ULONG InputBufferLength,
                   6994:     OUT PVOID OutputBuffer OPTIONAL,
                   6995:     IN ULONG OutputBufferLength,
                   6996:     IN ULONG IoControlCode,
                   6997:     OUT PIO_STATUS_BLOCK IoStatus
                   6998:     );
                   6999: 
                   7000: //
                   7001: // Define the structure to describe the Fast I/O dispatch routines.
                   7002: //
                   7003: 
                   7004: typedef struct _FAST_IO_DISPATCH {
                   7005:     ULONG SizeOfFastIoDispatch;
                   7006:     PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
                   7007:     PFAST_IO_READ FastIoRead;
                   7008:     PFAST_IO_WRITE FastIoWrite;
                   7009:     PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
                   7010:     PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
                   7011:     PFAST_IO_LOCK FastIoLock;
                   7012:     PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
                   7013:     PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
                   7014:     PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
                   7015:     PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
                   7016: } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
                   7017: 
                   7018: //
                   7019: // Define the actions that a driver execution routine may request of the
                   7020: // adapter/controller allocation routines upon return.
                   7021: //
                   7022: 
                   7023: typedef enum _IO_ALLOCATION_ACTION {
                   7024:     KeepObject = 1,
                   7025:     DeallocateObject,
                   7026:     DeallocateObjectKeepRegisters
                   7027: } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
                   7028: 
                   7029: //
                   7030: // Define device driver adapter/controller execution routine.
                   7031: //
                   7032: 
                   7033: typedef
                   7034: IO_ALLOCATION_ACTION
                   7035: (*PDRIVER_CONTROL) (
                   7036:     IN struct _DEVICE_OBJECT *DeviceObject,
                   7037:     IN struct _IRP *Irp,
                   7038:     IN PVOID MapRegisterBase,
                   7039:     IN PVOID Context
                   7040:     );
                   7041: 
                   7042: //
                   7043: // Define the I/O system's security context type for use by file system's
                   7044: // when checking access to volumes, files, and directories.
                   7045: //
                   7046: 
                   7047: typedef struct _IO_SECURITY_CONTEXT {
                   7048:     PSECURITY_QUALITY_OF_SERVICE SecurityQos;
                   7049:     PACCESS_STATE AccessState;
                   7050:     ACCESS_MASK DesiredAccess;
                   7051: } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
                   7052: 
                   7053: //
                   7054: // Define Volume Parameter Block (VPB) flags.
                   7055: //
                   7056: 
                   7057: #define VPB_MOUNTED                     0x00000001
                   7058: #define VPB_LOCKED                      0x00000002
                   7059: 
                   7060: //
                   7061: // Volume Parameter Block (VPB)
                   7062: //
                   7063: 
                   7064: #define MAXIMUM_VOLUME_LABEL_LENGTH  (32 * sizeof(WCHAR)) // 32 characters
                   7065: 
                   7066: typedef struct _VPB {
                   7067:     CSHORT Type;
                   7068:     CSHORT Size;
                   7069:     USHORT Flags;
                   7070:     USHORT VolumeLabelLength; // in bytes
                   7071:     struct _DEVICE_OBJECT *DeviceObject;
                   7072:     struct _DEVICE_OBJECT *RealDevice;
                   7073:     ULONG SerialNumber;
                   7074:     ULONG ReferenceCount;
                   7075:     WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
                   7076: } VPB, *PVPB;
                   7077: 
                   7078: //
                   7079: // Define object type specific fields of various objects used by the I/O system
                   7080: //
                   7081: 
                   7082: typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
                   7083: 
                   7084: //
                   7085: // Define Wait Context Block (WCB)
                   7086: //
                   7087: 
                   7088: typedef struct _WAIT_CONTEXT_BLOCK {
                   7089:     KDEVICE_QUEUE_ENTRY WaitQueueEntry;
                   7090:     PDRIVER_CONTROL DeviceRoutine;
                   7091:     PVOID DeviceContext;
                   7092:     ULONG NumberOfMapRegisters;
                   7093:     PVOID DeviceObject;
                   7094:     PVOID CurrentIrp;
                   7095:     PKDPC BufferChainingDpc;
                   7096: } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
                   7097: 
                   7098: typedef struct _CONTROLLER_OBJECT {
                   7099:     CSHORT Type;
                   7100:     CSHORT Size;
                   7101:     PVOID ControllerExtension;
                   7102:     KDEVICE_QUEUE DeviceWaitQueue;
                   7103: 
                   7104:     ULONG Spare1;
                   7105:     LARGE_INTEGER Spare2;
                   7106: 
                   7107: } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
                   7108: 
                   7109: 
                   7110: //
                   7111: // Define Device Object (DO) flags
                   7112: //
                   7113: 
                   7114: #define DO_UNLOAD_PENDING               0x00000001
                   7115: #define DO_VERIFY_VOLUME                0x00000002
                   7116: #define DO_BUFFERED_IO                  0x00000004
                   7117: #define DO_EXCLUSIVE                    0x00000008
                   7118: #define DO_DIRECT_IO                    0x00000010
                   7119: #define DO_MAP_IO_BUFFER                0x00000020
                   7120: #define DO_DEVICE_HAS_NAME              0x00000040
                   7121: #define DO_DEVICE_INITIALIZING          0x00000080
                   7122: #define DO_SYSTEM_BOOT_PARTITION        0x00000100
                   7123: 
                   7124: //
                   7125: // Device Object structure definition
                   7126: //
                   7127: 
                   7128: typedef struct _DEVICE_OBJECT {
                   7129:     CSHORT Type;
                   7130:     USHORT Size;
                   7131:     LONG ReferenceCount;
                   7132:     struct _DRIVER_OBJECT *DriverObject;
                   7133:     struct _DEVICE_OBJECT *NextDevice;
                   7134:     struct _DEVICE_OBJECT *AttachedDevice;
                   7135:     struct _IRP *CurrentIrp;
                   7136:     PIO_TIMER Timer;
                   7137:     ULONG Flags;                                // See above:  DO_...
                   7138:     ULONG Characteristics;                      // See ntioapi:  FILE_...
                   7139:     PVPB Vpb;
                   7140:     PVOID DeviceExtension;
                   7141:     DEVICE_TYPE DeviceType;
                   7142:     CCHAR StackSize;
                   7143:     union {
                   7144:         LIST_ENTRY ListEntry;
                   7145:         WAIT_CONTEXT_BLOCK Wcb;
                   7146:     } Queue;
                   7147:     ULONG AlignmentRequirement;
                   7148:     KDEVICE_QUEUE DeviceQueue;
                   7149:     KDPC Dpc;
                   7150: 
                   7151:     //
                   7152:     //  The following field is for exclusive use by the filesystem to keep
                   7153:     //  track of the number of Fsp threads currently using the device
                   7154:     //
                   7155: 
                   7156:     ULONG ActiveThreadCount;
                   7157:     PSECURITY_DESCRIPTOR SecurityDescriptor;
                   7158:     KEVENT DeviceLock;
                   7159: 
                   7160:     ULONG Spare1;
                   7161:     LARGE_INTEGER Spare2;
                   7162: 
                   7163: } DEVICE_OBJECT, *PDEVICE_OBJECT;
                   7164: 
                   7165: //
                   7166: // Define Driver Object (DRVO) flags
                   7167: //
                   7168: 
                   7169: #define DRVO_UNLOAD_INVOKED             0x00000001
                   7170: 
                   7171: typedef struct _DRIVER_OBJECT {
                   7172:     CSHORT Type;
                   7173:     CSHORT Size;
                   7174: 
                   7175:     //
                   7176:     // The following links all of the devices created by a single driver
                   7177:     // together on a list, and the Flags word provides an extensible flag
                   7178:     // location for driver objects.
                   7179:     //
                   7180: 
                   7181:     PDEVICE_OBJECT DeviceObject;
                   7182:     ULONG Flags;
                   7183: 
                   7184:     //
                   7185:     // The following section describes where the driver is loaded.  The count
                   7186:     // field is used to count the number of times the driver has had its
                   7187:     // registered reinitialization routine invoked.
                   7188:     //
                   7189: 
                   7190:     PVOID DriverStart;
                   7191:     ULONG DriverSize;
                   7192:     PVOID DriverSection;
                   7193:     ULONG Count;
                   7194: 
                   7195:     //
                   7196:     // The driver name field is used by the error log thread
                   7197:     // determine the name of the driver that an I/O request is/was bound.
                   7198:     //
                   7199: 
                   7200:     UNICODE_STRING DriverName;
                   7201: 
                   7202:     //
                   7203:     // The following section is for registry support.  Thise is a pointer
                   7204:     // to the path to the hardware information in the registry
                   7205:     //
                   7206: 
                   7207:     PUNICODE_STRING HardwareDatabase;
                   7208: 
                   7209:     //
                   7210:     // The following section contains the optional pointer to an array of
                   7211:     // alternate entry points to a driver for "fast I/O" support.  Fast I/O
                   7212:     // is performed by invoking the driver routine directly with separate
                   7213:     // parameters, rather than using the standard IRP call mechanism.  Note
                   7214:     // that these functions may only be used for synchronous I/O, and when
                   7215:     // the file is cached.
                   7216:     //
                   7217: 
                   7218:     PFAST_IO_DISPATCH FastIoDispatch;
                   7219: 
                   7220:     //
                   7221:     // The following section describes the entry points to this particular
                   7222:     // driver.  Note that the major function dispatch table must be the last
                   7223:     // field in the object so that it remains extensible.
                   7224:     //
                   7225: 
                   7226:     PDRIVER_INITIALIZE DriverInit;
                   7227:     PDRIVER_STARTIO DriverStartIo;
                   7228:     PDRIVER_UNLOAD DriverUnload;
                   7229:     PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
                   7230: } DRIVER_OBJECT, *PDRIVER_OBJECT;
                   7231: 
                   7232: //
                   7233: // The following structure is pointed to by the SectionObject pointer field
                   7234: // of a file object, and is allocated by the various NT file systems.
                   7235: //
                   7236: 
                   7237: typedef struct _SECTION_OBJECT_POINTERS {
                   7238:     PVOID DataSectionObject;
                   7239:     PVOID SharedCacheMap;
                   7240:     PVOID ImageSectionObject;
                   7241: } SECTION_OBJECT_POINTERS;
                   7242: typedef SECTION_OBJECT_POINTERS *PSECTION_OBJECT_POINTERS;
                   7243: 
                   7244: //
                   7245: // Define File Object (FO) flags
                   7246: //
                   7247: 
                   7248: #define FO_FILE_OPEN                    0x00000001
                   7249: #define FO_SYNCHRONOUS_IO               0x00000002
                   7250: #define FO_ALERTABLE_IO                 0x00000004
                   7251: #define FO_NO_INTERMEDIATE_BUFFERING    0x00000008
                   7252: #define FO_WRITE_THROUGH                0x00000010
                   7253: #define FO_SEQUENTIAL_ONLY              0x00000020
                   7254: #define FO_CACHE_SUPPORTED              0x00000040
                   7255: #define FO_NAMED_PIPE                   0x00000080
                   7256: #define FO_STREAM_FILE                  0x00000100
                   7257: #define FO_MAILSLOT                     0x00000200
                   7258: #define FO_GENERATE_AUDIT_ON_CLOSE      0x00000400
                   7259: #define FO_DIRECT_DEVICE_OPEN           0x00000800
                   7260: #define FO_FILE_MODIFIED                0x00001000
                   7261: #define FO_FILE_SIZE_CHANGED            0x00002000
                   7262: #define FO_CLEANUP_COMPLETE             0x00004000
                   7263: #define FO_TEMPORARY_FILE               0x00008000
                   7264: #define FO_DELETE_ON_CLOSE              0x00010000
                   7265: #define FO_OPENED_CASE_SENSITIVE        0x00020000
                   7266: #define FO_HANDLE_CREATED               0x00040000
                   7267: #define FO_FILE_FAST_IO_READ            0x00080000
                   7268: 
                   7269: typedef struct _FILE_OBJECT {
                   7270:     CSHORT Type;
                   7271:     CSHORT Size;
                   7272:     PDEVICE_OBJECT DeviceObject;
                   7273:     PVPB Vpb;
                   7274:     PVOID FsContext;
                   7275:     PVOID FsContext2;
                   7276:     PSECTION_OBJECT_POINTERS SectionObjectPointer;
                   7277:     PVOID PrivateCacheMap;
                   7278:     NTSTATUS FinalStatus;
                   7279:     struct _FILE_OBJECT *RelatedFileObject;
                   7280:     BOOLEAN LockOperation;
                   7281:     BOOLEAN DeletePending;
                   7282:     BOOLEAN ReadAccess;
                   7283:     BOOLEAN WriteAccess;
                   7284:     BOOLEAN DeleteAccess;
                   7285:     BOOLEAN SharedRead;
                   7286:     BOOLEAN SharedWrite;
                   7287:     BOOLEAN SharedDelete;
                   7288:     ULONG Flags;
                   7289:     UNICODE_STRING FileName;
                   7290:     LARGE_INTEGER CurrentByteOffset;
                   7291:     ULONG Waiters;
                   7292:     ULONG Busy;
                   7293:     BOOLEAN Spare1;
                   7294:     KEVENT Lock;
                   7295:     KEVENT Event;
                   7296: } FILE_OBJECT, *PFILE_OBJECT;
                   7297: 
                   7298: //
                   7299: // Define I/O Request Packet (IRP) flags
                   7300: //
                   7301: 
                   7302: #define IRP_NOCACHE                     0x00000001
                   7303: #define IRP_PAGING_IO                   0x00000002
                   7304: #define IRP_MOUNT_COMPLETION            0x00000002
                   7305: #define IRP_SYNCHRONOUS_API             0x00000004
                   7306: #define IRP_ASSOCIATED_IRP              0x00000008
                   7307: #define IRP_BUFFERED_IO                 0x00000010
                   7308: #define IRP_DEALLOCATE_BUFFER           0x00000020
                   7309: #define IRP_INPUT_OPERATION             0x00000040
                   7310: #define IRP_SYNCHRONOUS_PAGING_IO       0x00000040
                   7311: #define IRP_CREATE_OPERATION            0x00000080
                   7312: #define IRP_READ_OPERATION              0x00000100
                   7313: #define IRP_WRITE_OPERATION             0x00000200
                   7314: #define IRP_CLOSE_OPERATION             0x00000400
                   7315: #define IRP_DEFER_IO_COMPLETION         0x00000800
                   7316: #define IRP_OB_QUERY_NAME               0x00001000
                   7317: 
                   7318: //
                   7319: // I/O Request Packet (IRP) definition
                   7320: //
                   7321: 
                   7322: typedef struct _IRP {
                   7323:     CSHORT Type;
                   7324:     USHORT Size;
                   7325: 
                   7326:     //
                   7327:     // Define the common fields used to control the IRP.
                   7328:     //
                   7329: 
                   7330:     //
                   7331:     // Define a pointer to the Memory Descriptor List (MDL) for this I/O
                   7332:     // request.  This field is only used if the I/O is "direct I/O".
                   7333:     //
                   7334: 
                   7335:     PMDL MdlAddress;
                   7336: 
                   7337:     //
                   7338:     // Flags word - used to remember various flags.
                   7339:     //
                   7340: 
                   7341:     ULONG Flags;
                   7342: 
                   7343:     //
                   7344:     // The following union is used for one of three purposes:
                   7345:     //
                   7346:     //    1. This IRP is an associated IRP.  The field is a pointer to a master
                   7347:     //       IRP.
                   7348:     //
                   7349:     //    2. This is the master IRP.  The field is the count of the number of
                   7350:     //       IRPs which must complete (associated IRPs) before the master can
                   7351:     //       complete.
                   7352:     //
                   7353:     //    3. This operation is being buffered and the field is the address of
                   7354:     //       the system space buffer.
                   7355:     //
                   7356: 
                   7357:     union {
                   7358:         struct _IRP *MasterIrp;
                   7359:         LONG IrpCount;
                   7360:         PVOID SystemBuffer;
                   7361:     } AssociatedIrp;
                   7362: 
                   7363:     //
                   7364:     // Thread list entry - allows queueing the IRP to the thread pending I/O
                   7365:     // request packet list.
                   7366:     //
                   7367: 
                   7368:     LIST_ENTRY ThreadListEntry;
                   7369: 
                   7370:     //
                   7371:     // I/O status - final status of operation.
                   7372:     //
                   7373: 
                   7374:     IO_STATUS_BLOCK IoStatus;
                   7375: 
                   7376:     //
                   7377:     // Requestor mode - mode of the original requestor of this operation.
                   7378:     //
                   7379: 
                   7380:     KPROCESSOR_MODE RequestorMode;
                   7381: 
                   7382:     //
                   7383:     // Pending returned - TRUE if pending was initially returned as the
                   7384:     // status for this packet.
                   7385:     //
                   7386: 
                   7387:     BOOLEAN PendingReturned;
                   7388: 
                   7389:     //
                   7390:     // Stack state information.
                   7391:     //
                   7392: 
                   7393:     CCHAR StackCount;
                   7394:     CCHAR CurrentLocation;
                   7395: 
                   7396:     //
                   7397:     // Cancel - packet has been canceled.
                   7398:     //
                   7399: 
                   7400:     BOOLEAN Cancel;
                   7401: 
                   7402:     //
                   7403:     // Cancel Irql - Irql at which the cancel spinlock was acquired.
                   7404:     //
                   7405: 
                   7406:     KIRQL CancelIrql;
                   7407: 
                   7408:     //
                   7409:     // ApcEnvironment - Used to save the APC environment at the time that the
                   7410:     // packet was initialized.
                   7411:     //
                   7412: 
                   7413:     CCHAR ApcEnvironment;
                   7414: 
                   7415:     //
                   7416:     // Zoned - packet was allocated from a zone.
                   7417:     //
                   7418: 
                   7419:     BOOLEAN Zoned;
                   7420: 
                   7421:     //
                   7422:     // User parameters.
                   7423:     //
                   7424: 
                   7425:     PIO_STATUS_BLOCK UserIosb;
                   7426:     PKEVENT UserEvent;
                   7427:     union {
                   7428:         struct {
                   7429:             PIO_APC_ROUTINE UserApcRoutine;
                   7430:             PVOID UserApcContext;
                   7431:         } AsynchronousParameters;
                   7432:         LARGE_INTEGER AllocationSize;
                   7433:     } Overlay;
                   7434: 
                   7435:     //
                   7436:     // CancelRoutine - Used to contain the address of a cancel routine supplied
                   7437:     // by a device driver when the IRP is in a cancelable state.
                   7438:     //
                   7439: 
                   7440:     PDRIVER_CANCEL CancelRoutine;
                   7441: 
                   7442:     //
                   7443:     // Note that the UserBuffer parameter is outside of the stack so that I/O
                   7444:     // completion can copy data back into the user's address space without
                   7445:     // having to know exactly which service was being invoked.  The length
                   7446:     // of the copy is stored in the second half of the I/O status block. If
                   7447:     // the UserBuffer field is NULL, then no copy is performed.
                   7448:     //
                   7449: 
                   7450:     PVOID UserBuffer;
                   7451: 
                   7452:     //
                   7453:     // Kernel structures
                   7454:     //
                   7455:     // The following section contains kernel structures which the IRP needs
                   7456:     // in order to place various work information in kernel controller system
                   7457:     // queues.  Because the size and alignment cannot be controlled, they are
                   7458:     // placed here at the end so they just hang off and do not affect the
                   7459:     // alignment of other fields in the IRP.
                   7460:     //
                   7461: 
                   7462:     union {
                   7463: 
                   7464:         struct {
                   7465: 
                   7466:             //
                   7467:             // DeviceQueueEntry - The device queue entry field is used to queue
                   7468:             // the IRP to the device driver device queue.
                   7469:             //
                   7470: 
                   7471:             KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
                   7472: 
                   7473:             //
                   7474:             // Thread - pointer to caller's Thread Control Block.
                   7475:             //
                   7476: 
                   7477:             PETHREAD Thread;
                   7478: 
                   7479:             //
                   7480:             // Auxillary buffer - pointer to any auxillary buffer that is
                   7481:             // required to pass information to a driver that is not contained
                   7482:             // in a normal buffer.
                   7483:             //
                   7484: 
                   7485:             PCHAR AuxiliaryBuffer;
                   7486: 
                   7487:             //
                   7488:             // List entry - used to queue the packet to completion queue, among
                   7489:             // others.
                   7490:             //
                   7491: 
                   7492:             LIST_ENTRY ListEntry;
                   7493: 
                   7494:             //
                   7495:             // Current stack location - contains a pointer to the current
                   7496:             // IO_STACK_LOCATION structure in the IRP stack.  This field
                   7497:             // should never be directly accessed by drivers.  They should
                   7498:             // use the standard functions.
                   7499:             //
                   7500: 
                   7501:             struct _IO_STACK_LOCATION *CurrentStackLocation;
                   7502: 
                   7503:             //
                   7504:             // Original file object - pointer to the original file object
                   7505:             // that was used to open the file.  This field is owned by the
                   7506:             // I/O system and should not be used by any other drivers.
                   7507:             //
                   7508: 
                   7509:             PFILE_OBJECT OriginalFileObject;
                   7510: 
                   7511:         } Overlay;
                   7512: 
                   7513:         //
                   7514:         // APC - This APC control block is used for the special kernel APC as
                   7515:         // well as for the caller's APC, if one was specified in the original
                   7516:         // argument list.  If so, then the APC is reused for the normal APC for
                   7517:         // whatever mode the caller was in and the "special" routine that is
                   7518:         // invoked before the APC gets control simply deallocates the IRP.
                   7519:         //
                   7520: 
                   7521:         KAPC Apc;
                   7522: 
                   7523:     } Tail;
                   7524: 
                   7525: } IRP, *PIRP;
                   7526: 
                   7527: //
                   7528: // Define completion routine types for use in stack locations in an IRP
                   7529: //
                   7530: 
                   7531: typedef
                   7532: NTSTATUS
                   7533: (*PIO_COMPLETION_ROUTINE) (
                   7534:     IN PDEVICE_OBJECT DeviceObject,
                   7535:     IN PIRP Irp,
                   7536:     IN PVOID Context
                   7537:     );
                   7538: 
                   7539: //
                   7540: // Define stack location control flags
                   7541: //
                   7542: 
                   7543: #define SL_PENDING_RETURNED             0x01
                   7544: #define SL_INVOKE_ON_CANCEL             0x20
                   7545: #define SL_INVOKE_ON_SUCCESS            0x40
                   7546: #define SL_INVOKE_ON_ERROR              0x80
                   7547: 
                   7548: //
                   7549: // Define flags for various functions
                   7550: //
                   7551: 
                   7552: //
                   7553: // Create / Create Named Pipe
                   7554: //
                   7555: // The following flags must exactly match those in the IoCreateFile call's
                   7556: // options.  The case sensitive flag is added in later, by the parse routine,
                   7557: // and is not an actual option to open.  Rather, it is part of the object
                   7558: // manager's attributes structure.
                   7559: //
                   7560: 
                   7561: #define SL_FORCE_ACCESS_CHECK           0x01
                   7562: #define SL_OPEN_PAGING_FILE             0x02
                   7563: #define SL_OPEN_TARGET_DIRECTORY        0x04
                   7564: 
                   7565: #define SL_CASE_SENSITIVE               0x80
                   7566: 
                   7567: //
                   7568: // Read / Write
                   7569: //
                   7570: 
                   7571: #define SL_KEY_SPECIFIED                0x01
                   7572: #define SL_OVERRIDE_VERIFY_VOLUME       0x02
                   7573: #define SL_WRITE_THROUGH                0x04
                   7574: #define SL_FT_SEQUENTIAL_WRITE          0x08
                   7575: 
                   7576: //
                   7577: // Device I/O Control
                   7578: //
                   7579: //
                   7580: // Same SL_OVERRIDE_VERIFY_VOLUME as for read/write above.
                   7581: //
                   7582: 
                   7583: //
                   7584: // Lock
                   7585: //
                   7586: 
                   7587: #define SL_FAIL_IMMEDIATELY             0x01
                   7588: #define SL_EXCLUSIVE_LOCK               0x02
                   7589: 
                   7590: //
                   7591: // QueryDirectory / QueryEa
                   7592: //
                   7593: 
                   7594: #define SL_RESTART_SCAN                 0x01
                   7595: #define SL_RETURN_SINGLE_ENTRY          0x02
                   7596: #define SL_INDEX_SPECIFIED              0x04
                   7597: 
                   7598: //
                   7599: // NotifyDirectory
                   7600: //
                   7601: 
                   7602: #define SL_WATCH_TREE                   0x01
                   7603: 
                   7604: //
                   7605: // FileSystemControl
                   7606: //
                   7607: //    minor: mount/verify volume
                   7608: //
                   7609: 
                   7610: #define SL_ALLOW_RAW_MOUNT              0x01
                   7611: 
                   7612: //
                   7613: // Define I/O Request Packet (IRP) stack locations
                   7614: //
                   7615: 
                   7616: #if !defined(_ALPHA_)
                   7617: #pragma pack(4)
                   7618: #endif
                   7619: typedef struct _IO_STACK_LOCATION {
                   7620:     UCHAR MajorFunction;
                   7621:     UCHAR MinorFunction;
                   7622:     UCHAR Flags;
                   7623:     UCHAR Control;
                   7624: 
                   7625:     //
                   7626:     // The following user parameters are based on the service that is being
                   7627:     // invoked.  Drivers and file systems can determine which set to use based
                   7628:     // on the above major and minor function codes.
                   7629:     //
                   7630: 
                   7631:     union {
                   7632: 
                   7633:         //
                   7634:         // System service parameters for:  NtCreateFile
                   7635:         //
                   7636: 
                   7637:         struct {
                   7638:             PIO_SECURITY_CONTEXT SecurityContext;
                   7639:             ULONG Options;
                   7640:             USHORT FileAttributes;
                   7641:             USHORT ShareAccess;
                   7642:             ULONG EaLength;
                   7643:         } Create;
                   7644: 
                   7645: 
                   7646:         //
                   7647:         // System service parameters for:  NtReadFile
                   7648:         //
                   7649: 
                   7650:         struct {
                   7651:             ULONG Length;
                   7652:             ULONG Key;
                   7653:             LARGE_INTEGER ByteOffset;
                   7654:         } Read;
                   7655: 
                   7656:         //
                   7657:         // System service parameters for:  NtWriteFile
                   7658:         //
                   7659: 
                   7660:         struct {
                   7661:             ULONG Length;
                   7662:             ULONG Key;
                   7663:             LARGE_INTEGER ByteOffset;
                   7664:         } Write;
                   7665: 
                   7666: 
                   7667:         //
                   7668:         // System service parameters for:  NtQueryInformationFile
                   7669:         //
                   7670: 
                   7671:         struct {
                   7672:             ULONG Length;
                   7673:             FILE_INFORMATION_CLASS FileInformationClass;
                   7674:         } QueryFile;
                   7675: 
                   7676:         //
                   7677:         // System service parameters for:  NtSetInformationFile
                   7678:         //
                   7679: 
                   7680:         struct {
                   7681:             ULONG Length;
                   7682:             FILE_INFORMATION_CLASS FileInformationClass;
                   7683:             PFILE_OBJECT FileObject;
                   7684:             BOOLEAN ReplaceIfExists;
                   7685:             BOOLEAN AdvanceOnly;
                   7686:         } SetFile;
                   7687: 
                   7688: 
                   7689:         //
                   7690:         // System service parameters for:  NtQueryVolumeInformationFile
                   7691:         //
                   7692: 
                   7693:         struct {
                   7694:             ULONG Length;
                   7695:             FS_INFORMATION_CLASS FsInformationClass;
                   7696:         } QueryVolume;
                   7697: 
                   7698: 
                   7699:         //
                   7700:         // System service parameters for:  NtFlushBuffersFile
                   7701:         //
                   7702:         // No extra user-supplied parameters.
                   7703:         //
                   7704: 
                   7705: 
                   7706:         //
                   7707:         // System service parameters for:  NtDeviceIoControlFile
                   7708:         //
                   7709:         // Note that the user's output buffer is stored in the UserBuffer field
                   7710:         // and the user's input buffer is stored in the SystemBuffer field.
                   7711:         //
                   7712: 
                   7713:         struct {
                   7714:             ULONG OutputBufferLength;
                   7715:             ULONG InputBufferLength;
                   7716:             ULONG IoControlCode;
                   7717:             PVOID Type3InputBuffer;
                   7718:         } DeviceIoControl;
                   7719: 
                   7720:         //
                   7721:         // System service parameters for:  NtQuerySecurityObject
                   7722:         //
                   7723: 
                   7724:         struct {
                   7725:             SECURITY_INFORMATION SecurityInformation;
                   7726:             ULONG Length;
                   7727:         } QuerySecurity;
                   7728: 
                   7729:         //
                   7730:         // System service parameters for:  NtSetSecurityObject
                   7731:         //
                   7732: 
                   7733:         struct {
                   7734:             SECURITY_INFORMATION SecurityInformation;
                   7735:             PSECURITY_DESCRIPTOR SecurityDescriptor;
                   7736:         } SetSecurity;
                   7737: 
                   7738:         //
                   7739:         // Non-system service parameters.
                   7740:         //
                   7741:         // Parameters for MountVolume
                   7742:         //
                   7743: 
                   7744:         struct {
                   7745:             PVPB Vpb;
                   7746:             PDEVICE_OBJECT DeviceObject;
                   7747:         } MountVolume;
                   7748: 
                   7749:         //
                   7750:         // Parameters for VerifyVolume
                   7751:         //
                   7752: 
                   7753:         struct {
                   7754:             PVPB Vpb;
                   7755:             PDEVICE_OBJECT DeviceObject;
                   7756:         } VerifyVolume;
                   7757: 
                   7758:         //
                   7759:         // Parameters for Scsi with internal device contorl.
                   7760:         //
                   7761: 
                   7762:         struct {
                   7763:             struct _SCSI_REQUEST_BLOCK *Srb;
                   7764:         } Scsi;
                   7765: 
                   7766:         //
                   7767:         // Parameters for Cleanup
                   7768:         //
                   7769:         // No extra parameters supplied
                   7770:         //
                   7771: 
                   7772:         //
                   7773:         // Others - driver-specific
                   7774:         //
                   7775: 
                   7776:         struct {
                   7777:             PVOID Argument1;
                   7778:             PVOID Argument2;
                   7779:             PVOID Argument3;
                   7780:             PVOID Argument4;
                   7781:         } Others;
                   7782: 
                   7783:     } Parameters;
                   7784: 
                   7785:     //
                   7786:     // Save a pointer to this device driver's device object for this request
                   7787:     // so it can be passed to the completion routine if needed.
                   7788:     //
                   7789: 
                   7790:     PDEVICE_OBJECT DeviceObject;
                   7791: 
                   7792:     //
                   7793:     // The following location contains a pointer to the file object for this
                   7794:     //
                   7795: 
                   7796:     PFILE_OBJECT FileObject;
                   7797: 
                   7798:     //
                   7799:     // The following routine is invoked depending on the flags in the above
                   7800:     // flags field.
                   7801:     //
                   7802: 
                   7803:     PIO_COMPLETION_ROUTINE CompletionRoutine;
                   7804: 
                   7805:     //
                   7806:     // The following is used to store the address of the context parameter
                   7807:     // that should be passed to the CompletionRoutine.
                   7808:     //
                   7809: 
                   7810:     PVOID Context;
                   7811: 
                   7812: } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
                   7813: #if !defined(_ALPHA_)
                   7814: #pragma pack()
                   7815: #endif
                   7816: 
                   7817: //
                   7818: // Define the share access structure used by file systems to determine
                   7819: // whether or not another accessor may open the file.
                   7820: //
                   7821: 
                   7822: typedef struct _SHARE_ACCESS {
                   7823:     ULONG OpenCount;
                   7824:     ULONG Readers;
                   7825:     ULONG Writers;
                   7826:     ULONG Deleters;
                   7827:     ULONG SharedRead;
                   7828:     ULONG SharedWrite;
                   7829:     ULONG SharedDelete;
                   7830: } SHARE_ACCESS, *PSHARE_ACCESS;
                   7831: 
                   7832: // begin_nthal
                   7833: 
                   7834: //
                   7835: // The following structure is used by drivers that are initializing to
                   7836: // determine the number of devices of a particular type that have already
                   7837: // been initialized.  It is also used to track whether or not the AtDisk
                   7838: // address range has already been claimed.  Finally, it is used by the
                   7839: // NtQuerySystemInformation system service to return device type counts.
                   7840: //
                   7841: 
                   7842: typedef struct _CONFIGURATION_INFORMATION {
                   7843: 
                   7844:     //
                   7845:     // This field indicates the total number of disks in the system.  This
                   7846:     // number should be used by the driver to determine the name of new
                   7847:     // disks.  This field should be updated by the driver as it finds new
                   7848:     // disks.
                   7849:     //
                   7850: 
                   7851:     ULONG DiskCount;                // Count of hard disks thus far
                   7852:     ULONG FloppyCount;              // Count of floppy disks thus far
                   7853:     ULONG CdRomCount;               // Count of CD-ROM drives thus far
                   7854:     ULONG TapeCount;                // Count of tape drives thus far
                   7855:     ULONG ScsiPortCount;            // Count of SCSI port adapters thus far
                   7856:     ULONG SerialCount;              // Count of serial devices thus far
                   7857:     ULONG ParallelCount;            // Count of parallel devices thus far
                   7858: 
                   7859:     //
                   7860:     // These next two fields indicate ownership of one of the two IO address
                   7861:     // spaces that are used by WD1003-compatable disk controllers.
                   7862:     //
                   7863: 
                   7864:     BOOLEAN AtDiskPrimaryAddressClaimed;    // 0x1F0 - 0x1FF
                   7865:     BOOLEAN AtDiskSecondaryAddressClaimed;  // 0x170 - 0x17F
                   7866: 
                   7867: } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
                   7868: 
                   7869: //
                   7870: // Public I/O routine definitions
                   7871: //
                   7872: 
                   7873: VOID
                   7874: IoAcquireCancelSpinLock(
                   7875:     OUT PKIRQL Irql
                   7876:     );
                   7877: 
                   7878: 
                   7879: NTSTATUS
                   7880: IoAllocateAdapterChannel(
                   7881:     IN PADAPTER_OBJECT AdapterObject,
                   7882:     IN PDEVICE_OBJECT DeviceObject,
                   7883:     IN ULONG NumberOfMapRegisters,
                   7884:     IN PDRIVER_CONTROL ExecutionRoutine,
                   7885:     IN PVOID Context
                   7886:     );
                   7887: 
                   7888: VOID
                   7889: IoAllocateController(
                   7890:     IN PCONTROLLER_OBJECT ControllerObject,
                   7891:     IN PDEVICE_OBJECT DeviceObject,
                   7892:     IN PDRIVER_CONTROL ExecutionRoutine,
                   7893:     IN PVOID Context
                   7894:     );
                   7895: 
                   7896: PVOID
                   7897: IoAllocateErrorLogEntry(
                   7898:     IN PVOID IoObject,
                   7899:     IN UCHAR EntrySize
                   7900:     );
                   7901: 
                   7902: PIRP
                   7903: IoAllocateIrp(
                   7904:     IN CCHAR StackSize,
                   7905:     IN BOOLEAN ChargeQuota
                   7906:     );
                   7907: 
                   7908: PMDL
                   7909: IoAllocateMdl(
                   7910:     IN PVOID VirtualAddress,
                   7911:     IN ULONG Length,
                   7912:     IN BOOLEAN SecondaryBuffer,
                   7913:     IN BOOLEAN ChargeQuota,
                   7914:     IN OUT PIRP Irp OPTIONAL
                   7915:     );
                   7916: 
                   7917: //++
                   7918: //
                   7919: // VOID
                   7920: // IoAssignArcName(
                   7921: //     IN PUNICODE_STRING ArcName,
                   7922: //     IN PUNICODE_STRING DeviceName
                   7923: //     )
                   7924: //
                   7925: // Routine Description:
                   7926: //
                   7927: //     This routine is invoked by drivers of bootable media to create a symbolic
                   7928: //     link between the ARC name of their device and its NT name.  This allows
                   7929: //     the system to determine which device in the system was actually booted
                   7930: //     from since the ARC firmware only deals in ARC names, and NT only deals
                   7931: //     in NT names.
                   7932: //
                   7933: // Arguments:
                   7934: //
                   7935: //     ArcName - Supplies the Unicode string representing the ARC name.
                   7936: //
                   7937: //     DeviceName - Supplies the name to which the ARCname refers.
                   7938: //
                   7939: // Return Value:
                   7940: //
                   7941: //     None.
                   7942: //
                   7943: //--
                   7944: 
                   7945: #define IoAssignArcName( ArcName, DeviceName ) (  \
                   7946:     IoCreateSymbolicLink( (ArcName), (DeviceName) ) )
                   7947: 
                   7948: NTSTATUS
                   7949: IoAttachDevice(
                   7950:     IN PDEVICE_OBJECT SourceDevice,
                   7951:     IN PUNICODE_STRING TargetDevice,
                   7952:     OUT PDEVICE_OBJECT *AttachedDevice
                   7953:     );
                   7954: 
                   7955: NTSTATUS
                   7956: IoAttachDeviceByPointer(
                   7957:     IN PDEVICE_OBJECT SourceDevice,
                   7958:     IN PDEVICE_OBJECT TargetDevice
                   7959:     );
                   7960: 
                   7961: PIRP
                   7962: IoBuildAsynchronousFsdRequest(
                   7963:     IN ULONG MajorFunction,
                   7964:     IN PDEVICE_OBJECT DeviceObject,
                   7965:     IN OUT PVOID Buffer OPTIONAL,
                   7966:     IN ULONG Length OPTIONAL,
                   7967:     IN PLARGE_INTEGER StartingOffset OPTIONAL,
                   7968:     IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
                   7969:     );
                   7970: 
                   7971: PIRP
                   7972: IoBuildDeviceIoControlRequest(
                   7973:     IN ULONG IoControlCode,
                   7974:     IN PDEVICE_OBJECT DeviceObject,
                   7975:     IN PVOID InputBuffer OPTIONAL,
                   7976:     IN ULONG InputBufferLength,
                   7977:     OUT PVOID OutputBuffer OPTIONAL,
                   7978:     IN ULONG OutputBufferLength,
                   7979:     IN BOOLEAN InternalDeviceIoControl,
                   7980:     IN PKEVENT Event,
                   7981:     OUT PIO_STATUS_BLOCK IoStatusBlock
                   7982:     );
                   7983: 
                   7984: VOID
                   7985: IoBuildPartialMdl(
                   7986:     IN PMDL SourceMdl,
                   7987:     IN OUT PMDL TargetMdl,
                   7988:     IN PVOID VirtualAddress,
                   7989:     IN ULONG Length
                   7990:     );
                   7991: 
                   7992: PIRP
                   7993: IoBuildSynchronousFsdRequest(
                   7994:     IN ULONG MajorFunction,
                   7995:     IN PDEVICE_OBJECT DeviceObject,
                   7996:     IN OUT PVOID Buffer OPTIONAL,
                   7997:     IN ULONG Length OPTIONAL,
                   7998:     IN PLARGE_INTEGER StartingOffset OPTIONAL,
                   7999:     IN PKEVENT Event,
                   8000:     OUT PIO_STATUS_BLOCK IoStatusBlock
                   8001:     );
                   8002: 
                   8003: NTSTATUS
                   8004: IoCallDriver(
                   8005:     IN PDEVICE_OBJECT DeviceObject,
                   8006:     IN OUT PIRP Irp
                   8007:     );
                   8008: 
                   8009: BOOLEAN
                   8010: IoCancelIrp(
                   8011:     IN PIRP Irp
                   8012:     );
                   8013: 
                   8014: 
                   8015: NTSTATUS
                   8016: IoCheckShareAccess(
                   8017:     IN ACCESS_MASK DesiredAccess,
                   8018:     IN ULONG DesiredShareAccess,
                   8019:     IN OUT PFILE_OBJECT FileObject,
                   8020:     IN OUT PSHARE_ACCESS ShareAccess,
                   8021:     IN BOOLEAN Update
                   8022:     );
                   8023: 
                   8024: VOID
                   8025: IoCompleteRequest(
                   8026:     IN PIRP Irp,
                   8027:     IN CCHAR PriorityBoost
                   8028:     );
                   8029: 
                   8030: NTSTATUS
                   8031: IoConnectInterrupt(
                   8032:     OUT PKINTERRUPT *InterruptObject,
                   8033:     IN PKSERVICE_ROUTINE ServiceRoutine,
                   8034:     IN PVOID ServiceContext,
                   8035:     IN PKSPIN_LOCK SpinLock OPTIONAL,
                   8036:     IN ULONG Vector,
                   8037:     IN KIRQL Irql,
                   8038:     IN KIRQL SynchronizeIrql,
                   8039:     IN KINTERRUPT_MODE InterruptMode,
                   8040:     IN BOOLEAN ShareVector,
                   8041:     IN KAFFINITY ProcessorEnableMask,
                   8042:     IN BOOLEAN FloatingSave
                   8043:     );
                   8044: 
                   8045: PCONTROLLER_OBJECT
                   8046: IoCreateController(
                   8047:     IN ULONG Size
                   8048:     );
                   8049: 
                   8050: NTSTATUS
                   8051: IoCreateDevice(
                   8052:     IN PDRIVER_OBJECT DriverObject,
                   8053:     IN ULONG DeviceExtensionSize,
                   8054:     IN PUNICODE_STRING DeviceName OPTIONAL,
                   8055:     IN DEVICE_TYPE DeviceType,
                   8056:     IN ULONG DeviceCharacteristics,
                   8057:     IN BOOLEAN Exclusive,
                   8058:     OUT PDEVICE_OBJECT *DeviceObject
                   8059:     );
                   8060: 
                   8061: 
                   8062: NTSTATUS
                   8063: IoCreateSymbolicLink(
                   8064:     IN PUNICODE_STRING SymbolicLinkName,
                   8065:     IN PUNICODE_STRING DeviceName
                   8066:     );
                   8067: 
                   8068: PKEVENT
                   8069: IoCreateSynchronizationEvent(
                   8070:     IN PUNICODE_STRING EventName,
                   8071:     OUT PHANDLE EventHandle
                   8072:     );
                   8073: 
                   8074: NTSTATUS
                   8075: IoCreateUnprotectedSymbolicLink(
                   8076:     IN PUNICODE_STRING SymbolicLinkName,
                   8077:     IN PUNICODE_STRING DeviceName
                   8078:     );
                   8079: 
                   8080: //++
                   8081: //
                   8082: // VOID
                   8083: // IoDeassignArcName(
                   8084: //     IN PUNICODE_STRING ArcName
                   8085: //     )
                   8086: //
                   8087: // Routine Description:
                   8088: //
                   8089: //     This routine is invoked by drivers to deassign an ARC name that they
                   8090: //     created to a device.  This is generally only called if the driver is
                   8091: //     deleting the device object, which means that the driver is probably
                   8092: //     unloading.
                   8093: //
                   8094: // Arguments:
                   8095: //
                   8096: //     ArcName - Supplies the ARC name to be removed.
                   8097: //
                   8098: // Return Value:
                   8099: //
                   8100: //     None.
                   8101: //
                   8102: //--
                   8103: 
                   8104: #define IoDeassignArcName( ArcName ) (  \
                   8105:     IoDeleteSymbolicLink( (ArcName) ) )
                   8106: 
                   8107: VOID
                   8108: IoDeleteController(
                   8109:     IN PCONTROLLER_OBJECT ControllerObject
                   8110:     );
                   8111: 
                   8112: VOID
                   8113: IoDeleteDevice(
                   8114:     IN PDEVICE_OBJECT DeviceObject
                   8115:     );
                   8116: 
                   8117: NTSTATUS
                   8118: IoDeleteSymbolicLink(
                   8119:     IN PUNICODE_STRING SymbolicLinkName
                   8120:     );
                   8121: 
                   8122: VOID
                   8123: IoDetachDevice(
                   8124:     IN OUT PDEVICE_OBJECT TargetDevice
                   8125:     );
                   8126: 
                   8127: VOID
                   8128: IoDisconnectInterrupt(
                   8129:     IN PKINTERRUPT InterruptObject
                   8130:     );
                   8131: 
                   8132: VOID
                   8133: IoFreeController(
                   8134:     IN PCONTROLLER_OBJECT ControllerObject
                   8135:     );
                   8136: 
                   8137: VOID
                   8138: IoFreeIrp(
                   8139:     IN PIRP Irp
                   8140:     );
                   8141: 
                   8142: VOID
                   8143: IoFreeMdl(
                   8144:     IN PMDL Mdl
                   8145:     );
                   8146: 
                   8147: PCONFIGURATION_INFORMATION                  
                   8148: IoGetConfigurationInformation( VOID );      
                   8149: 
                   8150: //++
                   8151: //
                   8152: // PIO_STACK_LOCATION
                   8153: // IoGetCurrentIrpStackLocation(
                   8154: //     IN PIRP Irp
                   8155: //     )
                   8156: //
                   8157: // Routine Description:
                   8158: //
                   8159: //     This routine is invoked to return a pointer to the current stack location
                   8160: //     in an I/O Request Packet (IRP).
                   8161: //
                   8162: // Arguments:
                   8163: //
                   8164: //     Irp - Pointer to the I/O Request Packet.
                   8165: //
                   8166: // Return Value:
                   8167: //
                   8168: //     The function value is a pointer to the current stack location in the
                   8169: //     packet.
                   8170: //
                   8171: //--
                   8172: 
                   8173: #define IoGetCurrentIrpStackLocation( Irp ) ( (Irp)->Tail.Overlay.CurrentStackLocation )
                   8174: 
                   8175: // end_nthal
                   8176: 
                   8177: PEPROCESS
                   8178: IoGetCurrentProcess(
                   8179:     VOID
                   8180:     );
                   8181: 
                   8182: // begin_nthal
                   8183: 
                   8184: NTSTATUS
                   8185: IoGetDeviceObjectPointer(
                   8186:     IN PUNICODE_STRING ObjectName,
                   8187:     IN ACCESS_MASK DesiredAccess,
                   8188:     OUT PFILE_OBJECT *FileObject,
                   8189:     OUT PDEVICE_OBJECT *DeviceObject
                   8190:     );
                   8191: 
                   8192: //++
                   8193: //
                   8194: // PIO_STACK_LOCATION
                   8195: // IoGetNextIrpStackLocation(
                   8196: //     IN PIRP Irp
                   8197: //     )
                   8198: //
                   8199: // Routine Description:
                   8200: //
                   8201: //     This routine is invoked to return a pointer to the next stack location
                   8202: //     in an I/O Request Packet (IRP).
                   8203: //
                   8204: // Arguments:
                   8205: //
                   8206: //     Irp - Pointer to the I/O Request Packet.
                   8207: //
                   8208: // Return Value:
                   8209: //
                   8210: //     The function value is a pointer to the next stack location in the packet.
                   8211: //
                   8212: //--
                   8213: 
                   8214: #define IoGetNextIrpStackLocation( Irp ) (\
                   8215:     (Irp)->Tail.Overlay.CurrentStackLocation - 1 )
                   8216: 
                   8217: PDEVICE_OBJECT
                   8218: IoGetRelatedDeviceObject(
                   8219:     IN PFILE_OBJECT FileObject
                   8220:     );
                   8221: 
                   8222: 
                   8223: //++
                   8224: //
                   8225: // VOID
                   8226: // IoInitializeDpcRequest(
                   8227: //     IN PDEVICE_OBJECT DeviceObject,
                   8228: //     IN PIO_DPC_ROUTINE DpcRoutine
                   8229: //     )
                   8230: //
                   8231: // Routine Description:
                   8232: //
                   8233: //     This routine is invoked to initialize the DPC in a device object for a
                   8234: //     device driver during its initialization routine.  The DPC is used later
                   8235: //     when the driver interrupt service routine requests that a DPC routine
                   8236: //     be queued for later execution.
                   8237: //
                   8238: // Arguments:
                   8239: //
                   8240: //     DeviceObject - Pointer to the device object that the request is for.
                   8241: //
                   8242: //     DpcRoutine - Address of the driver's DPC routine to be executed when
                   8243: //         the DPC is dequeued for processing.
                   8244: //
                   8245: // Return Value:
                   8246: //
                   8247: //     None.
                   8248: //
                   8249: //--
                   8250: 
                   8251: #define IoInitializeDpcRequest( DeviceObject, DpcRoutine ) (\
                   8252:     KeInitializeDpc( &(DeviceObject)->Dpc,                  \
                   8253:                      (PKDEFERRED_ROUTINE) (DpcRoutine),     \
                   8254:                      (DeviceObject) ) )
                   8255: 
                   8256: VOID
                   8257: IoInitializeIrp(
                   8258:     IN OUT PIRP Irp,
                   8259:     IN USHORT PacketSize,
                   8260:     IN CCHAR StackSize
                   8261:     );
                   8262: 
                   8263: NTSTATUS
                   8264: IoInitializeTimer(
                   8265:     IN PDEVICE_OBJECT DeviceObject,
                   8266:     IN PIO_TIMER_ROUTINE TimerRoutine,
                   8267:     IN PVOID Context
                   8268:     );
                   8269: 
                   8270: 
                   8271: //++
                   8272: //
                   8273: // BOOLEAN
                   8274: // IoIsErrorUserInduced(
                   8275: //     IN NTSTATUS Status
                   8276: //     )
                   8277: //
                   8278: // Routine Description:
                   8279: //
                   8280: //     This routine is invoked to determine if an error was as a
                   8281: //     result of user actions.  Typically these error are related
                   8282: //     to removable media and will result in a pop-up.
                   8283: //
                   8284: // Arguments:
                   8285: //
                   8286: //     Status - The status value to check.
                   8287: //
                   8288: // Return Value:
                   8289: //
                   8290: //     The function value is TRUE if the user induced the error,
                   8291: //     otherwise FALSE is returned.
                   8292: //
                   8293: //--
                   8294: #define IoIsErrorUserInduced( Status ) ((BOOLEAN)  \
                   8295:     (((Status) == STATUS_DEVICE_NOT_READY) ||      \
                   8296:      ((Status) == STATUS_IO_TIMEOUT) ||            \
                   8297:      ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
                   8298:      ((Status) == STATUS_NO_MEDIA_IN_DEVICE) ||    \
                   8299:      ((Status) == STATUS_VERIFY_REQUIRED) ||       \
                   8300:      ((Status) == STATUS_UNRECOGNIZED_MEDIA) ||    \
                   8301:      ((Status) == STATUS_WRONG_VOLUME)))
                   8302: 
                   8303: 
                   8304: PIRP
                   8305: IoMakeAssociatedIrp(
                   8306:     IN PIRP Irp,
                   8307:     IN CCHAR StackSize
                   8308:     );
                   8309: 
                   8310: //++
                   8311: //
                   8312: // VOID
                   8313: // IoMarkIrpPending(
                   8314: //     IN OUT PIRP Irp
                   8315: //     )
                   8316: //
                   8317: // Routine Description:
                   8318: //
                   8319: //     This routine marks the specified I/O Request Packet (IRP) to indicate
                   8320: //     that an initial status of STATUS_PENDING was returned to the caller.
                   8321: //     This is used so that I/O completion can determine whether or not to
                   8322: //     fully complete the I/O operation requested by the packet.
                   8323: //
                   8324: // Arguments:
                   8325: //
                   8326: //     Irp - Pointer to the I/O Request Packet to be marked pending.
                   8327: //
                   8328: // Return Value:
                   8329: //
                   8330: //     None.
                   8331: //
                   8332: //--
                   8333: 
                   8334: #define IoMarkIrpPending( Irp ) ( \
                   8335:     IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED )
                   8336: 
                   8337: NTSTATUS                                                
                   8338: IoQueryDeviceDescription(                               
                   8339:     IN PINTERFACE_TYPE BusType OPTIONAL,                
                   8340:     IN PULONG BusNumber OPTIONAL,                       
                   8341:     IN PCONFIGURATION_TYPE ControllerType OPTIONAL,     
                   8342:     IN PULONG ControllerNumber OPTIONAL,                
                   8343:     IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,     
                   8344:     IN PULONG PeripheralNumber OPTIONAL,                
                   8345:     IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,         
                   8346:     IN PVOID Context                                    
                   8347:     );                                                  
                   8348: VOID
                   8349: IoRaiseHardError(
                   8350:     IN PIRP Irp,
                   8351:     IN PVPB Vpb OPTIONAL,
                   8352:     IN PDEVICE_OBJECT RealDeviceObject
                   8353:     );
                   8354: 
                   8355: VOID
                   8356: IoRaiseInformationalHardError(
                   8357:     IN NTSTATUS ErrorStatus,
                   8358:     IN PUNICODE_STRING String OPTIONAL,
                   8359:     IN PKTHREAD Thread OPTIONAL
                   8360:     );
                   8361: 
                   8362: VOID
                   8363: IoRegisterDriverReinitialization(
                   8364:     IN PDRIVER_OBJECT DriverObject,
                   8365:     IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
                   8366:     IN PVOID Context
                   8367:     );
                   8368: 
                   8369: NTSTATUS
                   8370: IoRegisterShutdownNotification(
                   8371:     IN PDEVICE_OBJECT DeviceObject
                   8372:     );
                   8373: 
                   8374: VOID
                   8375: IoReleaseCancelSpinLock(
                   8376:     IN KIRQL Irql
                   8377:     );
                   8378: 
                   8379: 
                   8380: VOID
                   8381: IoRemoveShareAccess(
                   8382:     IN PFILE_OBJECT FileObject,
                   8383:     IN OUT PSHARE_ACCESS ShareAccess
                   8384:     );
                   8385: 
                   8386: 
                   8387: NTSTATUS
                   8388: IoReportResourceUsage(
                   8389:     IN PUNICODE_STRING DriverClassName OPTIONAL,
                   8390:     IN PDRIVER_OBJECT DriverObject,
                   8391:     IN PCM_RESOURCE_LIST DriverList OPTIONAL,
                   8392:     IN ULONG DriverListSize OPTIONAL,
                   8393:     IN PDEVICE_OBJECT DeviceObject,
                   8394:     IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
                   8395:     IN ULONG DeviceListSize OPTIONAL,
                   8396:     IN BOOLEAN OverrideConflict,
                   8397:     OUT PBOOLEAN ConflictDetected
                   8398:     );
                   8399: 
                   8400: //++
                   8401: //
                   8402: // VOID
                   8403: // IoRequestDpc(
                   8404: //     IN PDEVICE_OBJECT DeviceObject,
                   8405: //     IN PIRP Irp,
                   8406: //     IN PVOID Context
                   8407: //     )
                   8408: //
                   8409: // Routine Description:
                   8410: //
                   8411: //     This routine is invoked by the device driver's interrupt service routine
                   8412: //     to request that a DPC routine be queued for later execution at a lower
                   8413: //     IRQL.
                   8414: //
                   8415: // Arguments:
                   8416: //
                   8417: //     DeviceObject - Device object for which the request is being processed.
                   8418: //
                   8419: //     Irp - Pointer to the current I/O Request Packet (IRP) for the specified
                   8420: //         device.
                   8421: //
                   8422: //     Context - Provides a general context parameter to be passed to the
                   8423: //         DPC routine.
                   8424: //
                   8425: // Return Value:
                   8426: //
                   8427: //     None.
                   8428: //
                   8429: //--
                   8430: 
                   8431: #define IoRequestDpc( DeviceObject, Irp, Context ) ( \
                   8432:     KeInsertQueueDpc( &(DeviceObject)->Dpc, (Irp), (Context) ) )
                   8433: 
                   8434: //++
                   8435: //
                   8436: // VOID
                   8437: // IoSetCancelRoutine(
                   8438: //     IN PIRP Irp,
                   8439: //     IN PDRIVER_CANCEL CancelRoutine
                   8440: //     )
                   8441: //
                   8442: // Routine Description:
                   8443: //
                   8444: //     This routine is invoked to set the address of a cancel routine which
                   8445: //     is to be invoked when an I/O packet has been canceled.
                   8446: //
                   8447: // Arguments:
                   8448: //
                   8449: //     Irp - Pointer to the I/O Request Packet itself.
                   8450: //
                   8451: //     CancelRoutine - Address of the cancel routine that is to be invoked
                   8452: //         if the IRP is cancelled.
                   8453: //
                   8454: // Return Value:
                   8455: //
                   8456: //     None.
                   8457: //
                   8458: // Note:
                   8459: //
                   8460: //     The I/O cancel spin lock must be held when this routine is invoked.
                   8461: //
                   8462: //--
                   8463: 
                   8464: #define IoSetCancelRoutine( Irp, NewCancelRoutine ) (  \
                   8465:     (Irp)->CancelRoutine = (NewCancelRoutine) )
                   8466: 
                   8467: //++
                   8468: //
                   8469: // VOID
                   8470: // IoSetCompletionRoutine(
                   8471: //     IN PIRP Irp,
                   8472: //     IN PIO_COMPLETION_ROUTINE CompletionRoutine,
                   8473: //     IN PVOID Context,
                   8474: //     IN BOOLEAN InvokeOnSuccess,
                   8475: //     IN BOOLEAN InvokeOnError,
                   8476: //     IN BOOLEAN InvokeOnCancel
                   8477: //     )
                   8478: //
                   8479: // Routine Description:
                   8480: //
                   8481: //     This routine is invoked to set the address of a completion routine which
                   8482: //     is to be invoked when an I/O packet has been completed by a lower-level
                   8483: //     driver.
                   8484: //
                   8485: // Arguments:
                   8486: //
                   8487: //     Irp - Pointer to the I/O Request Packet itself.
                   8488: //
                   8489: //     CompletionRoutine - Address of the completion routine that is to be
                   8490: //         invoked once the next level driver completes the packet.
                   8491: //
                   8492: //     Context - Specifies a context parameter to be passed to the completion
                   8493: //         routine.
                   8494: //
                   8495: //     InvokeOnSuccess - Specifies that the completion routine is invoked when the
                   8496: //         operation is successfully completed.
                   8497: //
                   8498: //     InvokeOnError - Specifies that the completion routine is invoked when the
                   8499: //         operation completes with an error status.
                   8500: //
                   8501: //     InvokeOnCancel - Specifies that the completion routine is invoked when the
                   8502: //         operation is being canceled.
                   8503: //
                   8504: // Return Value:
                   8505: //
                   8506: //     None.
                   8507: //
                   8508: //--
                   8509: 
                   8510: #define IoSetCompletionRoutine( Irp, Routine, CompletionContext, Success, Error, Cancel ) { \
                   8511:     PIO_STACK_LOCATION irpSp;                                               \
                   8512:     ASSERT( (Success) | (Error) | (Cancel) ? (Routine) != NULL : TRUE );    \
                   8513:     irpSp = IoGetNextIrpStackLocation( (Irp) );                             \
                   8514:     irpSp->CompletionRoutine = (Routine);                                   \
                   8515:     irpSp->Context = (CompletionContext);                                   \
                   8516:     irpSp->Control = 0;                                                     \
                   8517:     if ((Success)) { irpSp->Control = SL_INVOKE_ON_SUCCESS; }               \
                   8518:     if ((Error)) { irpSp->Control |= SL_INVOKE_ON_ERROR; }                  \
                   8519:     if ((Cancel)) { irpSp->Control |= SL_INVOKE_ON_CANCEL; } }
                   8520: 
                   8521: VOID
                   8522: IoSetHardErrorOrVerifyDevice(
                   8523:     IN PIRP Irp,
                   8524:     IN PDEVICE_OBJECT DeviceObject
                   8525:     );
                   8526: 
                   8527: 
                   8528: //++
                   8529: //
                   8530: // VOID
                   8531: // IoSetNextIrpStackLocation (
                   8532: //     IN OUT PIRP Irp
                   8533: //     )
                   8534: //
                   8535: // Routine Description:
                   8536: //
                   8537: //     This routine is invoked to set the current IRP stack location to
                   8538: //     the next stack location, i.e. it "pushes" the stack.
                   8539: //
                   8540: // Arguments:
                   8541: //
                   8542: //     Irp - Pointer to the I/O Request Packet (IRP).
                   8543: //
                   8544: // Return Value:
                   8545: //
                   8546: //     None.
                   8547: //
                   8548: //--
                   8549: 
                   8550: #define IoSetNextIrpStackLocation( Irp ) {      \
                   8551:     (Irp)->CurrentLocation--;                   \
                   8552:     (Irp)->Tail.Overlay.CurrentStackLocation--; }
                   8553: 
                   8554: VOID
                   8555: IoSetShareAccess(
                   8556:     IN ACCESS_MASK DesiredAccess,
                   8557:     IN ULONG DesiredShareAccess,
                   8558:     IN OUT PFILE_OBJECT FileObject,
                   8559:     OUT PSHARE_ACCESS ShareAccess
                   8560:     );
                   8561: 
                   8562: 
                   8563: //++
                   8564: //
                   8565: // USHORT
                   8566: // IoSizeOfIrp(
                   8567: //     IN CCHAR StackSize
                   8568: //     )
                   8569: //
                   8570: // Routine Description:
                   8571: //
                   8572: //     Determines the size of an IRP given the number of stack locations
                   8573: //     the IRP will have.
                   8574: //
                   8575: // Arguments:
                   8576: //
                   8577: //     StackSize - Number of stack locations for the IRP.
                   8578: //
                   8579: // Return Value:
                   8580: //
                   8581: //     Size in bytes of the IRP.
                   8582: //
                   8583: //--
                   8584: 
                   8585: #define IoSizeOfIrp( StackSize ) \
                   8586:     ((USHORT) (sizeof( IRP ) + ((StackSize) * (sizeof( IO_STACK_LOCATION )))))
                   8587: 
                   8588: VOID
                   8589: IoStartNextPacket(
                   8590:     IN PDEVICE_OBJECT DeviceObject,
                   8591:     IN BOOLEAN Cancelable
                   8592:     );
                   8593: 
                   8594: VOID
                   8595: IoStartNextPacketByKey(
                   8596:     IN PDEVICE_OBJECT DeviceObject,
                   8597:     IN BOOLEAN Cancelable,
                   8598:     IN ULONG Key
                   8599:     );
                   8600: 
                   8601: VOID
                   8602: IoStartPacket(
                   8603:     IN PDEVICE_OBJECT DeviceObject,
                   8604:     IN PIRP Irp,
                   8605:     IN PULONG Key OPTIONAL,
                   8606:     IN PDRIVER_CANCEL CancelFunction OPTIONAL
                   8607:     );
                   8608: 
                   8609: VOID
                   8610: IoStartTimer(
                   8611:     IN PDEVICE_OBJECT DeviceObject
                   8612:     );
                   8613: 
                   8614: VOID
                   8615: IoStopTimer(
                   8616:     IN PDEVICE_OBJECT DeviceObject
                   8617:     );
                   8618: 
                   8619: VOID
                   8620: IoUnregisterShutdownNotification(
                   8621:     IN PDEVICE_OBJECT DeviceObject
                   8622:     );
                   8623: 
                   8624: VOID
                   8625: IoUpdateShareAccess(
                   8626:     IN PFILE_OBJECT FileObject,
                   8627:     IN OUT PSHARE_ACCESS ShareAccess
                   8628:     );
                   8629: 
                   8630: VOID                                            
                   8631: IoWriteErrorLogEntry(                           
                   8632:     IN PVOID ElEntry                            
                   8633:     );                                          
                   8634: //
                   8635: // The following definitions are for HAL structures.
                   8636: //
                   8637: 
                   8638: // begin_ntminiport
                   8639: //
                   8640: // Define types of bus information.
                   8641: //
                   8642: 
                   8643: typedef enum _BUS_DATA_TYPE {
                   8644:     Cmos,
                   8645:     EisaConfiguration,
                   8646:     Pos,
                   8647:     CbusConfiguration,
                   8648:     PCIConfiguration,
                   8649:     VMEConfiguration,
                   8650:     NuBusConfiguration,
                   8651:     PCMCIAConfiguration,
                   8652:     MPIConfiguration,
                   8653:     MPSAConfiguration,
                   8654:     MaximumBusDataType
                   8655: } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
                   8656: 
                   8657: //
                   8658: // Define the device description structure.
                   8659: //
                   8660: 
                   8661: typedef struct _DEVICE_DESCRIPTION {
                   8662:     ULONG Version;
                   8663:     BOOLEAN Master;
                   8664:     BOOLEAN ScatterGather;
                   8665:     BOOLEAN DemandMode;
                   8666:     BOOLEAN AutoInitialize;
                   8667:     BOOLEAN Dma32BitAddresses;
                   8668:     ULONG BusNumber;
                   8669:     ULONG DmaChannel;
                   8670:     INTERFACE_TYPE  InterfaceType;
                   8671:     DMA_WIDTH DmaWidth;
                   8672:     DMA_SPEED DmaSpeed;
                   8673:     ULONG MaximumLength;
                   8674:     ULONG DmaPort;
                   8675: } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
                   8676: 
                   8677: //
                   8678: // Define the supported version numbers for the device description structure.
                   8679: //
                   8680: 
                   8681: #define DEVICE_DESCRIPTION_VERSION 0
                   8682: 
                   8683: //
                   8684: // The following function prototypes are for HAL routines with a prefix of Hal.
                   8685: //
                   8686: // General functions.
                   8687: //
                   8688: 
                   8689: VOID
                   8690: HalAcquireDisplayOwnership (
                   8691:     VOID
                   8692:     );
                   8693: 
                   8694: #if defined(_MIPS_) || defined(_ALPHA_)         
                   8695:                                                 
                   8696: ULONG                                           
                   8697: HalGetDmaAlignmentRequirement (                 
                   8698:     VOID                                        
                   8699:     );                                          
                   8700:                                                 
                   8701: #endif                                          
                   8702:                                                 
                   8703: #if defined(_M_IX86)                            
                   8704:                                                 
                   8705: #define HalGetDmaAlignmentRequirement() 1L      
                   8706:                                                 
                   8707: #endif                                          
                   8708:                                                 
                   8709: VOID                                            
                   8710: KeFlushWriteBuffer (                            
                   8711:     VOID                                        
                   8712:     );                                          
                   8713:                                                 
                   8714: //
                   8715: // I/O driver configuration functions.
                   8716: //
                   8717: 
                   8718: ULONG
                   8719: HalGetInterruptVector(
                   8720:     IN INTERFACE_TYPE  InterfaceType,
                   8721:     IN ULONG BusNumber,
                   8722:     IN ULONG BusInterruptLevel,
                   8723:     IN ULONG BusInterruptVector,
                   8724:     OUT PKIRQL Irql,
                   8725:     OUT PKAFFINITY Affinity
                   8726:     );
                   8727: 
                   8728: BOOLEAN
                   8729: HalTranslateBusAddress(
                   8730:     IN INTERFACE_TYPE  InterfaceType,
                   8731:     IN ULONG BusNumber,
                   8732:     IN PHYSICAL_ADDRESS BusAddress,
                   8733:     IN OUT PULONG AddressSpace,
                   8734:     OUT PPHYSICAL_ADDRESS TranslatedAddress
                   8735:     );
                   8736: 
                   8737: PVOID
                   8738: HalAllocateCommonBuffer(
                   8739:     IN PADAPTER_OBJECT AdapterObject,
                   8740:     IN ULONG Length,
                   8741:     OUT PPHYSICAL_ADDRESS LogicalAddress,
                   8742:     IN BOOLEAN CacheEnabled
                   8743:     );
                   8744: 
                   8745: VOID
                   8746: HalFreeCommonBuffer(
                   8747:     IN PADAPTER_OBJECT AdapterObject,
                   8748:     IN ULONG Length,
                   8749:     IN PHYSICAL_ADDRESS LogicalAddress,
                   8750:     IN PVOID VirtualAddress,
                   8751:     IN BOOLEAN CacheEnabled
                   8752:     );
                   8753: 
                   8754: ULONG
                   8755: HalGetBusData(
                   8756:     IN BUS_DATA_TYPE BusDataType,
                   8757:     IN ULONG BusNumber,
                   8758:     IN ULONG SlotNumber,
                   8759:     IN PVOID Buffer,
                   8760:     IN ULONG Length
                   8761:     );
                   8762: 
                   8763: PADAPTER_OBJECT
                   8764: HalGetAdapter(
                   8765:     IN PDEVICE_DESCRIPTION DeviceDescription,
                   8766:     IN OUT PULONG NumberOfMapRegisters
                   8767:     );
                   8768: 
                   8769: //
                   8770: // The following function prototypes are for HAL routines with a prefix of Io.
                   8771: //
                   8772: // DMA adapter object functions.
                   8773: //
                   8774: 
                   8775: ULONG
                   8776: HalReadDmaCounter(
                   8777:     IN PADAPTER_OBJECT AdapterObject
                   8778:     );
                   8779: 
                   8780: BOOLEAN
                   8781: IoFlushAdapterBuffers(
                   8782:     IN PADAPTER_OBJECT AdapterObject,
                   8783:     IN PMDL Mdl,
                   8784:     IN PVOID MapRegisterBase,
                   8785:     IN PVOID CurrentVa,
                   8786:     IN ULONG Length,
                   8787:     IN BOOLEAN WriteToDevice
                   8788:     );
                   8789: 
                   8790: VOID
                   8791: IoFreeAdapterChannel(
                   8792:     IN PADAPTER_OBJECT AdapterObject
                   8793:     );
                   8794: 
                   8795: VOID
                   8796: IoFreeMapRegisters(
                   8797:    IN PADAPTER_OBJECT AdapterObject,
                   8798:    IN PVOID MapRegisterBase,
                   8799:    IN ULONG NumberOfMapRegisters
                   8800:    );
                   8801: 
                   8802: PHYSICAL_ADDRESS
                   8803: IoMapTransfer(
                   8804:     IN PADAPTER_OBJECT AdapterObject,
                   8805:     IN PMDL Mdl,
                   8806:     IN PVOID MapRegisterBase,
                   8807:     IN PVOID CurrentVa,
                   8808:     IN OUT PULONG Length,
                   8809:     IN BOOLEAN WriteToDevice
                   8810:     );
                   8811: 
                   8812: NTSTATUS
                   8813: IoReadPartitionTable(
                   8814:     IN PDEVICE_OBJECT DeviceObject,
                   8815:     IN ULONG SectorSize,
                   8816:     IN BOOLEAN ReturnRecognizedPartitions,
                   8817:     OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer
                   8818:     );
                   8819: 
                   8820: NTSTATUS
                   8821: IoSetPartitionInformation(
                   8822:     IN PDEVICE_OBJECT DeviceObject,
                   8823:     IN ULONG SectorSize,
                   8824:     IN ULONG PartitionNumber,
                   8825:     IN ULONG PartitionType
                   8826:     );
                   8827: 
                   8828: NTSTATUS
                   8829: IoWritePartitionTable(
                   8830:     IN PDEVICE_OBJECT DeviceObject,
                   8831:     IN ULONG SectorSize,
                   8832:     IN ULONG SectorsPerTrack,
                   8833:     IN ULONG NumberOfHeads,
                   8834:     IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer
                   8835:     );
                   8836: 
                   8837: //
                   8838: // Performance counter function.
                   8839: //
                   8840: 
                   8841: LARGE_INTEGER
                   8842: KeQueryPerformanceCounter (
                   8843:    IN PLARGE_INTEGER PerformanceFrequency OPTIONAL
                   8844:    );
                   8845: 
                   8846: //
                   8847: // Stall processor execution function.
                   8848: //
                   8849: 
                   8850: VOID
                   8851: KeStallExecutionProcessor (
                   8852:     IN ULONG MicroSeconds
                   8853:     );
                   8854: 
                   8855: //
                   8856: // Determine if there is a complete device failure on an error.
                   8857: //
                   8858: 
                   8859: BOOLEAN
                   8860: FsRtlIsTotalDeviceFailure(
                   8861:     IN NTSTATUS Status
                   8862:     );
                   8863: 
                   8864: //
                   8865: // Object Manager types
                   8866: //
                   8867: 
                   8868: typedef struct _OBJECT_HANDLE_INFORMATION {
                   8869:     ULONG HandleAttributes;
                   8870:     ACCESS_MASK GrantedAccess;
                   8871: } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
                   8872: 
                   8873: NTSTATUS                                                        
                   8874: ObReferenceObjectByHandle(                                      
                   8875:     IN HANDLE Handle,                                           
                   8876:     IN ACCESS_MASK DesiredAccess,                               
                   8877:     IN POBJECT_TYPE ObjectType OPTIONAL,                        
                   8878:     IN KPROCESSOR_MODE AccessMode,                              
                   8879:     OUT PVOID *Object,                                          
                   8880:     OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL   
                   8881:     );                                                          
                   8882: NTSTATUS                                                        
                   8883: ObReferenceObjectByPointer(                                     
                   8884:     IN PVOID Object,                                            
                   8885:     IN ACCESS_MASK DesiredAccess,                               
                   8886:     IN POBJECT_TYPE ObjectType,                                 
                   8887:     IN KPROCESSOR_MODE AccessMode                               
                   8888:     );                                                          
                   8889: VOID                                                            
                   8890: ObDereferenceObject(                                            
                   8891:     IN PVOID Object                                             
                   8892:     );                                                          
                   8893: 
                   8894: //
                   8895: // Define exported ZwXxx routines to device drivers.
                   8896: //
                   8897: 
                   8898: NTSTATUS
                   8899: ZwClose(
                   8900:     IN HANDLE Handle
                   8901:     );
                   8902: 
                   8903: NTSTATUS
                   8904: ZwCreateDirectoryObject(
                   8905:     OUT PHANDLE DirectoryHandle,
                   8906:     IN ACCESS_MASK DesiredAccess,
                   8907:     IN POBJECT_ATTRIBUTES ObjectAttributes
                   8908:     );
                   8909: 
                   8910: NTSTATUS
                   8911: ZwMakeTemporaryObject(
                   8912:     IN HANDLE Handle
                   8913:     );
                   8914: 
                   8915: NTSTATUS
                   8916: ZwOpenSection(
                   8917:     OUT PHANDLE SectionHandle,
                   8918:     IN ACCESS_MASK DesiredAccess,
                   8919:     IN POBJECT_ATTRIBUTES ObjectAttributes
                   8920:     );
                   8921: 
                   8922: NTSTATUS
                   8923: ZwMapViewOfSection(
                   8924:     IN HANDLE SectionHandle,
                   8925:     IN HANDLE ProcessHandle,
                   8926:     IN OUT PVOID *BaseAddress,
                   8927:     IN ULONG ZeroBits,
                   8928:     IN ULONG CommitSize,
                   8929:     IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
                   8930:     IN OUT PULONG ViewSize,
                   8931:     IN SECTION_INHERIT InheritDisposition,
                   8932:     IN ULONG AllocationType,
                   8933:     IN ULONG Protect
                   8934:     );
                   8935: 
                   8936: NTSTATUS
                   8937: ZwUnmapViewOfSection(
                   8938:     IN HANDLE ProcessHandle,
                   8939:     IN PVOID BaseAddress
                   8940:     );
                   8941: 
                   8942: NTSTATUS
                   8943: ZwCreateKey(
                   8944:     OUT PHANDLE KeyHandle,
                   8945:     IN ACCESS_MASK DesiredAccess,
                   8946:     IN POBJECT_ATTRIBUTES ObjectAttributes,
                   8947:     IN ULONG TitleIndex,
                   8948:     IN PUNICODE_STRING Class OPTIONAL,
                   8949:     IN ULONG CreateOptions,
                   8950:     OUT PULONG Disposition OPTIONAL
                   8951:     );
                   8952: 
                   8953: NTSTATUS
                   8954: ZwOpenKey(
                   8955:     OUT PHANDLE KeyHandle,
                   8956:     IN ACCESS_MASK DesiredAccess,
                   8957:     IN POBJECT_ATTRIBUTES ObjectAttributes
                   8958:     );
                   8959: 
                   8960: NTSTATUS
                   8961: ZwEnumerateKey(
                   8962:     IN HANDLE KeyHandle,
                   8963:     IN ULONG Index,
                   8964:     IN KEY_INFORMATION_CLASS KeyInformationClass,
                   8965:     OUT PVOID KeyInformation,
                   8966:     IN ULONG Length,
                   8967:     OUT PULONG ResultLength
                   8968:     );
                   8969: 
                   8970: NTSTATUS
                   8971: ZwEnumerateValueKey(
                   8972:     IN HANDLE KeyHandle,
                   8973:     IN ULONG Index,
                   8974:     IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                   8975:     OUT PVOID KeyValueInformation,
                   8976:     IN ULONG Length,
                   8977:     OUT PULONG ResultLength
                   8978:     );
                   8979: 
                   8980: NTSTATUS
                   8981: ZwFlushKey(
                   8982:     IN HANDLE KeyHandle
                   8983:     );
                   8984: 
                   8985: NTSTATUS
                   8986: NTAPI
                   8987: ZwQueryKey(
                   8988:     IN HANDLE KeyHandle,
                   8989:     IN KEY_INFORMATION_CLASS KeyInformationClass,
                   8990:     OUT PVOID KeyInformation,
                   8991:     IN ULONG Length,
                   8992:     OUT PULONG ResultLength
                   8993:     );
                   8994: 
                   8995: NTSTATUS
                   8996: ZwQueryValueKey(
                   8997:     IN HANDLE KeyHandle,
                   8998:     OUT PUNICODE_STRING ValueName,
                   8999:     IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                   9000:     OUT PVOID KeyValueInformation,
                   9001:     IN ULONG Length,
                   9002:     OUT PULONG ResultLength
                   9003:     );
                   9004: 
                   9005: NTSTATUS
                   9006: ZwSetValueKey(
                   9007:     IN HANDLE KeyHandle,
                   9008:     IN PUNICODE_STRING ValueName,
                   9009:     IN ULONG TitleIndex OPTIONAL,
                   9010:     IN ULONG Type,
                   9011:     IN PVOID Data,
                   9012:     IN ULONG DataSize
                   9013:     );
                   9014: 
                   9015: 
                   9016: #endif // _NTDDK_

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.