mingw-5.1.4/win32/include/ddk/winddk.h
changeset 0 76b1f169d9fe
equal deleted inserted replaced
-1:000000000000 0:76b1f169d9fe
       
     1 /*
       
     2  * winddk.h
       
     3  *
       
     4  * Windows Device Driver Kit
       
     5  *
       
     6  * This file is part of the w32api package.
       
     7  *
       
     8  * Contributors:
       
     9  *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
       
    10  *
       
    11  * THIS SOFTWARE IS NOT COPYRIGHTED
       
    12  *
       
    13  * This source code is offered for use in the public domain. You may
       
    14  * use, modify or distribute it freely.
       
    15  *
       
    16  * This code is distributed in the hope that it will be useful but
       
    17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
       
    18  * DISCLAIMED. This includes but is not limited to warranties of
       
    19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
       
    20  *
       
    21  */
       
    22 
       
    23 #ifndef __WINDDK_H
       
    24 #define __WINDDK_H
       
    25 
       
    26 #if __GNUC__ >= 3
       
    27 #pragma GCC system_header
       
    28 #endif
       
    29 
       
    30 #ifdef __cplusplus
       
    31 extern "C" {
       
    32 #endif
       
    33 
       
    34 /*
       
    35 ** Definitions specific to this Device Driver Kit
       
    36 */
       
    37 #define DDKAPI __stdcall
       
    38 #define DDKFASTAPI __fastcall
       
    39 #define DDKCDECLAPI __cdecl
       
    40 
       
    41 #if defined(_NTOSKRNL_)
       
    42 #ifndef NTOSAPI
       
    43 #define NTOSAPI DECL_EXPORT
       
    44 #endif
       
    45 #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
       
    46 #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
       
    47 #else
       
    48 #ifndef NTOSAPI
       
    49 #define NTOSAPI DECL_IMPORT
       
    50 #endif
       
    51 #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
       
    52 #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
       
    53 #endif
       
    54 
       
    55 /* Pseudo modifiers for parameters 
       
    56    We don't use these unnecessary defines in the w32api headers. Define
       
    57    them by default since that is what people expect, but allow users
       
    58    to avoid the pollution.  */
       
    59 #ifndef _NO_W32_PSEUDO_MODIFIERS
       
    60 #define IN
       
    61 #define OUT
       
    62 #define OPTIONAL
       
    63 #define UNALLIGNED
       
    64 #endif
       
    65 
       
    66 #define CONST const
       
    67 #define VOLATILE volatile
       
    68 
       
    69 #define RESTRICTED_POINTER
       
    70 #define POINTER_ALIGNMENT
       
    71 
       
    72 #ifdef NONAMELESSUNION
       
    73 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
       
    74 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
       
    75 #else
       
    76 # define _DDK_DUMMYUNION_MEMBER(name) name
       
    77 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
       
    78 #endif
       
    79 
       
    80 /*
       
    81 ** Forward declarations
       
    82 */
       
    83 
       
    84 struct _IRP;
       
    85 struct _MDL;
       
    86 struct _KAPC;
       
    87 struct _KDPC;
       
    88 struct _KPCR;
       
    89 struct _KPRCB;
       
    90 struct _KTSS;
       
    91 struct _FILE_OBJECT;
       
    92 struct _DMA_ADAPTER;
       
    93 struct _DEVICE_OBJECT;
       
    94 struct _DRIVER_OBJECT;
       
    95 struct _SECTION_OBJECT;
       
    96 struct _IO_STATUS_BLOCK;
       
    97 struct _DEVICE_DESCRIPTION;
       
    98 struct _SCATTER_GATHER_LIST;
       
    99 
       
   100 DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT)
       
   101 DECLARE_INTERNAL_OBJECT(DMA_ADAPTER)
       
   102 DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK)
       
   103 DECLARE_INTERNAL_OBJECT(SECTION_OBJECT)
       
   104 
       
   105 #if 1
       
   106 /* FIXME: Unknown definitions */
       
   107 struct _SET_PARTITION_INFORMATION_EX;
       
   108 typedef ULONG WAIT_TYPE;
       
   109 typedef HANDLE TRACEHANDLE;
       
   110 typedef PVOID PWMILIB_CONTEXT;
       
   111 typedef PVOID PSYSCTL_IRP_DISPOSITION;
       
   112 typedef ULONG LOGICAL;
       
   113 #endif
       
   114 
       
   115 /*
       
   116 ** Routines specific to this DDK
       
   117 */
       
   118 
       
   119 #define TAG(_a, _b, _c, _d) (ULONG) \
       
   120 	(((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24))
       
   121 
       
   122 #ifdef __GNUC__
       
   123 static __inline struct _KPCR * KeGetCurrentKPCR(
       
   124   VOID)
       
   125 {
       
   126   ULONG Value;
       
   127 
       
   128   __asm__ __volatile__ (
       
   129 #if (__GNUC__ >= 3)
       
   130     /* support -masm=intel */
       
   131     "mov{l} {%%fs:0x18, %0|%0, %%fs:0x18}\n\t"
       
   132 #else
       
   133     "movl %%fs:0x18, %0\n\t"
       
   134 #endif
       
   135      : "=r" (Value)
       
   136      : /* no inputs */
       
   137   );
       
   138   return (struct _KPCR *) Value;
       
   139 }
       
   140 
       
   141 #elif defined( __WATCOMC__ )
       
   142 
       
   143 extern struct _KPCR * KeGetCurrentKPCR( void );
       
   144 #pragma aux KeGetCurrentKPCR = \
       
   145   "mov eax, fs:[0x18]" \
       
   146   value [ eax ];
       
   147 
       
   148 #endif
       
   149 
       
   150 /*
       
   151 ** Simple structures
       
   152 */
       
   153 
       
   154 typedef LONG KPRIORITY;
       
   155 typedef UCHAR KIRQL, *PKIRQL;
       
   156 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
       
   157 typedef ULONG_PTR KAFFINITY, *PKAFFINITY;
       
   158 typedef CCHAR KPROCESSOR_MODE;
       
   159 
       
   160 typedef enum _MODE {
       
   161   KernelMode,
       
   162   UserMode,
       
   163   MaximumMode
       
   164 } MODE;
       
   165 
       
   166 
       
   167 /* Structures not exposed to drivers */
       
   168 typedef struct _IO_TIMER *PIO_TIMER;
       
   169 typedef struct _EPROCESS *PEPROCESS;
       
   170 typedef struct _ETHREAD *PETHREAD;
       
   171 typedef struct _KINTERRUPT *PKINTERRUPT;
       
   172 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
       
   173 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
       
   174 typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO;
       
   175 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
       
   176 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
       
   177 typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION;
       
   178 typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX;
       
   179 
       
   180 /* Constants */
       
   181 #define	MAXIMUM_PROCESSORS                32
       
   182 
       
   183 #define MAXIMUM_WAIT_OBJECTS              64
       
   184 
       
   185 #define METHOD_BUFFERED                   0
       
   186 #define METHOD_IN_DIRECT                  1
       
   187 #define METHOD_OUT_DIRECT                 2
       
   188 #define METHOD_NEITHER                    3
       
   189 
       
   190 #define LOW_PRIORITY                      0
       
   191 #define LOW_REALTIME_PRIORITY             16
       
   192 #define HIGH_PRIORITY                     31
       
   193 #define MAXIMUM_PRIORITY                  32
       
   194 
       
   195 #define FILE_SUPERSEDED                   0x00000000
       
   196 #define FILE_OPENED                       0x00000001
       
   197 #define FILE_CREATED                      0x00000002
       
   198 #define FILE_OVERWRITTEN                  0x00000003
       
   199 #define FILE_EXISTS                       0x00000004
       
   200 #define FILE_DOES_NOT_EXIST               0x00000005
       
   201 
       
   202 /* also in winnt.h */
       
   203 #define FILE_LIST_DIRECTORY               0x00000001
       
   204 #define FILE_READ_DATA                    0x00000001
       
   205 #define FILE_ADD_FILE                     0x00000002
       
   206 #define FILE_WRITE_DATA                   0x00000002
       
   207 #define FILE_ADD_SUBDIRECTORY             0x00000004
       
   208 #define FILE_APPEND_DATA                  0x00000004
       
   209 #define FILE_CREATE_PIPE_INSTANCE         0x00000004
       
   210 #define FILE_READ_EA                      0x00000008
       
   211 #define FILE_WRITE_EA                     0x00000010
       
   212 #define FILE_EXECUTE                      0x00000020
       
   213 #define FILE_TRAVERSE                     0x00000020
       
   214 #define FILE_DELETE_CHILD                 0x00000040
       
   215 #define FILE_READ_ATTRIBUTES              0x00000080
       
   216 #define FILE_WRITE_ATTRIBUTES             0x00000100
       
   217 
       
   218 #define FILE_SHARE_READ                   0x00000001
       
   219 #define FILE_SHARE_WRITE                  0x00000002
       
   220 #define FILE_SHARE_DELETE                 0x00000004
       
   221 #define FILE_SHARE_VALID_FLAGS            0x00000007
       
   222 
       
   223 #define FILE_ATTRIBUTE_READONLY           0x00000001
       
   224 #define FILE_ATTRIBUTE_HIDDEN             0x00000002
       
   225 #define FILE_ATTRIBUTE_SYSTEM             0x00000004
       
   226 #define FILE_ATTRIBUTE_DIRECTORY          0x00000010
       
   227 #define FILE_ATTRIBUTE_ARCHIVE            0x00000020
       
   228 #define FILE_ATTRIBUTE_DEVICE             0x00000040
       
   229 #define FILE_ATTRIBUTE_NORMAL             0x00000080
       
   230 #define FILE_ATTRIBUTE_TEMPORARY          0x00000100
       
   231 #define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
       
   232 #define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
       
   233 #define FILE_ATTRIBUTE_COMPRESSED         0x00000800
       
   234 #define FILE_ATTRIBUTE_OFFLINE            0x00001000
       
   235 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
       
   236 #define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
       
   237 
       
   238 #define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
       
   239 #define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
       
   240 
       
   241 #define FILE_COPY_STRUCTURED_STORAGE      0x00000041
       
   242 #define FILE_STRUCTURED_STORAGE           0x00000441
       
   243 
       
   244 #define FILE_VALID_OPTION_FLAGS           0x00ffffff
       
   245 #define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
       
   246 #define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
       
   247 #define FILE_VALID_SET_FLAGS              0x00000036
       
   248 
       
   249 #define FILE_SUPERSEDE                    0x00000000
       
   250 #define FILE_OPEN                         0x00000001
       
   251 #define FILE_CREATE                       0x00000002
       
   252 #define FILE_OPEN_IF                      0x00000003
       
   253 #define FILE_OVERWRITE                    0x00000004
       
   254 #define FILE_OVERWRITE_IF                 0x00000005
       
   255 #define FILE_MAXIMUM_DISPOSITION          0x00000005
       
   256 
       
   257 #define FILE_DIRECTORY_FILE               0x00000001
       
   258 #define FILE_WRITE_THROUGH                0x00000002
       
   259 #define FILE_SEQUENTIAL_ONLY              0x00000004
       
   260 #define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
       
   261 #define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
       
   262 #define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
       
   263 #define FILE_NON_DIRECTORY_FILE           0x00000040
       
   264 #define FILE_CREATE_TREE_CONNECTION       0x00000080
       
   265 #define FILE_COMPLETE_IF_OPLOCKED         0x00000100
       
   266 #define FILE_NO_EA_KNOWLEDGE              0x00000200
       
   267 #define FILE_OPEN_FOR_RECOVERY            0x00000400
       
   268 #define FILE_RANDOM_ACCESS                0x00000800
       
   269 #define FILE_DELETE_ON_CLOSE              0x00001000
       
   270 #define FILE_OPEN_BY_FILE_ID              0x00002000
       
   271 #define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
       
   272 #define FILE_NO_COMPRESSION               0x00008000
       
   273 #define FILE_RESERVE_OPFILTER             0x00100000
       
   274 #define FILE_OPEN_REPARSE_POINT           0x00200000
       
   275 #define FILE_OPEN_NO_RECALL               0x00400000
       
   276 #define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
       
   277 
       
   278 #define FILE_ANY_ACCESS                   0x00000000
       
   279 #define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
       
   280 #define FILE_READ_ACCESS                  0x00000001
       
   281 #define FILE_WRITE_ACCESS                 0x00000002
       
   282 
       
   283 #define FILE_ALL_ACCESS \
       
   284   (STANDARD_RIGHTS_REQUIRED | \
       
   285    SYNCHRONIZE | \
       
   286    0x1FF)
       
   287 
       
   288 #define FILE_GENERIC_EXECUTE \
       
   289   (STANDARD_RIGHTS_EXECUTE | \
       
   290    FILE_READ_ATTRIBUTES | \
       
   291    FILE_EXECUTE | \
       
   292    SYNCHRONIZE)
       
   293 
       
   294 #define FILE_GENERIC_READ \
       
   295   (STANDARD_RIGHTS_READ | \
       
   296    FILE_READ_DATA | \
       
   297    FILE_READ_ATTRIBUTES | \
       
   298    FILE_READ_EA | \
       
   299    SYNCHRONIZE)
       
   300 
       
   301 #define FILE_GENERIC_WRITE \
       
   302   (STANDARD_RIGHTS_WRITE | \
       
   303    FILE_WRITE_DATA | \
       
   304    FILE_WRITE_ATTRIBUTES | \
       
   305    FILE_WRITE_EA | \
       
   306    FILE_APPEND_DATA | \
       
   307    SYNCHRONIZE)
       
   308 /* end winnt.h */
       
   309 
       
   310 #define DIRECTORY_QUERY (0x0001)
       
   311 #define DIRECTORY_TRAVERSE (0x0002)
       
   312 #define DIRECTORY_CREATE_OBJECT (0x0004)
       
   313 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
       
   314 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
       
   315   
       
   316 /* Exported object types */
       
   317 extern NTOSAPI POBJECT_TYPE ExDesktopObjectType;
       
   318 extern NTOSAPI POBJECT_TYPE ExEventObjectType;
       
   319 extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType;
       
   320 extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType;
       
   321 extern NTOSAPI POBJECT_TYPE IoAdapterObjectType;
       
   322 extern NTOSAPI ULONG IoDeviceHandlerObjectSize;
       
   323 extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType;
       
   324 extern NTOSAPI POBJECT_TYPE IoDeviceObjectType;
       
   325 extern NTOSAPI POBJECT_TYPE IoDriverObjectType;
       
   326 extern NTOSAPI POBJECT_TYPE IoFileObjectType;
       
   327 extern NTOSAPI POBJECT_TYPE LpcPortObjectType;
       
   328 extern NTOSAPI POBJECT_TYPE MmSectionObjectType;
       
   329 extern NTOSAPI POBJECT_TYPE SeTokenObjectType;
       
   330 
       
   331 extern NTOSAPI CCHAR KeNumberProcessors;
       
   332 extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable;
       
   333 extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable;
       
   334 
       
   335 
       
   336 /*
       
   337 ** IRP function codes
       
   338 */
       
   339 
       
   340 #define IRP_MJ_CREATE                     0x00
       
   341 #define IRP_MJ_CREATE_NAMED_PIPE          0x01
       
   342 #define IRP_MJ_CLOSE                      0x02
       
   343 #define IRP_MJ_READ                       0x03
       
   344 #define IRP_MJ_WRITE                      0x04
       
   345 #define IRP_MJ_QUERY_INFORMATION          0x05
       
   346 #define IRP_MJ_SET_INFORMATION            0x06
       
   347 #define IRP_MJ_QUERY_EA                   0x07
       
   348 #define IRP_MJ_SET_EA                     0x08
       
   349 #define IRP_MJ_FLUSH_BUFFERS              0x09
       
   350 #define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
       
   351 #define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
       
   352 #define IRP_MJ_DIRECTORY_CONTROL          0x0c
       
   353 #define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
       
   354 #define IRP_MJ_DEVICE_CONTROL             0x0e
       
   355 #define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
       
   356 #define IRP_MJ_SCSI                       0x0f
       
   357 #define IRP_MJ_SHUTDOWN                   0x10
       
   358 #define IRP_MJ_LOCK_CONTROL               0x11
       
   359 #define IRP_MJ_CLEANUP                    0x12
       
   360 #define IRP_MJ_CREATE_MAILSLOT            0x13
       
   361 #define IRP_MJ_QUERY_SECURITY             0x14
       
   362 #define IRP_MJ_SET_SECURITY               0x15
       
   363 #define IRP_MJ_POWER                      0x16
       
   364 #define IRP_MJ_SYSTEM_CONTROL             0x17
       
   365 #define IRP_MJ_DEVICE_CHANGE              0x18
       
   366 #define IRP_MJ_QUERY_QUOTA                0x19
       
   367 #define IRP_MJ_SET_QUOTA                  0x1a
       
   368 #define IRP_MJ_PNP                        0x1b
       
   369 #define IRP_MJ_PNP_POWER                  0x1b
       
   370 #define IRP_MJ_MAXIMUM_FUNCTION           0x1b
       
   371 
       
   372 #define IRP_MN_QUERY_DIRECTORY            0x01
       
   373 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY    0x02
       
   374 
       
   375 #define IRP_MN_USER_FS_REQUEST            0x00
       
   376 #define IRP_MN_MOUNT_VOLUME               0x01
       
   377 #define IRP_MN_VERIFY_VOLUME              0x02
       
   378 #define IRP_MN_LOAD_FILE_SYSTEM           0x03
       
   379 #define IRP_MN_TRACK_LINK                 0x04
       
   380 #define IRP_MN_KERNEL_CALL                0x04
       
   381 
       
   382 #define IRP_MN_LOCK                       0x01
       
   383 #define IRP_MN_UNLOCK_SINGLE              0x02
       
   384 #define IRP_MN_UNLOCK_ALL                 0x03
       
   385 #define IRP_MN_UNLOCK_ALL_BY_KEY          0x04
       
   386 
       
   387 #define IRP_MN_NORMAL                     0x00
       
   388 #define IRP_MN_DPC                        0x01
       
   389 #define IRP_MN_MDL                        0x02
       
   390 #define IRP_MN_COMPLETE                   0x04
       
   391 #define IRP_MN_COMPRESSED                 0x08
       
   392 
       
   393 #define IRP_MN_MDL_DPC                    (IRP_MN_MDL | IRP_MN_DPC)
       
   394 #define IRP_MN_COMPLETE_MDL               (IRP_MN_COMPLETE | IRP_MN_MDL)
       
   395 #define IRP_MN_COMPLETE_MDL_DPC           (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
       
   396 
       
   397 #define IRP_MN_SCSI_CLASS                 0x01
       
   398 
       
   399 #define IRP_MN_START_DEVICE               0x00
       
   400 #define IRP_MN_QUERY_REMOVE_DEVICE        0x01
       
   401 #define IRP_MN_REMOVE_DEVICE              0x02
       
   402 #define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
       
   403 #define IRP_MN_STOP_DEVICE                0x04
       
   404 #define IRP_MN_QUERY_STOP_DEVICE          0x05
       
   405 #define IRP_MN_CANCEL_STOP_DEVICE         0x06
       
   406 
       
   407 #define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
       
   408 #define IRP_MN_QUERY_INTERFACE              0x08
       
   409 #define IRP_MN_QUERY_CAPABILITIES           0x09
       
   410 #define IRP_MN_QUERY_RESOURCES              0x0A
       
   411 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
       
   412 #define IRP_MN_QUERY_DEVICE_TEXT            0x0C
       
   413 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
       
   414 
       
   415 #define IRP_MN_READ_CONFIG                  0x0F
       
   416 #define IRP_MN_WRITE_CONFIG                 0x10
       
   417 #define IRP_MN_EJECT                        0x11
       
   418 #define IRP_MN_SET_LOCK                     0x12
       
   419 #define IRP_MN_QUERY_ID                     0x13
       
   420 #define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
       
   421 #define IRP_MN_QUERY_BUS_INFORMATION        0x15
       
   422 #define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
       
   423 #define IRP_MN_SURPRISE_REMOVAL             0x17
       
   424 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
       
   425 
       
   426 #define IRP_MN_WAIT_WAKE                  0x00
       
   427 #define IRP_MN_POWER_SEQUENCE             0x01
       
   428 #define IRP_MN_SET_POWER                  0x02
       
   429 #define IRP_MN_QUERY_POWER                0x03
       
   430 
       
   431 #define IRP_MN_QUERY_ALL_DATA             0x00
       
   432 #define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
       
   433 #define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
       
   434 #define IRP_MN_CHANGE_SINGLE_ITEM         0x03
       
   435 #define IRP_MN_ENABLE_EVENTS              0x04
       
   436 #define IRP_MN_DISABLE_EVENTS             0x05
       
   437 #define IRP_MN_ENABLE_COLLECTION          0x06
       
   438 #define IRP_MN_DISABLE_COLLECTION         0x07
       
   439 #define IRP_MN_REGINFO                    0x08
       
   440 #define IRP_MN_EXECUTE_METHOD             0x09
       
   441 
       
   442 #define IRP_MN_REGINFO_EX                 0x0b
       
   443 
       
   444 typedef enum _IO_ALLOCATION_ACTION {
       
   445   KeepObject = 1,
       
   446   DeallocateObject,
       
   447   DeallocateObjectKeepRegisters
       
   448 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
       
   449 
       
   450 typedef IO_ALLOCATION_ACTION
       
   451 (DDKAPI *PDRIVER_CONTROL)(
       
   452   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
       
   453   /*IN*/ struct _IRP  *Irp,
       
   454   /*IN*/ PVOID  MapRegisterBase,
       
   455   /*IN*/ PVOID  Context);
       
   456 
       
   457 typedef VOID
       
   458 (DDKAPI *PDRIVER_LIST_CONTROL)(
       
   459   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
       
   460   /*IN*/ struct _IRP  *Irp,
       
   461   /*IN*/ struct _SCATTER_GATHER_LIST  *ScatterGather,
       
   462   /*IN*/ PVOID  Context);
       
   463 
       
   464 typedef NTSTATUS
       
   465 (DDKAPI *PDRIVER_ADD_DEVICE)(
       
   466   /*IN*/ struct _DRIVER_OBJECT  *DriverObject,
       
   467   /*IN*/ struct _DEVICE_OBJECT  *PhysicalDeviceObject);
       
   468 
       
   469 typedef NTSTATUS
       
   470 (DDKAPI *PIO_COMPLETION_ROUTINE)(
       
   471   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
       
   472   /*IN*/ struct _IRP  *Irp,
       
   473   /*IN*/ PVOID  Context);
       
   474 
       
   475 typedef VOID
       
   476 (DDKAPI *PDRIVER_CANCEL)(
       
   477   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
       
   478   /*IN*/ struct _IRP  *Irp);
       
   479 
       
   480 typedef VOID
       
   481 (DDKAPI *PKDEFERRED_ROUTINE)(
       
   482   /*IN*/ struct _KDPC  *Dpc,
       
   483   /*IN*/ PVOID  DeferredContext,
       
   484   /*IN*/ PVOID  SystemArgument1,
       
   485   /*IN*/ PVOID  SystemArgument2);
       
   486 
       
   487 typedef NTSTATUS
       
   488 (DDKAPI *PDRIVER_DISPATCH)(
       
   489   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
       
   490   /*IN*/ struct _IRP  *Irp);
       
   491 
       
   492 typedef VOID
       
   493 (DDKAPI *PIO_DPC_ROUTINE)(
       
   494   /*IN*/ struct _KDPC  *Dpc,
       
   495   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
       
   496   /*IN*/ struct _IRP  *Irp,
       
   497   /*IN*/ PVOID  Context);
       
   498 
       
   499 typedef NTSTATUS
       
   500 (DDKAPI *PMM_DLL_INITIALIZE)(
       
   501   /*IN*/ PUNICODE_STRING  RegistryPath);
       
   502 
       
   503 typedef NTSTATUS
       
   504 (DDKAPI *PMM_DLL_UNLOAD)(
       
   505   VOID);
       
   506 
       
   507 typedef NTSTATUS
       
   508 (DDKAPI *PDRIVER_ENTRY)( 
       
   509   /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
       
   510   /*IN*/ PUNICODE_STRING  RegistryPath); 
       
   511 
       
   512 typedef NTSTATUS
       
   513 (DDKAPI *PDRIVER_INITIALIZE)(
       
   514   /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
       
   515   /*IN*/ PUNICODE_STRING  RegistryPath);
       
   516 
       
   517 typedef BOOLEAN
       
   518 (DDKAPI *PKSERVICE_ROUTINE)(
       
   519   /*IN*/ struct _KINTERRUPT  *Interrupt,
       
   520   /*IN*/ PVOID  ServiceContext);
       
   521 
       
   522 typedef VOID
       
   523 (DDKAPI *PIO_TIMER_ROUTINE)(
       
   524   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
       
   525   /*IN*/ PVOID  Context);
       
   526 
       
   527 typedef VOID
       
   528 (DDKAPI *PDRIVER_REINITIALIZE)( 
       
   529   /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
       
   530   /*IN*/ PVOID  Context, 
       
   531   /*IN*/ ULONG  Count); 
       
   532 
       
   533 typedef NTSTATUS
       
   534 (DDKAPI *PDRIVER_STARTIO)(
       
   535   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
       
   536   /*IN*/ struct _IRP  *Irp);
       
   537 
       
   538 typedef BOOLEAN
       
   539 (DDKAPI *PKSYNCHRONIZE_ROUTINE)(
       
   540   /*IN*/ PVOID  SynchronizeContext);
       
   541 
       
   542 typedef VOID
       
   543 (DDKAPI *PDRIVER_UNLOAD)( 
       
   544   /*IN*/ struct _DRIVER_OBJECT  *DriverObject); 
       
   545 
       
   546 
       
   547 
       
   548 /*
       
   549 ** Plug and Play structures
       
   550 */
       
   551 
       
   552 typedef VOID DDKAPI
       
   553 (*PINTERFACE_REFERENCE)(
       
   554   PVOID  Context);
       
   555 
       
   556 typedef VOID DDKAPI
       
   557 (*PINTERFACE_DEREFERENCE)(
       
   558   PVOID Context);
       
   559 
       
   560 typedef BOOLEAN DDKAPI
       
   561 (*PTRANSLATE_BUS_ADDRESS)(
       
   562   /*IN*/ PVOID  Context,
       
   563   /*IN*/ PHYSICAL_ADDRESS  BusAddress,
       
   564   /*IN*/ ULONG  Length,
       
   565   /*IN OUT*/ PULONG  AddressSpace,
       
   566   /*OUT*/ PPHYSICAL_ADDRESS  TranslatedAddress);
       
   567 
       
   568 typedef struct _DMA_ADAPTER* DDKAPI
       
   569 (*PGET_DMA_ADAPTER)(
       
   570   /*IN*/ PVOID  Context,
       
   571   /*IN*/ struct _DEVICE_DESCRIPTION  *DeviceDescriptor,
       
   572   /*OUT*/ PULONG  NumberOfMapRegisters);
       
   573 
       
   574 typedef ULONG DDKAPI
       
   575 (*PGET_SET_DEVICE_DATA)(
       
   576   /*IN*/ PVOID  Context,
       
   577   /*IN*/ ULONG  DataType,
       
   578   /*IN*/ PVOID  Buffer,
       
   579   /*IN*/ ULONG  Offset,
       
   580   /*IN*/ ULONG  Length);
       
   581 
       
   582 typedef union _POWER_STATE {
       
   583   SYSTEM_POWER_STATE  SystemState;
       
   584   DEVICE_POWER_STATE  DeviceState;
       
   585 } POWER_STATE, *PPOWER_STATE;
       
   586 
       
   587 typedef enum _POWER_STATE_TYPE {
       
   588   SystemPowerState,
       
   589   DevicePowerState
       
   590 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
       
   591 
       
   592 typedef struct _BUS_INTERFACE_STANDARD {
       
   593   USHORT  Size;
       
   594   USHORT  Version;
       
   595   PVOID  Context;
       
   596   PINTERFACE_REFERENCE  InterfaceReference;
       
   597   PINTERFACE_DEREFERENCE  InterfaceDereference;
       
   598   PTRANSLATE_BUS_ADDRESS  TranslateBusAddress;
       
   599   PGET_DMA_ADAPTER  GetDmaAdapter;
       
   600   PGET_SET_DEVICE_DATA  SetBusData;
       
   601   PGET_SET_DEVICE_DATA  GetBusData;
       
   602 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
       
   603 
       
   604 typedef struct _DEVICE_CAPABILITIES {
       
   605   USHORT  Size;
       
   606   USHORT  Version;
       
   607   ULONG  DeviceD1 : 1;
       
   608   ULONG  DeviceD2 : 1;
       
   609   ULONG  LockSupported : 1;
       
   610   ULONG  EjectSupported : 1;
       
   611   ULONG  Removable : 1;
       
   612   ULONG  DockDevice : 1;
       
   613   ULONG  UniqueID : 1;
       
   614   ULONG  SilentInstall : 1;
       
   615   ULONG  RawDeviceOK : 1;
       
   616   ULONG  SurpriseRemovalOK : 1;
       
   617   ULONG  WakeFromD0 : 1;
       
   618   ULONG  WakeFromD1 : 1;
       
   619   ULONG  WakeFromD2 : 1;
       
   620   ULONG  WakeFromD3 : 1;
       
   621   ULONG  HardwareDisabled : 1;
       
   622   ULONG  NonDynamic : 1;
       
   623   ULONG  WarmEjectSupported : 1;
       
   624   ULONG  NoDisplayInUI : 1;
       
   625   ULONG  Reserved : 14;
       
   626   ULONG  Address;
       
   627   ULONG  UINumber;
       
   628   DEVICE_POWER_STATE  DeviceState[PowerSystemMaximum];
       
   629   SYSTEM_POWER_STATE  SystemWake;
       
   630   DEVICE_POWER_STATE  DeviceWake;
       
   631   ULONG  D1Latency;
       
   632   ULONG  D2Latency;
       
   633   ULONG  D3Latency;
       
   634 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
       
   635 
       
   636 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
       
   637   USHORT  Version;
       
   638   USHORT  Size;
       
   639   GUID  Event;
       
   640   GUID  InterfaceClassGuid;
       
   641   PUNICODE_STRING  SymbolicLinkName;
       
   642 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
       
   643 
       
   644 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
       
   645   USHORT  Version;
       
   646   USHORT  Size;
       
   647   GUID  Event;
       
   648 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
       
   649 
       
   650 #undef INTERFACE
       
   651 
       
   652 typedef struct _INTERFACE {
       
   653   USHORT  Size;
       
   654   USHORT  Version;
       
   655   PVOID  Context;
       
   656   PINTERFACE_REFERENCE  InterfaceReference;
       
   657   PINTERFACE_DEREFERENCE  InterfaceDereference;
       
   658 } INTERFACE, *PINTERFACE; 
       
   659 
       
   660 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
       
   661   USHORT  Version; 
       
   662   USHORT  Size; 
       
   663   GUID  Event;
       
   664 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
       
   665 
       
   666 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
       
   667 
       
   668 /* PNP_DEVICE_STATE */
       
   669 
       
   670 #define PNP_DEVICE_DISABLED                      0x00000001
       
   671 #define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
       
   672 #define PNP_DEVICE_FAILED                        0x00000004
       
   673 #define PNP_DEVICE_REMOVED                       0x00000008
       
   674 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
       
   675 #define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
       
   676 
       
   677 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
       
   678   USHORT  Version;
       
   679   USHORT  Size;
       
   680   GUID  Event;
       
   681   struct _FILE_OBJECT  *FileObject;
       
   682   LONG  NameBufferOffset;
       
   683   UCHAR  CustomDataBuffer[1];
       
   684 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
       
   685 
       
   686 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
       
   687   USHORT  Version;
       
   688   USHORT  Size;
       
   689   GUID  Event;
       
   690   struct _FILE_OBJECT  *FileObject;
       
   691 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
       
   692 
       
   693 typedef enum _BUS_QUERY_ID_TYPE {
       
   694   BusQueryDeviceID,
       
   695   BusQueryHardwareIDs,
       
   696   BusQueryCompatibleIDs,
       
   697   BusQueryInstanceID,
       
   698   BusQueryDeviceSerialNumber
       
   699 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
       
   700 
       
   701 typedef enum _DEVICE_TEXT_TYPE {
       
   702   DeviceTextDescription,
       
   703   DeviceTextLocationInformation
       
   704 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
       
   705 
       
   706 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
       
   707   DeviceUsageTypeUndefined,
       
   708   DeviceUsageTypePaging,
       
   709   DeviceUsageTypeHibernation,
       
   710   DeviceUsageTypeDumpFile
       
   711 } DEVICE_USAGE_NOTIFICATION_TYPE;
       
   712 
       
   713 typedef struct _POWER_SEQUENCE {
       
   714   ULONG  SequenceD1;
       
   715   ULONG  SequenceD2;
       
   716   ULONG  SequenceD3;
       
   717 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
       
   718 
       
   719 typedef enum {
       
   720   DevicePropertyDeviceDescription,
       
   721   DevicePropertyHardwareID,
       
   722   DevicePropertyCompatibleIDs,
       
   723   DevicePropertyBootConfiguration,
       
   724   DevicePropertyBootConfigurationTranslated,
       
   725   DevicePropertyClassName,
       
   726   DevicePropertyClassGuid,
       
   727   DevicePropertyDriverKeyName,
       
   728   DevicePropertyManufacturer,
       
   729   DevicePropertyFriendlyName,
       
   730   DevicePropertyLocationInformation,
       
   731   DevicePropertyPhysicalDeviceObjectName,
       
   732   DevicePropertyBusTypeGuid,
       
   733   DevicePropertyLegacyBusType,
       
   734   DevicePropertyBusNumber,
       
   735   DevicePropertyEnumeratorName,
       
   736   DevicePropertyAddress,
       
   737   DevicePropertyUINumber,
       
   738   DevicePropertyInstallState,
       
   739   DevicePropertyRemovalPolicy
       
   740 } DEVICE_REGISTRY_PROPERTY;
       
   741 
       
   742 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
       
   743   EventCategoryReserved,
       
   744   EventCategoryHardwareProfileChange,
       
   745   EventCategoryDeviceInterfaceChange,
       
   746   EventCategoryTargetDeviceChange
       
   747 } IO_NOTIFICATION_EVENT_CATEGORY;
       
   748 
       
   749 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
       
   750 
       
   751 typedef NTSTATUS DDKAPI
       
   752 (*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
       
   753   /*IN*/ PVOID NotificationStructure,
       
   754   /*IN*/ PVOID Context);
       
   755 
       
   756 typedef VOID DDKAPI
       
   757 (*PDEVICE_CHANGE_COMPLETE_CALLBACK)(
       
   758   /*IN*/ PVOID Context);
       
   759 
       
   760 
       
   761 
       
   762 /*
       
   763 ** System structures
       
   764 */
       
   765 
       
   766 #define SYMBOLIC_LINK_QUERY               0x0001
       
   767 #define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)
       
   768 
       
   769 /* also in winnt,h */
       
   770 #define DUPLICATE_CLOSE_SOURCE            0x00000001
       
   771 #define DUPLICATE_SAME_ACCESS             0x00000002
       
   772 #define DUPLICATE_SAME_ATTRIBUTES         0x00000004
       
   773 /* end winnt.h */
       
   774 
       
   775 typedef struct _OBJECT_NAME_INFORMATION {               
       
   776   UNICODE_STRING  Name;                                
       
   777 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;   
       
   778 
       
   779 typedef VOID DDKAPI
       
   780 (*PIO_APC_ROUTINE)(
       
   781   /*IN*/ PVOID ApcContext,
       
   782   /*IN*/ PIO_STATUS_BLOCK IoStatusBlock,
       
   783   /*IN*/ ULONG Reserved);
       
   784 
       
   785 typedef struct _IO_STATUS_BLOCK {
       
   786   _ANONYMOUS_UNION union {
       
   787     NTSTATUS  Status;
       
   788     PVOID  Pointer;
       
   789   } DUMMYUNIONNAME;
       
   790   ULONG_PTR  Information;
       
   791 } IO_STATUS_BLOCK;
       
   792 
       
   793 typedef VOID DDKAPI
       
   794 (*PKNORMAL_ROUTINE)(
       
   795   /*IN*/ PVOID  NormalContext,
       
   796   /*IN*/ PVOID  SystemArgument1,
       
   797   /*IN*/ PVOID  SystemArgument2);
       
   798 
       
   799 typedef VOID DDKAPI
       
   800 (*PKKERNEL_ROUTINE)(
       
   801   /*IN*/ struct _KAPC  *Apc,
       
   802   /*IN OUT*/ PKNORMAL_ROUTINE  *NormalRoutine,
       
   803   /*IN OUT*/ PVOID  *NormalContext,
       
   804   /*IN OUT*/ PVOID  *SystemArgument1,
       
   805   /*IN OUT*/ PVOID  *SystemArgument2);
       
   806 
       
   807 typedef VOID DDKAPI
       
   808 (*PKRUNDOWN_ROUTINE)(
       
   809   /*IN*/ struct _KAPC  *Apc);
       
   810 
       
   811 typedef BOOLEAN DDKAPI
       
   812 (*PKTRANSFER_ROUTINE)(
       
   813   VOID);
       
   814 
       
   815 typedef struct _KAPC {
       
   816   CSHORT  Type;
       
   817   CSHORT  Size;
       
   818   ULONG  Spare0;
       
   819   struct _KTHREAD  *Thread;
       
   820   LIST_ENTRY  ApcListEntry;
       
   821   PKKERNEL_ROUTINE  KernelRoutine;
       
   822   PKRUNDOWN_ROUTINE  RundownRoutine;
       
   823   PKNORMAL_ROUTINE  NormalRoutine;
       
   824   PVOID  NormalContext;
       
   825   PVOID  SystemArgument1;
       
   826   PVOID  SystemArgument2;
       
   827   CCHAR  ApcStateIndex;
       
   828   KPROCESSOR_MODE  ApcMode;
       
   829   BOOLEAN  Inserted;
       
   830 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
       
   831 
       
   832 typedef struct _KDEVICE_QUEUE {
       
   833   CSHORT  Type;
       
   834   CSHORT  Size;
       
   835   LIST_ENTRY  DeviceListHead;
       
   836   KSPIN_LOCK  Lock;
       
   837   BOOLEAN  Busy;
       
   838 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
       
   839 
       
   840 typedef struct _KDEVICE_QUEUE_ENTRY {
       
   841   LIST_ENTRY  DeviceListEntry;
       
   842   ULONG  SortKey;
       
   843   BOOLEAN  Inserted;
       
   844 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
       
   845 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
       
   846 
       
   847 #define LOCK_QUEUE_WAIT                   1
       
   848 #define LOCK_QUEUE_OWNER                  2
       
   849 
       
   850 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
       
   851   LockQueueDispatcherLock,
       
   852   LockQueueContextSwapLock,
       
   853   LockQueuePfnLock,
       
   854   LockQueueSystemSpaceLock,
       
   855   LockQueueVacbLock,
       
   856   LockQueueMasterLock,
       
   857   LockQueueNonPagedPoolLock,
       
   858   LockQueueIoCancelLock,
       
   859   LockQueueWorkQueueLock,
       
   860   LockQueueIoVpbLock,
       
   861   LockQueueIoDatabaseLock,
       
   862   LockQueueIoCompletionLock,
       
   863   LockQueueNtfsStructLock,
       
   864   LockQueueAfdWorkQueueLock,
       
   865   LockQueueBcbLock,
       
   866   LockQueueMaximumLock
       
   867 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
       
   868 
       
   869 typedef struct _KSPIN_LOCK_QUEUE {
       
   870   struct _KSPIN_LOCK_QUEUE  *VOLATILE Next;
       
   871   PKSPIN_LOCK VOLATILE  Lock;
       
   872 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
       
   873 
       
   874 typedef struct _KLOCK_QUEUE_HANDLE {
       
   875   KSPIN_LOCK_QUEUE  LockQueue;
       
   876   KIRQL  OldIrql;
       
   877 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
       
   878 
       
   879 typedef struct _KDPC {
       
   880   CSHORT  Type;
       
   881   UCHAR  Number;
       
   882   UCHAR  Importance;
       
   883   LIST_ENTRY  DpcListEntry;
       
   884   PKDEFERRED_ROUTINE  DeferredRoutine;
       
   885   PVOID  DeferredContext;
       
   886   PVOID  SystemArgument1;
       
   887   PVOID  SystemArgument2;
       
   888   PULONG_PTR  Lock;
       
   889 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
       
   890 
       
   891 typedef struct _WAIT_CONTEXT_BLOCK {
       
   892   KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
       
   893   struct _DRIVER_CONTROL  *DeviceRoutine;
       
   894   PVOID  DeviceContext;
       
   895   ULONG  NumberOfMapRegisters;
       
   896   PVOID  DeviceObject;
       
   897   PVOID  CurrentIrp;
       
   898   PKDPC  BufferChainingDpc;
       
   899 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
       
   900 
       
   901 typedef struct _DISPATCHER_HEADER {
       
   902   UCHAR  Type;
       
   903   UCHAR  Absolute;
       
   904   UCHAR  Size;
       
   905   UCHAR  Inserted;
       
   906   LONG  SignalState;
       
   907   LIST_ENTRY  WaitListHead;
       
   908 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
       
   909 
       
   910 typedef struct _KEVENT {
       
   911   DISPATCHER_HEADER  Header;
       
   912 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
       
   913 
       
   914 typedef struct _KSEMAPHORE {
       
   915     DISPATCHER_HEADER Header;
       
   916     LONG Limit;
       
   917 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
       
   918 
       
   919 typedef struct _FAST_MUTEX {
       
   920   LONG  Count;
       
   921   struct _KTHREAD  *Owner;
       
   922   ULONG  Contention;
       
   923   KEVENT  Event;
       
   924   ULONG  OldIrql;
       
   925 } FAST_MUTEX, *PFAST_MUTEX;
       
   926 
       
   927 typedef struct _KTIMER {
       
   928   DISPATCHER_HEADER  Header;
       
   929   ULARGE_INTEGER  DueTime;
       
   930   LIST_ENTRY  TimerListEntry;
       
   931   struct _KDPC  *Dpc;
       
   932   LONG  Period;
       
   933 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
       
   934 
       
   935 typedef struct _KMUTANT {
       
   936   DISPATCHER_HEADER  Header;
       
   937   LIST_ENTRY  MutantListEntry;
       
   938   struct _KTHREAD  *RESTRICTED_POINTER OwnerThread;
       
   939   BOOLEAN  Abandoned;
       
   940   UCHAR  ApcDisable;
       
   941 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
       
   942 
       
   943 typedef enum _TIMER_TYPE {
       
   944   NotificationTimer,
       
   945   SynchronizationTimer
       
   946 } TIMER_TYPE;
       
   947 
       
   948 #define EVENT_INCREMENT                   1
       
   949 #define IO_NO_INCREMENT                   0
       
   950 #define IO_CD_ROM_INCREMENT               1
       
   951 #define IO_DISK_INCREMENT                 1
       
   952 #define IO_KEYBOARD_INCREMENT             6
       
   953 #define IO_MAILSLOT_INCREMENT             2
       
   954 #define IO_MOUSE_INCREMENT                6
       
   955 #define IO_NAMED_PIPE_INCREMENT           2
       
   956 #define IO_NETWORK_INCREMENT              2
       
   957 #define IO_PARALLEL_INCREMENT             1
       
   958 #define IO_SERIAL_INCREMENT               2
       
   959 #define IO_SOUND_INCREMENT                8
       
   960 #define IO_VIDEO_INCREMENT                1
       
   961 #define SEMAPHORE_INCREMENT               1
       
   962 
       
   963 typedef struct _IRP {
       
   964   CSHORT  Type;
       
   965   USHORT  Size;
       
   966   struct _MDL  *MdlAddress;
       
   967   ULONG  Flags;
       
   968   union {
       
   969     struct _IRP  *MasterIrp;
       
   970     LONG  IrpCount;
       
   971     PVOID  SystemBuffer;
       
   972   } AssociatedIrp;
       
   973   LIST_ENTRY  ThreadListEntry;
       
   974   IO_STATUS_BLOCK  IoStatus;
       
   975   KPROCESSOR_MODE  RequestorMode;
       
   976   BOOLEAN  PendingReturned;
       
   977   CHAR  StackCount;
       
   978   CHAR  CurrentLocation;
       
   979   BOOLEAN  Cancel;
       
   980   KIRQL  CancelIrql;
       
   981   CCHAR  ApcEnvironment;
       
   982   UCHAR  AllocationFlags;
       
   983   PIO_STATUS_BLOCK  UserIosb;
       
   984   PKEVENT  UserEvent;
       
   985   union {
       
   986     struct {
       
   987       PIO_APC_ROUTINE  UserApcRoutine;
       
   988       PVOID  UserApcContext;
       
   989     } AsynchronousParameters;
       
   990     LARGE_INTEGER  AllocationSize;
       
   991   } Overlay;
       
   992   PDRIVER_CANCEL  CancelRoutine;
       
   993   PVOID  UserBuffer;
       
   994   union {
       
   995     struct {
       
   996       _ANONYMOUS_UNION union {
       
   997         KDEVICE_QUEUE_ENTRY  DeviceQueueEntry;
       
   998         _ANONYMOUS_STRUCT struct {
       
   999           PVOID  DriverContext[4];
       
  1000         } DUMMYSTRUCTNAME;
       
  1001       } DUMMYUNIONNAME;
       
  1002       PETHREAD  Thread;
       
  1003       PCHAR  AuxiliaryBuffer;
       
  1004       _ANONYMOUS_STRUCT struct {
       
  1005         LIST_ENTRY  ListEntry;
       
  1006         _ANONYMOUS_UNION union {
       
  1007           struct _IO_STACK_LOCATION  *CurrentStackLocation;
       
  1008           ULONG  PacketType;
       
  1009         } DUMMYUNIONNAME;
       
  1010       } DUMMYSTRUCTNAME;
       
  1011       struct _FILE_OBJECT  *OriginalFileObject;
       
  1012     } Overlay;
       
  1013     KAPC  Apc;
       
  1014     PVOID  CompletionKey;
       
  1015   } Tail;
       
  1016 } IRP;
       
  1017 typedef struct _IRP *PIRP;
       
  1018 
       
  1019 /* IRP.Flags */
       
  1020 
       
  1021 #define SL_FORCE_ACCESS_CHECK             0x01
       
  1022 #define SL_OPEN_PAGING_FILE               0x02
       
  1023 #define SL_OPEN_TARGET_DIRECTORY          0x04
       
  1024 #define SL_CASE_SENSITIVE                 0x80
       
  1025 
       
  1026 #define SL_KEY_SPECIFIED                  0x01
       
  1027 #define SL_OVERRIDE_VERIFY_VOLUME         0x02
       
  1028 #define SL_WRITE_THROUGH                  0x04
       
  1029 #define SL_FT_SEQUENTIAL_WRITE            0x08
       
  1030 
       
  1031 #define SL_FAIL_IMMEDIATELY               0x01
       
  1032 #define SL_EXCLUSIVE_LOCK                 0x02
       
  1033 
       
  1034 #define SL_RESTART_SCAN                   0x01
       
  1035 #define SL_RETURN_SINGLE_ENTRY            0x02
       
  1036 #define SL_INDEX_SPECIFIED                0x04
       
  1037 
       
  1038 #define SL_WATCH_TREE                     0x01
       
  1039 
       
  1040 #define SL_ALLOW_RAW_MOUNT                0x01
       
  1041 
       
  1042 #define CTL_CODE(DeviceType, Function, Method, Access)( \
       
  1043   ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
       
  1044 
       
  1045 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
       
  1046 
       
  1047 enum
       
  1048 {
       
  1049    IRP_NOCACHE = 0x1,
       
  1050    IRP_PAGING_IO = 0x2,
       
  1051    IRP_MOUNT_COMPLETION = 0x2,
       
  1052    IRP_SYNCHRONOUS_API = 0x4,
       
  1053    IRP_ASSOCIATED_IRP = 0x8,
       
  1054    IRP_BUFFERED_IO = 0x10,
       
  1055    IRP_DEALLOCATE_BUFFER = 0x20,
       
  1056    IRP_INPUT_OPERATION = 0x40,
       
  1057    IRP_SYNCHRONOUS_PAGING_IO = 0x40,
       
  1058    IRP_CREATE_OPERATION = 0x80,
       
  1059    IRP_READ_OPERATION = 0x100,
       
  1060    IRP_WRITE_OPERATION = 0x200,
       
  1061    IRP_CLOSE_OPERATION = 0x400,
       
  1062    IRP_DEFER_IO_COMPLETION = 0x800,
       
  1063    IRP_OB_QUERY_NAME = 0x1000,
       
  1064    IRP_HOLD_DEVICE_QUEUE = 0x2000,
       
  1065    IRP_RETRY_IO_COMPLETION = 0x4000
       
  1066 };
       
  1067 
       
  1068 
       
  1069 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
       
  1070   ULONG  Signature;
       
  1071 } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
       
  1072 
       
  1073 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
       
  1074   GUID  DiskId;
       
  1075   LARGE_INTEGER  StartingUsableOffset;
       
  1076   LARGE_INTEGER  UsableLength;
       
  1077   ULONG  MaxPartitionCount;
       
  1078 } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
       
  1079 
       
  1080 typedef struct _PARTITION_INFORMATION_MBR {
       
  1081   UCHAR  PartitionType;
       
  1082   BOOLEAN  BootIndicator;
       
  1083   BOOLEAN  RecognizedPartition;
       
  1084   ULONG  HiddenSectors;
       
  1085 } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
       
  1086 
       
  1087 
       
  1088 typedef struct _BOOTDISK_INFORMATION {
       
  1089   LONGLONG  BootPartitionOffset;
       
  1090   LONGLONG  SystemPartitionOffset;
       
  1091   ULONG  BootDeviceSignature;
       
  1092   ULONG  SystemDeviceSignature;
       
  1093 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
       
  1094 
       
  1095 typedef struct _BOOTDISK_INFORMATION_EX {
       
  1096   LONGLONG  BootPartitionOffset;
       
  1097   LONGLONG  SystemPartitionOffset;
       
  1098   ULONG  BootDeviceSignature;
       
  1099   ULONG  SystemDeviceSignature;
       
  1100   GUID  BootDeviceGuid;
       
  1101   GUID  SystemDeviceGuid;
       
  1102   BOOLEAN  BootDeviceIsGpt;
       
  1103   BOOLEAN  SystemDeviceIsGpt;
       
  1104 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
       
  1105 
       
  1106 typedef struct _EISA_MEMORY_TYPE {
       
  1107   UCHAR  ReadWrite : 1;
       
  1108   UCHAR  Cached : 1;
       
  1109   UCHAR  Reserved0 : 1;
       
  1110   UCHAR  Type : 2;
       
  1111   UCHAR  Shared : 1;
       
  1112   UCHAR  Reserved1 : 1;
       
  1113   UCHAR  MoreEntries : 1;
       
  1114 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
       
  1115 
       
  1116 #include <pshpack1.h>
       
  1117 typedef struct _EISA_MEMORY_CONFIGURATION {
       
  1118   EISA_MEMORY_TYPE  ConfigurationByte;
       
  1119   UCHAR  DataSize;
       
  1120   USHORT  AddressLowWord;
       
  1121   UCHAR  AddressHighByte;
       
  1122   USHORT  MemorySize;
       
  1123 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
       
  1124 #include <poppack.h>
       
  1125 
       
  1126 typedef struct _EISA_IRQ_DESCRIPTOR {
       
  1127   UCHAR  Interrupt : 4;
       
  1128   UCHAR  Reserved : 1;
       
  1129   UCHAR  LevelTriggered : 1;
       
  1130   UCHAR  Shared : 1;
       
  1131   UCHAR  MoreEntries : 1;
       
  1132 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
       
  1133 
       
  1134 typedef struct _EISA_IRQ_CONFIGURATION {
       
  1135   EISA_IRQ_DESCRIPTOR  ConfigurationByte;
       
  1136   UCHAR  Reserved;
       
  1137 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
       
  1138 
       
  1139 typedef struct _DMA_CONFIGURATION_BYTE0 {
       
  1140   UCHAR Channel : 3;
       
  1141   UCHAR Reserved : 3;
       
  1142   UCHAR Shared : 1;
       
  1143   UCHAR MoreEntries : 1;
       
  1144 } DMA_CONFIGURATION_BYTE0;
       
  1145 
       
  1146 typedef struct _DMA_CONFIGURATION_BYTE1 {
       
  1147   UCHAR  Reserved0 : 2;
       
  1148   UCHAR  TransferSize : 2;
       
  1149   UCHAR  Timing : 2;
       
  1150   UCHAR  Reserved1 : 2;
       
  1151 } DMA_CONFIGURATION_BYTE1;
       
  1152 
       
  1153 typedef struct _EISA_DMA_CONFIGURATION {
       
  1154   DMA_CONFIGURATION_BYTE0  ConfigurationByte0;
       
  1155   DMA_CONFIGURATION_BYTE1  ConfigurationByte1;
       
  1156 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
       
  1157 
       
  1158 #include <pshpack1.h>
       
  1159 typedef struct _EISA_PORT_DESCRIPTOR {
       
  1160   UCHAR  NumberPorts : 5;
       
  1161   UCHAR  Reserved : 1;
       
  1162   UCHAR  Shared : 1;
       
  1163   UCHAR  MoreEntries : 1;
       
  1164 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
       
  1165 
       
  1166 typedef struct _EISA_PORT_CONFIGURATION {
       
  1167   EISA_PORT_DESCRIPTOR  Configuration;
       
  1168   USHORT  PortAddress;
       
  1169 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
       
  1170 #include <poppack.h>
       
  1171 
       
  1172 typedef struct _CM_EISA_FUNCTION_INFORMATION {
       
  1173   ULONG  CompressedId;
       
  1174   UCHAR  IdSlotFlags1;
       
  1175   UCHAR  IdSlotFlags2;
       
  1176   UCHAR  MinorRevision;
       
  1177   UCHAR  MajorRevision;
       
  1178   UCHAR  Selections[26];
       
  1179   UCHAR  FunctionFlags;
       
  1180   UCHAR  TypeString[80];
       
  1181   EISA_MEMORY_CONFIGURATION  EisaMemory[9];
       
  1182   EISA_IRQ_CONFIGURATION  EisaIrq[7];
       
  1183   EISA_DMA_CONFIGURATION  EisaDma[4];
       
  1184   EISA_PORT_CONFIGURATION  EisaPort[20];
       
  1185   UCHAR  InitializationData[60];
       
  1186 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
       
  1187 
       
  1188 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
       
  1189 
       
  1190 #define EISA_FUNCTION_ENABLED           0x80
       
  1191 #define EISA_FREE_FORM_DATA             0x40
       
  1192 #define EISA_HAS_PORT_INIT_ENTRY        0x20
       
  1193 #define EISA_HAS_PORT_RANGE             0x10
       
  1194 #define EISA_HAS_DMA_ENTRY              0x08
       
  1195 #define EISA_HAS_IRQ_ENTRY              0x04
       
  1196 #define EISA_HAS_MEMORY_ENTRY           0x02
       
  1197 #define EISA_HAS_TYPE_ENTRY             0x01
       
  1198 #define EISA_HAS_INFORMATION \
       
  1199   (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
       
  1200   + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
       
  1201 
       
  1202 typedef struct _CM_EISA_SLOT_INFORMATION {
       
  1203   UCHAR  ReturnCode;
       
  1204   UCHAR  ReturnFlags;
       
  1205   UCHAR  MajorRevision;
       
  1206   UCHAR  MinorRevision;
       
  1207   USHORT  Checksum;
       
  1208   UCHAR  NumberFunctions;
       
  1209   UCHAR  FunctionInformation;
       
  1210   ULONG  CompressedId;
       
  1211 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
       
  1212 
       
  1213 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
       
  1214 
       
  1215 #define EISA_INVALID_SLOT               0x80
       
  1216 #define EISA_INVALID_FUNCTION           0x81
       
  1217 #define EISA_INVALID_CONFIGURATION      0x82
       
  1218 #define EISA_EMPTY_SLOT                 0x83
       
  1219 #define EISA_INVALID_BIOS_CALL          0x86
       
  1220 
       
  1221 typedef struct _CM_FLOPPY_DEVICE_DATA {
       
  1222   USHORT  Version;
       
  1223   USHORT  Revision;
       
  1224   CHAR  Size[8];
       
  1225   ULONG  MaxDensity;
       
  1226   ULONG  MountDensity;
       
  1227   UCHAR  StepRateHeadUnloadTime;
       
  1228   UCHAR  HeadLoadTime;
       
  1229   UCHAR  MotorOffTime;
       
  1230   UCHAR  SectorLengthCode;
       
  1231   UCHAR  SectorPerTrack;
       
  1232   UCHAR  ReadWriteGapLength;
       
  1233   UCHAR  DataTransferLength;
       
  1234   UCHAR  FormatGapLength;
       
  1235   UCHAR  FormatFillCharacter;
       
  1236   UCHAR  HeadSettleTime;
       
  1237   UCHAR  MotorSettleTime;
       
  1238   UCHAR  MaximumTrackValue;
       
  1239   UCHAR  DataTransferRate;
       
  1240 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
       
  1241 
       
  1242 typedef enum _INTERFACE_TYPE {
       
  1243   InterfaceTypeUndefined = -1,
       
  1244   Internal,
       
  1245   Isa,
       
  1246   Eisa,
       
  1247   MicroChannel,
       
  1248   TurboChannel,
       
  1249   PCIBus,
       
  1250   VMEBus,
       
  1251   NuBus,
       
  1252   PCMCIABus,
       
  1253   CBus,
       
  1254   MPIBus,
       
  1255   MPSABus,
       
  1256   ProcessorInternal,
       
  1257   InternalPowerBus,
       
  1258   PNPISABus,
       
  1259   PNPBus,
       
  1260   MaximumInterfaceType
       
  1261 } INTERFACE_TYPE, *PINTERFACE_TYPE;
       
  1262 
       
  1263 typedef struct _PNP_BUS_INFORMATION {
       
  1264   GUID  BusTypeGuid;
       
  1265   INTERFACE_TYPE  LegacyBusType;
       
  1266   ULONG  BusNumber;
       
  1267 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
       
  1268 
       
  1269 #include <pshpack1.h>
       
  1270 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
       
  1271   UCHAR Type;
       
  1272   UCHAR ShareDisposition;
       
  1273   USHORT Flags;
       
  1274   union {
       
  1275     struct {
       
  1276       PHYSICAL_ADDRESS Start;
       
  1277       ULONG Length;
       
  1278     } Generic;
       
  1279     struct {
       
  1280       PHYSICAL_ADDRESS Start;
       
  1281       ULONG Length;
       
  1282     } Port;
       
  1283     struct {
       
  1284       ULONG Level;
       
  1285       ULONG Vector;
       
  1286       ULONG Affinity;
       
  1287     } Interrupt;
       
  1288     struct {
       
  1289       PHYSICAL_ADDRESS Start;
       
  1290       ULONG Length;
       
  1291     } Memory;
       
  1292     struct {
       
  1293       ULONG Channel;
       
  1294       ULONG Port;
       
  1295       ULONG Reserved1;
       
  1296     } Dma;
       
  1297     struct {
       
  1298       ULONG Data[3];
       
  1299     } DevicePrivate;
       
  1300     struct {
       
  1301       ULONG Start;
       
  1302       ULONG Length;
       
  1303       ULONG Reserved;
       
  1304     } BusNumber;
       
  1305     struct {
       
  1306       ULONG DataSize;
       
  1307       ULONG Reserved1;
       
  1308       ULONG Reserved2;
       
  1309     } DeviceSpecificData;
       
  1310   } u;
       
  1311 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
       
  1312 
       
  1313 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
       
  1314 
       
  1315 #define CmResourceTypeNull                0
       
  1316 #define CmResourceTypePort                1
       
  1317 #define CmResourceTypeInterrupt           2
       
  1318 #define CmResourceTypeMemory              3
       
  1319 #define CmResourceTypeDma                 4
       
  1320 #define CmResourceTypeDeviceSpecific      5
       
  1321 #define CmResourceTypeBusNumber           6
       
  1322 #define CmResourceTypeMaximum             7
       
  1323 #define CmResourceTypeNonArbitrated     128
       
  1324 #define CmResourceTypeConfigData        128
       
  1325 #define CmResourceTypeDevicePrivate     129
       
  1326 #define CmResourceTypePcCardConfig      130
       
  1327 #define CmResourceTypeMfCardConfig      131
       
  1328 
       
  1329 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
       
  1330 
       
  1331 typedef enum _CM_SHARE_DISPOSITION {
       
  1332   CmResourceShareUndetermined,
       
  1333   CmResourceShareDeviceExclusive,
       
  1334   CmResourceShareDriverExclusive,
       
  1335   CmResourceShareShared
       
  1336 } CM_SHARE_DISPOSITION;
       
  1337 
       
  1338 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
       
  1339 
       
  1340 #define CM_RESOURCE_PORT_MEMORY           0x0000
       
  1341 #define CM_RESOURCE_PORT_IO               0x0001
       
  1342 #define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
       
  1343 #define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
       
  1344 #define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
       
  1345 #define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
       
  1346 #define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
       
  1347 #define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
       
  1348 
       
  1349 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
       
  1350 
       
  1351 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
       
  1352 #define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
       
  1353 
       
  1354 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
       
  1355 
       
  1356 #define CM_RESOURCE_MEMORY_READ_WRITE     0x0000
       
  1357 #define CM_RESOURCE_MEMORY_READ_ONLY      0x0001
       
  1358 #define CM_RESOURCE_MEMORY_WRITE_ONLY     0x0002
       
  1359 #define CM_RESOURCE_MEMORY_PREFETCHABLE   0x0004
       
  1360 #define CM_RESOURCE_MEMORY_COMBINEDWRITE  0x0008
       
  1361 #define CM_RESOURCE_MEMORY_24             0x0010
       
  1362 #define CM_RESOURCE_MEMORY_CACHEABLE      0x0020
       
  1363 
       
  1364 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
       
  1365 
       
  1366 #define CM_RESOURCE_DMA_8                 0x0000
       
  1367 #define CM_RESOURCE_DMA_16                0x0001
       
  1368 #define CM_RESOURCE_DMA_32                0x0002
       
  1369 #define CM_RESOURCE_DMA_8_AND_16          0x0004
       
  1370 #define CM_RESOURCE_DMA_BUS_MASTER        0x0008
       
  1371 #define CM_RESOURCE_DMA_TYPE_A            0x0010
       
  1372 #define CM_RESOURCE_DMA_TYPE_B            0x0020
       
  1373 #define CM_RESOURCE_DMA_TYPE_F            0x0040
       
  1374 
       
  1375 typedef struct _CM_PARTIAL_RESOURCE_LIST {
       
  1376   USHORT  Version;
       
  1377   USHORT  Revision;
       
  1378   ULONG  Count;
       
  1379   CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
       
  1380 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
       
  1381 
       
  1382 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
       
  1383   INTERFACE_TYPE  InterfaceType;
       
  1384   ULONG  BusNumber;
       
  1385   CM_PARTIAL_RESOURCE_LIST  PartialResourceList;
       
  1386 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
       
  1387 
       
  1388 typedef struct _CM_RESOURCE_LIST {
       
  1389   ULONG  Count;
       
  1390   CM_FULL_RESOURCE_DESCRIPTOR  List[1];
       
  1391 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
       
  1392 
       
  1393 typedef struct _CM_INT13_DRIVE_PARAMETER {
       
  1394   USHORT  DriveSelect;
       
  1395   ULONG  MaxCylinders;
       
  1396   USHORT  SectorsPerTrack;
       
  1397   USHORT  MaxHeads;
       
  1398   USHORT  NumberDrives;
       
  1399 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
       
  1400 #include <poppack.h>
       
  1401 
       
  1402 typedef struct _CM_KEYBOARD_DEVICE_DATA {
       
  1403   USHORT  Version;
       
  1404   USHORT  Revision;
       
  1405   UCHAR  Type;
       
  1406   UCHAR  Subtype;
       
  1407   USHORT  KeyboardFlags;
       
  1408 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
       
  1409 
       
  1410 #define KEYBOARD_INSERT_ON                0x80
       
  1411 #define KEYBOARD_CAPS_LOCK_ON             0x40
       
  1412 #define KEYBOARD_NUM_LOCK_ON              0x20
       
  1413 #define KEYBOARD_SCROLL_LOCK_ON           0x10
       
  1414 #define KEYBOARD_ALT_KEY_DOWN             0x08
       
  1415 #define KEYBOARD_CTRL_KEY_DOWN            0x04
       
  1416 #define KEYBOARD_LEFT_SHIFT_DOWN          0x02
       
  1417 #define KEYBOARD_RIGHT_SHIFT_DOWN         0x01
       
  1418 
       
  1419 typedef struct _CM_MCA_POS_DATA {
       
  1420   USHORT  AdapterId;
       
  1421   UCHAR  PosData1;
       
  1422   UCHAR  PosData2;
       
  1423   UCHAR  PosData3;
       
  1424   UCHAR  PosData4;
       
  1425 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
       
  1426 
       
  1427 typedef struct CM_Power_Data_s {
       
  1428   ULONG  PD_Size;
       
  1429   DEVICE_POWER_STATE  PD_MostRecentPowerState;
       
  1430   ULONG  PD_Capabilities;
       
  1431   ULONG  PD_D1Latency;
       
  1432   ULONG  PD_D2Latency;
       
  1433   ULONG  PD_D3Latency;
       
  1434   DEVICE_POWER_STATE  PD_PowerStateMapping[PowerSystemMaximum];
       
  1435 } CM_POWER_DATA, *PCM_POWER_DATA;
       
  1436 
       
  1437 #define PDCAP_D0_SUPPORTED                0x00000001
       
  1438 #define PDCAP_D1_SUPPORTED                0x00000002
       
  1439 #define PDCAP_D2_SUPPORTED                0x00000004
       
  1440 #define PDCAP_D3_SUPPORTED                0x00000008
       
  1441 #define PDCAP_WAKE_FROM_D0_SUPPORTED      0x00000010
       
  1442 #define PDCAP_WAKE_FROM_D1_SUPPORTED      0x00000020
       
  1443 #define PDCAP_WAKE_FROM_D2_SUPPORTED      0x00000040
       
  1444 #define PDCAP_WAKE_FROM_D3_SUPPORTED      0x00000080
       
  1445 #define PDCAP_WARM_EJECT_SUPPORTED        0x00000100
       
  1446 
       
  1447 typedef struct _CM_SCSI_DEVICE_DATA {
       
  1448   USHORT  Version;
       
  1449   USHORT  Revision;
       
  1450   UCHAR  HostIdentifier;
       
  1451 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
       
  1452 
       
  1453 typedef struct _CM_SERIAL_DEVICE_DATA {
       
  1454   USHORT  Version;
       
  1455   USHORT  Revision;
       
  1456   ULONG  BaudClock;
       
  1457 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
       
  1458 
       
  1459 /* IO_RESOURCE_DESCRIPTOR.Option */
       
  1460 
       
  1461 #define IO_RESOURCE_PREFERRED             0x01
       
  1462 #define IO_RESOURCE_DEFAULT               0x02
       
  1463 #define IO_RESOURCE_ALTERNATIVE           0x08
       
  1464 
       
  1465 typedef struct _IO_RESOURCE_DESCRIPTOR {
       
  1466   UCHAR  Option;
       
  1467   UCHAR  Type;
       
  1468   UCHAR  ShareDisposition;
       
  1469   UCHAR  Spare1;
       
  1470   USHORT  Flags;
       
  1471   USHORT  Spare2;
       
  1472   union {
       
  1473     struct {
       
  1474       ULONG  Length;
       
  1475       ULONG  Alignment;
       
  1476       PHYSICAL_ADDRESS  MinimumAddress;
       
  1477       PHYSICAL_ADDRESS  MaximumAddress;
       
  1478     } Port;
       
  1479     struct {
       
  1480       ULONG  Length;
       
  1481       ULONG  Alignment;
       
  1482       PHYSICAL_ADDRESS  MinimumAddress;
       
  1483       PHYSICAL_ADDRESS  MaximumAddress;
       
  1484     } Memory;
       
  1485     struct {
       
  1486       ULONG  MinimumVector;
       
  1487       ULONG  MaximumVector;
       
  1488     } Interrupt;
       
  1489     struct {
       
  1490       ULONG  MinimumChannel;
       
  1491       ULONG  MaximumChannel;
       
  1492     } Dma;
       
  1493     struct {
       
  1494       ULONG  Length;
       
  1495       ULONG  Alignment;
       
  1496       PHYSICAL_ADDRESS  MinimumAddress;
       
  1497       PHYSICAL_ADDRESS  MaximumAddress;
       
  1498     } Generic;
       
  1499     struct {
       
  1500       ULONG  Data[3];
       
  1501     } DevicePrivate;
       
  1502     struct {
       
  1503       ULONG  Length;
       
  1504       ULONG  MinBusNumber;
       
  1505       ULONG  MaxBusNumber;
       
  1506       ULONG  Reserved;
       
  1507     } BusNumber;
       
  1508     struct {
       
  1509       ULONG  Priority;
       
  1510       ULONG  Reserved1;
       
  1511       ULONG  Reserved2;
       
  1512     } ConfigData;
       
  1513   } u;
       
  1514 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
       
  1515 
       
  1516 typedef struct _IO_RESOURCE_LIST {
       
  1517   USHORT  Version;
       
  1518   USHORT  Revision;
       
  1519   ULONG  Count;
       
  1520   IO_RESOURCE_DESCRIPTOR  Descriptors[1];
       
  1521 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
       
  1522 
       
  1523 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
       
  1524   ULONG  ListSize;
       
  1525   INTERFACE_TYPE  InterfaceType;
       
  1526   ULONG  BusNumber;
       
  1527   ULONG  SlotNumber;
       
  1528   ULONG  Reserved[3];
       
  1529   ULONG  AlternativeLists;
       
  1530   IO_RESOURCE_LIST  List[1];
       
  1531 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
       
  1532 
       
  1533 typedef struct _CONTROLLER_OBJECT {
       
  1534   CSHORT  Type;
       
  1535   CSHORT  Size;
       
  1536   PVOID  ControllerExtension;
       
  1537   KDEVICE_QUEUE  DeviceWaitQueue;
       
  1538   ULONG  Spare1;
       
  1539   LARGE_INTEGER  Spare2;
       
  1540 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
       
  1541 
       
  1542 typedef enum _DMA_WIDTH {
       
  1543   Width8Bits,
       
  1544   Width16Bits,
       
  1545   Width32Bits,
       
  1546   MaximumDmaWidth
       
  1547 } DMA_WIDTH, *PDMA_WIDTH;
       
  1548 
       
  1549 typedef enum _DMA_SPEED {
       
  1550   Compatible,
       
  1551   TypeA,
       
  1552   TypeB,
       
  1553   TypeC,
       
  1554   TypeF,
       
  1555   MaximumDmaSpeed
       
  1556 } DMA_SPEED, *PDMA_SPEED;
       
  1557 
       
  1558 /* DEVICE_DESCRIPTION.Version */
       
  1559 
       
  1560 #define DEVICE_DESCRIPTION_VERSION        0x0000
       
  1561 #define DEVICE_DESCRIPTION_VERSION1       0x0001
       
  1562 #define DEVICE_DESCRIPTION_VERSION2       0x0002
       
  1563 
       
  1564 typedef struct _DEVICE_DESCRIPTION {
       
  1565   ULONG  Version;
       
  1566   BOOLEAN  Master;
       
  1567   BOOLEAN  ScatterGather;
       
  1568   BOOLEAN  DemandMode;
       
  1569   BOOLEAN  AutoInitialize;
       
  1570   BOOLEAN  Dma32BitAddresses;
       
  1571   BOOLEAN  IgnoreCount;
       
  1572   BOOLEAN  Reserved1;
       
  1573   BOOLEAN  Dma64BitAddresses;
       
  1574   ULONG  BusNumber; 
       
  1575   ULONG  DmaChannel;
       
  1576   INTERFACE_TYPE  InterfaceType;
       
  1577   DMA_WIDTH  DmaWidth;
       
  1578   DMA_SPEED  DmaSpeed;
       
  1579   ULONG  MaximumLength;
       
  1580   ULONG  DmaPort;
       
  1581 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
       
  1582 
       
  1583 /* VPB.Flags */
       
  1584 #define VPB_MOUNTED                       0x0001
       
  1585 #define VPB_LOCKED                        0x0002
       
  1586 #define VPB_PERSISTENT                    0x0004
       
  1587 #define VPB_REMOVE_PENDING                0x0008
       
  1588 #define VPB_RAW_MOUNT                     0x0010
       
  1589 
       
  1590 #define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
       
  1591 
       
  1592 typedef struct _VPB {
       
  1593   CSHORT  Type;
       
  1594   CSHORT  Size;
       
  1595   USHORT  Flags;
       
  1596   USHORT  VolumeLabelLength;
       
  1597   struct _DEVICE_OBJECT  *DeviceObject;
       
  1598   struct _DEVICE_OBJECT  *RealDevice;
       
  1599   ULONG  SerialNumber;
       
  1600   ULONG  ReferenceCount;
       
  1601   WCHAR  VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
       
  1602 } VPB, *PVPB;
       
  1603 
       
  1604 /* DEVICE_OBJECT.Flags */
       
  1605 
       
  1606 #define DO_VERIFY_VOLUME                  0x00000002      
       
  1607 #define DO_BUFFERED_IO                    0x00000004      
       
  1608 #define DO_EXCLUSIVE                      0x00000008      
       
  1609 #define DO_DIRECT_IO                      0x00000010      
       
  1610 #define DO_MAP_IO_BUFFER                  0x00000020      
       
  1611 #define DO_DEVICE_HAS_NAME                0x00000040      
       
  1612 #define DO_DEVICE_INITIALIZING            0x00000080      
       
  1613 #define DO_SYSTEM_BOOT_PARTITION          0x00000100      
       
  1614 #define DO_LONG_TERM_REQUESTS             0x00000200      
       
  1615 #define DO_NEVER_LAST_DEVICE              0x00000400      
       
  1616 #define DO_SHUTDOWN_REGISTERED            0x00000800      
       
  1617 #define DO_BUS_ENUMERATED_DEVICE          0x00001000      
       
  1618 #define DO_POWER_PAGABLE                  0x00002000      
       
  1619 #define DO_POWER_INRUSH                   0x00004000      
       
  1620 #define DO_LOW_PRIORITY_FILESYSTEM        0x00010000      
       
  1621 
       
  1622 /* DEVICE_OBJECT.Characteristics */
       
  1623 
       
  1624 #define FILE_REMOVABLE_MEDIA            0x00000001
       
  1625 #define FILE_READ_ONLY_DEVICE           0x00000002
       
  1626 #define FILE_FLOPPY_DISKETTE            0x00000004
       
  1627 #define FILE_WRITE_ONCE_MEDIA           0x00000008
       
  1628 #define FILE_REMOTE_DEVICE              0x00000010
       
  1629 #define FILE_DEVICE_IS_MOUNTED          0x00000020
       
  1630 #define FILE_VIRTUAL_VOLUME             0x00000040
       
  1631 #define FILE_AUTOGENERATED_DEVICE_NAME  0x00000080
       
  1632 #define FILE_DEVICE_SECURE_OPEN         0x00000100
       
  1633 
       
  1634 /* DEVICE_OBJECT.AlignmentRequirement */
       
  1635 
       
  1636 #define FILE_BYTE_ALIGNMENT             0x00000000
       
  1637 #define FILE_WORD_ALIGNMENT             0x00000001
       
  1638 #define FILE_LONG_ALIGNMENT             0x00000003
       
  1639 #define FILE_QUAD_ALIGNMENT             0x00000007
       
  1640 #define FILE_OCTA_ALIGNMENT             0x0000000f
       
  1641 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
       
  1642 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
       
  1643 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
       
  1644 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
       
  1645 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
       
  1646 
       
  1647 /* DEVICE_OBJECT.DeviceType */
       
  1648 
       
  1649 #define DEVICE_TYPE ULONG
       
  1650 
       
  1651 #define FILE_DEVICE_BEEP                  0x00000001
       
  1652 #define FILE_DEVICE_CD_ROM                0x00000002
       
  1653 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
       
  1654 #define FILE_DEVICE_CONTROLLER            0x00000004
       
  1655 #define FILE_DEVICE_DATALINK              0x00000005
       
  1656 #define FILE_DEVICE_DFS                   0x00000006
       
  1657 #define FILE_DEVICE_DISK                  0x00000007
       
  1658 #define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
       
  1659 #define FILE_DEVICE_FILE_SYSTEM           0x00000009
       
  1660 #define FILE_DEVICE_INPORT_PORT           0x0000000a
       
  1661 #define FILE_DEVICE_KEYBOARD              0x0000000b
       
  1662 #define FILE_DEVICE_MAILSLOT              0x0000000c
       
  1663 #define FILE_DEVICE_MIDI_IN               0x0000000d
       
  1664 #define FILE_DEVICE_MIDI_OUT              0x0000000e
       
  1665 #define FILE_DEVICE_MOUSE                 0x0000000f
       
  1666 #define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
       
  1667 #define FILE_DEVICE_NAMED_PIPE            0x00000011
       
  1668 #define FILE_DEVICE_NETWORK               0x00000012
       
  1669 #define FILE_DEVICE_NETWORK_BROWSER       0x00000013
       
  1670 #define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
       
  1671 #define FILE_DEVICE_NULL                  0x00000015
       
  1672 #define FILE_DEVICE_PARALLEL_PORT         0x00000016
       
  1673 #define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
       
  1674 #define FILE_DEVICE_PRINTER               0x00000018
       
  1675 #define FILE_DEVICE_SCANNER               0x00000019
       
  1676 #define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
       
  1677 #define FILE_DEVICE_SERIAL_PORT           0x0000001b
       
  1678 #define FILE_DEVICE_SCREEN                0x0000001c
       
  1679 #define FILE_DEVICE_SOUND                 0x0000001d
       
  1680 #define FILE_DEVICE_STREAMS               0x0000001e
       
  1681 #define FILE_DEVICE_TAPE                  0x0000001f
       
  1682 #define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
       
  1683 #define FILE_DEVICE_TRANSPORT             0x00000021
       
  1684 #define FILE_DEVICE_UNKNOWN               0x00000022
       
  1685 #define FILE_DEVICE_VIDEO                 0x00000023
       
  1686 #define FILE_DEVICE_VIRTUAL_DISK          0x00000024
       
  1687 #define FILE_DEVICE_WAVE_IN               0x00000025
       
  1688 #define FILE_DEVICE_WAVE_OUT              0x00000026
       
  1689 #define FILE_DEVICE_8042_PORT             0x00000027
       
  1690 #define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
       
  1691 #define FILE_DEVICE_BATTERY               0x00000029
       
  1692 #define FILE_DEVICE_BUS_EXTENDER          0x0000002a
       
  1693 #define FILE_DEVICE_MODEM                 0x0000002b
       
  1694 #define FILE_DEVICE_VDM                   0x0000002c
       
  1695 #define FILE_DEVICE_MASS_STORAGE          0x0000002d
       
  1696 #define FILE_DEVICE_SMB                   0x0000002e
       
  1697 #define FILE_DEVICE_KS                    0x0000002f
       
  1698 #define FILE_DEVICE_CHANGER               0x00000030
       
  1699 #define FILE_DEVICE_SMARTCARD             0x00000031
       
  1700 #define FILE_DEVICE_ACPI                  0x00000032
       
  1701 #define FILE_DEVICE_DVD                   0x00000033
       
  1702 #define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
       
  1703 #define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
       
  1704 #define FILE_DEVICE_DFS_VOLUME            0x00000036
       
  1705 #define FILE_DEVICE_SERENUM               0x00000037
       
  1706 #define FILE_DEVICE_TERMSRV               0x00000038
       
  1707 #define FILE_DEVICE_KSEC                  0x00000039
       
  1708 #define FILE_DEVICE_FIPS		              0x0000003a
       
  1709 
       
  1710 typedef struct _DEVICE_OBJECT {
       
  1711   CSHORT  Type;
       
  1712   USHORT  Size;
       
  1713   LONG  ReferenceCount;
       
  1714   struct _DRIVER_OBJECT  *DriverObject;
       
  1715   struct _DEVICE_OBJECT  *NextDevice;
       
  1716   struct _DEVICE_OBJECT  *AttachedDevice;
       
  1717   struct _IRP  *CurrentIrp;
       
  1718   PIO_TIMER  Timer;
       
  1719   ULONG  Flags;
       
  1720   ULONG  Characteristics;
       
  1721   PVPB  Vpb;
       
  1722   PVOID  DeviceExtension;
       
  1723   DEVICE_TYPE  DeviceType;
       
  1724   CCHAR  StackSize;
       
  1725   union {
       
  1726     LIST_ENTRY  ListEntry;
       
  1727     WAIT_CONTEXT_BLOCK  Wcb;
       
  1728   } Queue;
       
  1729   ULONG  AlignmentRequirement;
       
  1730   KDEVICE_QUEUE  DeviceQueue;
       
  1731   KDPC  Dpc;
       
  1732   ULONG  ActiveThreadCount;
       
  1733   PSECURITY_DESCRIPTOR  SecurityDescriptor;
       
  1734   KEVENT  DeviceLock;
       
  1735   USHORT  SectorSize;
       
  1736   USHORT  Spare1;
       
  1737   struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
       
  1738   PVOID  Reserved;
       
  1739 } DEVICE_OBJECT;
       
  1740 typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;
       
  1741 
       
  1742 typedef enum _DEVICE_RELATION_TYPE {
       
  1743   BusRelations,
       
  1744   EjectionRelations,
       
  1745   PowerRelations,
       
  1746   RemovalRelations,
       
  1747   TargetDeviceRelation,
       
  1748   SingleBusRelations
       
  1749 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
       
  1750 
       
  1751 typedef struct _DEVICE_RELATIONS {
       
  1752   ULONG  Count;
       
  1753   PDEVICE_OBJECT Objects[1];
       
  1754 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
       
  1755 
       
  1756 typedef struct _SCATTER_GATHER_ELEMENT {
       
  1757   PHYSICAL_ADDRESS  Address;   
       
  1758   ULONG  Length;          
       
  1759   ULONG_PTR  Reserved;
       
  1760 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
       
  1761 
       
  1762 typedef struct _SCATTER_GATHER_LIST {
       
  1763   ULONG  NumberOfElements;
       
  1764   ULONG_PTR  Reserved;
       
  1765   SCATTER_GATHER_ELEMENT  Elements[0];
       
  1766 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
       
  1767 
       
  1768 typedef struct _MDL {
       
  1769   struct _MDL  *Next;
       
  1770   CSHORT  Size;
       
  1771   CSHORT  MdlFlags;
       
  1772   struct _EPROCESS  *Process;
       
  1773   PVOID  MappedSystemVa;
       
  1774   PVOID  StartVa;
       
  1775   ULONG  ByteCount;
       
  1776   ULONG  ByteOffset;
       
  1777 } MDL, *PMDL;
       
  1778 
       
  1779 #define MDL_MAPPED_TO_SYSTEM_VA           0x0001
       
  1780 #define MDL_PAGES_LOCKED                  0x0002
       
  1781 #define MDL_SOURCE_IS_NONPAGED_POOL       0x0004
       
  1782 #define MDL_ALLOCATED_FIXED_SIZE          0x0008
       
  1783 #define MDL_PARTIAL                       0x0010
       
  1784 #define MDL_PARTIAL_HAS_BEEN_MAPPED       0x0020
       
  1785 #define MDL_IO_PAGE_READ                  0x0040
       
  1786 #define MDL_WRITE_OPERATION               0x0080
       
  1787 #define MDL_PARENT_MAPPED_SYSTEM_VA       0x0100
       
  1788 #define MDL_FREE_EXTRA_PTES               0x0200
       
  1789 #define MDL_IO_SPACE                      0x0800
       
  1790 #define MDL_NETWORK_HEADER                0x1000
       
  1791 #define MDL_MAPPING_CAN_FAIL              0x2000
       
  1792 #define MDL_ALLOCATED_MUST_SUCCEED        0x4000
       
  1793 
       
  1794 #define MDL_MAPPING_FLAGS ( \
       
  1795   MDL_MAPPED_TO_SYSTEM_VA     | \
       
  1796   MDL_PAGES_LOCKED            | \
       
  1797   MDL_SOURCE_IS_NONPAGED_POOL | \
       
  1798   MDL_PARTIAL_HAS_BEEN_MAPPED | \
       
  1799   MDL_PARENT_MAPPED_SYSTEM_VA | \
       
  1800   MDL_SYSTEM_VA               | \
       
  1801   MDL_IO_SPACE)
       
  1802 
       
  1803 typedef VOID DDKAPI
       
  1804 (*PPUT_DMA_ADAPTER)(
       
  1805   /*IN*/ PDMA_ADAPTER  DmaAdapter);
       
  1806 
       
  1807 typedef PVOID DDKAPI
       
  1808 (*PALLOCATE_COMMON_BUFFER)(
       
  1809   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1810   /*IN*/ ULONG  Length,
       
  1811   /*OUT*/ PPHYSICAL_ADDRESS  LogicalAddress,
       
  1812   /*IN*/ BOOLEAN  CacheEnabled);
       
  1813 
       
  1814 typedef VOID DDKAPI
       
  1815 (*PFREE_COMMON_BUFFER)(
       
  1816   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1817   /*IN*/ ULONG  Length,
       
  1818   /*IN*/ PHYSICAL_ADDRESS  LogicalAddress,
       
  1819   /*IN*/ PVOID  VirtualAddress,
       
  1820   /*IN*/ BOOLEAN  CacheEnabled);
       
  1821 
       
  1822 typedef NTSTATUS DDKAPI
       
  1823 (*PALLOCATE_ADAPTER_CHANNEL)(
       
  1824   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1825   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  1826   /*IN*/ ULONG  NumberOfMapRegisters,
       
  1827   /*IN*/ PDRIVER_CONTROL  ExecutionRoutine,
       
  1828   /*IN*/ PVOID  Context);
       
  1829 
       
  1830 typedef BOOLEAN DDKAPI
       
  1831 (*PFLUSH_ADAPTER_BUFFERS)(
       
  1832   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1833   /*IN*/ PMDL  Mdl,
       
  1834   /*IN*/ PVOID  MapRegisterBase,
       
  1835   /*IN*/ PVOID  CurrentVa,
       
  1836   /*IN*/ ULONG  Length,
       
  1837   /*IN*/ BOOLEAN  WriteToDevice);
       
  1838 
       
  1839 typedef VOID DDKAPI
       
  1840 (*PFREE_ADAPTER_CHANNEL)(
       
  1841   /*IN*/ PDMA_ADAPTER  DmaAdapter);
       
  1842 
       
  1843 typedef VOID DDKAPI
       
  1844 (*PFREE_MAP_REGISTERS)(
       
  1845   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1846   PVOID  MapRegisterBase,
       
  1847   ULONG  NumberOfMapRegisters);
       
  1848 
       
  1849 typedef PHYSICAL_ADDRESS DDKAPI
       
  1850 (*PMAP_TRANSFER)(
       
  1851   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1852   /*IN*/ PMDL  Mdl,
       
  1853   /*IN*/ PVOID  MapRegisterBase,
       
  1854   /*IN*/ PVOID  CurrentVa,
       
  1855   /*IN OUT*/ PULONG  Length,
       
  1856   /*IN*/ BOOLEAN  WriteToDevice);
       
  1857 
       
  1858 typedef ULONG DDKAPI
       
  1859 (*PGET_DMA_ALIGNMENT)(
       
  1860   /*IN*/ PDMA_ADAPTER  DmaAdapter);
       
  1861 
       
  1862 typedef ULONG DDKAPI
       
  1863 (*PREAD_DMA_COUNTER)(
       
  1864   /*IN*/ PDMA_ADAPTER  DmaAdapter);
       
  1865 
       
  1866 typedef NTSTATUS DDKAPI
       
  1867 (*PGET_SCATTER_GATHER_LIST)(
       
  1868   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1869   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  1870   /*IN*/ PMDL  Mdl,
       
  1871   /*IN*/ PVOID  CurrentVa,
       
  1872   /*IN*/ ULONG  Length,
       
  1873   /*IN*/ PDRIVER_LIST_CONTROL  ExecutionRoutine,
       
  1874   /*IN*/ PVOID  Context,
       
  1875   /*IN*/ BOOLEAN  WriteToDevice);
       
  1876 
       
  1877 typedef VOID DDKAPI
       
  1878 (*PPUT_SCATTER_GATHER_LIST)(
       
  1879   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1880   /*IN*/ PSCATTER_GATHER_LIST  ScatterGather,
       
  1881   /*IN*/ BOOLEAN  WriteToDevice);
       
  1882 
       
  1883 typedef NTSTATUS DDKAPI
       
  1884 (*PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
       
  1885   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1886   /*IN*/ PMDL  Mdl  /*OPTIONAL*/,
       
  1887   /*IN*/ PVOID  CurrentVa,
       
  1888   /*IN*/ ULONG  Length,
       
  1889   /*OUT*/ PULONG  ScatterGatherListSize,
       
  1890   /*OUT*/ PULONG  pNumberOfMapRegisters  /*OPTIONAL*/);
       
  1891 
       
  1892 typedef NTSTATUS DDKAPI
       
  1893 (*PBUILD_SCATTER_GATHER_LIST)(
       
  1894   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1895   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  1896   /*IN*/ PMDL  Mdl,
       
  1897   /*IN*/ PVOID  CurrentVa,
       
  1898   /*IN*/ ULONG  Length,
       
  1899   /*IN*/ PDRIVER_LIST_CONTROL  ExecutionRoutine,
       
  1900   /*IN*/ PVOID  Context,
       
  1901   /*IN*/ BOOLEAN  WriteToDevice,
       
  1902   /*IN*/ PVOID  ScatterGatherBuffer,
       
  1903   /*IN*/ ULONG  ScatterGatherLength);
       
  1904 
       
  1905 typedef NTSTATUS DDKAPI
       
  1906 (*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
       
  1907   /*IN*/ PDMA_ADAPTER  DmaAdapter,
       
  1908   /*IN*/ PSCATTER_GATHER_LIST  ScatterGather,
       
  1909   /*IN*/ PMDL  OriginalMdl,
       
  1910   /*OUT*/ PMDL  *TargetMdl);
       
  1911 
       
  1912 typedef struct _DMA_OPERATIONS {
       
  1913   ULONG  Size;
       
  1914   PPUT_DMA_ADAPTER  PutDmaAdapter;
       
  1915   PALLOCATE_COMMON_BUFFER  AllocateCommonBuffer;
       
  1916   PFREE_COMMON_BUFFER  FreeCommonBuffer;
       
  1917   PALLOCATE_ADAPTER_CHANNEL  AllocateAdapterChannel;
       
  1918   PFLUSH_ADAPTER_BUFFERS  FlushAdapterBuffers;
       
  1919   PFREE_ADAPTER_CHANNEL  FreeAdapterChannel;
       
  1920   PFREE_MAP_REGISTERS  FreeMapRegisters;
       
  1921   PMAP_TRANSFER  MapTransfer;
       
  1922   PGET_DMA_ALIGNMENT  GetDmaAlignment;
       
  1923   PREAD_DMA_COUNTER  ReadDmaCounter;
       
  1924   PGET_SCATTER_GATHER_LIST  GetScatterGatherList;
       
  1925   PPUT_SCATTER_GATHER_LIST  PutScatterGatherList;
       
  1926   PCALCULATE_SCATTER_GATHER_LIST_SIZE  CalculateScatterGatherList;
       
  1927   PBUILD_SCATTER_GATHER_LIST  BuildScatterGatherList;
       
  1928   PBUILD_MDL_FROM_SCATTER_GATHER_LIST  BuildMdlFromScatterGatherList;
       
  1929 } DMA_OPERATIONS, *PDMA_OPERATIONS;
       
  1930 
       
  1931 typedef struct _DMA_ADAPTER {
       
  1932   USHORT  Version;
       
  1933   USHORT  Size;
       
  1934   PDMA_OPERATIONS  DmaOperations;
       
  1935 } DMA_ADAPTER;
       
  1936 
       
  1937 typedef enum _FILE_INFORMATION_CLASS {
       
  1938   FileDirectoryInformation = 1,
       
  1939   FileFullDirectoryInformation,
       
  1940   FileBothDirectoryInformation,
       
  1941   FileBasicInformation,
       
  1942   FileStandardInformation,
       
  1943   FileInternalInformation,
       
  1944   FileEaInformation,
       
  1945   FileAccessInformation,
       
  1946   FileNameInformation,
       
  1947   FileRenameInformation,
       
  1948   FileLinkInformation,
       
  1949   FileNamesInformation,
       
  1950   FileDispositionInformation,
       
  1951   FilePositionInformation,
       
  1952   FileFullEaInformation,
       
  1953   FileModeInformation,
       
  1954   FileAlignmentInformation,
       
  1955   FileAllInformation,
       
  1956   FileAllocationInformation,
       
  1957   FileEndOfFileInformation,
       
  1958   FileAlternateNameInformation,
       
  1959   FileStreamInformation,
       
  1960   FilePipeInformation,
       
  1961   FilePipeLocalInformation,
       
  1962   FilePipeRemoteInformation,
       
  1963   FileMailslotQueryInformation,
       
  1964   FileMailslotSetInformation,
       
  1965   FileCompressionInformation,
       
  1966   FileObjectIdInformation,
       
  1967   FileCompletionInformation,
       
  1968   FileMoveClusterInformation,
       
  1969   FileQuotaInformation,
       
  1970   FileReparsePointInformation,
       
  1971   FileNetworkOpenInformation,
       
  1972   FileAttributeTagInformation,
       
  1973   FileTrackingInformation,
       
  1974   FileIdBothDirectoryInformation,
       
  1975   FileIdFullDirectoryInformation,
       
  1976   FileValidDataLengthInformation,
       
  1977   FileShortNameInformation,
       
  1978   FileMaximumInformation
       
  1979 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
       
  1980 
       
  1981 typedef struct _FILE_POSITION_INFORMATION {                 
       
  1982   LARGE_INTEGER  CurrentByteOffset;                        
       
  1983 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;   
       
  1984 
       
  1985 typedef struct _FILE_ALIGNMENT_INFORMATION {
       
  1986   ULONG  AlignmentRequirement;
       
  1987 } FILE_ALIGNMENT_INFORMATION;
       
  1988 
       
  1989 typedef struct _FILE_NAME_INFORMATION {                     
       
  1990   ULONG  FileNameLength;                                   
       
  1991   WCHAR  FileName[1];                                      
       
  1992 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;           
       
  1993 
       
  1994 typedef struct _FILE_BASIC_INFORMATION {
       
  1995   LARGE_INTEGER  CreationTime;
       
  1996   LARGE_INTEGER  LastAccessTime;
       
  1997   LARGE_INTEGER  LastWriteTime;
       
  1998   LARGE_INTEGER  ChangeTime;
       
  1999   ULONG  FileAttributes;
       
  2000 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
       
  2001 
       
  2002 typedef struct _FILE_STANDARD_INFORMATION {
       
  2003   LARGE_INTEGER  AllocationSize;
       
  2004   LARGE_INTEGER  EndOfFile;
       
  2005   ULONG  NumberOfLinks;
       
  2006   BOOLEAN  DeletePending;
       
  2007   BOOLEAN  Directory;
       
  2008 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
       
  2009 
       
  2010 typedef struct _FILE_NETWORK_OPEN_INFORMATION {                 
       
  2011   LARGE_INTEGER  CreationTime;                                 
       
  2012   LARGE_INTEGER  LastAccessTime;                               
       
  2013   LARGE_INTEGER  LastWriteTime;                                
       
  2014   LARGE_INTEGER  ChangeTime;                                   
       
  2015   LARGE_INTEGER  AllocationSize;                               
       
  2016   LARGE_INTEGER  EndOfFile;                                    
       
  2017   ULONG  FileAttributes;                                       
       
  2018 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;   
       
  2019 
       
  2020 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {               
       
  2021   ULONG  FileAttributes;                                       
       
  2022   ULONG  ReparseTag;                                           
       
  2023 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
       
  2024 
       
  2025 typedef struct _FILE_DISPOSITION_INFORMATION {                  
       
  2026   BOOLEAN  DoDeleteFile;                                         
       
  2027 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; 
       
  2028                                                                 
       
  2029 typedef struct _FILE_END_OF_FILE_INFORMATION {                  
       
  2030   LARGE_INTEGER  EndOfFile;                                    
       
  2031 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; 
       
  2032                                                                 
       
  2033 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {                                    
       
  2034   LARGE_INTEGER  ValidDataLength;                                                      
       
  2035 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;             
       
  2036 
       
  2037 typedef enum _FSINFOCLASS {
       
  2038   FileFsVolumeInformation = 1,
       
  2039   FileFsLabelInformation,
       
  2040   FileFsSizeInformation,
       
  2041   FileFsDeviceInformation,
       
  2042   FileFsAttributeInformation,
       
  2043   FileFsControlInformation,
       
  2044   FileFsFullSizeInformation,
       
  2045   FileFsObjectIdInformation,
       
  2046   FileFsDriverPathInformation,
       
  2047   FileFsMaximumInformation
       
  2048 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
       
  2049 
       
  2050 typedef struct _FILE_FS_DEVICE_INFORMATION {
       
  2051   DEVICE_TYPE  DeviceType;
       
  2052   ULONG  Characteristics;
       
  2053 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
       
  2054 
       
  2055 typedef struct _FILE_FULL_EA_INFORMATION {
       
  2056   ULONG  NextEntryOffset;
       
  2057   UCHAR  Flags;
       
  2058   UCHAR  EaNameLength;
       
  2059   USHORT  EaValueLength;
       
  2060   CHAR  EaName[1];
       
  2061 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
       
  2062 
       
  2063 typedef ULONG_PTR ERESOURCE_THREAD;
       
  2064 typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
       
  2065 
       
  2066 typedef struct _OWNER_ENTRY {
       
  2067   ERESOURCE_THREAD  OwnerThread;
       
  2068   _ANONYMOUS_UNION union {
       
  2069       LONG  OwnerCount;
       
  2070       ULONG  TableSize;
       
  2071   } DUMMYUNIONNAME;
       
  2072 } OWNER_ENTRY, *POWNER_ENTRY;
       
  2073 
       
  2074 /* ERESOURCE.Flag */
       
  2075 
       
  2076 #define ResourceNeverExclusive            0x0010
       
  2077 #define ResourceReleaseByOtherThread      0x0020
       
  2078 #define ResourceOwnedExclusive            0x0080
       
  2079 
       
  2080 #define RESOURCE_HASH_TABLE_SIZE          64
       
  2081 
       
  2082 typedef struct _ERESOURCE {
       
  2083   LIST_ENTRY  SystemResourcesList;
       
  2084   POWNER_ENTRY  OwnerTable;
       
  2085   SHORT  ActiveCount;
       
  2086   USHORT  Flag;
       
  2087   PKSEMAPHORE  SharedWaiters;
       
  2088   PKEVENT  ExclusiveWaiters;
       
  2089   OWNER_ENTRY  OwnerThreads[2];
       
  2090   ULONG  ContentionCount;
       
  2091   USHORT  NumberOfSharedWaiters;
       
  2092   USHORT  NumberOfExclusiveWaiters;
       
  2093   _ANONYMOUS_UNION union {
       
  2094     PVOID  Address;
       
  2095     ULONG_PTR  CreatorBackTraceIndex;
       
  2096   } DUMMYUNIONNAME;
       
  2097   KSPIN_LOCK  SpinLock;
       
  2098 } ERESOURCE, *PERESOURCE;
       
  2099 
       
  2100 /* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
       
  2101 typedef struct _DRIVER_EXTENSION {
       
  2102   struct _DRIVER_OBJECT  *DriverObject;
       
  2103   PVOID  AddDevice;
       
  2104   ULONG  Count;
       
  2105   UNICODE_STRING  ServiceKeyName;
       
  2106 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
       
  2107 
       
  2108 typedef BOOLEAN DDKAPI
       
  2109 (*PFAST_IO_CHECK_IF_POSSIBLE)(
       
  2110   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2111   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2112   /*IN*/ ULONG  Length,
       
  2113   /*IN*/ BOOLEAN  Wait,
       
  2114   /*IN*/ ULONG  LockKey,
       
  2115   /*IN*/ BOOLEAN  CheckForReadOperation,
       
  2116   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2117   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2118 
       
  2119 typedef BOOLEAN DDKAPI
       
  2120 (*PFAST_IO_READ)(
       
  2121   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2122   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2123   /*IN*/ ULONG  Length,
       
  2124   /*IN*/ BOOLEAN  Wait,
       
  2125   /*IN*/ ULONG  LockKey,
       
  2126   /*OUT*/ PVOID  Buffer,
       
  2127   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2128   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2129 
       
  2130 typedef BOOLEAN DDKAPI
       
  2131 (*PFAST_IO_WRITE)(
       
  2132   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2133   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2134   /*IN*/ ULONG  Length,
       
  2135   /*IN*/ BOOLEAN  Wait,
       
  2136   /*IN*/ ULONG  LockKey,
       
  2137   /*IN*/ PVOID  Buffer,
       
  2138   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2139   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2140 
       
  2141 typedef BOOLEAN DDKAPI
       
  2142 (*PFAST_IO_QUERY_BASIC_INFO)(
       
  2143   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2144   /*IN*/ BOOLEAN  Wait,
       
  2145   /*OUT*/ PFILE_BASIC_INFORMATION  Buffer,
       
  2146   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2147   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2148 
       
  2149 typedef BOOLEAN DDKAPI
       
  2150 (*PFAST_IO_QUERY_STANDARD_INFO)(
       
  2151   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2152   /*IN*/ BOOLEAN  Wait,
       
  2153   /*OUT*/ PFILE_STANDARD_INFORMATION  Buffer,
       
  2154   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2155   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2156 
       
  2157 typedef BOOLEAN DDKAPI
       
  2158 (*PFAST_IO_LOCK)(
       
  2159   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2160   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2161   /*IN*/ PLARGE_INTEGER  Length,
       
  2162   PEPROCESS  ProcessId,
       
  2163   ULONG  Key,
       
  2164   BOOLEAN  FailImmediately,
       
  2165   BOOLEAN  ExclusiveLock,
       
  2166   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2167   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2168 
       
  2169 typedef BOOLEAN DDKAPI
       
  2170 (*PFAST_IO_UNLOCK_SINGLE)(
       
  2171   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2172   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2173   /*IN*/ PLARGE_INTEGER  Length,
       
  2174   PEPROCESS  ProcessId,
       
  2175   ULONG  Key,
       
  2176   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2177   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2178 
       
  2179 typedef BOOLEAN DDKAPI
       
  2180 (*PFAST_IO_UNLOCK_ALL)(
       
  2181   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2182   PEPROCESS  ProcessId,
       
  2183   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2184   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2185 
       
  2186 typedef BOOLEAN DDKAPI
       
  2187 (*PFAST_IO_UNLOCK_ALL_BY_KEY)(
       
  2188   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2189   PVOID  ProcessId,
       
  2190   ULONG  Key,
       
  2191   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2192   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2193 
       
  2194 typedef BOOLEAN DDKAPI
       
  2195 (*PFAST_IO_DEVICE_CONTROL)(
       
  2196   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2197   /*IN*/ BOOLEAN  Wait,
       
  2198   /*IN*/ PVOID  InputBuffer  /*OPTIONAL*/,
       
  2199   /*IN*/ ULONG  InputBufferLength,
       
  2200   /*OUT*/ PVOID  OutputBuffer  /*OPTIONAL*/,
       
  2201   /*IN*/ ULONG  OutputBufferLength,
       
  2202   /*IN*/ ULONG  IoControlCode,
       
  2203   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2204   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2205 
       
  2206 typedef VOID DDKAPI
       
  2207 (*PFAST_IO_ACQUIRE_FILE)(
       
  2208   /*IN*/ struct _FILE_OBJECT  *FileObject);
       
  2209 
       
  2210 typedef VOID DDKAPI
       
  2211 (*PFAST_IO_RELEASE_FILE)(
       
  2212   /*IN*/ struct _FILE_OBJECT  *FileObject);
       
  2213 
       
  2214 typedef VOID DDKAPI
       
  2215 (*PFAST_IO_DETACH_DEVICE)(
       
  2216   /*IN*/ struct _DEVICE_OBJECT  *SourceDevice,
       
  2217   /*IN*/ struct _DEVICE_OBJECT  *TargetDevice);
       
  2218 
       
  2219 typedef BOOLEAN DDKAPI
       
  2220 (*PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
       
  2221   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2222   /*IN*/ BOOLEAN  Wait,
       
  2223   /*OUT*/ struct _FILE_NETWORK_OPEN_INFORMATION  *Buffer,
       
  2224   /*OUT*/ struct _IO_STATUS_BLOCK  *IoStatus,
       
  2225   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2226 
       
  2227 typedef NTSTATUS DDKAPI
       
  2228 (*PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
       
  2229   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2230   /*IN*/ PLARGE_INTEGER  EndingOffset,
       
  2231   /*OUT*/ struct _ERESOURCE  **ResourceToRelease,
       
  2232   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2233 
       
  2234 typedef BOOLEAN DDKAPI
       
  2235 (*PFAST_IO_MDL_READ)(
       
  2236   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2237   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2238   /*IN*/ ULONG  Length,
       
  2239   /*IN*/ ULONG  LockKey,
       
  2240   /*OUT*/ PMDL  *MdlChain,
       
  2241   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2242   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2243 
       
  2244 typedef BOOLEAN DDKAPI
       
  2245 (*PFAST_IO_MDL_READ_COMPLETE)(
       
  2246   /*IN*/ struct _FILE_OBJECT *FileObject,
       
  2247   /*IN*/ PMDL MdlChain,
       
  2248   /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
       
  2249 
       
  2250 typedef BOOLEAN DDKAPI
       
  2251 (*PFAST_IO_PREPARE_MDL_WRITE)(
       
  2252   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2253   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2254   /*IN*/ ULONG  Length,
       
  2255   /*IN*/ ULONG  LockKey,
       
  2256   /*OUT*/ PMDL  *MdlChain,
       
  2257   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2258   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2259 
       
  2260 typedef BOOLEAN DDKAPI
       
  2261 (*PFAST_IO_MDL_WRITE_COMPLETE)(
       
  2262   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2263   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2264   /*IN*/ PMDL  MdlChain,
       
  2265   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2266 
       
  2267 typedef BOOLEAN DDKAPI
       
  2268 (*PFAST_IO_READ_COMPRESSED)(
       
  2269   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2270   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2271   /*IN*/ ULONG  Length,
       
  2272   /*IN*/ ULONG  LockKey,
       
  2273   /*OUT*/ PVOID  Buffer,
       
  2274   /*OUT*/ PMDL  *MdlChain,
       
  2275   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2276   /*OUT*/ struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
       
  2277   /*IN*/ ULONG  CompressedDataInfoLength,
       
  2278   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2279 
       
  2280 typedef BOOLEAN DDKAPI
       
  2281 (*PFAST_IO_WRITE_COMPRESSED)(
       
  2282   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2283   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2284   /*IN*/ ULONG  Length,
       
  2285   /*IN*/ ULONG  LockKey,
       
  2286   /*IN*/ PVOID  Buffer,
       
  2287   /*OUT*/ PMDL  *MdlChain,
       
  2288   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
       
  2289   /*IN*/ struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
       
  2290   /*IN*/ ULONG  CompressedDataInfoLength,
       
  2291   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2292 
       
  2293 typedef BOOLEAN DDKAPI
       
  2294 (*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
       
  2295   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2296   /*IN*/ PMDL  MdlChain,
       
  2297   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2298 
       
  2299 typedef BOOLEAN DDKAPI
       
  2300 (*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
       
  2301   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2302   /*IN*/ PLARGE_INTEGER  FileOffset,
       
  2303   /*IN*/ PMDL  MdlChain,
       
  2304   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2305 
       
  2306 typedef BOOLEAN DDKAPI
       
  2307 (*PFAST_IO_QUERY_OPEN)(
       
  2308   /*IN*/ struct _IRP  *Irp,
       
  2309   /*OUT*/ PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation,
       
  2310   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2311 
       
  2312 typedef NTSTATUS DDKAPI
       
  2313 (*PFAST_IO_RELEASE_FOR_MOD_WRITE)(
       
  2314   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2315   /*IN*/ struct _ERESOURCE  *ResourceToRelease,
       
  2316   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2317 
       
  2318 typedef NTSTATUS DDKAPI
       
  2319 (*PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
       
  2320   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2321   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2322 
       
  2323 typedef NTSTATUS DDKAPI
       
  2324 (*PFAST_IO_RELEASE_FOR_CCFLUSH) (
       
  2325   /*IN*/ struct _FILE_OBJECT  *FileObject,
       
  2326   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
       
  2327 
       
  2328 typedef struct _FAST_IO_DISPATCH {
       
  2329   ULONG  SizeOfFastIoDispatch;
       
  2330   PFAST_IO_CHECK_IF_POSSIBLE  FastIoCheckIfPossible;
       
  2331   PFAST_IO_READ  FastIoRead;
       
  2332   PFAST_IO_WRITE  FastIoWrite;
       
  2333   PFAST_IO_QUERY_BASIC_INFO  FastIoQueryBasicInfo;
       
  2334   PFAST_IO_QUERY_STANDARD_INFO  FastIoQueryStandardInfo;
       
  2335   PFAST_IO_LOCK  FastIoLock;
       
  2336   PFAST_IO_UNLOCK_SINGLE  FastIoUnlockSingle;
       
  2337   PFAST_IO_UNLOCK_ALL  FastIoUnlockAll;
       
  2338   PFAST_IO_UNLOCK_ALL_BY_KEY  FastIoUnlockAllByKey;
       
  2339   PFAST_IO_DEVICE_CONTROL  FastIoDeviceControl;
       
  2340   PFAST_IO_ACQUIRE_FILE  AcquireFileForNtCreateSection;
       
  2341   PFAST_IO_RELEASE_FILE  ReleaseFileForNtCreateSection;
       
  2342   PFAST_IO_DETACH_DEVICE  FastIoDetachDevice;
       
  2343   PFAST_IO_QUERY_NETWORK_OPEN_INFO  FastIoQueryNetworkOpenInfo;
       
  2344   PFAST_IO_ACQUIRE_FOR_MOD_WRITE  AcquireForModWrite;
       
  2345   PFAST_IO_MDL_READ  MdlRead;
       
  2346   PFAST_IO_MDL_READ_COMPLETE  MdlReadComplete;
       
  2347   PFAST_IO_PREPARE_MDL_WRITE  PrepareMdlWrite;
       
  2348   PFAST_IO_MDL_WRITE_COMPLETE  MdlWriteComplete;
       
  2349   PFAST_IO_READ_COMPRESSED  FastIoReadCompressed;
       
  2350   PFAST_IO_WRITE_COMPRESSED  FastIoWriteCompressed;
       
  2351   PFAST_IO_MDL_READ_COMPLETE_COMPRESSED  MdlReadCompleteCompressed;
       
  2352   PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED  MdlWriteCompleteCompressed;
       
  2353   PFAST_IO_QUERY_OPEN  FastIoQueryOpen;
       
  2354   PFAST_IO_RELEASE_FOR_MOD_WRITE  ReleaseForModWrite;
       
  2355   PFAST_IO_ACQUIRE_FOR_CCFLUSH  AcquireForCcFlush;
       
  2356   PFAST_IO_RELEASE_FOR_CCFLUSH  ReleaseForCcFlush;
       
  2357 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
       
  2358 
       
  2359 typedef struct _DRIVER_OBJECT {
       
  2360   CSHORT  Type;
       
  2361   CSHORT  Size;
       
  2362   PDEVICE_OBJECT  DeviceObject;
       
  2363   ULONG  Flags;
       
  2364   PVOID  DriverStart;
       
  2365   ULONG  DriverSize;
       
  2366   PVOID  DriverSection;
       
  2367   PDRIVER_EXTENSION  DriverExtension;
       
  2368   UNICODE_STRING  DriverName;
       
  2369   PUNICODE_STRING  HardwareDatabase;
       
  2370   PFAST_IO_DISPATCH  FastIoDispatch;
       
  2371   PDRIVER_INITIALIZE  DriverInit;
       
  2372   PDRIVER_STARTIO  DriverStartIo;
       
  2373   PDRIVER_UNLOAD  DriverUnload;
       
  2374   PDRIVER_DISPATCH  MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
       
  2375 } DRIVER_OBJECT;
       
  2376 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
       
  2377 
       
  2378 typedef struct _SECTION_OBJECT_POINTERS {
       
  2379   PVOID  DataSectionObject;
       
  2380   PVOID  SharedCacheMap;
       
  2381   PVOID  ImageSectionObject;
       
  2382 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
       
  2383 
       
  2384 typedef struct _IO_COMPLETION_CONTEXT {
       
  2385   PVOID  Port;
       
  2386   PVOID  Key;
       
  2387 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
       
  2388 
       
  2389 /* FILE_OBJECT.Flags */
       
  2390 
       
  2391 #define FO_FILE_OPEN                      0x00000001
       
  2392 #define FO_SYNCHRONOUS_IO                 0x00000002
       
  2393 #define FO_ALERTABLE_IO                   0x00000004
       
  2394 #define FO_NO_INTERMEDIATE_BUFFERING      0x00000008
       
  2395 #define FO_WRITE_THROUGH                  0x00000010
       
  2396 #define FO_SEQUENTIAL_ONLY                0x00000020
       
  2397 #define FO_CACHE_SUPPORTED                0x00000040
       
  2398 #define FO_NAMED_PIPE                     0x00000080
       
  2399 #define FO_STREAM_FILE                    0x00000100
       
  2400 #define FO_MAILSLOT                       0x00000200
       
  2401 #define FO_GENERATE_AUDIT_ON_CLOSE        0x00000400
       
  2402 #define FO_DIRECT_DEVICE_OPEN             0x00000800
       
  2403 #define FO_FILE_MODIFIED                  0x00001000
       
  2404 #define FO_FILE_SIZE_CHANGED              0x00002000
       
  2405 #define FO_CLEANUP_COMPLETE               0x00004000
       
  2406 #define FO_TEMPORARY_FILE                 0x00008000
       
  2407 #define FO_DELETE_ON_CLOSE                0x00010000
       
  2408 #define FO_OPENED_CASE_SENSITIVE          0x00020000
       
  2409 #define FO_HANDLE_CREATED                 0x00040000
       
  2410 #define FO_FILE_FAST_IO_READ              0x00080000
       
  2411 #define FO_RANDOM_ACCESS                  0x00100000
       
  2412 #define FO_FILE_OPEN_CANCELLED            0x00200000
       
  2413 #define FO_VOLUME_OPEN                    0x00400000
       
  2414 #define FO_FILE_OBJECT_HAS_EXTENSION      0x00800000
       
  2415 #define FO_REMOTE_ORIGIN                  0x01000000
       
  2416 
       
  2417 typedef struct _FILE_OBJECT {
       
  2418   CSHORT  Type;
       
  2419   CSHORT  Size;
       
  2420   PDEVICE_OBJECT  DeviceObject;
       
  2421   PVPB  Vpb;
       
  2422   PVOID  FsContext;
       
  2423   PVOID  FsContext2;
       
  2424   PSECTION_OBJECT_POINTERS  SectionObjectPointer;
       
  2425   PVOID  PrivateCacheMap;
       
  2426   NTSTATUS  FinalStatus;
       
  2427   struct _FILE_OBJECT  *RelatedFileObject;
       
  2428   BOOLEAN  LockOperation;
       
  2429   BOOLEAN  DeletePending;
       
  2430   BOOLEAN  ReadAccess;
       
  2431   BOOLEAN  WriteAccess;
       
  2432   BOOLEAN  DeleteAccess;
       
  2433   BOOLEAN  SharedRead;
       
  2434   BOOLEAN  SharedWrite;
       
  2435   BOOLEAN  SharedDelete;
       
  2436   ULONG  Flags;
       
  2437   UNICODE_STRING  FileName;
       
  2438   LARGE_INTEGER  CurrentByteOffset;
       
  2439   ULONG  Waiters;
       
  2440   ULONG  Busy;
       
  2441   PVOID  LastLock;
       
  2442   KEVENT  Lock;
       
  2443   KEVENT  Event;
       
  2444   PIO_COMPLETION_CONTEXT  CompletionContext;
       
  2445 } FILE_OBJECT;
       
  2446 typedef struct _FILE_OBJECT *PFILE_OBJECT;
       
  2447 
       
  2448 typedef enum _SECURITY_OPERATION_CODE {
       
  2449   SetSecurityDescriptor,
       
  2450   QuerySecurityDescriptor,
       
  2451   DeleteSecurityDescriptor,
       
  2452   AssignSecurityDescriptor
       
  2453 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
       
  2454 
       
  2455 #define INITIAL_PRIVILEGE_COUNT           3
       
  2456 
       
  2457 typedef struct _INITIAL_PRIVILEGE_SET {
       
  2458   ULONG  PrivilegeCount;
       
  2459   ULONG  Control;
       
  2460   LUID_AND_ATTRIBUTES  Privilege[INITIAL_PRIVILEGE_COUNT];
       
  2461 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
       
  2462 
       
  2463 typedef struct _SECURITY_SUBJECT_CONTEXT {
       
  2464   PACCESS_TOKEN  ClientToken;
       
  2465   SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
       
  2466   PACCESS_TOKEN  PrimaryToken;
       
  2467   PVOID  ProcessAuditId;
       
  2468 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
       
  2469 
       
  2470 #include <pshpack4.h>
       
  2471 typedef struct _ACCESS_STATE {
       
  2472   LUID  OperationID;
       
  2473   BOOLEAN  SecurityEvaluated;
       
  2474   BOOLEAN  GenerateAudit;
       
  2475   BOOLEAN  GenerateOnClose;
       
  2476   BOOLEAN  PrivilegesAllocated;
       
  2477   ULONG  Flags;
       
  2478   ACCESS_MASK  RemainingDesiredAccess;
       
  2479   ACCESS_MASK  PreviouslyGrantedAccess;
       
  2480   ACCESS_MASK  OriginalDesiredAccess;
       
  2481   SECURITY_SUBJECT_CONTEXT  SubjectSecurityContext;
       
  2482   PSECURITY_DESCRIPTOR  SecurityDescriptor;
       
  2483   PVOID  AuxData;
       
  2484   union {
       
  2485     INITIAL_PRIVILEGE_SET  InitialPrivilegeSet;
       
  2486     PRIVILEGE_SET  PrivilegeSet;
       
  2487   } Privileges;
       
  2488 
       
  2489   BOOLEAN  AuditPrivileges;
       
  2490   UNICODE_STRING  ObjectName;
       
  2491   UNICODE_STRING  ObjectTypeName;
       
  2492 } ACCESS_STATE, *PACCESS_STATE;
       
  2493 #include <poppack.h>
       
  2494 
       
  2495 typedef struct _IO_SECURITY_CONTEXT {
       
  2496   PSECURITY_QUALITY_OF_SERVICE  SecurityQos;
       
  2497   PACCESS_STATE  AccessState;
       
  2498   ACCESS_MASK  DesiredAccess;
       
  2499   ULONG  FullCreateOptions;
       
  2500 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
       
  2501 
       
  2502 struct _IO_CSQ;
       
  2503 
       
  2504 typedef struct _IO_CSQ_IRP_CONTEXT {
       
  2505   ULONG  Type;
       
  2506   struct _IRP  *Irp;
       
  2507   struct _IO_CSQ  *Csq;
       
  2508 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
       
  2509 
       
  2510 typedef VOID DDKAPI
       
  2511 (*PIO_CSQ_INSERT_IRP)(
       
  2512   /*IN*/ struct _IO_CSQ  *Csq,
       
  2513   /*IN*/ PIRP  Irp);
       
  2514 
       
  2515 typedef VOID DDKAPI
       
  2516 (*PIO_CSQ_REMOVE_IRP)(
       
  2517   /*IN*/ struct _IO_CSQ  *Csq,
       
  2518   /*IN*/ PIRP  Irp);
       
  2519 
       
  2520 typedef PIRP DDKAPI
       
  2521 (*PIO_CSQ_PEEK_NEXT_IRP)(
       
  2522   /*IN*/ struct _IO_CSQ  *Csq,
       
  2523   /*IN*/ PIRP  Irp,
       
  2524   /*IN*/ PVOID  PeekContext);
       
  2525 
       
  2526 typedef VOID DDKAPI
       
  2527 (*PIO_CSQ_ACQUIRE_LOCK)(
       
  2528   /*IN*/ struct _IO_CSQ  *Csq,
       
  2529   /*OUT*/ PKIRQL  Irql);
       
  2530 
       
  2531 typedef VOID DDKAPI
       
  2532 (*PIO_CSQ_RELEASE_LOCK)(
       
  2533   /*IN*/ struct _IO_CSQ  *Csq,
       
  2534   /*IN*/ KIRQL  Irql);
       
  2535 
       
  2536 typedef VOID DDKAPI
       
  2537 (*PIO_CSQ_COMPLETE_CANCELED_IRP)(
       
  2538   /*IN*/ struct _IO_CSQ  *Csq,
       
  2539   /*IN*/ PIRP  Irp);
       
  2540 
       
  2541 typedef struct _IO_CSQ {
       
  2542   ULONG  Type;
       
  2543   PIO_CSQ_INSERT_IRP  CsqInsertIrp;
       
  2544   PIO_CSQ_REMOVE_IRP  CsqRemoveIrp;
       
  2545   PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp;
       
  2546   PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock;
       
  2547   PIO_CSQ_RELEASE_LOCK  CsqReleaseLock;
       
  2548   PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp;
       
  2549   PVOID  ReservePointer;
       
  2550 } IO_CSQ, *PIO_CSQ;
       
  2551 
       
  2552 #include <pshpack4.h>
       
  2553 typedef struct _IO_STACK_LOCATION {
       
  2554   UCHAR  MajorFunction;
       
  2555   UCHAR  MinorFunction;
       
  2556   UCHAR  Flags;
       
  2557   UCHAR  Control;
       
  2558   union {
       
  2559     struct {
       
  2560       PIO_SECURITY_CONTEXT  SecurityContext;
       
  2561       ULONG  Options;
       
  2562       USHORT POINTER_ALIGNMENT  FileAttributes;
       
  2563       USHORT  ShareAccess;
       
  2564       ULONG POINTER_ALIGNMENT  EaLength;
       
  2565     } Create;
       
  2566     struct {
       
  2567       ULONG  Length;
       
  2568       ULONG POINTER_ALIGNMENT  Key;
       
  2569       LARGE_INTEGER  ByteOffset;
       
  2570     } Read;
       
  2571     struct {
       
  2572       ULONG  Length;
       
  2573       ULONG POINTER_ALIGNMENT  Key;
       
  2574       LARGE_INTEGER  ByteOffset;
       
  2575     } Write;
       
  2576     struct {
       
  2577       ULONG  Length;
       
  2578       FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
       
  2579     } QueryFile;
       
  2580     struct {
       
  2581       ULONG  Length;
       
  2582       FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
       
  2583       PFILE_OBJECT  FileObject;
       
  2584       _ANONYMOUS_UNION union {
       
  2585         _ANONYMOUS_STRUCT struct {
       
  2586           BOOLEAN  ReplaceIfExists;
       
  2587           BOOLEAN  AdvanceOnly;
       
  2588         } DUMMYSTRUCTNAME;
       
  2589         ULONG  ClusterCount;
       
  2590         HANDLE  DeleteHandle;
       
  2591       } DUMMYUNIONNAME;
       
  2592     } SetFile;
       
  2593     struct {
       
  2594       ULONG  Length;
       
  2595       FS_INFORMATION_CLASS POINTER_ALIGNMENT  FsInformationClass;
       
  2596     } QueryVolume;
       
  2597     struct {
       
  2598       ULONG  OutputBufferLength;
       
  2599       ULONG POINTER_ALIGNMENT  InputBufferLength;
       
  2600       ULONG POINTER_ALIGNMENT  IoControlCode;
       
  2601       PVOID  Type3InputBuffer;
       
  2602     } DeviceIoControl;
       
  2603     struct {
       
  2604       SECURITY_INFORMATION  SecurityInformation;
       
  2605       ULONG POINTER_ALIGNMENT  Length;
       
  2606     } QuerySecurity;
       
  2607     struct {
       
  2608       SECURITY_INFORMATION  SecurityInformation;
       
  2609       PSECURITY_DESCRIPTOR  SecurityDescriptor;
       
  2610     } SetSecurity;
       
  2611     struct {
       
  2612       PVPB  Vpb;
       
  2613       PDEVICE_OBJECT  DeviceObject;
       
  2614     } MountVolume;
       
  2615     struct {
       
  2616       PVPB  Vpb;
       
  2617       PDEVICE_OBJECT  DeviceObject;
       
  2618     } VerifyVolume;
       
  2619     struct {
       
  2620       struct _SCSI_REQUEST_BLOCK  *Srb;
       
  2621     } Scsi;
       
  2622     struct {
       
  2623       DEVICE_RELATION_TYPE  Type;
       
  2624     } QueryDeviceRelations;
       
  2625     struct {
       
  2626       CONST GUID  *InterfaceType;
       
  2627       USHORT  Size;
       
  2628       USHORT  Version;
       
  2629       PINTERFACE  Interface;
       
  2630       PVOID  InterfaceSpecificData;
       
  2631     } QueryInterface;
       
  2632     struct {
       
  2633       PDEVICE_CAPABILITIES  Capabilities;
       
  2634     } DeviceCapabilities;
       
  2635     struct {
       
  2636       PIO_RESOURCE_REQUIREMENTS_LIST  IoResourceRequirementList;
       
  2637     } FilterResourceRequirements;
       
  2638     struct {
       
  2639       ULONG  WhichSpace;
       
  2640       PVOID  Buffer;
       
  2641       ULONG  Offset;
       
  2642       ULONG POINTER_ALIGNMENT  Length;
       
  2643     } ReadWriteConfig;
       
  2644     struct {
       
  2645       BOOLEAN  Lock;
       
  2646     } SetLock;
       
  2647     struct {
       
  2648       BUS_QUERY_ID_TYPE  IdType;
       
  2649     } QueryId;
       
  2650     struct {
       
  2651       DEVICE_TEXT_TYPE  DeviceTextType;
       
  2652       LCID POINTER_ALIGNMENT  LocaleId;
       
  2653     } QueryDeviceText;
       
  2654     struct {
       
  2655       BOOLEAN  InPath;
       
  2656       BOOLEAN  Reserved[3];
       
  2657       DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT  Type;
       
  2658     } UsageNotification;
       
  2659     struct {
       
  2660       SYSTEM_POWER_STATE  PowerState;
       
  2661     } WaitWake;
       
  2662     struct {
       
  2663       PPOWER_SEQUENCE  PowerSequence;
       
  2664     } PowerSequence;
       
  2665     struct {
       
  2666       ULONG  SystemContext;
       
  2667       POWER_STATE_TYPE POINTER_ALIGNMENT  Type;
       
  2668       POWER_STATE POINTER_ALIGNMENT  State;
       
  2669       POWER_ACTION POINTER_ALIGNMENT  ShutdownType;
       
  2670     } Power;
       
  2671     struct {
       
  2672       PCM_RESOURCE_LIST  AllocatedResources;
       
  2673       PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
       
  2674     } StartDevice;
       
  2675     struct {
       
  2676       ULONG_PTR  ProviderId;
       
  2677       PVOID  DataPath;
       
  2678       ULONG  BufferSize;
       
  2679       PVOID  Buffer;
       
  2680     } WMI;
       
  2681     struct {
       
  2682       PVOID  Argument1;
       
  2683       PVOID  Argument2;
       
  2684       PVOID  Argument3;
       
  2685       PVOID  Argument4;
       
  2686     } Others;
       
  2687   } Parameters;
       
  2688   PDEVICE_OBJECT  DeviceObject;
       
  2689   PFILE_OBJECT  FileObject;
       
  2690   PIO_COMPLETION_ROUTINE  CompletionRoutine;
       
  2691   PVOID  Context;
       
  2692 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
       
  2693 #include <poppack.h>
       
  2694 
       
  2695 /* IO_STACK_LOCATION.Control */
       
  2696 
       
  2697 #define SL_PENDING_RETURNED               0x01
       
  2698 #define SL_INVOKE_ON_CANCEL               0x20
       
  2699 #define SL_INVOKE_ON_SUCCESS              0x40
       
  2700 #define SL_INVOKE_ON_ERROR                0x80
       
  2701 
       
  2702 typedef enum _KEY_INFORMATION_CLASS {
       
  2703   KeyBasicInformation,
       
  2704   KeyNodeInformation,
       
  2705   KeyFullInformation,
       
  2706   KeyNameInformation,
       
  2707   KeyCachedInformation,
       
  2708   KeyFlagsInformation
       
  2709 } KEY_INFORMATION_CLASS;
       
  2710 
       
  2711 typedef struct _KEY_BASIC_INFORMATION {
       
  2712   LARGE_INTEGER  LastWriteTime;
       
  2713   ULONG  TitleIndex;
       
  2714   ULONG  NameLength;
       
  2715   WCHAR  Name[1];
       
  2716 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
       
  2717 
       
  2718 typedef struct _KEY_FULL_INFORMATION {
       
  2719   LARGE_INTEGER  LastWriteTime;
       
  2720   ULONG  TitleIndex;
       
  2721   ULONG  ClassOffset;
       
  2722   ULONG  ClassLength;
       
  2723   ULONG  SubKeys;
       
  2724   ULONG  MaxNameLen;
       
  2725   ULONG  MaxClassLen;
       
  2726   ULONG  Values;
       
  2727   ULONG  MaxValueNameLen;
       
  2728   ULONG  MaxValueDataLen;
       
  2729   WCHAR  Class[1];
       
  2730 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
       
  2731 
       
  2732 typedef struct _KEY_NODE_INFORMATION {
       
  2733   LARGE_INTEGER  LastWriteTime;
       
  2734   ULONG  TitleIndex;
       
  2735   ULONG  ClassOffset;
       
  2736   ULONG  ClassLength;
       
  2737   ULONG  NameLength;
       
  2738   WCHAR  Name[1];
       
  2739 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
       
  2740 
       
  2741 typedef struct _KEY_VALUE_BASIC_INFORMATION {
       
  2742   ULONG  TitleIndex;
       
  2743   ULONG  Type;
       
  2744   ULONG  NameLength;
       
  2745   WCHAR  Name[1];
       
  2746 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
       
  2747 
       
  2748 typedef struct _KEY_VALUE_FULL_INFORMATION {
       
  2749   ULONG  TitleIndex;
       
  2750   ULONG  Type;
       
  2751   ULONG  DataOffset;
       
  2752   ULONG  DataLength;
       
  2753   ULONG  NameLength;
       
  2754   WCHAR  Name[1];
       
  2755 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
       
  2756 
       
  2757 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
       
  2758   ULONG  TitleIndex;
       
  2759   ULONG  Type;
       
  2760   ULONG  DataLength;
       
  2761   UCHAR  Data[1];
       
  2762 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
       
  2763 
       
  2764 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
       
  2765   ULONG  Type;
       
  2766   ULONG  DataLength;
       
  2767   UCHAR  Data[1];
       
  2768 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
       
  2769 
       
  2770 typedef struct _KEY_VALUE_ENTRY {
       
  2771   PUNICODE_STRING  ValueName;
       
  2772   ULONG  DataLength;
       
  2773   ULONG  DataOffset;
       
  2774   ULONG  Type;
       
  2775 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
       
  2776 
       
  2777 typedef enum _KEY_VALUE_INFORMATION_CLASS {
       
  2778   KeyValueBasicInformation,
       
  2779   KeyValueFullInformation,
       
  2780   KeyValuePartialInformation,
       
  2781   KeyValueFullInformationAlign64,
       
  2782   KeyValuePartialInformationAlign64
       
  2783 } KEY_VALUE_INFORMATION_CLASS;
       
  2784 
       
  2785 /* KEY_VALUE_Xxx.Type */
       
  2786 
       
  2787 #define REG_NONE                           0
       
  2788 #define REG_SZ                             1
       
  2789 #define REG_EXPAND_SZ                      2
       
  2790 #define REG_BINARY                         3
       
  2791 #define REG_DWORD                          4
       
  2792 #define REG_DWORD_LITTLE_ENDIAN            4
       
  2793 #define REG_DWORD_BIG_ENDIAN               5
       
  2794 #define REG_LINK                           6
       
  2795 #define REG_MULTI_SZ                       7
       
  2796 #define REG_RESOURCE_LIST                  8
       
  2797 #define REG_FULL_RESOURCE_DESCRIPTOR       9
       
  2798 #define REG_RESOURCE_REQUIREMENTS_LIST    10
       
  2799 #define REG_QWORD                         11
       
  2800 #define REG_QWORD_LITTLE_ENDIAN           11
       
  2801 
       
  2802 #define PCI_TYPE0_ADDRESSES               6
       
  2803 #define PCI_TYPE1_ADDRESSES               2
       
  2804 #define PCI_TYPE2_ADDRESSES               5
       
  2805 
       
  2806 typedef struct _PCI_COMMON_CONFIG {
       
  2807   USHORT  VendorID;
       
  2808   USHORT  DeviceID;
       
  2809   USHORT  Command;
       
  2810   USHORT  Status;
       
  2811   UCHAR  RevisionID;
       
  2812   UCHAR  ProgIf;
       
  2813   UCHAR  SubClass;
       
  2814   UCHAR  BaseClass;
       
  2815   UCHAR  CacheLineSize;
       
  2816   UCHAR  LatencyTimer;
       
  2817   UCHAR  HeaderType;
       
  2818   UCHAR  BIST;
       
  2819   union {
       
  2820     struct _PCI_HEADER_TYPE_0 {
       
  2821       ULONG  BaseAddresses[PCI_TYPE0_ADDRESSES];
       
  2822       ULONG  CIS;
       
  2823       USHORT  SubVendorID;
       
  2824       USHORT  SubSystemID;
       
  2825       ULONG  ROMBaseAddress;
       
  2826       UCHAR  CapabilitiesPtr;
       
  2827       UCHAR  Reserved1[3];
       
  2828       ULONG  Reserved2;
       
  2829       UCHAR  InterruptLine;
       
  2830       UCHAR  InterruptPin;
       
  2831       UCHAR  MinimumGrant;
       
  2832       UCHAR  MaximumLatency;
       
  2833     } type0;
       
  2834       struct _PCI_HEADER_TYPE_1 {
       
  2835         ULONG  BaseAddresses[PCI_TYPE1_ADDRESSES];
       
  2836         UCHAR  PrimaryBus;
       
  2837         UCHAR  SecondaryBus;
       
  2838         UCHAR  SubordinateBus;
       
  2839         UCHAR  SecondaryLatency;
       
  2840         UCHAR  IOBase;
       
  2841         UCHAR  IOLimit;
       
  2842         USHORT  SecondaryStatus;
       
  2843         USHORT  MemoryBase;
       
  2844         USHORT  MemoryLimit;
       
  2845         USHORT  PrefetchBase;
       
  2846         USHORT  PrefetchLimit;
       
  2847         ULONG  PrefetchBaseUpper32;
       
  2848         ULONG  PrefetchLimitUpper32;
       
  2849         USHORT  IOBaseUpper16;
       
  2850         USHORT  IOLimitUpper16;
       
  2851         UCHAR  CapabilitiesPtr;
       
  2852         UCHAR  Reserved1[3];
       
  2853         ULONG  ROMBaseAddress;
       
  2854         UCHAR  InterruptLine;
       
  2855         UCHAR  InterruptPin;
       
  2856         USHORT  BridgeControl;
       
  2857       } type1;
       
  2858       struct _PCI_HEADER_TYPE_2 {
       
  2859         ULONG  SocketRegistersBaseAddress;
       
  2860         UCHAR  CapabilitiesPtr;
       
  2861         UCHAR  Reserved;
       
  2862         USHORT  SecondaryStatus;
       
  2863         UCHAR  PrimaryBus;
       
  2864         UCHAR  SecondaryBus;
       
  2865         UCHAR  SubordinateBus;
       
  2866         UCHAR  SecondaryLatency;
       
  2867         struct {
       
  2868           ULONG  Base;
       
  2869           ULONG  Limit;
       
  2870         } Range[PCI_TYPE2_ADDRESSES - 1];
       
  2871         UCHAR  InterruptLine;
       
  2872         UCHAR  InterruptPin;
       
  2873         USHORT  BridgeControl;
       
  2874       } type2;
       
  2875   } u;
       
  2876   UCHAR  DeviceSpecific[192];
       
  2877 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
       
  2878 
       
  2879 /* PCI_COMMON_CONFIG.Command */
       
  2880 
       
  2881 #define PCI_ENABLE_IO_SPACE               0x0001
       
  2882 #define PCI_ENABLE_MEMORY_SPACE           0x0002
       
  2883 #define PCI_ENABLE_BUS_MASTER             0x0004
       
  2884 #define PCI_ENABLE_SPECIAL_CYCLES         0x0008
       
  2885 #define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
       
  2886 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
       
  2887 #define PCI_ENABLE_PARITY                 0x0040
       
  2888 #define PCI_ENABLE_WAIT_CYCLE             0x0080
       
  2889 #define PCI_ENABLE_SERR                   0x0100
       
  2890 #define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
       
  2891 
       
  2892 /* PCI_COMMON_CONFIG.Status */
       
  2893 
       
  2894 #define PCI_STATUS_CAPABILITIES_LIST      0x0010
       
  2895 #define PCI_STATUS_66MHZ_CAPABLE          0x0020
       
  2896 #define PCI_STATUS_UDF_SUPPORTED          0x0040
       
  2897 #define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
       
  2898 #define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
       
  2899 #define PCI_STATUS_DEVSEL                 0x0600
       
  2900 #define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
       
  2901 #define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
       
  2902 #define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
       
  2903 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
       
  2904 #define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
       
  2905 
       
  2906 /* PCI_COMMON_CONFIG.HeaderType */
       
  2907 
       
  2908 #define PCI_MULTIFUNCTION                 0x80
       
  2909 #define PCI_DEVICE_TYPE                   0x00
       
  2910 #define PCI_BRIDGE_TYPE                   0x01
       
  2911 #define PCI_CARDBUS_BRIDGE_TYPE           0x02
       
  2912 
       
  2913 #define PCI_CONFIGURATION_TYPE(PciData) \
       
  2914   (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
       
  2915 
       
  2916 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
       
  2917   ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
       
  2918 
       
  2919 typedef struct _PCI_SLOT_NUMBER {
       
  2920   union {
       
  2921     struct {
       
  2922       ULONG  DeviceNumber : 5;
       
  2923       ULONG  FunctionNumber : 3;
       
  2924       ULONG  Reserved : 24;
       
  2925     } bits;
       
  2926     ULONG  AsULONG;
       
  2927   } u;
       
  2928 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
       
  2929 
       
  2930 typedef enum _POOL_TYPE {
       
  2931   NonPagedPool,
       
  2932   PagedPool,
       
  2933   NonPagedPoolMustSucceed,
       
  2934   DontUseThisType,
       
  2935   NonPagedPoolCacheAligned,
       
  2936   PagedPoolCacheAligned,
       
  2937   NonPagedPoolCacheAlignedMustS,
       
  2938 	MaxPoolType,
       
  2939 	NonPagedPoolSession = 32,
       
  2940 	PagedPoolSession,
       
  2941 	NonPagedPoolMustSucceedSession,
       
  2942 	DontUseThisTypeSession,
       
  2943 	NonPagedPoolCacheAlignedSession,
       
  2944 	PagedPoolCacheAlignedSession,
       
  2945 	NonPagedPoolCacheAlignedMustSSession
       
  2946 } POOL_TYPE;
       
  2947 
       
  2948 typedef enum _EX_POOL_PRIORITY {
       
  2949   LowPoolPriority,
       
  2950   LowPoolPrioritySpecialPoolOverrun = 8,
       
  2951   LowPoolPrioritySpecialPoolUnderrun = 9,
       
  2952   NormalPoolPriority = 16,
       
  2953   NormalPoolPrioritySpecialPoolOverrun = 24,
       
  2954   NormalPoolPrioritySpecialPoolUnderrun = 25,
       
  2955   HighPoolPriority = 32,
       
  2956   HighPoolPrioritySpecialPoolOverrun = 40,
       
  2957   HighPoolPrioritySpecialPoolUnderrun = 41
       
  2958 } EX_POOL_PRIORITY;
       
  2959 
       
  2960 /* PRIVILEGE_SET.Control */
       
  2961 
       
  2962 #define PRIVILEGE_SET_ALL_NECESSARY       1
       
  2963 
       
  2964 typedef struct _RTL_OSVERSIONINFOW {
       
  2965   ULONG  dwOSVersionInfoSize;
       
  2966   ULONG  dwMajorVersion;
       
  2967   ULONG  dwMinorVersion;
       
  2968   ULONG  dwBuildNumber;
       
  2969   ULONG  dwPlatformId;
       
  2970   WCHAR  szCSDVersion[128];
       
  2971 } RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
       
  2972 
       
  2973 typedef struct _RTL_OSVERSIONINFOEXW {
       
  2974   ULONG  dwOSVersionInfoSize;
       
  2975   ULONG  dwMajorVersion;
       
  2976   ULONG  dwMinorVersion;
       
  2977   ULONG  dwBuildNumber;
       
  2978   ULONG  dwPlatformId;
       
  2979   WCHAR  szCSDVersion[128];
       
  2980   USHORT  wServicePackMajor;
       
  2981   USHORT  wServicePackMinor;
       
  2982   USHORT  wSuiteMask;
       
  2983   UCHAR  wProductType;
       
  2984   UCHAR  wReserved;
       
  2985 } RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
       
  2986 
       
  2987 NTOSAPI
       
  2988 ULONGLONG
       
  2989 DDKAPI
       
  2990 VerSetConditionMask(
       
  2991   /*IN*/ ULONGLONG  ConditionMask,
       
  2992   /*IN*/ ULONG  TypeMask,
       
  2993   /*IN*/ UCHAR  Condition);
       
  2994 
       
  2995 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType)  \
       
  2996         ((ConditionMask) = VerSetConditionMask((ConditionMask), \
       
  2997         (TypeBitMask), (ComparisonType)))
       
  2998 
       
  2999 /* RtlVerifyVersionInfo() TypeMask */
       
  3000 
       
  3001 #define VER_MINORVERSION                  0x0000001
       
  3002 #define VER_MAJORVERSION                  0x0000002
       
  3003 #define VER_BUILDNUMBER                   0x0000004
       
  3004 #define VER_PLATFORMID                    0x0000008
       
  3005 #define VER_SERVICEPACKMINOR              0x0000010
       
  3006 #define VER_SERVICEPACKMAJOR              0x0000020
       
  3007 #define VER_SUITENAME                     0x0000040
       
  3008 #define VER_PRODUCT_TYPE                  0x0000080
       
  3009 
       
  3010 /* RtlVerifyVersionInfo() ComparisonType */
       
  3011 
       
  3012 #define VER_EQUAL                       1
       
  3013 #define VER_GREATER                     2
       
  3014 #define VER_GREATER_EQUAL               3
       
  3015 #define VER_LESS                        4
       
  3016 #define VER_LESS_EQUAL                  5
       
  3017 #define VER_AND                         6
       
  3018 #define VER_OR                          7
       
  3019 
       
  3020 #define VER_CONDITION_MASK              7
       
  3021 #define VER_NUM_BITS_PER_CONDITION_MASK 3
       
  3022 
       
  3023 typedef struct _RTL_BITMAP {
       
  3024   ULONG  SizeOfBitMap;
       
  3025   PULONG  Buffer;
       
  3026 } RTL_BITMAP, *PRTL_BITMAP;
       
  3027 
       
  3028 typedef struct _RTL_BITMAP_RUN {
       
  3029     ULONG  StartingIndex;
       
  3030     ULONG  NumberOfBits;
       
  3031 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
       
  3032 
       
  3033 typedef NTSTATUS DDKAPI
       
  3034 (*PRTL_QUERY_REGISTRY_ROUTINE)(
       
  3035   /*IN*/ PWSTR  ValueName,
       
  3036   /*IN*/ ULONG  ValueType,
       
  3037   /*IN*/ PVOID  ValueData,
       
  3038   /*IN*/ ULONG  ValueLength,
       
  3039   /*IN*/ PVOID  Context,
       
  3040   /*IN*/ PVOID  EntryContext);
       
  3041 
       
  3042 #define RTL_REGISTRY_ABSOLUTE             0
       
  3043 #define RTL_REGISTRY_SERVICES             1
       
  3044 #define RTL_REGISTRY_CONTROL              2
       
  3045 #define RTL_REGISTRY_WINDOWS_NT           3
       
  3046 #define RTL_REGISTRY_DEVICEMAP            4
       
  3047 #define RTL_REGISTRY_USER                 5
       
  3048 
       
  3049 /* RTL_QUERY_REGISTRY_TABLE.Flags */
       
  3050 #define RTL_QUERY_REGISTRY_SUBKEY         0x00000001
       
  3051 #define RTL_QUERY_REGISTRY_TOPKEY         0x00000002
       
  3052 #define RTL_QUERY_REGISTRY_REQUIRED       0x00000004
       
  3053 #define RTL_QUERY_REGISTRY_NOVALUE        0x00000008
       
  3054 #define RTL_QUERY_REGISTRY_NOEXPAND       0x00000010
       
  3055 #define RTL_QUERY_REGISTRY_DIRECT         0x00000020
       
  3056 #define RTL_QUERY_REGISTRY_DELETE         0x00000040
       
  3057 
       
  3058 typedef struct _RTL_QUERY_REGISTRY_TABLE {
       
  3059   PRTL_QUERY_REGISTRY_ROUTINE  QueryRoutine;
       
  3060   ULONG  Flags;
       
  3061   PWSTR  Name;
       
  3062   PVOID  EntryContext;
       
  3063   ULONG  DefaultType;
       
  3064   PVOID  DefaultData;
       
  3065   ULONG  DefaultLength;
       
  3066 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
       
  3067 
       
  3068 typedef struct _TIME_FIELDS {
       
  3069   CSHORT  Year;
       
  3070   CSHORT  Month;
       
  3071   CSHORT  Day;
       
  3072   CSHORT  Hour;
       
  3073   CSHORT  Minute;
       
  3074   CSHORT  Second;
       
  3075   CSHORT  Milliseconds;
       
  3076   CSHORT  Weekday;
       
  3077 } TIME_FIELDS, *PTIME_FIELDS;
       
  3078 
       
  3079 typedef PVOID DDKAPI
       
  3080 (*PALLOCATE_FUNCTION)(
       
  3081   /*IN*/ POOL_TYPE  PoolType,
       
  3082   /*IN*/ SIZE_T  NumberOfBytes,
       
  3083   /*IN*/ ULONG  Tag);
       
  3084 
       
  3085 typedef VOID DDKAPI
       
  3086 (*PFREE_FUNCTION)(
       
  3087   /*IN*/ PVOID  Buffer);
       
  3088 
       
  3089 #define GENERAL_LOOKASIDE_S \
       
  3090   SLIST_HEADER  ListHead; \
       
  3091   USHORT  Depth; \
       
  3092   USHORT  MaximumDepth; \
       
  3093   ULONG  TotalAllocates; \
       
  3094   _ANONYMOUS_UNION union { \
       
  3095     ULONG  AllocateMisses; \
       
  3096     ULONG  AllocateHits; \
       
  3097   } DUMMYUNIONNAME; \
       
  3098   ULONG  TotalFrees; \
       
  3099   _ANONYMOUS_UNION union { \
       
  3100     ULONG  FreeMisses; \
       
  3101     ULONG  FreeHits; \
       
  3102   } DUMMYUNIONNAME2; \
       
  3103   POOL_TYPE  Type; \
       
  3104   ULONG  Tag; \
       
  3105   ULONG  Size; \
       
  3106   PALLOCATE_FUNCTION  Allocate; \
       
  3107   PFREE_FUNCTION  Free; \
       
  3108   LIST_ENTRY  ListEntry; \
       
  3109   ULONG  LastTotalAllocates; \
       
  3110   _ANONYMOUS_UNION union { \
       
  3111     ULONG  LastAllocateMisses; \
       
  3112     ULONG  LastAllocateHits; \
       
  3113   } DUMMYUNIONNAME3; \
       
  3114   ULONG Future[2];
       
  3115 
       
  3116 typedef struct _GENERAL_LOOKASIDE {
       
  3117   GENERAL_LOOKASIDE_S
       
  3118 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
       
  3119 
       
  3120 typedef struct _NPAGED_LOOKASIDE_LIST {
       
  3121   GENERAL_LOOKASIDE_S
       
  3122   KSPIN_LOCK  Obsoleted;
       
  3123 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
       
  3124 
       
  3125 typedef struct _PAGED_LOOKASIDE_LIST {
       
  3126   GENERAL_LOOKASIDE_S
       
  3127   FAST_MUTEX  Obsoleted;
       
  3128 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
       
  3129 
       
  3130 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
       
  3131 
       
  3132 typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
       
  3133   /*IN*/ PVOID  CallbackContext,
       
  3134   /*IN*/ PVOID  Argument1,
       
  3135   /*IN*/ PVOID  Argument2);
       
  3136 
       
  3137 typedef enum _EVENT_TYPE {
       
  3138   NotificationEvent,
       
  3139   SynchronizationEvent
       
  3140 } EVENT_TYPE;
       
  3141 
       
  3142 typedef enum _KWAIT_REASON {
       
  3143   Executive,
       
  3144   FreePage,
       
  3145   PageIn,
       
  3146   PoolAllocation,
       
  3147   DelayExecution,
       
  3148   Suspended,
       
  3149   UserRequest,
       
  3150   WrExecutive,
       
  3151   WrFreePage,
       
  3152   WrPageIn,
       
  3153   WrPoolAllocation,
       
  3154   WrDelayExecution,
       
  3155   WrSuspended,
       
  3156   WrUserRequest,
       
  3157   WrEventPair,
       
  3158   WrQueue,
       
  3159   WrLpcReceive,
       
  3160   WrLpcReply,
       
  3161   WrVirtualMemory,
       
  3162   WrPageOut,
       
  3163   WrRendezvous,
       
  3164   Spare2,
       
  3165   Spare3,
       
  3166   Spare4,
       
  3167   Spare5,
       
  3168   Spare6,
       
  3169   WrKernel,
       
  3170   MaximumWaitReason
       
  3171 } KWAIT_REASON;
       
  3172 
       
  3173 typedef struct _KWAIT_BLOCK {
       
  3174   LIST_ENTRY  WaitListEntry;
       
  3175   struct _KTHREAD * RESTRICTED_POINTER  Thread;
       
  3176   PVOID  Object;
       
  3177   struct _KWAIT_BLOCK * RESTRICTED_POINTER  NextWaitBlock;
       
  3178   USHORT  WaitKey;
       
  3179   USHORT  WaitType;
       
  3180 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
       
  3181 
       
  3182 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
       
  3183 
       
  3184 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
       
  3185   BOOLEAN  Removed;
       
  3186   BOOLEAN  Reserved[3];
       
  3187   LONG  IoCount;
       
  3188   KEVENT  RemoveEvent;
       
  3189 } IO_REMOVE_LOCK_COMMON_BLOCK;
       
  3190 
       
  3191 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
       
  3192   LONG  Signature;
       
  3193   LONG  HighWatermark;
       
  3194   LONGLONG  MaxLockedTicks;
       
  3195   LONG  AllocateTag;
       
  3196   LIST_ENTRY  LockList;
       
  3197   KSPIN_LOCK  Spin;
       
  3198   LONG  LowMemoryCount;
       
  3199   ULONG  Reserved1[4];
       
  3200   PVOID  Reserved2;
       
  3201   PIO_REMOVE_LOCK_TRACKING_BLOCK  Blocks;
       
  3202 } IO_REMOVE_LOCK_DBG_BLOCK;
       
  3203 
       
  3204 typedef struct _IO_REMOVE_LOCK {
       
  3205   IO_REMOVE_LOCK_COMMON_BLOCK  Common;
       
  3206 #ifdef DBG
       
  3207   IO_REMOVE_LOCK_DBG_BLOCK  Dbg;
       
  3208 #endif
       
  3209 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
       
  3210 
       
  3211 typedef struct _IO_WORKITEM *PIO_WORKITEM;
       
  3212 
       
  3213 typedef VOID DDKAPI
       
  3214 (*PIO_WORKITEM_ROUTINE)(
       
  3215   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  3216   /*IN*/ PVOID  Context);
       
  3217 
       
  3218 typedef struct _SHARE_ACCESS {
       
  3219   ULONG  OpenCount;
       
  3220   ULONG  Readers;
       
  3221   ULONG  Writers;
       
  3222   ULONG  Deleters;
       
  3223   ULONG  SharedRead;
       
  3224   ULONG  SharedWrite;
       
  3225   ULONG  SharedDelete;
       
  3226 } SHARE_ACCESS, *PSHARE_ACCESS;
       
  3227 
       
  3228 typedef enum _KINTERRUPT_MODE {
       
  3229   LevelSensitive,
       
  3230   Latched
       
  3231 } KINTERRUPT_MODE;
       
  3232 
       
  3233 typedef VOID DDKAPI
       
  3234 (*PKINTERRUPT_ROUTINE)(
       
  3235   VOID);
       
  3236 
       
  3237 typedef enum _KPROFILE_SOURCE {
       
  3238   ProfileTime,
       
  3239   ProfileAlignmentFixup,
       
  3240   ProfileTotalIssues,
       
  3241   ProfilePipelineDry,
       
  3242   ProfileLoadInstructions,
       
  3243   ProfilePipelineFrozen,
       
  3244   ProfileBranchInstructions,
       
  3245   ProfileTotalNonissues,
       
  3246   ProfileDcacheMisses,
       
  3247   ProfileIcacheMisses,
       
  3248   ProfileCacheMisses,
       
  3249   ProfileBranchMispredictions,
       
  3250   ProfileStoreInstructions,
       
  3251   ProfileFpInstructions,
       
  3252   ProfileIntegerInstructions,
       
  3253   Profile2Issue,
       
  3254   Profile3Issue,
       
  3255   Profile4Issue,
       
  3256   ProfileSpecialInstructions,
       
  3257   ProfileTotalCycles,
       
  3258   ProfileIcacheIssues,
       
  3259   ProfileDcacheAccesses,
       
  3260   ProfileMemoryBarrierCycles,
       
  3261   ProfileLoadLinkedIssues,
       
  3262   ProfileMaximum
       
  3263 } KPROFILE_SOURCE;
       
  3264 
       
  3265 typedef enum _CREATE_FILE_TYPE {
       
  3266   CreateFileTypeNone,
       
  3267   CreateFileTypeNamedPipe,
       
  3268   CreateFileTypeMailslot
       
  3269 } CREATE_FILE_TYPE;
       
  3270 
       
  3271 typedef struct _CONFIGURATION_INFORMATION {
       
  3272   ULONG  DiskCount;
       
  3273   ULONG  FloppyCount;
       
  3274   ULONG  CdRomCount;
       
  3275   ULONG  TapeCount;
       
  3276   ULONG  ScsiPortCount;
       
  3277   ULONG  SerialCount;
       
  3278   ULONG  ParallelCount;
       
  3279   BOOLEAN  AtDiskPrimaryAddressClaimed;
       
  3280   BOOLEAN  AtDiskSecondaryAddressClaimed;
       
  3281   ULONG  Version;
       
  3282   ULONG  MediumChangerCount;
       
  3283 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
       
  3284 
       
  3285 typedef enum _CONFIGURATION_TYPE {
       
  3286   ArcSystem,
       
  3287   CentralProcessor,
       
  3288   FloatingPointProcessor,
       
  3289   PrimaryIcache,
       
  3290   PrimaryDcache,
       
  3291   SecondaryIcache,
       
  3292   SecondaryDcache,
       
  3293   SecondaryCache,
       
  3294   EisaAdapter,
       
  3295   TcAdapter,
       
  3296   ScsiAdapter,
       
  3297   DtiAdapter,
       
  3298   MultiFunctionAdapter,
       
  3299   DiskController,
       
  3300   TapeController,
       
  3301   CdromController,
       
  3302   WormController,
       
  3303   SerialController,
       
  3304   NetworkController,
       
  3305   DisplayController,
       
  3306   ParallelController,
       
  3307   PointerController,
       
  3308   KeyboardController,
       
  3309   AudioController,
       
  3310   OtherController,
       
  3311   DiskPeripheral,
       
  3312   FloppyDiskPeripheral,
       
  3313   TapePeripheral,
       
  3314   ModemPeripheral,
       
  3315   MonitorPeripheral,
       
  3316   PrinterPeripheral,
       
  3317   PointerPeripheral,
       
  3318   KeyboardPeripheral,
       
  3319   TerminalPeripheral,
       
  3320   OtherPeripheral,
       
  3321   LinePeripheral,
       
  3322   NetworkPeripheral,
       
  3323   SystemMemory,
       
  3324   DockingInformation,
       
  3325   RealModeIrqRoutingTable,
       
  3326   MaximumType
       
  3327 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
       
  3328 
       
  3329 typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
       
  3330   /*IN*/ PVOID  Context,
       
  3331   /*IN*/ PUNICODE_STRING  PathName,
       
  3332   /*IN*/ INTERFACE_TYPE  BusType,
       
  3333   /*IN*/ ULONG  BusNumber,
       
  3334   /*IN*/ PKEY_VALUE_FULL_INFORMATION  *BusInformation,
       
  3335   /*IN*/ CONFIGURATION_TYPE  ControllerType,
       
  3336   /*IN*/ ULONG  ControllerNumber,
       
  3337   /*IN*/ PKEY_VALUE_FULL_INFORMATION  *ControllerInformation,
       
  3338   /*IN*/ CONFIGURATION_TYPE  PeripheralType,
       
  3339   /*IN*/ ULONG  PeripheralNumber,
       
  3340   /*IN*/ PKEY_VALUE_FULL_INFORMATION  *PeripheralInformation);
       
  3341 
       
  3342 typedef enum _WORK_QUEUE_TYPE {
       
  3343   CriticalWorkQueue,
       
  3344   DelayedWorkQueue,
       
  3345   HyperCriticalWorkQueue,
       
  3346   MaximumWorkQueue
       
  3347 } WORK_QUEUE_TYPE;
       
  3348 
       
  3349 typedef VOID DDKAPI
       
  3350 (*PWORKER_THREAD_ROUTINE)(
       
  3351   /*IN*/ PVOID Parameter);
       
  3352 
       
  3353 typedef struct _WORK_QUEUE_ITEM {
       
  3354   LIST_ENTRY  List;
       
  3355   PWORKER_THREAD_ROUTINE  WorkerRoutine;
       
  3356   PVOID  Parameter;
       
  3357 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
       
  3358 
       
  3359 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
       
  3360     BufferEmpty,
       
  3361     BufferInserted,
       
  3362     BufferStarted,
       
  3363     BufferFinished,
       
  3364     BufferIncomplete
       
  3365 } KBUGCHECK_BUFFER_DUMP_STATE;
       
  3366 
       
  3367 typedef VOID DDKAPI
       
  3368 (*PKBUGCHECK_CALLBACK_ROUTINE)(
       
  3369   /*IN*/ PVOID  Buffer,
       
  3370   /*IN*/ ULONG  Length);
       
  3371 
       
  3372 typedef struct _KBUGCHECK_CALLBACK_RECORD {
       
  3373   LIST_ENTRY  Entry;
       
  3374   PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine;
       
  3375   PVOID  Buffer;
       
  3376   ULONG  Length;
       
  3377   PUCHAR  Component;
       
  3378   ULONG_PTR  Checksum;
       
  3379   UCHAR  State;
       
  3380 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
       
  3381 
       
  3382 /*
       
  3383  * VOID
       
  3384  * KeInitializeCallbackRecord(
       
  3385  * IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
       
  3386  */
       
  3387 #define KeInitializeCallbackRecord(CallbackRecord) \
       
  3388   CallbackRecord->State = BufferEmpty;
       
  3389 
       
  3390 typedef enum _KDPC_IMPORTANCE {
       
  3391   LowImportance,
       
  3392   MediumImportance,
       
  3393   HighImportance
       
  3394 } KDPC_IMPORTANCE;
       
  3395 
       
  3396 typedef enum _MEMORY_CACHING_TYPE_ORIG {
       
  3397   MmFrameBufferCached = 2
       
  3398 } MEMORY_CACHING_TYPE_ORIG;
       
  3399 
       
  3400 typedef enum _MEMORY_CACHING_TYPE {
       
  3401   MmNonCached = FALSE,
       
  3402   MmCached = TRUE,
       
  3403   MmWriteCombined = MmFrameBufferCached,
       
  3404   MmHardwareCoherentCached,
       
  3405   MmNonCachedUnordered,
       
  3406   MmUSWCCached,
       
  3407   MmMaximumCacheType
       
  3408 } MEMORY_CACHING_TYPE;
       
  3409 
       
  3410 typedef enum _MM_PAGE_PRIORITY {
       
  3411   LowPagePriority,
       
  3412   NormalPagePriority = 16,
       
  3413   HighPagePriority = 32
       
  3414 } MM_PAGE_PRIORITY;
       
  3415 
       
  3416 typedef enum _LOCK_OPERATION {
       
  3417   IoReadAccess,
       
  3418   IoWriteAccess,
       
  3419   IoModifyAccess
       
  3420 } LOCK_OPERATION;
       
  3421 
       
  3422 typedef enum _MM_SYSTEM_SIZE {
       
  3423   MmSmallSystem,
       
  3424   MmMediumSystem,
       
  3425   MmLargeSystem
       
  3426 } MM_SYSTEM_SIZE;
       
  3427 
       
  3428 typedef struct _OBJECT_HANDLE_INFORMATION {
       
  3429   ULONG HandleAttributes;
       
  3430   ACCESS_MASK GrantedAccess;
       
  3431 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
       
  3432 
       
  3433 typedef struct _CLIENT_ID {
       
  3434   HANDLE  UniqueProcess;
       
  3435   HANDLE  UniqueThread;
       
  3436 } CLIENT_ID, *PCLIENT_ID;
       
  3437 
       
  3438 typedef VOID DDKAPI
       
  3439 (*PKSTART_ROUTINE)(
       
  3440   /*IN*/ PVOID  StartContext);
       
  3441 
       
  3442 typedef VOID DDKAPI
       
  3443 (*PCREATE_PROCESS_NOTIFY_ROUTINE)(
       
  3444   /*IN*/ HANDLE  ParentId,
       
  3445   /*IN*/ HANDLE  ProcessId,
       
  3446   /*IN*/ BOOLEAN  Create);
       
  3447 
       
  3448 typedef VOID DDKAPI
       
  3449 (*PCREATE_THREAD_NOTIFY_ROUTINE)(
       
  3450   /*IN*/ HANDLE  ProcessId,
       
  3451   /*IN*/ HANDLE  ThreadId,
       
  3452   /*IN*/ BOOLEAN  Create);
       
  3453 
       
  3454 typedef struct _IMAGE_INFO {
       
  3455   _ANONYMOUS_UNION union {
       
  3456     ULONG  Properties;
       
  3457     _ANONYMOUS_STRUCT struct {
       
  3458       ULONG  ImageAddressingMode  : 8;
       
  3459       ULONG  SystemModeImage      : 1;
       
  3460       ULONG  ImageMappedToAllPids : 1;
       
  3461       ULONG  Reserved             : 22;
       
  3462     } DUMMYSTRUCTNAME;
       
  3463   } DUMMYUNIONNAME;
       
  3464   PVOID  ImageBase;
       
  3465   ULONG  ImageSelector;
       
  3466   SIZE_T  ImageSize;
       
  3467   ULONG  ImageSectionNumber;
       
  3468 } IMAGE_INFO, *PIMAGE_INFO;
       
  3469 
       
  3470 #define IMAGE_ADDRESSING_MODE_32BIT       3
       
  3471 
       
  3472 typedef VOID DDKAPI
       
  3473 (*PLOAD_IMAGE_NOTIFY_ROUTINE)(
       
  3474   /*IN*/ PUNICODE_STRING  FullImageName,
       
  3475   /*IN*/ HANDLE  ProcessId,
       
  3476   /*IN*/ PIMAGE_INFO  ImageInfo);
       
  3477 
       
  3478 typedef enum _PROCESSINFOCLASS {
       
  3479   ProcessBasicInformation,
       
  3480   ProcessQuotaLimits,
       
  3481   ProcessIoCounters,
       
  3482   ProcessVmCounters,
       
  3483   ProcessTimes,
       
  3484   ProcessBasePriority,
       
  3485   ProcessRaisePriority,
       
  3486   ProcessDebugPort,
       
  3487   ProcessExceptionPort,
       
  3488   ProcessAccessToken,
       
  3489   ProcessLdtInformation,
       
  3490   ProcessLdtSize,
       
  3491   ProcessDefaultHardErrorMode,
       
  3492   ProcessIoPortHandlers,
       
  3493   ProcessPooledUsageAndLimits,
       
  3494   ProcessWorkingSetWatch,
       
  3495   ProcessUserModeIOPL,
       
  3496   ProcessEnableAlignmentFaultFixup,
       
  3497   ProcessPriorityClass,
       
  3498   ProcessWx86Information,
       
  3499   ProcessHandleCount,
       
  3500   ProcessAffinityMask,
       
  3501   ProcessPriorityBoost,
       
  3502   ProcessDeviceMap,
       
  3503   ProcessSessionInformation,
       
  3504   ProcessForegroundInformation,
       
  3505   ProcessWow64Information,
       
  3506   ProcessImageFileName,
       
  3507   ProcessLUIDDeviceMapsEnabled,
       
  3508   ProcessBreakOnTermination,
       
  3509   ProcessDebugObjectHandle,
       
  3510   ProcessDebugFlags,
       
  3511   ProcessHandleTracing,
       
  3512   MaxProcessInfoClass
       
  3513 } PROCESSINFOCLASS;
       
  3514 
       
  3515 typedef enum _THREADINFOCLASS {
       
  3516   ThreadBasicInformation,
       
  3517   ThreadTimes,
       
  3518   ThreadPriority,
       
  3519   ThreadBasePriority,
       
  3520   ThreadAffinityMask,
       
  3521   ThreadImpersonationToken,
       
  3522   ThreadDescriptorTableEntry,
       
  3523   ThreadEnableAlignmentFaultFixup,
       
  3524   ThreadEventPair_Reusable,
       
  3525   ThreadQuerySetWin32StartAddress,
       
  3526   ThreadZeroTlsCell,
       
  3527   ThreadPerformanceCount,
       
  3528   ThreadAmILastThread,
       
  3529   ThreadIdealProcessor,
       
  3530   ThreadPriorityBoost,
       
  3531   ThreadSetTlsArrayAddress,
       
  3532   ThreadIsIoPending,
       
  3533   ThreadHideFromDebugger,
       
  3534   ThreadBreakOnTermination,
       
  3535   MaxThreadInfoClass
       
  3536 } THREADINFOCLASS;
       
  3537 
       
  3538 #define ES_SYSTEM_REQUIRED                0x00000001
       
  3539 #define ES_DISPLAY_REQUIRED               0x00000002
       
  3540 #define ES_USER_PRESENT                   0x00000004
       
  3541 #define ES_CONTINUOUS                     0x80000000
       
  3542 
       
  3543 typedef ULONG EXECUTION_STATE;
       
  3544 
       
  3545 typedef VOID DDKAPI
       
  3546 (*PREQUEST_POWER_COMPLETE)(
       
  3547   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  3548   /*IN*/ UCHAR  MinorFunction,
       
  3549   /*IN*/ POWER_STATE  PowerState,
       
  3550   /*IN*/ PVOID  Context,
       
  3551   /*IN*/ PIO_STATUS_BLOCK  IoStatus);
       
  3552 
       
  3553 typedef enum _TRACE_INFORMATION_CLASS {
       
  3554   TraceIdClass,
       
  3555   TraceHandleClass,
       
  3556   TraceEnableFlagsClass,
       
  3557   TraceEnableLevelClass,
       
  3558   GlobalLoggerHandleClass,
       
  3559   EventLoggerHandleClass,
       
  3560   AllLoggerHandlesClass,
       
  3561   TraceHandleByNameClass
       
  3562 } TRACE_INFORMATION_CLASS;
       
  3563 
       
  3564 typedef NTSTATUS DDKAPI
       
  3565 (*PEX_CALLBACK_FUNCTION)(
       
  3566   /*IN*/ PVOID  CallbackContext,
       
  3567   /*IN*/ PVOID  Argument1,
       
  3568   /*IN*/ PVOID  Argument2);
       
  3569 
       
  3570 
       
  3571 
       
  3572 /*
       
  3573 ** Storage structures
       
  3574 */
       
  3575 typedef enum _PARTITION_STYLE {
       
  3576   PARTITION_STYLE_MBR,
       
  3577   PARTITION_STYLE_GPT
       
  3578 } PARTITION_STYLE;
       
  3579 
       
  3580 typedef struct _CREATE_DISK_MBR {
       
  3581   ULONG  Signature;
       
  3582 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
       
  3583 
       
  3584 typedef struct _CREATE_DISK_GPT {
       
  3585   GUID  DiskId;
       
  3586   ULONG  MaxPartitionCount;
       
  3587 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
       
  3588 
       
  3589 typedef struct _CREATE_DISK {
       
  3590   PARTITION_STYLE  PartitionStyle;
       
  3591   _ANONYMOUS_UNION union {
       
  3592     CREATE_DISK_MBR  Mbr;
       
  3593     CREATE_DISK_GPT  Gpt;
       
  3594   } DUMMYUNIONNAME;
       
  3595 } CREATE_DISK, *PCREATE_DISK;
       
  3596 
       
  3597 typedef struct _DISK_SIGNATURE {
       
  3598   ULONG  PartitionStyle;
       
  3599   _ANONYMOUS_UNION union {
       
  3600     struct {
       
  3601       ULONG  Signature;
       
  3602       ULONG  CheckSum;
       
  3603     } Mbr;
       
  3604     struct {
       
  3605       GUID  DiskId;
       
  3606     } Gpt;
       
  3607   } DUMMYUNIONNAME;
       
  3608 } DISK_SIGNATURE, *PDISK_SIGNATURE;
       
  3609 
       
  3610 typedef VOID DDKFASTAPI
       
  3611 (*PTIME_UPDATE_NOTIFY_ROUTINE)(
       
  3612   /*IN*/ HANDLE  ThreadId,
       
  3613   /*IN*/ KPROCESSOR_MODE  Mode);
       
  3614 
       
  3615 #define DBG_STATUS_CONTROL_C              1
       
  3616 #define DBG_STATUS_SYSRQ                  2
       
  3617 #define DBG_STATUS_BUGCHECK_FIRST         3
       
  3618 #define DBG_STATUS_BUGCHECK_SECOND        4
       
  3619 #define DBG_STATUS_FATAL                  5
       
  3620 #define DBG_STATUS_DEBUG_CONTROL          6
       
  3621 #define DBG_STATUS_WORKER                 7
       
  3622 
       
  3623 typedef struct _PHYSICAL_MEMORY_RANGE {
       
  3624   PHYSICAL_ADDRESS  BaseAddress;
       
  3625   LARGE_INTEGER  NumberOfBytes;
       
  3626 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
       
  3627 
       
  3628 typedef ULONG_PTR
       
  3629 (*PDRIVER_VERIFIER_THUNK_ROUTINE)(
       
  3630   /*IN*/ PVOID  Context);
       
  3631 
       
  3632 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
       
  3633   PDRIVER_VERIFIER_THUNK_ROUTINE  PristineRoutine;
       
  3634   PDRIVER_VERIFIER_THUNK_ROUTINE  NewRoutine;
       
  3635 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
       
  3636 
       
  3637 #define DRIVER_VERIFIER_SPECIAL_POOLING             0x0001
       
  3638 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING         0x0002
       
  3639 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES  0x0004
       
  3640 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS      0x0008
       
  3641 #define DRIVER_VERIFIER_IO_CHECKING                 0x0010
       
  3642 
       
  3643 #define RTL_RANGE_LIST_ADD_IF_CONFLICT    0x00000001
       
  3644 #define RTL_RANGE_LIST_ADD_SHARED         0x00000002
       
  3645 
       
  3646 #define RTL_RANGE_LIST_SHARED_OK          0x00000001
       
  3647 #define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002
       
  3648 
       
  3649 #define RTL_RANGE_LIST_SHARED_OK          0x00000001
       
  3650 #define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002
       
  3651 
       
  3652 #define RTL_RANGE_LIST_MERGE_IF_CONFLICT  RTL_RANGE_LIST_ADD_IF_CONFLICT
       
  3653 
       
  3654 typedef struct _RTL_RANGE {
       
  3655   ULONGLONG  Start;
       
  3656   ULONGLONG  End;
       
  3657   PVOID  UserData;
       
  3658   PVOID  Owner;
       
  3659   UCHAR  Attributes;
       
  3660   UCHAR  Flags;
       
  3661 } RTL_RANGE, *PRTL_RANGE;
       
  3662 
       
  3663 #define RTL_RANGE_SHARED                  0x01
       
  3664 #define RTL_RANGE_CONFLICT                0x02
       
  3665 
       
  3666 typedef struct _RTL_RANGE_LIST {
       
  3667   LIST_ENTRY  ListHead;
       
  3668   ULONG  Flags;
       
  3669   ULONG  Count;
       
  3670   ULONG  Stamp;
       
  3671 } RTL_RANGE_LIST, *PRTL_RANGE_LIST;
       
  3672 
       
  3673 typedef struct _RANGE_LIST_ITERATOR {
       
  3674   PLIST_ENTRY  RangeListHead;
       
  3675   PLIST_ENTRY  MergedHead;
       
  3676   PVOID  Current;
       
  3677   ULONG  Stamp;
       
  3678 } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
       
  3679 
       
  3680 typedef BOOLEAN
       
  3681 (*PRTL_CONFLICT_RANGE_CALLBACK)(
       
  3682   /*IN*/ PVOID  Context,
       
  3683   /*IN*/ PRTL_RANGE  Range);
       
  3684 
       
  3685 #define HASH_STRING_ALGORITHM_DEFAULT     0
       
  3686 #define HASH_STRING_ALGORITHM_X65599      1
       
  3687 #define HASH_STRING_ALGORITHM_INVALID     0xffffffff
       
  3688 
       
  3689 typedef enum _SUITE_TYPE {
       
  3690   SmallBusiness,
       
  3691   Enterprise,
       
  3692   BackOffice,
       
  3693   CommunicationServer,
       
  3694   TerminalServer,
       
  3695   SmallBusinessRestricted,
       
  3696   EmbeddedNT,
       
  3697   DataCenter,
       
  3698   SingleUserTS,
       
  3699   Personal,
       
  3700   Blade,
       
  3701   MaxSuiteType
       
  3702 } SUITE_TYPE;
       
  3703 
       
  3704 typedef VOID DDKAPI
       
  3705 (*PTIMER_APC_ROUTINE)(
       
  3706   /*IN*/ PVOID  TimerContext,
       
  3707   /*IN*/ ULONG  TimerLowValue,
       
  3708   /*IN*/ LONG  TimerHighValue);
       
  3709 
       
  3710 
       
  3711 
       
  3712 /*
       
  3713 ** WMI structures
       
  3714 */
       
  3715 
       
  3716 typedef VOID DDKAPI
       
  3717 (*WMI_NOTIFICATION_CALLBACK)(
       
  3718   PVOID  Wnode,
       
  3719   PVOID  Context);
       
  3720 
       
  3721 
       
  3722 /*
       
  3723 ** Architecture specific structures
       
  3724 */
       
  3725 
       
  3726 #ifdef _X86_
       
  3727 
       
  3728 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
       
  3729 
       
  3730 #define PASSIVE_LEVEL                      0
       
  3731 #define LOW_LEVEL                          0
       
  3732 #define APC_LEVEL                          1
       
  3733 #define DISPATCH_LEVEL                     2
       
  3734 #define SYNCH_LEVEL                       27
       
  3735 #define PROFILE_LEVEL                     27
       
  3736 #define CLOCK1_LEVEL                      28
       
  3737 #define CLOCK2_LEVEL                      28
       
  3738 #define IPI_LEVEL                         29
       
  3739 #define POWER_LEVEL                       30
       
  3740 #define HIGH_LEVEL                        31
       
  3741 
       
  3742 typedef struct _KPCR_TIB {
       
  3743   PVOID  ExceptionList;         /* 00 */
       
  3744   PVOID  StackBase;             /* 04 */
       
  3745   PVOID  StackLimit;            /* 08 */
       
  3746   PVOID  SubSystemTib;          /* 0C */
       
  3747   _ANONYMOUS_UNION union {
       
  3748     PVOID  FiberData;           /* 10 */
       
  3749     DWORD  Version;             /* 10 */
       
  3750   } DUMMYUNIONNAME;
       
  3751   PVOID  ArbitraryUserPointer;  /* 14 */
       
  3752   struct _NT_TIB *Self;         /* 18 */
       
  3753 } KPCR_TIB, *PKPCR_TIB;         /* 1C */
       
  3754 
       
  3755 #define PCR_MINOR_VERSION 1
       
  3756 #define PCR_MAJOR_VERSION 1
       
  3757 
       
  3758 typedef struct _KPCR {
       
  3759   KPCR_TIB  Tib;                /* 00 */
       
  3760   struct _KPCR  *Self;          /* 1C */
       
  3761   struct _KPRCB  *PCRCB;        /* 20 */
       
  3762   KIRQL  Irql;                  /* 24 */
       
  3763   ULONG  IRR;                   /* 28 */
       
  3764   ULONG  IrrActive;             /* 2C */
       
  3765   ULONG  IDR;                   /* 30 */
       
  3766   PVOID  KdVersionBlock;        /* 34 */
       
  3767   PUSHORT  IDT;                 /* 38 */
       
  3768   PUSHORT  GDT;                 /* 3C */
       
  3769   struct _KTSS  *TSS;           /* 40 */
       
  3770   USHORT  MajorVersion;         /* 44 */
       
  3771   USHORT  MinorVersion;         /* 46 */
       
  3772   KAFFINITY  SetMember;         /* 48 */
       
  3773   ULONG  StallScaleFactor;      /* 4C */
       
  3774   UCHAR  SpareUnused;           /* 50 */
       
  3775   UCHAR  Number;                /* 51 */
       
  3776 } KPCR, *PKPCR;                 /* 54 */
       
  3777 
       
  3778 typedef struct _KFLOATING_SAVE {
       
  3779   ULONG  ControlWord;
       
  3780   ULONG  StatusWord;
       
  3781   ULONG  ErrorOffset;
       
  3782   ULONG  ErrorSelector;
       
  3783   ULONG  DataOffset;
       
  3784   ULONG  DataSelector;
       
  3785   ULONG  Cr0NpxState;
       
  3786   ULONG  Spare1;
       
  3787 } KFLOATING_SAVE, *PKFLOATING_SAVE;
       
  3788 
       
  3789 #define PAGE_SIZE                         0x1000
       
  3790 #define PAGE_SHIFT                        12L
       
  3791 
       
  3792 extern NTOSAPI PVOID *MmHighestUserAddress;
       
  3793 extern NTOSAPI PVOID *MmSystemRangeStart;
       
  3794 extern NTOSAPI ULONG *MmUserProbeAddress;
       
  3795 
       
  3796 #define MM_HIGHEST_USER_ADDRESS           *MmHighestUserAddress
       
  3797 #define MM_SYSTEM_RANGE_START             *MmSystemRangeStart
       
  3798 #define MM_USER_PROBE_ADDRESS             *MmUserProbeAddress
       
  3799 #define MM_LOWEST_USER_ADDRESS            (PVOID)0x10000
       
  3800 #define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC0C00000
       
  3801 
       
  3802 #define KI_USER_SHARED_DATA               0xffdf0000
       
  3803 #define SharedUserData                    ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
       
  3804 
       
  3805 #define EFLAG_SIGN                        0x8000
       
  3806 #define EFLAG_ZERO                        0x4000
       
  3807 #define EFLAG_SELECT                      (EFLAG_SIGN | EFLAG_ZERO)
       
  3808 
       
  3809 #define RESULT_NEGATIVE                   ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
       
  3810 #define RESULT_ZERO                       ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
       
  3811 #define RESULT_POSITIVE                   ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
       
  3812 
       
  3813 typedef enum _INTERLOCKED_RESULT {
       
  3814   ResultNegative = RESULT_NEGATIVE,
       
  3815   ResultZero = RESULT_ZERO,
       
  3816   ResultPositive = RESULT_POSITIVE
       
  3817 } INTERLOCKED_RESULT;
       
  3818 
       
  3819 NTOSAPI
       
  3820 KIRQL
       
  3821 DDKAPI
       
  3822 KeGetCurrentIrql(
       
  3823   VOID);
       
  3824 
       
  3825 /*
       
  3826  * ULONG
       
  3827  * KeGetCurrentProcessorNumber(
       
  3828  *   VOID)
       
  3829  */
       
  3830 #define KeGetCurrentProcessorNumber() \
       
  3831   ((ULONG)KeGetCurrentKPCR()->ProcessorNumber)
       
  3832 
       
  3833 
       
  3834 #if  __USE_NTOSKRNL__
       
  3835 /* CAREFUL: These are exported from ntoskrnl.exe as __fastcall functions,
       
  3836    but are also exported from kernel32.dll and declared in winbase.h as
       
  3837    __stdcall */
       
  3838 #if !defined(__INTERLOCKED_DECLARED)
       
  3839 #define __INTERLOCKED_DECLARED
       
  3840 
       
  3841 NTOSAPI
       
  3842 LONG
       
  3843 DDKFASTAPI
       
  3844 InterlockedIncrement(
       
  3845   /*IN*/ PLONG  VOLATILE  Addend);
       
  3846 
       
  3847 NTOSAPI
       
  3848 LONG
       
  3849 DDKFASTAPI
       
  3850 InterlockedDecrement(
       
  3851   /*IN*/ PLONG  VOLATILE  Addend);
       
  3852 
       
  3853 NTOSAPI
       
  3854 LONG
       
  3855 DDKFASTAPI
       
  3856 InterlockedCompareExchange(
       
  3857   /*IN OUT*/ PLONG  VOLATILE  Destination,
       
  3858   /*IN*/ LONG  Exchange,
       
  3859   /*IN*/ LONG  Comparand);
       
  3860 
       
  3861 NTOSAPI
       
  3862 LONG
       
  3863 DDKFASTAPI
       
  3864 InterlockedExchange(
       
  3865   /*IN OUT*/ PLONG  VOLATILE  Target,
       
  3866   /*IN*/ LONG Value);
       
  3867 
       
  3868 NTOSAPI
       
  3869 LONG
       
  3870 DDKFASTAPI
       
  3871 InterlockedExchangeAdd(
       
  3872   /*IN OUT*/ PLONG VOLATILE  Addend,
       
  3873   /*IN*/ LONG  Value);
       
  3874 
       
  3875 /*
       
  3876  * PVOID
       
  3877  * InterlockedExchangePointer(
       
  3878  * IN OUT PVOID VOLATILE  *Target,
       
  3879  * IN PVOID  Value)
       
  3880  */
       
  3881 #define InterlockedExchangePointer(Target, Value) \
       
  3882   ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
       
  3883 
       
  3884 /*
       
  3885  * PVOID
       
  3886  * InterlockedCompareExchangePointer(
       
  3887  * IN OUT PVOID  *Destination,
       
  3888  * IN PVOID  Exchange,
       
  3889  * IN PVOID  Comparand)
       
  3890  */
       
  3891 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
       
  3892   ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
       
  3893 
       
  3894 #if  (_WIN32_WINNT >= 0x0501)
       
  3895 PSLIST_ENTRY
       
  3896 DDKFASTAPI
       
  3897 InterlockedPopEntrySList(
       
  3898   /*IN*/ PSLIST_HEADER  ListHead);
       
  3899 
       
  3900 NTOSAPI
       
  3901 PSLIST_ENTRY
       
  3902 DDKFASTAPI
       
  3903 InterlockedPushEntrySList(
       
  3904   /*IN*/ PSLIST_HEADER  ListHead,
       
  3905   /*IN*/ PSLIST_ENTRY  ListEntry);
       
  3906 #endif /* _WIN32_WINNT >= 0x0501 */
       
  3907 
       
  3908 #endif /* !__INTERLOCKED_DECLARED */
       
  3909 #endif /*  __USE_NTOSKRNL__ */
       
  3910 
       
  3911 NTOSAPI
       
  3912 VOID
       
  3913 DDKFASTAPI
       
  3914 KefAcquireSpinLockAtDpcLevel(
       
  3915   /*IN*/ PKSPIN_LOCK  SpinLock);
       
  3916 
       
  3917 NTOSAPI
       
  3918 VOID
       
  3919 DDKFASTAPI
       
  3920 KefReleaseSpinLockFromDpcLevel(
       
  3921   /*IN*/ PKSPIN_LOCK  SpinLock);
       
  3922 
       
  3923 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
       
  3924 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
       
  3925 
       
  3926 #define RtlCopyMemoryNonTemporal RtlCopyMemory
       
  3927 
       
  3928 #define KeGetDcacheFillSize() 1L
       
  3929 
       
  3930 #endif /* _X86_ */
       
  3931 
       
  3932 
       
  3933 
       
  3934 /*
       
  3935 ** Utillity functions
       
  3936 */
       
  3937 
       
  3938 #define ARGUMENT_PRESENT(ArgumentPointer) \
       
  3939   ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
       
  3940 
       
  3941 /*
       
  3942  * ULONG
       
  3943  * BYTE_OFFSET(
       
  3944  * IN PVOID  Va)
       
  3945  */
       
  3946 #define BYTE_OFFSET(Va) \
       
  3947   ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
       
  3948 
       
  3949 /*
       
  3950  * ULONG
       
  3951  * BYTES_TO_PAGES(
       
  3952  * IN ULONG  Size)
       
  3953  */
       
  3954 #define BYTES_TO_PAGES(Size) \
       
  3955   ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
       
  3956 
       
  3957 /*
       
  3958  * PCHAR
       
  3959  * CONTAINING_RECORD(
       
  3960  * IN PCHAR  Address,
       
  3961  * IN TYPE  Type,
       
  3962  * IN PCHAR  Field);
       
  3963  */
       
  3964 #ifndef CONTAINING_RECORD
       
  3965 #define CONTAINING_RECORD(Address, Type, Field) \
       
  3966   ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
       
  3967 #endif
       
  3968 
       
  3969 /* LONG
       
  3970  * FIELD_OFFSET(
       
  3971  * IN TYPE  Type,
       
  3972  * IN PCHAR  Field);
       
  3973  */
       
  3974 #ifndef FIELD_OFFSET
       
  3975 #define FIELD_OFFSET(Type, Field) \
       
  3976   ((LONG) (&(((Type *) 0)->Field)))
       
  3977 #endif
       
  3978 
       
  3979 /*
       
  3980  * PVOID
       
  3981  * PAGE_ALIGN(
       
  3982  * IN PVOID  Va)
       
  3983  */
       
  3984 #define PAGE_ALIGN(Va) \
       
  3985   ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
       
  3986 
       
  3987 /*
       
  3988  * ULONG_PTR
       
  3989  * ROUND_TO_PAGES(
       
  3990  * IN ULONG_PTR  Size)
       
  3991  */
       
  3992 #define ROUND_TO_PAGES(Size) \
       
  3993   ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
       
  3994 
       
  3995 NTOSAPI
       
  3996 VOID
       
  3997 DDKAPI
       
  3998 RtlAssert(
       
  3999   /*IN*/ PVOID  FailedAssertion,
       
  4000   /*IN*/ PVOID  FileName,
       
  4001   /*IN*/ ULONG  LineNumber,
       
  4002   /*IN*/ PCHAR  Message);
       
  4003 
       
  4004 #ifdef DBG
       
  4005 
       
  4006 #define ASSERT(exp) \
       
  4007   ((!(exp)) ? \
       
  4008     (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE)
       
  4009 
       
  4010 #define ASSERTMSG(msg, exp) \
       
  4011   ((!(exp)) ? \
       
  4012     (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE)
       
  4013 
       
  4014 #define RTL_SOFT_ASSERT(exp) \
       
  4015   ((!(_exp)) ? \
       
  4016     (DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE)
       
  4017 
       
  4018 #define RTL_SOFT_ASSERTMSG(msg, exp) \
       
  4019   ((!(exp)) ? \
       
  4020     (DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n   Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE)
       
  4021 
       
  4022 #define RTL_VERIFY(exp) ASSERT(exp)
       
  4023 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
       
  4024 
       
  4025 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
       
  4026 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
       
  4027 
       
  4028 #else /* !DBG */
       
  4029 
       
  4030 #define ASSERT(exp) ((VOID) 0)
       
  4031 #define ASSERTMSG(msg, exp) ((VOID) 0)
       
  4032 
       
  4033 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
       
  4034 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
       
  4035 
       
  4036 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
       
  4037 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
       
  4038 
       
  4039 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
       
  4040 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
       
  4041 
       
  4042 #endif /* DBG */
       
  4043 
       
  4044 
       
  4045 /*
       
  4046 ** Driver support routines
       
  4047 */
       
  4048 
       
  4049 /** Runtime library routines **/
       
  4050 
       
  4051 /*
       
  4052  * VOID
       
  4053  * InitializeListHead(
       
  4054  * IN PLIST_ENTRY  ListHead)
       
  4055  */
       
  4056 #define InitializeListHead(_ListHead) \
       
  4057 { \
       
  4058   (_ListHead)->Flink = (_ListHead); \
       
  4059   (_ListHead)->Blink = (_ListHead); \
       
  4060 }
       
  4061 
       
  4062 /*
       
  4063  * VOID
       
  4064  * InsertHeadList(
       
  4065  * IN PLIST_ENTRY  ListHead,
       
  4066  * IN PLIST_ENTRY  Entry)
       
  4067  */
       
  4068 #define InsertHeadList(_ListHead, \
       
  4069                        _Entry) \
       
  4070 { \
       
  4071   PLIST_ENTRY _OldFlink; \
       
  4072   _OldFlink = (_ListHead)->Flink; \
       
  4073   (_Entry)->Flink = _OldFlink; \
       
  4074   (_Entry)->Blink = (_ListHead); \
       
  4075   _OldFlink->Blink = (_Entry); \
       
  4076   (_ListHead)->Flink = (_Entry); \
       
  4077 }
       
  4078 
       
  4079 /*
       
  4080  * VOID
       
  4081  * InsertTailList(
       
  4082  * IN PLIST_ENTRY  ListHead,
       
  4083  * IN PLIST_ENTRY  Entry)
       
  4084  */
       
  4085 #define InsertTailList(_ListHead, \
       
  4086                        _Entry) \
       
  4087 { \
       
  4088 	PLIST_ENTRY _OldBlink; \
       
  4089 	_OldBlink = (_ListHead)->Blink; \
       
  4090 	(_Entry)->Flink = (_ListHead); \
       
  4091 	(_Entry)->Blink = _OldBlink; \
       
  4092 	_OldBlink->Flink = (_Entry); \
       
  4093 	(_ListHead)->Blink = (_Entry); \
       
  4094 }
       
  4095 
       
  4096 /*
       
  4097  * BOOLEAN
       
  4098  * IsListEmpty(
       
  4099  * IN PLIST_ENTRY  ListHead)
       
  4100  */
       
  4101 #define IsListEmpty(_ListHead) \
       
  4102   ((_ListHead)->Flink == (_ListHead))
       
  4103 
       
  4104 static __inline PSINGLE_LIST_ENTRY 
       
  4105 PopEntryList(
       
  4106   /*IN*/ PSINGLE_LIST_ENTRY  ListHead)
       
  4107 {
       
  4108 	PSINGLE_LIST_ENTRY Entry;
       
  4109 
       
  4110 	Entry = ListHead->Next;
       
  4111 	if (Entry != NULL)
       
  4112 	{
       
  4113 		ListHead->Next = Entry->Next;
       
  4114 	}
       
  4115   return Entry;
       
  4116 }
       
  4117 
       
  4118 /*
       
  4119  * VOID
       
  4120  * PushEntryList(
       
  4121  * IN PSINGLE_LIST_ENTRY  ListHead,
       
  4122  * IN PSINGLE_LIST_ENTRY  Entry)
       
  4123  */
       
  4124 #define PushEntryList(_ListHead, \
       
  4125                       _Entry) \
       
  4126 { \
       
  4127 	(_Entry)->Next = (_ListHead)->Next; \
       
  4128 	(_ListHead)->Next = (_Entry); \
       
  4129 }
       
  4130 
       
  4131 /*
       
  4132  * VOID
       
  4133  * RemoveEntryList(
       
  4134  * IN PLIST_ENTRY  Entry)
       
  4135  */
       
  4136 #define RemoveEntryList(_Entry) \
       
  4137 { \
       
  4138 	PLIST_ENTRY _OldFlink; \
       
  4139 	PLIST_ENTRY _OldBlink; \
       
  4140 	_OldFlink = (_Entry)->Flink; \
       
  4141 	_OldBlink = (_Entry)->Blink; \
       
  4142 	_OldFlink->Blink = _OldBlink; \
       
  4143 	_OldBlink->Flink = _OldFlink; \
       
  4144   (_Entry)->Flink = NULL; \
       
  4145   (_Entry)->Blink = NULL; \
       
  4146 }
       
  4147 
       
  4148 static __inline PLIST_ENTRY 
       
  4149 RemoveHeadList(
       
  4150   /*IN*/ PLIST_ENTRY  ListHead)
       
  4151 {
       
  4152 	PLIST_ENTRY OldFlink;
       
  4153 	PLIST_ENTRY OldBlink;
       
  4154 	PLIST_ENTRY Entry;
       
  4155 
       
  4156 	Entry = ListHead->Flink;
       
  4157 	OldFlink = ListHead->Flink->Flink;
       
  4158 	OldBlink = ListHead->Flink->Blink;
       
  4159 	OldFlink->Blink = OldBlink;
       
  4160 	OldBlink->Flink = OldFlink;
       
  4161 
       
  4162   if (Entry != ListHead)
       
  4163   {
       
  4164     Entry->Flink = NULL;
       
  4165     Entry->Blink = NULL;
       
  4166   }
       
  4167 
       
  4168 	return Entry;
       
  4169 }
       
  4170 
       
  4171 static __inline PLIST_ENTRY
       
  4172 RemoveTailList(
       
  4173   /*IN*/ PLIST_ENTRY  ListHead)
       
  4174 {
       
  4175 	PLIST_ENTRY OldFlink;
       
  4176 	PLIST_ENTRY OldBlink;
       
  4177 	PLIST_ENTRY Entry;
       
  4178 
       
  4179 	Entry = ListHead->Blink;
       
  4180 	OldFlink = ListHead->Blink->Flink;
       
  4181 	OldBlink = ListHead->Blink->Blink;
       
  4182 	OldFlink->Blink = OldBlink;
       
  4183 	OldBlink->Flink = OldFlink;
       
  4184 
       
  4185   if (Entry != ListHead)
       
  4186   {
       
  4187     Entry->Flink = NULL;
       
  4188     Entry->Blink = NULL;
       
  4189   }
       
  4190    
       
  4191   return Entry;
       
  4192 }
       
  4193 
       
  4194 /*
       
  4195  * USHORT
       
  4196  * QueryDepthSList(
       
  4197  * IN PSLIST_HEADER  SListHead)
       
  4198  */
       
  4199 #define QueryDepthSList(_SListHead) \
       
  4200   ((USHORT) ((_SListHead)->Alignment & 0xffff))
       
  4201 
       
  4202 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
       
  4203 
       
  4204 NTOSAPI
       
  4205 ULONG
       
  4206 DDKAPI
       
  4207 RtlAnsiStringToUnicodeSize(
       
  4208   /*IN*/ PANSI_STRING  AnsiString);
       
  4209 
       
  4210 NTOSAPI
       
  4211 NTSTATUS
       
  4212 DDKAPI
       
  4213 RtlAddRange(
       
  4214   /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
       
  4215   /*IN*/ ULONGLONG  Start,
       
  4216   /*IN*/ ULONGLONG  End,
       
  4217   /*IN*/ UCHAR  Attributes,
       
  4218   /*IN*/ ULONG  Flags,
       
  4219   /*IN*/ PVOID  UserData  /*OPTIONAL*/,
       
  4220   /*IN*/ PVOID  Owner  /*OPTIONAL*/);
       
  4221 
       
  4222 NTOSAPI
       
  4223 NTSTATUS
       
  4224 DDKAPI
       
  4225 RtlAnsiStringToUnicodeString(
       
  4226   /*IN OUT*/ PUNICODE_STRING  DestinationString,
       
  4227   /*IN*/ PANSI_STRING  SourceString,
       
  4228   /*IN*/ BOOLEAN  AllocateDestinationString);
       
  4229 
       
  4230 NTOSAPI
       
  4231 NTSTATUS
       
  4232 DDKAPI
       
  4233 RtlAppendUnicodeStringToString(
       
  4234   /*IN OUT*/ PUNICODE_STRING  Destination,
       
  4235   /*IN*/ PUNICODE_STRING  Source);
       
  4236 
       
  4237 NTOSAPI
       
  4238 NTSTATUS
       
  4239 DDKAPI
       
  4240 RtlAppendUnicodeToString(
       
  4241   /*IN OUT*/ PUNICODE_STRING  Destination,
       
  4242   /*IN*/ PCWSTR  Source);
       
  4243 
       
  4244 NTOSAPI
       
  4245 BOOLEAN
       
  4246 DDKAPI
       
  4247 RtlAreBitsClear(
       
  4248   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4249   /*IN*/ ULONG  StartingIndex,
       
  4250   /*IN*/ ULONG  Length); 
       
  4251 
       
  4252 NTOSAPI
       
  4253 BOOLEAN
       
  4254 DDKAPI
       
  4255 RtlAreBitsSet(
       
  4256   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4257   /*IN*/ ULONG  StartingIndex,
       
  4258   /*IN*/ ULONG  Length); 
       
  4259 
       
  4260 NTOSAPI
       
  4261 NTSTATUS
       
  4262 DDKAPI
       
  4263 RtlCharToInteger(
       
  4264   /*IN*/ PCSZ  String,
       
  4265   /*IN*/ ULONG  Base  /*OPTIONAL*/,
       
  4266   /*IN OUT*/ PULONG  Value);
       
  4267 
       
  4268 NTOSAPI
       
  4269 ULONG
       
  4270 DDKAPI
       
  4271 RtlCheckBit(
       
  4272   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4273   /*IN*/ ULONG  BitPosition); 
       
  4274 
       
  4275 NTOSAPI
       
  4276 NTSTATUS
       
  4277 DDKAPI
       
  4278 RtlCheckRegistryKey(
       
  4279   /*IN*/ ULONG  RelativeTo,
       
  4280   /*IN*/ PWSTR  Path);
       
  4281 
       
  4282 NTOSAPI
       
  4283 VOID
       
  4284 DDKAPI
       
  4285 RtlClearAllBits(
       
  4286   /*IN*/ PRTL_BITMAP  BitMapHeader); 
       
  4287 
       
  4288 NTOSAPI
       
  4289 VOID
       
  4290 DDKAPI
       
  4291 RtlClearBit(
       
  4292   PRTL_BITMAP  BitMapHeader,
       
  4293   ULONG  BitNumber);
       
  4294 
       
  4295 NTOSAPI
       
  4296 VOID
       
  4297 DDKAPI
       
  4298 RtlClearBits(
       
  4299   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4300   /*IN*/ ULONG  StartingIndex,
       
  4301   /*IN*/ ULONG  NumberToClear); 
       
  4302 
       
  4303 NTOSAPI
       
  4304 SIZE_T
       
  4305 DDKAPI
       
  4306 RtlCompareMemory(
       
  4307   /*IN*/ CONST VOID  *Source1,
       
  4308   /*IN*/ CONST VOID  *Source2,
       
  4309   /*IN*/ SIZE_T  Length);
       
  4310 
       
  4311 NTOSAPI
       
  4312 LONG
       
  4313 DDKAPI
       
  4314 RtlCompareString(
       
  4315   /*IN*/ PSTRING  String1,
       
  4316   /*IN*/ PSTRING  String2,
       
  4317   BOOLEAN  CaseInSensitive);
       
  4318 
       
  4319 NTOSAPI
       
  4320 LONG
       
  4321 DDKAPI
       
  4322 RtlCompareUnicodeString(
       
  4323   /*IN*/ PUNICODE_STRING  String1,
       
  4324   /*IN*/ PUNICODE_STRING  String2,
       
  4325   /*IN*/ BOOLEAN  CaseInSensitive);
       
  4326 
       
  4327 NTOSAPI
       
  4328 LARGE_INTEGER
       
  4329 DDKAPI
       
  4330 RtlConvertLongToLargeInteger(
       
  4331   /*IN*/ LONG  SignedInteger);
       
  4332 
       
  4333 NTOSAPI
       
  4334 LUID
       
  4335 DDKAPI
       
  4336 RtlConvertLongToLuid(
       
  4337   /*IN*/ LONG  Long);
       
  4338 
       
  4339 NTOSAPI
       
  4340 LARGE_INTEGER
       
  4341 DDKAPI
       
  4342 RtlConvertUlongToLargeInteger(
       
  4343   /*IN*/ ULONG  UnsignedInteger);
       
  4344 
       
  4345 NTOSAPI
       
  4346 LUID
       
  4347 DDKAPI
       
  4348 RtlConvertUlongToLuid(
       
  4349   ULONG  Ulong);
       
  4350 
       
  4351 /*
       
  4352  * VOID
       
  4353  * RtlCopyMemory(
       
  4354  * IN VOID UNALIGNED  *Destination,
       
  4355  * IN CONST VOID UNALIGNED  *Source,
       
  4356  * IN SIZE_T  Length)
       
  4357  */
       
  4358 #ifndef RtlCopyMemory
       
  4359 #define RtlCopyMemory(Destination, Source, Length) \
       
  4360   memcpy(Destination, Source, Length);
       
  4361 #endif
       
  4362 
       
  4363 #ifndef RtlCopyBytes
       
  4364 #define RtlCopyBytes RtlCopyMemory
       
  4365 #endif
       
  4366 
       
  4367 NTOSAPI
       
  4368 VOID
       
  4369 DDKAPI
       
  4370 RtlCopyMemory32(
       
  4371   /*IN*/ VOID UNALIGNED  *Destination,
       
  4372   /*IN*/ CONST VOID UNALIGNED  *Source,
       
  4373   /*IN*/ ULONG  Length);
       
  4374 
       
  4375 NTOSAPI
       
  4376 NTSTATUS
       
  4377 DDKAPI
       
  4378 RtlCopyRangeList(
       
  4379   /*OUT*/ PRTL_RANGE_LIST  CopyRangeList,
       
  4380   /*IN*/ PRTL_RANGE_LIST  RangeList);
       
  4381 
       
  4382 NTOSAPI
       
  4383 VOID
       
  4384 DDKAPI
       
  4385 RtlCopyString(
       
  4386   /*IN OUT*/ PSTRING  DestinationString,
       
  4387   /*IN*/ PSTRING  SourceString  /*OPTIONAL*/);
       
  4388 
       
  4389 NTOSAPI
       
  4390 VOID
       
  4391 DDKAPI
       
  4392 RtlCopyUnicodeString(
       
  4393   /*IN OUT*/ PUNICODE_STRING  DestinationString,
       
  4394   /*IN*/ PUNICODE_STRING  SourceString);
       
  4395 
       
  4396 NTOSAPI
       
  4397 NTSTATUS
       
  4398 DDKAPI
       
  4399 RtlCreateRegistryKey(
       
  4400   /*IN*/ ULONG  RelativeTo,
       
  4401   /*IN*/ PWSTR  Path);
       
  4402 
       
  4403 NTOSAPI
       
  4404 NTSTATUS
       
  4405 DDKAPI
       
  4406 RtlCreateSecurityDescriptor(
       
  4407   /*IN OUT*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
       
  4408   /*IN*/ ULONG  Revision);
       
  4409 
       
  4410 NTOSAPI
       
  4411 NTSTATUS
       
  4412 DDKAPI
       
  4413 RtlDeleteOwnersRanges(
       
  4414   /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
       
  4415   /*IN*/ PVOID  Owner);
       
  4416 
       
  4417 NTOSAPI
       
  4418 NTSTATUS
       
  4419 DDKAPI
       
  4420 RtlDeleteRange(
       
  4421   /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
       
  4422   /*IN*/ ULONGLONG  Start,
       
  4423   /*IN*/ ULONGLONG  End,
       
  4424   /*IN*/ PVOID  Owner);
       
  4425 
       
  4426 NTOSAPI
       
  4427 NTSTATUS
       
  4428 DDKAPI
       
  4429 RtlDeleteRegistryValue(
       
  4430   /*IN*/ ULONG  RelativeTo,
       
  4431   /*IN*/ PCWSTR  Path,
       
  4432   /*IN*/ PCWSTR  ValueName);
       
  4433 
       
  4434 NTOSAPI
       
  4435 BOOL
       
  4436 DDKAPI
       
  4437 RtlDosPathNameToNtPathName_U(
       
  4438   /*IN*/ PCWSTR  DosPathName,
       
  4439   /*OUT*/ PUNICODE_STRING  NtPathName,
       
  4440   /*OUT*/ PCWSTR  *NtFileNamePart,
       
  4441   /*OUT*/ VOID  *DirectoryInfo);
       
  4442 
       
  4443 /*
       
  4444  * BOOLEAN
       
  4445  * RtlEqualLuid( 
       
  4446  * IN LUID  Luid1,
       
  4447  * IN LUID  Luid2)
       
  4448  */
       
  4449 #define RtlEqualLuid(_Luid1, \
       
  4450                      _Luid2) \
       
  4451   ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
       
  4452 
       
  4453 /*
       
  4454  * ULONG
       
  4455  * RtlEqualMemory(
       
  4456  * IN VOID UNALIGNED  *Destination,
       
  4457  * IN CONST VOID UNALIGNED  *Source,
       
  4458  * IN SIZE_T  Length)
       
  4459  */
       
  4460 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
       
  4461 
       
  4462 NTOSAPI
       
  4463 BOOLEAN
       
  4464 DDKAPI
       
  4465 RtlEqualString(
       
  4466   /*IN*/ PSTRING  String1,
       
  4467   /*IN*/ PSTRING  String2,
       
  4468   /*IN*/ BOOLEAN  CaseInSensitive);
       
  4469 
       
  4470 NTOSAPI
       
  4471 BOOLEAN
       
  4472 DDKAPI
       
  4473 RtlEqualUnicodeString(
       
  4474   /*IN*/ CONST UNICODE_STRING  *String1,
       
  4475   /*IN*/ CONST UNICODE_STRING  *String2,
       
  4476   /*IN*/ BOOLEAN  CaseInSensitive);
       
  4477 
       
  4478 /*
       
  4479  * VOID
       
  4480  * RtlFillMemory(
       
  4481  * IN VOID UNALIGNED  *Destination,
       
  4482  * IN SIZE_T  Length,
       
  4483  * IN UCHAR  Fill)
       
  4484  */
       
  4485 #ifndef RtlFillMemory
       
  4486 #define RtlFillMemory(Destination, Length, Fill) \
       
  4487   memset(Destination, Fill, Length)
       
  4488 #endif
       
  4489 
       
  4490 #ifndef RtlFillBytes
       
  4491 #define RtlFillBytes RtlFillMemory
       
  4492 #endif
       
  4493 
       
  4494 NTOSAPI
       
  4495 ULONG
       
  4496 DDKAPI
       
  4497 RtlFindClearBits(
       
  4498   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4499   /*IN*/ ULONG  NumberToFind,
       
  4500   /*IN*/ ULONG  HintIndex); 
       
  4501 
       
  4502 NTOSAPI
       
  4503 ULONG
       
  4504 DDKAPI
       
  4505 RtlFindClearBitsAndSet(
       
  4506   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4507   /*IN*/ ULONG  NumberToFind,
       
  4508   /*IN*/ ULONG  HintIndex); 
       
  4509 
       
  4510 NTOSAPI
       
  4511 ULONG
       
  4512 DDKAPI
       
  4513 RtlFindClearRuns( 
       
  4514   /*IN*/ PRTL_BITMAP  BitMapHeader, 
       
  4515   /*OUT*/ PRTL_BITMAP_RUN  RunArray, 
       
  4516   /*IN*/ ULONG  SizeOfRunArray, 
       
  4517   /*IN*/ BOOLEAN  LocateLongestRuns);
       
  4518 
       
  4519 NTOSAPI
       
  4520 ULONG
       
  4521 DDKAPI
       
  4522 RtlFindFirstRunClear(
       
  4523   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4524   /*OUT*/ PULONG  StartingIndex);
       
  4525 
       
  4526 NTOSAPI
       
  4527 ULONG
       
  4528 DDKAPI
       
  4529 RtlFindLastBackwardRunClear(
       
  4530   /*IN*/ PRTL_BITMAP  BitMapHeader, 
       
  4531   /*IN*/ ULONG  FromIndex, 
       
  4532   /*OUT*/ PULONG  StartingRunIndex); 
       
  4533 
       
  4534 NTOSAPI
       
  4535 CCHAR
       
  4536 DDKAPI
       
  4537 RtlFindLeastSignificantBit(
       
  4538   /*IN*/ ULONGLONG  Set);
       
  4539 
       
  4540 NTOSAPI
       
  4541 ULONG
       
  4542 DDKAPI
       
  4543 RtlFindLongestRunClear(
       
  4544   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4545   /*OUT*/ PULONG  StartingIndex); 
       
  4546 
       
  4547 NTOSAPI
       
  4548 CCHAR
       
  4549 DDKAPI
       
  4550 RtlFindMostSignificantBit(
       
  4551   /*IN*/ ULONGLONG  Set);
       
  4552 
       
  4553 NTOSAPI
       
  4554 ULONG
       
  4555 DDKAPI
       
  4556 RtlFindNextForwardRunClear(
       
  4557   /*IN*/ PRTL_BITMAP  BitMapHeader, 
       
  4558   /*IN*/ ULONG  FromIndex, 
       
  4559   /*OUT*/ PULONG  StartingRunIndex);
       
  4560 
       
  4561 NTOSAPI
       
  4562 NTSTATUS
       
  4563 DDKAPI
       
  4564 RtlFindRange(
       
  4565   /*IN*/ PRTL_RANGE_LIST  RangeList,
       
  4566   /*IN*/ ULONGLONG  Minimum,
       
  4567   /*IN*/ ULONGLONG  Maximum,
       
  4568   /*IN*/ ULONG  Length,
       
  4569   /*IN*/ ULONG  Alignment,
       
  4570   /*IN*/ ULONG  Flags,
       
  4571   /*IN*/ UCHAR  AttributeAvailableMask,
       
  4572   /*IN*/ PVOID  Context  /*OPTIONAL*/,
       
  4573   /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK  Callback  /*OPTIONAL*/,
       
  4574   /*OUT*/ PULONGLONG  Start);
       
  4575 
       
  4576 NTOSAPI
       
  4577 ULONG
       
  4578 DDKAPI
       
  4579 RtlFindSetBits(
       
  4580   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4581   /*IN*/ ULONG  NumberToFind,
       
  4582   /*IN*/ ULONG  HintIndex); 
       
  4583 
       
  4584 NTOSAPI
       
  4585 ULONG
       
  4586 DDKAPI
       
  4587 RtlFindSetBitsAndClear(
       
  4588   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4589   /*IN*/ ULONG  NumberToFind,
       
  4590   /*IN*/ ULONG  HintIndex); 
       
  4591 
       
  4592 NTOSAPI
       
  4593 VOID
       
  4594 DDKAPI
       
  4595 RtlFreeAnsiString(
       
  4596   /*IN*/ PANSI_STRING  AnsiString);
       
  4597 
       
  4598 NTOSAPI
       
  4599 VOID
       
  4600 DDKAPI
       
  4601 RtlFreeRangeList(
       
  4602   /*IN*/ PRTL_RANGE_LIST  RangeList);
       
  4603 
       
  4604 NTOSAPI
       
  4605 VOID
       
  4606 DDKAPI
       
  4607 RtlFreeUnicodeString(
       
  4608   /*IN*/ PUNICODE_STRING  UnicodeString);
       
  4609 
       
  4610 NTOSAPI
       
  4611 VOID
       
  4612 DDKAPI
       
  4613 RtlGetCallersAddress(
       
  4614   /*OUT*/ PVOID  *CallersAddress,
       
  4615   /*OUT*/ PVOID  *CallersCaller);
       
  4616 
       
  4617 NTOSAPI
       
  4618 NTSTATUS
       
  4619 DDKAPI
       
  4620 RtlGetVersion(
       
  4621   /*IN OUT*/ PRTL_OSVERSIONINFOW  lpVersionInformation);
       
  4622 
       
  4623 NTOSAPI
       
  4624 NTSTATUS
       
  4625 DDKAPI
       
  4626 RtlGetFirstRange(
       
  4627   /*IN*/ PRTL_RANGE_LIST  RangeList,
       
  4628   /*OUT*/ PRTL_RANGE_LIST_ITERATOR  Iterator,
       
  4629   /*OUT*/ PRTL_RANGE  *Range);
       
  4630 
       
  4631 NTOSAPI
       
  4632 NTSTATUS
       
  4633 DDKAPI
       
  4634 RtlGetNextRange(
       
  4635   /*IN OUT*/  PRTL_RANGE_LIST_ITERATOR  Iterator,
       
  4636   /*OUT*/ PRTL_RANGE  *Range,
       
  4637   /*IN*/ BOOLEAN  MoveForwards);
       
  4638 
       
  4639 #define FOR_ALL_RANGES(RangeList, Iterator, Current)          \
       
  4640   for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
       
  4641     (Current) != NULL;                                        \
       
  4642     RtlGetNextRange((Iterator), &(Current), TRUE))
       
  4643 
       
  4644 #define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
       
  4645   for (RtlGetLastRange((RangeList), (Iterator), &(Current));   \
       
  4646     (Current) != NULL;                                         \
       
  4647     RtlGetNextRange((Iterator), &(Current), FALSE))
       
  4648 
       
  4649 NTOSAPI
       
  4650 NTSTATUS
       
  4651 DDKAPI
       
  4652 RtlGUIDFromString( 
       
  4653   /*IN*/ PUNICODE_STRING  GuidString, 
       
  4654   /*OUT*/ GUID  *Guid);
       
  4655 
       
  4656 NTOSAPI
       
  4657 NTSTATUS
       
  4658 DDKAPI
       
  4659 RtlHashUnicodeString(
       
  4660   /*IN*/ CONST UNICODE_STRING  *String,
       
  4661   /*IN*/ BOOLEAN  CaseInSensitive,
       
  4662   /*IN*/ ULONG  HashAlgorithm,
       
  4663   /*OUT*/ PULONG  HashValue);
       
  4664 
       
  4665 NTOSAPI
       
  4666 VOID
       
  4667 DDKAPI
       
  4668 RtlInitAnsiString(
       
  4669   /*IN OUT*/ PANSI_STRING  DestinationString,
       
  4670   /*IN*/ PCSZ  SourceString);
       
  4671 
       
  4672 NTOSAPI
       
  4673 VOID
       
  4674 DDKAPI
       
  4675 RtlInitializeBitMap(
       
  4676   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4677   /*IN*/ PULONG  BitMapBuffer,
       
  4678   /*IN*/ ULONG  SizeOfBitMap); 
       
  4679 
       
  4680 NTOSAPI
       
  4681 VOID
       
  4682 DDKAPI
       
  4683 RtlInitializeRangeList(
       
  4684   /*IN OUT*/ PRTL_RANGE_LIST  RangeList);
       
  4685 
       
  4686 NTOSAPI
       
  4687 VOID
       
  4688 DDKAPI
       
  4689 RtlInitString(
       
  4690   /*IN OUT*/ PSTRING  DestinationString,
       
  4691   /*IN*/ PCSZ  SourceString);
       
  4692 
       
  4693 NTOSAPI
       
  4694 VOID
       
  4695 DDKAPI
       
  4696 RtlInitUnicodeString(
       
  4697   /*IN OUT*/ PUNICODE_STRING  DestinationString,
       
  4698   /*IN*/ PCWSTR  SourceString);
       
  4699 
       
  4700 NTOSAPI
       
  4701 NTSTATUS
       
  4702 DDKAPI
       
  4703 RtlInt64ToUnicodeString(
       
  4704   /*IN*/ ULONGLONG  Value,
       
  4705   /*IN*/ ULONG  Base /*OPTIONAL*/,
       
  4706   /*IN OUT*/ PUNICODE_STRING  String);
       
  4707 
       
  4708 NTOSAPI
       
  4709 NTSTATUS
       
  4710 DDKAPI
       
  4711 RtlIntegerToUnicodeString(
       
  4712   /*IN*/ ULONG  Value,
       
  4713   /*IN*/ ULONG  Base  /*OPTIONAL*/,
       
  4714   /*IN OUT*/ PUNICODE_STRING  String);
       
  4715 
       
  4716 NTOSAPI
       
  4717 NTSTATUS
       
  4718 DDKAPI
       
  4719 RtlIntPtrToUnicodeString(
       
  4720   PLONG  Value,
       
  4721   ULONG  Base  /*OPTIONAL*/,
       
  4722   PUNICODE_STRING  String);
       
  4723 
       
  4724 NTOSAPI
       
  4725 NTSTATUS
       
  4726 DDKAPI
       
  4727 RtlInvertRangeList(
       
  4728   /*OUT*/ PRTL_RANGE_LIST  InvertedRangeList,
       
  4729   /*IN*/ PRTL_RANGE_LIST  RangeList);
       
  4730 
       
  4731 NTOSAPI
       
  4732 NTSTATUS
       
  4733 DDKAPI
       
  4734 RtlIsRangeAvailable(
       
  4735   /*IN*/ PRTL_RANGE_LIST  RangeList,
       
  4736   /*IN*/ ULONGLONG  Start,
       
  4737   /*IN*/ ULONGLONG  End,
       
  4738   /*IN*/ ULONG  Flags,
       
  4739   /*IN*/ UCHAR  AttributeAvailableMask,
       
  4740   /*IN*/ PVOID  Context  /*OPTIONAL*/,
       
  4741   /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK  Callback  /*OPTIONAL*/,
       
  4742   /*OUT*/ PBOOLEAN  Available);
       
  4743 
       
  4744 /*
       
  4745  * BOOLEAN
       
  4746  * RtlIsZeroLuid(
       
  4747  * IN PLUID  L1)
       
  4748  */
       
  4749 #define RtlIsZeroLuid(_L1) \
       
  4750   ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
       
  4751 
       
  4752 NTOSAPI
       
  4753 ULONG
       
  4754 DDKAPI
       
  4755 RtlLengthSecurityDescriptor(
       
  4756   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);
       
  4757 
       
  4758 NTOSAPI
       
  4759 VOID
       
  4760 DDKAPI
       
  4761 RtlMapGenericMask(
       
  4762   /*IN OUT*/ PACCESS_MASK  AccessMask,
       
  4763   /*IN*/ PGENERIC_MAPPING  GenericMapping);
       
  4764 
       
  4765 NTOSAPI
       
  4766 NTSTATUS
       
  4767 DDKAPI
       
  4768 RtlMergeRangeLists(
       
  4769   /*OUT*/ PRTL_RANGE_LIST  MergedRangeList,
       
  4770   /*IN*/ PRTL_RANGE_LIST  RangeList1,
       
  4771   /*IN*/ PRTL_RANGE_LIST  RangeList2,
       
  4772   /*IN*/ ULONG  Flags);
       
  4773 
       
  4774 /*
       
  4775  * VOID
       
  4776  * RtlMoveMemory(
       
  4777  * IN VOID UNALIGNED  *Destination,
       
  4778  * IN CONST VOID UNALIGNED  *Source,
       
  4779  * IN SIZE_T  Length)
       
  4780  */
       
  4781 #define RtlMoveMemory memmove
       
  4782 
       
  4783 NTOSAPI
       
  4784 ULONG
       
  4785 DDKAPI
       
  4786 RtlNumberOfClearBits(
       
  4787   /*IN*/ PRTL_BITMAP  BitMapHeader);
       
  4788 
       
  4789 NTOSAPI
       
  4790 ULONG
       
  4791 DDKAPI
       
  4792 RtlNumberOfSetBits(
       
  4793   /*IN*/ PRTL_BITMAP  BitMapHeader); 
       
  4794 
       
  4795 NTOSAPI
       
  4796 VOID
       
  4797 DDKFASTAPI
       
  4798 RtlPrefetchMemoryNonTemporal(
       
  4799   /*IN*/ PVOID  Source,
       
  4800   /*IN*/ SIZE_T  Length);
       
  4801 
       
  4802 NTOSAPI
       
  4803 BOOLEAN
       
  4804 DDKAPI
       
  4805 RtlPrefixUnicodeString( 
       
  4806   /*IN*/ PUNICODE_STRING  String1, 
       
  4807   /*IN*/ PUNICODE_STRING  String2, 
       
  4808   /*IN*/ BOOLEAN  CaseInSensitive);
       
  4809 
       
  4810 NTOSAPI
       
  4811 NTSTATUS
       
  4812 DDKAPI
       
  4813 RtlQueryRegistryValues(
       
  4814   /*IN*/ ULONG  RelativeTo,
       
  4815   /*IN*/ PCWSTR  Path,
       
  4816   /*IN*/ PRTL_QUERY_REGISTRY_TABLE  QueryTable,
       
  4817   /*IN*/ PVOID  Context,
       
  4818   /*IN*/ PVOID  Environment  /*OPTIONAL*/);
       
  4819 
       
  4820 NTOSAPI
       
  4821 VOID
       
  4822 DDKAPI
       
  4823 RtlRetrieveUlong(
       
  4824   /*IN OUT*/ PULONG  DestinationAddress,
       
  4825   /*IN*/ PULONG  SourceAddress);
       
  4826 
       
  4827 NTOSAPI
       
  4828 VOID
       
  4829 DDKAPI
       
  4830 RtlRetrieveUshort(
       
  4831   /*IN OUT*/ PUSHORT  DestinationAddress,
       
  4832   /*IN*/ PUSHORT  SourceAddress);
       
  4833 
       
  4834 NTOSAPI
       
  4835 VOID
       
  4836 DDKAPI
       
  4837 RtlSetAllBits(
       
  4838   /*IN*/ PRTL_BITMAP  BitMapHeader); 
       
  4839 
       
  4840 NTOSAPI
       
  4841 VOID
       
  4842 DDKAPI
       
  4843 RtlSetBit(
       
  4844   PRTL_BITMAP  BitMapHeader,
       
  4845   ULONG  BitNumber);
       
  4846 
       
  4847 NTOSAPI
       
  4848 VOID
       
  4849 DDKAPI
       
  4850 RtlSetBits(
       
  4851   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4852   /*IN*/ ULONG  StartingIndex,
       
  4853   /*IN*/ ULONG  NumberToSet); 
       
  4854 
       
  4855 NTOSAPI
       
  4856 NTSTATUS
       
  4857 DDKAPI
       
  4858 RtlSetDaclSecurityDescriptor(
       
  4859   /*IN OUT*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
       
  4860   /*IN*/ BOOLEAN  DaclPresent,
       
  4861   /*IN*/ PACL  Dacl  /*OPTIONAL*/,
       
  4862   /*IN*/ BOOLEAN  DaclDefaulted  /*OPTIONAL*/);
       
  4863 
       
  4864 NTOSAPI
       
  4865 VOID
       
  4866 DDKAPI
       
  4867 RtlStoreUlong(
       
  4868   /*IN*/ PULONG  Address,
       
  4869   /*IN*/ ULONG  Value);
       
  4870 
       
  4871 NTOSAPI
       
  4872 VOID
       
  4873 DDKAPI
       
  4874 RtlStoreUlonglong(
       
  4875   /*IN OUT*/ PULONGLONG  Address,
       
  4876   ULONGLONG  Value);
       
  4877 
       
  4878 NTOSAPI
       
  4879 VOID
       
  4880 DDKAPI
       
  4881 RtlStoreUlongPtr(
       
  4882   /*IN OUT*/ PULONG_PTR  Address,
       
  4883   /*IN*/ ULONG_PTR  Value);
       
  4884 
       
  4885 NTOSAPI
       
  4886 VOID
       
  4887 DDKAPI
       
  4888 RtlStoreUshort(
       
  4889   /*IN*/ PUSHORT  Address,
       
  4890   /*IN*/ USHORT  Value);
       
  4891 
       
  4892 NTOSAPI
       
  4893 NTSTATUS
       
  4894 DDKAPI
       
  4895 RtlStringFromGUID( 
       
  4896   /*IN*/ REFGUID  Guid, 
       
  4897   /*OUT*/ PUNICODE_STRING  GuidString);
       
  4898 
       
  4899 NTOSAPI
       
  4900 BOOLEAN
       
  4901 DDKAPI
       
  4902 RtlTestBit(
       
  4903   /*IN*/ PRTL_BITMAP  BitMapHeader,
       
  4904   /*IN*/ ULONG  BitNumber);
       
  4905 
       
  4906 NTOSAPI
       
  4907 BOOLEAN
       
  4908 DDKAPI
       
  4909 RtlTimeFieldsToTime(
       
  4910   /*IN*/ PTIME_FIELDS  TimeFields,
       
  4911   /*IN*/ PLARGE_INTEGER  Time);
       
  4912 
       
  4913 NTOSAPI
       
  4914 VOID
       
  4915 DDKAPI
       
  4916 RtlTimeToTimeFields(
       
  4917   /*IN*/ PLARGE_INTEGER  Time,
       
  4918   /*IN*/ PTIME_FIELDS  TimeFields);
       
  4919 
       
  4920 NTOSAPI
       
  4921 ULONG
       
  4922 DDKFASTAPI
       
  4923 RtlUlongByteSwap(
       
  4924   /*IN*/ ULONG  Source);
       
  4925 
       
  4926 NTOSAPI
       
  4927 ULONGLONG
       
  4928 DDKFASTAPI
       
  4929 RtlUlonglongByteSwap(
       
  4930   /*IN*/ ULONGLONG  Source);
       
  4931 
       
  4932 NTOSAPI
       
  4933 ULONG
       
  4934 DDKAPI
       
  4935 RtlUnicodeStringToAnsiSize(
       
  4936   /*IN*/ PUNICODE_STRING  UnicodeString);
       
  4937 
       
  4938 NTOSAPI
       
  4939 NTSTATUS
       
  4940 DDKAPI
       
  4941 RtlUnicodeStringToAnsiString(
       
  4942   /*IN OUT*/ PANSI_STRING  DestinationString,
       
  4943   /*IN*/ PUNICODE_STRING  SourceString,
       
  4944   /*IN*/ BOOLEAN  AllocateDestinationString);
       
  4945 
       
  4946 NTOSAPI
       
  4947 NTSTATUS
       
  4948 DDKAPI
       
  4949 RtlUnicodeStringToInteger(
       
  4950   /*IN*/ PUNICODE_STRING  String,
       
  4951   /*IN*/ ULONG  Base  /*OPTIONAL*/,
       
  4952   /*OUT*/ PULONG  Value);
       
  4953 
       
  4954 NTOSAPI
       
  4955 WCHAR
       
  4956 DDKAPI
       
  4957 RtlUpcaseUnicodeChar( 
       
  4958   /*IN*/ WCHAR  SourceCharacter);
       
  4959 
       
  4960 NTOSAPI
       
  4961 NTSTATUS
       
  4962 DDKAPI
       
  4963 RtlUpcaseUnicodeString(
       
  4964   /*IN OUT*/ PUNICODE_STRING  DestinationString  /*OPTIONAL*/,
       
  4965   /*IN*/ PCUNICODE_STRING  SourceString,
       
  4966   /*IN*/ BOOLEAN  AllocateDestinationString);
       
  4967 
       
  4968 NTOSAPI
       
  4969 CHAR
       
  4970 DDKAPI
       
  4971 RtlUpperChar( 
       
  4972   /*IN*/ CHAR Character);
       
  4973 
       
  4974 NTOSAPI
       
  4975 VOID
       
  4976 DDKAPI
       
  4977 RtlUpperString(
       
  4978   /*IN OUT*/ PSTRING  DestinationString,
       
  4979   /*IN*/ PSTRING  SourceString);
       
  4980 
       
  4981 NTOSAPI
       
  4982 USHORT
       
  4983 DDKFASTAPI
       
  4984 RtlUshortByteSwap(
       
  4985   /*IN*/ USHORT  Source);
       
  4986 
       
  4987 NTOSAPI
       
  4988 BOOLEAN
       
  4989 DDKAPI
       
  4990 RtlValidRelativeSecurityDescriptor(
       
  4991   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptorInput,
       
  4992   /*IN*/ ULONG  SecurityDescriptorLength,
       
  4993   /*IN*/ SECURITY_INFORMATION  RequiredInformation);
       
  4994 
       
  4995 NTOSAPI
       
  4996 BOOLEAN
       
  4997 DDKAPI
       
  4998 RtlValidSecurityDescriptor(
       
  4999   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);
       
  5000 
       
  5001 NTOSAPI
       
  5002 NTSTATUS
       
  5003 DDKAPI
       
  5004 RtlVerifyVersionInfo(
       
  5005   /*IN*/ PRTL_OSVERSIONINFOEXW  VersionInfo,
       
  5006   /*IN*/ ULONG  TypeMask,
       
  5007   /*IN*/ ULONGLONG  ConditionMask);
       
  5008 
       
  5009 NTOSAPI
       
  5010 NTSTATUS
       
  5011 DDKAPI
       
  5012 RtlVolumeDeviceToDosName(
       
  5013   /*IN*/ PVOID  VolumeDeviceObject,
       
  5014   /*OUT*/ PUNICODE_STRING  DosName);
       
  5015 
       
  5016 NTOSAPI
       
  5017 ULONG
       
  5018 DDKAPI
       
  5019 RtlWalkFrameChain(
       
  5020   /*OUT*/ PVOID  *Callers,
       
  5021   /*IN*/ ULONG  Count,
       
  5022   /*IN*/ ULONG  Flags);
       
  5023 
       
  5024 NTOSAPI
       
  5025 NTSTATUS
       
  5026 DDKAPI
       
  5027 RtlWriteRegistryValue(
       
  5028   /*IN*/ ULONG  RelativeTo,
       
  5029   /*IN*/ PCWSTR  Path,
       
  5030   /*IN*/ PCWSTR  ValueName,
       
  5031   /*IN*/ ULONG  ValueType,
       
  5032   /*IN*/ PVOID  ValueData,
       
  5033   /*IN*/ ULONG  ValueLength);
       
  5034 
       
  5035 NTOSAPI
       
  5036 ULONG
       
  5037 DDKAPI
       
  5038 RtlxUnicodeStringToAnsiSize(
       
  5039   /*IN*/ PUNICODE_STRING  UnicodeString);
       
  5040 
       
  5041 /*
       
  5042  * VOID
       
  5043  * RtlZeroMemory(
       
  5044  * IN VOID UNALIGNED  *Destination,
       
  5045  * IN SIZE_T  Length)
       
  5046  */
       
  5047 #ifndef RtlZeroMemory
       
  5048 #define RtlZeroMemory(Destination, Length) \
       
  5049   memset(Destination, 0, Length)
       
  5050 #endif
       
  5051 
       
  5052 #ifndef RtlZeroBytes
       
  5053 #define RtlZeroBytes RtlZeroMemory
       
  5054 #endif
       
  5055 
       
  5056 
       
  5057 /** Executive support routines **/
       
  5058 
       
  5059 NTOSAPI
       
  5060 VOID
       
  5061 DDKFASTAPI
       
  5062 ExAcquireFastMutex(
       
  5063   /*IN*/ PFAST_MUTEX  FastMutex);
       
  5064 
       
  5065 NTOSAPI
       
  5066 VOID
       
  5067 DDKFASTAPI
       
  5068 ExAcquireFastMutexUnsafe(
       
  5069   /*IN*/ PFAST_MUTEX  FastMutex);
       
  5070 
       
  5071 NTOSAPI
       
  5072 BOOLEAN
       
  5073 DDKAPI
       
  5074 ExAcquireResourceExclusiveLite(
       
  5075   /*IN*/ PERESOURCE  Resource,
       
  5076   /*IN*/ BOOLEAN  Wait);
       
  5077 
       
  5078 NTOSAPI
       
  5079 BOOLEAN
       
  5080 DDKAPI
       
  5081 ExAcquireResourceSharedLite(
       
  5082   /*IN*/ PERESOURCE  Resource,
       
  5083   /*IN*/ BOOLEAN  Wait);
       
  5084 
       
  5085 NTOSAPI
       
  5086 BOOLEAN
       
  5087 DDKAPI
       
  5088 ExAcquireSharedStarveExclusive(
       
  5089   /*IN*/ PERESOURCE  Resource,
       
  5090   /*IN*/ BOOLEAN  Wait);
       
  5091 
       
  5092 NTOSAPI
       
  5093 BOOLEAN
       
  5094 DDKAPI
       
  5095 ExAcquireSharedWaitForExclusive(
       
  5096   /*IN*/ PERESOURCE  Resource,
       
  5097   /*IN*/ BOOLEAN  Wait);
       
  5098 
       
  5099 
       
  5100 NTOSAPI
       
  5101 PSINGLE_LIST_ENTRY
       
  5102 DDKFASTAPI
       
  5103 ExInterlockedPopEntrySList(
       
  5104   /*IN*/ PSLIST_HEADER  ListHead,
       
  5105   /*IN*/ PKSPIN_LOCK  Lock);
       
  5106 
       
  5107 
       
  5108 NTOSAPI
       
  5109 PSINGLE_LIST_ENTRY
       
  5110 DDKFASTAPI
       
  5111 ExInterlockedPushEntrySList(
       
  5112   /*IN*/ PSLIST_HEADER  ListHead,
       
  5113   /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
       
  5114   /*IN*/ PKSPIN_LOCK  Lock);
       
  5115 
       
  5116 
       
  5117 #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
       
  5118 #define ExInterlockedPopEntrySList(_ListHead, \
       
  5119                                    _Lock) \
       
  5120   InterlockedPopEntrySList(_ListHead)
       
  5121 
       
  5122 #define ExInterlockedPushEntrySList(_ListHead, \
       
  5123                                     _ListEntry, \
       
  5124                                     _Lock) \
       
  5125   InterlockedPushEntrySList(_ListHead, _ListEntry)
       
  5126 #endif /*  __USE_NTOSKRNL__ */
       
  5127 
       
  5128 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
       
  5129 
       
  5130 static __inline PVOID
       
  5131 ExAllocateFromNPagedLookasideList(
       
  5132   /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside)
       
  5133 {
       
  5134   PVOID Entry;
       
  5135 
       
  5136   Lookaside->TotalAllocates++;
       
  5137   Entry = ExInterlockedPopEntrySList(&Lookaside->ListHead,
       
  5138 				     &Lookaside->Obsoleted);
       
  5139   if (Entry == NULL) {
       
  5140     Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
       
  5141     Entry = (Lookaside->Allocate)(Lookaside->Type,
       
  5142 				  Lookaside->Size,
       
  5143 				  Lookaside->Tag);
       
  5144   }
       
  5145   return Entry;
       
  5146 }
       
  5147 
       
  5148 static __inline VOID
       
  5149 ExFreeToNPagedLookasideList(
       
  5150   /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside,
       
  5151   /*IN*/ PVOID  Entry)
       
  5152 {
       
  5153   Lookaside->TotalFrees++;
       
  5154   if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
       
  5155     Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
       
  5156     (Lookaside->Free)(Entry);
       
  5157   } else {
       
  5158     ExInterlockedPushEntrySList(&Lookaside->ListHead,
       
  5159 				(PSLIST_ENTRY)Entry,
       
  5160 				&Lookaside->Obsoleted);
       
  5161   }
       
  5162 }
       
  5163 
       
  5164 #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
       
  5165 
       
  5166 static __inline PVOID
       
  5167 ExAllocateFromPagedLookasideList(
       
  5168   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside)
       
  5169 {
       
  5170   PVOID Entry;
       
  5171 
       
  5172   Lookaside->TotalAllocates++;
       
  5173   Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
       
  5174   if (Entry == NULL) {
       
  5175     Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
       
  5176     Entry = (Lookaside->Allocate)(Lookaside->Type,
       
  5177 				  Lookaside->Size,
       
  5178 				  Lookaside->Tag);
       
  5179   }
       
  5180   return Entry;
       
  5181 }
       
  5182 
       
  5183 static __inline VOID
       
  5184 ExFreeToPagedLookasideList(
       
  5185   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside,
       
  5186   /*IN*/ PVOID  Entry)
       
  5187 {
       
  5188   Lookaside->TotalFrees++;
       
  5189   if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
       
  5190     Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
       
  5191     (Lookaside->Free)(Entry);
       
  5192   } else {
       
  5193     InterlockedPushEntrySList(&Lookaside->ListHead,
       
  5194 			      (PSLIST_ENTRY)Entry);
       
  5195   }
       
  5196 }
       
  5197 
       
  5198 #else /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
       
  5199 
       
  5200 NTOSAPI
       
  5201 PVOID
       
  5202 DDKAPI
       
  5203 ExAllocateFromPagedLookasideList(
       
  5204   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside);
       
  5205 
       
  5206 NTOSAPI
       
  5207 VOID
       
  5208 DDKAPI
       
  5209 ExFreeToPagedLookasideList(
       
  5210   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside,
       
  5211   /*IN*/ PVOID  Entry);
       
  5212 
       
  5213 #endif /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
       
  5214 
       
  5215 NTOSAPI
       
  5216 PVOID
       
  5217 DDKAPI
       
  5218 ExAllocatePoolWithQuotaTag(
       
  5219   /*IN*/ POOL_TYPE  PoolType,
       
  5220   /*IN*/ SIZE_T  NumberOfBytes,
       
  5221   /*IN*/ ULONG  Tag);
       
  5222 
       
  5223 NTOSAPI
       
  5224 PVOID
       
  5225 DDKAPI
       
  5226 ExAllocatePoolWithTag(
       
  5227   /*IN*/ POOL_TYPE  PoolType,
       
  5228   /*IN*/ SIZE_T  NumberOfBytes,
       
  5229   /*IN*/ ULONG  Tag);
       
  5230 
       
  5231 #ifdef POOL_TAGGING
       
  5232 
       
  5233 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
       
  5234 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
       
  5235 
       
  5236 #else /* !POOL_TAGGING */
       
  5237 
       
  5238 NTOSAPI
       
  5239 PVOID
       
  5240 DDKAPI
       
  5241 ExAllocatePool(
       
  5242   /*IN*/ POOL_TYPE  PoolType,
       
  5243   /*IN*/ SIZE_T  NumberOfBytes);
       
  5244 
       
  5245 NTOSAPI
       
  5246 PVOID
       
  5247 DDKAPI
       
  5248 ExAllocatePoolWithQuota(
       
  5249   /*IN*/ POOL_TYPE  PoolType,
       
  5250   /*IN*/ SIZE_T  NumberOfBytes);
       
  5251 
       
  5252 #endif /* POOL_TAGGING */
       
  5253 
       
  5254 NTOSAPI
       
  5255 PVOID
       
  5256 DDKAPI
       
  5257 ExAllocatePoolWithTagPriority(
       
  5258   /*IN*/ POOL_TYPE  PoolType,
       
  5259   /*IN*/ SIZE_T  NumberOfBytes,
       
  5260   /*IN*/ ULONG  Tag,
       
  5261   /*IN*/ EX_POOL_PRIORITY  Priority);
       
  5262 
       
  5263 NTOSAPI
       
  5264 VOID
       
  5265 DDKAPI
       
  5266 ExConvertExclusiveToSharedLite(
       
  5267   /*IN*/ PERESOURCE  Resource);
       
  5268 
       
  5269 NTOSAPI
       
  5270 NTSTATUS
       
  5271 DDKAPI
       
  5272 ExCreateCallback(
       
  5273   /*OUT*/ PCALLBACK_OBJECT  *CallbackObject,
       
  5274   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  5275   /*IN*/ BOOLEAN  Create,
       
  5276   /*IN*/ BOOLEAN  AllowMultipleCallbacks);
       
  5277 
       
  5278 NTOSAPI
       
  5279 VOID
       
  5280 DDKAPI
       
  5281 ExDeleteNPagedLookasideList(
       
  5282   /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside);
       
  5283 
       
  5284 NTOSAPI
       
  5285 VOID
       
  5286 DDKAPI
       
  5287 ExDeletePagedLookasideList(
       
  5288   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside);
       
  5289 
       
  5290 NTOSAPI
       
  5291 NTSTATUS
       
  5292 DDKAPI
       
  5293 ExDeleteResourceLite(
       
  5294   /*IN*/ PERESOURCE  Resource);
       
  5295 
       
  5296 NTOSAPI
       
  5297 VOID
       
  5298 DDKAPI
       
  5299 ExFreePool(
       
  5300   /*IN*/ PVOID  P);
       
  5301 
       
  5302 #define PROTECTED_POOL                    0x80000000
       
  5303 
       
  5304 #ifdef POOL_TAGGING
       
  5305 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
       
  5306 #endif
       
  5307 
       
  5308 NTOSAPI
       
  5309 VOID
       
  5310 DDKAPI
       
  5311 ExFreePoolWithTag(
       
  5312   /*IN*/ PVOID  P,
       
  5313   /*IN*/ ULONG  Tag);
       
  5314 
       
  5315 /*
       
  5316  * ERESOURCE_THREAD
       
  5317  * ExGetCurrentResourceThread(
       
  5318  *   VOID);
       
  5319  */
       
  5320 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
       
  5321 
       
  5322 NTOSAPI
       
  5323 ULONG
       
  5324 DDKAPI
       
  5325 ExGetExclusiveWaiterCount(
       
  5326   /*IN*/ PERESOURCE  Resource);
       
  5327 
       
  5328 NTOSAPI
       
  5329 KPROCESSOR_MODE
       
  5330 DDKAPI
       
  5331 ExGetPreviousMode( 
       
  5332   VOID);
       
  5333 
       
  5334 NTOSAPI
       
  5335 ULONG
       
  5336 DDKAPI
       
  5337 ExGetSharedWaiterCount(
       
  5338   /*IN*/ PERESOURCE  Resource);
       
  5339 
       
  5340 NTOSAPI
       
  5341 VOID
       
  5342 DDKAPI
       
  5343 KeInitializeEvent(
       
  5344   /*IN*/ PRKEVENT  Event,
       
  5345   /*IN*/ EVENT_TYPE  Type,
       
  5346   /*IN*/ BOOLEAN  State);
       
  5347 
       
  5348 /*
       
  5349  * VOID DDKAPI
       
  5350  * ExInitializeFastMutex(
       
  5351  * IN PFAST_MUTEX  FastMutex)
       
  5352  */
       
  5353 #define ExInitializeFastMutex(_FastMutex) \
       
  5354 { \
       
  5355   (_FastMutex)->Count = 1; \
       
  5356   (_FastMutex)->Owner = NULL; \
       
  5357   (_FastMutex)->Contention = 0; \
       
  5358   KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
       
  5359 }
       
  5360 
       
  5361 NTOSAPI
       
  5362 VOID
       
  5363 DDKAPI
       
  5364 ExInitializeNPagedLookasideList(
       
  5365   /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside,
       
  5366   /*IN*/ PALLOCATE_FUNCTION  Allocate  /*OPTIONAL*/,
       
  5367   /*IN*/ PFREE_FUNCTION  Free  /*OPTIONAL*/,
       
  5368   /*IN*/ ULONG  Flags,
       
  5369   /*IN*/ SIZE_T  Size,
       
  5370   /*IN*/ ULONG  Tag,
       
  5371   /*IN*/ USHORT  Depth);
       
  5372 
       
  5373 NTOSAPI
       
  5374 VOID
       
  5375 DDKAPI
       
  5376 ExInitializePagedLookasideList(
       
  5377   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside,
       
  5378   /*IN*/ PALLOCATE_FUNCTION  Allocate  /*OPTIONAL*/,
       
  5379   /*IN*/ PFREE_FUNCTION  Free  /*OPTIONAL*/,
       
  5380   /*IN*/ ULONG  Flags,
       
  5381   /*IN*/ SIZE_T  Size,
       
  5382   /*IN*/ ULONG  Tag,
       
  5383   /*IN*/ USHORT  Depth);
       
  5384 
       
  5385 NTOSAPI
       
  5386 NTSTATUS
       
  5387 DDKAPI
       
  5388 ExInitializeResourceLite(
       
  5389   /*IN*/ PERESOURCE  Resource);
       
  5390 
       
  5391 /*
       
  5392  * VOID
       
  5393  * InitializeSListHead(
       
  5394  * IN PSLIST_HEADER  SListHead)
       
  5395  */
       
  5396 #define InitializeSListHead(_SListHead) \
       
  5397 	(_SListHead)->Alignment = 0
       
  5398 
       
  5399 #define ExInitializeSListHead InitializeSListHead
       
  5400 
       
  5401 NTOSAPI
       
  5402 LARGE_INTEGER
       
  5403 DDKAPI
       
  5404 ExInterlockedAddLargeInteger(
       
  5405   /*IN*/ PLARGE_INTEGER  Addend,
       
  5406   /*IN*/ LARGE_INTEGER  Increment,
       
  5407   /*IN*/ PKSPIN_LOCK  Lock);
       
  5408 
       
  5409 NTOSAPI
       
  5410 VOID
       
  5411 DDKFASTAPI
       
  5412 ExInterlockedAddLargeStatistic(
       
  5413   /*IN*/ PLARGE_INTEGER  Addend,
       
  5414   /*IN*/ ULONG  Increment);
       
  5415 
       
  5416 NTOSAPI
       
  5417 ULONG
       
  5418 DDKAPI
       
  5419 ExInterlockedAddUlong(
       
  5420   /*IN*/ PULONG  Addend,
       
  5421   /*IN*/ ULONG  Increment,
       
  5422   PKSPIN_LOCK  Lock);
       
  5423 
       
  5424 NTOSAPI
       
  5425 ULONG
       
  5426 DDKFASTAPI
       
  5427 ExfInterlockedAddUlong(
       
  5428   /*IN*/ PULONG  Addend,
       
  5429   /*IN*/ ULONG  Increment,
       
  5430   PKSPIN_LOCK  Lock);
       
  5431 
       
  5432 
       
  5433 NTOSAPI
       
  5434 LONGLONG
       
  5435 DDKFASTAPI
       
  5436 ExInterlockedCompareExchange64(
       
  5437   /*IN OUT*/ PLONGLONG  Destination,
       
  5438   /*IN*/ PLONGLONG  Exchange,
       
  5439   /*IN*/ PLONGLONG  Comparand,
       
  5440   /*IN*/ PKSPIN_LOCK  Lock); 
       
  5441 
       
  5442 NTOSAPI
       
  5443 PSINGLE_LIST_ENTRY
       
  5444 DDKFASTAPI
       
  5445 ExInterlockedFlushSList(
       
  5446   /*IN*/ PSLIST_HEADER  ListHead);
       
  5447 
       
  5448 NTOSAPI
       
  5449 PLIST_ENTRY
       
  5450 DDKAPI
       
  5451 ExInterlockedInsertHeadList(
       
  5452   /*IN*/ PLIST_ENTRY  ListHead,
       
  5453   /*IN*/ PLIST_ENTRY  ListEntry,
       
  5454   /*IN*/ PKSPIN_LOCK  Lock);
       
  5455 
       
  5456 NTOSAPI
       
  5457 PLIST_ENTRY
       
  5458 DDKFASTAPI
       
  5459 ExfInterlockedInsertHeadList(
       
  5460   /*IN*/ PLIST_ENTRY  ListHead,
       
  5461   /*IN*/ PLIST_ENTRY  ListEntry,
       
  5462   /*IN*/ PKSPIN_LOCK  Lock);
       
  5463 
       
  5464 NTOSAPI
       
  5465 PLIST_ENTRY
       
  5466 DDKAPI
       
  5467 ExInterlockedInsertTailList(
       
  5468   /*IN*/ PLIST_ENTRY  ListHead,
       
  5469   /*IN*/ PLIST_ENTRY  ListEntry,
       
  5470   /*IN*/ PKSPIN_LOCK  Lock);
       
  5471 
       
  5472 NTOSAPI
       
  5473 PLIST_ENTRY
       
  5474 DDKFASTAPI
       
  5475 ExfInterlockedInsertTailList(
       
  5476   /*IN*/ PLIST_ENTRY  ListHead,
       
  5477   /*IN*/ PLIST_ENTRY  ListEntry,
       
  5478   /*IN*/ PKSPIN_LOCK  Lock);
       
  5479 
       
  5480 NTOSAPI
       
  5481 PSINGLE_LIST_ENTRY
       
  5482 DDKAPI
       
  5483 ExInterlockedPopEntryList(
       
  5484   /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
       
  5485   /*IN*/ PKSPIN_LOCK  Lock);
       
  5486 
       
  5487 NTOSAPI
       
  5488 PSINGLE_LIST_ENTRY
       
  5489 DDKFASTAPI
       
  5490 ExfInterlockedPopEntryList(
       
  5491   /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
       
  5492   /*IN*/ PKSPIN_LOCK  Lock);
       
  5493 
       
  5494 
       
  5495 NTOSAPI
       
  5496 PSINGLE_LIST_ENTRY
       
  5497 DDKAPI
       
  5498 ExInterlockedPushEntryList(
       
  5499   /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
       
  5500   /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
       
  5501   /*IN*/ PKSPIN_LOCK  Lock);
       
  5502 
       
  5503 NTOSAPI
       
  5504 PSINGLE_LIST_ENTRY
       
  5505 DDKFASTAPI
       
  5506 ExfInterlockedPushEntryList(
       
  5507   /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
       
  5508   /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
       
  5509   /*IN*/ PKSPIN_LOCK  Lock);
       
  5510 
       
  5511 
       
  5512 NTOSAPI
       
  5513 PLIST_ENTRY
       
  5514 DDKAPI
       
  5515 ExInterlockedRemoveHeadList(
       
  5516   /*IN*/ PLIST_ENTRY  ListHead,
       
  5517   /*IN*/ PKSPIN_LOCK  Lock);
       
  5518 
       
  5519 NTOSAPI
       
  5520 PLIST_ENTRY
       
  5521 DDKFASTAPI
       
  5522 ExfInterlockedRemoveHeadList(
       
  5523   /*IN*/ PLIST_ENTRY  ListHead,
       
  5524   /*IN*/ PKSPIN_LOCK  Lock);
       
  5525 
       
  5526 
       
  5527 NTOSAPI
       
  5528 BOOLEAN
       
  5529 DDKAPI
       
  5530 ExIsProcessorFeaturePresent(
       
  5531   /*IN*/ ULONG  ProcessorFeature);
       
  5532 
       
  5533 NTOSAPI
       
  5534 BOOLEAN
       
  5535 DDKAPI
       
  5536 ExIsResourceAcquiredExclusiveLite(
       
  5537   /*IN*/ PERESOURCE  Resource);
       
  5538 
       
  5539 NTOSAPI
       
  5540 USHORT
       
  5541 DDKAPI
       
  5542 ExIsResourceAcquiredLite(
       
  5543   /*IN*/ PERESOURCE  Resource);
       
  5544 
       
  5545 NTOSAPI
       
  5546 USHORT
       
  5547 DDKAPI
       
  5548 ExIsResourceAcquiredSharedLite(
       
  5549   /*IN*/ PERESOURCE  Resource);
       
  5550 
       
  5551 NTOSAPI
       
  5552 VOID
       
  5553 DDKAPI
       
  5554 ExLocalTimeToSystemTime(
       
  5555   /*IN*/ PLARGE_INTEGER  LocalTime,
       
  5556   /*OUT*/ PLARGE_INTEGER  SystemTime);
       
  5557 
       
  5558 NTOSAPI
       
  5559 VOID
       
  5560 DDKAPI
       
  5561 ExNotifyCallback(
       
  5562   /*IN*/ PCALLBACK_OBJECT  CallbackObject,
       
  5563   /*IN*/ PVOID  Argument1,
       
  5564   /*IN*/ PVOID  Argument2);
       
  5565 
       
  5566 NTOSAPI
       
  5567 VOID
       
  5568 DDKAPI
       
  5569 ExRaiseAccessViolation(
       
  5570   VOID);
       
  5571 
       
  5572 NTOSAPI
       
  5573 VOID
       
  5574 DDKAPI
       
  5575 ExRaiseDatatypeMisalignment(
       
  5576   VOID);
       
  5577 
       
  5578 NTOSAPI
       
  5579 VOID
       
  5580 DDKAPI
       
  5581 ExRaiseStatus(
       
  5582   /*IN*/ NTSTATUS  Status);
       
  5583 
       
  5584 NTOSAPI
       
  5585 PVOID
       
  5586 DDKAPI
       
  5587 ExRegisterCallback(
       
  5588   /*IN*/ PCALLBACK_OBJECT  CallbackObject,
       
  5589   /*IN*/ PCALLBACK_FUNCTION  CallbackFunction,
       
  5590   /*IN*/ PVOID  CallbackContext);
       
  5591 
       
  5592 NTOSAPI
       
  5593 VOID
       
  5594 DDKAPI
       
  5595 ExReinitializeResourceLite(
       
  5596   /*IN*/ PERESOURCE  Resource);
       
  5597 
       
  5598 NTOSAPI
       
  5599 VOID
       
  5600 DDKFASTAPI
       
  5601 ExReleaseFastMutex(
       
  5602   /*IN*/ PFAST_MUTEX  FastMutex);
       
  5603 
       
  5604 NTOSAPI
       
  5605 VOID
       
  5606 DDKFASTAPI
       
  5607 ExReleaseFastMutexUnsafe(
       
  5608   /*IN*/ PFAST_MUTEX  FastMutex);
       
  5609 
       
  5610 NTOSAPI
       
  5611 VOID
       
  5612 DDKAPI
       
  5613 ExReleaseResourceForThreadLite(
       
  5614   /*IN*/ PERESOURCE  Resource,
       
  5615   /*IN*/ ERESOURCE_THREAD  ResourceThreadId);
       
  5616 
       
  5617 NTOSAPI
       
  5618 VOID
       
  5619 DDKFASTAPI
       
  5620 ExReleaseResourceLite(
       
  5621   /*IN*/ PERESOURCE  Resource);
       
  5622 
       
  5623 NTOSAPI
       
  5624 VOID
       
  5625 DDKAPI
       
  5626 ExSetResourceOwnerPointer( 
       
  5627   /*IN*/ PERESOURCE  Resource,
       
  5628   /*IN*/ PVOID  OwnerPointer);
       
  5629 
       
  5630 NTOSAPI
       
  5631 ULONG
       
  5632 DDKAPI
       
  5633 ExSetTimerResolution(
       
  5634   /*IN*/ ULONG  DesiredTime,
       
  5635   /*IN*/ BOOLEAN  SetResolution);
       
  5636 
       
  5637 NTOSAPI
       
  5638 VOID
       
  5639 DDKAPI
       
  5640 ExSystemTimeToLocalTime(
       
  5641   /*IN*/ PLARGE_INTEGER  SystemTime,
       
  5642   /*OUT*/ PLARGE_INTEGER  LocalTime);
       
  5643 
       
  5644 NTOSAPI
       
  5645 BOOLEAN
       
  5646 DDKFASTAPI
       
  5647 ExTryToAcquireFastMutex(
       
  5648   /*IN*/ PFAST_MUTEX  FastMutex);
       
  5649 
       
  5650 NTOSAPI
       
  5651 BOOLEAN
       
  5652 DDKAPI
       
  5653 ExTryToAcquireResourceExclusiveLite(
       
  5654   /*IN*/ PERESOURCE  Resource);
       
  5655 
       
  5656 NTOSAPI
       
  5657 VOID
       
  5658 DDKAPI
       
  5659 ExUnregisterCallback(
       
  5660   /*IN*/ PVOID  CbRegistration);
       
  5661 
       
  5662 NTOSAPI
       
  5663 NTSTATUS
       
  5664 DDKAPI
       
  5665 ExUuidCreate(
       
  5666   /*OUT*/ UUID  *Uuid);
       
  5667 
       
  5668 NTOSAPI
       
  5669 BOOLEAN
       
  5670 DDKAPI
       
  5671 ExVerifySuite(
       
  5672   /*IN*/ SUITE_TYPE  SuiteType);
       
  5673 
       
  5674 #ifdef DBG
       
  5675 
       
  5676 #define PAGED_CODE() { \
       
  5677   if (KeGetCurrentIrql() > APC_LEVEL) { \
       
  5678     KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
       
  5679     ASSERT(FALSE); \
       
  5680   } \
       
  5681 }
       
  5682 
       
  5683 #else
       
  5684 
       
  5685 #define PAGED_CODE()
       
  5686 
       
  5687 #endif
       
  5688 
       
  5689 NTOSAPI
       
  5690 VOID
       
  5691 DDKAPI
       
  5692 ProbeForRead(
       
  5693   /*IN*/ CONST VOID  *Address,
       
  5694   /*IN*/ ULONG  Length,
       
  5695   /*IN*/ ULONG  Alignment);
       
  5696 
       
  5697 NTOSAPI
       
  5698 VOID
       
  5699 DDKAPI
       
  5700 ProbeForWrite(
       
  5701   /*IN*/ CONST VOID  *Address,
       
  5702   /*IN*/ ULONG  Length,
       
  5703   /*IN*/ ULONG  Alignment);
       
  5704 
       
  5705 
       
  5706 
       
  5707 /** Configuration manager routines **/
       
  5708 
       
  5709 NTOSAPI
       
  5710 NTSTATUS
       
  5711 DDKAPI
       
  5712 CmRegisterCallback(
       
  5713   /*IN*/ PEX_CALLBACK_FUNCTION  Function,
       
  5714   /*IN*/ PVOID  Context,
       
  5715   /*IN OUT*/ PLARGE_INTEGER  Cookie);
       
  5716 
       
  5717 NTOSAPI
       
  5718 NTSTATUS
       
  5719 DDKAPI
       
  5720 CmUnRegisterCallback(
       
  5721   /*IN*/ LARGE_INTEGER  Cookie);
       
  5722 
       
  5723 
       
  5724 
       
  5725 /** Filesystem runtime library routines **/
       
  5726 
       
  5727 NTOSAPI
       
  5728 BOOLEAN
       
  5729 DDKAPI
       
  5730 FsRtlIsTotalDeviceFailure(
       
  5731   /*IN*/ NTSTATUS  Status);
       
  5732 
       
  5733 
       
  5734 
       
  5735 /** Hardware abstraction layer routines **/
       
  5736 
       
  5737 NTOSAPI
       
  5738 VOID
       
  5739 DDKFASTAPI
       
  5740 HalExamineMBR(
       
  5741   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  5742   /*IN*/ ULONG  SectorSize,
       
  5743   /*IN*/ ULONG  MBRTypeIdentifier,
       
  5744   /*OUT*/ PVOID  Buffer);
       
  5745 
       
  5746 NTOSAPI
       
  5747 VOID
       
  5748 DDKAPI
       
  5749 READ_PORT_BUFFER_UCHAR(
       
  5750   /*IN*/ PUCHAR  Port,
       
  5751   /*IN*/ PUCHAR  Buffer,
       
  5752   /*IN*/ ULONG  Count);
       
  5753 
       
  5754 NTOSAPI
       
  5755 VOID
       
  5756 DDKAPI
       
  5757 READ_PORT_BUFFER_ULONG(
       
  5758   /*IN*/ PULONG  Port,
       
  5759   /*IN*/ PULONG  Buffer,
       
  5760   /*IN*/ ULONG  Count);
       
  5761 
       
  5762 NTOSAPI
       
  5763 VOID
       
  5764 DDKAPI
       
  5765 READ_PORT_BUFFER_USHORT(
       
  5766   /*IN*/ PUSHORT  Port,
       
  5767   /*IN*/ PUSHORT  Buffer,
       
  5768   /*IN*/ ULONG  Count);
       
  5769 
       
  5770 NTOSAPI
       
  5771 UCHAR
       
  5772 DDKAPI
       
  5773 READ_PORT_UCHAR(
       
  5774   /*IN*/ PUCHAR  Port);
       
  5775 
       
  5776 NTOSAPI
       
  5777 ULONG
       
  5778 DDKAPI
       
  5779 READ_PORT_ULONG(
       
  5780   /*IN*/ PULONG  Port);
       
  5781 
       
  5782 NTOSAPI
       
  5783 USHORT
       
  5784 DDKAPI
       
  5785 READ_PORT_USHORT(
       
  5786   /*IN*/ PUSHORT  Port);
       
  5787 
       
  5788 NTOSAPI
       
  5789 VOID
       
  5790 DDKAPI
       
  5791 READ_REGISTER_BUFFER_UCHAR(
       
  5792   /*IN*/ PUCHAR  Register,
       
  5793   /*IN*/ PUCHAR  Buffer,
       
  5794   /*IN*/ ULONG  Count);
       
  5795 
       
  5796 NTOSAPI
       
  5797 VOID
       
  5798 DDKAPI
       
  5799 READ_REGISTER_BUFFER_ULONG(
       
  5800   /*IN*/ PULONG  Register,
       
  5801   /*IN*/ PULONG  Buffer,
       
  5802   /*IN*/ ULONG  Count);
       
  5803 
       
  5804 NTOSAPI
       
  5805 VOID
       
  5806 DDKAPI
       
  5807 READ_REGISTER_BUFFER_USHORT(
       
  5808   /*IN*/ PUSHORT  Register,
       
  5809   /*IN*/ PUSHORT  Buffer,
       
  5810   /*IN*/ ULONG  Count);
       
  5811 
       
  5812 NTOSAPI
       
  5813 UCHAR
       
  5814 DDKAPI
       
  5815 READ_REGISTER_UCHAR(
       
  5816   /*IN*/ PUCHAR  Register);
       
  5817 
       
  5818 NTOSAPI
       
  5819 ULONG
       
  5820 DDKAPI
       
  5821 READ_REGISTER_ULONG(
       
  5822   /*IN*/ PULONG  Register);
       
  5823 
       
  5824 NTOSAPI
       
  5825 USHORT
       
  5826 DDKAPI
       
  5827 READ_REGISTER_USHORT(
       
  5828   /*IN*/ PUSHORT  Register);
       
  5829 
       
  5830 NTOSAPI
       
  5831 VOID
       
  5832 DDKAPI
       
  5833 WRITE_PORT_BUFFER_UCHAR(
       
  5834   /*IN*/ PUCHAR  Port,
       
  5835   /*IN*/ PUCHAR  Buffer,
       
  5836   /*IN*/ ULONG  Count);
       
  5837 
       
  5838 NTOSAPI
       
  5839 VOID
       
  5840 DDKAPI
       
  5841 WRITE_PORT_BUFFER_ULONG(
       
  5842   /*IN*/ PULONG  Port,
       
  5843   /*IN*/ PULONG  Buffer,
       
  5844   /*IN*/ ULONG  Count);
       
  5845 
       
  5846 NTOSAPI
       
  5847 VOID
       
  5848 DDKAPI
       
  5849 WRITE_PORT_BUFFER_USHORT(
       
  5850   /*IN*/ PUSHORT  Port,
       
  5851   /*IN*/ PUSHORT  Buffer,
       
  5852   /*IN*/ ULONG  Count);
       
  5853 
       
  5854 NTOSAPI
       
  5855 VOID
       
  5856 DDKAPI
       
  5857 WRITE_PORT_UCHAR(
       
  5858   /*IN*/ PUCHAR  Port,
       
  5859   /*IN*/ UCHAR  Value);
       
  5860 
       
  5861 NTOSAPI
       
  5862 VOID
       
  5863 DDKAPI
       
  5864 WRITE_PORT_ULONG(
       
  5865   /*IN*/ PULONG  Port,
       
  5866   /*IN*/ ULONG  Value);
       
  5867 
       
  5868 NTOSAPI
       
  5869 VOID
       
  5870 DDKAPI
       
  5871 WRITE_PORT_USHORT(
       
  5872   /*IN*/ PUSHORT  Port,
       
  5873   /*IN*/ USHORT  Value);
       
  5874 
       
  5875 NTOSAPI
       
  5876 VOID
       
  5877 DDKAPI
       
  5878 WRITE_REGISTER_BUFFER_UCHAR(
       
  5879   /*IN*/ PUCHAR  Register,
       
  5880   /*IN*/ PUCHAR  Buffer,
       
  5881   /*IN*/ ULONG  Count);
       
  5882 
       
  5883 NTOSAPI
       
  5884 VOID
       
  5885 DDKAPI
       
  5886 WRITE_REGISTER_BUFFER_ULONG(
       
  5887   /*IN*/ PULONG  Register,
       
  5888   /*IN*/ PULONG  Buffer,
       
  5889   /*IN*/ ULONG  Count);
       
  5890 
       
  5891 NTOSAPI
       
  5892 VOID
       
  5893 DDKAPI
       
  5894 WRITE_REGISTER_BUFFER_USHORT(
       
  5895   /*IN*/ PUSHORT  Register,
       
  5896   /*IN*/ PUSHORT  Buffer,
       
  5897   /*IN*/ ULONG  Count);
       
  5898 
       
  5899 NTOSAPI
       
  5900 VOID
       
  5901 DDKAPI
       
  5902 WRITE_REGISTER_UCHAR(
       
  5903   /*IN*/ PUCHAR  Register,
       
  5904   /*IN*/ UCHAR  Value);
       
  5905 
       
  5906 NTOSAPI
       
  5907 VOID
       
  5908 DDKAPI
       
  5909 WRITE_REGISTER_ULONG(
       
  5910   /*IN*/ PULONG  Register,
       
  5911   /*IN*/ ULONG  Value);
       
  5912 
       
  5913 NTOSAPI
       
  5914 VOID
       
  5915 DDKAPI
       
  5916 WRITE_REGISTER_USHORT(
       
  5917   /*IN*/ PUSHORT  Register,
       
  5918   /*IN*/ USHORT  Value);
       
  5919 
       
  5920 /** I/O manager routines **/
       
  5921 
       
  5922 NTOSAPI
       
  5923 VOID
       
  5924 DDKAPI
       
  5925 IoAcquireCancelSpinLock(
       
  5926   /*OUT*/ PKIRQL  Irql);
       
  5927 
       
  5928 NTOSAPI
       
  5929 NTSTATUS
       
  5930 DDKAPI
       
  5931 IoAcquireRemoveLockEx(
       
  5932   /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
       
  5933   /*IN*/ PVOID  Tag  /*OPTIONAL*/,
       
  5934   /*IN*/ PCSTR  File,
       
  5935   /*IN*/ ULONG  Line,
       
  5936   /*IN*/ ULONG  RemlockSize);
       
  5937 
       
  5938 /*
       
  5939  * NTSTATUS
       
  5940  * IoAcquireRemoveLock(
       
  5941  * IN PIO_REMOVE_LOCK  RemoveLock,
       
  5942  * IN PVOID  Tag OPTIONAL)
       
  5943  */
       
  5944 #define IoAcquireRemoveLock(_RemoveLock, \
       
  5945                             _Tag) \
       
  5946   IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
       
  5947 
       
  5948 /*
       
  5949  * VOID
       
  5950  * IoAdjustPagingPathCount(
       
  5951  * IN PLONG  Count,
       
  5952  * IN BOOLEAN  Increment)
       
  5953  */
       
  5954 #define IoAdjustPagingPathCount(_Count, \
       
  5955                                 _Increment) \
       
  5956 { \
       
  5957   if (_Increment) \
       
  5958     { \
       
  5959       InterlockedIncrement(_Count); \
       
  5960     } \
       
  5961   else \
       
  5962     { \
       
  5963       InterlockedDecrement(_Count); \
       
  5964     } \
       
  5965 }
       
  5966 
       
  5967 NTOSAPI
       
  5968 VOID
       
  5969 DDKAPI
       
  5970 IoAllocateController(
       
  5971   /*IN*/ PCONTROLLER_OBJECT  ControllerObject,
       
  5972   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  5973   /*IN*/ PDRIVER_CONTROL  ExecutionRoutine,
       
  5974   /*IN*/ PVOID  Context);
       
  5975 
       
  5976 NTOSAPI
       
  5977 NTSTATUS
       
  5978 DDKAPI
       
  5979 IoAllocateDriverObjectExtension(
       
  5980   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  5981   /*IN*/ PVOID  ClientIdentificationAddress,
       
  5982   /*IN*/ ULONG  DriverObjectExtensionSize,
       
  5983   /*OUT*/ PVOID  *DriverObjectExtension);
       
  5984 
       
  5985 typedef struct _IO_ERROR_LOG_PACKET { 
       
  5986 	UCHAR  MajorFunctionCode; 
       
  5987 	UCHAR  RetryCount; 
       
  5988 	USHORT  DumpDataSize; 
       
  5989 	USHORT  NumberOfStrings; 
       
  5990 	USHORT  StringOffset; 
       
  5991 	USHORT  EventCategory; 
       
  5992 	NTSTATUS  ErrorCode; 
       
  5993 	ULONG  UniqueErrorValue; 
       
  5994 	NTSTATUS  FinalStatus; 
       
  5995 	ULONG  SequenceNumber; 
       
  5996 	ULONG  IoControlCode; 
       
  5997 	LARGE_INTEGER  DeviceOffset; 
       
  5998 	ULONG  DumpData[1]; 
       
  5999 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET; 
       
  6000 
       
  6001 NTOSAPI
       
  6002 PVOID
       
  6003 DDKAPI
       
  6004 IoAllocateErrorLogEntry(
       
  6005   /*IN*/ PVOID  IoObject,
       
  6006   /*IN*/ UCHAR  EntrySize);
       
  6007 
       
  6008 NTOSAPI
       
  6009 PIRP
       
  6010 DDKAPI
       
  6011 IoAllocateIrp(
       
  6012   /*IN*/ CCHAR  StackSize,
       
  6013   /*IN*/ BOOLEAN  ChargeQuota);
       
  6014 
       
  6015 NTOSAPI
       
  6016 PMDL
       
  6017 DDKAPI
       
  6018 IoAllocateMdl(
       
  6019   /*IN*/ PVOID  VirtualAddress,
       
  6020   /*IN*/ ULONG  Length,
       
  6021   /*IN*/ BOOLEAN  SecondaryBuffer,
       
  6022   /*IN*/ BOOLEAN  ChargeQuota,
       
  6023   /*IN OUT*/ PIRP  Irp  /*OPTIONAL*/);
       
  6024 
       
  6025 NTOSAPI
       
  6026 PIO_WORKITEM
       
  6027 DDKAPI
       
  6028 IoAllocateWorkItem(
       
  6029   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  6030 
       
  6031 /*
       
  6032  * VOID IoAssignArcName(
       
  6033  * IN PUNICODE_STRING  ArcName,
       
  6034  * IN PUNICODE_STRING  DeviceName);
       
  6035  */
       
  6036 #define IoAssignArcName(_ArcName, _DeviceName) ( \
       
  6037   IoCreateSymbolicLink((_ArcName), (_DeviceName)))
       
  6038 
       
  6039 NTOSAPI
       
  6040 NTSTATUS
       
  6041 DDKAPI
       
  6042 IoAttachDevice(
       
  6043   /*IN*/ PDEVICE_OBJECT  SourceDevice,
       
  6044   /*IN*/ PUNICODE_STRING  TargetDevice,
       
  6045   /*OUT*/ PDEVICE_OBJECT  *AttachedDevice);
       
  6046 
       
  6047 NTOSAPI
       
  6048 PDEVICE_OBJECT
       
  6049 DDKAPI
       
  6050 IoAttachDeviceToDeviceStack(
       
  6051   /*IN*/ PDEVICE_OBJECT  SourceDevice,
       
  6052   /*IN*/ PDEVICE_OBJECT  TargetDevice);
       
  6053 
       
  6054 NTOSAPI
       
  6055 PIRP
       
  6056 DDKAPI
       
  6057 IoBuildAsynchronousFsdRequest(
       
  6058   /*IN*/ ULONG  MajorFunction,
       
  6059   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6060   /*IN OUT*/ PVOID  Buffer  /*OPTIONAL*/,
       
  6061   /*IN*/ ULONG  Length  /*OPTIONAL*/,
       
  6062   /*IN*/ PLARGE_INTEGER  StartingOffset  /*OPTIONAL*/,
       
  6063   /*IN*/ PIO_STATUS_BLOCK  IoStatusBlock  /*OPTIONAL*/);
       
  6064 
       
  6065 NTOSAPI
       
  6066 PIRP
       
  6067 DDKAPI
       
  6068 IoBuildDeviceIoControlRequest(
       
  6069   /*IN*/ ULONG  IoControlCode,
       
  6070   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6071   /*IN*/ PVOID  InputBuffer  /*OPTIONAL*/,
       
  6072   /*IN*/ ULONG  InputBufferLength,
       
  6073   /*OUT*/ PVOID  OutputBuffer  /*OPTIONAL*/,
       
  6074   /*IN*/ ULONG  OutputBufferLength,
       
  6075   /*IN*/ BOOLEAN  InternalDeviceIoControl,
       
  6076   /*IN*/ PKEVENT  Event,
       
  6077   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock);
       
  6078 
       
  6079 NTOSAPI
       
  6080 VOID
       
  6081 DDKAPI
       
  6082 IoBuildPartialMdl(
       
  6083   /*IN*/ PMDL  SourceMdl,
       
  6084   /*IN OUT*/ PMDL  TargetMdl,
       
  6085   /*IN*/ PVOID  VirtualAddress,
       
  6086   /*IN*/ ULONG  Length);
       
  6087 
       
  6088 NTOSAPI
       
  6089 PIRP
       
  6090 DDKAPI
       
  6091 IoBuildSynchronousFsdRequest(
       
  6092   /*IN*/ ULONG  MajorFunction,
       
  6093   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6094   /*IN OUT*/ PVOID  Buffer  /*OPTIONAL*/,
       
  6095   /*IN*/ ULONG  Length  /*OPTIONAL*/,
       
  6096   /*IN*/ PLARGE_INTEGER  StartingOffset  /*OPTIONAL*/,
       
  6097   /*IN*/ PKEVENT  Event,
       
  6098   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock);
       
  6099 
       
  6100 NTOSAPI
       
  6101 NTSTATUS
       
  6102 DDKFASTAPI
       
  6103 IofCallDriver(
       
  6104   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6105   /*IN OUT*/ PIRP  Irp);
       
  6106 
       
  6107 /*
       
  6108  * NTSTATUS
       
  6109  * IoCallDriver(
       
  6110  * IN PDEVICE_OBJECT  DeviceObject,
       
  6111  * IN OUT PIRP  Irp)
       
  6112  */
       
  6113 #define IoCallDriver IofCallDriver
       
  6114 
       
  6115 NTOSAPI
       
  6116 VOID
       
  6117 DDKAPI
       
  6118 IoCancelFileOpen(
       
  6119   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6120   /*IN*/ PFILE_OBJECT  FileObject);
       
  6121 
       
  6122 NTOSAPI
       
  6123 BOOLEAN
       
  6124 DDKAPI
       
  6125 IoCancelIrp(
       
  6126   /*IN*/ PIRP  Irp);
       
  6127 
       
  6128 NTOSAPI
       
  6129 NTSTATUS
       
  6130 DDKAPI
       
  6131 IoCheckShareAccess(
       
  6132   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  6133   /*IN*/ ULONG  DesiredShareAccess,
       
  6134   /*IN OUT*/ PFILE_OBJECT  FileObject,
       
  6135   /*IN OUT*/ PSHARE_ACCESS  ShareAccess,
       
  6136   /*IN*/ BOOLEAN  Update);
       
  6137 
       
  6138 NTOSAPI
       
  6139 VOID
       
  6140 DDKFASTAPI
       
  6141 IofCompleteRequest(
       
  6142   /*IN*/ PIRP  Irp,
       
  6143   /*IN*/ CCHAR  PriorityBoost);
       
  6144 
       
  6145 /*
       
  6146  * VOID
       
  6147  * IoCompleteRequest(
       
  6148  * IN PIRP  Irp,
       
  6149  * IN CCHAR  PriorityBoost)
       
  6150  */
       
  6151 #define IoCompleteRequest IofCompleteRequest
       
  6152 
       
  6153 NTOSAPI
       
  6154 NTSTATUS
       
  6155 DDKAPI
       
  6156 IoConnectInterrupt(
       
  6157   /*OUT*/ PKINTERRUPT  *InterruptObject,
       
  6158   /*IN*/ PKSERVICE_ROUTINE  ServiceRoutine,
       
  6159   /*IN*/ PVOID  ServiceContext,
       
  6160   /*IN*/ PKSPIN_LOCK  SpinLock  /*OPTIONAL*/,
       
  6161   /*IN*/ ULONG  Vector,
       
  6162   /*IN*/ KIRQL  Irql,
       
  6163   /*IN*/ KIRQL  SynchronizeIrql,
       
  6164   /*IN*/ KINTERRUPT_MODE    InterruptMode,
       
  6165   /*IN*/ BOOLEAN  ShareVector,
       
  6166   /*IN*/ KAFFINITY  ProcessorEnableMask,
       
  6167   /*IN*/ BOOLEAN  FloatingSave);
       
  6168 
       
  6169 /*
       
  6170  * PIO_STACK_LOCATION
       
  6171  * IoGetCurrentIrpStackLocation(
       
  6172  * IN PIRP  Irp)
       
  6173  */
       
  6174 #define IoGetCurrentIrpStackLocation(_Irp) \
       
  6175   ((_Irp)->Tail.Overlay.CurrentStackLocation)
       
  6176 
       
  6177 /*
       
  6178  * PIO_STACK_LOCATION
       
  6179  * IoGetNextIrpStackLocation(
       
  6180  * IN PIRP  Irp)
       
  6181  */
       
  6182 #define IoGetNextIrpStackLocation(_Irp) \
       
  6183   ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
       
  6184 
       
  6185 /*
       
  6186  * VOID
       
  6187  * IoCopyCurrentIrpStackLocationToNext(
       
  6188  * IN PIRP  Irp)
       
  6189  */
       
  6190 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
       
  6191 { \
       
  6192   PIO_STACK_LOCATION _IrpSp; \
       
  6193   PIO_STACK_LOCATION _NextIrpSp; \
       
  6194   _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
       
  6195   _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
       
  6196   RtlCopyMemory(_NextIrpSp, _IrpSp, \
       
  6197     FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
       
  6198   _NextIrpSp->Control = 0; \
       
  6199 }
       
  6200 
       
  6201 NTOSAPI
       
  6202 PCONTROLLER_OBJECT
       
  6203 DDKAPI
       
  6204 IoCreateController(
       
  6205   /*IN*/ ULONG  Size);
       
  6206 
       
  6207 NTOSAPI
       
  6208 NTSTATUS
       
  6209 DDKAPI
       
  6210 IoCreateDevice(
       
  6211   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6212   /*IN*/ ULONG  DeviceExtensionSize,
       
  6213   /*IN*/ PUNICODE_STRING  DeviceName  /*OPTIONAL*/,
       
  6214   /*IN*/ DEVICE_TYPE  DeviceType,
       
  6215   /*IN*/ ULONG  DeviceCharacteristics,
       
  6216   /*IN*/ BOOLEAN  Exclusive,
       
  6217   /*OUT*/ PDEVICE_OBJECT  *DeviceObject);
       
  6218 
       
  6219 NTOSAPI
       
  6220 NTSTATUS
       
  6221 DDKAPI
       
  6222 IoCreateDisk(
       
  6223   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6224   /*IN*/ PCREATE_DISK  Disk);
       
  6225 
       
  6226 NTOSAPI
       
  6227 NTSTATUS
       
  6228 DDKAPI
       
  6229 IoCreateFile(
       
  6230   /*OUT*/ PHANDLE FileHandle,
       
  6231   /*IN*/ ACCESS_MASK DesiredAccess,
       
  6232   /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
       
  6233   /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
       
  6234   /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/,
       
  6235   /*IN*/ ULONG FileAttributes,
       
  6236   /*IN*/ ULONG ShareAccess,
       
  6237   /*IN*/ ULONG Disposition,
       
  6238   /*IN*/ ULONG CreateOptions,
       
  6239   /*IN*/ PVOID EaBuffer /*OPTIONAL*/,
       
  6240   /*IN*/ ULONG EaLength,
       
  6241   /*IN*/ CREATE_FILE_TYPE CreateFileType,
       
  6242   /*IN*/ PVOID ExtraCreateParameters /*OPTIONAL*/,
       
  6243   /*IN*/ ULONG Options);
       
  6244 
       
  6245 NTOSAPI
       
  6246 PKEVENT
       
  6247 DDKAPI
       
  6248 IoCreateNotificationEvent(
       
  6249   /*IN*/ PUNICODE_STRING  EventName,
       
  6250   /*OUT*/ PHANDLE  EventHandle);
       
  6251 
       
  6252 NTOSAPI
       
  6253 NTSTATUS
       
  6254 DDKAPI
       
  6255 IoCreateSymbolicLink(
       
  6256   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
       
  6257   /*IN*/ PUNICODE_STRING  DeviceName);
       
  6258 
       
  6259 NTOSAPI
       
  6260 PKEVENT
       
  6261 DDKAPI
       
  6262 IoCreateSynchronizationEvent(
       
  6263   /*IN*/ PUNICODE_STRING  EventName,
       
  6264   /*OUT*/ PHANDLE  EventHandle);
       
  6265 
       
  6266 NTOSAPI
       
  6267 NTSTATUS
       
  6268 DDKAPI
       
  6269 IoCreateUnprotectedSymbolicLink(
       
  6270   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
       
  6271   /*IN*/ PUNICODE_STRING  DeviceName);
       
  6272 
       
  6273 NTOSAPI
       
  6274 VOID
       
  6275 DDKAPI
       
  6276 IoCsqInitialize(
       
  6277   PIO_CSQ  Csq,
       
  6278   /*IN*/ PIO_CSQ_INSERT_IRP  CsqInsertIrp,
       
  6279   /*IN*/ PIO_CSQ_REMOVE_IRP  CsqRemoveIrp,
       
  6280   /*IN*/ PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp,
       
  6281   /*IN*/ PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock,
       
  6282   /*IN*/ PIO_CSQ_RELEASE_LOCK  CsqReleaseLock,
       
  6283   /*IN*/ PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp);
       
  6284 
       
  6285 NTOSAPI
       
  6286 VOID
       
  6287 DDKAPI
       
  6288 IoCsqInsertIrp(
       
  6289   /*IN*/ PIO_CSQ  Csq,
       
  6290   /*IN*/ PIRP  Irp,
       
  6291   /*IN*/ PIO_CSQ_IRP_CONTEXT  Context);
       
  6292 
       
  6293 NTOSAPI
       
  6294 PIRP
       
  6295 DDKAPI
       
  6296 IoCsqRemoveIrp(
       
  6297   /*IN*/ PIO_CSQ  Csq,
       
  6298   /*IN*/ PIO_CSQ_IRP_CONTEXT  Context);
       
  6299 
       
  6300 NTOSAPI
       
  6301 PIRP
       
  6302 DDKAPI
       
  6303 IoCsqRemoveNextIrp(
       
  6304   /*IN*/ PIO_CSQ  Csq,
       
  6305   /*IN*/ PVOID  PeekContext);
       
  6306 
       
  6307 NTOSAPI
       
  6308 VOID
       
  6309 DDKAPI
       
  6310 IoDeleteController(
       
  6311   /*IN*/ PCONTROLLER_OBJECT  ControllerObject);
       
  6312 
       
  6313 NTOSAPI
       
  6314 VOID
       
  6315 DDKAPI
       
  6316 IoDeleteDevice(
       
  6317   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  6318 
       
  6319 NTOSAPI
       
  6320 NTSTATUS
       
  6321 DDKAPI
       
  6322 IoDeleteSymbolicLink(
       
  6323   /*IN*/ PUNICODE_STRING  SymbolicLinkName);
       
  6324 
       
  6325 /*
       
  6326  * VOID
       
  6327  * IoDeassignArcName(
       
  6328  * IN PUNICODE_STRING  ArcName)
       
  6329  */
       
  6330 #define IoDeassignArcName IoDeleteSymbolicLink
       
  6331 
       
  6332 NTOSAPI
       
  6333 VOID
       
  6334 DDKAPI
       
  6335 IoDetachDevice(
       
  6336   /*IN OUT*/ PDEVICE_OBJECT  TargetDevice);
       
  6337 
       
  6338 NTOSAPI
       
  6339 VOID
       
  6340 DDKAPI
       
  6341 IoDisconnectInterrupt(
       
  6342   /*IN*/ PKINTERRUPT  InterruptObject);
       
  6343 
       
  6344 NTOSAPI
       
  6345 BOOLEAN
       
  6346 DDKAPI
       
  6347 IoForwardIrpSynchronously(
       
  6348   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6349   /*IN*/ PIRP  Irp);
       
  6350 
       
  6351 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
       
  6352 
       
  6353 NTOSAPI
       
  6354 VOID
       
  6355 DDKAPI
       
  6356 IoFreeController(
       
  6357   /*IN*/ PCONTROLLER_OBJECT  ControllerObject);
       
  6358 
       
  6359 NTOSAPI
       
  6360 VOID
       
  6361 DDKAPI
       
  6362 IoFreeErrorLogEntry(
       
  6363   PVOID  ElEntry);
       
  6364 
       
  6365 NTOSAPI
       
  6366 VOID
       
  6367 DDKAPI
       
  6368 IoFreeIrp(
       
  6369   /*IN*/ PIRP  Irp);
       
  6370 
       
  6371 NTOSAPI
       
  6372 VOID
       
  6373 DDKAPI
       
  6374 IoFreeMdl(
       
  6375   /*IN*/ PMDL  Mdl);
       
  6376 
       
  6377 NTOSAPI
       
  6378 VOID
       
  6379 DDKAPI
       
  6380 IoFreeWorkItem(
       
  6381   /*IN*/ PIO_WORKITEM  pIOWorkItem);
       
  6382 
       
  6383 NTOSAPI
       
  6384 PDEVICE_OBJECT
       
  6385 DDKAPI
       
  6386 IoGetAttachedDevice(
       
  6387   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  6388 
       
  6389 NTOSAPI
       
  6390 PDEVICE_OBJECT
       
  6391 DDKAPI
       
  6392 IoGetAttachedDeviceReference(
       
  6393   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  6394 
       
  6395 NTOSAPI
       
  6396 NTSTATUS
       
  6397 DDKAPI
       
  6398 IoGetBootDiskInformation(
       
  6399   /*IN OUT*/ PBOOTDISK_INFORMATION  BootDiskInformation,
       
  6400   /*IN*/ ULONG  Size);
       
  6401 
       
  6402 NTOSAPI
       
  6403 PCONFIGURATION_INFORMATION
       
  6404 DDKAPI
       
  6405 IoGetConfigurationInformation( 
       
  6406   VOID);
       
  6407 
       
  6408 NTOSAPI
       
  6409 PEPROCESS
       
  6410 DDKAPI
       
  6411 IoGetCurrentProcess(
       
  6412   VOID);
       
  6413 
       
  6414 NTOSAPI
       
  6415 NTSTATUS
       
  6416 DDKAPI
       
  6417 IoGetDeviceInterfaceAlias(
       
  6418   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
       
  6419   /*IN*/ CONST GUID  *AliasInterfaceClassGuid,
       
  6420   /*OUT*/ PUNICODE_STRING  AliasSymbolicLinkName);
       
  6421 
       
  6422 NTOSAPI
       
  6423 NTSTATUS
       
  6424 DDKAPI
       
  6425 IoGetDeviceInterfaces(
       
  6426   /*IN*/ CONST GUID  *InterfaceClassGuid,
       
  6427   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject  /*OPTIONAL*/,
       
  6428   /*IN*/ ULONG  Flags,
       
  6429   /*OUT*/ PWSTR  *SymbolicLinkList);
       
  6430 
       
  6431 NTOSAPI
       
  6432 NTSTATUS
       
  6433 DDKAPI
       
  6434 IoGetDeviceObjectPointer(
       
  6435   /*IN*/ PUNICODE_STRING  ObjectName,
       
  6436   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  6437   /*OUT*/ PFILE_OBJECT  *FileObject,
       
  6438   /*OUT*/ PDEVICE_OBJECT  *DeviceObject);
       
  6439 
       
  6440 NTOSAPI
       
  6441 NTSTATUS
       
  6442 DDKAPI
       
  6443 IoGetDeviceProperty(
       
  6444   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6445   /*IN*/ DEVICE_REGISTRY_PROPERTY  DeviceProperty,
       
  6446   /*IN*/ ULONG  BufferLength,
       
  6447   /*OUT*/ PVOID  PropertyBuffer,
       
  6448   /*OUT*/ PULONG  ResultLength);
       
  6449 
       
  6450 NTOSAPI
       
  6451 PDEVICE_OBJECT
       
  6452 DDKAPI
       
  6453 IoGetDeviceToVerify(
       
  6454   /*IN*/ PETHREAD  Thread);
       
  6455 
       
  6456 NTOSAPI
       
  6457 PDMA_ADAPTER
       
  6458 DDKAPI
       
  6459 IoGetDmaAdapter(
       
  6460   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
       
  6461   /*IN*/ PDEVICE_DESCRIPTION  DeviceDescription,
       
  6462   /*IN OUT*/ PULONG  NumberOfMapRegisters);
       
  6463 
       
  6464 NTOSAPI
       
  6465 PVOID
       
  6466 DDKAPI
       
  6467 IoGetDriverObjectExtension(
       
  6468   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6469   /*IN*/ PVOID  ClientIdentificationAddress);
       
  6470 
       
  6471 NTOSAPI
       
  6472 PGENERIC_MAPPING
       
  6473 DDKAPI
       
  6474 IoGetFileObjectGenericMapping(
       
  6475   VOID);
       
  6476 
       
  6477 /*
       
  6478  * ULONG
       
  6479  * IoGetFunctionCodeFromCtlCode(
       
  6480  * IN ULONG  ControlCode)
       
  6481  */
       
  6482 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
       
  6483   (((_ControlCode) >> 2) & 0x00000FFF)
       
  6484 
       
  6485 NTOSAPI
       
  6486 PVOID
       
  6487 DDKAPI
       
  6488 IoGetInitialStack(
       
  6489   VOID);
       
  6490 
       
  6491 NTOSAPI
       
  6492 PDEVICE_OBJECT
       
  6493 DDKAPI
       
  6494 IoGetRelatedDeviceObject(
       
  6495   /*IN*/ PFILE_OBJECT  FileObject);
       
  6496 
       
  6497 NTOSAPI
       
  6498 ULONG
       
  6499 DDKAPI
       
  6500 IoGetRemainingStackSize(
       
  6501   VOID);
       
  6502 
       
  6503 NTOSAPI
       
  6504 VOID
       
  6505 DDKAPI
       
  6506 IoGetStackLimits(
       
  6507   /*OUT*/ PULONG_PTR  LowLimit,
       
  6508   /*OUT*/ PULONG_PTR  HighLimit);
       
  6509 
       
  6510 NTOSAPI
       
  6511 VOID
       
  6512 DDKAPI
       
  6513 KeInitializeDpc(
       
  6514   /*IN*/ PRKDPC  Dpc,
       
  6515   /*IN*/ PKDEFERRED_ROUTINE  DeferredRoutine,
       
  6516   /*IN*/ PVOID  DeferredContext);
       
  6517 
       
  6518 /*
       
  6519  * VOID
       
  6520  * IoInitializeDpcRequest(
       
  6521  * IN PDEVICE_OBJECT DeviceObject,
       
  6522  * IN PIO_DPC_ROUTINE DpcRoutine)
       
  6523  */
       
  6524 #define IoInitializeDpcRequest(_DeviceObject, \
       
  6525                                _DpcRoutine) \
       
  6526   KeInitializeDpc(&(_DeviceObject)->Dpc, \
       
  6527     (PKDEFERRED_ROUTINE) (_DpcRoutine), \
       
  6528     _DeviceObject)
       
  6529 
       
  6530 NTOSAPI
       
  6531 VOID
       
  6532 DDKAPI
       
  6533 IoInitializeIrp(
       
  6534   /*IN OUT*/ PIRP  Irp,
       
  6535   /*IN*/ USHORT  PacketSize,
       
  6536   /*IN*/ CCHAR  StackSize);
       
  6537 
       
  6538 NTOSAPI
       
  6539 VOID
       
  6540 DDKAPI
       
  6541 IoInitializeRemoveLockEx(
       
  6542   /*IN*/ PIO_REMOVE_LOCK Lock,
       
  6543   /*IN*/ ULONG   AllocateTag,
       
  6544   /*IN*/ ULONG   MaxLockedMinutes,
       
  6545   /*IN*/ ULONG   HighWatermark,
       
  6546   /*IN*/ ULONG   RemlockSize);
       
  6547 
       
  6548 /* VOID
       
  6549  * IoInitializeRemoveLock(
       
  6550  * IN PIO_REMOVE_LOCK  Lock,
       
  6551  * IN ULONG  AllocateTag,
       
  6552  * IN ULONG  MaxLockedMinutes,
       
  6553  * IN ULONG  HighWatermark)
       
  6554  */
       
  6555 #define IoInitializeRemoveLock( \
       
  6556   Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
       
  6557   IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
       
  6558     HighWatermark, sizeof(IO_REMOVE_LOCK))
       
  6559 
       
  6560 NTOSAPI
       
  6561 NTSTATUS
       
  6562 DDKAPI
       
  6563 IoInitializeTimer(
       
  6564   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6565   /*IN*/ PIO_TIMER_ROUTINE  TimerRoutine,
       
  6566   /*IN*/ PVOID  Context);
       
  6567 
       
  6568 NTOSAPI
       
  6569 VOID
       
  6570 DDKAPI
       
  6571 IoInvalidateDeviceRelations(
       
  6572   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6573   /*IN*/ DEVICE_RELATION_TYPE  Type);
       
  6574 
       
  6575 NTOSAPI
       
  6576 VOID
       
  6577 DDKAPI
       
  6578 IoInvalidateDeviceState(
       
  6579   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject);
       
  6580 
       
  6581 NTOSAPI
       
  6582 BOOLEAN
       
  6583 DDKAPI
       
  6584 IoIs32bitProcess(
       
  6585   /*IN*/ PIRP  Irp  /*OPTIONAL*/);
       
  6586 
       
  6587 /*
       
  6588  * BOOLEAN
       
  6589  * IoIsErrorUserInduced(
       
  6590  * IN NTSTATUS  Status);
       
  6591  */
       
  6592 #define IoIsErrorUserInduced(Status) \
       
  6593 	((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
       
  6594    ((Status) == STATUS_IO_TIMEOUT) || \
       
  6595    ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
       
  6596    ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
       
  6597    ((Status) == STATUS_VERIFY_REQUIRED) || \
       
  6598    ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
       
  6599    ((Status) == STATUS_WRONG_VOLUME)))
       
  6600 
       
  6601 NTOSAPI
       
  6602 BOOLEAN
       
  6603 DDKAPI
       
  6604 IoIsWdmVersionAvailable(
       
  6605   /*IN*/ UCHAR  MajorVersion,
       
  6606   /*IN*/ UCHAR  MinorVersion);
       
  6607 
       
  6608 NTOSAPI
       
  6609 PIRP
       
  6610 DDKAPI
       
  6611 IoMakeAssociatedIrp(
       
  6612   /*IN*/ PIRP  Irp,
       
  6613   /*IN*/ CCHAR  StackSize);
       
  6614 
       
  6615 /*
       
  6616  * VOID
       
  6617  * IoMarkIrpPending(
       
  6618  * IN OUT PIRP  Irp)
       
  6619  */
       
  6620 #define IoMarkIrpPending(_Irp) \
       
  6621   (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
       
  6622 
       
  6623 NTOSAPI
       
  6624 NTSTATUS
       
  6625 DDKAPI
       
  6626 IoOpenDeviceInterfaceRegistryKey(
       
  6627   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
       
  6628   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  6629   /*OUT*/ PHANDLE  DeviceInterfaceKey);
       
  6630 
       
  6631 NTOSAPI
       
  6632 NTSTATUS
       
  6633 DDKAPI
       
  6634 IoOpenDeviceRegistryKey(
       
  6635   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6636   /*IN*/ ULONG  DevInstKeyType,
       
  6637   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  6638   /*OUT*/ PHANDLE  DevInstRegKey);
       
  6639 
       
  6640 NTOSAPI
       
  6641 NTSTATUS
       
  6642 DDKAPI
       
  6643 IoQueryDeviceDescription(
       
  6644   /*IN*/ PINTERFACE_TYPE  BusType  /*OPTIONAL*/,
       
  6645   /*IN*/ PULONG  BusNumber  /*OPTIONAL*/,
       
  6646   /*IN*/ PCONFIGURATION_TYPE  ControllerType  /*OPTIONAL*/,
       
  6647   /*IN*/ PULONG  ControllerNumber  /*OPTIONAL*/,
       
  6648   /*IN*/ PCONFIGURATION_TYPE  PeripheralType  /*OPTIONAL*/,
       
  6649   /*IN*/ PULONG  PeripheralNumber  /*OPTIONAL*/,
       
  6650   /*IN*/ PIO_QUERY_DEVICE_ROUTINE  CalloutRoutine,
       
  6651   /*IN*/ PVOID  Context);
       
  6652 
       
  6653 NTOSAPI
       
  6654 VOID
       
  6655 DDKAPI
       
  6656 IoQueueWorkItem(
       
  6657   /*IN*/ PIO_WORKITEM  pIOWorkItem,
       
  6658   /*IN*/ PIO_WORKITEM_ROUTINE  Routine,
       
  6659   /*IN*/ WORK_QUEUE_TYPE  QueueType,
       
  6660   /*IN*/ PVOID  Context);
       
  6661 
       
  6662 NTOSAPI
       
  6663 VOID
       
  6664 DDKAPI
       
  6665 IoRaiseHardError(
       
  6666   /*IN*/ PIRP  Irp,
       
  6667   /*IN*/ PVPB  Vpb  /*OPTIONAL*/,
       
  6668   /*IN*/ PDEVICE_OBJECT  RealDeviceObject);
       
  6669 
       
  6670 NTOSAPI
       
  6671 BOOLEAN
       
  6672 DDKAPI
       
  6673 IoRaiseInformationalHardError(
       
  6674   /*IN*/ NTSTATUS  ErrorStatus,
       
  6675   /*IN*/ PUNICODE_STRING  String  /*OPTIONAL*/,
       
  6676   /*IN*/ PKTHREAD  Thread  /*OPTIONAL*/);
       
  6677 
       
  6678 NTOSAPI
       
  6679 NTSTATUS
       
  6680 DDKAPI
       
  6681 IoReadDiskSignature(
       
  6682   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6683   /*IN*/ ULONG  BytesPerSector,
       
  6684   /*OUT*/ PDISK_SIGNATURE  Signature);
       
  6685 
       
  6686 NTOSAPI
       
  6687 NTSTATUS
       
  6688 DDKAPI
       
  6689 IoReadPartitionTableEx(
       
  6690   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6691   /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX  **PartitionBuffer);
       
  6692 
       
  6693 NTOSAPI
       
  6694 VOID
       
  6695 DDKAPI
       
  6696 IoRegisterBootDriverReinitialization(
       
  6697   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6698   /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
       
  6699   /*IN*/ PVOID  Context);
       
  6700 
       
  6701 NTOSAPI
       
  6702 VOID
       
  6703 DDKAPI
       
  6704 IoRegisterBootDriverReinitialization(
       
  6705   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6706   /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
       
  6707   /*IN*/ PVOID  Context);
       
  6708 
       
  6709 NTOSAPI
       
  6710 NTSTATUS
       
  6711 DDKAPI
       
  6712 IoRegisterDeviceInterface(
       
  6713   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
       
  6714   /*IN*/ CONST GUID  *InterfaceClassGuid,
       
  6715   /*IN*/ PUNICODE_STRING  ReferenceString  /*OPTIONAL*/,
       
  6716   /*OUT*/ PUNICODE_STRING  SymbolicLinkName);
       
  6717 
       
  6718 NTOSAPI
       
  6719 VOID
       
  6720 DDKAPI
       
  6721 IoRegisterDriverReinitialization(
       
  6722   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6723   /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
       
  6724   /*IN*/ PVOID  Context);
       
  6725 
       
  6726 NTOSAPI
       
  6727 NTSTATUS
       
  6728 DDKAPI
       
  6729 IoRegisterPlugPlayNotification(
       
  6730   /*IN*/ IO_NOTIFICATION_EVENT_CATEGORY  EventCategory,
       
  6731   /*IN*/ ULONG  EventCategoryFlags,
       
  6732   /*IN*/ PVOID  EventCategoryData  /*OPTIONAL*/,
       
  6733   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6734   /*IN*/ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE  CallbackRoutine,
       
  6735   /*IN*/ PVOID  Context,
       
  6736   /*OUT*/ PVOID  *NotificationEntry);
       
  6737 
       
  6738 NTOSAPI
       
  6739 NTSTATUS
       
  6740 DDKAPI
       
  6741 IoRegisterShutdownNotification(
       
  6742   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  6743 
       
  6744 NTOSAPI
       
  6745 VOID
       
  6746 DDKAPI
       
  6747 IoReleaseCancelSpinLock(
       
  6748   /*IN*/ KIRQL  Irql);
       
  6749 
       
  6750 NTOSAPI
       
  6751 VOID
       
  6752 DDKAPI
       
  6753 IoReleaseRemoveLockAndWaitEx(
       
  6754   /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
       
  6755   /*IN*/ PVOID  Tag,
       
  6756   /*IN*/ ULONG  RemlockSize);
       
  6757 
       
  6758 /*
       
  6759  * VOID
       
  6760  * IoReleaseRemoveLockAndWait(
       
  6761  * IN PIO_REMOVE_LOCK  RemoveLock,
       
  6762  * IN PVOID  Tag)
       
  6763  */
       
  6764 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
       
  6765                                    _Tag) \
       
  6766   IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
       
  6767 
       
  6768 NTOSAPI
       
  6769 VOID
       
  6770 DDKAPI
       
  6771 IoReleaseRemoveLockEx(
       
  6772   /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
       
  6773   /*IN*/ PVOID  Tag,
       
  6774   /*IN*/ ULONG  RemlockSize);
       
  6775 
       
  6776 /*
       
  6777  * VOID
       
  6778  * IoReleaseRemoveLock(
       
  6779  * IN PIO_REMOVE_LOCK  RemoveLock,
       
  6780  * IN PVOID  Tag)
       
  6781  */
       
  6782 #define IoReleaseRemoveLock(_RemoveLock, \
       
  6783                                    _Tag) \
       
  6784   IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
       
  6785 
       
  6786 NTOSAPI
       
  6787 VOID
       
  6788 DDKAPI
       
  6789 IoRemoveShareAccess(
       
  6790   /*IN*/ PFILE_OBJECT  FileObject,
       
  6791   /*IN OUT*/ PSHARE_ACCESS  ShareAccess);
       
  6792 
       
  6793 NTOSAPI
       
  6794 NTSTATUS
       
  6795 DDKAPI
       
  6796 IoReportDetectedDevice(
       
  6797   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6798   /*IN*/ INTERFACE_TYPE  LegacyBusType,
       
  6799   /*IN*/ ULONG  BusNumber,
       
  6800   /*IN*/ ULONG  SlotNumber,
       
  6801   /*IN*/ PCM_RESOURCE_LIST  ResourceList,
       
  6802   /*IN*/ PIO_RESOURCE_REQUIREMENTS_LIST  ResourceRequirements  /*OPTIONAL*/,
       
  6803   /*IN*/ BOOLEAN  ResourceAssigned,
       
  6804   /*IN OUT*/ PDEVICE_OBJECT  *DeviceObject);
       
  6805 
       
  6806 NTOSAPI
       
  6807 NTSTATUS
       
  6808 DDKAPI
       
  6809 IoReportResourceForDetection(
       
  6810   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6811   /*IN*/ PCM_RESOURCE_LIST  DriverList  /*OPTIONAL*/,
       
  6812   /*IN*/ ULONG  DriverListSize  /*OPTIONAL*/,
       
  6813   /*IN*/ PDEVICE_OBJECT  DeviceObject  /*OPTIONAL*/,
       
  6814   /*IN*/ PCM_RESOURCE_LIST  DeviceList  /*OPTIONAL*/,
       
  6815   /*IN*/ ULONG  DeviceListSize  /*OPTIONAL*/,
       
  6816   /*OUT*/ PBOOLEAN  ConflictDetected);
       
  6817 
       
  6818 NTOSAPI
       
  6819 NTSTATUS
       
  6820 DDKAPI
       
  6821 IoReportResourceUsage(
       
  6822   /*IN*/ PUNICODE_STRING  DriverClassName  /*OPTIONAL*/,
       
  6823   /*IN*/ PDRIVER_OBJECT  DriverObject,
       
  6824   /*IN*/ PCM_RESOURCE_LIST  DriverList  /*OPTIONAL*/,
       
  6825   /*IN*/ ULONG  DriverListSize  /*OPTIONAL*/,
       
  6826   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6827   /*IN*/ PCM_RESOURCE_LIST  DeviceList  /*OPTIONAL*/,
       
  6828   /*IN*/ ULONG  DeviceListSize  /*OPTIONAL*/,
       
  6829   /*IN*/ BOOLEAN  OverrideConflict,
       
  6830   /*OUT*/ PBOOLEAN  ConflictDetected);
       
  6831 
       
  6832 NTOSAPI
       
  6833 NTSTATUS
       
  6834 DDKAPI
       
  6835 IoReportTargetDeviceChange(
       
  6836   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
       
  6837   /*IN*/ PVOID  NotificationStructure);
       
  6838 
       
  6839 NTOSAPI
       
  6840 NTSTATUS
       
  6841 DDKAPI
       
  6842 IoReportTargetDeviceChangeAsynchronous(
       
  6843   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
       
  6844   /*IN*/ PVOID  NotificationStructure,
       
  6845   /*IN*/ PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  /*OPTIONAL*/,
       
  6846   /*IN*/ PVOID  Context  /*OPTIONAL*/);
       
  6847 
       
  6848 NTOSAPI
       
  6849 VOID
       
  6850 DDKAPI
       
  6851 IoRequestDeviceEject(
       
  6852   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject);
       
  6853 
       
  6854 /*
       
  6855  * VOID
       
  6856  * IoRequestDpc(
       
  6857  * IN PDEVICE_OBJECT  DeviceObject,
       
  6858  * IN PIRP  Irp,
       
  6859  * IN PVOID  Context);
       
  6860  */
       
  6861 #define IoRequestDpc(DeviceObject, Irp, Context)( \
       
  6862   KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
       
  6863 
       
  6864 NTOSAPI
       
  6865 VOID
       
  6866 DDKAPI
       
  6867 IoReuseIrp(
       
  6868   /*IN OUT*/ PIRP  Irp,
       
  6869   /*IN*/ NTSTATUS  Status);
       
  6870 
       
  6871 /*
       
  6872  * PDRIVER_CANCEL
       
  6873  * IoSetCancelRoutine(
       
  6874  * IN PIRP  Irp,
       
  6875  * IN PDRIVER_CANCEL  CancelRoutine)
       
  6876  */
       
  6877 #define IoSetCancelRoutine(_Irp, \
       
  6878                            _CancelRoutine) \
       
  6879   ((PDRIVER_CANCEL) InterlockedExchangePointer( \
       
  6880     (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
       
  6881 
       
  6882 /*
       
  6883  * VOID
       
  6884  * IoSetCompletionRoutine(
       
  6885  * IN PIRP  Irp,
       
  6886  * IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
       
  6887  * IN PVOID  Context,
       
  6888  * IN BOOLEAN  InvokeOnSuccess,
       
  6889  * IN BOOLEAN  InvokeOnError,
       
  6890  * IN BOOLEAN  InvokeOnCancel)
       
  6891  */
       
  6892 #define IoSetCompletionRoutine(_Irp, \
       
  6893                                _CompletionRoutine, \
       
  6894                                _Context, \
       
  6895                                _InvokeOnSuccess, \
       
  6896                                _InvokeOnError, \
       
  6897                                _InvokeOnCancel) \
       
  6898 { \
       
  6899   PIO_STACK_LOCATION _IrpSp; \
       
  6900   ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
       
  6901     _CompletionRoutine != NULL : TRUE); \
       
  6902   _IrpSp = IoGetNextIrpStackLocation(_Irp); \
       
  6903   _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
       
  6904 	_IrpSp->Context = (_Context); \
       
  6905   _IrpSp->Control = 0; \
       
  6906   if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
       
  6907   if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
       
  6908   if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
       
  6909 }
       
  6910 
       
  6911 NTOSAPI
       
  6912 VOID
       
  6913 DDKAPI
       
  6914 IoSetCompletionRoutineEx(
       
  6915   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6916   /*IN*/ PIRP  Irp,
       
  6917   /*IN*/ PIO_COMPLETION_ROUTINE  CompletionRoutine,
       
  6918   /*IN*/ PVOID  Context,
       
  6919   /*IN*/ BOOLEAN    InvokeOnSuccess,
       
  6920   /*IN*/ BOOLEAN  InvokeOnError,
       
  6921   /*IN*/ BOOLEAN  InvokeOnCancel);
       
  6922 
       
  6923 NTOSAPI
       
  6924 NTSTATUS
       
  6925 DDKAPI
       
  6926 IoSetDeviceInterfaceState(
       
  6927   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
       
  6928   /*IN*/ BOOLEAN  Enable);
       
  6929 
       
  6930 NTOSAPI
       
  6931 VOID
       
  6932 DDKAPI
       
  6933 IoSetHardErrorOrVerifyDevice(
       
  6934   /*IN*/ PIRP  Irp,
       
  6935   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  6936 
       
  6937 /*
       
  6938  * VOID
       
  6939  * IoSetNextIrpStackLocation(
       
  6940  * IN OUT PIRP  Irp)
       
  6941  */
       
  6942 #define IoSetNextIrpStackLocation(_Irp) \
       
  6943 { \
       
  6944   (_Irp)->CurrentLocation--; \
       
  6945   (_Irp)->Tail.Overlay.CurrentStackLocation--; \
       
  6946 }
       
  6947 
       
  6948 NTOSAPI
       
  6949 NTSTATUS
       
  6950 DDKAPI
       
  6951 IoSetPartitionInformationEx(
       
  6952   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  6953   /*IN*/ ULONG  PartitionNumber,
       
  6954   /*IN*/ struct _SET_PARTITION_INFORMATION_EX  *PartitionInfo);
       
  6955 
       
  6956 NTOSAPI
       
  6957 VOID
       
  6958 DDKAPI
       
  6959 IoSetShareAccess(
       
  6960   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  6961   /*IN*/ ULONG  DesiredShareAccess,
       
  6962   /*IN OUT*/ PFILE_OBJECT  FileObject,
       
  6963   /*OUT*/ PSHARE_ACCESS  ShareAccess);
       
  6964 
       
  6965 NTOSAPI
       
  6966 VOID
       
  6967 DDKAPI
       
  6968 IoSetStartIoAttributes(
       
  6969   /*IN*/ PDEVICE_OBJECT  DeviceObject, 
       
  6970   /*IN*/ BOOLEAN  DeferredStartIo, 
       
  6971   /*IN*/ BOOLEAN  NonCancelable); 
       
  6972 
       
  6973 NTOSAPI
       
  6974 NTSTATUS
       
  6975 DDKAPI
       
  6976 IoSetSystemPartition(
       
  6977   /*IN*/ PUNICODE_STRING  VolumeNameString);
       
  6978 
       
  6979 NTOSAPI
       
  6980 BOOLEAN
       
  6981 DDKAPI
       
  6982 IoSetThreadHardErrorMode(
       
  6983   /*IN*/ BOOLEAN  EnableHardErrors);
       
  6984 
       
  6985 /*
       
  6986  * USHORT
       
  6987  * IoSizeOfIrp(
       
  6988  * IN CCHAR  StackSize)
       
  6989  */
       
  6990 #define IoSizeOfIrp(_StackSize) \
       
  6991   ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
       
  6992 
       
  6993 /*
       
  6994  * VOID
       
  6995  * IoSkipCurrentIrpStackLocation(
       
  6996  * IN PIRP  Irp)
       
  6997  */
       
  6998 #define IoSkipCurrentIrpStackLocation(_Irp) \
       
  6999 { \
       
  7000   (_Irp)->CurrentLocation++; \
       
  7001   (_Irp)->Tail.Overlay.CurrentStackLocation++; \
       
  7002 }
       
  7003 
       
  7004 NTOSAPI
       
  7005 VOID
       
  7006 DDKAPI
       
  7007 IoStartNextPacket(
       
  7008   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  7009   /*IN*/ BOOLEAN  Cancelable);
       
  7010 
       
  7011 NTOSAPI
       
  7012 VOID
       
  7013 DDKAPI
       
  7014 IoStartNextPacketByKey(
       
  7015   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  7016   /*IN*/ BOOLEAN  Cancelable,
       
  7017   /*IN*/ ULONG  Key);
       
  7018 
       
  7019 NTOSAPI
       
  7020 VOID
       
  7021 DDKAPI
       
  7022 IoStartPacket(
       
  7023   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  7024   /*IN*/ PIRP  Irp,
       
  7025   /*IN*/ PULONG  Key  /*OPTIONAL*/,
       
  7026   /*IN*/ PDRIVER_CANCEL  CancelFunction  /*OPTIONAL*/);
       
  7027 
       
  7028 NTOSAPI
       
  7029 VOID
       
  7030 DDKAPI
       
  7031 IoStartTimer(
       
  7032   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  7033 
       
  7034 NTOSAPI
       
  7035 VOID
       
  7036 DDKAPI
       
  7037 IoStopTimer(
       
  7038   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  7039 
       
  7040 NTOSAPI
       
  7041 NTSTATUS
       
  7042 DDKAPI
       
  7043 IoUnregisterPlugPlayNotification(
       
  7044   /*IN*/ PVOID  NotificationEntry);
       
  7045 
       
  7046 NTOSAPI
       
  7047 VOID
       
  7048 DDKAPI
       
  7049 IoUnregisterShutdownNotification(
       
  7050   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  7051 
       
  7052 NTOSAPI
       
  7053 VOID
       
  7054 DDKAPI
       
  7055 IoUpdateShareAccess(
       
  7056   /*IN*/ PFILE_OBJECT  FileObject,
       
  7057   /*IN OUT*/ PSHARE_ACCESS  ShareAccess);
       
  7058 
       
  7059 NTOSAPI
       
  7060 NTSTATUS
       
  7061 DDKAPI
       
  7062 IoVerifyPartitionTable(
       
  7063   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  7064   /*IN*/ BOOLEAN  FixErrors);
       
  7065 
       
  7066 NTOSAPI
       
  7067 NTSTATUS
       
  7068 DDKAPI
       
  7069 IoVolumeDeviceToDosName(
       
  7070   /*IN*/ PVOID  VolumeDeviceObject,
       
  7071   /*OUT*/ PUNICODE_STRING  DosName);
       
  7072 
       
  7073 NTOSAPI
       
  7074 NTSTATUS
       
  7075 DDKAPI
       
  7076 IoWMIAllocateInstanceIds(
       
  7077   /*IN*/ GUID  *Guid,
       
  7078   /*IN*/ ULONG  InstanceCount,
       
  7079   /*OUT*/ ULONG  *FirstInstanceId);
       
  7080 
       
  7081 NTOSAPI
       
  7082 ULONG
       
  7083 DDKAPI
       
  7084 IoWMIDeviceObjectToProviderId(
       
  7085   /*IN*/ PDEVICE_OBJECT  DeviceObject);
       
  7086 
       
  7087 NTOSAPI
       
  7088 NTSTATUS
       
  7089 DDKAPI
       
  7090 IoWMIDeviceObjectToInstanceName(
       
  7091   /*IN*/ PVOID  DataBlockObject,
       
  7092   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  7093   /*OUT*/ PUNICODE_STRING  InstanceName);
       
  7094 
       
  7095 NTOSAPI
       
  7096 NTSTATUS
       
  7097 DDKAPI
       
  7098 IoWMIExecuteMethod(
       
  7099   /*IN*/ PVOID  DataBlockObject,
       
  7100   /*IN*/ PUNICODE_STRING  InstanceName,
       
  7101   /*IN*/ ULONG  MethodId,
       
  7102   /*IN*/ ULONG  InBufferSize,
       
  7103   /*IN OUT*/ PULONG  OutBufferSize,
       
  7104   /*IN OUT*/  PUCHAR  InOutBuffer);
       
  7105 
       
  7106 NTOSAPI
       
  7107 NTSTATUS
       
  7108 DDKAPI
       
  7109 IoWMIHandleToInstanceName(
       
  7110   /*IN*/ PVOID  DataBlockObject,
       
  7111   /*IN*/ HANDLE  FileHandle,
       
  7112   /*OUT*/ PUNICODE_STRING  InstanceName);
       
  7113 
       
  7114 NTOSAPI
       
  7115 NTSTATUS
       
  7116 DDKAPI
       
  7117 IoWMIOpenBlock(
       
  7118   /*IN*/ GUID  *DataBlockGuid,
       
  7119   /*IN*/ ULONG  DesiredAccess,
       
  7120   /*OUT*/ PVOID  *DataBlockObject);
       
  7121 
       
  7122 NTOSAPI
       
  7123 NTSTATUS
       
  7124 DDKAPI
       
  7125 IoWMIQueryAllData(
       
  7126   /*IN*/ PVOID  DataBlockObject,
       
  7127   /*IN OUT*/ ULONG  *InOutBufferSize,
       
  7128   /*OUT*/ PVOID  OutBuffer);
       
  7129 
       
  7130 NTOSAPI
       
  7131 NTSTATUS
       
  7132 DDKAPI
       
  7133 IoWMIQueryAllDataMultiple(
       
  7134   /*IN*/ PVOID  *DataBlockObjectList,
       
  7135   /*IN*/ ULONG  ObjectCount,
       
  7136   /*IN OUT*/ ULONG  *InOutBufferSize,
       
  7137   /*OUT*/ PVOID  OutBuffer);
       
  7138 
       
  7139 NTOSAPI
       
  7140 NTSTATUS
       
  7141 DDKAPI
       
  7142 IoWMIQuerySingleInstance(
       
  7143   /*IN*/ PVOID  DataBlockObject,
       
  7144   /*IN*/ PUNICODE_STRING  InstanceName,
       
  7145   /*IN OUT*/ ULONG  *InOutBufferSize,
       
  7146   /*OUT*/ PVOID OutBuffer);
       
  7147 
       
  7148 NTOSAPI
       
  7149 NTSTATUS
       
  7150 DDKAPI
       
  7151 IoWMIQuerySingleInstanceMultiple(
       
  7152   /*IN*/ PVOID  *DataBlockObjectList,
       
  7153   /*IN*/ PUNICODE_STRING  InstanceNames,
       
  7154   /*IN*/ ULONG  ObjectCount,
       
  7155   /*IN OUT*/ ULONG  *InOutBufferSize,
       
  7156   /*OUT*/ PVOID  OutBuffer);
       
  7157 
       
  7158 NTOSAPI
       
  7159 NTSTATUS
       
  7160 DDKAPI
       
  7161 IoWMIRegistrationControl(
       
  7162   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  7163   /*IN*/ ULONG  Action);
       
  7164 
       
  7165 NTOSAPI
       
  7166 NTSTATUS
       
  7167 DDKAPI
       
  7168 IoWMISetNotificationCallback(
       
  7169   /*IN*/ PVOID  Object,
       
  7170   /*IN*/ WMI_NOTIFICATION_CALLBACK  Callback,
       
  7171   /*IN*/ PVOID  Context);
       
  7172 
       
  7173 NTOSAPI
       
  7174 NTSTATUS
       
  7175 DDKAPI
       
  7176 IoWMISetSingleInstance(
       
  7177   /*IN*/ PVOID  DataBlockObject,
       
  7178   /*IN*/ PUNICODE_STRING  InstanceName,
       
  7179   /*IN*/ ULONG  Version,
       
  7180   /*IN*/ ULONG  ValueBufferSize,
       
  7181   /*IN*/ PVOID  ValueBuffer);
       
  7182 
       
  7183 NTOSAPI
       
  7184 NTSTATUS
       
  7185 DDKAPI
       
  7186 IoWMISetSingleItem(
       
  7187   /*IN*/ PVOID  DataBlockObject,
       
  7188   /*IN*/ PUNICODE_STRING  InstanceName,
       
  7189   /*IN*/ ULONG  DataItemId,
       
  7190   /*IN*/ ULONG  Version,
       
  7191   /*IN*/ ULONG  ValueBufferSize,
       
  7192   /*IN*/ PVOID  ValueBuffer);
       
  7193 
       
  7194 NTOSAPI
       
  7195 NTSTATUS
       
  7196 DDKAPI
       
  7197 IoWMISuggestInstanceName(
       
  7198   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject /*OPTIONAL*/,
       
  7199   /*IN*/ PUNICODE_STRING  SymbolicLinkName /*OPTIONAL*/,
       
  7200   /*IN*/ BOOLEAN  CombineNames,
       
  7201   /*OUT*/ PUNICODE_STRING  SuggestedInstanceName);
       
  7202 
       
  7203 NTOSAPI
       
  7204 NTSTATUS
       
  7205 DDKAPI
       
  7206 IoWMIWriteEvent(
       
  7207   /*IN*/ PVOID  WnodeEventItem);
       
  7208 
       
  7209 NTOSAPI
       
  7210 VOID
       
  7211 DDKAPI
       
  7212 IoWriteErrorLogEntry(
       
  7213   /*IN*/ PVOID  ElEntry);
       
  7214 
       
  7215 NTOSAPI
       
  7216 NTSTATUS
       
  7217 DDKAPI
       
  7218 IoWritePartitionTableEx(
       
  7219   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  7220   /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX  *PartitionBuffer);
       
  7221 
       
  7222 
       
  7223 
       
  7224 /** Kernel routines **/
       
  7225 
       
  7226 NTOSAPI
       
  7227 VOID
       
  7228 DDKFASTAPI
       
  7229 KeAcquireInStackQueuedSpinLock(
       
  7230   /*IN*/ PKSPIN_LOCK  SpinLock,
       
  7231   /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);
       
  7232 
       
  7233 NTOSAPI
       
  7234 VOID
       
  7235 DDKFASTAPI
       
  7236 KeAcquireInStackQueuedSpinLockAtDpcLevel(
       
  7237   /*IN*/ PKSPIN_LOCK  SpinLock,
       
  7238   /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);
       
  7239 
       
  7240 NTOSAPI
       
  7241 KIRQL
       
  7242 DDKAPI
       
  7243 KeAcquireInterruptSpinLock(
       
  7244   /*IN*/ PKINTERRUPT  Interrupt);
       
  7245 
       
  7246 NTOSAPI
       
  7247 VOID
       
  7248 DDKAPI
       
  7249 KeAcquireSpinLock(
       
  7250   /*IN*/ PKSPIN_LOCK  SpinLock,
       
  7251   /*OUT*/ PKIRQL  OldIrql);
       
  7252 
       
  7253 /* System Service Dispatch Table */
       
  7254 typedef PVOID (NTAPI * SSDT)(VOID);
       
  7255 typedef SSDT * PSSDT;
       
  7256 
       
  7257 /* System Service Parameters Table */
       
  7258 typedef UCHAR SSPT, * PSSPT;
       
  7259 
       
  7260 typedef struct _SSDT_ENTRY {
       
  7261 	PSSDT  SSDT;
       
  7262 	PULONG  ServiceCounterTable;
       
  7263 	ULONG  NumberOfServices;
       
  7264 	PSSPT  SSPT;
       
  7265 } SSDT_ENTRY, *PSSDT_ENTRY;
       
  7266 
       
  7267 NTOSAPI
       
  7268 BOOLEAN
       
  7269 DDKAPI
       
  7270 KeAddSystemServiceTable(
       
  7271   /*IN*/ PSSDT  SSDT,
       
  7272   /*IN*/ PULONG  ServiceCounterTable,
       
  7273   /*IN*/ ULONG  NumberOfServices,
       
  7274   /*IN*/ PSSPT  SSPT,
       
  7275   /*IN*/ ULONG  TableIndex);
       
  7276 
       
  7277 NTOSAPI
       
  7278 BOOLEAN
       
  7279 DDKAPI
       
  7280 KeAreApcsDisabled(
       
  7281   VOID);
       
  7282 
       
  7283 NTOSAPI
       
  7284 VOID
       
  7285 DDKAPI
       
  7286 KeAttachProcess(
       
  7287   /*IN*/ PEPROCESS  Process);
       
  7288 
       
  7289 NTOSAPI
       
  7290 VOID
       
  7291 DDKAPI
       
  7292 KeBugCheck(
       
  7293   /*IN*/ ULONG  BugCheckCode);
       
  7294 
       
  7295 NTOSAPI
       
  7296 VOID
       
  7297 DDKAPI
       
  7298 KeBugCheckEx(
       
  7299   /*IN*/ ULONG  BugCheckCode,
       
  7300   /*IN*/ ULONG_PTR  BugCheckParameter1,
       
  7301   /*IN*/ ULONG_PTR  BugCheckParameter2,
       
  7302   /*IN*/ ULONG_PTR  BugCheckParameter3,
       
  7303   /*IN*/ ULONG_PTR  BugCheckParameter4);
       
  7304 
       
  7305 NTOSAPI
       
  7306 BOOLEAN
       
  7307 DDKAPI
       
  7308 KeCancelTimer(
       
  7309   /*IN*/ PKTIMER  Timer);
       
  7310 
       
  7311 NTOSAPI
       
  7312 VOID
       
  7313 DDKAPI
       
  7314 KeClearEvent(
       
  7315   /*IN*/ PRKEVENT  Event);
       
  7316 
       
  7317 NTOSAPI
       
  7318 NTSTATUS
       
  7319 DDKAPI
       
  7320 KeDelayExecutionThread(
       
  7321   /*IN*/ KPROCESSOR_MODE  WaitMode,
       
  7322   /*IN*/ BOOLEAN  Alertable,
       
  7323   /*IN*/ PLARGE_INTEGER  Interval);
       
  7324 
       
  7325 NTOSAPI
       
  7326 BOOLEAN
       
  7327 DDKAPI
       
  7328 KeDeregisterBugCheckCallback(
       
  7329   /*IN*/ PKBUGCHECK_CALLBACK_RECORD  CallbackRecord);
       
  7330 
       
  7331 NTOSAPI
       
  7332 VOID
       
  7333 DDKAPI
       
  7334 KeDetachProcess(
       
  7335   VOID);
       
  7336 
       
  7337 NTOSAPI
       
  7338 VOID
       
  7339 DDKAPI
       
  7340 KeEnterCriticalRegion(
       
  7341   VOID);
       
  7342 
       
  7343 /*
       
  7344  * VOID
       
  7345  * KeFlushIoBuffers(
       
  7346  * IN PMDL  Mdl,
       
  7347  * IN BOOLEAN  ReadOperation,
       
  7348  * IN BOOLEAN  DmaOperation)
       
  7349  */
       
  7350 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
       
  7351 
       
  7352 NTOSAPI
       
  7353 PRKTHREAD
       
  7354 DDKAPI
       
  7355 KeGetCurrentThread(
       
  7356   VOID);
       
  7357 
       
  7358 NTOSAPI
       
  7359 KPROCESSOR_MODE
       
  7360 DDKAPI
       
  7361 KeGetPreviousMode(
       
  7362   VOID);
       
  7363 
       
  7364 NTOSAPI
       
  7365 ULONG
       
  7366 DDKAPI
       
  7367 KeGetRecommendedSharedDataAlignment(
       
  7368   VOID);
       
  7369 
       
  7370 NTOSAPI
       
  7371 VOID
       
  7372 DDKAPI
       
  7373 KeInitializeApc(
       
  7374   /*IN*/ PKAPC  Apc,
       
  7375   /*IN*/ PKTHREAD  Thread,
       
  7376   /*IN*/ UCHAR  StateIndex,
       
  7377   /*IN*/ PKKERNEL_ROUTINE  KernelRoutine,
       
  7378   /*IN*/ PKRUNDOWN_ROUTINE  RundownRoutine,
       
  7379   /*IN*/ PKNORMAL_ROUTINE  NormalRoutine,
       
  7380   /*IN*/ UCHAR  Mode,
       
  7381   /*IN*/ PVOID  Context);
       
  7382 
       
  7383 NTOSAPI
       
  7384 VOID
       
  7385 DDKAPI
       
  7386 KeInitializeDeviceQueue(
       
  7387   /*IN*/ PKDEVICE_QUEUE  DeviceQueue);
       
  7388 
       
  7389 NTOSAPI
       
  7390 VOID
       
  7391 DDKAPI
       
  7392 KeInitializeMutex(
       
  7393   /*IN*/ PRKMUTEX  Mutex,
       
  7394   /*IN*/ ULONG  Level);
       
  7395 
       
  7396 NTOSAPI
       
  7397 VOID
       
  7398 DDKAPI
       
  7399 KeInitializeSemaphore(
       
  7400   /*IN*/ PRKSEMAPHORE  Semaphore,
       
  7401   /*IN*/ LONG  Count,
       
  7402   /*IN*/ LONG  Limit);
       
  7403 
       
  7404 NTOSAPI
       
  7405 VOID
       
  7406 DDKAPI
       
  7407 KeInitializeSpinLock(
       
  7408   /*IN*/ PKSPIN_LOCK  SpinLock);
       
  7409 
       
  7410 NTOSAPI
       
  7411 VOID
       
  7412 DDKAPI
       
  7413 KeInitializeTimer(
       
  7414   /*IN*/ PKTIMER  Timer);
       
  7415 
       
  7416 NTOSAPI
       
  7417 VOID
       
  7418 DDKAPI
       
  7419 KeInitializeTimerEx(
       
  7420   /*IN*/ PKTIMER  Timer,
       
  7421   /*IN*/ TIMER_TYPE  Type);
       
  7422 
       
  7423 NTOSAPI
       
  7424 BOOLEAN
       
  7425 DDKAPI
       
  7426 KeInsertByKeyDeviceQueue(
       
  7427   /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
       
  7428   /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry,
       
  7429   /*IN*/ ULONG  SortKey);
       
  7430 
       
  7431 NTOSAPI
       
  7432 BOOLEAN
       
  7433 DDKAPI
       
  7434 KeInsertDeviceQueue(
       
  7435   /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
       
  7436   /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
       
  7437 
       
  7438 NTOSAPI
       
  7439 BOOLEAN
       
  7440 DDKAPI
       
  7441 KeInsertQueueDpc(
       
  7442   /*IN*/ PRKDPC  Dpc,
       
  7443   /*IN*/ PVOID  SystemArgument1,
       
  7444   /*IN*/ PVOID  SystemArgument2);
       
  7445 
       
  7446 NTOSAPI
       
  7447 VOID
       
  7448 DDKAPI
       
  7449 KeLeaveCriticalRegion(
       
  7450   VOID);
       
  7451 
       
  7452 NTOSAPI
       
  7453 NTSTATUS
       
  7454 DDKAPI
       
  7455 KePulseEvent(
       
  7456   /*IN*/ PRKEVENT  Event,
       
  7457   /*IN*/ KPRIORITY  Increment,
       
  7458   /*IN*/ BOOLEAN  Wait);
       
  7459 
       
  7460 NTOSAPI
       
  7461 ULONGLONG
       
  7462 DDKAPI
       
  7463 KeQueryInterruptTime(
       
  7464   VOID);
       
  7465 
       
  7466 NTOSAPI
       
  7467 LARGE_INTEGER
       
  7468 DDKAPI
       
  7469 KeQueryPerformanceCounter(
       
  7470   /*OUT*/ PLARGE_INTEGER  PerformanceFrequency  /*OPTIONAL*/);
       
  7471 
       
  7472 NTOSAPI
       
  7473 KPRIORITY
       
  7474 DDKAPI
       
  7475 KeQueryPriorityThread(
       
  7476   /*IN*/ PRKTHREAD  Thread);
       
  7477 
       
  7478 NTOSAPI
       
  7479 VOID
       
  7480 DDKAPI
       
  7481 KeQuerySystemTime(
       
  7482   /*OUT*/ PLARGE_INTEGER  CurrentTime);
       
  7483 
       
  7484 NTOSAPI
       
  7485 VOID
       
  7486 DDKAPI
       
  7487 KeQueryTickCount(
       
  7488   /*OUT*/ PLARGE_INTEGER  TickCount);
       
  7489 
       
  7490 NTOSAPI
       
  7491 ULONG
       
  7492 DDKAPI
       
  7493 KeQueryTimeIncrement(
       
  7494   VOID);
       
  7495 
       
  7496 NTOSAPI
       
  7497 LONG
       
  7498 DDKAPI
       
  7499 KeReadStateEvent(
       
  7500   /*IN*/ PRKEVENT  Event);
       
  7501 
       
  7502 NTOSAPI
       
  7503 LONG
       
  7504 DDKAPI
       
  7505 KeReadStateMutex(
       
  7506   /*IN*/ PRKMUTEX  Mutex);
       
  7507 
       
  7508 NTOSAPI
       
  7509 LONG
       
  7510 DDKAPI
       
  7511 KeReadStateSemaphore(
       
  7512   /*IN*/ PRKSEMAPHORE  Semaphore);
       
  7513 
       
  7514 NTOSAPI
       
  7515 BOOLEAN
       
  7516 DDKAPI
       
  7517 KeReadStateTimer(
       
  7518   /*IN*/ PKTIMER  Timer);
       
  7519 
       
  7520 NTOSAPI
       
  7521 BOOLEAN
       
  7522 DDKAPI
       
  7523 KeRegisterBugCheckCallback(
       
  7524   /*IN*/ PKBUGCHECK_CALLBACK_RECORD  CallbackRecord,
       
  7525   /*IN*/ PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine,
       
  7526   /*IN*/ PVOID  Buffer,
       
  7527   /*IN*/ ULONG  Length,
       
  7528   /*IN*/ PUCHAR  Component);
       
  7529 
       
  7530 NTOSAPI
       
  7531 VOID
       
  7532 DDKFASTAPI
       
  7533 KeReleaseInStackQueuedSpinLock(
       
  7534   /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);
       
  7535 
       
  7536 NTOSAPI
       
  7537 VOID
       
  7538 DDKFASTAPI
       
  7539 KeReleaseInStackQueuedSpinLockFromDpcLevel(
       
  7540   /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);
       
  7541 
       
  7542 NTOSAPI
       
  7543 VOID
       
  7544 DDKAPI
       
  7545 KeReleaseInterruptSpinLock(
       
  7546   /*IN*/ PKINTERRUPT  Interrupt,
       
  7547   /*IN*/ KIRQL  OldIrql);
       
  7548 
       
  7549 NTOSAPI
       
  7550 LONG
       
  7551 DDKAPI
       
  7552 KeReleaseMutex(
       
  7553   /*IN*/ PRKMUTEX  Mutex,
       
  7554   /*IN*/ BOOLEAN  Wait);
       
  7555 
       
  7556 NTOSAPI
       
  7557 LONG
       
  7558 DDKAPI
       
  7559 KeReleaseSemaphore(
       
  7560   /*IN*/ PRKSEMAPHORE  Semaphore,
       
  7561   /*IN*/ KPRIORITY  Increment,
       
  7562   /*IN*/ LONG  Adjustment,
       
  7563   /*IN*/ BOOLEAN  Wait);
       
  7564 
       
  7565 NTOSAPI
       
  7566 VOID
       
  7567 DDKAPI
       
  7568 KeReleaseSpinLock(
       
  7569   /*IN*/ PKSPIN_LOCK  SpinLock,
       
  7570   /*IN*/ KIRQL  NewIrql);
       
  7571 
       
  7572 NTOSAPI
       
  7573 PKDEVICE_QUEUE_ENTRY
       
  7574 DDKAPI 
       
  7575 KeRemoveByKeyDeviceQueue(
       
  7576   /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
       
  7577   /*IN*/ ULONG  SortKey);
       
  7578 
       
  7579 NTOSAPI
       
  7580 PKDEVICE_QUEUE_ENTRY
       
  7581 DDKAPI
       
  7582 KeRemoveDeviceQueue(
       
  7583   /*IN*/ PKDEVICE_QUEUE  DeviceQueue);
       
  7584 
       
  7585 NTOSAPI
       
  7586 BOOLEAN
       
  7587 DDKAPI
       
  7588 KeRemoveEntryDeviceQueue(
       
  7589   /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
       
  7590   /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
       
  7591 
       
  7592 NTOSAPI
       
  7593 BOOLEAN
       
  7594 DDKAPI
       
  7595 KeRemoveQueueDpc(
       
  7596   /*IN*/ PRKDPC  Dpc);
       
  7597 
       
  7598 NTOSAPI
       
  7599 LONG
       
  7600 DDKAPI
       
  7601 KeResetEvent(
       
  7602   /*IN*/ PRKEVENT  Event);
       
  7603 
       
  7604 NTOSAPI
       
  7605 NTSTATUS
       
  7606 DDKAPI
       
  7607 KeRestoreFloatingPointState(
       
  7608   /*IN*/ PKFLOATING_SAVE  FloatSave);
       
  7609 
       
  7610 NTOSAPI
       
  7611 NTSTATUS
       
  7612 DDKAPI
       
  7613 KeSaveFloatingPointState(
       
  7614   /*OUT*/ PKFLOATING_SAVE  FloatSave);
       
  7615 
       
  7616 NTOSAPI
       
  7617 LONG
       
  7618 DDKAPI
       
  7619 KeSetBasePriorityThread(
       
  7620   /*IN*/ PRKTHREAD  Thread,
       
  7621   /*IN*/ LONG  Increment);
       
  7622 
       
  7623 NTOSAPI
       
  7624 LONG
       
  7625 DDKAPI
       
  7626 KeSetEvent(
       
  7627   /*IN*/ PRKEVENT  Event,
       
  7628   /*IN*/ KPRIORITY  Increment,
       
  7629   /*IN*/ BOOLEAN  Wait);
       
  7630 
       
  7631 NTOSAPI
       
  7632 VOID
       
  7633 DDKAPI
       
  7634 KeSetImportanceDpc(
       
  7635   /*IN*/ PRKDPC  Dpc,
       
  7636   /*IN*/ KDPC_IMPORTANCE  Importance);
       
  7637 
       
  7638 NTOSAPI
       
  7639 KPRIORITY
       
  7640 DDKAPI
       
  7641 KeSetPriorityThread(
       
  7642   /*IN*/ PKTHREAD  Thread,
       
  7643   /*IN*/ KPRIORITY  Priority);
       
  7644 
       
  7645 NTOSAPI
       
  7646 VOID
       
  7647 DDKAPI
       
  7648 KeSetTargetProcessorDpc(
       
  7649   /*IN*/ PRKDPC  Dpc,
       
  7650   /*IN*/ CCHAR  Number);
       
  7651 
       
  7652 NTOSAPI
       
  7653 BOOLEAN
       
  7654 DDKAPI
       
  7655 KeSetTimer(
       
  7656   /*IN*/ PKTIMER  Timer,
       
  7657   /*IN*/ LARGE_INTEGER  DueTime,
       
  7658   /*IN*/ PKDPC  Dpc  /*OPTIONAL*/);
       
  7659 
       
  7660 NTOSAPI
       
  7661 BOOLEAN
       
  7662 DDKAPI
       
  7663 KeSetTimerEx(
       
  7664   /*IN*/ PKTIMER  Timer,
       
  7665   /*IN*/ LARGE_INTEGER  DueTime,
       
  7666   /*IN*/ LONG  Period  /*OPTIONAL*/,
       
  7667   /*IN*/ PKDPC  Dpc  /*OPTIONAL*/);
       
  7668 
       
  7669 NTOSAPI
       
  7670 VOID
       
  7671 DDKFASTAPI
       
  7672 KeSetTimeUpdateNotifyRoutine(
       
  7673   /*IN*/ PTIME_UPDATE_NOTIFY_ROUTINE  NotifyRoutine);
       
  7674 
       
  7675 NTOSAPI
       
  7676 VOID
       
  7677 DDKAPI
       
  7678 KeStallExecutionProcessor(
       
  7679   /*IN*/ ULONG  MicroSeconds);
       
  7680 
       
  7681 NTOSAPI
       
  7682 BOOLEAN
       
  7683 DDKAPI
       
  7684 KeSynchronizeExecution(
       
  7685   /*IN*/ PKINTERRUPT    Interrupt,
       
  7686   /*IN*/ PKSYNCHRONIZE_ROUTINE  SynchronizeRoutine,
       
  7687   /*IN*/ PVOID  SynchronizeContext);
       
  7688 
       
  7689 NTOSAPI
       
  7690 NTSTATUS
       
  7691 DDKAPI
       
  7692 KeWaitForMultipleObjects(
       
  7693   /*IN*/ ULONG  Count,
       
  7694   /*IN*/ PVOID  Object[],
       
  7695   /*IN*/ WAIT_TYPE  WaitType,
       
  7696   /*IN*/ KWAIT_REASON  WaitReason,
       
  7697   /*IN*/ KPROCESSOR_MODE  WaitMode,
       
  7698   /*IN*/ BOOLEAN  Alertable,
       
  7699   /*IN*/ PLARGE_INTEGER  Timeout  /*OPTIONAL */,
       
  7700   /*IN*/ PKWAIT_BLOCK  WaitBlockArray  /*OPTIONAL*/);
       
  7701 
       
  7702 NTOSAPI
       
  7703 NTSTATUS
       
  7704 DDKAPI
       
  7705 KeWaitForMutexObject(
       
  7706   /*IN*/ PRKMUTEX  Mutex,
       
  7707   /*IN*/ KWAIT_REASON  WaitReason,
       
  7708   /*IN*/ KPROCESSOR_MODE  WaitMode,
       
  7709   /*IN*/ BOOLEAN  Alertable,
       
  7710   /*IN*/ PLARGE_INTEGER  Timeout  /*OPTIONAL*/);
       
  7711 
       
  7712 NTOSAPI
       
  7713 NTSTATUS
       
  7714 DDKAPI
       
  7715 KeWaitForSingleObject(
       
  7716   /*IN*/ PVOID  Object,
       
  7717   /*IN*/ KWAIT_REASON  WaitReason,
       
  7718   /*IN*/ KPROCESSOR_MODE  WaitMode,
       
  7719   /*IN*/ BOOLEAN  Alertable,
       
  7720   /*IN*/ PLARGE_INTEGER  Timeout  /*OPTIONAL*/);
       
  7721 
       
  7722 #if defined(_X86_)
       
  7723 
       
  7724 NTOSAPI
       
  7725 VOID
       
  7726 FASTCALL
       
  7727 KfLowerIrql(
       
  7728   /*IN*/ KIRQL  NewIrql);
       
  7729 
       
  7730 NTOSAPI
       
  7731 KIRQL
       
  7732 FASTCALL
       
  7733 KfRaiseIrql(
       
  7734   /*IN*/ KIRQL  NewIrql);
       
  7735 
       
  7736 #define KeLowerIrql(a) KfLowerIrql(a)
       
  7737 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
       
  7738 
       
  7739 #else
       
  7740 
       
  7741 NTOSAPI
       
  7742 VOID
       
  7743 DDKAPI
       
  7744 KeLowerIrql(
       
  7745   /*IN*/ KIRQL  NewIrql);
       
  7746 
       
  7747 NTOSAPI
       
  7748 KIRQL
       
  7749 DDKAPI
       
  7750 KeRaiseIrql(
       
  7751   /*IN*/ KIRQL  NewIrql);
       
  7752 
       
  7753 #endif
       
  7754 
       
  7755 NTOSAPI
       
  7756 KIRQL
       
  7757 DDKAPI
       
  7758 KeRaiseIrqlToDpcLevel(
       
  7759   VOID);
       
  7760 
       
  7761 /** Memory manager routines **/
       
  7762 
       
  7763 NTOSAPI
       
  7764 NTSTATUS
       
  7765 DDKAPI
       
  7766 MmAdvanceMdl(
       
  7767   /*IN*/ PMDL  Mdl,
       
  7768   /*IN*/ ULONG  NumberOfBytes);
       
  7769 
       
  7770 NTOSAPI
       
  7771 PVOID
       
  7772 DDKAPI
       
  7773 MmAllocateContiguousMemory(
       
  7774   /*IN*/ ULONG  NumberOfBytes,
       
  7775   /*IN*/ PHYSICAL_ADDRESS  HighestAcceptableAddress);
       
  7776 
       
  7777 NTOSAPI
       
  7778 PVOID
       
  7779 DDKAPI
       
  7780 MmAllocateContiguousMemorySpecifyCache(
       
  7781   /*IN*/ SIZE_T  NumberOfBytes,
       
  7782   /*IN*/ PHYSICAL_ADDRESS  LowestAcceptableAddress,
       
  7783   /*IN*/ PHYSICAL_ADDRESS  HighestAcceptableAddress,
       
  7784   /*IN*/ PHYSICAL_ADDRESS  BoundaryAddressMultiple  /*OPTIONAL*/,
       
  7785   /*IN*/ MEMORY_CACHING_TYPE  CacheType);
       
  7786 
       
  7787 NTOSAPI
       
  7788 PVOID
       
  7789 DDKAPI
       
  7790 MmAllocateMappingAddress(
       
  7791   /*IN*/ SIZE_T  NumberOfBytes,
       
  7792   /*IN*/ ULONG  PoolTag);
       
  7793 
       
  7794 NTOSAPI
       
  7795 PVOID
       
  7796 DDKAPI
       
  7797 MmAllocateNonCachedMemory(
       
  7798   /*IN*/ ULONG  NumberOfBytes);
       
  7799 
       
  7800 NTOSAPI
       
  7801 PMDL
       
  7802 DDKAPI
       
  7803 MmAllocatePagesForMdl(
       
  7804   /*IN*/ PHYSICAL_ADDRESS  LowAddress,
       
  7805   /*IN*/ PHYSICAL_ADDRESS  HighAddress,
       
  7806   /*IN*/ PHYSICAL_ADDRESS  SkipBytes,
       
  7807   /*IN*/ SIZE_T  TotalBytes);
       
  7808 
       
  7809 NTOSAPI
       
  7810 VOID
       
  7811 DDKAPI
       
  7812 MmBuildMdlForNonPagedPool(
       
  7813   /*IN OUT*/ PMDL  MemoryDescriptorList);
       
  7814 
       
  7815 NTOSAPI
       
  7816 NTSTATUS
       
  7817 DDKAPI
       
  7818 MmCreateSection(
       
  7819   /*OUT*/ PSECTION_OBJECT  *SectionObject,
       
  7820   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  7821   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
       
  7822   /*IN*/ PLARGE_INTEGER  MaximumSize,
       
  7823   /*IN*/ ULONG  SectionPageProtection,
       
  7824   /*IN*/ ULONG  AllocationAttributes,
       
  7825   /*IN*/ HANDLE  FileHandle  /*OPTIONAL*/,
       
  7826   /*IN*/ PFILE_OBJECT  File  /*OPTIONAL*/);
       
  7827 
       
  7828 typedef enum _MMFLUSH_TYPE {
       
  7829   MmFlushForDelete,
       
  7830   MmFlushForWrite
       
  7831 } MMFLUSH_TYPE;
       
  7832 
       
  7833 NTOSAPI
       
  7834 BOOLEAN
       
  7835 DDKAPI
       
  7836 MmFlushImageSection(
       
  7837   /*IN*/ PSECTION_OBJECT_POINTERS  SectionObjectPointer,
       
  7838   /*IN*/ MMFLUSH_TYPE  FlushType);
       
  7839 
       
  7840 NTOSAPI
       
  7841 VOID
       
  7842 DDKAPI
       
  7843 MmFreeContiguousMemory(
       
  7844   /*IN*/ PVOID  BaseAddress);
       
  7845 
       
  7846 NTOSAPI
       
  7847 VOID
       
  7848 DDKAPI
       
  7849 MmFreeContiguousMemorySpecifyCache(
       
  7850   /*IN*/ PVOID  BaseAddress,
       
  7851   /*IN*/ SIZE_T  NumberOfBytes,
       
  7852   /*IN*/ MEMORY_CACHING_TYPE  CacheType);
       
  7853 
       
  7854 NTOSAPI
       
  7855 VOID
       
  7856 DDKAPI
       
  7857 MmFreeMappingAddress(
       
  7858   /*IN*/ PVOID  BaseAddress,
       
  7859   /*IN*/ ULONG  PoolTag);
       
  7860 
       
  7861 NTOSAPI
       
  7862 VOID
       
  7863 DDKAPI
       
  7864 MmFreeNonCachedMemory(
       
  7865   /*IN*/ PVOID  BaseAddress,
       
  7866   /*IN*/ SIZE_T  NumberOfBytes);
       
  7867 
       
  7868 NTOSAPI
       
  7869 VOID
       
  7870 DDKAPI
       
  7871 MmFreePagesFromMdl(
       
  7872   /*IN*/ PMDL  MemoryDescriptorList);
       
  7873 
       
  7874 /*
       
  7875  * ULONG
       
  7876  * MmGetMdlByteCount(
       
  7877  * IN PMDL  Mdl)
       
  7878  */
       
  7879 #define MmGetMdlByteCount(_Mdl) \
       
  7880   ((_Mdl)->ByteCount)
       
  7881 
       
  7882 /*
       
  7883  * ULONG
       
  7884  * MmGetMdlByteOffset(
       
  7885  * IN PMDL  Mdl)
       
  7886  */
       
  7887 #define MmGetMdlByteOffset(_Mdl) \
       
  7888   ((_Mdl)->ByteOffset)
       
  7889 
       
  7890 /*
       
  7891  * PPFN_NUMBER
       
  7892  * MmGetMdlPfnArray(
       
  7893  * IN PMDL  Mdl)
       
  7894  */
       
  7895 #define MmGetMdlPfnArray(_Mdl) \
       
  7896   ((PPFN_NUMBER) ((_Mdl) + 1))
       
  7897 
       
  7898 /*
       
  7899  * PVOID
       
  7900  * MmGetMdlVirtualAddress(
       
  7901  * IN PMDL  Mdl)
       
  7902  */
       
  7903 #define MmGetMdlVirtualAddress(_Mdl) \
       
  7904   ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
       
  7905 
       
  7906 NTOSAPI
       
  7907 PHYSICAL_ADDRESS
       
  7908 DDKAPI
       
  7909 MmGetPhysicalAddress(
       
  7910   /*IN*/ PVOID  BaseAddress);
       
  7911 
       
  7912 NTOSAPI
       
  7913 PPHYSICAL_MEMORY_RANGE
       
  7914 DDKAPI
       
  7915 MmGetPhysicalMemoryRanges(
       
  7916   VOID);
       
  7917 
       
  7918 NTOSAPI
       
  7919 PVOID
       
  7920 DDKAPI
       
  7921 MmGetVirtualForPhysical(
       
  7922   /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress);
       
  7923 
       
  7924 NTOSAPI
       
  7925 PVOID
       
  7926 DDKAPI
       
  7927 MmMapLockedPagesSpecifyCache(
       
  7928   /*IN*/ PMDL  MemoryDescriptorList,
       
  7929   /*IN*/ KPROCESSOR_MODE  AccessMode,
       
  7930   /*IN*/ MEMORY_CACHING_TYPE  CacheType,
       
  7931   /*IN*/ PVOID  BaseAddress,
       
  7932   /*IN*/ ULONG  BugCheckOnFailure,
       
  7933   /*IN*/ MM_PAGE_PRIORITY  Priority);
       
  7934 
       
  7935 NTOSAPI
       
  7936 PVOID
       
  7937 DDKAPI
       
  7938 MmMapLockedPagesWithReservedMapping(
       
  7939   /*IN*/ PVOID  MappingAddress,
       
  7940   /*IN*/ ULONG  PoolTag,
       
  7941   /*IN*/ PMDL  MemoryDescriptorList,
       
  7942   /*IN*/ MEMORY_CACHING_TYPE  CacheType);
       
  7943 
       
  7944 NTOSAPI
       
  7945 NTSTATUS
       
  7946 DDKAPI
       
  7947 MmMapUserAddressesToPage(
       
  7948   /*IN*/ PVOID  BaseAddress,
       
  7949   /*IN*/ SIZE_T  NumberOfBytes,
       
  7950   /*IN*/ PVOID  PageAddress);
       
  7951 
       
  7952 NTOSAPI
       
  7953 PVOID
       
  7954 DDKAPI
       
  7955 MmMapVideoDisplay(
       
  7956   /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress,
       
  7957   /*IN*/ SIZE_T  NumberOfBytes,
       
  7958   /*IN*/ MEMORY_CACHING_TYPE  CacheType);
       
  7959 
       
  7960 NTOSAPI
       
  7961 NTSTATUS
       
  7962 DDKAPI
       
  7963 MmMapViewInSessionSpace(
       
  7964   /*IN*/ PVOID  Section,
       
  7965   /*OUT*/ PVOID  *MappedBase,
       
  7966   /*IN OUT*/ PSIZE_T  ViewSize);
       
  7967 
       
  7968 NTOSAPI
       
  7969 NTSTATUS
       
  7970 DDKAPI
       
  7971 MmMapViewInSystemSpace(
       
  7972   /*IN*/ PVOID  Section,
       
  7973   /*OUT*/ PVOID  *MappedBase,
       
  7974   /*IN*/ PSIZE_T  ViewSize);
       
  7975 
       
  7976 NTOSAPI
       
  7977 NTSTATUS
       
  7978 DDKAPI
       
  7979 MmMarkPhysicalMemoryAsBad(
       
  7980   /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
       
  7981   /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);
       
  7982 
       
  7983 NTOSAPI
       
  7984 NTSTATUS
       
  7985 DDKAPI
       
  7986 MmMarkPhysicalMemoryAsGood(
       
  7987   /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
       
  7988   /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);
       
  7989 
       
  7990 /*
       
  7991  * PVOID
       
  7992  * MmGetSystemAddressForMdlSafe(
       
  7993  * IN PMDL  Mdl,
       
  7994  * IN MM_PAGE_PRIORITY  Priority)
       
  7995  */
       
  7996 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
       
  7997   ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
       
  7998     | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
       
  7999     (_Mdl)->MappedSystemVa : \
       
  8000     (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
       
  8001       KernelMode, MmCached, NULL, FALSE, _Priority)
       
  8002 
       
  8003 NTOSAPI
       
  8004 PVOID
       
  8005 DDKAPI
       
  8006 MmGetSystemRoutineAddress(
       
  8007   /*IN*/ PUNICODE_STRING  SystemRoutineName);
       
  8008 
       
  8009 /*
       
  8010  * ULONG
       
  8011  * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
       
  8012  * IN PVOID  Va,
       
  8013  * IN ULONG  Size)
       
  8014  */
       
  8015 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
       
  8016                                        _Size) \
       
  8017   ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
       
  8018     + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
       
  8019 
       
  8020 /*
       
  8021  * VOID
       
  8022  * MmInitializeMdl(
       
  8023  * IN PMDL  MemoryDescriptorList,
       
  8024  * IN PVOID  BaseVa,
       
  8025  * IN SIZE_T  Length)
       
  8026  */
       
  8027 #define MmInitializeMdl(_MemoryDescriptorList, \
       
  8028                         _BaseVa, \
       
  8029                         _Length) \
       
  8030 { \
       
  8031   (_MemoryDescriptorList)->Next = (PMDL) NULL; \
       
  8032   (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
       
  8033     (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
       
  8034   (_MemoryDescriptorList)->MdlFlags = 0; \
       
  8035   (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
       
  8036   (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
       
  8037   (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
       
  8038 }
       
  8039 
       
  8040 NTOSAPI
       
  8041 BOOLEAN
       
  8042 DDKAPI
       
  8043 MmIsAddressValid(
       
  8044   /*IN*/ PVOID  VirtualAddress);
       
  8045 
       
  8046 NTOSAPI
       
  8047 LOGICAL
       
  8048 DDKAPI
       
  8049 MmIsDriverVerifying(
       
  8050   /*IN*/ PDRIVER_OBJECT  DriverObject);
       
  8051 
       
  8052 NTOSAPI
       
  8053 BOOLEAN
       
  8054 DDKAPI
       
  8055 MmIsThisAnNtAsSystem(
       
  8056   VOID);
       
  8057 
       
  8058 NTOSAPI
       
  8059 NTSTATUS
       
  8060 DDKAPI
       
  8061 MmIsVerifierEnabled(
       
  8062   /*OUT*/ PULONG  VerifierFlags);
       
  8063 
       
  8064 NTOSAPI
       
  8065 PVOID
       
  8066 DDKAPI
       
  8067 MmLockPagableDataSection(
       
  8068   /*IN*/ PVOID  AddressWithinSection);
       
  8069 
       
  8070 NTOSAPI
       
  8071 PVOID
       
  8072 DDKAPI
       
  8073 MmLockPagableImageSection(
       
  8074   /*IN*/ PVOID  AddressWithinSection);
       
  8075 
       
  8076 /*
       
  8077  * PVOID
       
  8078  * MmLockPagableCodeSection(
       
  8079  * IN PVOID  AddressWithinSection)
       
  8080  */
       
  8081 #define MmLockPagableCodeSection MmLockPagableDataSection
       
  8082 
       
  8083 NTOSAPI
       
  8084 VOID
       
  8085 DDKAPI
       
  8086 MmLockPagableSectionByHandle(
       
  8087   /*IN*/ PVOID  ImageSectionHandle);
       
  8088 
       
  8089 NTOSAPI
       
  8090 PVOID
       
  8091 DDKAPI
       
  8092 MmMapIoSpace(
       
  8093   /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress,
       
  8094   /*IN*/ ULONG  NumberOfBytes,
       
  8095   /*IN*/ MEMORY_CACHING_TYPE  CacheEnable);
       
  8096 
       
  8097 NTOSAPI
       
  8098 PVOID
       
  8099 DDKAPI
       
  8100 MmMapLockedPages(
       
  8101   /*IN*/ PMDL  MemoryDescriptorList,
       
  8102   /*IN*/ KPROCESSOR_MODE  AccessMode);
       
  8103 
       
  8104 NTOSAPI
       
  8105 VOID
       
  8106 DDKAPI
       
  8107 MmPageEntireDriver(
       
  8108   /*IN*/ PVOID  AddressWithinSection);
       
  8109 
       
  8110 NTOSAPI
       
  8111 VOID
       
  8112 DDKAPI
       
  8113 MmProbeAndLockProcessPages(
       
  8114   /*IN OUT*/ PMDL  MemoryDescriptorList,
       
  8115   /*IN*/ PEPROCESS  Process,
       
  8116   /*IN*/ KPROCESSOR_MODE  AccessMode,
       
  8117   /*IN*/ LOCK_OPERATION  Operation);
       
  8118 
       
  8119 NTOSAPI
       
  8120 NTSTATUS
       
  8121 DDKAPI
       
  8122 MmProtectMdlSystemAddress(
       
  8123   /*IN*/ PMDL  MemoryDescriptorList,
       
  8124   /*IN*/ ULONG  NewProtect);
       
  8125 
       
  8126 NTOSAPI
       
  8127 VOID
       
  8128 DDKAPI
       
  8129 MmUnmapLockedPages(
       
  8130   /*IN*/ PVOID  BaseAddress,
       
  8131   /*IN*/ PMDL  MemoryDescriptorList);
       
  8132 
       
  8133 NTOSAPI
       
  8134 NTSTATUS
       
  8135 DDKAPI
       
  8136 MmUnmapViewInSessionSpace(
       
  8137   /*IN*/ PVOID  MappedBase);
       
  8138 
       
  8139 NTOSAPI
       
  8140 NTSTATUS
       
  8141 DDKAPI
       
  8142 MmUnmapViewInSystemSpace(
       
  8143   /*IN*/ PVOID MappedBase);
       
  8144 
       
  8145 NTOSAPI
       
  8146 VOID
       
  8147 DDKAPI
       
  8148 MmUnsecureVirtualMemory(
       
  8149   /*IN*/ HANDLE  SecureHandle);
       
  8150 
       
  8151 /*
       
  8152  * VOID
       
  8153  * MmPrepareMdlForReuse(
       
  8154  * IN PMDL  Mdl)
       
  8155  */
       
  8156 #define MmPrepareMdlForReuse(_Mdl) \
       
  8157 { \
       
  8158   if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
       
  8159     ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
       
  8160     MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
       
  8161   } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
       
  8162     ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
       
  8163   } \
       
  8164 }
       
  8165 
       
  8166 NTOSAPI
       
  8167 VOID
       
  8168 DDKAPI
       
  8169 MmProbeAndLockPages(
       
  8170   /*IN OUT*/ PMDL  MemoryDescriptorList,
       
  8171   /*IN*/ KPROCESSOR_MODE  AccessMode,
       
  8172   /*IN*/ LOCK_OPERATION  Operation);
       
  8173 
       
  8174 NTOSAPI
       
  8175 MM_SYSTEM_SIZE
       
  8176 DDKAPI
       
  8177 MmQuerySystemSize(
       
  8178   VOID);
       
  8179 
       
  8180 NTOSAPI
       
  8181 NTSTATUS
       
  8182 DDKAPI
       
  8183 MmRemovePhysicalMemory(
       
  8184   /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
       
  8185   /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);
       
  8186 
       
  8187 NTOSAPI
       
  8188 VOID
       
  8189 DDKAPI
       
  8190 MmResetDriverPaging(
       
  8191   /*IN*/ PVOID  AddressWithinSection);
       
  8192 
       
  8193 NTOSAPI
       
  8194 HANDLE
       
  8195 DDKAPI
       
  8196 MmSecureVirtualMemory(
       
  8197   /*IN*/ PVOID  Address,
       
  8198   /*IN*/ SIZE_T  Size,
       
  8199   /*IN*/ ULONG  ProbeMode);
       
  8200 
       
  8201 NTOSAPI
       
  8202 ULONG
       
  8203 DDKAPI
       
  8204 MmSizeOfMdl(
       
  8205   /*IN*/ PVOID  Base,
       
  8206   /*IN*/ SIZE_T  Length);
       
  8207 
       
  8208 NTOSAPI
       
  8209 VOID
       
  8210 DDKAPI
       
  8211 MmUnlockPagableImageSection(
       
  8212   /*IN*/ PVOID  ImageSectionHandle);
       
  8213 
       
  8214 NTOSAPI
       
  8215 VOID
       
  8216 DDKAPI
       
  8217 MmUnlockPages(
       
  8218   /*IN*/ PMDL  MemoryDescriptorList);
       
  8219 
       
  8220 NTOSAPI
       
  8221 VOID
       
  8222 DDKAPI
       
  8223 MmUnmapIoSpace(
       
  8224   /*IN*/ PVOID  BaseAddress,
       
  8225   /*IN*/ SIZE_T  NumberOfBytes);
       
  8226 
       
  8227 NTOSAPI
       
  8228 VOID
       
  8229 DDKAPI
       
  8230 MmUnmapReservedMapping(
       
  8231   /*IN*/ PVOID  BaseAddress,
       
  8232   /*IN*/ ULONG  PoolTag,
       
  8233   /*IN*/ PMDL  MemoryDescriptorList);
       
  8234 
       
  8235 NTOSAPI
       
  8236 VOID
       
  8237 DDKAPI
       
  8238 MmUnmapVideoDisplay(
       
  8239   /*IN*/ PVOID  BaseAddress,
       
  8240   /*IN*/ SIZE_T  NumberOfBytes);
       
  8241 
       
  8242 
       
  8243 
       
  8244 /** Object manager routines **/
       
  8245 
       
  8246 NTOSAPI
       
  8247 NTSTATUS
       
  8248 DDKAPI
       
  8249 ObAssignSecurity(
       
  8250   /*IN*/ PACCESS_STATE  AccessState,
       
  8251   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
       
  8252   /*IN*/ PVOID  Object,
       
  8253   /*IN*/ POBJECT_TYPE  Type);
       
  8254 
       
  8255 NTOSAPI
       
  8256 VOID
       
  8257 DDKAPI
       
  8258 ObDereferenceSecurityDescriptor(
       
  8259   PSECURITY_DESCRIPTOR  SecurityDescriptor,
       
  8260   ULONG  Count);
       
  8261 
       
  8262 NTOSAPI
       
  8263 VOID
       
  8264 DDKFASTAPI
       
  8265 ObfDereferenceObject(
       
  8266   /*IN*/ PVOID  Object);
       
  8267 
       
  8268 /*
       
  8269  * VOID
       
  8270  * ObDereferenceObject(
       
  8271  * IN PVOID  Object)
       
  8272  */
       
  8273 #define ObDereferenceObject ObfDereferenceObject
       
  8274 
       
  8275 NTOSAPI
       
  8276 NTSTATUS
       
  8277 DDKAPI
       
  8278 ObGetObjectSecurity(
       
  8279   /*IN*/ PVOID  Object,
       
  8280   /*OUT*/ PSECURITY_DESCRIPTOR  *SecurityDescriptor,
       
  8281   /*OUT*/ PBOOLEAN  MemoryAllocated); 
       
  8282 
       
  8283 NTOSAPI
       
  8284 NTSTATUS
       
  8285 DDKAPI
       
  8286 ObInsertObject(
       
  8287   /*IN*/ PVOID  Object,
       
  8288   /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
       
  8289   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8290   /*IN*/ ULONG  AdditionalReferences,
       
  8291   /*OUT*/ PVOID*  ReferencedObject  /*OPTIONAL*/,
       
  8292   /*OUT*/ PHANDLE  Handle);
       
  8293 
       
  8294 NTOSAPI
       
  8295 VOID
       
  8296 DDKFASTAPI
       
  8297 ObfReferenceObject(
       
  8298   /*IN*/ PVOID  Object);
       
  8299 
       
  8300 NTOSAPI
       
  8301 NTSTATUS
       
  8302 DDKAPI
       
  8303 ObLogSecurityDescriptor(
       
  8304   /*IN*/ PSECURITY_DESCRIPTOR  InputSecurityDescriptor,
       
  8305   /*OUT*/ PSECURITY_DESCRIPTOR  *OutputSecurityDescriptor,
       
  8306   /*IN*/ ULONG RefBias);
       
  8307 /*
       
  8308  * VOID
       
  8309  * ObReferenceObject(
       
  8310  * IN PVOID  Object)
       
  8311  */
       
  8312 #define ObReferenceObject ObfReferenceObject
       
  8313 
       
  8314 NTOSAPI
       
  8315 VOID
       
  8316 DDKAPI
       
  8317 ObMakeTemporaryObject(
       
  8318   /*IN*/ PVOID  Object);
       
  8319 
       
  8320 NTOSAPI
       
  8321 NTSTATUS
       
  8322 DDKAPI
       
  8323 ObOpenObjectByName(
       
  8324   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  8325   /*IN*/ POBJECT_TYPE  ObjectType,
       
  8326   /*IN OUT*/ PVOID  ParseContext  /*OPTIONAL*/,
       
  8327   /*IN*/ KPROCESSOR_MODE  AccessMode,
       
  8328   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8329   /*IN*/ PACCESS_STATE  PassedAccessState,
       
  8330   /*OUT*/ PHANDLE  Handle);
       
  8331 
       
  8332 NTOSAPI
       
  8333 NTSTATUS
       
  8334 DDKAPI
       
  8335 ObOpenObjectByPointer(
       
  8336   /*IN*/ PVOID  Object,
       
  8337   /*IN*/ ULONG  HandleAttributes,
       
  8338   /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
       
  8339   /*IN*/ ACCESS_MASK  DesiredAccess  /*OPTIONAL*/,
       
  8340   /*IN*/ POBJECT_TYPE  ObjectType  /*OPTIONAL*/,
       
  8341   /*IN*/ KPROCESSOR_MODE  AccessMode,
       
  8342   /*OUT*/ PHANDLE  Handle);
       
  8343 
       
  8344 NTOSAPI
       
  8345 NTSTATUS
       
  8346 DDKAPI
       
  8347 ObQueryObjectAuditingByHandle(
       
  8348   /*IN*/ HANDLE  Handle,
       
  8349   /*OUT*/ PBOOLEAN  GenerateOnClose);
       
  8350 
       
  8351 NTOSAPI
       
  8352 NTSTATUS
       
  8353 DDKAPI
       
  8354 ObReferenceObjectByHandle(
       
  8355   /*IN*/ HANDLE  Handle,
       
  8356   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8357   /*IN*/ POBJECT_TYPE  ObjectType  /*OPTIONAL*/,
       
  8358   /*IN*/ KPROCESSOR_MODE  AccessMode,
       
  8359   /*OUT*/ PVOID  *Object,
       
  8360   /*OUT*/ POBJECT_HANDLE_INFORMATION  HandleInformation  /*OPTIONAL*/);
       
  8361 
       
  8362 NTOSAPI
       
  8363 NTSTATUS
       
  8364 DDKAPI
       
  8365 ObReferenceObjectByName(
       
  8366   /*IN*/ PUNICODE_STRING  ObjectPath,
       
  8367   /*IN*/ ULONG  Attributes,
       
  8368   /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
       
  8369   /*IN*/ ACCESS_MASK  DesiredAccess  /*OPTIONAL*/,
       
  8370   /*IN*/ POBJECT_TYPE  ObjectType,
       
  8371   /*IN*/ KPROCESSOR_MODE  AccessMode,
       
  8372   /*IN OUT*/ PVOID  ParseContext  /*OPTIONAL*/,
       
  8373   /*OUT*/ PVOID  *Object);
       
  8374 
       
  8375 NTOSAPI
       
  8376 NTSTATUS
       
  8377 DDKAPI
       
  8378 ObReferenceObjectByPointer(
       
  8379   /*IN*/ PVOID  Object,
       
  8380   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8381   /*IN*/ POBJECT_TYPE  ObjectType,
       
  8382   /*IN*/ KPROCESSOR_MODE  AccessMode);
       
  8383 
       
  8384 NTOSAPI
       
  8385 VOID
       
  8386 DDKAPI
       
  8387 ObReferenceSecurityDescriptor(
       
  8388   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
       
  8389   /*IN*/ ULONG  Count);
       
  8390 
       
  8391 NTOSAPI
       
  8392 VOID
       
  8393 DDKAPI
       
  8394 ObReleaseObjectSecurity(
       
  8395   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
       
  8396   /*IN*/ BOOLEAN  MemoryAllocated);
       
  8397 
       
  8398 
       
  8399 
       
  8400 /** Process manager routines **/
       
  8401 
       
  8402 NTOSAPI
       
  8403 NTSTATUS
       
  8404 DDKAPI
       
  8405 PsCreateSystemProcess(
       
  8406   /*IN*/ PHANDLE  ProcessHandle,
       
  8407   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8408   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
       
  8409 
       
  8410 NTOSAPI
       
  8411 NTSTATUS
       
  8412 DDKAPI
       
  8413 PsCreateSystemThread(
       
  8414   /*OUT*/ PHANDLE  ThreadHandle,
       
  8415   /*IN*/ ULONG  DesiredAccess,
       
  8416   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
       
  8417   /*IN*/ HANDLE  ProcessHandle  /*OPTIONAL*/,
       
  8418   /*OUT*/ PCLIENT_ID  ClientId  /*OPTIONAL*/,
       
  8419   /*IN*/ PKSTART_ROUTINE  StartRoutine,
       
  8420   /*IN*/ PVOID  StartContext);
       
  8421 
       
  8422 /*
       
  8423  * PEPROCESS
       
  8424  * PsGetCurrentProcess(VOID)
       
  8425  */
       
  8426 #define PsGetCurrentProcess IoGetCurrentProcess
       
  8427 
       
  8428 NTOSAPI
       
  8429 HANDLE
       
  8430 DDKAPI
       
  8431 PsGetCurrentProcessId(
       
  8432   VOID);
       
  8433 
       
  8434 /*
       
  8435  * PETHREAD
       
  8436  * PsGetCurrentThread(VOID)
       
  8437  */
       
  8438 #define PsGetCurrentThread() \
       
  8439   ((PETHREAD) KeGetCurrentThread())
       
  8440 
       
  8441 NTOSAPI
       
  8442 HANDLE
       
  8443 DDKAPI
       
  8444 PsGetCurrentThreadId(
       
  8445   VOID);
       
  8446 
       
  8447 NTOSAPI
       
  8448 BOOLEAN
       
  8449 DDKAPI
       
  8450 PsGetVersion(
       
  8451   PULONG  MajorVersion  /*OPTIONAL*/,
       
  8452   PULONG  MinorVersion  /*OPTIONAL*/,
       
  8453   PULONG  BuildNumber  /*OPTIONAL*/,
       
  8454   PUNICODE_STRING  CSDVersion  /*OPTIONAL*/);
       
  8455 
       
  8456 NTOSAPI
       
  8457 NTSTATUS
       
  8458 DDKAPI
       
  8459 PsRemoveCreateThreadNotifyRoutine(
       
  8460   /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);
       
  8461 
       
  8462 NTOSAPI
       
  8463 NTSTATUS
       
  8464 DDKAPI
       
  8465 PsRemoveLoadImageNotifyRoutine(
       
  8466   /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);
       
  8467 
       
  8468 NTOSAPI
       
  8469 NTSTATUS
       
  8470 DDKAPI
       
  8471 PsSetCreateProcessNotifyRoutine(
       
  8472   /*IN*/ PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,
       
  8473   /*IN*/ BOOLEAN  Remove);
       
  8474 
       
  8475 NTOSAPI
       
  8476 NTSTATUS
       
  8477 DDKAPI
       
  8478 PsSetCreateThreadNotifyRoutine(
       
  8479   /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);
       
  8480 
       
  8481 NTOSAPI
       
  8482 NTSTATUS
       
  8483 DDKAPI
       
  8484 PsSetLoadImageNotifyRoutine(
       
  8485   /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);
       
  8486 
       
  8487 NTOSAPI
       
  8488 NTSTATUS
       
  8489 DDKAPI
       
  8490 PsTerminateSystemThread(
       
  8491   /*IN*/ NTSTATUS  ExitStatus);
       
  8492 
       
  8493 
       
  8494 
       
  8495 /** Security reference monitor routines **/
       
  8496 
       
  8497 NTOSAPI
       
  8498 BOOLEAN
       
  8499 DDKAPI
       
  8500 SeAccessCheck(
       
  8501   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
       
  8502   /*IN*/ PSECURITY_SUBJECT_CONTEXT  SubjectSecurityContext,
       
  8503   /*IN*/ BOOLEAN  SubjectContextLocked,
       
  8504   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8505   /*IN*/ ACCESS_MASK  PreviouslyGrantedAccess,
       
  8506   /*OUT*/ PPRIVILEGE_SET  *Privileges  /*OPTIONAL*/,
       
  8507   /*IN*/ PGENERIC_MAPPING  GenericMapping,
       
  8508   /*IN*/ KPROCESSOR_MODE  AccessMode,
       
  8509   /*OUT*/ PACCESS_MASK  GrantedAccess,
       
  8510   /*OUT*/ PNTSTATUS  AccessStatus);
       
  8511 
       
  8512 NTOSAPI
       
  8513 NTSTATUS
       
  8514 DDKAPI
       
  8515 SeAssignSecurity(
       
  8516   /*IN*/ PSECURITY_DESCRIPTOR  ParentDescriptor  /*OPTIONAL*/,
       
  8517   /*IN*/ PSECURITY_DESCRIPTOR  ExplicitDescriptor  /*OPTIONAL*/,
       
  8518   /*OUT*/ PSECURITY_DESCRIPTOR  *NewDescriptor,
       
  8519   /*IN*/ BOOLEAN  IsDirectoryObject,
       
  8520   /*IN*/ PSECURITY_SUBJECT_CONTEXT  SubjectContext,
       
  8521   /*IN*/ PGENERIC_MAPPING  GenericMapping,
       
  8522   /*IN*/ POOL_TYPE  PoolType);
       
  8523 
       
  8524 NTOSAPI
       
  8525 NTSTATUS
       
  8526 DDKAPI
       
  8527 SeAssignSecurityEx(
       
  8528   /*IN*/ PSECURITY_DESCRIPTOR  ParentDescriptor  /*OPTIONAL*/,
       
  8529   /*IN*/ PSECURITY_DESCRIPTOR  ExplicitDescriptor  /*OPTIONAL*/,
       
  8530   /*OUT*/ PSECURITY_DESCRIPTOR  *NewDescriptor,
       
  8531   /*IN*/ GUID  *ObjectType  /*OPTIONAL*/,
       
  8532   /*IN*/ BOOLEAN  IsDirectoryObject,
       
  8533   /*IN*/ ULONG  AutoInheritFlags,
       
  8534   /*IN*/ PSECURITY_SUBJECT_CONTEXT  SubjectContext,
       
  8535   /*IN*/ PGENERIC_MAPPING  GenericMapping,
       
  8536   /*IN*/ POOL_TYPE  PoolType);
       
  8537 
       
  8538 NTOSAPI
       
  8539 NTSTATUS
       
  8540 DDKAPI
       
  8541 SeDeassignSecurity(
       
  8542   /*IN OUT*/ PSECURITY_DESCRIPTOR  *SecurityDescriptor);
       
  8543 
       
  8544 NTOSAPI
       
  8545 BOOLEAN
       
  8546 DDKAPI
       
  8547 SeSinglePrivilegeCheck(
       
  8548   LUID  PrivilegeValue,
       
  8549   KPROCESSOR_MODE  PreviousMode);
       
  8550 
       
  8551 NTOSAPI
       
  8552 BOOLEAN
       
  8553 DDKAPI
       
  8554 SeValidSecurityDescriptor(
       
  8555   /*IN*/ ULONG  Length,
       
  8556   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);
       
  8557 
       
  8558 
       
  8559 
       
  8560 /** NtXxx routines **/
       
  8561 
       
  8562 NTOSAPI
       
  8563 NTSTATUS
       
  8564 DDKAPI
       
  8565 NtOpenProcess(
       
  8566   /*OUT*/ PHANDLE  ProcessHandle,
       
  8567   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8568   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  8569   /*IN*/ PCLIENT_ID  ClientId  /*OPTIONAL*/);
       
  8570 
       
  8571 NTOSAPI
       
  8572 NTSTATUS
       
  8573 DDKAPI
       
  8574 NtQueryInformationProcess(
       
  8575   /*IN*/ HANDLE  ProcessHandle,
       
  8576   /*IN*/ PROCESSINFOCLASS  ProcessInformationClass,
       
  8577   /*OUT*/ PVOID  ProcessInformation,
       
  8578   /*IN*/ ULONG  ProcessInformationLength,
       
  8579   /*OUT*/ PULONG  ReturnLength /*OPTIONAL*/);
       
  8580 
       
  8581 
       
  8582 
       
  8583 /** NtXxx and ZwXxx routines **/
       
  8584 
       
  8585 NTOSAPI
       
  8586 NTSTATUS
       
  8587 DDKAPI
       
  8588 ZwCancelTimer(
       
  8589   /*IN*/ HANDLE  TimerHandle,
       
  8590   /*OUT*/ PBOOLEAN  CurrentState  /*OPTIONAL*/);
       
  8591 
       
  8592 NTOSAPI
       
  8593 NTSTATUS
       
  8594 DDKAPI
       
  8595 NtClose(
       
  8596   /*IN*/ HANDLE  Handle);
       
  8597 
       
  8598 NTOSAPI
       
  8599 NTSTATUS
       
  8600 DDKAPI
       
  8601 ZwClose(
       
  8602   /*IN*/ HANDLE  Handle);
       
  8603 
       
  8604 NTOSAPI
       
  8605 NTSTATUS
       
  8606 DDKAPI
       
  8607 ZwCreateDirectoryObject(
       
  8608   /*OUT*/ PHANDLE  DirectoryHandle,
       
  8609   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8610   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
       
  8611 
       
  8612 NTOSAPI
       
  8613 NTSTATUS
       
  8614 DDKAPI
       
  8615 NtCreateEvent(
       
  8616   /*OUT*/ PHANDLE  EventHandle,
       
  8617   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8618   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  8619   /*IN*/ BOOLEAN  ManualReset,
       
  8620   /*IN*/ BOOLEAN  InitialState);
       
  8621 
       
  8622 NTOSAPI
       
  8623 NTSTATUS
       
  8624 DDKAPI
       
  8625 ZwCreateEvent(
       
  8626   /*OUT*/ PHANDLE  EventHandle,
       
  8627   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8628   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  8629   /*IN*/ BOOLEAN  ManualReset,
       
  8630   /*IN*/ BOOLEAN  InitialState);
       
  8631 
       
  8632 NTOSAPI
       
  8633 NTSTATUS
       
  8634 DDKAPI
       
  8635 ZwCreateFile(
       
  8636   /*OUT*/ PHANDLE  FileHandle,
       
  8637   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8638   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  8639   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  8640   /*IN*/ PLARGE_INTEGER  AllocationSize  /*OPTIONAL*/,
       
  8641   /*IN*/ ULONG  FileAttributes,
       
  8642   /*IN*/ ULONG  ShareAccess,
       
  8643   /*IN*/ ULONG  CreateDisposition,
       
  8644   /*IN*/ ULONG  CreateOptions,
       
  8645   /*IN*/ PVOID  EaBuffer  /*OPTIONAL*/,
       
  8646   /*IN*/ ULONG  EaLength);
       
  8647 
       
  8648 NTOSAPI
       
  8649 NTSTATUS
       
  8650 DDKAPI
       
  8651 ZwCreateKey(
       
  8652   /*OUT*/ PHANDLE  KeyHandle,
       
  8653   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8654   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  8655   /*IN*/ ULONG  TitleIndex,
       
  8656   /*IN*/ PUNICODE_STRING  Class  /*OPTIONAL*/,
       
  8657   /*IN*/ ULONG  CreateOptions,
       
  8658   /*OUT*/ PULONG  Disposition  /*OPTIONAL*/);
       
  8659 
       
  8660 NTOSAPI
       
  8661 NTSTATUS
       
  8662 DDKAPI
       
  8663 ZwCreateTimer(
       
  8664   /*OUT*/ PHANDLE  TimerHandle,
       
  8665   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8666   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
       
  8667   /*IN*/ TIMER_TYPE  TimerType);
       
  8668 
       
  8669 NTOSAPI
       
  8670 NTSTATUS
       
  8671 DDKAPI
       
  8672 ZwDeleteKey(
       
  8673   /*IN*/ HANDLE  KeyHandle);
       
  8674 
       
  8675 NTOSAPI
       
  8676 NTSTATUS
       
  8677 DDKAPI
       
  8678 ZwDeleteValueKey(
       
  8679   /*IN*/ HANDLE  KeyHandle,
       
  8680   /*IN*/ PUNICODE_STRING  ValueName);
       
  8681 
       
  8682 NTOSAPI
       
  8683 NTSTATUS
       
  8684 DDKAPI
       
  8685 NtDeviceIoControlFile(
       
  8686   /*IN*/ HANDLE  DeviceHandle,
       
  8687   /*IN*/ HANDLE  Event  /*OPTIONAL*/, 
       
  8688   /*IN*/ PIO_APC_ROUTINE  UserApcRoutine  /*OPTIONAL*/, 
       
  8689   /*IN*/ PVOID  UserApcContext  /*OPTIONAL*/, 
       
  8690   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock, 
       
  8691   /*IN*/ ULONG  IoControlCode,
       
  8692   /*IN*/ PVOID  InputBuffer, 
       
  8693   /*IN*/ ULONG  InputBufferSize,
       
  8694   /*OUT*/ PVOID  OutputBuffer,
       
  8695   /*IN*/ ULONG  OutputBufferSize);
       
  8696 
       
  8697 NTOSAPI
       
  8698 NTSTATUS
       
  8699 DDKAPI
       
  8700 ZwDeviceIoControlFile(
       
  8701   /*IN*/ HANDLE  DeviceHandle,
       
  8702   /*IN*/ HANDLE  Event  /*OPTIONAL*/, 
       
  8703   /*IN*/ PIO_APC_ROUTINE  UserApcRoutine  /*OPTIONAL*/, 
       
  8704   /*IN*/ PVOID  UserApcContext  /*OPTIONAL*/, 
       
  8705   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock, 
       
  8706   /*IN*/ ULONG  IoControlCode,
       
  8707   /*IN*/ PVOID  InputBuffer, 
       
  8708   /*IN*/ ULONG  InputBufferSize,
       
  8709   /*OUT*/ PVOID  OutputBuffer,
       
  8710   /*IN*/ ULONG  OutputBufferSize);
       
  8711 
       
  8712 NTOSAPI
       
  8713 NTSTATUS
       
  8714 DDKAPI
       
  8715 ZwEnumerateKey(
       
  8716   /*IN*/ HANDLE  KeyHandle,
       
  8717   /*IN*/ ULONG  Index,
       
  8718   /*IN*/ KEY_INFORMATION_CLASS  KeyInformationClass,
       
  8719   /*OUT*/ PVOID  KeyInformation,
       
  8720   /*IN*/ ULONG  Length,
       
  8721   /*OUT*/ PULONG  ResultLength);
       
  8722 
       
  8723 NTOSAPI
       
  8724 NTSTATUS
       
  8725 DDKAPI
       
  8726 ZwEnumerateValueKey(
       
  8727   /*IN*/ HANDLE  KeyHandle,
       
  8728   /*IN*/ ULONG  Index,
       
  8729   /*IN*/ KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
       
  8730   /*OUT*/ PVOID  KeyValueInformation,
       
  8731   /*IN*/ ULONG  Length,
       
  8732   /*OUT*/ PULONG  ResultLength);
       
  8733 
       
  8734 NTOSAPI
       
  8735 NTSTATUS
       
  8736 DDKAPI
       
  8737 ZwFlushKey(
       
  8738   /*IN*/ HANDLE  KeyHandle);
       
  8739 
       
  8740 NTOSAPI
       
  8741 NTSTATUS
       
  8742 DDKAPI
       
  8743 ZwMakeTemporaryObject(
       
  8744   /*IN*/ HANDLE  Handle);
       
  8745 
       
  8746 NTOSAPI
       
  8747 NTSTATUS
       
  8748 DDKAPI
       
  8749 NtMapViewOfSection(
       
  8750   /*IN*/ HANDLE  SectionHandle,
       
  8751   /*IN*/ HANDLE  ProcessHandle,
       
  8752   /*IN OUT*/ PVOID  *BaseAddress,
       
  8753   /*IN*/ ULONG  ZeroBits,
       
  8754   /*IN*/ ULONG  CommitSize,
       
  8755   /*IN OUT*/ PLARGE_INTEGER  SectionOffset  /*OPTIONAL*/,
       
  8756   /*IN OUT*/ PSIZE_T  ViewSize,
       
  8757   /*IN*/ SECTION_INHERIT  InheritDisposition,
       
  8758   /*IN*/ ULONG  AllocationType,
       
  8759   /*IN*/ ULONG  Protect);
       
  8760 
       
  8761 NTOSAPI
       
  8762 NTSTATUS
       
  8763 DDKAPI
       
  8764 ZwMapViewOfSection(
       
  8765   /*IN*/ HANDLE  SectionHandle,
       
  8766   /*IN*/ HANDLE  ProcessHandle,
       
  8767   /*IN OUT*/ PVOID  *BaseAddress,
       
  8768   /*IN*/ ULONG  ZeroBits,
       
  8769   /*IN*/ ULONG  CommitSize,
       
  8770   /*IN OUT*/ PLARGE_INTEGER  SectionOffset  /*OPTIONAL*/,
       
  8771   /*IN OUT*/ PSIZE_T  ViewSize,
       
  8772   /*IN*/ SECTION_INHERIT  InheritDisposition,
       
  8773   /*IN*/ ULONG  AllocationType,
       
  8774   /*IN*/ ULONG  Protect);
       
  8775 
       
  8776 NTOSAPI
       
  8777 NTSTATUS
       
  8778 DDKAPI
       
  8779 NtOpenFile(
       
  8780   /*OUT*/ PHANDLE  FileHandle,
       
  8781   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8782   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  8783   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  8784   /*IN*/ ULONG  ShareAccess,
       
  8785   /*IN*/ ULONG  OpenOptions);
       
  8786 
       
  8787 NTOSAPI
       
  8788 NTSTATUS
       
  8789 DDKAPI
       
  8790 ZwOpenFile(
       
  8791   /*OUT*/ PHANDLE  FileHandle,
       
  8792   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8793   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
       
  8794   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  8795   /*IN*/ ULONG  ShareAccess,
       
  8796   /*IN*/ ULONG  OpenOptions);
       
  8797 
       
  8798 NTOSAPI
       
  8799 NTSTATUS
       
  8800 DDKAPI
       
  8801 ZwOpenKey(
       
  8802   /*OUT*/ PHANDLE  KeyHandle,
       
  8803   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8804   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
       
  8805 
       
  8806 NTOSAPI
       
  8807 NTSTATUS
       
  8808 DDKAPI
       
  8809 ZwOpenSection(
       
  8810   /*OUT*/ PHANDLE  SectionHandle,
       
  8811   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8812   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
       
  8813 
       
  8814 NTOSAPI
       
  8815 NTSTATUS
       
  8816 DDKAPI
       
  8817 ZwOpenSymbolicLinkObject(
       
  8818   /*OUT*/ PHANDLE  LinkHandle,
       
  8819   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8820   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
       
  8821 
       
  8822 NTOSAPI
       
  8823 NTSTATUS
       
  8824 DDKAPI
       
  8825 ZwOpenTimer(
       
  8826   /*OUT*/ PHANDLE  TimerHandle,
       
  8827   /*IN*/ ACCESS_MASK  DesiredAccess,
       
  8828   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
       
  8829 
       
  8830 NTOSAPI
       
  8831 NTSTATUS
       
  8832 DDKAPI
       
  8833 ZwQueryInformationFile(
       
  8834   /*IN*/ HANDLE  FileHandle,
       
  8835   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  8836   /*OUT*/ PVOID  FileInformation,
       
  8837   /*IN*/ ULONG  Length,
       
  8838   /*IN*/ FILE_INFORMATION_CLASS  FileInformationClass);
       
  8839 
       
  8840 NTOSAPI
       
  8841 NTSTATUS
       
  8842 DDKAPI
       
  8843 ZwQueryKey(
       
  8844   /*IN*/ HANDLE  KeyHandle,
       
  8845   /*IN*/ KEY_INFORMATION_CLASS  KeyInformationClass,
       
  8846   /*OUT*/ PVOID  KeyInformation,
       
  8847   /*IN*/ ULONG  Length,
       
  8848   /*OUT*/ PULONG  ResultLength);
       
  8849 
       
  8850 NTOSAPI
       
  8851 NTSTATUS
       
  8852 DDKAPI
       
  8853 ZwQuerySymbolicLinkObject(
       
  8854   /*IN*/ HANDLE  LinkHandle,
       
  8855   /*IN OUT*/ PUNICODE_STRING  LinkTarget,
       
  8856   /*OUT*/ PULONG  ReturnedLength  /*OPTIONAL*/);
       
  8857 
       
  8858 NTOSAPI
       
  8859 NTSTATUS
       
  8860 DDKAPI
       
  8861 ZwQueryValueKey(
       
  8862   /*IN*/ HANDLE  KeyHandle,
       
  8863   /*IN*/ PUNICODE_STRING  ValueName,
       
  8864   /*IN*/ KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
       
  8865   /*OUT*/ PVOID  KeyValueInformation,
       
  8866   /*IN*/ ULONG  Length,
       
  8867   /*OUT*/ PULONG  ResultLength);
       
  8868 
       
  8869 NTOSAPI
       
  8870 NTSTATUS
       
  8871 DDKAPI
       
  8872 NtReadFile(
       
  8873   /*IN*/ HANDLE  FileHandle,
       
  8874   /*IN*/ HANDLE  Event  /*OPTIONAL*/,
       
  8875   /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
       
  8876   /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
       
  8877   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  8878   /*OUT*/ PVOID  Buffer,
       
  8879   /*IN*/ ULONG  Length,
       
  8880   /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
       
  8881   /*IN*/ PULONG  Key  /*OPTIONAL*/);
       
  8882 
       
  8883 NTOSAPI
       
  8884 NTSTATUS
       
  8885 DDKAPI
       
  8886 ZwReadFile(
       
  8887   /*IN*/ HANDLE  FileHandle,
       
  8888   /*IN*/ HANDLE  Event  /*OPTIONAL*/,
       
  8889   /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
       
  8890   /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
       
  8891   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  8892   /*OUT*/ PVOID  Buffer,
       
  8893   /*IN*/ ULONG  Length,
       
  8894   /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
       
  8895   /*IN*/ PULONG  Key  /*OPTIONAL*/);
       
  8896 
       
  8897 NTOSAPI
       
  8898 NTSTATUS
       
  8899 DDKAPI
       
  8900 NtSetEvent(
       
  8901   /*IN*/ HANDLE  EventHandle,
       
  8902   /*IN*/ PULONG  NumberOfThreadsReleased);
       
  8903 
       
  8904 NTOSAPI
       
  8905 NTSTATUS
       
  8906 DDKAPI
       
  8907 ZwSetEvent(
       
  8908   /*IN*/ HANDLE  EventHandle,
       
  8909   /*IN*/ PULONG  NumberOfThreadsReleased);
       
  8910 
       
  8911 NTOSAPI
       
  8912 NTSTATUS
       
  8913 DDKAPI
       
  8914 ZwSetInformationFile(
       
  8915   /*IN*/ HANDLE  FileHandle,
       
  8916   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  8917   /*IN*/ PVOID  FileInformation,
       
  8918   /*IN*/ ULONG  Length,
       
  8919   /*IN*/ FILE_INFORMATION_CLASS  FileInformationClass);
       
  8920 
       
  8921 NTOSAPI
       
  8922 NTSTATUS
       
  8923 DDKAPI
       
  8924 ZwSetInformationThread(
       
  8925   /*IN*/ HANDLE  ThreadHandle,
       
  8926   /*IN*/ THREADINFOCLASS  ThreadInformationClass,
       
  8927   /*IN*/ PVOID  ThreadInformation,
       
  8928   /*IN*/ ULONG  ThreadInformationLength);
       
  8929 
       
  8930 NTOSAPI
       
  8931 NTSTATUS
       
  8932 DDKAPI
       
  8933 ZwSetTimer(
       
  8934   /*IN*/ HANDLE  TimerHandle,
       
  8935   /*IN*/ PLARGE_INTEGER  DueTime,
       
  8936   /*IN*/ PTIMER_APC_ROUTINE  TimerApcRoutine  /*OPTIONAL*/,
       
  8937   /*IN*/ PVOID  TimerContext  /*OPTIONAL*/,
       
  8938   /*IN*/ BOOLEAN  WakeTimer,
       
  8939   /*IN*/ LONG  Period  /*OPTIONAL*/,
       
  8940   /*OUT*/ PBOOLEAN  PreviousState  /*OPTIONAL*/);
       
  8941 
       
  8942 NTOSAPI
       
  8943 NTSTATUS
       
  8944 DDKAPI
       
  8945 ZwSetValueKey(
       
  8946   /*IN*/ HANDLE  KeyHandle,
       
  8947   /*IN*/ PUNICODE_STRING  ValueName,
       
  8948   /*IN*/ ULONG  TitleIndex  /*OPTIONAL*/,
       
  8949   /*IN*/ ULONG  Type,
       
  8950   /*IN*/ PVOID  Data,
       
  8951   /*IN*/ ULONG  DataSize);
       
  8952 
       
  8953 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
       
  8954 #define AT_EXTENDABLE_FILE                0x00002000
       
  8955 #define SEC_NO_CHANGE                     0x00400000
       
  8956 #define AT_RESERVED                       0x20000000
       
  8957 #define AT_ROUND_TO_PAGE                  0x40000000
       
  8958 
       
  8959 NTOSAPI
       
  8960 NTSTATUS
       
  8961 DDKAPI
       
  8962 NtUnmapViewOfSection(
       
  8963   /*IN*/ HANDLE  ProcessHandle,
       
  8964   /*IN*/ PVOID  BaseAddress);
       
  8965 
       
  8966 NTOSAPI
       
  8967 NTSTATUS
       
  8968 DDKAPI
       
  8969 ZwUnmapViewOfSection(
       
  8970   /*IN*/ HANDLE  ProcessHandle,
       
  8971   /*IN*/ PVOID  BaseAddress);
       
  8972 
       
  8973 NTOSAPI
       
  8974 NTSTATUS
       
  8975 DDKAPI
       
  8976 NtWaitForSingleObject(
       
  8977   /*IN*/ HANDLE  Object,
       
  8978   /*IN*/ BOOLEAN  Alertable,
       
  8979   /*IN*/ PLARGE_INTEGER  Time);
       
  8980 
       
  8981 NTOSAPI
       
  8982 NTSTATUS
       
  8983 DDKAPI
       
  8984 ZwWaitForSingleObject(
       
  8985   /*IN*/ HANDLE  Object,
       
  8986   /*IN*/ BOOLEAN  Alertable,
       
  8987   /*IN*/ PLARGE_INTEGER  Time);
       
  8988 
       
  8989 NTOSAPI
       
  8990 NTSTATUS
       
  8991 DDKAPI
       
  8992 NtWriteFile(
       
  8993   /*IN*/ HANDLE  FileHandle,
       
  8994   /*IN*/ HANDLE  Event  /*OPTIONAL*/,
       
  8995   /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
       
  8996   /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
       
  8997   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  8998   /*IN*/ PVOID  Buffer,
       
  8999   /*IN*/ ULONG  Length,
       
  9000   /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
       
  9001   /*IN*/ PULONG  Key  /*OPTIONAL*/);
       
  9002 
       
  9003 NTOSAPI
       
  9004 NTSTATUS
       
  9005 DDKAPI
       
  9006 ZwWriteFile(
       
  9007   /*IN*/ HANDLE  FileHandle,
       
  9008   /*IN*/ HANDLE  Event  /*OPTIONAL*/,
       
  9009   /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
       
  9010   /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
       
  9011   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
       
  9012   /*IN*/ PVOID  Buffer,
       
  9013   /*IN*/ ULONG  Length,
       
  9014   /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
       
  9015   /*IN*/ PULONG  Key  /*OPTIONAL*/);
       
  9016 
       
  9017 
       
  9018 
       
  9019 /** Power management support routines **/
       
  9020 
       
  9021 NTOSAPI
       
  9022 NTSTATUS
       
  9023 DDKAPI
       
  9024 PoCallDriver(
       
  9025   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  9026   /*IN OUT*/ PIRP  Irp);
       
  9027 
       
  9028 NTOSAPI
       
  9029 PULONG
       
  9030 DDKAPI
       
  9031 PoRegisterDeviceForIdleDetection(
       
  9032   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  9033   /*IN*/ ULONG  ConservationIdleTime,
       
  9034   /*IN*/ ULONG  PerformanceIdleTime,
       
  9035   /*IN*/ DEVICE_POWER_STATE  State);
       
  9036 
       
  9037 NTOSAPI
       
  9038 PVOID
       
  9039 DDKAPI
       
  9040 PoRegisterSystemState(
       
  9041   /*IN*/ PVOID  StateHandle,
       
  9042   /*IN*/ EXECUTION_STATE  Flags);
       
  9043 
       
  9044 NTOSAPI
       
  9045 NTSTATUS
       
  9046 DDKAPI
       
  9047 PoRequestPowerIrp(
       
  9048   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  9049   /*IN*/ UCHAR  MinorFunction,  
       
  9050   /*IN*/ POWER_STATE  PowerState,
       
  9051   /*IN*/ PREQUEST_POWER_COMPLETE  CompletionFunction,
       
  9052   /*IN*/ PVOID  Context,
       
  9053   /*OUT*/ PIRP  *Irp /*OPTIONAL*/);
       
  9054 
       
  9055 NTOSAPI
       
  9056 NTSTATUS
       
  9057 DDKAPI
       
  9058 PoRequestShutdownEvent(
       
  9059   /*OUT*/ PVOID  *Event);
       
  9060 
       
  9061 NTOSAPI
       
  9062 VOID
       
  9063 DDKAPI
       
  9064 PoSetDeviceBusy(
       
  9065   PULONG  IdlePointer); 
       
  9066 
       
  9067 NTOSAPI
       
  9068 POWER_STATE
       
  9069 DDKAPI
       
  9070 PoSetPowerState(
       
  9071   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  9072   /*IN*/ POWER_STATE_TYPE  Type,
       
  9073   /*IN*/ POWER_STATE  State);
       
  9074 
       
  9075 NTOSAPI
       
  9076 VOID
       
  9077 DDKAPI
       
  9078 PoSetSystemState(
       
  9079   /*IN*/ EXECUTION_STATE  Flags);
       
  9080 
       
  9081 NTOSAPI
       
  9082 VOID
       
  9083 DDKAPI
       
  9084 PoStartNextPowerIrp(
       
  9085   /*IN*/ PIRP  Irp);
       
  9086 
       
  9087 NTOSAPI
       
  9088 VOID
       
  9089 DDKAPI
       
  9090 PoUnregisterSystemState(
       
  9091   /*IN*/ PVOID  StateHandle);
       
  9092 
       
  9093 
       
  9094 
       
  9095 /** WMI library support routines **/
       
  9096 
       
  9097 NTOSAPI
       
  9098 NTSTATUS
       
  9099 DDKAPI
       
  9100 WmiCompleteRequest(
       
  9101   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  9102   /*IN*/ PIRP  Irp,
       
  9103   /*IN*/ NTSTATUS  Status,
       
  9104   /*IN*/ ULONG  BufferUsed,
       
  9105   /*IN*/ CCHAR  PriorityBoost);
       
  9106 
       
  9107 NTOSAPI
       
  9108 NTSTATUS
       
  9109 DDKAPI
       
  9110 WmiFireEvent(
       
  9111   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  9112   /*IN*/ LPGUID  Guid, 
       
  9113   /*IN*/ ULONG  InstanceIndex,
       
  9114   /*IN*/ ULONG  EventDataSize,
       
  9115   /*IN*/ PVOID  EventData); 
       
  9116 
       
  9117 NTOSAPI
       
  9118 NTSTATUS
       
  9119 DDKAPI
       
  9120 WmiQueryTraceInformation(
       
  9121   /*IN*/ TRACE_INFORMATION_CLASS  TraceInformationClass,
       
  9122   /*OUT*/ PVOID  TraceInformation,
       
  9123   /*IN*/ ULONG  TraceInformationLength,
       
  9124   /*OUT*/ PULONG  RequiredLength /*OPTIONAL*/,
       
  9125   /*IN*/ PVOID  Buffer /*OPTIONAL*/);
       
  9126 
       
  9127 NTOSAPI
       
  9128 NTSTATUS
       
  9129 DDKAPI
       
  9130 WmiSystemControl(
       
  9131   /*IN*/ PWMILIB_CONTEXT  WmiLibInfo,
       
  9132   /*IN*/ PDEVICE_OBJECT  DeviceObject,
       
  9133   /*IN*/ PIRP  Irp,
       
  9134   /*OUT*/ PSYSCTL_IRP_DISPOSITION  IrpDisposition);
       
  9135 
       
  9136 NTOSAPI
       
  9137 NTSTATUS
       
  9138 DDKCDECLAPI
       
  9139 WmiTraceMessage(
       
  9140   /*IN*/ TRACEHANDLE  LoggerHandle,
       
  9141   /*IN*/ ULONG  MessageFlags,
       
  9142   /*IN*/ LPGUID  MessageGuid,
       
  9143   /*IN*/ USHORT  MessageNumber,
       
  9144   /*IN*/ ...);
       
  9145 
       
  9146 #if 0
       
  9147 /* FIXME: Get va_list from where? */
       
  9148 NTOSAPI
       
  9149 NTSTATUS
       
  9150 DDKCDECLAPI
       
  9151 WmiTraceMessageVa(
       
  9152   /*IN*/ TRACEHANDLE  LoggerHandle,
       
  9153   /*IN*/ ULONG  MessageFlags,
       
  9154   /*IN*/ LPGUID  MessageGuid,
       
  9155   /*IN*/ USHORT  MessageNumber,
       
  9156   /*IN*/ va_list  MessageArgList);
       
  9157 #endif
       
  9158 
       
  9159 
       
  9160 /** Kernel debugger routines **/
       
  9161 
       
  9162 NTOSAPI
       
  9163 VOID
       
  9164 DDKAPI
       
  9165 KdDisableDebugger(
       
  9166   VOID);
       
  9167 
       
  9168 NTOSAPI
       
  9169 VOID
       
  9170 DDKAPI
       
  9171 KdEnableDebugger(
       
  9172   VOID);
       
  9173 
       
  9174 NTOSAPI
       
  9175 VOID
       
  9176 DDKAPI
       
  9177 DbgBreakPoint(
       
  9178   VOID);
       
  9179 
       
  9180 NTOSAPI
       
  9181 VOID
       
  9182 DDKAPI
       
  9183 DbgBreakPointWithStatus(
       
  9184   /*IN*/ ULONG  Status);
       
  9185 
       
  9186 NTOSAPI
       
  9187 ULONG
       
  9188 DDKCDECLAPI
       
  9189 DbgPrint(
       
  9190   /*IN*/ PCH  Format,
       
  9191   /*IN*/ ...);
       
  9192 
       
  9193 NTOSAPI
       
  9194 ULONG
       
  9195 DDKCDECLAPI
       
  9196 DbgPrintEx(
       
  9197   /*IN*/ ULONG  ComponentId,
       
  9198   /*IN*/ ULONG  Level,
       
  9199   /*IN*/ PCH  Format,
       
  9200   /*IN*/ ...);
       
  9201 
       
  9202 NTOSAPI
       
  9203 ULONG
       
  9204 DDKCDECLAPI
       
  9205 DbgPrintReturnControlC(
       
  9206   /*IN*/ PCH  Format,
       
  9207   /*IN*/ ...);
       
  9208 
       
  9209 NTOSAPI
       
  9210 NTSTATUS
       
  9211 DDKAPI
       
  9212 DbgQueryDebugFilterState(
       
  9213   /*IN*/ ULONG  ComponentId,
       
  9214   /*IN*/ ULONG  Level);
       
  9215 
       
  9216 NTOSAPI
       
  9217 NTSTATUS
       
  9218 DDKAPI
       
  9219 DbgSetDebugFilterState(
       
  9220   /*IN*/ ULONG  ComponentId,
       
  9221   /*IN*/ ULONG  Level,
       
  9222   /*IN*/ BOOLEAN  State);
       
  9223 
       
  9224 #ifdef DBG
       
  9225 
       
  9226 #define KdPrint(_x_) DbgPrint _x_
       
  9227 #define KdPrintEx(_x_) DbgPrintEx _x_
       
  9228 #define KdBreakPoint() DbgBreakPoint()
       
  9229 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
       
  9230 
       
  9231 #else /* !DBG */
       
  9232 
       
  9233 #define KdPrint(_x_)
       
  9234 #define KdPrintEx(_x_)
       
  9235 #define KdBreakPoint()
       
  9236 #define KdBreakPointWithStatus(s)
       
  9237 
       
  9238 #endif /* !DBG */
       
  9239 
       
  9240 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
       
  9241 extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
       
  9242 #define KD_DEBUGGER_ENABLED     *KdDebuggerEnabled
       
  9243 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
       
  9244 
       
  9245 #ifdef __cplusplus
       
  9246 }
       
  9247 #endif
       
  9248 
       
  9249 #endif /* __WINDDK_H */