Naveen Neel / shedskin
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers winddk.h Source File

winddk.h

00001 /*
00002  * winddk.h
00003  *
00004  * Windows Device Driver Kit
00005  *
00006  * This file is part of the w32api package.
00007  *
00008  * Contributors:
00009  *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
00010  *
00011  * THIS SOFTWARE IS NOT COPYRIGHTED
00012  *
00013  * This source code is offered for use in the public domain. You may
00014  * use, modify or distribute it freely.
00015  *
00016  * This code is distributed in the hope that it will be useful but
00017  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
00018  * DISCLAIMED. This includes but is not limited to warranties of
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00020  *
00021  */
00022 
00023 #ifndef __WINDDK_H
00024 #define __WINDDK_H
00025 
00026 #if __GNUC__ >= 3
00027 #pragma GCC system_header
00028 #endif
00029 
00030 #ifdef __cplusplus
00031 extern "C" {
00032 #endif
00033 
00034 /*
00035 ** Definitions specific to this Device Driver Kit
00036 */
00037 #define DDKAPI __stdcall
00038 #define DDKFASTAPI __fastcall
00039 #define DDKCDECLAPI __cdecl
00040 
00041 #if defined(_NTOSKRNL_)
00042 #ifndef NTOSAPI
00043 #define NTOSAPI DECL_EXPORT
00044 #endif
00045 #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
00046 #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
00047 #else
00048 #ifndef NTOSAPI
00049 #define NTOSAPI DECL_IMPORT
00050 #endif
00051 #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
00052 #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
00053 #endif
00054 
00055 /* Pseudo modifiers for parameters 
00056    We don't use these unnecessary defines in the w32api headers. Define
00057    them by default since that is what people expect, but allow users
00058    to avoid the pollution.  */
00059 #ifndef _NO_W32_PSEUDO_MODIFIERS
00060 #define IN
00061 #define OUT
00062 #define OPTIONAL
00063 #define UNALLIGNED
00064 #endif
00065 
00066 #define CONST const
00067 #define VOLATILE volatile
00068 
00069 #define RESTRICTED_POINTER
00070 #define POINTER_ALIGNMENT
00071 
00072 #ifdef NONAMELESSUNION
00073 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
00074 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
00075 #else
00076 # define _DDK_DUMMYUNION_MEMBER(name) name
00077 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
00078 #endif
00079 
00080 /*
00081 ** Forward declarations
00082 */
00083 
00084 struct _IRP;
00085 struct _MDL;
00086 struct _KAPC;
00087 struct _KDPC;
00088 struct _KPCR;
00089 struct _KPRCB;
00090 struct _KTSS;
00091 struct _FILE_OBJECT;
00092 struct _DMA_ADAPTER;
00093 struct _DEVICE_OBJECT;
00094 struct _DRIVER_OBJECT;
00095 struct _SECTION_OBJECT;
00096 struct _IO_STATUS_BLOCK;
00097 struct _DEVICE_DESCRIPTION;
00098 struct _SCATTER_GATHER_LIST;
00099 
00100 DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT)
00101 DECLARE_INTERNAL_OBJECT(DMA_ADAPTER)
00102 DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK)
00103 DECLARE_INTERNAL_OBJECT(SECTION_OBJECT)
00104 
00105 #if 1
00106 /* FIXME: Unknown definitions */
00107 struct _SET_PARTITION_INFORMATION_EX;
00108 typedef ULONG WAIT_TYPE;
00109 typedef HANDLE TRACEHANDLE;
00110 typedef PVOID PWMILIB_CONTEXT;
00111 typedef PVOID PSYSCTL_IRP_DISPOSITION;
00112 typedef ULONG LOGICAL;
00113 #endif
00114 
00115 /*
00116 ** Routines specific to this DDK
00117 */
00118 
00119 #define TAG(_a, _b, _c, _d) (ULONG) \
00120     (((_a) << 0) + ((_b) << 8) + ((_c) << 16) + ((_d) << 24))
00121 
00122 #ifdef __GNUC__
00123 static __inline struct _KPCR * KeGetCurrentKPCR(
00124   VOID)
00125 {
00126   ULONG Value;
00127 
00128   __asm__ __volatile__ (
00129 #if (__GNUC__ >= 3)
00130     /* support -masm=intel */
00131     "mov{l} {%%fs:0x18, %0|%0, %%fs:0x18}\n\t"
00132 #else
00133     "movl %%fs:0x18, %0\n\t"
00134 #endif
00135      : "=r" (Value)
00136      : /* no inputs */
00137   );
00138   return (struct _KPCR *) Value;
00139 }
00140 
00141 #elif defined( __WATCOMC__ )
00142 
00143 extern struct _KPCR * KeGetCurrentKPCR( void );
00144 #pragma aux KeGetCurrentKPCR = \
00145   "mov eax, fs:[0x18]" \
00146   value [ eax ];
00147 
00148 #endif
00149 
00150 /*
00151 ** Simple structures
00152 */
00153 
00154 typedef LONG KPRIORITY;
00155 typedef UCHAR KIRQL, *PKIRQL;
00156 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
00157 typedef ULONG_PTR KAFFINITY, *PKAFFINITY;
00158 typedef CCHAR KPROCESSOR_MODE;
00159 
00160 typedef enum _MODE {
00161   KernelMode,
00162   UserMode,
00163   MaximumMode
00164 } MODE;
00165 
00166 
00167 /* Structures not exposed to drivers */
00168 typedef struct _IO_TIMER *PIO_TIMER;
00169 typedef struct _EPROCESS *PEPROCESS;
00170 typedef struct _ETHREAD *PETHREAD;
00171 typedef struct _KINTERRUPT *PKINTERRUPT;
00172 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
00173 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
00174 typedef struct _COMPRESSED_DATA_INFO *PCOMPRESSED_DATA_INFO;
00175 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
00176 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
00177 typedef struct _DRIVE_LAYOUT_INFORMATION *PDRIVE_LAYOUT_INFORMATION;
00178 typedef struct _DRIVE_LAYOUT_INFORMATION_EX *PDRIVE_LAYOUT_INFORMATION_EX;
00179 
00180 /* Constants */
00181 #define MAXIMUM_PROCESSORS                32
00182 
00183 #define MAXIMUM_WAIT_OBJECTS              64
00184 
00185 #define METHOD_BUFFERED                   0
00186 #define METHOD_IN_DIRECT                  1
00187 #define METHOD_OUT_DIRECT                 2
00188 #define METHOD_NEITHER                    3
00189 
00190 #define LOW_PRIORITY                      0
00191 #define LOW_REALTIME_PRIORITY             16
00192 #define HIGH_PRIORITY                     31
00193 #define MAXIMUM_PRIORITY                  32
00194 
00195 #define FILE_SUPERSEDED                   0x00000000
00196 #define FILE_OPENED                       0x00000001
00197 #define FILE_CREATED                      0x00000002
00198 #define FILE_OVERWRITTEN                  0x00000003
00199 #define FILE_EXISTS                       0x00000004
00200 #define FILE_DOES_NOT_EXIST               0x00000005
00201 
00202 /* also in winnt.h */
00203 #define FILE_LIST_DIRECTORY               0x00000001
00204 #define FILE_READ_DATA                    0x00000001
00205 #define FILE_ADD_FILE                     0x00000002
00206 #define FILE_WRITE_DATA                   0x00000002
00207 #define FILE_ADD_SUBDIRECTORY             0x00000004
00208 #define FILE_APPEND_DATA                  0x00000004
00209 #define FILE_CREATE_PIPE_INSTANCE         0x00000004
00210 #define FILE_READ_EA                      0x00000008
00211 #define FILE_WRITE_EA                     0x00000010
00212 #define FILE_EXECUTE                      0x00000020
00213 #define FILE_TRAVERSE                     0x00000020
00214 #define FILE_DELETE_CHILD                 0x00000040
00215 #define FILE_READ_ATTRIBUTES              0x00000080
00216 #define FILE_WRITE_ATTRIBUTES             0x00000100
00217 
00218 #define FILE_SHARE_READ                   0x00000001
00219 #define FILE_SHARE_WRITE                  0x00000002
00220 #define FILE_SHARE_DELETE                 0x00000004
00221 #define FILE_SHARE_VALID_FLAGS            0x00000007
00222 
00223 #define FILE_ATTRIBUTE_READONLY           0x00000001
00224 #define FILE_ATTRIBUTE_HIDDEN             0x00000002
00225 #define FILE_ATTRIBUTE_SYSTEM             0x00000004
00226 #define FILE_ATTRIBUTE_DIRECTORY          0x00000010
00227 #define FILE_ATTRIBUTE_ARCHIVE            0x00000020
00228 #define FILE_ATTRIBUTE_DEVICE             0x00000040
00229 #define FILE_ATTRIBUTE_NORMAL             0x00000080
00230 #define FILE_ATTRIBUTE_TEMPORARY          0x00000100
00231 #define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
00232 #define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
00233 #define FILE_ATTRIBUTE_COMPRESSED         0x00000800
00234 #define FILE_ATTRIBUTE_OFFLINE            0x00001000
00235 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
00236 #define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
00237 #define FILE_ATTRIBUTE_VIRTUAL            0x00010000
00238 
00239 #define FILE_ATTRIBUTE_VALID_FLAGS        0x00017fb7
00240 #define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
00241 
00242 #define FILE_COPY_STRUCTURED_STORAGE      0x00000041
00243 #define FILE_STRUCTURED_STORAGE           0x00000441
00244 
00245 #define FILE_VALID_OPTION_FLAGS           0x00ffffff
00246 #define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
00247 #define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
00248 #define FILE_VALID_SET_FLAGS              0x00000036
00249 
00250 #define FILE_SUPERSEDE                    0x00000000
00251 #define FILE_OPEN                         0x00000001
00252 #define FILE_CREATE                       0x00000002
00253 #define FILE_OPEN_IF                      0x00000003
00254 #define FILE_OVERWRITE                    0x00000004
00255 #define FILE_OVERWRITE_IF                 0x00000005
00256 #define FILE_MAXIMUM_DISPOSITION          0x00000005
00257 
00258 #define FILE_DIRECTORY_FILE               0x00000001
00259 #define FILE_WRITE_THROUGH                0x00000002
00260 #define FILE_SEQUENTIAL_ONLY              0x00000004
00261 #define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
00262 #define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
00263 #define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
00264 #define FILE_NON_DIRECTORY_FILE           0x00000040
00265 #define FILE_CREATE_TREE_CONNECTION       0x00000080
00266 #define FILE_COMPLETE_IF_OPLOCKED         0x00000100
00267 #define FILE_NO_EA_KNOWLEDGE              0x00000200
00268 #define FILE_OPEN_FOR_RECOVERY            0x00000400
00269 #define FILE_RANDOM_ACCESS                0x00000800
00270 #define FILE_DELETE_ON_CLOSE              0x00001000
00271 #define FILE_OPEN_BY_FILE_ID              0x00002000
00272 #define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
00273 #define FILE_NO_COMPRESSION               0x00008000
00274 #define FILE_RESERVE_OPFILTER             0x00100000
00275 #define FILE_OPEN_REPARSE_POINT           0x00200000
00276 #define FILE_OPEN_NO_RECALL               0x00400000
00277 #define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
00278 
00279 #define FILE_ANY_ACCESS                   0x00000000
00280 #define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
00281 #define FILE_READ_ACCESS                  0x00000001
00282 #define FILE_WRITE_ACCESS                 0x00000002
00283 
00284 #define FILE_ALL_ACCESS \
00285   (STANDARD_RIGHTS_REQUIRED | \
00286    SYNCHRONIZE | \
00287    0x1FF)
00288 
00289 #define FILE_GENERIC_EXECUTE \
00290   (STANDARD_RIGHTS_EXECUTE | \
00291    FILE_READ_ATTRIBUTES | \
00292    FILE_EXECUTE | \
00293    SYNCHRONIZE)
00294 
00295 #define FILE_GENERIC_READ \
00296   (STANDARD_RIGHTS_READ | \
00297    FILE_READ_DATA | \
00298    FILE_READ_ATTRIBUTES | \
00299    FILE_READ_EA | \
00300    SYNCHRONIZE)
00301 
00302 #define FILE_GENERIC_WRITE \
00303   (STANDARD_RIGHTS_WRITE | \
00304    FILE_WRITE_DATA | \
00305    FILE_WRITE_ATTRIBUTES | \
00306    FILE_WRITE_EA | \
00307    FILE_APPEND_DATA | \
00308    SYNCHRONIZE)
00309 /* end winnt.h */
00310 
00311 #define DIRECTORY_QUERY (0x0001)
00312 #define DIRECTORY_TRAVERSE (0x0002)
00313 #define DIRECTORY_CREATE_OBJECT (0x0004)
00314 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
00315 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
00316   
00317 /* Exported object types */
00318 extern NTOSAPI POBJECT_TYPE ExDesktopObjectType;
00319 extern NTOSAPI POBJECT_TYPE ExEventObjectType;
00320 extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType;
00321 extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType;
00322 extern NTOSAPI POBJECT_TYPE IoAdapterObjectType;
00323 extern NTOSAPI ULONG IoDeviceHandlerObjectSize;
00324 extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType;
00325 extern NTOSAPI POBJECT_TYPE IoDeviceObjectType;
00326 extern NTOSAPI POBJECT_TYPE IoDriverObjectType;
00327 extern NTOSAPI POBJECT_TYPE IoFileObjectType;
00328 extern NTOSAPI POBJECT_TYPE LpcPortObjectType;
00329 extern NTOSAPI POBJECT_TYPE MmSectionObjectType;
00330 extern NTOSAPI POBJECT_TYPE SeTokenObjectType;
00331 
00332 extern NTOSAPI CCHAR KeNumberProcessors;
00333 extern NTOSAPI PHAL_DISPATCH_TABLE HalDispatchTable;
00334 extern NTOSAPI PHAL_PRIVATE_DISPATCH_TABLE HalPrivateDispatchTable;
00335 
00336 
00337 /*
00338 ** IRP function codes
00339 */
00340 
00341 #define IRP_MJ_CREATE                     0x00
00342 #define IRP_MJ_CREATE_NAMED_PIPE          0x01
00343 #define IRP_MJ_CLOSE                      0x02
00344 #define IRP_MJ_READ                       0x03
00345 #define IRP_MJ_WRITE                      0x04
00346 #define IRP_MJ_QUERY_INFORMATION          0x05
00347 #define IRP_MJ_SET_INFORMATION            0x06
00348 #define IRP_MJ_QUERY_EA                   0x07
00349 #define IRP_MJ_SET_EA                     0x08
00350 #define IRP_MJ_FLUSH_BUFFERS              0x09
00351 #define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
00352 #define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
00353 #define IRP_MJ_DIRECTORY_CONTROL          0x0c
00354 #define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
00355 #define IRP_MJ_DEVICE_CONTROL             0x0e
00356 #define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
00357 #define IRP_MJ_SCSI                       0x0f
00358 #define IRP_MJ_SHUTDOWN                   0x10
00359 #define IRP_MJ_LOCK_CONTROL               0x11
00360 #define IRP_MJ_CLEANUP                    0x12
00361 #define IRP_MJ_CREATE_MAILSLOT            0x13
00362 #define IRP_MJ_QUERY_SECURITY             0x14
00363 #define IRP_MJ_SET_SECURITY               0x15
00364 #define IRP_MJ_POWER                      0x16
00365 #define IRP_MJ_SYSTEM_CONTROL             0x17
00366 #define IRP_MJ_DEVICE_CHANGE              0x18
00367 #define IRP_MJ_QUERY_QUOTA                0x19
00368 #define IRP_MJ_SET_QUOTA                  0x1a
00369 #define IRP_MJ_PNP                        0x1b
00370 #define IRP_MJ_PNP_POWER                  0x1b
00371 #define IRP_MJ_MAXIMUM_FUNCTION           0x1b
00372 
00373 #define IRP_MN_QUERY_DIRECTORY            0x01
00374 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY    0x02
00375 
00376 #define IRP_MN_USER_FS_REQUEST            0x00
00377 #define IRP_MN_MOUNT_VOLUME               0x01
00378 #define IRP_MN_VERIFY_VOLUME              0x02
00379 #define IRP_MN_LOAD_FILE_SYSTEM           0x03
00380 #define IRP_MN_TRACK_LINK                 0x04
00381 #define IRP_MN_KERNEL_CALL                0x04
00382 
00383 #define IRP_MN_LOCK                       0x01
00384 #define IRP_MN_UNLOCK_SINGLE              0x02
00385 #define IRP_MN_UNLOCK_ALL                 0x03
00386 #define IRP_MN_UNLOCK_ALL_BY_KEY          0x04
00387 
00388 #define IRP_MN_NORMAL                     0x00
00389 #define IRP_MN_DPC                        0x01
00390 #define IRP_MN_MDL                        0x02
00391 #define IRP_MN_COMPLETE                   0x04
00392 #define IRP_MN_COMPRESSED                 0x08
00393 
00394 #define IRP_MN_MDL_DPC                    (IRP_MN_MDL | IRP_MN_DPC)
00395 #define IRP_MN_COMPLETE_MDL               (IRP_MN_COMPLETE | IRP_MN_MDL)
00396 #define IRP_MN_COMPLETE_MDL_DPC           (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
00397 
00398 #define IRP_MN_SCSI_CLASS                 0x01
00399 
00400 #define IRP_MN_START_DEVICE               0x00
00401 #define IRP_MN_QUERY_REMOVE_DEVICE        0x01
00402 #define IRP_MN_REMOVE_DEVICE              0x02
00403 #define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
00404 #define IRP_MN_STOP_DEVICE                0x04
00405 #define IRP_MN_QUERY_STOP_DEVICE          0x05
00406 #define IRP_MN_CANCEL_STOP_DEVICE         0x06
00407 
00408 #define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
00409 #define IRP_MN_QUERY_INTERFACE              0x08
00410 #define IRP_MN_QUERY_CAPABILITIES           0x09
00411 #define IRP_MN_QUERY_RESOURCES              0x0A
00412 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
00413 #define IRP_MN_QUERY_DEVICE_TEXT            0x0C
00414 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
00415 
00416 #define IRP_MN_READ_CONFIG                  0x0F
00417 #define IRP_MN_WRITE_CONFIG                 0x10
00418 #define IRP_MN_EJECT                        0x11
00419 #define IRP_MN_SET_LOCK                     0x12
00420 #define IRP_MN_QUERY_ID                     0x13
00421 #define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
00422 #define IRP_MN_QUERY_BUS_INFORMATION        0x15
00423 #define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
00424 #define IRP_MN_SURPRISE_REMOVAL             0x17
00425 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
00426 
00427 #define IRP_MN_WAIT_WAKE                  0x00
00428 #define IRP_MN_POWER_SEQUENCE             0x01
00429 #define IRP_MN_SET_POWER                  0x02
00430 #define IRP_MN_QUERY_POWER                0x03
00431 
00432 #define IRP_MN_QUERY_ALL_DATA             0x00
00433 #define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
00434 #define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
00435 #define IRP_MN_CHANGE_SINGLE_ITEM         0x03
00436 #define IRP_MN_ENABLE_EVENTS              0x04
00437 #define IRP_MN_DISABLE_EVENTS             0x05
00438 #define IRP_MN_ENABLE_COLLECTION          0x06
00439 #define IRP_MN_DISABLE_COLLECTION         0x07
00440 #define IRP_MN_REGINFO                    0x08
00441 #define IRP_MN_EXECUTE_METHOD             0x09
00442 
00443 #define IRP_MN_REGINFO_EX                 0x0b
00444 
00445 typedef enum _IO_ALLOCATION_ACTION {
00446   KeepObject = 1,
00447   DeallocateObject,
00448   DeallocateObjectKeepRegisters
00449 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
00450 
00451 typedef IO_ALLOCATION_ACTION
00452 (DDKAPI *PDRIVER_CONTROL)(
00453   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
00454   /*IN*/ struct _IRP  *Irp,
00455   /*IN*/ PVOID  MapRegisterBase,
00456   /*IN*/ PVOID  Context);
00457 
00458 typedef VOID
00459 (DDKAPI *PDRIVER_LIST_CONTROL)(
00460   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
00461   /*IN*/ struct _IRP  *Irp,
00462   /*IN*/ struct _SCATTER_GATHER_LIST  *ScatterGather,
00463   /*IN*/ PVOID  Context);
00464 
00465 typedef NTSTATUS
00466 (DDKAPI *PDRIVER_ADD_DEVICE)(
00467   /*IN*/ struct _DRIVER_OBJECT  *DriverObject,
00468   /*IN*/ struct _DEVICE_OBJECT  *PhysicalDeviceObject);
00469 
00470 typedef NTSTATUS
00471 (DDKAPI *PIO_COMPLETION_ROUTINE)(
00472   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
00473   /*IN*/ struct _IRP  *Irp,
00474   /*IN*/ PVOID  Context);
00475 
00476 typedef VOID
00477 (DDKAPI *PDRIVER_CANCEL)(
00478   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
00479   /*IN*/ struct _IRP  *Irp);
00480 
00481 typedef VOID
00482 (DDKAPI *PKDEFERRED_ROUTINE)(
00483   /*IN*/ struct _KDPC  *Dpc,
00484   /*IN*/ PVOID  DeferredContext,
00485   /*IN*/ PVOID  SystemArgument1,
00486   /*IN*/ PVOID  SystemArgument2);
00487 
00488 typedef NTSTATUS
00489 (DDKAPI *PDRIVER_DISPATCH)(
00490   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
00491   /*IN*/ struct _IRP  *Irp);
00492 
00493 typedef VOID
00494 (DDKAPI *PIO_DPC_ROUTINE)(
00495   /*IN*/ struct _KDPC  *Dpc,
00496   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
00497   /*IN*/ struct _IRP  *Irp,
00498   /*IN*/ PVOID  Context);
00499 
00500 typedef NTSTATUS
00501 (DDKAPI *PMM_DLL_INITIALIZE)(
00502   /*IN*/ PUNICODE_STRING  RegistryPath);
00503 
00504 typedef NTSTATUS
00505 (DDKAPI *PMM_DLL_UNLOAD)(
00506   VOID);
00507 
00508 typedef NTSTATUS
00509 (DDKAPI *PDRIVER_ENTRY)( 
00510   /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
00511   /*IN*/ PUNICODE_STRING  RegistryPath); 
00512 
00513 typedef NTSTATUS
00514 (DDKAPI *PDRIVER_INITIALIZE)(
00515   /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
00516   /*IN*/ PUNICODE_STRING  RegistryPath);
00517 
00518 typedef BOOLEAN
00519 (DDKAPI *PKSERVICE_ROUTINE)(
00520   /*IN*/ struct _KINTERRUPT  *Interrupt,
00521   /*IN*/ PVOID  ServiceContext);
00522 
00523 typedef VOID
00524 (DDKAPI *PIO_TIMER_ROUTINE)(
00525   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
00526   /*IN*/ PVOID  Context);
00527 
00528 typedef VOID
00529 (DDKAPI *PDRIVER_REINITIALIZE)( 
00530   /*IN*/ struct _DRIVER_OBJECT  *DriverObject, 
00531   /*IN*/ PVOID  Context, 
00532   /*IN*/ ULONG  Count); 
00533 
00534 typedef NTSTATUS
00535 (DDKAPI *PDRIVER_STARTIO)(
00536   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject,
00537   /*IN*/ struct _IRP  *Irp);
00538 
00539 typedef BOOLEAN
00540 (DDKAPI *PKSYNCHRONIZE_ROUTINE)(
00541   /*IN*/ PVOID  SynchronizeContext);
00542 
00543 typedef VOID
00544 (DDKAPI *PDRIVER_UNLOAD)( 
00545   /*IN*/ struct _DRIVER_OBJECT  *DriverObject); 
00546 
00547 
00548 
00549 /*
00550 ** Plug and Play structures
00551 */
00552 
00553 typedef VOID DDKAPI
00554 (*PINTERFACE_REFERENCE)(
00555   PVOID  Context);
00556 
00557 typedef VOID DDKAPI
00558 (*PINTERFACE_DEREFERENCE)(
00559   PVOID Context);
00560 
00561 typedef BOOLEAN DDKAPI
00562 (*PTRANSLATE_BUS_ADDRESS)(
00563   /*IN*/ PVOID  Context,
00564   /*IN*/ PHYSICAL_ADDRESS  BusAddress,
00565   /*IN*/ ULONG  Length,
00566   /*IN OUT*/ PULONG  AddressSpace,
00567   /*OUT*/ PPHYSICAL_ADDRESS  TranslatedAddress);
00568 
00569 typedef struct _DMA_ADAPTER* DDKAPI
00570 (*PGET_DMA_ADAPTER)(
00571   /*IN*/ PVOID  Context,
00572   /*IN*/ struct _DEVICE_DESCRIPTION  *DeviceDescriptor,
00573   /*OUT*/ PULONG  NumberOfMapRegisters);
00574 
00575 typedef ULONG DDKAPI
00576 (*PGET_SET_DEVICE_DATA)(
00577   /*IN*/ PVOID  Context,
00578   /*IN*/ ULONG  DataType,
00579   /*IN*/ PVOID  Buffer,
00580   /*IN*/ ULONG  Offset,
00581   /*IN*/ ULONG  Length);
00582 
00583 typedef union _POWER_STATE {
00584   SYSTEM_POWER_STATE  SystemState;
00585   DEVICE_POWER_STATE  DeviceState;
00586 } POWER_STATE, *PPOWER_STATE;
00587 
00588 typedef enum _POWER_STATE_TYPE {
00589   SystemPowerState,
00590   DevicePowerState
00591 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
00592 
00593 typedef struct _BUS_INTERFACE_STANDARD {
00594   USHORT  Size;
00595   USHORT  Version;
00596   PVOID  Context;
00597   PINTERFACE_REFERENCE  InterfaceReference;
00598   PINTERFACE_DEREFERENCE  InterfaceDereference;
00599   PTRANSLATE_BUS_ADDRESS  TranslateBusAddress;
00600   PGET_DMA_ADAPTER  GetDmaAdapter;
00601   PGET_SET_DEVICE_DATA  SetBusData;
00602   PGET_SET_DEVICE_DATA  GetBusData;
00603 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
00604 
00605 typedef struct _DEVICE_CAPABILITIES {
00606   USHORT  Size;
00607   USHORT  Version;
00608   ULONG  DeviceD1 : 1;
00609   ULONG  DeviceD2 : 1;
00610   ULONG  LockSupported : 1;
00611   ULONG  EjectSupported : 1;
00612   ULONG  Removable : 1;
00613   ULONG  DockDevice : 1;
00614   ULONG  UniqueID : 1;
00615   ULONG  SilentInstall : 1;
00616   ULONG  RawDeviceOK : 1;
00617   ULONG  SurpriseRemovalOK : 1;
00618   ULONG  WakeFromD0 : 1;
00619   ULONG  WakeFromD1 : 1;
00620   ULONG  WakeFromD2 : 1;
00621   ULONG  WakeFromD3 : 1;
00622   ULONG  HardwareDisabled : 1;
00623   ULONG  NonDynamic : 1;
00624   ULONG  WarmEjectSupported : 1;
00625   ULONG  NoDisplayInUI : 1;
00626   ULONG  Reserved : 14;
00627   ULONG  Address;
00628   ULONG  UINumber;
00629   DEVICE_POWER_STATE  DeviceState[PowerSystemMaximum];
00630   SYSTEM_POWER_STATE  SystemWake;
00631   DEVICE_POWER_STATE  DeviceWake;
00632   ULONG  D1Latency;
00633   ULONG  D2Latency;
00634   ULONG  D3Latency;
00635 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
00636 
00637 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
00638   USHORT  Version;
00639   USHORT  Size;
00640   GUID  Event;
00641   GUID  InterfaceClassGuid;
00642   PUNICODE_STRING  SymbolicLinkName;
00643 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
00644 
00645 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
00646   USHORT  Version;
00647   USHORT  Size;
00648   GUID  Event;
00649 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
00650 
00651 #undef INTERFACE
00652 
00653 typedef struct _INTERFACE {
00654   USHORT  Size;
00655   USHORT  Version;
00656   PVOID  Context;
00657   PINTERFACE_REFERENCE  InterfaceReference;
00658   PINTERFACE_DEREFERENCE  InterfaceDereference;
00659 } INTERFACE, *PINTERFACE; 
00660 
00661 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
00662   USHORT  Version; 
00663   USHORT  Size; 
00664   GUID  Event;
00665 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
00666 
00667 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
00668 
00669 /* PNP_DEVICE_STATE */
00670 
00671 #define PNP_DEVICE_DISABLED                      0x00000001
00672 #define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
00673 #define PNP_DEVICE_FAILED                        0x00000004
00674 #define PNP_DEVICE_REMOVED                       0x00000008
00675 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
00676 #define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
00677 
00678 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
00679   USHORT  Version;
00680   USHORT  Size;
00681   GUID  Event;
00682   struct _FILE_OBJECT  *FileObject;
00683   LONG  NameBufferOffset;
00684   UCHAR  CustomDataBuffer[1];
00685 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
00686 
00687 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
00688   USHORT  Version;
00689   USHORT  Size;
00690   GUID  Event;
00691   struct _FILE_OBJECT  *FileObject;
00692 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
00693 
00694 typedef enum _BUS_QUERY_ID_TYPE {
00695   BusQueryDeviceID,
00696   BusQueryHardwareIDs,
00697   BusQueryCompatibleIDs,
00698   BusQueryInstanceID,
00699   BusQueryDeviceSerialNumber
00700 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
00701 
00702 typedef enum _DEVICE_TEXT_TYPE {
00703   DeviceTextDescription,
00704   DeviceTextLocationInformation
00705 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
00706 
00707 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
00708   DeviceUsageTypeUndefined,
00709   DeviceUsageTypePaging,
00710   DeviceUsageTypeHibernation,
00711   DeviceUsageTypeDumpFile
00712 } DEVICE_USAGE_NOTIFICATION_TYPE;
00713 
00714 typedef struct _POWER_SEQUENCE {
00715   ULONG  SequenceD1;
00716   ULONG  SequenceD2;
00717   ULONG  SequenceD3;
00718 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
00719 
00720 typedef enum {
00721   DevicePropertyDeviceDescription,
00722   DevicePropertyHardwareID,
00723   DevicePropertyCompatibleIDs,
00724   DevicePropertyBootConfiguration,
00725   DevicePropertyBootConfigurationTranslated,
00726   DevicePropertyClassName,
00727   DevicePropertyClassGuid,
00728   DevicePropertyDriverKeyName,
00729   DevicePropertyManufacturer,
00730   DevicePropertyFriendlyName,
00731   DevicePropertyLocationInformation,
00732   DevicePropertyPhysicalDeviceObjectName,
00733   DevicePropertyBusTypeGuid,
00734   DevicePropertyLegacyBusType,
00735   DevicePropertyBusNumber,
00736   DevicePropertyEnumeratorName,
00737   DevicePropertyAddress,
00738   DevicePropertyUINumber,
00739   DevicePropertyInstallState,
00740   DevicePropertyRemovalPolicy
00741 } DEVICE_REGISTRY_PROPERTY;
00742 
00743 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
00744   EventCategoryReserved,
00745   EventCategoryHardwareProfileChange,
00746   EventCategoryDeviceInterfaceChange,
00747   EventCategoryTargetDeviceChange
00748 } IO_NOTIFICATION_EVENT_CATEGORY;
00749 
00750 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
00751 
00752 typedef NTSTATUS DDKAPI
00753 (*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
00754   /*IN*/ PVOID NotificationStructure,
00755   /*IN*/ PVOID Context);
00756 
00757 typedef VOID DDKAPI
00758 (*PDEVICE_CHANGE_COMPLETE_CALLBACK)(
00759   /*IN*/ PVOID Context);
00760 
00761 
00762 
00763 /*
00764 ** System structures
00765 */
00766 
00767 #define SYMBOLIC_LINK_QUERY               0x0001
00768 #define SYMBOLIC_LINK_ALL_ACCESS          (STANDARD_RIGHTS_REQUIRED | 0x1)
00769 
00770 /* also in winnt,h */
00771 #define DUPLICATE_CLOSE_SOURCE            0x00000001
00772 #define DUPLICATE_SAME_ACCESS             0x00000002
00773 #define DUPLICATE_SAME_ATTRIBUTES         0x00000004
00774 /* end winnt.h */
00775 
00776 typedef struct _OBJECT_NAME_INFORMATION {               
00777   UNICODE_STRING  Name;                                
00778 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;   
00779 
00780 typedef VOID DDKAPI
00781 (*PIO_APC_ROUTINE)(
00782   /*IN*/ PVOID ApcContext,
00783   /*IN*/ PIO_STATUS_BLOCK IoStatusBlock,
00784   /*IN*/ ULONG Reserved);
00785 
00786 typedef struct _IO_STATUS_BLOCK {
00787   _ANONYMOUS_UNION union {
00788     NTSTATUS  Status;
00789     PVOID  Pointer;
00790   } DUMMYUNIONNAME;
00791   ULONG_PTR  Information;
00792 } IO_STATUS_BLOCK;
00793 
00794 typedef VOID DDKAPI
00795 (*PKNORMAL_ROUTINE)(
00796   /*IN*/ PVOID  NormalContext,
00797   /*IN*/ PVOID  SystemArgument1,
00798   /*IN*/ PVOID  SystemArgument2);
00799 
00800 typedef VOID DDKAPI
00801 (*PKKERNEL_ROUTINE)(
00802   /*IN*/ struct _KAPC  *Apc,
00803   /*IN OUT*/ PKNORMAL_ROUTINE  *NormalRoutine,
00804   /*IN OUT*/ PVOID  *NormalContext,
00805   /*IN OUT*/ PVOID  *SystemArgument1,
00806   /*IN OUT*/ PVOID  *SystemArgument2);
00807 
00808 typedef VOID DDKAPI
00809 (*PKRUNDOWN_ROUTINE)(
00810   /*IN*/ struct _KAPC  *Apc);
00811 
00812 typedef BOOLEAN DDKAPI
00813 (*PKTRANSFER_ROUTINE)(
00814   VOID);
00815 
00816 typedef struct _KAPC {
00817   CSHORT  Type;
00818   CSHORT  Size;
00819   ULONG  Spare0;
00820   struct _KTHREAD  *Thread;
00821   LIST_ENTRY  ApcListEntry;
00822   PKKERNEL_ROUTINE  KernelRoutine;
00823   PKRUNDOWN_ROUTINE  RundownRoutine;
00824   PKNORMAL_ROUTINE  NormalRoutine;
00825   PVOID  NormalContext;
00826   PVOID  SystemArgument1;
00827   PVOID  SystemArgument2;
00828   CCHAR  ApcStateIndex;
00829   KPROCESSOR_MODE  ApcMode;
00830   BOOLEAN  Inserted;
00831 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
00832 
00833 typedef struct _KDEVICE_QUEUE {
00834   CSHORT  Type;
00835   CSHORT  Size;
00836   LIST_ENTRY  DeviceListHead;
00837   KSPIN_LOCK  Lock;
00838   BOOLEAN  Busy;
00839 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
00840 
00841 typedef struct _KDEVICE_QUEUE_ENTRY {
00842   LIST_ENTRY  DeviceListEntry;
00843   ULONG  SortKey;
00844   BOOLEAN  Inserted;
00845 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
00846 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
00847 
00848 #define LOCK_QUEUE_WAIT                   1
00849 #define LOCK_QUEUE_OWNER                  2
00850 
00851 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
00852   LockQueueDispatcherLock,
00853   LockQueueContextSwapLock,
00854   LockQueuePfnLock,
00855   LockQueueSystemSpaceLock,
00856   LockQueueVacbLock,
00857   LockQueueMasterLock,
00858   LockQueueNonPagedPoolLock,
00859   LockQueueIoCancelLock,
00860   LockQueueWorkQueueLock,
00861   LockQueueIoVpbLock,
00862   LockQueueIoDatabaseLock,
00863   LockQueueIoCompletionLock,
00864   LockQueueNtfsStructLock,
00865   LockQueueAfdWorkQueueLock,
00866   LockQueueBcbLock,
00867   LockQueueMaximumLock
00868 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
00869 
00870 typedef struct _KSPIN_LOCK_QUEUE {
00871   struct _KSPIN_LOCK_QUEUE  *VOLATILE Next;
00872   PKSPIN_LOCK VOLATILE  Lock;
00873 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
00874 
00875 typedef struct _KLOCK_QUEUE_HANDLE {
00876   KSPIN_LOCK_QUEUE  LockQueue;
00877   KIRQL  OldIrql;
00878 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
00879 
00880 typedef struct _KDPC {
00881   CSHORT  Type;
00882   UCHAR  Number;
00883   UCHAR  Importance;
00884   LIST_ENTRY  DpcListEntry;
00885   PKDEFERRED_ROUTINE  DeferredRoutine;
00886   PVOID  DeferredContext;
00887   PVOID  SystemArgument1;
00888   PVOID  SystemArgument2;
00889   PULONG_PTR  Lock;
00890 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
00891 
00892 typedef struct _WAIT_CONTEXT_BLOCK {
00893   KDEVICE_QUEUE_ENTRY  WaitQueueEntry;
00894   struct _DRIVER_CONTROL  *DeviceRoutine;
00895   PVOID  DeviceContext;
00896   ULONG  NumberOfMapRegisters;
00897   PVOID  DeviceObject;
00898   PVOID  CurrentIrp;
00899   PKDPC  BufferChainingDpc;
00900 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
00901 
00902 typedef struct _DISPATCHER_HEADER {
00903   UCHAR  Type;
00904   UCHAR  Absolute;
00905   UCHAR  Size;
00906   UCHAR  Inserted;
00907   LONG  SignalState;
00908   LIST_ENTRY  WaitListHead;
00909 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
00910 
00911 typedef struct _KEVENT {
00912   DISPATCHER_HEADER  Header;
00913 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
00914 
00915 typedef struct _KSEMAPHORE {
00916     DISPATCHER_HEADER Header;
00917     LONG Limit;
00918 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
00919 
00920 typedef struct _FAST_MUTEX {
00921   LONG  Count;
00922   struct _KTHREAD  *Owner;
00923   ULONG  Contention;
00924   KEVENT  Event;
00925   ULONG  OldIrql;
00926 } FAST_MUTEX, *PFAST_MUTEX;
00927 
00928 typedef struct _KTIMER {
00929   DISPATCHER_HEADER  Header;
00930   ULARGE_INTEGER  DueTime;
00931   LIST_ENTRY  TimerListEntry;
00932   struct _KDPC  *Dpc;
00933   LONG  Period;
00934 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
00935 
00936 typedef struct _KMUTANT {
00937   DISPATCHER_HEADER  Header;
00938   LIST_ENTRY  MutantListEntry;
00939   struct _KTHREAD  *RESTRICTED_POINTER OwnerThread;
00940   BOOLEAN  Abandoned;
00941   UCHAR  ApcDisable;
00942 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
00943 
00944 typedef enum _TIMER_TYPE {
00945   NotificationTimer,
00946   SynchronizationTimer
00947 } TIMER_TYPE;
00948 
00949 #define EVENT_INCREMENT                   1
00950 #define IO_NO_INCREMENT                   0
00951 #define IO_CD_ROM_INCREMENT               1
00952 #define IO_DISK_INCREMENT                 1
00953 #define IO_KEYBOARD_INCREMENT             6
00954 #define IO_MAILSLOT_INCREMENT             2
00955 #define IO_MOUSE_INCREMENT                6
00956 #define IO_NAMED_PIPE_INCREMENT           2
00957 #define IO_NETWORK_INCREMENT              2
00958 #define IO_PARALLEL_INCREMENT             1
00959 #define IO_SERIAL_INCREMENT               2
00960 #define IO_SOUND_INCREMENT                8
00961 #define IO_VIDEO_INCREMENT                1
00962 #define SEMAPHORE_INCREMENT               1
00963 
00964 typedef struct _IRP {
00965   CSHORT  Type;
00966   USHORT  Size;
00967   struct _MDL  *MdlAddress;
00968   ULONG  Flags;
00969   union {
00970     struct _IRP  *MasterIrp;
00971     LONG  IrpCount;
00972     PVOID  SystemBuffer;
00973   } AssociatedIrp;
00974   LIST_ENTRY  ThreadListEntry;
00975   IO_STATUS_BLOCK  IoStatus;
00976   KPROCESSOR_MODE  RequestorMode;
00977   BOOLEAN  PendingReturned;
00978   CHAR  StackCount;
00979   CHAR  CurrentLocation;
00980   BOOLEAN  Cancel;
00981   KIRQL  CancelIrql;
00982   CCHAR  ApcEnvironment;
00983   UCHAR  AllocationFlags;
00984   PIO_STATUS_BLOCK  UserIosb;
00985   PKEVENT  UserEvent;
00986   union {
00987     struct {
00988       PIO_APC_ROUTINE  UserApcRoutine;
00989       PVOID  UserApcContext;
00990     } AsynchronousParameters;
00991     LARGE_INTEGER  AllocationSize;
00992   } Overlay;
00993   PDRIVER_CANCEL  CancelRoutine;
00994   PVOID  UserBuffer;
00995   union {
00996     struct {
00997       _ANONYMOUS_UNION union {
00998         KDEVICE_QUEUE_ENTRY  DeviceQueueEntry;
00999         _ANONYMOUS_STRUCT struct {
01000           PVOID  DriverContext[4];
01001         } DUMMYSTRUCTNAME;
01002       } DUMMYUNIONNAME;
01003       PETHREAD  Thread;
01004       PCHAR  AuxiliaryBuffer;
01005       _ANONYMOUS_STRUCT struct {
01006         LIST_ENTRY  ListEntry;
01007         _ANONYMOUS_UNION union {
01008           struct _IO_STACK_LOCATION  *CurrentStackLocation;
01009           ULONG  PacketType;
01010         } DUMMYUNIONNAME;
01011       } DUMMYSTRUCTNAME;
01012       struct _FILE_OBJECT  *OriginalFileObject;
01013     } Overlay;
01014     KAPC  Apc;
01015     PVOID  CompletionKey;
01016   } Tail;
01017 } IRP;
01018 typedef struct _IRP *PIRP;
01019 
01020 /* IRP.Flags */
01021 
01022 #define SL_FORCE_ACCESS_CHECK             0x01
01023 #define SL_OPEN_PAGING_FILE               0x02
01024 #define SL_OPEN_TARGET_DIRECTORY          0x04
01025 #define SL_CASE_SENSITIVE                 0x80
01026 
01027 #define SL_KEY_SPECIFIED                  0x01
01028 #define SL_OVERRIDE_VERIFY_VOLUME         0x02
01029 #define SL_WRITE_THROUGH                  0x04
01030 #define SL_FT_SEQUENTIAL_WRITE            0x08
01031 
01032 #define SL_FAIL_IMMEDIATELY               0x01
01033 #define SL_EXCLUSIVE_LOCK                 0x02
01034 
01035 #define SL_RESTART_SCAN                   0x01
01036 #define SL_RETURN_SINGLE_ENTRY            0x02
01037 #define SL_INDEX_SPECIFIED                0x04
01038 
01039 #define SL_WATCH_TREE                     0x01
01040 
01041 #define SL_ALLOW_RAW_MOUNT                0x01
01042 
01043 #define CTL_CODE(DeviceType, Function, Method, Access)( \
01044   ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
01045 
01046 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
01047 
01048 enum
01049 {
01050    IRP_NOCACHE = 0x1,
01051    IRP_PAGING_IO = 0x2,
01052    IRP_MOUNT_COMPLETION = 0x2,
01053    IRP_SYNCHRONOUS_API = 0x4,
01054    IRP_ASSOCIATED_IRP = 0x8,
01055    IRP_BUFFERED_IO = 0x10,
01056    IRP_DEALLOCATE_BUFFER = 0x20,
01057    IRP_INPUT_OPERATION = 0x40,
01058    IRP_SYNCHRONOUS_PAGING_IO = 0x40,
01059    IRP_CREATE_OPERATION = 0x80,
01060    IRP_READ_OPERATION = 0x100,
01061    IRP_WRITE_OPERATION = 0x200,
01062    IRP_CLOSE_OPERATION = 0x400,
01063    IRP_DEFER_IO_COMPLETION = 0x800,
01064    IRP_OB_QUERY_NAME = 0x1000,
01065    IRP_HOLD_DEVICE_QUEUE = 0x2000,
01066    IRP_RETRY_IO_COMPLETION = 0x4000
01067 };
01068 
01069 
01070 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
01071   ULONG  Signature;
01072 } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
01073 
01074 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
01075   GUID  DiskId;
01076   LARGE_INTEGER  StartingUsableOffset;
01077   LARGE_INTEGER  UsableLength;
01078   ULONG  MaxPartitionCount;
01079 } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
01080 
01081 typedef struct _PARTITION_INFORMATION_MBR {
01082   UCHAR  PartitionType;
01083   BOOLEAN  BootIndicator;
01084   BOOLEAN  RecognizedPartition;
01085   ULONG  HiddenSectors;
01086 } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
01087 
01088 
01089 typedef struct _BOOTDISK_INFORMATION {
01090   LONGLONG  BootPartitionOffset;
01091   LONGLONG  SystemPartitionOffset;
01092   ULONG  BootDeviceSignature;
01093   ULONG  SystemDeviceSignature;
01094 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
01095 
01096 typedef struct _BOOTDISK_INFORMATION_EX {
01097   LONGLONG  BootPartitionOffset;
01098   LONGLONG  SystemPartitionOffset;
01099   ULONG  BootDeviceSignature;
01100   ULONG  SystemDeviceSignature;
01101   GUID  BootDeviceGuid;
01102   GUID  SystemDeviceGuid;
01103   BOOLEAN  BootDeviceIsGpt;
01104   BOOLEAN  SystemDeviceIsGpt;
01105 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
01106 
01107 typedef struct _EISA_MEMORY_TYPE {
01108   UCHAR  ReadWrite : 1;
01109   UCHAR  Cached : 1;
01110   UCHAR  Reserved0 : 1;
01111   UCHAR  Type : 2;
01112   UCHAR  Shared : 1;
01113   UCHAR  Reserved1 : 1;
01114   UCHAR  MoreEntries : 1;
01115 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
01116 
01117 #include <pshpack1.h>
01118 typedef struct _EISA_MEMORY_CONFIGURATION {
01119   EISA_MEMORY_TYPE  ConfigurationByte;
01120   UCHAR  DataSize;
01121   USHORT  AddressLowWord;
01122   UCHAR  AddressHighByte;
01123   USHORT  MemorySize;
01124 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
01125 #include <poppack.h>
01126 
01127 typedef struct _EISA_IRQ_DESCRIPTOR {
01128   UCHAR  Interrupt : 4;
01129   UCHAR  Reserved : 1;
01130   UCHAR  LevelTriggered : 1;
01131   UCHAR  Shared : 1;
01132   UCHAR  MoreEntries : 1;
01133 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
01134 
01135 typedef struct _EISA_IRQ_CONFIGURATION {
01136   EISA_IRQ_DESCRIPTOR  ConfigurationByte;
01137   UCHAR  Reserved;
01138 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
01139 
01140 typedef struct _DMA_CONFIGURATION_BYTE0 {
01141   UCHAR Channel : 3;
01142   UCHAR Reserved : 3;
01143   UCHAR Shared : 1;
01144   UCHAR MoreEntries : 1;
01145 } DMA_CONFIGURATION_BYTE0;
01146 
01147 typedef struct _DMA_CONFIGURATION_BYTE1 {
01148   UCHAR  Reserved0 : 2;
01149   UCHAR  TransferSize : 2;
01150   UCHAR  Timing : 2;
01151   UCHAR  Reserved1 : 2;
01152 } DMA_CONFIGURATION_BYTE1;
01153 
01154 typedef struct _EISA_DMA_CONFIGURATION {
01155   DMA_CONFIGURATION_BYTE0  ConfigurationByte0;
01156   DMA_CONFIGURATION_BYTE1  ConfigurationByte1;
01157 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
01158 
01159 #include <pshpack1.h>
01160 typedef struct _EISA_PORT_DESCRIPTOR {
01161   UCHAR  NumberPorts : 5;
01162   UCHAR  Reserved : 1;
01163   UCHAR  Shared : 1;
01164   UCHAR  MoreEntries : 1;
01165 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
01166 
01167 typedef struct _EISA_PORT_CONFIGURATION {
01168   EISA_PORT_DESCRIPTOR  Configuration;
01169   USHORT  PortAddress;
01170 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
01171 #include <poppack.h>
01172 
01173 typedef struct _CM_EISA_FUNCTION_INFORMATION {
01174   ULONG  CompressedId;
01175   UCHAR  IdSlotFlags1;
01176   UCHAR  IdSlotFlags2;
01177   UCHAR  MinorRevision;
01178   UCHAR  MajorRevision;
01179   UCHAR  Selections[26];
01180   UCHAR  FunctionFlags;
01181   UCHAR  TypeString[80];
01182   EISA_MEMORY_CONFIGURATION  EisaMemory[9];
01183   EISA_IRQ_CONFIGURATION  EisaIrq[7];
01184   EISA_DMA_CONFIGURATION  EisaDma[4];
01185   EISA_PORT_CONFIGURATION  EisaPort[20];
01186   UCHAR  InitializationData[60];
01187 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
01188 
01189 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
01190 
01191 #define EISA_FUNCTION_ENABLED           0x80
01192 #define EISA_FREE_FORM_DATA             0x40
01193 #define EISA_HAS_PORT_INIT_ENTRY        0x20
01194 #define EISA_HAS_PORT_RANGE             0x10
01195 #define EISA_HAS_DMA_ENTRY              0x08
01196 #define EISA_HAS_IRQ_ENTRY              0x04
01197 #define EISA_HAS_MEMORY_ENTRY           0x02
01198 #define EISA_HAS_TYPE_ENTRY             0x01
01199 #define EISA_HAS_INFORMATION \
01200   (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
01201   + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
01202 
01203 typedef struct _CM_EISA_SLOT_INFORMATION {
01204   UCHAR  ReturnCode;
01205   UCHAR  ReturnFlags;
01206   UCHAR  MajorRevision;
01207   UCHAR  MinorRevision;
01208   USHORT  Checksum;
01209   UCHAR  NumberFunctions;
01210   UCHAR  FunctionInformation;
01211   ULONG  CompressedId;
01212 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
01213 
01214 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
01215 
01216 #define EISA_INVALID_SLOT               0x80
01217 #define EISA_INVALID_FUNCTION           0x81
01218 #define EISA_INVALID_CONFIGURATION      0x82
01219 #define EISA_EMPTY_SLOT                 0x83
01220 #define EISA_INVALID_BIOS_CALL          0x86
01221 
01222 typedef struct _CM_FLOPPY_DEVICE_DATA {
01223   USHORT  Version;
01224   USHORT  Revision;
01225   CHAR  Size[8];
01226   ULONG  MaxDensity;
01227   ULONG  MountDensity;
01228   UCHAR  StepRateHeadUnloadTime;
01229   UCHAR  HeadLoadTime;
01230   UCHAR  MotorOffTime;
01231   UCHAR  SectorLengthCode;
01232   UCHAR  SectorPerTrack;
01233   UCHAR  ReadWriteGapLength;
01234   UCHAR  DataTransferLength;
01235   UCHAR  FormatGapLength;
01236   UCHAR  FormatFillCharacter;
01237   UCHAR  HeadSettleTime;
01238   UCHAR  MotorSettleTime;
01239   UCHAR  MaximumTrackValue;
01240   UCHAR  DataTransferRate;
01241 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
01242 
01243 typedef enum _INTERFACE_TYPE {
01244   InterfaceTypeUndefined = -1,
01245   Internal,
01246   Isa,
01247   Eisa,
01248   MicroChannel,
01249   TurboChannel,
01250   PCIBus,
01251   VMEBus,
01252   NuBus,
01253   PCMCIABus,
01254   CBus,
01255   MPIBus,
01256   MPSABus,
01257   ProcessorInternal,
01258   InternalPowerBus,
01259   PNPISABus,
01260   PNPBus,
01261   MaximumInterfaceType
01262 } INTERFACE_TYPE, *PINTERFACE_TYPE;
01263 
01264 typedef struct _PNP_BUS_INFORMATION {
01265   GUID  BusTypeGuid;
01266   INTERFACE_TYPE  LegacyBusType;
01267   ULONG  BusNumber;
01268 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
01269 
01270 #include <pshpack1.h>
01271 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
01272   UCHAR Type;
01273   UCHAR ShareDisposition;
01274   USHORT Flags;
01275   union {
01276     struct {
01277       PHYSICAL_ADDRESS Start;
01278       ULONG Length;
01279     } Generic;
01280     struct {
01281       PHYSICAL_ADDRESS Start;
01282       ULONG Length;
01283     } Port;
01284     struct {
01285       ULONG Level;
01286       ULONG Vector;
01287       ULONG Affinity;
01288     } Interrupt;
01289     struct {
01290       PHYSICAL_ADDRESS Start;
01291       ULONG Length;
01292     } Memory;
01293     struct {
01294       ULONG Channel;
01295       ULONG Port;
01296       ULONG Reserved1;
01297     } Dma;
01298     struct {
01299       ULONG Data[3];
01300     } DevicePrivate;
01301     struct {
01302       ULONG Start;
01303       ULONG Length;
01304       ULONG Reserved;
01305     } BusNumber;
01306     struct {
01307       ULONG DataSize;
01308       ULONG Reserved1;
01309       ULONG Reserved2;
01310     } DeviceSpecificData;
01311   } u;
01312 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
01313 
01314 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
01315 
01316 #define CmResourceTypeNull                0
01317 #define CmResourceTypePort                1
01318 #define CmResourceTypeInterrupt           2
01319 #define CmResourceTypeMemory              3
01320 #define CmResourceTypeDma                 4
01321 #define CmResourceTypeDeviceSpecific      5
01322 #define CmResourceTypeBusNumber           6
01323 #define CmResourceTypeMaximum             7
01324 #define CmResourceTypeNonArbitrated     128
01325 #define CmResourceTypeConfigData        128
01326 #define CmResourceTypeDevicePrivate     129
01327 #define CmResourceTypePcCardConfig      130
01328 #define CmResourceTypeMfCardConfig      131
01329 
01330 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
01331 
01332 typedef enum _CM_SHARE_DISPOSITION {
01333   CmResourceShareUndetermined,
01334   CmResourceShareDeviceExclusive,
01335   CmResourceShareDriverExclusive,
01336   CmResourceShareShared
01337 } CM_SHARE_DISPOSITION;
01338 
01339 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
01340 
01341 #define CM_RESOURCE_PORT_MEMORY           0x0000
01342 #define CM_RESOURCE_PORT_IO               0x0001
01343 #define CM_RESOURCE_PORT_10_BIT_DECODE    0x0004
01344 #define CM_RESOURCE_PORT_12_BIT_DECODE    0x0008
01345 #define CM_RESOURCE_PORT_16_BIT_DECODE    0x0010
01346 #define CM_RESOURCE_PORT_POSITIVE_DECODE  0x0020
01347 #define CM_RESOURCE_PORT_PASSIVE_DECODE   0x0040
01348 #define CM_RESOURCE_PORT_WINDOW_DECODE    0x0080
01349 
01350 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
01351 
01352 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
01353 #define CM_RESOURCE_INTERRUPT_LATCHED         0x0001
01354 
01355 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
01356 
01357 #define CM_RESOURCE_MEMORY_READ_WRITE     0x0000
01358 #define CM_RESOURCE_MEMORY_READ_ONLY      0x0001
01359 #define CM_RESOURCE_MEMORY_WRITE_ONLY     0x0002
01360 #define CM_RESOURCE_MEMORY_PREFETCHABLE   0x0004
01361 #define CM_RESOURCE_MEMORY_COMBINEDWRITE  0x0008
01362 #define CM_RESOURCE_MEMORY_24             0x0010
01363 #define CM_RESOURCE_MEMORY_CACHEABLE      0x0020
01364 
01365 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
01366 
01367 #define CM_RESOURCE_DMA_8                 0x0000
01368 #define CM_RESOURCE_DMA_16                0x0001
01369 #define CM_RESOURCE_DMA_32                0x0002
01370 #define CM_RESOURCE_DMA_8_AND_16          0x0004
01371 #define CM_RESOURCE_DMA_BUS_MASTER        0x0008
01372 #define CM_RESOURCE_DMA_TYPE_A            0x0010
01373 #define CM_RESOURCE_DMA_TYPE_B            0x0020
01374 #define CM_RESOURCE_DMA_TYPE_F            0x0040
01375 
01376 typedef struct _CM_PARTIAL_RESOURCE_LIST {
01377   USHORT  Version;
01378   USHORT  Revision;
01379   ULONG  Count;
01380   CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
01381 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
01382 
01383 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
01384   INTERFACE_TYPE  InterfaceType;
01385   ULONG  BusNumber;
01386   CM_PARTIAL_RESOURCE_LIST  PartialResourceList;
01387 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
01388 
01389 typedef struct _CM_RESOURCE_LIST {
01390   ULONG  Count;
01391   CM_FULL_RESOURCE_DESCRIPTOR  List[1];
01392 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
01393 
01394 typedef struct _CM_INT13_DRIVE_PARAMETER {
01395   USHORT  DriveSelect;
01396   ULONG  MaxCylinders;
01397   USHORT  SectorsPerTrack;
01398   USHORT  MaxHeads;
01399   USHORT  NumberDrives;
01400 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
01401 #include <poppack.h>
01402 
01403 typedef struct _CM_KEYBOARD_DEVICE_DATA {
01404   USHORT  Version;
01405   USHORT  Revision;
01406   UCHAR  Type;
01407   UCHAR  Subtype;
01408   USHORT  KeyboardFlags;
01409 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
01410 
01411 #define KEYBOARD_INSERT_ON                0x80
01412 #define KEYBOARD_CAPS_LOCK_ON             0x40
01413 #define KEYBOARD_NUM_LOCK_ON              0x20
01414 #define KEYBOARD_SCROLL_LOCK_ON           0x10
01415 #define KEYBOARD_ALT_KEY_DOWN             0x08
01416 #define KEYBOARD_CTRL_KEY_DOWN            0x04
01417 #define KEYBOARD_LEFT_SHIFT_DOWN          0x02
01418 #define KEYBOARD_RIGHT_SHIFT_DOWN         0x01
01419 
01420 typedef struct _CM_MCA_POS_DATA {
01421   USHORT  AdapterId;
01422   UCHAR  PosData1;
01423   UCHAR  PosData2;
01424   UCHAR  PosData3;
01425   UCHAR  PosData4;
01426 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
01427 
01428 typedef struct CM_Power_Data_s {
01429   ULONG  PD_Size;
01430   DEVICE_POWER_STATE  PD_MostRecentPowerState;
01431   ULONG  PD_Capabilities;
01432   ULONG  PD_D1Latency;
01433   ULONG  PD_D2Latency;
01434   ULONG  PD_D3Latency;
01435   DEVICE_POWER_STATE  PD_PowerStateMapping[PowerSystemMaximum];
01436 } CM_POWER_DATA, *PCM_POWER_DATA;
01437 
01438 #define PDCAP_D0_SUPPORTED                0x00000001
01439 #define PDCAP_D1_SUPPORTED                0x00000002
01440 #define PDCAP_D2_SUPPORTED                0x00000004
01441 #define PDCAP_D3_SUPPORTED                0x00000008
01442 #define PDCAP_WAKE_FROM_D0_SUPPORTED      0x00000010
01443 #define PDCAP_WAKE_FROM_D1_SUPPORTED      0x00000020
01444 #define PDCAP_WAKE_FROM_D2_SUPPORTED      0x00000040
01445 #define PDCAP_WAKE_FROM_D3_SUPPORTED      0x00000080
01446 #define PDCAP_WARM_EJECT_SUPPORTED        0x00000100
01447 
01448 typedef struct _CM_SCSI_DEVICE_DATA {
01449   USHORT  Version;
01450   USHORT  Revision;
01451   UCHAR  HostIdentifier;
01452 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
01453 
01454 typedef struct _CM_SERIAL_DEVICE_DATA {
01455   USHORT  Version;
01456   USHORT  Revision;
01457   ULONG  BaudClock;
01458 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
01459 
01460 /* IO_RESOURCE_DESCRIPTOR.Option */
01461 
01462 #define IO_RESOURCE_PREFERRED             0x01
01463 #define IO_RESOURCE_DEFAULT               0x02
01464 #define IO_RESOURCE_ALTERNATIVE           0x08
01465 
01466 typedef struct _IO_RESOURCE_DESCRIPTOR {
01467   UCHAR  Option;
01468   UCHAR  Type;
01469   UCHAR  ShareDisposition;
01470   UCHAR  Spare1;
01471   USHORT  Flags;
01472   USHORT  Spare2;
01473   union {
01474     struct {
01475       ULONG  Length;
01476       ULONG  Alignment;
01477       PHYSICAL_ADDRESS  MinimumAddress;
01478       PHYSICAL_ADDRESS  MaximumAddress;
01479     } Port;
01480     struct {
01481       ULONG  Length;
01482       ULONG  Alignment;
01483       PHYSICAL_ADDRESS  MinimumAddress;
01484       PHYSICAL_ADDRESS  MaximumAddress;
01485     } Memory;
01486     struct {
01487       ULONG  MinimumVector;
01488       ULONG  MaximumVector;
01489     } Interrupt;
01490     struct {
01491       ULONG  MinimumChannel;
01492       ULONG  MaximumChannel;
01493     } Dma;
01494     struct {
01495       ULONG  Length;
01496       ULONG  Alignment;
01497       PHYSICAL_ADDRESS  MinimumAddress;
01498       PHYSICAL_ADDRESS  MaximumAddress;
01499     } Generic;
01500     struct {
01501       ULONG  Data[3];
01502     } DevicePrivate;
01503     struct {
01504       ULONG  Length;
01505       ULONG  MinBusNumber;
01506       ULONG  MaxBusNumber;
01507       ULONG  Reserved;
01508     } BusNumber;
01509     struct {
01510       ULONG  Priority;
01511       ULONG  Reserved1;
01512       ULONG  Reserved2;
01513     } ConfigData;
01514   } u;
01515 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
01516 
01517 typedef struct _IO_RESOURCE_LIST {
01518   USHORT  Version;
01519   USHORT  Revision;
01520   ULONG  Count;
01521   IO_RESOURCE_DESCRIPTOR  Descriptors[1];
01522 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
01523 
01524 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
01525   ULONG  ListSize;
01526   INTERFACE_TYPE  InterfaceType;
01527   ULONG  BusNumber;
01528   ULONG  SlotNumber;
01529   ULONG  Reserved[3];
01530   ULONG  AlternativeLists;
01531   IO_RESOURCE_LIST  List[1];
01532 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
01533 
01534 typedef struct _CONTROLLER_OBJECT {
01535   CSHORT  Type;
01536   CSHORT  Size;
01537   PVOID  ControllerExtension;
01538   KDEVICE_QUEUE  DeviceWaitQueue;
01539   ULONG  Spare1;
01540   LARGE_INTEGER  Spare2;
01541 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
01542 
01543 typedef enum _DMA_WIDTH {
01544   Width8Bits,
01545   Width16Bits,
01546   Width32Bits,
01547   MaximumDmaWidth
01548 } DMA_WIDTH, *PDMA_WIDTH;
01549 
01550 typedef enum _DMA_SPEED {
01551   Compatible,
01552   TypeA,
01553   TypeB,
01554   TypeC,
01555   TypeF,
01556   MaximumDmaSpeed
01557 } DMA_SPEED, *PDMA_SPEED;
01558 
01559 /* DEVICE_DESCRIPTION.Version */
01560 
01561 #define DEVICE_DESCRIPTION_VERSION        0x0000
01562 #define DEVICE_DESCRIPTION_VERSION1       0x0001
01563 #define DEVICE_DESCRIPTION_VERSION2       0x0002
01564 
01565 typedef struct _DEVICE_DESCRIPTION {
01566   ULONG  Version;
01567   BOOLEAN  Master;
01568   BOOLEAN  ScatterGather;
01569   BOOLEAN  DemandMode;
01570   BOOLEAN  AutoInitialize;
01571   BOOLEAN  Dma32BitAddresses;
01572   BOOLEAN  IgnoreCount;
01573   BOOLEAN  Reserved1;
01574   BOOLEAN  Dma64BitAddresses;
01575   ULONG  BusNumber; 
01576   ULONG  DmaChannel;
01577   INTERFACE_TYPE  InterfaceType;
01578   DMA_WIDTH  DmaWidth;
01579   DMA_SPEED  DmaSpeed;
01580   ULONG  MaximumLength;
01581   ULONG  DmaPort;
01582 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
01583 
01584 /* VPB.Flags */
01585 #define VPB_MOUNTED                       0x0001
01586 #define VPB_LOCKED                        0x0002
01587 #define VPB_PERSISTENT                    0x0004
01588 #define VPB_REMOVE_PENDING                0x0008
01589 #define VPB_RAW_MOUNT                     0x0010
01590 
01591 #define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
01592 
01593 typedef struct _VPB {
01594   CSHORT  Type;
01595   CSHORT  Size;
01596   USHORT  Flags;
01597   USHORT  VolumeLabelLength;
01598   struct _DEVICE_OBJECT  *DeviceObject;
01599   struct _DEVICE_OBJECT  *RealDevice;
01600   ULONG  SerialNumber;
01601   ULONG  ReferenceCount;
01602   WCHAR  VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
01603 } VPB, *PVPB;
01604 
01605 /* DEVICE_OBJECT.Flags */
01606 
01607 #define DO_VERIFY_VOLUME                  0x00000002      
01608 #define DO_BUFFERED_IO                    0x00000004      
01609 #define DO_EXCLUSIVE                      0x00000008      
01610 #define DO_DIRECT_IO                      0x00000010      
01611 #define DO_MAP_IO_BUFFER                  0x00000020      
01612 #define DO_DEVICE_HAS_NAME                0x00000040      
01613 #define DO_DEVICE_INITIALIZING            0x00000080      
01614 #define DO_SYSTEM_BOOT_PARTITION          0x00000100      
01615 #define DO_LONG_TERM_REQUESTS             0x00000200      
01616 #define DO_NEVER_LAST_DEVICE              0x00000400      
01617 #define DO_SHUTDOWN_REGISTERED            0x00000800      
01618 #define DO_BUS_ENUMERATED_DEVICE          0x00001000      
01619 #define DO_POWER_PAGABLE                  0x00002000      
01620 #define DO_POWER_INRUSH                   0x00004000      
01621 #define DO_LOW_PRIORITY_FILESYSTEM        0x00010000      
01622 
01623 /* DEVICE_OBJECT.Characteristics */
01624 
01625 #define FILE_REMOVABLE_MEDIA            0x00000001
01626 #define FILE_READ_ONLY_DEVICE           0x00000002
01627 #define FILE_FLOPPY_DISKETTE            0x00000004
01628 #define FILE_WRITE_ONCE_MEDIA           0x00000008
01629 #define FILE_REMOTE_DEVICE              0x00000010
01630 #define FILE_DEVICE_IS_MOUNTED          0x00000020
01631 #define FILE_VIRTUAL_VOLUME             0x00000040
01632 #define FILE_AUTOGENERATED_DEVICE_NAME  0x00000080
01633 #define FILE_DEVICE_SECURE_OPEN         0x00000100
01634 
01635 /* DEVICE_OBJECT.AlignmentRequirement */
01636 
01637 #define FILE_BYTE_ALIGNMENT             0x00000000
01638 #define FILE_WORD_ALIGNMENT             0x00000001
01639 #define FILE_LONG_ALIGNMENT             0x00000003
01640 #define FILE_QUAD_ALIGNMENT             0x00000007
01641 #define FILE_OCTA_ALIGNMENT             0x0000000f
01642 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
01643 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
01644 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
01645 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
01646 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
01647 
01648 /* DEVICE_OBJECT.DeviceType */
01649 
01650 #define DEVICE_TYPE ULONG
01651 
01652 #define FILE_DEVICE_BEEP                  0x00000001
01653 #define FILE_DEVICE_CD_ROM                0x00000002
01654 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
01655 #define FILE_DEVICE_CONTROLLER            0x00000004
01656 #define FILE_DEVICE_DATALINK              0x00000005
01657 #define FILE_DEVICE_DFS                   0x00000006
01658 #define FILE_DEVICE_DISK                  0x00000007
01659 #define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
01660 #define FILE_DEVICE_FILE_SYSTEM           0x00000009
01661 #define FILE_DEVICE_INPORT_PORT           0x0000000a
01662 #define FILE_DEVICE_KEYBOARD              0x0000000b
01663 #define FILE_DEVICE_MAILSLOT              0x0000000c
01664 #define FILE_DEVICE_MIDI_IN               0x0000000d
01665 #define FILE_DEVICE_MIDI_OUT              0x0000000e
01666 #define FILE_DEVICE_MOUSE                 0x0000000f
01667 #define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
01668 #define FILE_DEVICE_NAMED_PIPE            0x00000011
01669 #define FILE_DEVICE_NETWORK               0x00000012
01670 #define FILE_DEVICE_NETWORK_BROWSER       0x00000013
01671 #define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
01672 #define FILE_DEVICE_NULL                  0x00000015
01673 #define FILE_DEVICE_PARALLEL_PORT         0x00000016
01674 #define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
01675 #define FILE_DEVICE_PRINTER               0x00000018
01676 #define FILE_DEVICE_SCANNER               0x00000019
01677 #define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
01678 #define FILE_DEVICE_SERIAL_PORT           0x0000001b
01679 #define FILE_DEVICE_SCREEN                0x0000001c
01680 #define FILE_DEVICE_SOUND                 0x0000001d
01681 #define FILE_DEVICE_STREAMS               0x0000001e
01682 #define FILE_DEVICE_TAPE                  0x0000001f
01683 #define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
01684 #define FILE_DEVICE_TRANSPORT             0x00000021
01685 #define FILE_DEVICE_UNKNOWN               0x00000022
01686 #define FILE_DEVICE_VIDEO                 0x00000023
01687 #define FILE_DEVICE_VIRTUAL_DISK          0x00000024
01688 #define FILE_DEVICE_WAVE_IN               0x00000025
01689 #define FILE_DEVICE_WAVE_OUT              0x00000026
01690 #define FILE_DEVICE_8042_PORT             0x00000027
01691 #define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
01692 #define FILE_DEVICE_BATTERY               0x00000029
01693 #define FILE_DEVICE_BUS_EXTENDER          0x0000002a
01694 #define FILE_DEVICE_MODEM                 0x0000002b
01695 #define FILE_DEVICE_VDM                   0x0000002c
01696 #define FILE_DEVICE_MASS_STORAGE          0x0000002d
01697 #define FILE_DEVICE_SMB                   0x0000002e
01698 #define FILE_DEVICE_KS                    0x0000002f
01699 #define FILE_DEVICE_CHANGER               0x00000030
01700 #define FILE_DEVICE_SMARTCARD             0x00000031
01701 #define FILE_DEVICE_ACPI                  0x00000032
01702 #define FILE_DEVICE_DVD                   0x00000033
01703 #define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
01704 #define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
01705 #define FILE_DEVICE_DFS_VOLUME            0x00000036
01706 #define FILE_DEVICE_SERENUM               0x00000037
01707 #define FILE_DEVICE_TERMSRV               0x00000038
01708 #define FILE_DEVICE_KSEC                  0x00000039
01709 #define FILE_DEVICE_FIPS                      0x0000003a
01710 
01711 typedef struct _DEVICE_OBJECT {
01712   CSHORT  Type;
01713   USHORT  Size;
01714   LONG  ReferenceCount;
01715   struct _DRIVER_OBJECT  *DriverObject;
01716   struct _DEVICE_OBJECT  *NextDevice;
01717   struct _DEVICE_OBJECT  *AttachedDevice;
01718   struct _IRP  *CurrentIrp;
01719   PIO_TIMER  Timer;
01720   ULONG  Flags;
01721   ULONG  Characteristics;
01722   PVPB  Vpb;
01723   PVOID  DeviceExtension;
01724   DEVICE_TYPE  DeviceType;
01725   CCHAR  StackSize;
01726   union {
01727     LIST_ENTRY  ListEntry;
01728     WAIT_CONTEXT_BLOCK  Wcb;
01729   } Queue;
01730   ULONG  AlignmentRequirement;
01731   KDEVICE_QUEUE  DeviceQueue;
01732   KDPC  Dpc;
01733   ULONG  ActiveThreadCount;
01734   PSECURITY_DESCRIPTOR  SecurityDescriptor;
01735   KEVENT  DeviceLock;
01736   USHORT  SectorSize;
01737   USHORT  Spare1;
01738   struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
01739   PVOID  Reserved;
01740 } DEVICE_OBJECT;
01741 typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;
01742 
01743 typedef enum _DEVICE_RELATION_TYPE {
01744   BusRelations,
01745   EjectionRelations,
01746   PowerRelations,
01747   RemovalRelations,
01748   TargetDeviceRelation,
01749   SingleBusRelations
01750 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
01751 
01752 typedef struct _DEVICE_RELATIONS {
01753   ULONG  Count;
01754   PDEVICE_OBJECT Objects[1];
01755 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
01756 
01757 typedef struct _SCATTER_GATHER_ELEMENT {
01758   PHYSICAL_ADDRESS  Address;   
01759   ULONG  Length;          
01760   ULONG_PTR  Reserved;
01761 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
01762 
01763 typedef struct _SCATTER_GATHER_LIST {
01764   ULONG  NumberOfElements;
01765   ULONG_PTR  Reserved;
01766   SCATTER_GATHER_ELEMENT  Elements[0];
01767 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
01768 
01769 typedef struct _MDL {
01770   struct _MDL  *Next;
01771   CSHORT  Size;
01772   CSHORT  MdlFlags;
01773   struct _EPROCESS  *Process;
01774   PVOID  MappedSystemVa;
01775   PVOID  StartVa;
01776   ULONG  ByteCount;
01777   ULONG  ByteOffset;
01778 } MDL, *PMDL;
01779 
01780 #define MDL_MAPPED_TO_SYSTEM_VA           0x0001
01781 #define MDL_PAGES_LOCKED                  0x0002
01782 #define MDL_SOURCE_IS_NONPAGED_POOL       0x0004
01783 #define MDL_ALLOCATED_FIXED_SIZE          0x0008
01784 #define MDL_PARTIAL                       0x0010
01785 #define MDL_PARTIAL_HAS_BEEN_MAPPED       0x0020
01786 #define MDL_IO_PAGE_READ                  0x0040
01787 #define MDL_WRITE_OPERATION               0x0080
01788 #define MDL_PARENT_MAPPED_SYSTEM_VA       0x0100
01789 #define MDL_FREE_EXTRA_PTES               0x0200
01790 #define MDL_IO_SPACE                      0x0800
01791 #define MDL_NETWORK_HEADER                0x1000
01792 #define MDL_MAPPING_CAN_FAIL              0x2000
01793 #define MDL_ALLOCATED_MUST_SUCCEED        0x4000
01794 
01795 #define MDL_MAPPING_FLAGS ( \
01796   MDL_MAPPED_TO_SYSTEM_VA     | \
01797   MDL_PAGES_LOCKED            | \
01798   MDL_SOURCE_IS_NONPAGED_POOL | \
01799   MDL_PARTIAL_HAS_BEEN_MAPPED | \
01800   MDL_PARENT_MAPPED_SYSTEM_VA | \
01801   MDL_SYSTEM_VA               | \
01802   MDL_IO_SPACE)
01803 
01804 typedef VOID DDKAPI
01805 (*PPUT_DMA_ADAPTER)(
01806   /*IN*/ PDMA_ADAPTER  DmaAdapter);
01807 
01808 typedef PVOID DDKAPI
01809 (*PALLOCATE_COMMON_BUFFER)(
01810   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01811   /*IN*/ ULONG  Length,
01812   /*OUT*/ PPHYSICAL_ADDRESS  LogicalAddress,
01813   /*IN*/ BOOLEAN  CacheEnabled);
01814 
01815 typedef VOID DDKAPI
01816 (*PFREE_COMMON_BUFFER)(
01817   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01818   /*IN*/ ULONG  Length,
01819   /*IN*/ PHYSICAL_ADDRESS  LogicalAddress,
01820   /*IN*/ PVOID  VirtualAddress,
01821   /*IN*/ BOOLEAN  CacheEnabled);
01822 
01823 typedef NTSTATUS DDKAPI
01824 (*PALLOCATE_ADAPTER_CHANNEL)(
01825   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01826   /*IN*/ PDEVICE_OBJECT  DeviceObject,
01827   /*IN*/ ULONG  NumberOfMapRegisters,
01828   /*IN*/ PDRIVER_CONTROL  ExecutionRoutine,
01829   /*IN*/ PVOID  Context);
01830 
01831 typedef BOOLEAN DDKAPI
01832 (*PFLUSH_ADAPTER_BUFFERS)(
01833   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01834   /*IN*/ PMDL  Mdl,
01835   /*IN*/ PVOID  MapRegisterBase,
01836   /*IN*/ PVOID  CurrentVa,
01837   /*IN*/ ULONG  Length,
01838   /*IN*/ BOOLEAN  WriteToDevice);
01839 
01840 typedef VOID DDKAPI
01841 (*PFREE_ADAPTER_CHANNEL)(
01842   /*IN*/ PDMA_ADAPTER  DmaAdapter);
01843 
01844 typedef VOID DDKAPI
01845 (*PFREE_MAP_REGISTERS)(
01846   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01847   PVOID  MapRegisterBase,
01848   ULONG  NumberOfMapRegisters);
01849 
01850 typedef PHYSICAL_ADDRESS DDKAPI
01851 (*PMAP_TRANSFER)(
01852   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01853   /*IN*/ PMDL  Mdl,
01854   /*IN*/ PVOID  MapRegisterBase,
01855   /*IN*/ PVOID  CurrentVa,
01856   /*IN OUT*/ PULONG  Length,
01857   /*IN*/ BOOLEAN  WriteToDevice);
01858 
01859 typedef ULONG DDKAPI
01860 (*PGET_DMA_ALIGNMENT)(
01861   /*IN*/ PDMA_ADAPTER  DmaAdapter);
01862 
01863 typedef ULONG DDKAPI
01864 (*PREAD_DMA_COUNTER)(
01865   /*IN*/ PDMA_ADAPTER  DmaAdapter);
01866 
01867 typedef NTSTATUS DDKAPI
01868 (*PGET_SCATTER_GATHER_LIST)(
01869   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01870   /*IN*/ PDEVICE_OBJECT  DeviceObject,
01871   /*IN*/ PMDL  Mdl,
01872   /*IN*/ PVOID  CurrentVa,
01873   /*IN*/ ULONG  Length,
01874   /*IN*/ PDRIVER_LIST_CONTROL  ExecutionRoutine,
01875   /*IN*/ PVOID  Context,
01876   /*IN*/ BOOLEAN  WriteToDevice);
01877 
01878 typedef VOID DDKAPI
01879 (*PPUT_SCATTER_GATHER_LIST)(
01880   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01881   /*IN*/ PSCATTER_GATHER_LIST  ScatterGather,
01882   /*IN*/ BOOLEAN  WriteToDevice);
01883 
01884 typedef NTSTATUS DDKAPI
01885 (*PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
01886   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01887   /*IN*/ PMDL  Mdl  /*OPTIONAL*/,
01888   /*IN*/ PVOID  CurrentVa,
01889   /*IN*/ ULONG  Length,
01890   /*OUT*/ PULONG  ScatterGatherListSize,
01891   /*OUT*/ PULONG  pNumberOfMapRegisters  /*OPTIONAL*/);
01892 
01893 typedef NTSTATUS DDKAPI
01894 (*PBUILD_SCATTER_GATHER_LIST)(
01895   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01896   /*IN*/ PDEVICE_OBJECT  DeviceObject,
01897   /*IN*/ PMDL  Mdl,
01898   /*IN*/ PVOID  CurrentVa,
01899   /*IN*/ ULONG  Length,
01900   /*IN*/ PDRIVER_LIST_CONTROL  ExecutionRoutine,
01901   /*IN*/ PVOID  Context,
01902   /*IN*/ BOOLEAN  WriteToDevice,
01903   /*IN*/ PVOID  ScatterGatherBuffer,
01904   /*IN*/ ULONG  ScatterGatherLength);
01905 
01906 typedef NTSTATUS DDKAPI
01907 (*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
01908   /*IN*/ PDMA_ADAPTER  DmaAdapter,
01909   /*IN*/ PSCATTER_GATHER_LIST  ScatterGather,
01910   /*IN*/ PMDL  OriginalMdl,
01911   /*OUT*/ PMDL  *TargetMdl);
01912 
01913 typedef struct _DMA_OPERATIONS {
01914   ULONG  Size;
01915   PPUT_DMA_ADAPTER  PutDmaAdapter;
01916   PALLOCATE_COMMON_BUFFER  AllocateCommonBuffer;
01917   PFREE_COMMON_BUFFER  FreeCommonBuffer;
01918   PALLOCATE_ADAPTER_CHANNEL  AllocateAdapterChannel;
01919   PFLUSH_ADAPTER_BUFFERS  FlushAdapterBuffers;
01920   PFREE_ADAPTER_CHANNEL  FreeAdapterChannel;
01921   PFREE_MAP_REGISTERS  FreeMapRegisters;
01922   PMAP_TRANSFER  MapTransfer;
01923   PGET_DMA_ALIGNMENT  GetDmaAlignment;
01924   PREAD_DMA_COUNTER  ReadDmaCounter;
01925   PGET_SCATTER_GATHER_LIST  GetScatterGatherList;
01926   PPUT_SCATTER_GATHER_LIST  PutScatterGatherList;
01927   PCALCULATE_SCATTER_GATHER_LIST_SIZE  CalculateScatterGatherList;
01928   PBUILD_SCATTER_GATHER_LIST  BuildScatterGatherList;
01929   PBUILD_MDL_FROM_SCATTER_GATHER_LIST  BuildMdlFromScatterGatherList;
01930 } DMA_OPERATIONS, *PDMA_OPERATIONS;
01931 
01932 typedef struct _DMA_ADAPTER {
01933   USHORT  Version;
01934   USHORT  Size;
01935   PDMA_OPERATIONS  DmaOperations;
01936 } DMA_ADAPTER;
01937 
01938 typedef enum _FILE_INFORMATION_CLASS {
01939   FileDirectoryInformation = 1,
01940   FileFullDirectoryInformation,
01941   FileBothDirectoryInformation,
01942   FileBasicInformation,
01943   FileStandardInformation,
01944   FileInternalInformation,
01945   FileEaInformation,
01946   FileAccessInformation,
01947   FileNameInformation,
01948   FileRenameInformation,
01949   FileLinkInformation,
01950   FileNamesInformation,
01951   FileDispositionInformation,
01952   FilePositionInformation,
01953   FileFullEaInformation,
01954   FileModeInformation,
01955   FileAlignmentInformation,
01956   FileAllInformation,
01957   FileAllocationInformation,
01958   FileEndOfFileInformation,
01959   FileAlternateNameInformation,
01960   FileStreamInformation,
01961   FilePipeInformation,
01962   FilePipeLocalInformation,
01963   FilePipeRemoteInformation,
01964   FileMailslotQueryInformation,
01965   FileMailslotSetInformation,
01966   FileCompressionInformation,
01967   FileObjectIdInformation,
01968   FileCompletionInformation,
01969   FileMoveClusterInformation,
01970   FileQuotaInformation,
01971   FileReparsePointInformation,
01972   FileNetworkOpenInformation,
01973   FileAttributeTagInformation,
01974   FileTrackingInformation,
01975   FileIdBothDirectoryInformation,
01976   FileIdFullDirectoryInformation,
01977   FileValidDataLengthInformation,
01978   FileShortNameInformation,
01979   FileMaximumInformation
01980 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
01981 
01982 typedef struct _FILE_POSITION_INFORMATION {                 
01983   LARGE_INTEGER  CurrentByteOffset;                        
01984 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;   
01985 
01986 typedef struct _FILE_ALIGNMENT_INFORMATION {
01987   ULONG  AlignmentRequirement;
01988 } FILE_ALIGNMENT_INFORMATION;
01989 
01990 typedef struct _FILE_NAME_INFORMATION {                     
01991   ULONG  FileNameLength;                                   
01992   WCHAR  FileName[1];                                      
01993 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;           
01994 
01995 typedef struct _FILE_BASIC_INFORMATION {
01996   LARGE_INTEGER  CreationTime;
01997   LARGE_INTEGER  LastAccessTime;
01998   LARGE_INTEGER  LastWriteTime;
01999   LARGE_INTEGER  ChangeTime;
02000   ULONG  FileAttributes;
02001 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
02002 
02003 typedef struct _FILE_STANDARD_INFORMATION {
02004   LARGE_INTEGER  AllocationSize;
02005   LARGE_INTEGER  EndOfFile;
02006   ULONG  NumberOfLinks;
02007   BOOLEAN  DeletePending;
02008   BOOLEAN  Directory;
02009 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
02010 
02011 typedef struct _FILE_NETWORK_OPEN_INFORMATION {                 
02012   LARGE_INTEGER  CreationTime;                                 
02013   LARGE_INTEGER  LastAccessTime;                               
02014   LARGE_INTEGER  LastWriteTime;                                
02015   LARGE_INTEGER  ChangeTime;                                   
02016   LARGE_INTEGER  AllocationSize;                               
02017   LARGE_INTEGER  EndOfFile;                                    
02018   ULONG  FileAttributes;                                       
02019 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;   
02020 
02021 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {               
02022   ULONG  FileAttributes;                                       
02023   ULONG  ReparseTag;                                           
02024 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
02025 
02026 typedef struct _FILE_DISPOSITION_INFORMATION {                  
02027   BOOLEAN  DoDeleteFile;                                         
02028 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; 
02029                                                                 
02030 typedef struct _FILE_END_OF_FILE_INFORMATION {                  
02031   LARGE_INTEGER  EndOfFile;                                    
02032 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; 
02033                                                                 
02034 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {                                    
02035   LARGE_INTEGER  ValidDataLength;                                                      
02036 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;             
02037 
02038 typedef enum _FSINFOCLASS {
02039   FileFsVolumeInformation = 1,
02040   FileFsLabelInformation,
02041   FileFsSizeInformation,
02042   FileFsDeviceInformation,
02043   FileFsAttributeInformation,
02044   FileFsControlInformation,
02045   FileFsFullSizeInformation,
02046   FileFsObjectIdInformation,
02047   FileFsDriverPathInformation,
02048   FileFsMaximumInformation
02049 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
02050 
02051 typedef struct _FILE_FS_DEVICE_INFORMATION {
02052   DEVICE_TYPE  DeviceType;
02053   ULONG  Characteristics;
02054 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
02055 
02056 typedef struct _FILE_FULL_EA_INFORMATION {
02057   ULONG  NextEntryOffset;
02058   UCHAR  Flags;
02059   UCHAR  EaNameLength;
02060   USHORT  EaValueLength;
02061   CHAR  EaName[1];
02062 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
02063 
02064 typedef ULONG_PTR ERESOURCE_THREAD;
02065 typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
02066 
02067 typedef struct _OWNER_ENTRY {
02068   ERESOURCE_THREAD  OwnerThread;
02069   _ANONYMOUS_UNION union {
02070       LONG  OwnerCount;
02071       ULONG  TableSize;
02072   } DUMMYUNIONNAME;
02073 } OWNER_ENTRY, *POWNER_ENTRY;
02074 
02075 /* ERESOURCE.Flag */
02076 
02077 #define ResourceNeverExclusive            0x0010
02078 #define ResourceReleaseByOtherThread      0x0020
02079 #define ResourceOwnedExclusive            0x0080
02080 
02081 #define RESOURCE_HASH_TABLE_SIZE          64
02082 
02083 typedef struct _ERESOURCE {
02084   LIST_ENTRY  SystemResourcesList;
02085   POWNER_ENTRY  OwnerTable;
02086   SHORT  ActiveCount;
02087   USHORT  Flag;
02088   PKSEMAPHORE  SharedWaiters;
02089   PKEVENT  ExclusiveWaiters;
02090   OWNER_ENTRY  OwnerThreads[2];
02091   ULONG  ContentionCount;
02092   USHORT  NumberOfSharedWaiters;
02093   USHORT  NumberOfExclusiveWaiters;
02094   _ANONYMOUS_UNION union {
02095     PVOID  Address;
02096     ULONG_PTR  CreatorBackTraceIndex;
02097   } DUMMYUNIONNAME;
02098   KSPIN_LOCK  SpinLock;
02099 } ERESOURCE, *PERESOURCE;
02100 
02101 /* NOTE: PVOID for methods to avoid 'assignment from incompatible pointer type' warning */
02102 typedef struct _DRIVER_EXTENSION {
02103   struct _DRIVER_OBJECT  *DriverObject;
02104   PVOID  AddDevice;
02105   ULONG  Count;
02106   UNICODE_STRING  ServiceKeyName;
02107 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
02108 
02109 typedef BOOLEAN DDKAPI
02110 (*PFAST_IO_CHECK_IF_POSSIBLE)(
02111   /*IN*/ struct _FILE_OBJECT  *FileObject,
02112   /*IN*/ PLARGE_INTEGER  FileOffset,
02113   /*IN*/ ULONG  Length,
02114   /*IN*/ BOOLEAN  Wait,
02115   /*IN*/ ULONG  LockKey,
02116   /*IN*/ BOOLEAN  CheckForReadOperation,
02117   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02118   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02119 
02120 typedef BOOLEAN DDKAPI
02121 (*PFAST_IO_READ)(
02122   /*IN*/ struct _FILE_OBJECT  *FileObject,
02123   /*IN*/ PLARGE_INTEGER  FileOffset,
02124   /*IN*/ ULONG  Length,
02125   /*IN*/ BOOLEAN  Wait,
02126   /*IN*/ ULONG  LockKey,
02127   /*OUT*/ PVOID  Buffer,
02128   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02129   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02130 
02131 typedef BOOLEAN DDKAPI
02132 (*PFAST_IO_WRITE)(
02133   /*IN*/ struct _FILE_OBJECT  *FileObject,
02134   /*IN*/ PLARGE_INTEGER  FileOffset,
02135   /*IN*/ ULONG  Length,
02136   /*IN*/ BOOLEAN  Wait,
02137   /*IN*/ ULONG  LockKey,
02138   /*IN*/ PVOID  Buffer,
02139   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02140   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02141 
02142 typedef BOOLEAN DDKAPI
02143 (*PFAST_IO_QUERY_BASIC_INFO)(
02144   /*IN*/ struct _FILE_OBJECT  *FileObject,
02145   /*IN*/ BOOLEAN  Wait,
02146   /*OUT*/ PFILE_BASIC_INFORMATION  Buffer,
02147   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02148   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02149 
02150 typedef BOOLEAN DDKAPI
02151 (*PFAST_IO_QUERY_STANDARD_INFO)(
02152   /*IN*/ struct _FILE_OBJECT  *FileObject,
02153   /*IN*/ BOOLEAN  Wait,
02154   /*OUT*/ PFILE_STANDARD_INFORMATION  Buffer,
02155   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02156   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02157 
02158 typedef BOOLEAN DDKAPI
02159 (*PFAST_IO_LOCK)(
02160   /*IN*/ struct _FILE_OBJECT  *FileObject,
02161   /*IN*/ PLARGE_INTEGER  FileOffset,
02162   /*IN*/ PLARGE_INTEGER  Length,
02163   PEPROCESS  ProcessId,
02164   ULONG  Key,
02165   BOOLEAN  FailImmediately,
02166   BOOLEAN  ExclusiveLock,
02167   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02168   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02169 
02170 typedef BOOLEAN DDKAPI
02171 (*PFAST_IO_UNLOCK_SINGLE)(
02172   /*IN*/ struct _FILE_OBJECT  *FileObject,
02173   /*IN*/ PLARGE_INTEGER  FileOffset,
02174   /*IN*/ PLARGE_INTEGER  Length,
02175   PEPROCESS  ProcessId,
02176   ULONG  Key,
02177   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02178   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02179 
02180 typedef BOOLEAN DDKAPI
02181 (*PFAST_IO_UNLOCK_ALL)(
02182   /*IN*/ struct _FILE_OBJECT  *FileObject,
02183   PEPROCESS  ProcessId,
02184   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02185   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02186 
02187 typedef BOOLEAN DDKAPI
02188 (*PFAST_IO_UNLOCK_ALL_BY_KEY)(
02189   /*IN*/ struct _FILE_OBJECT  *FileObject,
02190   PVOID  ProcessId,
02191   ULONG  Key,
02192   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02193   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02194 
02195 typedef BOOLEAN DDKAPI
02196 (*PFAST_IO_DEVICE_CONTROL)(
02197   /*IN*/ struct _FILE_OBJECT  *FileObject,
02198   /*IN*/ BOOLEAN  Wait,
02199   /*IN*/ PVOID  InputBuffer  /*OPTIONAL*/,
02200   /*IN*/ ULONG  InputBufferLength,
02201   /*OUT*/ PVOID  OutputBuffer  /*OPTIONAL*/,
02202   /*IN*/ ULONG  OutputBufferLength,
02203   /*IN*/ ULONG  IoControlCode,
02204   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02205   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02206 
02207 typedef VOID DDKAPI
02208 (*PFAST_IO_ACQUIRE_FILE)(
02209   /*IN*/ struct _FILE_OBJECT  *FileObject);
02210 
02211 typedef VOID DDKAPI
02212 (*PFAST_IO_RELEASE_FILE)(
02213   /*IN*/ struct _FILE_OBJECT  *FileObject);
02214 
02215 typedef VOID DDKAPI
02216 (*PFAST_IO_DETACH_DEVICE)(
02217   /*IN*/ struct _DEVICE_OBJECT  *SourceDevice,
02218   /*IN*/ struct _DEVICE_OBJECT  *TargetDevice);
02219 
02220 typedef BOOLEAN DDKAPI
02221 (*PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
02222   /*IN*/ struct _FILE_OBJECT  *FileObject,
02223   /*IN*/ BOOLEAN  Wait,
02224   /*OUT*/ struct _FILE_NETWORK_OPEN_INFORMATION  *Buffer,
02225   /*OUT*/ struct _IO_STATUS_BLOCK  *IoStatus,
02226   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02227 
02228 typedef NTSTATUS DDKAPI
02229 (*PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
02230   /*IN*/ struct _FILE_OBJECT  *FileObject,
02231   /*IN*/ PLARGE_INTEGER  EndingOffset,
02232   /*OUT*/ struct _ERESOURCE  **ResourceToRelease,
02233   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02234 
02235 typedef BOOLEAN DDKAPI
02236 (*PFAST_IO_MDL_READ)(
02237   /*IN*/ struct _FILE_OBJECT  *FileObject,
02238   /*IN*/ PLARGE_INTEGER  FileOffset,
02239   /*IN*/ ULONG  Length,
02240   /*IN*/ ULONG  LockKey,
02241   /*OUT*/ PMDL  *MdlChain,
02242   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02243   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02244 
02245 typedef BOOLEAN DDKAPI
02246 (*PFAST_IO_MDL_READ_COMPLETE)(
02247   /*IN*/ struct _FILE_OBJECT *FileObject,
02248   /*IN*/ PMDL MdlChain,
02249   /*IN*/ struct _DEVICE_OBJECT *DeviceObject);
02250 
02251 typedef BOOLEAN DDKAPI
02252 (*PFAST_IO_PREPARE_MDL_WRITE)(
02253   /*IN*/ struct _FILE_OBJECT  *FileObject,
02254   /*IN*/ PLARGE_INTEGER  FileOffset,
02255   /*IN*/ ULONG  Length,
02256   /*IN*/ ULONG  LockKey,
02257   /*OUT*/ PMDL  *MdlChain,
02258   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02259   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02260 
02261 typedef BOOLEAN DDKAPI
02262 (*PFAST_IO_MDL_WRITE_COMPLETE)(
02263   /*IN*/ struct _FILE_OBJECT  *FileObject,
02264   /*IN*/ PLARGE_INTEGER  FileOffset,
02265   /*IN*/ PMDL  MdlChain,
02266   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02267 
02268 typedef BOOLEAN DDKAPI
02269 (*PFAST_IO_READ_COMPRESSED)(
02270   /*IN*/ struct _FILE_OBJECT  *FileObject,
02271   /*IN*/ PLARGE_INTEGER  FileOffset,
02272   /*IN*/ ULONG  Length,
02273   /*IN*/ ULONG  LockKey,
02274   /*OUT*/ PVOID  Buffer,
02275   /*OUT*/ PMDL  *MdlChain,
02276   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02277   /*OUT*/ struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
02278   /*IN*/ ULONG  CompressedDataInfoLength,
02279   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02280 
02281 typedef BOOLEAN DDKAPI
02282 (*PFAST_IO_WRITE_COMPRESSED)(
02283   /*IN*/ struct _FILE_OBJECT  *FileObject,
02284   /*IN*/ PLARGE_INTEGER  FileOffset,
02285   /*IN*/ ULONG  Length,
02286   /*IN*/ ULONG  LockKey,
02287   /*IN*/ PVOID  Buffer,
02288   /*OUT*/ PMDL  *MdlChain,
02289   /*OUT*/ PIO_STATUS_BLOCK  IoStatus,
02290   /*IN*/ struct _COMPRESSED_DATA_INFO  *CompressedDataInfo,
02291   /*IN*/ ULONG  CompressedDataInfoLength,
02292   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02293 
02294 typedef BOOLEAN DDKAPI
02295 (*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
02296   /*IN*/ struct _FILE_OBJECT  *FileObject,
02297   /*IN*/ PMDL  MdlChain,
02298   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02299 
02300 typedef BOOLEAN DDKAPI
02301 (*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
02302   /*IN*/ struct _FILE_OBJECT  *FileObject,
02303   /*IN*/ PLARGE_INTEGER  FileOffset,
02304   /*IN*/ PMDL  MdlChain,
02305   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02306 
02307 typedef BOOLEAN DDKAPI
02308 (*PFAST_IO_QUERY_OPEN)(
02309   /*IN*/ struct _IRP  *Irp,
02310   /*OUT*/ PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation,
02311   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02312 
02313 typedef NTSTATUS DDKAPI
02314 (*PFAST_IO_RELEASE_FOR_MOD_WRITE)(
02315   /*IN*/ struct _FILE_OBJECT  *FileObject,
02316   /*IN*/ struct _ERESOURCE  *ResourceToRelease,
02317   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02318 
02319 typedef NTSTATUS DDKAPI
02320 (*PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
02321   /*IN*/ struct _FILE_OBJECT  *FileObject,
02322   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02323 
02324 typedef NTSTATUS DDKAPI
02325 (*PFAST_IO_RELEASE_FOR_CCFLUSH) (
02326   /*IN*/ struct _FILE_OBJECT  *FileObject,
02327   /*IN*/ struct _DEVICE_OBJECT  *DeviceObject);
02328 
02329 typedef struct _FAST_IO_DISPATCH {
02330   ULONG  SizeOfFastIoDispatch;
02331   PFAST_IO_CHECK_IF_POSSIBLE  FastIoCheckIfPossible;
02332   PFAST_IO_READ  FastIoRead;
02333   PFAST_IO_WRITE  FastIoWrite;
02334   PFAST_IO_QUERY_BASIC_INFO  FastIoQueryBasicInfo;
02335   PFAST_IO_QUERY_STANDARD_INFO  FastIoQueryStandardInfo;
02336   PFAST_IO_LOCK  FastIoLock;
02337   PFAST_IO_UNLOCK_SINGLE  FastIoUnlockSingle;
02338   PFAST_IO_UNLOCK_ALL  FastIoUnlockAll;
02339   PFAST_IO_UNLOCK_ALL_BY_KEY  FastIoUnlockAllByKey;
02340   PFAST_IO_DEVICE_CONTROL  FastIoDeviceControl;
02341   PFAST_IO_ACQUIRE_FILE  AcquireFileForNtCreateSection;
02342   PFAST_IO_RELEASE_FILE  ReleaseFileForNtCreateSection;
02343   PFAST_IO_DETACH_DEVICE  FastIoDetachDevice;
02344   PFAST_IO_QUERY_NETWORK_OPEN_INFO  FastIoQueryNetworkOpenInfo;
02345   PFAST_IO_ACQUIRE_FOR_MOD_WRITE  AcquireForModWrite;
02346   PFAST_IO_MDL_READ  MdlRead;
02347   PFAST_IO_MDL_READ_COMPLETE  MdlReadComplete;
02348   PFAST_IO_PREPARE_MDL_WRITE  PrepareMdlWrite;
02349   PFAST_IO_MDL_WRITE_COMPLETE  MdlWriteComplete;
02350   PFAST_IO_READ_COMPRESSED  FastIoReadCompressed;
02351   PFAST_IO_WRITE_COMPRESSED  FastIoWriteCompressed;
02352   PFAST_IO_MDL_READ_COMPLETE_COMPRESSED  MdlReadCompleteCompressed;
02353   PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED  MdlWriteCompleteCompressed;
02354   PFAST_IO_QUERY_OPEN  FastIoQueryOpen;
02355   PFAST_IO_RELEASE_FOR_MOD_WRITE  ReleaseForModWrite;
02356   PFAST_IO_ACQUIRE_FOR_CCFLUSH  AcquireForCcFlush;
02357   PFAST_IO_RELEASE_FOR_CCFLUSH  ReleaseForCcFlush;
02358 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
02359 
02360 typedef struct _DRIVER_OBJECT {
02361   CSHORT  Type;
02362   CSHORT  Size;
02363   PDEVICE_OBJECT  DeviceObject;
02364   ULONG  Flags;
02365   PVOID  DriverStart;
02366   ULONG  DriverSize;
02367   PVOID  DriverSection;
02368   PDRIVER_EXTENSION  DriverExtension;
02369   UNICODE_STRING  DriverName;
02370   PUNICODE_STRING  HardwareDatabase;
02371   PFAST_IO_DISPATCH  FastIoDispatch;
02372   PDRIVER_INITIALIZE  DriverInit;
02373   PDRIVER_STARTIO  DriverStartIo;
02374   PDRIVER_UNLOAD  DriverUnload;
02375   PDRIVER_DISPATCH  MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
02376 } DRIVER_OBJECT;
02377 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
02378 
02379 typedef struct _SECTION_OBJECT_POINTERS {
02380   PVOID  DataSectionObject;
02381   PVOID  SharedCacheMap;
02382   PVOID  ImageSectionObject;
02383 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
02384 
02385 typedef struct _IO_COMPLETION_CONTEXT {
02386   PVOID  Port;
02387   PVOID  Key;
02388 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
02389 
02390 /* FILE_OBJECT.Flags */
02391 
02392 #define FO_FILE_OPEN                      0x00000001
02393 #define FO_SYNCHRONOUS_IO                 0x00000002
02394 #define FO_ALERTABLE_IO                   0x00000004
02395 #define FO_NO_INTERMEDIATE_BUFFERING      0x00000008
02396 #define FO_WRITE_THROUGH                  0x00000010
02397 #define FO_SEQUENTIAL_ONLY                0x00000020
02398 #define FO_CACHE_SUPPORTED                0x00000040
02399 #define FO_NAMED_PIPE                     0x00000080
02400 #define FO_STREAM_FILE                    0x00000100
02401 #define FO_MAILSLOT                       0x00000200
02402 #define FO_GENERATE_AUDIT_ON_CLOSE        0x00000400
02403 #define FO_DIRECT_DEVICE_OPEN             0x00000800
02404 #define FO_FILE_MODIFIED                  0x00001000
02405 #define FO_FILE_SIZE_CHANGED              0x00002000
02406 #define FO_CLEANUP_COMPLETE               0x00004000
02407 #define FO_TEMPORARY_FILE                 0x00008000
02408 #define FO_DELETE_ON_CLOSE                0x00010000
02409 #define FO_OPENED_CASE_SENSITIVE          0x00020000
02410 #define FO_HANDLE_CREATED                 0x00040000
02411 #define FO_FILE_FAST_IO_READ              0x00080000
02412 #define FO_RANDOM_ACCESS                  0x00100000
02413 #define FO_FILE_OPEN_CANCELLED            0x00200000
02414 #define FO_VOLUME_OPEN                    0x00400000
02415 #define FO_FILE_OBJECT_HAS_EXTENSION      0x00800000
02416 #define FO_REMOTE_ORIGIN                  0x01000000
02417 
02418 typedef struct _FILE_OBJECT {
02419   CSHORT  Type;
02420   CSHORT  Size;
02421   PDEVICE_OBJECT  DeviceObject;
02422   PVPB  Vpb;
02423   PVOID  FsContext;
02424   PVOID  FsContext2;
02425   PSECTION_OBJECT_POINTERS  SectionObjectPointer;
02426   PVOID  PrivateCacheMap;
02427   NTSTATUS  FinalStatus;
02428   struct _FILE_OBJECT  *RelatedFileObject;
02429   BOOLEAN  LockOperation;
02430   BOOLEAN  DeletePending;
02431   BOOLEAN  ReadAccess;
02432   BOOLEAN  WriteAccess;
02433   BOOLEAN  DeleteAccess;
02434   BOOLEAN  SharedRead;
02435   BOOLEAN  SharedWrite;
02436   BOOLEAN  SharedDelete;
02437   ULONG  Flags;
02438   UNICODE_STRING  FileName;
02439   LARGE_INTEGER  CurrentByteOffset;
02440   ULONG  Waiters;
02441   ULONG  Busy;
02442   PVOID  LastLock;
02443   KEVENT  Lock;
02444   KEVENT  Event;
02445   PIO_COMPLETION_CONTEXT  CompletionContext;
02446 } FILE_OBJECT;
02447 typedef struct _FILE_OBJECT *PFILE_OBJECT;
02448 
02449 typedef enum _SECURITY_OPERATION_CODE {
02450   SetSecurityDescriptor,
02451   QuerySecurityDescriptor,
02452   DeleteSecurityDescriptor,
02453   AssignSecurityDescriptor
02454 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
02455 
02456 #define INITIAL_PRIVILEGE_COUNT           3
02457 
02458 typedef struct _INITIAL_PRIVILEGE_SET {
02459   ULONG  PrivilegeCount;
02460   ULONG  Control;
02461   LUID_AND_ATTRIBUTES  Privilege[INITIAL_PRIVILEGE_COUNT];
02462 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
02463 
02464 typedef struct _SECURITY_SUBJECT_CONTEXT {
02465   PACCESS_TOKEN  ClientToken;
02466   SECURITY_IMPERSONATION_LEVEL  ImpersonationLevel;
02467   PACCESS_TOKEN  PrimaryToken;
02468   PVOID  ProcessAuditId;
02469 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
02470 
02471 #include <pshpack4.h>
02472 typedef struct _ACCESS_STATE {
02473   LUID  OperationID;
02474   BOOLEAN  SecurityEvaluated;
02475   BOOLEAN  GenerateAudit;
02476   BOOLEAN  GenerateOnClose;
02477   BOOLEAN  PrivilegesAllocated;
02478   ULONG  Flags;
02479   ACCESS_MASK  RemainingDesiredAccess;
02480   ACCESS_MASK  PreviouslyGrantedAccess;
02481   ACCESS_MASK  OriginalDesiredAccess;
02482   SECURITY_SUBJECT_CONTEXT  SubjectSecurityContext;
02483   PSECURITY_DESCRIPTOR  SecurityDescriptor;
02484   PVOID  AuxData;
02485   union {
02486     INITIAL_PRIVILEGE_SET  InitialPrivilegeSet;
02487     PRIVILEGE_SET  PrivilegeSet;
02488   } Privileges;
02489 
02490   BOOLEAN  AuditPrivileges;
02491   UNICODE_STRING  ObjectName;
02492   UNICODE_STRING  ObjectTypeName;
02493 } ACCESS_STATE, *PACCESS_STATE;
02494 #include <poppack.h>
02495 
02496 typedef struct _IO_SECURITY_CONTEXT {
02497   PSECURITY_QUALITY_OF_SERVICE  SecurityQos;
02498   PACCESS_STATE  AccessState;
02499   ACCESS_MASK  DesiredAccess;
02500   ULONG  FullCreateOptions;
02501 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
02502 
02503 struct _IO_CSQ;
02504 
02505 typedef struct _IO_CSQ_IRP_CONTEXT {
02506   ULONG  Type;
02507   struct _IRP  *Irp;
02508   struct _IO_CSQ  *Csq;
02509 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
02510 
02511 typedef VOID DDKAPI
02512 (*PIO_CSQ_INSERT_IRP)(
02513   /*IN*/ struct _IO_CSQ  *Csq,
02514   /*IN*/ PIRP  Irp);
02515 
02516 typedef VOID DDKAPI
02517 (*PIO_CSQ_REMOVE_IRP)(
02518   /*IN*/ struct _IO_CSQ  *Csq,
02519   /*IN*/ PIRP  Irp);
02520 
02521 typedef PIRP DDKAPI
02522 (*PIO_CSQ_PEEK_NEXT_IRP)(
02523   /*IN*/ struct _IO_CSQ  *Csq,
02524   /*IN*/ PIRP  Irp,
02525   /*IN*/ PVOID  PeekContext);
02526 
02527 typedef VOID DDKAPI
02528 (*PIO_CSQ_ACQUIRE_LOCK)(
02529   /*IN*/ struct _IO_CSQ  *Csq,
02530   /*OUT*/ PKIRQL  Irql);
02531 
02532 typedef VOID DDKAPI
02533 (*PIO_CSQ_RELEASE_LOCK)(
02534   /*IN*/ struct _IO_CSQ  *Csq,
02535   /*IN*/ KIRQL  Irql);
02536 
02537 typedef VOID DDKAPI
02538 (*PIO_CSQ_COMPLETE_CANCELED_IRP)(
02539   /*IN*/ struct _IO_CSQ  *Csq,
02540   /*IN*/ PIRP  Irp);
02541 
02542 typedef struct _IO_CSQ {
02543   ULONG  Type;
02544   PIO_CSQ_INSERT_IRP  CsqInsertIrp;
02545   PIO_CSQ_REMOVE_IRP  CsqRemoveIrp;
02546   PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp;
02547   PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock;
02548   PIO_CSQ_RELEASE_LOCK  CsqReleaseLock;
02549   PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp;
02550   PVOID  ReservePointer;
02551 } IO_CSQ, *PIO_CSQ;
02552 
02553 #include <pshpack4.h>
02554 typedef struct _IO_STACK_LOCATION {
02555   UCHAR  MajorFunction;
02556   UCHAR  MinorFunction;
02557   UCHAR  Flags;
02558   UCHAR  Control;
02559   union {
02560     struct {
02561       PIO_SECURITY_CONTEXT  SecurityContext;
02562       ULONG  Options;
02563       USHORT POINTER_ALIGNMENT  FileAttributes;
02564       USHORT  ShareAccess;
02565       ULONG POINTER_ALIGNMENT  EaLength;
02566     } Create;
02567     struct {
02568       ULONG  Length;
02569       ULONG POINTER_ALIGNMENT  Key;
02570       LARGE_INTEGER  ByteOffset;
02571     } Read;
02572     struct {
02573       ULONG  Length;
02574       ULONG POINTER_ALIGNMENT  Key;
02575       LARGE_INTEGER  ByteOffset;
02576     } Write;
02577     struct {
02578       ULONG  Length;
02579       FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
02580     } QueryFile;
02581     struct {
02582       ULONG  Length;
02583       FILE_INFORMATION_CLASS POINTER_ALIGNMENT  FileInformationClass;
02584       PFILE_OBJECT  FileObject;
02585       _ANONYMOUS_UNION union {
02586         _ANONYMOUS_STRUCT struct {
02587           BOOLEAN  ReplaceIfExists;
02588           BOOLEAN  AdvanceOnly;
02589         } DUMMYSTRUCTNAME;
02590         ULONG  ClusterCount;
02591         HANDLE  DeleteHandle;
02592       } DUMMYUNIONNAME;
02593     } SetFile;
02594     struct {
02595       ULONG  Length;
02596       FS_INFORMATION_CLASS POINTER_ALIGNMENT  FsInformationClass;
02597     } QueryVolume;
02598     struct {
02599       ULONG  OutputBufferLength;
02600       ULONG POINTER_ALIGNMENT  InputBufferLength;
02601       ULONG POINTER_ALIGNMENT  IoControlCode;
02602       PVOID  Type3InputBuffer;
02603     } DeviceIoControl;
02604     struct {
02605       SECURITY_INFORMATION  SecurityInformation;
02606       ULONG POINTER_ALIGNMENT  Length;
02607     } QuerySecurity;
02608     struct {
02609       SECURITY_INFORMATION  SecurityInformation;
02610       PSECURITY_DESCRIPTOR  SecurityDescriptor;
02611     } SetSecurity;
02612     struct {
02613       PVPB  Vpb;
02614       PDEVICE_OBJECT  DeviceObject;
02615     } MountVolume;
02616     struct {
02617       PVPB  Vpb;
02618       PDEVICE_OBJECT  DeviceObject;
02619     } VerifyVolume;
02620     struct {
02621       struct _SCSI_REQUEST_BLOCK  *Srb;
02622     } Scsi;
02623     struct {
02624       DEVICE_RELATION_TYPE  Type;
02625     } QueryDeviceRelations;
02626     struct {
02627       CONST GUID  *InterfaceType;
02628       USHORT  Size;
02629       USHORT  Version;
02630       PINTERFACE  Interface;
02631       PVOID  InterfaceSpecificData;
02632     } QueryInterface;
02633     struct {
02634       PDEVICE_CAPABILITIES  Capabilities;
02635     } DeviceCapabilities;
02636     struct {
02637       PIO_RESOURCE_REQUIREMENTS_LIST  IoResourceRequirementList;
02638     } FilterResourceRequirements;
02639     struct {
02640       ULONG  WhichSpace;
02641       PVOID  Buffer;
02642       ULONG  Offset;
02643       ULONG POINTER_ALIGNMENT  Length;
02644     } ReadWriteConfig;
02645     struct {
02646       BOOLEAN  Lock;
02647     } SetLock;
02648     struct {
02649       BUS_QUERY_ID_TYPE  IdType;
02650     } QueryId;
02651     struct {
02652       DEVICE_TEXT_TYPE  DeviceTextType;
02653       LCID POINTER_ALIGNMENT  LocaleId;
02654     } QueryDeviceText;
02655     struct {
02656       BOOLEAN  InPath;
02657       BOOLEAN  Reserved[3];
02658       DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT  Type;
02659     } UsageNotification;
02660     struct {
02661       SYSTEM_POWER_STATE  PowerState;
02662     } WaitWake;
02663     struct {
02664       PPOWER_SEQUENCE  PowerSequence;
02665     } PowerSequence;
02666     struct {
02667       ULONG  SystemContext;
02668       POWER_STATE_TYPE POINTER_ALIGNMENT  Type;
02669       POWER_STATE POINTER_ALIGNMENT  State;
02670       POWER_ACTION POINTER_ALIGNMENT  ShutdownType;
02671     } Power;
02672     struct {
02673       PCM_RESOURCE_LIST  AllocatedResources;
02674       PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
02675     } StartDevice;
02676     struct {
02677       ULONG_PTR  ProviderId;
02678       PVOID  DataPath;
02679       ULONG  BufferSize;
02680       PVOID  Buffer;
02681     } WMI;
02682     struct {
02683       PVOID  Argument1;
02684       PVOID  Argument2;
02685       PVOID  Argument3;
02686       PVOID  Argument4;
02687     } Others;
02688   } Parameters;
02689   PDEVICE_OBJECT  DeviceObject;
02690   PFILE_OBJECT  FileObject;
02691   PIO_COMPLETION_ROUTINE  CompletionRoutine;
02692   PVOID  Context;
02693 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
02694 #include <poppack.h>
02695 
02696 /* IO_STACK_LOCATION.Control */
02697 
02698 #define SL_PENDING_RETURNED               0x01
02699 #define SL_INVOKE_ON_CANCEL               0x20
02700 #define SL_INVOKE_ON_SUCCESS              0x40
02701 #define SL_INVOKE_ON_ERROR                0x80
02702 
02703 typedef enum _KEY_INFORMATION_CLASS {
02704   KeyBasicInformation,
02705   KeyNodeInformation,
02706   KeyFullInformation,
02707   KeyNameInformation,
02708   KeyCachedInformation,
02709   KeyFlagsInformation
02710 } KEY_INFORMATION_CLASS;
02711 
02712 typedef struct _KEY_BASIC_INFORMATION {
02713   LARGE_INTEGER  LastWriteTime;
02714   ULONG  TitleIndex;
02715   ULONG  NameLength;
02716   WCHAR  Name[1];
02717 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
02718 
02719 typedef struct _KEY_FULL_INFORMATION {
02720   LARGE_INTEGER  LastWriteTime;
02721   ULONG  TitleIndex;
02722   ULONG  ClassOffset;
02723   ULONG  ClassLength;
02724   ULONG  SubKeys;
02725   ULONG  MaxNameLen;
02726   ULONG  MaxClassLen;
02727   ULONG  Values;
02728   ULONG  MaxValueNameLen;
02729   ULONG  MaxValueDataLen;
02730   WCHAR  Class[1];
02731 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
02732 
02733 typedef struct _KEY_NODE_INFORMATION {
02734   LARGE_INTEGER  LastWriteTime;
02735   ULONG  TitleIndex;
02736   ULONG  ClassOffset;
02737   ULONG  ClassLength;
02738   ULONG  NameLength;
02739   WCHAR  Name[1];
02740 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
02741 
02742 typedef struct _KEY_VALUE_BASIC_INFORMATION {
02743   ULONG  TitleIndex;
02744   ULONG  Type;
02745   ULONG  NameLength;
02746   WCHAR  Name[1];
02747 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
02748 
02749 typedef struct _KEY_VALUE_FULL_INFORMATION {
02750   ULONG  TitleIndex;
02751   ULONG  Type;
02752   ULONG  DataOffset;
02753   ULONG  DataLength;
02754   ULONG  NameLength;
02755   WCHAR  Name[1];
02756 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
02757 
02758 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
02759   ULONG  TitleIndex;
02760   ULONG  Type;
02761   ULONG  DataLength;
02762   UCHAR  Data[1];
02763 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
02764 
02765 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
02766   ULONG  Type;
02767   ULONG  DataLength;
02768   UCHAR  Data[1];
02769 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
02770 
02771 typedef struct _KEY_VALUE_ENTRY {
02772   PUNICODE_STRING  ValueName;
02773   ULONG  DataLength;
02774   ULONG  DataOffset;
02775   ULONG  Type;
02776 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
02777 
02778 typedef enum _KEY_VALUE_INFORMATION_CLASS {
02779   KeyValueBasicInformation,
02780   KeyValueFullInformation,
02781   KeyValuePartialInformation,
02782   KeyValueFullInformationAlign64,
02783   KeyValuePartialInformationAlign64
02784 } KEY_VALUE_INFORMATION_CLASS;
02785 
02786 /* KEY_VALUE_Xxx.Type */
02787 
02788 #define REG_NONE                           0
02789 #define REG_SZ                             1
02790 #define REG_EXPAND_SZ                      2
02791 #define REG_BINARY                         3
02792 #define REG_DWORD                          4
02793 #define REG_DWORD_LITTLE_ENDIAN            4
02794 #define REG_DWORD_BIG_ENDIAN               5
02795 #define REG_LINK                           6
02796 #define REG_MULTI_SZ                       7
02797 #define REG_RESOURCE_LIST                  8
02798 #define REG_FULL_RESOURCE_DESCRIPTOR       9
02799 #define REG_RESOURCE_REQUIREMENTS_LIST    10
02800 #define REG_QWORD                         11
02801 #define REG_QWORD_LITTLE_ENDIAN           11
02802 
02803 #define PCI_TYPE0_ADDRESSES               6
02804 #define PCI_TYPE1_ADDRESSES               2
02805 #define PCI_TYPE2_ADDRESSES               5
02806 
02807 typedef struct _PCI_COMMON_CONFIG {
02808   USHORT  VendorID;
02809   USHORT  DeviceID;
02810   USHORT  Command;
02811   USHORT  Status;
02812   UCHAR  RevisionID;
02813   UCHAR  ProgIf;
02814   UCHAR  SubClass;
02815   UCHAR  BaseClass;
02816   UCHAR  CacheLineSize;
02817   UCHAR  LatencyTimer;
02818   UCHAR  HeaderType;
02819   UCHAR  BIST;
02820   union {
02821     struct _PCI_HEADER_TYPE_0 {
02822       ULONG  BaseAddresses[PCI_TYPE0_ADDRESSES];
02823       ULONG  CIS;
02824       USHORT  SubVendorID;
02825       USHORT  SubSystemID;
02826       ULONG  ROMBaseAddress;
02827       UCHAR  CapabilitiesPtr;
02828       UCHAR  Reserved1[3];
02829       ULONG  Reserved2;
02830       UCHAR  InterruptLine;
02831       UCHAR  InterruptPin;
02832       UCHAR  MinimumGrant;
02833       UCHAR  MaximumLatency;
02834     } type0;
02835       struct _PCI_HEADER_TYPE_1 {
02836         ULONG  BaseAddresses[PCI_TYPE1_ADDRESSES];
02837         UCHAR  PrimaryBus;
02838         UCHAR  SecondaryBus;
02839         UCHAR  SubordinateBus;
02840         UCHAR  SecondaryLatency;
02841         UCHAR  IOBase;
02842         UCHAR  IOLimit;
02843         USHORT  SecondaryStatus;
02844         USHORT  MemoryBase;
02845         USHORT  MemoryLimit;
02846         USHORT  PrefetchBase;
02847         USHORT  PrefetchLimit;
02848         ULONG  PrefetchBaseUpper32;
02849         ULONG  PrefetchLimitUpper32;
02850         USHORT  IOBaseUpper16;
02851         USHORT  IOLimitUpper16;
02852         UCHAR  CapabilitiesPtr;
02853         UCHAR  Reserved1[3];
02854         ULONG  ROMBaseAddress;
02855         UCHAR  InterruptLine;
02856         UCHAR  InterruptPin;
02857         USHORT  BridgeControl;
02858       } type1;
02859       struct _PCI_HEADER_TYPE_2 {
02860         ULONG  SocketRegistersBaseAddress;
02861         UCHAR  CapabilitiesPtr;
02862         UCHAR  Reserved;
02863         USHORT  SecondaryStatus;
02864         UCHAR  PrimaryBus;
02865         UCHAR  SecondaryBus;
02866         UCHAR  SubordinateBus;
02867         UCHAR  SecondaryLatency;
02868         struct {
02869           ULONG  Base;
02870           ULONG  Limit;
02871         } Range[PCI_TYPE2_ADDRESSES - 1];
02872         UCHAR  InterruptLine;
02873         UCHAR  InterruptPin;
02874         USHORT  BridgeControl;
02875       } type2;
02876   } u;
02877   UCHAR  DeviceSpecific[192];
02878 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
02879 
02880 /* PCI_COMMON_CONFIG.Command */
02881 
02882 #define PCI_ENABLE_IO_SPACE               0x0001
02883 #define PCI_ENABLE_MEMORY_SPACE           0x0002
02884 #define PCI_ENABLE_BUS_MASTER             0x0004
02885 #define PCI_ENABLE_SPECIAL_CYCLES         0x0008
02886 #define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
02887 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
02888 #define PCI_ENABLE_PARITY                 0x0040
02889 #define PCI_ENABLE_WAIT_CYCLE             0x0080
02890 #define PCI_ENABLE_SERR                   0x0100
02891 #define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
02892 
02893 /* PCI_COMMON_CONFIG.Status */
02894 
02895 #define PCI_STATUS_CAPABILITIES_LIST      0x0010
02896 #define PCI_STATUS_66MHZ_CAPABLE          0x0020
02897 #define PCI_STATUS_UDF_SUPPORTED          0x0040
02898 #define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
02899 #define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
02900 #define PCI_STATUS_DEVSEL                 0x0600
02901 #define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
02902 #define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
02903 #define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
02904 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
02905 #define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
02906 
02907 /* PCI_COMMON_CONFIG.HeaderType */
02908 
02909 #define PCI_MULTIFUNCTION                 0x80
02910 #define PCI_DEVICE_TYPE                   0x00
02911 #define PCI_BRIDGE_TYPE                   0x01
02912 #define PCI_CARDBUS_BRIDGE_TYPE           0x02
02913 
02914 #define PCI_CONFIGURATION_TYPE(PciData) \
02915   (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
02916 
02917 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
02918   ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
02919 
02920 typedef struct _PCI_SLOT_NUMBER {
02921   union {
02922     struct {
02923       ULONG  DeviceNumber : 5;
02924       ULONG  FunctionNumber : 3;
02925       ULONG  Reserved : 24;
02926     } bits;
02927     ULONG  AsULONG;
02928   } u;
02929 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
02930 
02931 typedef enum _POOL_TYPE {
02932   NonPagedPool,
02933   PagedPool,
02934   NonPagedPoolMustSucceed,
02935   DontUseThisType,
02936   NonPagedPoolCacheAligned,
02937   PagedPoolCacheAligned,
02938   NonPagedPoolCacheAlignedMustS,
02939     MaxPoolType,
02940     NonPagedPoolSession = 32,
02941     PagedPoolSession,
02942     NonPagedPoolMustSucceedSession,
02943     DontUseThisTypeSession,
02944     NonPagedPoolCacheAlignedSession,
02945     PagedPoolCacheAlignedSession,
02946     NonPagedPoolCacheAlignedMustSSession
02947 } POOL_TYPE;
02948 
02949 typedef enum _EX_POOL_PRIORITY {
02950   LowPoolPriority,
02951   LowPoolPrioritySpecialPoolOverrun = 8,
02952   LowPoolPrioritySpecialPoolUnderrun = 9,
02953   NormalPoolPriority = 16,
02954   NormalPoolPrioritySpecialPoolOverrun = 24,
02955   NormalPoolPrioritySpecialPoolUnderrun = 25,
02956   HighPoolPriority = 32,
02957   HighPoolPrioritySpecialPoolOverrun = 40,
02958   HighPoolPrioritySpecialPoolUnderrun = 41
02959 } EX_POOL_PRIORITY;
02960 
02961 /* PRIVILEGE_SET.Control */
02962 
02963 #define PRIVILEGE_SET_ALL_NECESSARY       1
02964 
02965 typedef struct _RTL_OSVERSIONINFOW {
02966   ULONG  dwOSVersionInfoSize;
02967   ULONG  dwMajorVersion;
02968   ULONG  dwMinorVersion;
02969   ULONG  dwBuildNumber;
02970   ULONG  dwPlatformId;
02971   WCHAR  szCSDVersion[128];
02972 } RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
02973 
02974 typedef struct _RTL_OSVERSIONINFOEXW {
02975   ULONG  dwOSVersionInfoSize;
02976   ULONG  dwMajorVersion;
02977   ULONG  dwMinorVersion;
02978   ULONG  dwBuildNumber;
02979   ULONG  dwPlatformId;
02980   WCHAR  szCSDVersion[128];
02981   USHORT  wServicePackMajor;
02982   USHORT  wServicePackMinor;
02983   USHORT  wSuiteMask;
02984   UCHAR  wProductType;
02985   UCHAR  wReserved;
02986 } RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
02987 
02988 NTOSAPI
02989 ULONGLONG
02990 DDKAPI
02991 VerSetConditionMask(
02992   /*IN*/ ULONGLONG  ConditionMask,
02993   /*IN*/ ULONG  TypeMask,
02994   /*IN*/ UCHAR  Condition);
02995 
02996 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType)  \
02997         ((ConditionMask) = VerSetConditionMask((ConditionMask), \
02998         (TypeBitMask), (ComparisonType)))
02999 
03000 /* RtlVerifyVersionInfo() TypeMask */
03001 
03002 #define VER_MINORVERSION                  0x0000001
03003 #define VER_MAJORVERSION                  0x0000002
03004 #define VER_BUILDNUMBER                   0x0000004
03005 #define VER_PLATFORMID                    0x0000008
03006 #define VER_SERVICEPACKMINOR              0x0000010
03007 #define VER_SERVICEPACKMAJOR              0x0000020
03008 #define VER_SUITENAME                     0x0000040
03009 #define VER_PRODUCT_TYPE                  0x0000080
03010 
03011 /* RtlVerifyVersionInfo() ComparisonType */
03012 
03013 #define VER_EQUAL                       1
03014 #define VER_GREATER                     2
03015 #define VER_GREATER_EQUAL               3
03016 #define VER_LESS                        4
03017 #define VER_LESS_EQUAL                  5
03018 #define VER_AND                         6
03019 #define VER_OR                          7
03020 
03021 #define VER_CONDITION_MASK              7
03022 #define VER_NUM_BITS_PER_CONDITION_MASK 3
03023 
03024 typedef struct _RTL_BITMAP {
03025   ULONG  SizeOfBitMap;
03026   PULONG  Buffer;
03027 } RTL_BITMAP, *PRTL_BITMAP;
03028 
03029 typedef struct _RTL_BITMAP_RUN {
03030     ULONG  StartingIndex;
03031     ULONG  NumberOfBits;
03032 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
03033 
03034 typedef NTSTATUS DDKAPI
03035 (*PRTL_QUERY_REGISTRY_ROUTINE)(
03036   /*IN*/ PWSTR  ValueName,
03037   /*IN*/ ULONG  ValueType,
03038   /*IN*/ PVOID  ValueData,
03039   /*IN*/ ULONG  ValueLength,
03040   /*IN*/ PVOID  Context,
03041   /*IN*/ PVOID  EntryContext);
03042 
03043 #define RTL_REGISTRY_ABSOLUTE             0
03044 #define RTL_REGISTRY_SERVICES             1
03045 #define RTL_REGISTRY_CONTROL              2
03046 #define RTL_REGISTRY_WINDOWS_NT           3
03047 #define RTL_REGISTRY_DEVICEMAP            4
03048 #define RTL_REGISTRY_USER                 5
03049 
03050 /* RTL_QUERY_REGISTRY_TABLE.Flags */
03051 #define RTL_QUERY_REGISTRY_SUBKEY         0x00000001
03052 #define RTL_QUERY_REGISTRY_TOPKEY         0x00000002
03053 #define RTL_QUERY_REGISTRY_REQUIRED       0x00000004
03054 #define RTL_QUERY_REGISTRY_NOVALUE        0x00000008
03055 #define RTL_QUERY_REGISTRY_NOEXPAND       0x00000010
03056 #define RTL_QUERY_REGISTRY_DIRECT         0x00000020
03057 #define RTL_QUERY_REGISTRY_DELETE         0x00000040
03058 
03059 typedef struct _RTL_QUERY_REGISTRY_TABLE {
03060   PRTL_QUERY_REGISTRY_ROUTINE  QueryRoutine;
03061   ULONG  Flags;
03062   PWSTR  Name;
03063   PVOID  EntryContext;
03064   ULONG  DefaultType;
03065   PVOID  DefaultData;
03066   ULONG  DefaultLength;
03067 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
03068 
03069 typedef struct _TIME_FIELDS {
03070   CSHORT  Year;
03071   CSHORT  Month;
03072   CSHORT  Day;
03073   CSHORT  Hour;
03074   CSHORT  Minute;
03075   CSHORT  Second;
03076   CSHORT  Milliseconds;
03077   CSHORT  Weekday;
03078 } TIME_FIELDS, *PTIME_FIELDS;
03079 
03080 typedef PVOID DDKAPI
03081 (*PALLOCATE_FUNCTION)(
03082   /*IN*/ POOL_TYPE  PoolType,
03083   /*IN*/ SIZE_T  NumberOfBytes,
03084   /*IN*/ ULONG  Tag);
03085 
03086 typedef VOID DDKAPI
03087 (*PFREE_FUNCTION)(
03088   /*IN*/ PVOID  Buffer);
03089 
03090 #define GENERAL_LOOKASIDE_S \
03091   SLIST_HEADER  ListHead; \
03092   USHORT  Depth; \
03093   USHORT  MaximumDepth; \
03094   ULONG  TotalAllocates; \
03095   _ANONYMOUS_UNION union { \
03096     ULONG  AllocateMisses; \
03097     ULONG  AllocateHits; \
03098   } DUMMYUNIONNAME; \
03099   ULONG  TotalFrees; \
03100   _ANONYMOUS_UNION union { \
03101     ULONG  FreeMisses; \
03102     ULONG  FreeHits; \
03103   } DUMMYUNIONNAME2; \
03104   POOL_TYPE  Type; \
03105   ULONG  Tag; \
03106   ULONG  Size; \
03107   PALLOCATE_FUNCTION  Allocate; \
03108   PFREE_FUNCTION  Free; \
03109   LIST_ENTRY  ListEntry; \
03110   ULONG  LastTotalAllocates; \
03111   _ANONYMOUS_UNION union { \
03112     ULONG  LastAllocateMisses; \
03113     ULONG  LastAllocateHits; \
03114   } DUMMYUNIONNAME3; \
03115   ULONG Future[2];
03116 
03117 typedef struct _GENERAL_LOOKASIDE {
03118   GENERAL_LOOKASIDE_S
03119 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
03120 
03121 typedef struct _NPAGED_LOOKASIDE_LIST {
03122   GENERAL_LOOKASIDE_S
03123   KSPIN_LOCK  Obsoleted;
03124 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
03125 
03126 typedef struct _PAGED_LOOKASIDE_LIST {
03127   GENERAL_LOOKASIDE_S
03128   FAST_MUTEX  Obsoleted;
03129 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
03130 
03131 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
03132 
03133 typedef VOID DDKAPI (*PCALLBACK_FUNCTION)(
03134   /*IN*/ PVOID  CallbackContext,
03135   /*IN*/ PVOID  Argument1,
03136   /*IN*/ PVOID  Argument2);
03137 
03138 typedef enum _EVENT_TYPE {
03139   NotificationEvent,
03140   SynchronizationEvent
03141 } EVENT_TYPE;
03142 
03143 typedef enum _KWAIT_REASON {
03144   Executive,
03145   FreePage,
03146   PageIn,
03147   PoolAllocation,
03148   DelayExecution,
03149   Suspended,
03150   UserRequest,
03151   WrExecutive,
03152   WrFreePage,
03153   WrPageIn,
03154   WrPoolAllocation,
03155   WrDelayExecution,
03156   WrSuspended,
03157   WrUserRequest,
03158   WrEventPair,
03159   WrQueue,
03160   WrLpcReceive,
03161   WrLpcReply,
03162   WrVirtualMemory,
03163   WrPageOut,
03164   WrRendezvous,
03165   Spare2,
03166   Spare3,
03167   Spare4,
03168   Spare5,
03169   Spare6,
03170   WrKernel,
03171   MaximumWaitReason
03172 } KWAIT_REASON;
03173 
03174 typedef struct _KWAIT_BLOCK {
03175   LIST_ENTRY  WaitListEntry;
03176   struct _KTHREAD * RESTRICTED_POINTER  Thread;
03177   PVOID  Object;
03178   struct _KWAIT_BLOCK * RESTRICTED_POINTER  NextWaitBlock;
03179   USHORT  WaitKey;
03180   USHORT  WaitType;
03181 } KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
03182 
03183 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
03184 
03185 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
03186   BOOLEAN  Removed;
03187   BOOLEAN  Reserved[3];
03188   LONG  IoCount;
03189   KEVENT  RemoveEvent;
03190 } IO_REMOVE_LOCK_COMMON_BLOCK;
03191 
03192 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
03193   LONG  Signature;
03194   LONG  HighWatermark;
03195   LONGLONG  MaxLockedTicks;
03196   LONG  AllocateTag;
03197   LIST_ENTRY  LockList;
03198   KSPIN_LOCK  Spin;
03199   LONG  LowMemoryCount;
03200   ULONG  Reserved1[4];
03201   PVOID  Reserved2;
03202   PIO_REMOVE_LOCK_TRACKING_BLOCK  Blocks;
03203 } IO_REMOVE_LOCK_DBG_BLOCK;
03204 
03205 typedef struct _IO_REMOVE_LOCK {
03206   IO_REMOVE_LOCK_COMMON_BLOCK  Common;
03207 #ifdef DBG
03208   IO_REMOVE_LOCK_DBG_BLOCK  Dbg;
03209 #endif
03210 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
03211 
03212 typedef struct _IO_WORKITEM *PIO_WORKITEM;
03213 
03214 typedef VOID DDKAPI
03215 (*PIO_WORKITEM_ROUTINE)(
03216   /*IN*/ PDEVICE_OBJECT  DeviceObject,
03217   /*IN*/ PVOID  Context);
03218 
03219 typedef struct _SHARE_ACCESS {
03220   ULONG  OpenCount;
03221   ULONG  Readers;
03222   ULONG  Writers;
03223   ULONG  Deleters;
03224   ULONG  SharedRead;
03225   ULONG  SharedWrite;
03226   ULONG  SharedDelete;
03227 } SHARE_ACCESS, *PSHARE_ACCESS;
03228 
03229 typedef enum _KINTERRUPT_MODE {
03230   LevelSensitive,
03231   Latched
03232 } KINTERRUPT_MODE;
03233 
03234 typedef VOID DDKAPI
03235 (*PKINTERRUPT_ROUTINE)(
03236   VOID);
03237 
03238 typedef enum _KPROFILE_SOURCE {
03239   ProfileTime,
03240   ProfileAlignmentFixup,
03241   ProfileTotalIssues,
03242   ProfilePipelineDry,
03243   ProfileLoadInstructions,
03244   ProfilePipelineFrozen,
03245   ProfileBranchInstructions,
03246   ProfileTotalNonissues,
03247   ProfileDcacheMisses,
03248   ProfileIcacheMisses,
03249   ProfileCacheMisses,
03250   ProfileBranchMispredictions,
03251   ProfileStoreInstructions,
03252   ProfileFpInstructions,
03253   ProfileIntegerInstructions,
03254   Profile2Issue,
03255   Profile3Issue,
03256   Profile4Issue,
03257   ProfileSpecialInstructions,
03258   ProfileTotalCycles,
03259   ProfileIcacheIssues,
03260   ProfileDcacheAccesses,
03261   ProfileMemoryBarrierCycles,
03262   ProfileLoadLinkedIssues,
03263   ProfileMaximum
03264 } KPROFILE_SOURCE;
03265 
03266 typedef enum _CREATE_FILE_TYPE {
03267   CreateFileTypeNone,
03268   CreateFileTypeNamedPipe,
03269   CreateFileTypeMailslot
03270 } CREATE_FILE_TYPE;
03271 
03272 typedef struct _CONFIGURATION_INFORMATION {
03273   ULONG  DiskCount;
03274   ULONG  FloppyCount;
03275   ULONG  CdRomCount;
03276   ULONG  TapeCount;
03277   ULONG  ScsiPortCount;
03278   ULONG  SerialCount;
03279   ULONG  ParallelCount;
03280   BOOLEAN  AtDiskPrimaryAddressClaimed;
03281   BOOLEAN  AtDiskSecondaryAddressClaimed;
03282   ULONG  Version;
03283   ULONG  MediumChangerCount;
03284 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
03285 
03286 typedef enum _CONFIGURATION_TYPE {
03287   ArcSystem,
03288   CentralProcessor,
03289   FloatingPointProcessor,
03290   PrimaryIcache,
03291   PrimaryDcache,
03292   SecondaryIcache,
03293   SecondaryDcache,
03294   SecondaryCache,
03295   EisaAdapter,
03296   TcAdapter,
03297   ScsiAdapter,
03298   DtiAdapter,
03299   MultiFunctionAdapter,
03300   DiskController,
03301   TapeController,
03302   CdromController,
03303   WormController,
03304   SerialController,
03305   NetworkController,
03306   DisplayController,
03307   ParallelController,
03308   PointerController,
03309   KeyboardController,
03310   AudioController,
03311   OtherController,
03312   DiskPeripheral,
03313   FloppyDiskPeripheral,
03314   TapePeripheral,
03315   ModemPeripheral,
03316   MonitorPeripheral,
03317   PrinterPeripheral,
03318   PointerPeripheral,
03319   KeyboardPeripheral,
03320   TerminalPeripheral,
03321   OtherPeripheral,
03322   LinePeripheral,
03323   NetworkPeripheral,
03324   SystemMemory,
03325   DockingInformation,
03326   RealModeIrqRoutingTable,
03327   MaximumType
03328 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
03329 
03330 typedef NTSTATUS (*PIO_QUERY_DEVICE_ROUTINE)(
03331   /*IN*/ PVOID  Context,
03332   /*IN*/ PUNICODE_STRING  PathName,
03333   /*IN*/ INTERFACE_TYPE  BusType,
03334   /*IN*/ ULONG  BusNumber,
03335   /*IN*/ PKEY_VALUE_FULL_INFORMATION  *BusInformation,
03336   /*IN*/ CONFIGURATION_TYPE  ControllerType,
03337   /*IN*/ ULONG  ControllerNumber,
03338   /*IN*/ PKEY_VALUE_FULL_INFORMATION  *ControllerInformation,
03339   /*IN*/ CONFIGURATION_TYPE  PeripheralType,
03340   /*IN*/ ULONG  PeripheralNumber,
03341   /*IN*/ PKEY_VALUE_FULL_INFORMATION  *PeripheralInformation);
03342 
03343 typedef enum _WORK_QUEUE_TYPE {
03344   CriticalWorkQueue,
03345   DelayedWorkQueue,
03346   HyperCriticalWorkQueue,
03347   MaximumWorkQueue
03348 } WORK_QUEUE_TYPE;
03349 
03350 typedef VOID DDKAPI
03351 (*PWORKER_THREAD_ROUTINE)(
03352   /*IN*/ PVOID Parameter);
03353 
03354 typedef struct _WORK_QUEUE_ITEM {
03355   LIST_ENTRY  List;
03356   PWORKER_THREAD_ROUTINE  WorkerRoutine;
03357   PVOID  Parameter;
03358 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
03359 
03360 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
03361     BufferEmpty,
03362     BufferInserted,
03363     BufferStarted,
03364     BufferFinished,
03365     BufferIncomplete
03366 } KBUGCHECK_BUFFER_DUMP_STATE;
03367 
03368 typedef VOID DDKAPI
03369 (*PKBUGCHECK_CALLBACK_ROUTINE)(
03370   /*IN*/ PVOID  Buffer,
03371   /*IN*/ ULONG  Length);
03372 
03373 typedef struct _KBUGCHECK_CALLBACK_RECORD {
03374   LIST_ENTRY  Entry;
03375   PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine;
03376   PVOID  Buffer;
03377   ULONG  Length;
03378   PUCHAR  Component;
03379   ULONG_PTR  Checksum;
03380   UCHAR  State;
03381 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
03382 
03383 /*
03384  * VOID
03385  * KeInitializeCallbackRecord(
03386  * IN PKBUGCHECK_CALLBACK_RECORD  CallbackRecord)
03387  */
03388 #define KeInitializeCallbackRecord(CallbackRecord) \
03389   CallbackRecord->State = BufferEmpty;
03390 
03391 typedef enum _KDPC_IMPORTANCE {
03392   LowImportance,
03393   MediumImportance,
03394   HighImportance
03395 } KDPC_IMPORTANCE;
03396 
03397 typedef enum _MEMORY_CACHING_TYPE_ORIG {
03398   MmFrameBufferCached = 2
03399 } MEMORY_CACHING_TYPE_ORIG;
03400 
03401 typedef enum _MEMORY_CACHING_TYPE {
03402   MmNonCached = FALSE,
03403   MmCached = TRUE,
03404   MmWriteCombined = MmFrameBufferCached,
03405   MmHardwareCoherentCached,
03406   MmNonCachedUnordered,
03407   MmUSWCCached,
03408   MmMaximumCacheType
03409 } MEMORY_CACHING_TYPE;
03410 
03411 typedef enum _MM_PAGE_PRIORITY {
03412   LowPagePriority,
03413   NormalPagePriority = 16,
03414   HighPagePriority = 32
03415 } MM_PAGE_PRIORITY;
03416 
03417 typedef enum _LOCK_OPERATION {
03418   IoReadAccess,
03419   IoWriteAccess,
03420   IoModifyAccess
03421 } LOCK_OPERATION;
03422 
03423 typedef enum _MM_SYSTEM_SIZE {
03424   MmSmallSystem,
03425   MmMediumSystem,
03426   MmLargeSystem
03427 } MM_SYSTEM_SIZE;
03428 
03429 typedef struct _OBJECT_HANDLE_INFORMATION {
03430   ULONG HandleAttributes;
03431   ACCESS_MASK GrantedAccess;
03432 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
03433 
03434 typedef struct _CLIENT_ID {
03435   HANDLE  UniqueProcess;
03436   HANDLE  UniqueThread;
03437 } CLIENT_ID, *PCLIENT_ID;
03438 
03439 typedef VOID DDKAPI
03440 (*PKSTART_ROUTINE)(
03441   /*IN*/ PVOID  StartContext);
03442 
03443 typedef VOID DDKAPI
03444 (*PCREATE_PROCESS_NOTIFY_ROUTINE)(
03445   /*IN*/ HANDLE  ParentId,
03446   /*IN*/ HANDLE  ProcessId,
03447   /*IN*/ BOOLEAN  Create);
03448 
03449 typedef VOID DDKAPI
03450 (*PCREATE_THREAD_NOTIFY_ROUTINE)(
03451   /*IN*/ HANDLE  ProcessId,
03452   /*IN*/ HANDLE  ThreadId,
03453   /*IN*/ BOOLEAN  Create);
03454 
03455 typedef struct _IMAGE_INFO {
03456   _ANONYMOUS_UNION union {
03457     ULONG  Properties;
03458     _ANONYMOUS_STRUCT struct {
03459       ULONG  ImageAddressingMode  : 8;
03460       ULONG  SystemModeImage      : 1;
03461       ULONG  ImageMappedToAllPids : 1;
03462       ULONG  Reserved             : 22;
03463     } DUMMYSTRUCTNAME;
03464   } DUMMYUNIONNAME;
03465   PVOID  ImageBase;
03466   ULONG  ImageSelector;
03467   SIZE_T  ImageSize;
03468   ULONG  ImageSectionNumber;
03469 } IMAGE_INFO, *PIMAGE_INFO;
03470 
03471 #define IMAGE_ADDRESSING_MODE_32BIT       3
03472 
03473 typedef VOID DDKAPI
03474 (*PLOAD_IMAGE_NOTIFY_ROUTINE)(
03475   /*IN*/ PUNICODE_STRING  FullImageName,
03476   /*IN*/ HANDLE  ProcessId,
03477   /*IN*/ PIMAGE_INFO  ImageInfo);
03478 
03479 typedef enum _PROCESSINFOCLASS {
03480   ProcessBasicInformation,
03481   ProcessQuotaLimits,
03482   ProcessIoCounters,
03483   ProcessVmCounters,
03484   ProcessTimes,
03485   ProcessBasePriority,
03486   ProcessRaisePriority,
03487   ProcessDebugPort,
03488   ProcessExceptionPort,
03489   ProcessAccessToken,
03490   ProcessLdtInformation,
03491   ProcessLdtSize,
03492   ProcessDefaultHardErrorMode,
03493   ProcessIoPortHandlers,
03494   ProcessPooledUsageAndLimits,
03495   ProcessWorkingSetWatch,
03496   ProcessUserModeIOPL,
03497   ProcessEnableAlignmentFaultFixup,
03498   ProcessPriorityClass,
03499   ProcessWx86Information,
03500   ProcessHandleCount,
03501   ProcessAffinityMask,
03502   ProcessPriorityBoost,
03503   ProcessDeviceMap,
03504   ProcessSessionInformation,
03505   ProcessForegroundInformation,
03506   ProcessWow64Information,
03507   ProcessImageFileName,
03508   ProcessLUIDDeviceMapsEnabled,
03509   ProcessBreakOnTermination,
03510   ProcessDebugObjectHandle,
03511   ProcessDebugFlags,
03512   ProcessHandleTracing,
03513   MaxProcessInfoClass
03514 } PROCESSINFOCLASS;
03515 
03516 typedef enum _THREADINFOCLASS {
03517   ThreadBasicInformation,
03518   ThreadTimes,
03519   ThreadPriority,
03520   ThreadBasePriority,
03521   ThreadAffinityMask,
03522   ThreadImpersonationToken,
03523   ThreadDescriptorTableEntry,
03524   ThreadEnableAlignmentFaultFixup,
03525   ThreadEventPair_Reusable,
03526   ThreadQuerySetWin32StartAddress,
03527   ThreadZeroTlsCell,
03528   ThreadPerformanceCount,
03529   ThreadAmILastThread,
03530   ThreadIdealProcessor,
03531   ThreadPriorityBoost,
03532   ThreadSetTlsArrayAddress,
03533   ThreadIsIoPending,
03534   ThreadHideFromDebugger,
03535   ThreadBreakOnTermination,
03536   MaxThreadInfoClass
03537 } THREADINFOCLASS;
03538 
03539 #define ES_SYSTEM_REQUIRED                0x00000001
03540 #define ES_DISPLAY_REQUIRED               0x00000002
03541 #define ES_USER_PRESENT                   0x00000004
03542 #define ES_CONTINUOUS                     0x80000000
03543 
03544 typedef ULONG EXECUTION_STATE;
03545 
03546 typedef VOID DDKAPI
03547 (*PREQUEST_POWER_COMPLETE)(
03548   /*IN*/ PDEVICE_OBJECT  DeviceObject,
03549   /*IN*/ UCHAR  MinorFunction,
03550   /*IN*/ POWER_STATE  PowerState,
03551   /*IN*/ PVOID  Context,
03552   /*IN*/ PIO_STATUS_BLOCK  IoStatus);
03553 
03554 typedef enum _TRACE_INFORMATION_CLASS {
03555   TraceIdClass,
03556   TraceHandleClass,
03557   TraceEnableFlagsClass,
03558   TraceEnableLevelClass,
03559   GlobalLoggerHandleClass,
03560   EventLoggerHandleClass,
03561   AllLoggerHandlesClass,
03562   TraceHandleByNameClass
03563 } TRACE_INFORMATION_CLASS;
03564 
03565 typedef NTSTATUS DDKAPI
03566 (*PEX_CALLBACK_FUNCTION)(
03567   /*IN*/ PVOID  CallbackContext,
03568   /*IN*/ PVOID  Argument1,
03569   /*IN*/ PVOID  Argument2);
03570 
03571 
03572 
03573 /*
03574 ** Storage structures
03575 */
03576 typedef enum _PARTITION_STYLE {
03577   PARTITION_STYLE_MBR,
03578   PARTITION_STYLE_GPT
03579 } PARTITION_STYLE;
03580 
03581 typedef struct _CREATE_DISK_MBR {
03582   ULONG  Signature;
03583 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
03584 
03585 typedef struct _CREATE_DISK_GPT {
03586   GUID  DiskId;
03587   ULONG  MaxPartitionCount;
03588 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
03589 
03590 typedef struct _CREATE_DISK {
03591   PARTITION_STYLE  PartitionStyle;
03592   _ANONYMOUS_UNION union {
03593     CREATE_DISK_MBR  Mbr;
03594     CREATE_DISK_GPT  Gpt;
03595   } DUMMYUNIONNAME;
03596 } CREATE_DISK, *PCREATE_DISK;
03597 
03598 typedef struct _DISK_SIGNATURE {
03599   ULONG  PartitionStyle;
03600   _ANONYMOUS_UNION union {
03601     struct {
03602       ULONG  Signature;
03603       ULONG  CheckSum;
03604     } Mbr;
03605     struct {
03606       GUID  DiskId;
03607     } Gpt;
03608   } DUMMYUNIONNAME;
03609 } DISK_SIGNATURE, *PDISK_SIGNATURE;
03610 
03611 typedef VOID DDKFASTAPI
03612 (*PTIME_UPDATE_NOTIFY_ROUTINE)(
03613   /*IN*/ HANDLE  ThreadId,
03614   /*IN*/ KPROCESSOR_MODE  Mode);
03615 
03616 #define DBG_STATUS_CONTROL_C              1
03617 #define DBG_STATUS_SYSRQ                  2
03618 #define DBG_STATUS_BUGCHECK_FIRST         3
03619 #define DBG_STATUS_BUGCHECK_SECOND        4
03620 #define DBG_STATUS_FATAL                  5
03621 #define DBG_STATUS_DEBUG_CONTROL          6
03622 #define DBG_STATUS_WORKER                 7
03623 
03624 typedef struct _PHYSICAL_MEMORY_RANGE {
03625   PHYSICAL_ADDRESS  BaseAddress;
03626   LARGE_INTEGER  NumberOfBytes;
03627 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
03628 
03629 typedef ULONG_PTR
03630 (*PDRIVER_VERIFIER_THUNK_ROUTINE)(
03631   /*IN*/ PVOID  Context);
03632 
03633 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
03634   PDRIVER_VERIFIER_THUNK_ROUTINE  PristineRoutine;
03635   PDRIVER_VERIFIER_THUNK_ROUTINE  NewRoutine;
03636 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
03637 
03638 #define DRIVER_VERIFIER_SPECIAL_POOLING             0x0001
03639 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING         0x0002
03640 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES  0x0004
03641 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS      0x0008
03642 #define DRIVER_VERIFIER_IO_CHECKING                 0x0010
03643 
03644 #define RTL_RANGE_LIST_ADD_IF_CONFLICT    0x00000001
03645 #define RTL_RANGE_LIST_ADD_SHARED         0x00000002
03646 
03647 #define RTL_RANGE_LIST_SHARED_OK          0x00000001
03648 #define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002
03649 
03650 #define RTL_RANGE_LIST_SHARED_OK          0x00000001
03651 #define RTL_RANGE_LIST_NULL_CONFLICT_OK   0x00000002
03652 
03653 #define RTL_RANGE_LIST_MERGE_IF_CONFLICT  RTL_RANGE_LIST_ADD_IF_CONFLICT
03654 
03655 typedef struct _RTL_RANGE {
03656   ULONGLONG  Start;
03657   ULONGLONG  End;
03658   PVOID  UserData;
03659   PVOID  Owner;
03660   UCHAR  Attributes;
03661   UCHAR  Flags;
03662 } RTL_RANGE, *PRTL_RANGE;
03663 
03664 #define RTL_RANGE_SHARED                  0x01
03665 #define RTL_RANGE_CONFLICT                0x02
03666 
03667 typedef struct _RTL_RANGE_LIST {
03668   LIST_ENTRY  ListHead;
03669   ULONG  Flags;
03670   ULONG  Count;
03671   ULONG  Stamp;
03672 } RTL_RANGE_LIST, *PRTL_RANGE_LIST;
03673 
03674 typedef struct _RANGE_LIST_ITERATOR {
03675   PLIST_ENTRY  RangeListHead;
03676   PLIST_ENTRY  MergedHead;
03677   PVOID  Current;
03678   ULONG  Stamp;
03679 } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
03680 
03681 typedef BOOLEAN
03682 (*PRTL_CONFLICT_RANGE_CALLBACK)(
03683   /*IN*/ PVOID  Context,
03684   /*IN*/ PRTL_RANGE  Range);
03685 
03686 #define HASH_STRING_ALGORITHM_DEFAULT     0
03687 #define HASH_STRING_ALGORITHM_X65599      1
03688 #define HASH_STRING_ALGORITHM_INVALID     0xffffffff
03689 
03690 typedef enum _SUITE_TYPE {
03691   SmallBusiness,
03692   Enterprise,
03693   BackOffice,
03694   CommunicationServer,
03695   TerminalServer,
03696   SmallBusinessRestricted,
03697   EmbeddedNT,
03698   DataCenter,
03699   SingleUserTS,
03700   Personal,
03701   Blade,
03702   MaxSuiteType
03703 } SUITE_TYPE;
03704 
03705 typedef VOID DDKAPI
03706 (*PTIMER_APC_ROUTINE)(
03707   /*IN*/ PVOID  TimerContext,
03708   /*IN*/ ULONG  TimerLowValue,
03709   /*IN*/ LONG  TimerHighValue);
03710 
03711 
03712 
03713 /*
03714 ** WMI structures
03715 */
03716 
03717 typedef VOID DDKAPI
03718 (*WMI_NOTIFICATION_CALLBACK)(
03719   PVOID  Wnode,
03720   PVOID  Context);
03721 
03722 
03723 /*
03724 ** Architecture specific structures
03725 */
03726 
03727 #ifdef _X86_
03728 
03729 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
03730 
03731 #define PASSIVE_LEVEL                      0
03732 #define LOW_LEVEL                          0
03733 #define APC_LEVEL                          1
03734 #define DISPATCH_LEVEL                     2
03735 #define SYNCH_LEVEL                       27
03736 #define PROFILE_LEVEL                     27
03737 #define CLOCK1_LEVEL                      28
03738 #define CLOCK2_LEVEL                      28
03739 #define IPI_LEVEL                         29
03740 #define POWER_LEVEL                       30
03741 #define HIGH_LEVEL                        31
03742 
03743 typedef struct _KPCR_TIB {
03744   PVOID  ExceptionList;         /* 00 */
03745   PVOID  StackBase;             /* 04 */
03746   PVOID  StackLimit;            /* 08 */
03747   PVOID  SubSystemTib;          /* 0C */
03748   _ANONYMOUS_UNION union {
03749     PVOID  FiberData;           /* 10 */
03750     DWORD  Version;             /* 10 */
03751   } DUMMYUNIONNAME;
03752   PVOID  ArbitraryUserPointer;  /* 14 */
03753   struct _NT_TIB *Self;         /* 18 */
03754 } KPCR_TIB, *PKPCR_TIB;         /* 1C */
03755 
03756 #define PCR_MINOR_VERSION 1
03757 #define PCR_MAJOR_VERSION 1
03758 
03759 typedef struct _KPCR {
03760   KPCR_TIB  Tib;                /* 00 */
03761   struct _KPCR  *Self;          /* 1C */
03762   struct _KPRCB  *PCRCB;        /* 20 */
03763   KIRQL  Irql;                  /* 24 */
03764   ULONG  IRR;                   /* 28 */
03765   ULONG  IrrActive;             /* 2C */
03766   ULONG  IDR;                   /* 30 */
03767   PVOID  KdVersionBlock;        /* 34 */
03768   PUSHORT  IDT;                 /* 38 */
03769   PUSHORT  GDT;                 /* 3C */
03770   struct _KTSS  *TSS;           /* 40 */
03771   USHORT  MajorVersion;         /* 44 */
03772   USHORT  MinorVersion;         /* 46 */
03773   KAFFINITY  SetMember;         /* 48 */
03774   ULONG  StallScaleFactor;      /* 4C */
03775   UCHAR  SpareUnused;           /* 50 */
03776   UCHAR  Number;                /* 51 */
03777 } KPCR, *PKPCR;                 /* 54 */
03778 
03779 typedef struct _KFLOATING_SAVE {
03780   ULONG  ControlWord;
03781   ULONG  StatusWord;
03782   ULONG  ErrorOffset;
03783   ULONG  ErrorSelector;
03784   ULONG  DataOffset;
03785   ULONG  DataSelector;
03786   ULONG  Cr0NpxState;
03787   ULONG  Spare1;
03788 } KFLOATING_SAVE, *PKFLOATING_SAVE;
03789 
03790 #define PAGE_SIZE                         0x1000
03791 #define PAGE_SHIFT                        12L
03792 
03793 extern NTOSAPI PVOID *MmHighestUserAddress;
03794 extern NTOSAPI PVOID *MmSystemRangeStart;
03795 extern NTOSAPI ULONG *MmUserProbeAddress;
03796 
03797 #define MM_HIGHEST_USER_ADDRESS           *MmHighestUserAddress
03798 #define MM_SYSTEM_RANGE_START             *MmSystemRangeStart
03799 #define MM_USER_PROBE_ADDRESS             *MmUserProbeAddress
03800 #define MM_LOWEST_USER_ADDRESS            (PVOID)0x10000
03801 #define MM_LOWEST_SYSTEM_ADDRESS          (PVOID)0xC0C00000
03802 
03803 #define KI_USER_SHARED_DATA               0xffdf0000
03804 #define SharedUserData                    ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
03805 
03806 #define EFLAG_SIGN                        0x8000
03807 #define EFLAG_ZERO                        0x4000
03808 #define EFLAG_SELECT                      (EFLAG_SIGN | EFLAG_ZERO)
03809 
03810 #define RESULT_NEGATIVE                   ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
03811 #define RESULT_ZERO                       ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
03812 #define RESULT_POSITIVE                   ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
03813 
03814 typedef enum _INTERLOCKED_RESULT {
03815   ResultNegative = RESULT_NEGATIVE,
03816   ResultZero = RESULT_ZERO,
03817   ResultPositive = RESULT_POSITIVE
03818 } INTERLOCKED_RESULT;
03819 
03820 NTOSAPI
03821 KIRQL
03822 DDKAPI
03823 KeGetCurrentIrql(
03824   VOID);
03825 
03826 /*
03827  * ULONG
03828  * KeGetCurrentProcessorNumber(
03829  *   VOID)
03830  */
03831 #define KeGetCurrentProcessorNumber() \
03832   ((ULONG)KeGetCurrentKPCR()->Number)
03833 
03834 
03835 #if  __USE_NTOSKRNL__
03836 /* CAREFUL: These are exported from ntoskrnl.exe as __fastcall functions,
03837    but are also exported from kernel32.dll and declared in winbase.h as
03838    __stdcall */
03839 #if !defined(__INTERLOCKED_DECLARED)
03840 #define __INTERLOCKED_DECLARED
03841 
03842 NTOSAPI
03843 LONG
03844 DDKFASTAPI
03845 InterlockedIncrement(
03846   /*IN*/ LONG VOLATILE *Addend);
03847 
03848 NTOSAPI
03849 LONG
03850 DDKFASTAPI
03851 InterlockedDecrement(
03852   /*IN*/ LONG VOLATILE *Addend);
03853 
03854 NTOSAPI
03855 LONG
03856 DDKFASTAPI
03857 InterlockedCompareExchange(
03858   /*IN OUT*/ PLONG  VOLATILE  Destination,
03859   /*IN*/ LONG  Exchange,
03860   /*IN*/ LONG  Comparand);
03861 
03862 NTOSAPI
03863 LONG
03864 DDKFASTAPI
03865 InterlockedExchange(
03866   /*IN OUT*/ PLONG  VOLATILE  Target,
03867   /*IN*/ LONG Value);
03868 
03869 NTOSAPI
03870 LONG
03871 DDKFASTAPI
03872 InterlockedExchangeAdd(
03873   /*IN OUT*/ PLONG VOLATILE  Addend,
03874   /*IN*/ LONG  Value);
03875 
03876 /*
03877  * PVOID
03878  * InterlockedExchangePointer(
03879  * IN OUT PVOID VOLATILE  *Target,
03880  * IN PVOID  Value)
03881  */
03882 #define InterlockedExchangePointer(Target, Value) \
03883   ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
03884 
03885 /*
03886  * PVOID
03887  * InterlockedCompareExchangePointer(
03888  * IN OUT PVOID  *Destination,
03889  * IN PVOID  Exchange,
03890  * IN PVOID  Comparand)
03891  */
03892 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
03893   ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
03894 
03895 #if  (_WIN32_WINNT >= 0x0501)
03896 PSLIST_ENTRY
03897 DDKFASTAPI
03898 InterlockedPopEntrySList(
03899   /*IN*/ PSLIST_HEADER  ListHead);
03900 
03901 NTOSAPI
03902 PSLIST_ENTRY
03903 DDKFASTAPI
03904 InterlockedPushEntrySList(
03905   /*IN*/ PSLIST_HEADER  ListHead,
03906   /*IN*/ PSLIST_ENTRY  ListEntry);
03907 #endif /* _WIN32_WINNT >= 0x0501 */
03908 
03909 #endif /* !__INTERLOCKED_DECLARED */
03910 #endif /*  __USE_NTOSKRNL__ */
03911 
03912 NTOSAPI
03913 VOID
03914 DDKFASTAPI
03915 KefAcquireSpinLockAtDpcLevel(
03916   /*IN*/ PKSPIN_LOCK  SpinLock);
03917 
03918 NTOSAPI
03919 VOID
03920 DDKFASTAPI
03921 KefReleaseSpinLockFromDpcLevel(
03922   /*IN*/ PKSPIN_LOCK  SpinLock);
03923 
03924 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
03925 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
03926 
03927 #define RtlCopyMemoryNonTemporal RtlCopyMemory
03928 
03929 #define KeGetDcacheFillSize() 1L
03930 
03931 #endif /* _X86_ */
03932 
03933 
03934 
03935 /*
03936 ** Utillity functions
03937 */
03938 
03939 #define ARGUMENT_PRESENT(ArgumentPointer) \
03940   ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
03941 
03942 /*
03943  * ULONG
03944  * BYTE_OFFSET(
03945  * IN PVOID  Va)
03946  */
03947 #define BYTE_OFFSET(Va) \
03948   ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
03949 
03950 /*
03951  * ULONG
03952  * BYTES_TO_PAGES(
03953  * IN ULONG  Size)
03954  */
03955 #define BYTES_TO_PAGES(Size) \
03956   ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
03957 
03958 /*
03959  * PCHAR
03960  * CONTAINING_RECORD(
03961  * IN PCHAR  Address,
03962  * IN TYPE  Type,
03963  * IN PCHAR  Field);
03964  */
03965 #ifndef CONTAINING_RECORD
03966 #define CONTAINING_RECORD(Address, Type, Field) \
03967   ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
03968 #endif
03969 
03970 /* LONG
03971  * FIELD_OFFSET(
03972  * IN TYPE  Type,
03973  * IN PCHAR  Field);
03974  */
03975 #ifndef FIELD_OFFSET
03976 #define FIELD_OFFSET(Type, Field) \
03977   ((LONG) (&(((Type *) 0)->Field)))
03978 #endif
03979 
03980 /*
03981  * PVOID
03982  * PAGE_ALIGN(
03983  * IN PVOID  Va)
03984  */
03985 #define PAGE_ALIGN(Va) \
03986   ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
03987 
03988 /*
03989  * ULONG_PTR
03990  * ROUND_TO_PAGES(
03991  * IN ULONG_PTR  Size)
03992  */
03993 #define ROUND_TO_PAGES(Size) \
03994   ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
03995 
03996 NTOSAPI
03997 VOID
03998 DDKAPI
03999 RtlAssert(
04000   /*IN*/ PVOID  FailedAssertion,
04001   /*IN*/ PVOID  FileName,
04002   /*IN*/ ULONG  LineNumber,
04003   /*IN*/ PCHAR  Message);
04004 
04005 #ifdef DBG
04006 
04007 #define ASSERT(exp) \
04008   ((!(exp)) ? \
04009     (RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE) : TRUE)
04010 
04011 #define ASSERTMSG(msg, exp) \
04012   ((!(exp)) ? \
04013     (RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE) : TRUE)
04014 
04015 #define RTL_SOFT_ASSERT(exp) \
04016   ((!(_exp)) ? \
04017     (DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n", __FILE__, __LINE__, #exp), FALSE) : TRUE)
04018 
04019 #define RTL_SOFT_ASSERTMSG(msg, exp) \
04020   ((!(exp)) ? \
04021     (DbgPrint("%s(%d): Soft assertion failed\n   Expression: %s\n   Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE) : TRUE)
04022 
04023 #define RTL_VERIFY(exp) ASSERT(exp)
04024 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
04025 
04026 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
04027 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
04028 
04029 #else /* !DBG */
04030 
04031 #define ASSERT(exp) ((VOID) 0)
04032 #define ASSERTMSG(msg, exp) ((VOID) 0)
04033 
04034 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
04035 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
04036 
04037 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
04038 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
04039 
04040 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
04041 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
04042 
04043 #endif /* DBG */
04044 
04045 
04046 /*
04047 ** Driver support routines
04048 */
04049 
04050 /** Runtime library routines **/
04051 
04052 /*
04053  * VOID
04054  * InitializeListHead(
04055  * IN PLIST_ENTRY  ListHead)
04056  */
04057 #define InitializeListHead(_ListHead) \
04058 { \
04059   (_ListHead)->Flink = (_ListHead); \
04060   (_ListHead)->Blink = (_ListHead); \
04061 }
04062 
04063 /*
04064  * VOID
04065  * InsertHeadList(
04066  * IN PLIST_ENTRY  ListHead,
04067  * IN PLIST_ENTRY  Entry)
04068  */
04069 #define InsertHeadList(_ListHead, \
04070                        _Entry) \
04071 { \
04072   PLIST_ENTRY _OldFlink; \
04073   _OldFlink = (_ListHead)->Flink; \
04074   (_Entry)->Flink = _OldFlink; \
04075   (_Entry)->Blink = (_ListHead); \
04076   _OldFlink->Blink = (_Entry); \
04077   (_ListHead)->Flink = (_Entry); \
04078 }
04079 
04080 /*
04081  * VOID
04082  * InsertTailList(
04083  * IN PLIST_ENTRY  ListHead,
04084  * IN PLIST_ENTRY  Entry)
04085  */
04086 #define InsertTailList(_ListHead, \
04087                        _Entry) \
04088 { \
04089     PLIST_ENTRY _OldBlink; \
04090     _OldBlink = (_ListHead)->Blink; \
04091     (_Entry)->Flink = (_ListHead); \
04092     (_Entry)->Blink = _OldBlink; \
04093     _OldBlink->Flink = (_Entry); \
04094     (_ListHead)->Blink = (_Entry); \
04095 }
04096 
04097 /*
04098  * BOOLEAN
04099  * IsListEmpty(
04100  * IN PLIST_ENTRY  ListHead)
04101  */
04102 #define IsListEmpty(_ListHead) \
04103   ((_ListHead)->Flink == (_ListHead))
04104 
04105 static __inline PSINGLE_LIST_ENTRY 
04106 PopEntryList(
04107   /*IN*/ PSINGLE_LIST_ENTRY  ListHead)
04108 {
04109     PSINGLE_LIST_ENTRY Entry;
04110 
04111     Entry = ListHead->Next;
04112     if (Entry != NULL)
04113     {
04114         ListHead->Next = Entry->Next;
04115     }
04116   return Entry;
04117 }
04118 
04119 /*
04120  * VOID
04121  * PushEntryList(
04122  * IN PSINGLE_LIST_ENTRY  ListHead,
04123  * IN PSINGLE_LIST_ENTRY  Entry)
04124  */
04125 #define PushEntryList(_ListHead, \
04126                       _Entry) \
04127 { \
04128     (_Entry)->Next = (_ListHead)->Next; \
04129     (_ListHead)->Next = (_Entry); \
04130 }
04131 
04132 /*
04133  * VOID
04134  * RemoveEntryList(
04135  * IN PLIST_ENTRY  Entry)
04136  */
04137 #define RemoveEntryList(_Entry) \
04138 { \
04139     PLIST_ENTRY _OldFlink; \
04140     PLIST_ENTRY _OldBlink; \
04141     _OldFlink = (_Entry)->Flink; \
04142     _OldBlink = (_Entry)->Blink; \
04143     _OldFlink->Blink = _OldBlink; \
04144     _OldBlink->Flink = _OldFlink; \
04145   (_Entry)->Flink = NULL; \
04146   (_Entry)->Blink = NULL; \
04147 }
04148 
04149 static __inline PLIST_ENTRY 
04150 RemoveHeadList(
04151   /*IN*/ PLIST_ENTRY  ListHead)
04152 {
04153     PLIST_ENTRY OldFlink;
04154     PLIST_ENTRY OldBlink;
04155     PLIST_ENTRY Entry;
04156 
04157     Entry = ListHead->Flink;
04158     OldFlink = ListHead->Flink->Flink;
04159     OldBlink = ListHead->Flink->Blink;
04160     OldFlink->Blink = OldBlink;
04161     OldBlink->Flink = OldFlink;
04162 
04163   if (Entry != ListHead)
04164   {
04165     Entry->Flink = NULL;
04166     Entry->Blink = NULL;
04167   }
04168 
04169     return Entry;
04170 }
04171 
04172 static __inline PLIST_ENTRY
04173 RemoveTailList(
04174   /*IN*/ PLIST_ENTRY  ListHead)
04175 {
04176     PLIST_ENTRY OldFlink;
04177     PLIST_ENTRY OldBlink;
04178     PLIST_ENTRY Entry;
04179 
04180     Entry = ListHead->Blink;
04181     OldFlink = ListHead->Blink->Flink;
04182     OldBlink = ListHead->Blink->Blink;
04183     OldFlink->Blink = OldBlink;
04184     OldBlink->Flink = OldFlink;
04185 
04186   if (Entry != ListHead)
04187   {
04188     Entry->Flink = NULL;
04189     Entry->Blink = NULL;
04190   }
04191    
04192   return Entry;
04193 }
04194 
04195 /*
04196  * USHORT
04197  * QueryDepthSList(
04198  * IN PSLIST_HEADER  SListHead)
04199  */
04200 #define QueryDepthSList(_SListHead) \
04201   ((USHORT) ((_SListHead)->Alignment & 0xffff))
04202 
04203 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
04204 
04205 NTOSAPI
04206 ULONG
04207 DDKAPI
04208 RtlAnsiStringToUnicodeSize(
04209   /*IN*/ PANSI_STRING  AnsiString);
04210 
04211 NTOSAPI
04212 NTSTATUS
04213 DDKAPI
04214 RtlAddRange(
04215   /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
04216   /*IN*/ ULONGLONG  Start,
04217   /*IN*/ ULONGLONG  End,
04218   /*IN*/ UCHAR  Attributes,
04219   /*IN*/ ULONG  Flags,
04220   /*IN*/ PVOID  UserData  /*OPTIONAL*/,
04221   /*IN*/ PVOID  Owner  /*OPTIONAL*/);
04222 
04223 NTOSAPI
04224 NTSTATUS
04225 DDKAPI
04226 RtlAnsiStringToUnicodeString(
04227   /*IN OUT*/ PUNICODE_STRING  DestinationString,
04228   /*IN*/ PANSI_STRING  SourceString,
04229   /*IN*/ BOOLEAN  AllocateDestinationString);
04230 
04231 NTOSAPI
04232 NTSTATUS
04233 DDKAPI
04234 RtlAppendUnicodeStringToString(
04235   /*IN OUT*/ PUNICODE_STRING  Destination,
04236   /*IN*/ PUNICODE_STRING  Source);
04237 
04238 NTOSAPI
04239 NTSTATUS
04240 DDKAPI
04241 RtlAppendUnicodeToString(
04242   /*IN OUT*/ PUNICODE_STRING  Destination,
04243   /*IN*/ PCWSTR  Source);
04244 
04245 NTOSAPI
04246 BOOLEAN
04247 DDKAPI
04248 RtlAreBitsClear(
04249   /*IN*/ PRTL_BITMAP  BitMapHeader,
04250   /*IN*/ ULONG  StartingIndex,
04251   /*IN*/ ULONG  Length); 
04252 
04253 NTOSAPI
04254 BOOLEAN
04255 DDKAPI
04256 RtlAreBitsSet(
04257   /*IN*/ PRTL_BITMAP  BitMapHeader,
04258   /*IN*/ ULONG  StartingIndex,
04259   /*IN*/ ULONG  Length); 
04260 
04261 NTOSAPI
04262 NTSTATUS
04263 DDKAPI
04264 RtlCharToInteger(
04265   /*IN*/ PCSZ  String,
04266   /*IN*/ ULONG  Base  /*OPTIONAL*/,
04267   /*IN OUT*/ PULONG  Value);
04268 
04269 NTOSAPI
04270 ULONG
04271 DDKAPI
04272 RtlCheckBit(
04273   /*IN*/ PRTL_BITMAP  BitMapHeader,
04274   /*IN*/ ULONG  BitPosition); 
04275 
04276 NTOSAPI
04277 NTSTATUS
04278 DDKAPI
04279 RtlCheckRegistryKey(
04280   /*IN*/ ULONG  RelativeTo,
04281   /*IN*/ PWSTR  Path);
04282 
04283 NTOSAPI
04284 VOID
04285 DDKAPI
04286 RtlClearAllBits(
04287   /*IN*/ PRTL_BITMAP  BitMapHeader); 
04288 
04289 NTOSAPI
04290 VOID
04291 DDKAPI
04292 RtlClearBit(
04293   PRTL_BITMAP  BitMapHeader,
04294   ULONG  BitNumber);
04295 
04296 NTOSAPI
04297 VOID
04298 DDKAPI
04299 RtlClearBits(
04300   /*IN*/ PRTL_BITMAP  BitMapHeader,
04301   /*IN*/ ULONG  StartingIndex,
04302   /*IN*/ ULONG  NumberToClear); 
04303 
04304 NTOSAPI
04305 SIZE_T
04306 DDKAPI
04307 RtlCompareMemory(
04308   /*IN*/ CONST VOID  *Source1,
04309   /*IN*/ CONST VOID  *Source2,
04310   /*IN*/ SIZE_T  Length);
04311 
04312 NTOSAPI
04313 LONG
04314 DDKAPI
04315 RtlCompareString(
04316   /*IN*/ PSTRING  String1,
04317   /*IN*/ PSTRING  String2,
04318   BOOLEAN  CaseInSensitive);
04319 
04320 NTOSAPI
04321 LONG
04322 DDKAPI
04323 RtlCompareUnicodeString(
04324   /*IN*/ PUNICODE_STRING  String1,
04325   /*IN*/ PUNICODE_STRING  String2,
04326   /*IN*/ BOOLEAN  CaseInSensitive);
04327 
04328 NTOSAPI
04329 LARGE_INTEGER
04330 DDKAPI
04331 RtlConvertLongToLargeInteger(
04332   /*IN*/ LONG  SignedInteger);
04333 
04334 NTOSAPI
04335 LUID
04336 DDKAPI
04337 RtlConvertLongToLuid(
04338   /*IN*/ LONG  Long);
04339 
04340 NTOSAPI
04341 LARGE_INTEGER
04342 DDKAPI
04343 RtlConvertUlongToLargeInteger(
04344   /*IN*/ ULONG  UnsignedInteger);
04345 
04346 NTOSAPI
04347 LUID
04348 DDKAPI
04349 RtlConvertUlongToLuid(
04350   ULONG  Ulong);
04351 
04352 /*
04353  * VOID
04354  * RtlCopyMemory(
04355  * IN VOID UNALIGNED  *Destination,
04356  * IN CONST VOID UNALIGNED  *Source,
04357  * IN SIZE_T  Length)
04358  */
04359 #ifndef RtlCopyMemory
04360 #define RtlCopyMemory(Destination, Source, Length) \
04361   memcpy(Destination, Source, Length);
04362 #endif
04363 
04364 #ifndef RtlCopyBytes
04365 #define RtlCopyBytes RtlCopyMemory
04366 #endif
04367 
04368 NTOSAPI
04369 VOID
04370 DDKAPI
04371 RtlCopyMemory32(
04372   /*IN*/ VOID UNALIGNED  *Destination,
04373   /*IN*/ CONST VOID UNALIGNED  *Source,
04374   /*IN*/ ULONG  Length);
04375 
04376 NTOSAPI
04377 NTSTATUS
04378 DDKAPI
04379 RtlCopyRangeList(
04380   /*OUT*/ PRTL_RANGE_LIST  CopyRangeList,
04381   /*IN*/ PRTL_RANGE_LIST  RangeList);
04382 
04383 NTOSAPI
04384 VOID
04385 DDKAPI
04386 RtlCopyString(
04387   /*IN OUT*/ PSTRING  DestinationString,
04388   /*IN*/ PSTRING  SourceString  /*OPTIONAL*/);
04389 
04390 NTOSAPI
04391 VOID
04392 DDKAPI
04393 RtlCopyUnicodeString(
04394   /*IN OUT*/ PUNICODE_STRING  DestinationString,
04395   /*IN*/ PUNICODE_STRING  SourceString);
04396 
04397 NTOSAPI
04398 NTSTATUS
04399 DDKAPI
04400 RtlCreateRegistryKey(
04401   /*IN*/ ULONG  RelativeTo,
04402   /*IN*/ PWSTR  Path);
04403 
04404 NTOSAPI
04405 NTSTATUS
04406 DDKAPI
04407 RtlCreateSecurityDescriptor(
04408   /*IN OUT*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
04409   /*IN*/ ULONG  Revision);
04410 
04411 NTOSAPI
04412 NTSTATUS
04413 DDKAPI
04414 RtlDeleteOwnersRanges(
04415   /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
04416   /*IN*/ PVOID  Owner);
04417 
04418 NTOSAPI
04419 NTSTATUS
04420 DDKAPI
04421 RtlDeleteRange(
04422   /*IN OUT*/ PRTL_RANGE_LIST  RangeList,
04423   /*IN*/ ULONGLONG  Start,
04424   /*IN*/ ULONGLONG  End,
04425   /*IN*/ PVOID  Owner);
04426 
04427 NTOSAPI
04428 NTSTATUS
04429 DDKAPI
04430 RtlDeleteRegistryValue(
04431   /*IN*/ ULONG  RelativeTo,
04432   /*IN*/ PCWSTR  Path,
04433   /*IN*/ PCWSTR  ValueName);
04434 
04435 NTOSAPI
04436 BOOL
04437 DDKAPI
04438 RtlDosPathNameToNtPathName_U(
04439   /*IN*/ PCWSTR  DosPathName,
04440   /*OUT*/ PUNICODE_STRING  NtPathName,
04441   /*OUT*/ PCWSTR  *NtFileNamePart,
04442   /*OUT*/ VOID  *DirectoryInfo);
04443 
04444 /*
04445  * BOOLEAN
04446  * RtlEqualLuid( 
04447  * IN LUID  Luid1,
04448  * IN LUID  Luid2)
04449  */
04450 #define RtlEqualLuid(_Luid1, \
04451                      _Luid2) \
04452   ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
04453 
04454 /*
04455  * ULONG
04456  * RtlEqualMemory(
04457  * IN VOID UNALIGNED  *Destination,
04458  * IN CONST VOID UNALIGNED  *Source,
04459  * IN SIZE_T  Length)
04460  */
04461 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
04462 
04463 NTOSAPI
04464 BOOLEAN
04465 DDKAPI
04466 RtlEqualString(
04467   /*IN*/ PSTRING  String1,
04468   /*IN*/ PSTRING  String2,
04469   /*IN*/ BOOLEAN  CaseInSensitive);
04470 
04471 NTOSAPI
04472 BOOLEAN
04473 DDKAPI
04474 RtlEqualUnicodeString(
04475   /*IN*/ CONST UNICODE_STRING  *String1,
04476   /*IN*/ CONST UNICODE_STRING  *String2,
04477   /*IN*/ BOOLEAN  CaseInSensitive);
04478 
04479 /*
04480  * VOID
04481  * RtlFillMemory(
04482  * IN VOID UNALIGNED  *Destination,
04483  * IN SIZE_T  Length,
04484  * IN UCHAR  Fill)
04485  */
04486 #ifndef RtlFillMemory
04487 #define RtlFillMemory(Destination, Length, Fill) \
04488   memset(Destination, Fill, Length)
04489 #endif
04490 
04491 #ifndef RtlFillBytes
04492 #define RtlFillBytes RtlFillMemory
04493 #endif
04494 
04495 NTOSAPI
04496 ULONG
04497 DDKAPI
04498 RtlFindClearBits(
04499   /*IN*/ PRTL_BITMAP  BitMapHeader,
04500   /*IN*/ ULONG  NumberToFind,
04501   /*IN*/ ULONG  HintIndex); 
04502 
04503 NTOSAPI
04504 ULONG
04505 DDKAPI
04506 RtlFindClearBitsAndSet(
04507   /*IN*/ PRTL_BITMAP  BitMapHeader,
04508   /*IN*/ ULONG  NumberToFind,
04509   /*IN*/ ULONG  HintIndex); 
04510 
04511 NTOSAPI
04512 ULONG
04513 DDKAPI
04514 RtlFindClearRuns( 
04515   /*IN*/ PRTL_BITMAP  BitMapHeader, 
04516   /*OUT*/ PRTL_BITMAP_RUN  RunArray, 
04517   /*IN*/ ULONG  SizeOfRunArray, 
04518   /*IN*/ BOOLEAN  LocateLongestRuns);
04519 
04520 NTOSAPI
04521 ULONG
04522 DDKAPI
04523 RtlFindFirstRunClear(
04524   /*IN*/ PRTL_BITMAP  BitMapHeader,
04525   /*OUT*/ PULONG  StartingIndex);
04526 
04527 NTOSAPI
04528 ULONG
04529 DDKAPI
04530 RtlFindLastBackwardRunClear(
04531   /*IN*/ PRTL_BITMAP  BitMapHeader, 
04532   /*IN*/ ULONG  FromIndex, 
04533   /*OUT*/ PULONG  StartingRunIndex); 
04534 
04535 NTOSAPI
04536 CCHAR
04537 DDKAPI
04538 RtlFindLeastSignificantBit(
04539   /*IN*/ ULONGLONG  Set);
04540 
04541 NTOSAPI
04542 ULONG
04543 DDKAPI
04544 RtlFindLongestRunClear(
04545   /*IN*/ PRTL_BITMAP  BitMapHeader,
04546   /*OUT*/ PULONG  StartingIndex); 
04547 
04548 NTOSAPI
04549 CCHAR
04550 DDKAPI
04551 RtlFindMostSignificantBit(
04552   /*IN*/ ULONGLONG  Set);
04553 
04554 NTOSAPI
04555 ULONG
04556 DDKAPI
04557 RtlFindNextForwardRunClear(
04558   /*IN*/ PRTL_BITMAP  BitMapHeader, 
04559   /*IN*/ ULONG  FromIndex, 
04560   /*OUT*/ PULONG  StartingRunIndex);
04561 
04562 NTOSAPI
04563 NTSTATUS
04564 DDKAPI
04565 RtlFindRange(
04566   /*IN*/ PRTL_RANGE_LIST  RangeList,
04567   /*IN*/ ULONGLONG  Minimum,
04568   /*IN*/ ULONGLONG  Maximum,
04569   /*IN*/ ULONG  Length,
04570   /*IN*/ ULONG  Alignment,
04571   /*IN*/ ULONG  Flags,
04572   /*IN*/ UCHAR  AttributeAvailableMask,
04573   /*IN*/ PVOID  Context  /*OPTIONAL*/,
04574   /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK  Callback  /*OPTIONAL*/,
04575   /*OUT*/ PULONGLONG  Start);
04576 
04577 NTOSAPI
04578 ULONG
04579 DDKAPI
04580 RtlFindSetBits(
04581   /*IN*/ PRTL_BITMAP  BitMapHeader,
04582   /*IN*/ ULONG  NumberToFind,
04583   /*IN*/ ULONG  HintIndex); 
04584 
04585 NTOSAPI
04586 ULONG
04587 DDKAPI
04588 RtlFindSetBitsAndClear(
04589   /*IN*/ PRTL_BITMAP  BitMapHeader,
04590   /*IN*/ ULONG  NumberToFind,
04591   /*IN*/ ULONG  HintIndex); 
04592 
04593 NTOSAPI
04594 VOID
04595 DDKAPI
04596 RtlFreeAnsiString(
04597   /*IN*/ PANSI_STRING  AnsiString);
04598 
04599 NTOSAPI
04600 VOID
04601 DDKAPI
04602 RtlFreeRangeList(
04603   /*IN*/ PRTL_RANGE_LIST  RangeList);
04604 
04605 NTOSAPI
04606 VOID
04607 DDKAPI
04608 RtlFreeUnicodeString(
04609   /*IN*/ PUNICODE_STRING  UnicodeString);
04610 
04611 NTOSAPI
04612 VOID
04613 DDKAPI
04614 RtlGetCallersAddress(
04615   /*OUT*/ PVOID  *CallersAddress,
04616   /*OUT*/ PVOID  *CallersCaller);
04617 
04618 NTOSAPI
04619 NTSTATUS
04620 DDKAPI
04621 RtlGetVersion(
04622   /*IN OUT*/ PRTL_OSVERSIONINFOW  lpVersionInformation);
04623 
04624 NTOSAPI
04625 NTSTATUS
04626 DDKAPI
04627 RtlGetFirstRange(
04628   /*IN*/ PRTL_RANGE_LIST  RangeList,
04629   /*OUT*/ PRTL_RANGE_LIST_ITERATOR  Iterator,
04630   /*OUT*/ PRTL_RANGE  *Range);
04631 
04632 NTOSAPI
04633 NTSTATUS
04634 DDKAPI
04635 RtlGetNextRange(
04636   /*IN OUT*/  PRTL_RANGE_LIST_ITERATOR  Iterator,
04637   /*OUT*/ PRTL_RANGE  *Range,
04638   /*IN*/ BOOLEAN  MoveForwards);
04639 
04640 #define FOR_ALL_RANGES(RangeList, Iterator, Current)          \
04641   for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
04642     (Current) != NULL;                                        \
04643     RtlGetNextRange((Iterator), &(Current), TRUE))
04644 
04645 #define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
04646   for (RtlGetLastRange((RangeList), (Iterator), &(Current));   \
04647     (Current) != NULL;                                         \
04648     RtlGetNextRange((Iterator), &(Current), FALSE))
04649 
04650 NTOSAPI
04651 NTSTATUS
04652 DDKAPI
04653 RtlGUIDFromString( 
04654   /*IN*/ PUNICODE_STRING  GuidString, 
04655   /*OUT*/ GUID  *Guid);
04656 
04657 NTOSAPI
04658 NTSTATUS
04659 DDKAPI
04660 RtlHashUnicodeString(
04661   /*IN*/ CONST UNICODE_STRING  *String,
04662   /*IN*/ BOOLEAN  CaseInSensitive,
04663   /*IN*/ ULONG  HashAlgorithm,
04664   /*OUT*/ PULONG  HashValue);
04665 
04666 NTOSAPI
04667 VOID
04668 DDKAPI
04669 RtlInitAnsiString(
04670   /*IN OUT*/ PANSI_STRING  DestinationString,
04671   /*IN*/ PCSZ  SourceString);
04672 
04673 NTOSAPI
04674 VOID
04675 DDKAPI
04676 RtlInitializeBitMap(
04677   /*IN*/ PRTL_BITMAP  BitMapHeader,
04678   /*IN*/ PULONG  BitMapBuffer,
04679   /*IN*/ ULONG  SizeOfBitMap); 
04680 
04681 NTOSAPI
04682 VOID
04683 DDKAPI
04684 RtlInitializeRangeList(
04685   /*IN OUT*/ PRTL_RANGE_LIST  RangeList);
04686 
04687 NTOSAPI
04688 VOID
04689 DDKAPI
04690 RtlInitString(
04691   /*IN OUT*/ PSTRING  DestinationString,
04692   /*IN*/ PCSZ  SourceString);
04693 
04694 NTOSAPI
04695 VOID
04696 DDKAPI
04697 RtlInitUnicodeString(
04698   /*IN OUT*/ PUNICODE_STRING  DestinationString,
04699   /*IN*/ PCWSTR  SourceString);
04700 
04701 NTOSAPI
04702 NTSTATUS
04703 DDKAPI
04704 RtlInt64ToUnicodeString(
04705   /*IN*/ ULONGLONG  Value,
04706   /*IN*/ ULONG  Base /*OPTIONAL*/,
04707   /*IN OUT*/ PUNICODE_STRING  String);
04708 
04709 NTOSAPI
04710 NTSTATUS
04711 DDKAPI
04712 RtlIntegerToUnicodeString(
04713   /*IN*/ ULONG  Value,
04714   /*IN*/ ULONG  Base  /*OPTIONAL*/,
04715   /*IN OUT*/ PUNICODE_STRING  String);
04716 
04717 NTOSAPI
04718 NTSTATUS
04719 DDKAPI
04720 RtlIntPtrToUnicodeString(
04721   PLONG  Value,
04722   ULONG  Base  /*OPTIONAL*/,
04723   PUNICODE_STRING  String);
04724 
04725 NTOSAPI
04726 NTSTATUS
04727 DDKAPI
04728 RtlInvertRangeList(
04729   /*OUT*/ PRTL_RANGE_LIST  InvertedRangeList,
04730   /*IN*/ PRTL_RANGE_LIST  RangeList);
04731 
04732 NTOSAPI
04733 NTSTATUS
04734 DDKAPI
04735 RtlIsRangeAvailable(
04736   /*IN*/ PRTL_RANGE_LIST  RangeList,
04737   /*IN*/ ULONGLONG  Start,
04738   /*IN*/ ULONGLONG  End,
04739   /*IN*/ ULONG  Flags,
04740   /*IN*/ UCHAR  AttributeAvailableMask,
04741   /*IN*/ PVOID  Context  /*OPTIONAL*/,
04742   /*IN*/ PRTL_CONFLICT_RANGE_CALLBACK  Callback  /*OPTIONAL*/,
04743   /*OUT*/ PBOOLEAN  Available);
04744 
04745 /*
04746  * BOOLEAN
04747  * RtlIsZeroLuid(
04748  * IN PLUID  L1)
04749  */
04750 #define RtlIsZeroLuid(_L1) \
04751   ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
04752 
04753 NTOSAPI
04754 ULONG
04755 DDKAPI
04756 RtlLengthSecurityDescriptor(
04757   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);
04758 
04759 NTOSAPI
04760 VOID
04761 DDKAPI
04762 RtlMapGenericMask(
04763   /*IN OUT*/ PACCESS_MASK  AccessMask,
04764   /*IN*/ PGENERIC_MAPPING  GenericMapping);
04765 
04766 NTOSAPI
04767 NTSTATUS
04768 DDKAPI
04769 RtlMergeRangeLists(
04770   /*OUT*/ PRTL_RANGE_LIST  MergedRangeList,
04771   /*IN*/ PRTL_RANGE_LIST  RangeList1,
04772   /*IN*/ PRTL_RANGE_LIST  RangeList2,
04773   /*IN*/ ULONG  Flags);
04774 
04775 /*
04776  * VOID
04777  * RtlMoveMemory(
04778  * IN VOID UNALIGNED  *Destination,
04779  * IN CONST VOID UNALIGNED  *Source,
04780  * IN SIZE_T  Length)
04781  */
04782 #define RtlMoveMemory memmove
04783 
04784 NTOSAPI
04785 ULONG
04786 DDKAPI
04787 RtlNumberOfClearBits(
04788   /*IN*/ PRTL_BITMAP  BitMapHeader);
04789 
04790 NTOSAPI
04791 ULONG
04792 DDKAPI
04793 RtlNumberOfSetBits(
04794   /*IN*/ PRTL_BITMAP  BitMapHeader); 
04795 
04796 NTOSAPI
04797 VOID
04798 DDKFASTAPI
04799 RtlPrefetchMemoryNonTemporal(
04800   /*IN*/ PVOID  Source,
04801   /*IN*/ SIZE_T  Length);
04802 
04803 NTOSAPI
04804 BOOLEAN
04805 DDKAPI
04806 RtlPrefixUnicodeString( 
04807   /*IN*/ PUNICODE_STRING  String1, 
04808   /*IN*/ PUNICODE_STRING  String2, 
04809   /*IN*/ BOOLEAN  CaseInSensitive);
04810 
04811 NTOSAPI
04812 NTSTATUS
04813 DDKAPI
04814 RtlQueryRegistryValues(
04815   /*IN*/ ULONG  RelativeTo,
04816   /*IN*/ PCWSTR  Path,
04817   /*IN*/ PRTL_QUERY_REGISTRY_TABLE  QueryTable,
04818   /*IN*/ PVOID  Context,
04819   /*IN*/ PVOID  Environment  /*OPTIONAL*/);
04820 
04821 NTOSAPI
04822 VOID
04823 DDKAPI
04824 RtlRetrieveUlong(
04825   /*IN OUT*/ PULONG  DestinationAddress,
04826   /*IN*/ PULONG  SourceAddress);
04827 
04828 NTOSAPI
04829 VOID
04830 DDKAPI
04831 RtlRetrieveUshort(
04832   /*IN OUT*/ PUSHORT  DestinationAddress,
04833   /*IN*/ PUSHORT  SourceAddress);
04834 
04835 NTOSAPI
04836 VOID
04837 DDKAPI
04838 RtlSetAllBits(
04839   /*IN*/ PRTL_BITMAP  BitMapHeader); 
04840 
04841 NTOSAPI
04842 VOID
04843 DDKAPI
04844 RtlSetBit(
04845   PRTL_BITMAP  BitMapHeader,
04846   ULONG  BitNumber);
04847 
04848 NTOSAPI
04849 VOID
04850 DDKAPI
04851 RtlSetBits(
04852   /*IN*/ PRTL_BITMAP  BitMapHeader,
04853   /*IN*/ ULONG  StartingIndex,
04854   /*IN*/ ULONG  NumberToSet); 
04855 
04856 NTOSAPI
04857 NTSTATUS
04858 DDKAPI
04859 RtlSetDaclSecurityDescriptor(
04860   /*IN OUT*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
04861   /*IN*/ BOOLEAN  DaclPresent,
04862   /*IN*/ PACL  Dacl  /*OPTIONAL*/,
04863   /*IN*/ BOOLEAN  DaclDefaulted  /*OPTIONAL*/);
04864 
04865 NTOSAPI
04866 VOID
04867 DDKAPI
04868 RtlStoreUlong(
04869   /*IN*/ PULONG  Address,
04870   /*IN*/ ULONG  Value);
04871 
04872 NTOSAPI
04873 VOID
04874 DDKAPI
04875 RtlStoreUlonglong(
04876   /*IN OUT*/ PULONGLONG  Address,
04877   ULONGLONG  Value);
04878 
04879 NTOSAPI
04880 VOID
04881 DDKAPI
04882 RtlStoreUlongPtr(
04883   /*IN OUT*/ PULONG_PTR  Address,
04884   /*IN*/ ULONG_PTR  Value);
04885 
04886 NTOSAPI
04887 VOID
04888 DDKAPI
04889 RtlStoreUshort(
04890   /*IN*/ PUSHORT  Address,
04891   /*IN*/ USHORT  Value);
04892 
04893 NTOSAPI
04894 NTSTATUS
04895 DDKAPI
04896 RtlStringFromGUID( 
04897   /*IN*/ REFGUID  Guid, 
04898   /*OUT*/ PUNICODE_STRING  GuidString);
04899 
04900 #define RtlStringCbCopyA(dst, dst_len, src) strncpy(dst, src, dst_len)
04901 #define RtlStringCbPrintfA(args...) snprintf(args)
04902 #define RtlStringCbVPrintfA(args...) vsnprintf(args)
04903 
04904 NTOSAPI
04905 BOOLEAN
04906 DDKAPI
04907 RtlTestBit(
04908   /*IN*/ PRTL_BITMAP  BitMapHeader,
04909   /*IN*/ ULONG  BitNumber);
04910 
04911 NTOSAPI
04912 BOOLEAN
04913 DDKAPI
04914 RtlTimeFieldsToTime(
04915   /*IN*/ PTIME_FIELDS  TimeFields,
04916   /*IN*/ PLARGE_INTEGER  Time);
04917 
04918 NTOSAPI
04919 VOID
04920 DDKAPI
04921 RtlTimeToTimeFields(
04922   /*IN*/ PLARGE_INTEGER  Time,
04923   /*IN*/ PTIME_FIELDS  TimeFields);
04924 
04925 NTOSAPI
04926 ULONG
04927 DDKFASTAPI
04928 RtlUlongByteSwap(
04929   /*IN*/ ULONG  Source);
04930 
04931 NTOSAPI
04932 ULONGLONG
04933 DDKFASTAPI
04934 RtlUlonglongByteSwap(
04935   /*IN*/ ULONGLONG  Source);
04936 
04937 NTOSAPI
04938 ULONG
04939 DDKAPI
04940 RtlUnicodeStringToAnsiSize(
04941   /*IN*/ PUNICODE_STRING  UnicodeString);
04942 
04943 NTOSAPI
04944 NTSTATUS
04945 DDKAPI
04946 RtlUnicodeStringToAnsiString(
04947   /*IN OUT*/ PANSI_STRING  DestinationString,
04948   /*IN*/ PUNICODE_STRING  SourceString,
04949   /*IN*/ BOOLEAN  AllocateDestinationString);
04950 
04951 NTOSAPI
04952 NTSTATUS
04953 DDKAPI
04954 RtlUnicodeStringToInteger(
04955   /*IN*/ PUNICODE_STRING  String,
04956   /*IN*/ ULONG  Base  /*OPTIONAL*/,
04957   /*OUT*/ PULONG  Value);
04958 
04959 NTOSAPI
04960 WCHAR
04961 DDKAPI
04962 RtlUpcaseUnicodeChar( 
04963   /*IN*/ WCHAR  SourceCharacter);
04964 
04965 NTOSAPI
04966 NTSTATUS
04967 DDKAPI
04968 RtlUpcaseUnicodeString(
04969   /*IN OUT*/ PUNICODE_STRING  DestinationString  /*OPTIONAL*/,
04970   /*IN*/ PCUNICODE_STRING  SourceString,
04971   /*IN*/ BOOLEAN  AllocateDestinationString);
04972 
04973 NTOSAPI
04974 CHAR
04975 DDKAPI
04976 RtlUpperChar( 
04977   /*IN*/ CHAR Character);
04978 
04979 NTOSAPI
04980 VOID
04981 DDKAPI
04982 RtlUpperString(
04983   /*IN OUT*/ PSTRING  DestinationString,
04984   /*IN*/ PSTRING  SourceString);
04985 
04986 NTOSAPI
04987 USHORT
04988 DDKFASTAPI
04989 RtlUshortByteSwap(
04990   /*IN*/ USHORT  Source);
04991 
04992 NTOSAPI
04993 BOOLEAN
04994 DDKAPI
04995 RtlValidRelativeSecurityDescriptor(
04996   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptorInput,
04997   /*IN*/ ULONG  SecurityDescriptorLength,
04998   /*IN*/ SECURITY_INFORMATION  RequiredInformation);
04999 
05000 NTOSAPI
05001 BOOLEAN
05002 DDKAPI
05003 RtlValidSecurityDescriptor(
05004   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);
05005 
05006 NTOSAPI
05007 NTSTATUS
05008 DDKAPI
05009 RtlVerifyVersionInfo(
05010   /*IN*/ PRTL_OSVERSIONINFOEXW  VersionInfo,
05011   /*IN*/ ULONG  TypeMask,
05012   /*IN*/ ULONGLONG  ConditionMask);
05013 
05014 NTOSAPI
05015 NTSTATUS
05016 DDKAPI
05017 RtlVolumeDeviceToDosName(
05018   /*IN*/ PVOID  VolumeDeviceObject,
05019   /*OUT*/ PUNICODE_STRING  DosName);
05020 
05021 NTOSAPI
05022 ULONG
05023 DDKAPI
05024 RtlWalkFrameChain(
05025   /*OUT*/ PVOID  *Callers,
05026   /*IN*/ ULONG  Count,
05027   /*IN*/ ULONG  Flags);
05028 
05029 NTOSAPI
05030 NTSTATUS
05031 DDKAPI
05032 RtlWriteRegistryValue(
05033   /*IN*/ ULONG  RelativeTo,
05034   /*IN*/ PCWSTR  Path,
05035   /*IN*/ PCWSTR  ValueName,
05036   /*IN*/ ULONG  ValueType,
05037   /*IN*/ PVOID  ValueData,
05038   /*IN*/ ULONG  ValueLength);
05039 
05040 NTOSAPI
05041 ULONG
05042 DDKAPI
05043 RtlxUnicodeStringToAnsiSize(
05044   /*IN*/ PUNICODE_STRING  UnicodeString);
05045 
05046 /*
05047  * VOID
05048  * RtlZeroMemory(
05049  * IN VOID UNALIGNED  *Destination,
05050  * IN SIZE_T  Length)
05051  */
05052 #ifndef RtlZeroMemory
05053 #define RtlZeroMemory(Destination, Length) \
05054   memset(Destination, 0, Length)
05055 #endif
05056 
05057 #ifndef RtlZeroBytes
05058 #define RtlZeroBytes RtlZeroMemory
05059 #endif
05060 
05061 
05062 /** Executive support routines **/
05063 
05064 NTOSAPI
05065 VOID
05066 DDKFASTAPI
05067 ExAcquireFastMutex(
05068   /*IN*/ PFAST_MUTEX  FastMutex);
05069 
05070 NTOSAPI
05071 VOID
05072 DDKFASTAPI
05073 ExAcquireFastMutexUnsafe(
05074   /*IN*/ PFAST_MUTEX  FastMutex);
05075 
05076 NTOSAPI
05077 BOOLEAN
05078 DDKAPI
05079 ExAcquireResourceExclusiveLite(
05080   /*IN*/ PERESOURCE  Resource,
05081   /*IN*/ BOOLEAN  Wait);
05082 
05083 NTOSAPI
05084 BOOLEAN
05085 DDKAPI
05086 ExAcquireResourceSharedLite(
05087   /*IN*/ PERESOURCE  Resource,
05088   /*IN*/ BOOLEAN  Wait);
05089 
05090 NTOSAPI
05091 BOOLEAN
05092 DDKAPI
05093 ExAcquireSharedStarveExclusive(
05094   /*IN*/ PERESOURCE  Resource,
05095   /*IN*/ BOOLEAN  Wait);
05096 
05097 NTOSAPI
05098 BOOLEAN
05099 DDKAPI
05100 ExAcquireSharedWaitForExclusive(
05101   /*IN*/ PERESOURCE  Resource,
05102   /*IN*/ BOOLEAN  Wait);
05103 
05104 
05105 NTOSAPI
05106 PSINGLE_LIST_ENTRY
05107 DDKFASTAPI
05108 ExInterlockedPopEntrySList(
05109   /*IN*/ PSLIST_HEADER  ListHead,
05110   /*IN*/ PKSPIN_LOCK  Lock);
05111 
05112 
05113 NTOSAPI
05114 PSINGLE_LIST_ENTRY
05115 DDKFASTAPI
05116 ExInterlockedPushEntrySList(
05117   /*IN*/ PSLIST_HEADER  ListHead,
05118   /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
05119   /*IN*/ PKSPIN_LOCK  Lock);
05120 
05121 
05122 #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
05123 #define ExInterlockedPopEntrySList(_ListHead, \
05124                                    _Lock) \
05125   InterlockedPopEntrySList(_ListHead)
05126 
05127 #define ExInterlockedPushEntrySList(_ListHead, \
05128                                     _ListEntry, \
05129                                     _Lock) \
05130   InterlockedPushEntrySList(_ListHead, _ListEntry)
05131 #endif /*  __USE_NTOSKRNL__ */
05132 
05133 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
05134 
05135 static __inline PVOID
05136 ExAllocateFromNPagedLookasideList(
05137   /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside)
05138 {
05139   PVOID Entry;
05140 
05141   Lookaside->TotalAllocates++;
05142   Entry = ExInterlockedPopEntrySList(&Lookaside->ListHead,
05143                      &Lookaside->Obsoleted);
05144   if (Entry == NULL) {
05145     Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
05146     Entry = (Lookaside->Allocate)(Lookaside->Type,
05147                   Lookaside->Size,
05148                   Lookaside->Tag);
05149   }
05150   return Entry;
05151 }
05152 
05153 static __inline VOID
05154 ExFreeToNPagedLookasideList(
05155   /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside,
05156   /*IN*/ PVOID  Entry)
05157 {
05158   Lookaside->TotalFrees++;
05159   if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
05160     Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
05161     (Lookaside->Free)(Entry);
05162   } else {
05163     ExInterlockedPushEntrySList(&Lookaside->ListHead,
05164                 (PSLIST_ENTRY)Entry,
05165                 &Lookaside->Obsoleted);
05166   }
05167 }
05168 
05169 #if (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501)
05170 
05171 static __inline PVOID
05172 ExAllocateFromPagedLookasideList(
05173   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside)
05174 {
05175   PVOID Entry;
05176 
05177   Lookaside->TotalAllocates++;
05178   Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
05179   if (Entry == NULL) {
05180     Lookaside->_DDK_DUMMYUNION_MEMBER(AllocateMisses)++;
05181     Entry = (Lookaside->Allocate)(Lookaside->Type,
05182                   Lookaside->Size,
05183                   Lookaside->Tag);
05184   }
05185   return Entry;
05186 }
05187 
05188 static __inline VOID
05189 ExFreeToPagedLookasideList(
05190   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside,
05191   /*IN*/ PVOID  Entry)
05192 {
05193   Lookaside->TotalFrees++;
05194   if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
05195     Lookaside->_DDK_DUMMYUNION_N_MEMBER(2,FreeMisses)++;
05196     (Lookaside->Free)(Entry);
05197   } else {
05198     InterlockedPushEntrySList(&Lookaside->ListHead,
05199                   (PSLIST_ENTRY)Entry);
05200   }
05201 }
05202 
05203 #else /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
05204 
05205 NTOSAPI
05206 PVOID
05207 DDKAPI
05208 ExAllocateFromPagedLookasideList(
05209   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside);
05210 
05211 NTOSAPI
05212 VOID
05213 DDKAPI
05214 ExFreeToPagedLookasideList(
05215   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside,
05216   /*IN*/ PVOID  Entry);
05217 
05218 #endif /* (__USE_NTOSKRNL__) && (_WIN32_WINNT >= 0x0501) */
05219 
05220 NTOSAPI
05221 PVOID
05222 DDKAPI
05223 ExAllocatePoolWithQuotaTag(
05224   /*IN*/ POOL_TYPE  PoolType,
05225   /*IN*/ SIZE_T  NumberOfBytes,
05226   /*IN*/ ULONG  Tag);
05227 
05228 NTOSAPI
05229 PVOID
05230 DDKAPI
05231 ExAllocatePoolWithTag(
05232   /*IN*/ POOL_TYPE  PoolType,
05233   /*IN*/ SIZE_T  NumberOfBytes,
05234   /*IN*/ ULONG  Tag);
05235 
05236 #ifdef POOL_TAGGING
05237 
05238 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
05239 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
05240 
05241 #else /* !POOL_TAGGING */
05242 
05243 NTOSAPI
05244 PVOID
05245 DDKAPI
05246 ExAllocatePool(
05247   /*IN*/ POOL_TYPE  PoolType,
05248   /*IN*/ SIZE_T  NumberOfBytes);
05249 
05250 NTOSAPI
05251 PVOID
05252 DDKAPI
05253 ExAllocatePoolWithQuota(
05254   /*IN*/ POOL_TYPE  PoolType,
05255   /*IN*/ SIZE_T  NumberOfBytes);
05256 
05257 #endif /* POOL_TAGGING */
05258 
05259 NTOSAPI
05260 PVOID
05261 DDKAPI
05262 ExAllocatePoolWithTagPriority(
05263   /*IN*/ POOL_TYPE  PoolType,
05264   /*IN*/ SIZE_T  NumberOfBytes,
05265   /*IN*/ ULONG  Tag,
05266   /*IN*/ EX_POOL_PRIORITY  Priority);
05267 
05268 NTOSAPI
05269 VOID
05270 DDKAPI
05271 ExConvertExclusiveToSharedLite(
05272   /*IN*/ PERESOURCE  Resource);
05273 
05274 NTOSAPI
05275 NTSTATUS
05276 DDKAPI
05277 ExCreateCallback(
05278   /*OUT*/ PCALLBACK_OBJECT  *CallbackObject,
05279   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
05280   /*IN*/ BOOLEAN  Create,
05281   /*IN*/ BOOLEAN  AllowMultipleCallbacks);
05282 
05283 NTOSAPI
05284 VOID
05285 DDKAPI
05286 ExDeleteNPagedLookasideList(
05287   /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside);
05288 
05289 NTOSAPI
05290 VOID
05291 DDKAPI
05292 ExDeletePagedLookasideList(
05293   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside);
05294 
05295 NTOSAPI
05296 NTSTATUS
05297 DDKAPI
05298 ExDeleteResourceLite(
05299   /*IN*/ PERESOURCE  Resource);
05300 
05301 NTOSAPI
05302 VOID
05303 DDKAPI
05304 ExFreePool(
05305   /*IN*/ PVOID  P);
05306 
05307 #define PROTECTED_POOL                    0x80000000
05308 
05309 #ifdef POOL_TAGGING
05310 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
05311 #endif
05312 
05313 NTOSAPI
05314 VOID
05315 DDKAPI
05316 ExFreePoolWithTag(
05317   /*IN*/ PVOID  P,
05318   /*IN*/ ULONG  Tag);
05319 
05320 /*
05321  * ERESOURCE_THREAD
05322  * ExGetCurrentResourceThread(
05323  *   VOID);
05324  */
05325 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
05326 
05327 NTOSAPI
05328 ULONG
05329 DDKAPI
05330 ExGetExclusiveWaiterCount(
05331   /*IN*/ PERESOURCE  Resource);
05332 
05333 NTOSAPI
05334 KPROCESSOR_MODE
05335 DDKAPI
05336 ExGetPreviousMode( 
05337   VOID);
05338 
05339 NTOSAPI
05340 ULONG
05341 DDKAPI
05342 ExGetSharedWaiterCount(
05343   /*IN*/ PERESOURCE  Resource);
05344 
05345 NTOSAPI
05346 VOID
05347 DDKAPI
05348 KeInitializeEvent(
05349   /*IN*/ PRKEVENT  Event,
05350   /*IN*/ EVENT_TYPE  Type,
05351   /*IN*/ BOOLEAN  State);
05352 
05353 /*
05354  * VOID DDKAPI
05355  * ExInitializeFastMutex(
05356  * IN PFAST_MUTEX  FastMutex)
05357  */
05358 #define ExInitializeFastMutex(_FastMutex) \
05359 { \
05360   (_FastMutex)->Count = 1; \
05361   (_FastMutex)->Owner = NULL; \
05362   (_FastMutex)->Contention = 0; \
05363   KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
05364 }
05365 
05366 NTOSAPI
05367 VOID
05368 DDKAPI
05369 ExInitializeNPagedLookasideList(
05370   /*IN*/ PNPAGED_LOOKASIDE_LIST  Lookaside,
05371   /*IN*/ PALLOCATE_FUNCTION  Allocate  /*OPTIONAL*/,
05372   /*IN*/ PFREE_FUNCTION  Free  /*OPTIONAL*/,
05373   /*IN*/ ULONG  Flags,
05374   /*IN*/ SIZE_T  Size,
05375   /*IN*/ ULONG  Tag,
05376   /*IN*/ USHORT  Depth);
05377 
05378 NTOSAPI
05379 VOID
05380 DDKAPI
05381 ExInitializePagedLookasideList(
05382   /*IN*/ PPAGED_LOOKASIDE_LIST  Lookaside,
05383   /*IN*/ PALLOCATE_FUNCTION  Allocate  /*OPTIONAL*/,
05384   /*IN*/ PFREE_FUNCTION  Free  /*OPTIONAL*/,
05385   /*IN*/ ULONG  Flags,
05386   /*IN*/ SIZE_T  Size,
05387   /*IN*/ ULONG  Tag,
05388   /*IN*/ USHORT  Depth);
05389 
05390 NTOSAPI
05391 NTSTATUS
05392 DDKAPI
05393 ExInitializeResourceLite(
05394   /*IN*/ PERESOURCE  Resource);
05395 
05396 /*
05397  * VOID
05398  * InitializeSListHead(
05399  * IN PSLIST_HEADER  SListHead)
05400  */
05401 #define InitializeSListHead(_SListHead) \
05402     (_SListHead)->Alignment = 0
05403 
05404 #define ExInitializeSListHead InitializeSListHead
05405 
05406 NTOSAPI
05407 LARGE_INTEGER
05408 DDKAPI
05409 ExInterlockedAddLargeInteger(
05410   /*IN*/ PLARGE_INTEGER  Addend,
05411   /*IN*/ LARGE_INTEGER  Increment,
05412   /*IN*/ PKSPIN_LOCK  Lock);
05413 
05414 NTOSAPI
05415 VOID
05416 DDKFASTAPI
05417 ExInterlockedAddLargeStatistic(
05418   /*IN*/ PLARGE_INTEGER  Addend,
05419   /*IN*/ ULONG  Increment);
05420 
05421 NTOSAPI
05422 ULONG
05423 DDKAPI
05424 ExInterlockedAddUlong(
05425   /*IN*/ PULONG  Addend,
05426   /*IN*/ ULONG  Increment,
05427   PKSPIN_LOCK  Lock);
05428 
05429 NTOSAPI
05430 ULONG
05431 DDKFASTAPI
05432 ExfInterlockedAddUlong(
05433   /*IN*/ PULONG  Addend,
05434   /*IN*/ ULONG  Increment,
05435   PKSPIN_LOCK  Lock);
05436 
05437 
05438 NTOSAPI
05439 LONGLONG
05440 DDKFASTAPI
05441 ExInterlockedCompareExchange64(
05442   /*IN OUT*/ PLONGLONG  Destination,
05443   /*IN*/ PLONGLONG  Exchange,
05444   /*IN*/ PLONGLONG  Comparand,
05445   /*IN*/ PKSPIN_LOCK  Lock); 
05446 
05447 NTOSAPI
05448 PSINGLE_LIST_ENTRY
05449 DDKFASTAPI
05450 ExInterlockedFlushSList(
05451   /*IN*/ PSLIST_HEADER  ListHead);
05452 
05453 NTOSAPI
05454 PLIST_ENTRY
05455 DDKAPI
05456 ExInterlockedInsertHeadList(
05457   /*IN*/ PLIST_ENTRY  ListHead,
05458   /*IN*/ PLIST_ENTRY  ListEntry,
05459   /*IN*/ PKSPIN_LOCK  Lock);
05460 
05461 NTOSAPI
05462 PLIST_ENTRY
05463 DDKFASTAPI
05464 ExfInterlockedInsertHeadList(
05465   /*IN*/ PLIST_ENTRY  ListHead,
05466   /*IN*/ PLIST_ENTRY  ListEntry,
05467   /*IN*/ PKSPIN_LOCK  Lock);
05468 
05469 NTOSAPI
05470 PLIST_ENTRY
05471 DDKAPI
05472 ExInterlockedInsertTailList(
05473   /*IN*/ PLIST_ENTRY  ListHead,
05474   /*IN*/ PLIST_ENTRY  ListEntry,
05475   /*IN*/ PKSPIN_LOCK  Lock);
05476 
05477 NTOSAPI
05478 PLIST_ENTRY
05479 DDKFASTAPI
05480 ExfInterlockedInsertTailList(
05481   /*IN*/ PLIST_ENTRY  ListHead,
05482   /*IN*/ PLIST_ENTRY  ListEntry,
05483   /*IN*/ PKSPIN_LOCK  Lock);
05484 
05485 NTOSAPI
05486 PSINGLE_LIST_ENTRY
05487 DDKAPI
05488 ExInterlockedPopEntryList(
05489   /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
05490   /*IN*/ PKSPIN_LOCK  Lock);
05491 
05492 NTOSAPI
05493 PSINGLE_LIST_ENTRY
05494 DDKFASTAPI
05495 ExfInterlockedPopEntryList(
05496   /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
05497   /*IN*/ PKSPIN_LOCK  Lock);
05498 
05499 
05500 NTOSAPI
05501 PSINGLE_LIST_ENTRY
05502 DDKAPI
05503 ExInterlockedPushEntryList(
05504   /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
05505   /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
05506   /*IN*/ PKSPIN_LOCK  Lock);
05507 
05508 NTOSAPI
05509 PSINGLE_LIST_ENTRY
05510 DDKFASTAPI
05511 ExfInterlockedPushEntryList(
05512   /*IN*/ PSINGLE_LIST_ENTRY  ListHead,
05513   /*IN*/ PSINGLE_LIST_ENTRY  ListEntry,
05514   /*IN*/ PKSPIN_LOCK  Lock);
05515 
05516 
05517 NTOSAPI
05518 PLIST_ENTRY
05519 DDKAPI
05520 ExInterlockedRemoveHeadList(
05521   /*IN*/ PLIST_ENTRY  ListHead,
05522   /*IN*/ PKSPIN_LOCK  Lock);
05523 
05524 NTOSAPI
05525 PLIST_ENTRY
05526 DDKFASTAPI
05527 ExfInterlockedRemoveHeadList(
05528   /*IN*/ PLIST_ENTRY  ListHead,
05529   /*IN*/ PKSPIN_LOCK  Lock);
05530 
05531 
05532 NTOSAPI
05533 BOOLEAN
05534 DDKAPI
05535 ExIsProcessorFeaturePresent(
05536   /*IN*/ ULONG  ProcessorFeature);
05537 
05538 NTOSAPI
05539 BOOLEAN
05540 DDKAPI
05541 ExIsResourceAcquiredExclusiveLite(
05542   /*IN*/ PERESOURCE  Resource);
05543 
05544 NTOSAPI
05545 USHORT
05546 DDKAPI
05547 ExIsResourceAcquiredLite(
05548   /*IN*/ PERESOURCE  Resource);
05549 
05550 NTOSAPI
05551 USHORT
05552 DDKAPI
05553 ExIsResourceAcquiredSharedLite(
05554   /*IN*/ PERESOURCE  Resource);
05555 
05556 NTOSAPI
05557 VOID
05558 DDKAPI
05559 ExLocalTimeToSystemTime(
05560   /*IN*/ PLARGE_INTEGER  LocalTime,
05561   /*OUT*/ PLARGE_INTEGER  SystemTime);
05562 
05563 NTOSAPI
05564 VOID
05565 DDKAPI
05566 ExNotifyCallback(
05567   /*IN*/ PCALLBACK_OBJECT  CallbackObject,
05568   /*IN*/ PVOID  Argument1,
05569   /*IN*/ PVOID  Argument2);
05570 
05571 NTOSAPI
05572 VOID
05573 DDKAPI
05574 ExRaiseAccessViolation(
05575   VOID);
05576 
05577 NTOSAPI
05578 VOID
05579 DDKAPI
05580 ExRaiseDatatypeMisalignment(
05581   VOID);
05582 
05583 NTOSAPI
05584 VOID
05585 DDKAPI
05586 ExRaiseStatus(
05587   /*IN*/ NTSTATUS  Status);
05588 
05589 NTOSAPI
05590 PVOID
05591 DDKAPI
05592 ExRegisterCallback(
05593   /*IN*/ PCALLBACK_OBJECT  CallbackObject,
05594   /*IN*/ PCALLBACK_FUNCTION  CallbackFunction,
05595   /*IN*/ PVOID  CallbackContext);
05596 
05597 NTOSAPI
05598 VOID
05599 DDKAPI
05600 ExReinitializeResourceLite(
05601   /*IN*/ PERESOURCE  Resource);
05602 
05603 NTOSAPI
05604 VOID
05605 DDKFASTAPI
05606 ExReleaseFastMutex(
05607   /*IN*/ PFAST_MUTEX  FastMutex);
05608 
05609 NTOSAPI
05610 VOID
05611 DDKFASTAPI
05612 ExReleaseFastMutexUnsafe(
05613   /*IN*/ PFAST_MUTEX  FastMutex);
05614 
05615 NTOSAPI
05616 VOID
05617 DDKAPI
05618 ExReleaseResourceForThreadLite(
05619   /*IN*/ PERESOURCE  Resource,
05620   /*IN*/ ERESOURCE_THREAD  ResourceThreadId);
05621 
05622 NTOSAPI
05623 VOID
05624 DDKFASTAPI
05625 ExReleaseResourceLite(
05626   /*IN*/ PERESOURCE  Resource);
05627 
05628 NTOSAPI
05629 VOID
05630 DDKAPI
05631 ExSetResourceOwnerPointer( 
05632   /*IN*/ PERESOURCE  Resource,
05633   /*IN*/ PVOID  OwnerPointer);
05634 
05635 NTOSAPI
05636 ULONG
05637 DDKAPI
05638 ExSetTimerResolution(
05639   /*IN*/ ULONG  DesiredTime,
05640   /*IN*/ BOOLEAN  SetResolution);
05641 
05642 NTOSAPI
05643 VOID
05644 DDKAPI
05645 ExSystemTimeToLocalTime(
05646   /*IN*/ PLARGE_INTEGER  SystemTime,
05647   /*OUT*/ PLARGE_INTEGER  LocalTime);
05648 
05649 NTOSAPI
05650 BOOLEAN
05651 DDKFASTAPI
05652 ExTryToAcquireFastMutex(
05653   /*IN*/ PFAST_MUTEX  FastMutex);
05654 
05655 NTOSAPI
05656 BOOLEAN
05657 DDKAPI
05658 ExTryToAcquireResourceExclusiveLite(
05659   /*IN*/ PERESOURCE  Resource);
05660 
05661 NTOSAPI
05662 VOID
05663 DDKAPI
05664 ExUnregisterCallback(
05665   /*IN*/ PVOID  CbRegistration);
05666 
05667 NTOSAPI
05668 NTSTATUS
05669 DDKAPI
05670 ExUuidCreate(
05671   /*OUT*/ UUID  *Uuid);
05672 
05673 NTOSAPI
05674 BOOLEAN
05675 DDKAPI
05676 ExVerifySuite(
05677   /*IN*/ SUITE_TYPE  SuiteType);
05678 
05679 #ifdef DBG
05680 
05681 #define PAGED_CODE() { \
05682   if (KeGetCurrentIrql() > APC_LEVEL) { \
05683     KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
05684     ASSERT(FALSE); \
05685   } \
05686 }
05687 
05688 #else
05689 
05690 #define PAGED_CODE()
05691 
05692 #endif
05693 
05694 NTOSAPI
05695 VOID
05696 DDKAPI
05697 ProbeForRead(
05698   /*IN*/ CONST VOID  *Address,
05699   /*IN*/ ULONG  Length,
05700   /*IN*/ ULONG  Alignment);
05701 
05702 NTOSAPI
05703 VOID
05704 DDKAPI
05705 ProbeForWrite(
05706   /*IN*/ CONST VOID  *Address,
05707   /*IN*/ ULONG  Length,
05708   /*IN*/ ULONG  Alignment);
05709 
05710 
05711 
05712 /** Configuration manager routines **/
05713 
05714 NTOSAPI
05715 NTSTATUS
05716 DDKAPI
05717 CmRegisterCallback(
05718   /*IN*/ PEX_CALLBACK_FUNCTION  Function,
05719   /*IN*/ PVOID  Context,
05720   /*IN OUT*/ PLARGE_INTEGER  Cookie);
05721 
05722 NTOSAPI
05723 NTSTATUS
05724 DDKAPI
05725 CmUnRegisterCallback(
05726   /*IN*/ LARGE_INTEGER  Cookie);
05727 
05728 
05729 
05730 /** Filesystem runtime library routines **/
05731 
05732 NTOSAPI
05733 BOOLEAN
05734 DDKAPI
05735 FsRtlIsTotalDeviceFailure(
05736   /*IN*/ NTSTATUS  Status);
05737 
05738 
05739 
05740 /** Hardware abstraction layer routines **/
05741 
05742 NTOSAPI
05743 VOID
05744 DDKFASTAPI
05745 HalExamineMBR(
05746   /*IN*/ PDEVICE_OBJECT  DeviceObject,
05747   /*IN*/ ULONG  SectorSize,
05748   /*IN*/ ULONG  MBRTypeIdentifier,
05749   /*OUT*/ PVOID  Buffer);
05750 
05751 NTOSAPI
05752 VOID
05753 DDKAPI
05754 READ_PORT_BUFFER_UCHAR(
05755   /*IN*/ PUCHAR  Port,
05756   /*IN*/ PUCHAR  Buffer,
05757   /*IN*/ ULONG  Count);
05758 
05759 NTOSAPI
05760 VOID
05761 DDKAPI
05762 READ_PORT_BUFFER_ULONG(
05763   /*IN*/ PULONG  Port,
05764   /*IN*/ PULONG  Buffer,
05765   /*IN*/ ULONG  Count);
05766 
05767 NTOSAPI
05768 VOID
05769 DDKAPI
05770 READ_PORT_BUFFER_USHORT(
05771   /*IN*/ PUSHORT  Port,
05772   /*IN*/ PUSHORT  Buffer,
05773   /*IN*/ ULONG  Count);
05774 
05775 NTOSAPI
05776 UCHAR
05777 DDKAPI
05778 READ_PORT_UCHAR(
05779   /*IN*/ PUCHAR  Port);
05780 
05781 NTOSAPI
05782 ULONG
05783 DDKAPI
05784 READ_PORT_ULONG(
05785   /*IN*/ PULONG  Port);
05786 
05787 NTOSAPI
05788 USHORT
05789 DDKAPI
05790 READ_PORT_USHORT(
05791   /*IN*/ PUSHORT  Port);
05792 
05793 NTOSAPI
05794 VOID
05795 DDKAPI
05796 READ_REGISTER_BUFFER_UCHAR(
05797   /*IN*/ PUCHAR  Register,
05798   /*IN*/ PUCHAR  Buffer,
05799   /*IN*/ ULONG  Count);
05800 
05801 NTOSAPI
05802 VOID
05803 DDKAPI
05804 READ_REGISTER_BUFFER_ULONG(
05805   /*IN*/ PULONG  Register,
05806   /*IN*/ PULONG  Buffer,
05807   /*IN*/ ULONG  Count);
05808 
05809 NTOSAPI
05810 VOID
05811 DDKAPI
05812 READ_REGISTER_BUFFER_USHORT(
05813   /*IN*/ PUSHORT  Register,
05814   /*IN*/ PUSHORT  Buffer,
05815   /*IN*/ ULONG  Count);
05816 
05817 NTOSAPI
05818 UCHAR
05819 DDKAPI
05820 READ_REGISTER_UCHAR(
05821   /*IN*/ PUCHAR  Register);
05822 
05823 NTOSAPI
05824 ULONG
05825 DDKAPI
05826 READ_REGISTER_ULONG(
05827   /*IN*/ PULONG  Register);
05828 
05829 NTOSAPI
05830 USHORT
05831 DDKAPI
05832 READ_REGISTER_USHORT(
05833   /*IN*/ PUSHORT  Register);
05834 
05835 NTOSAPI
05836 VOID
05837 DDKAPI
05838 WRITE_PORT_BUFFER_UCHAR(
05839   /*IN*/ PUCHAR  Port,
05840   /*IN*/ PUCHAR  Buffer,
05841   /*IN*/ ULONG  Count);
05842 
05843 NTOSAPI
05844 VOID
05845 DDKAPI
05846 WRITE_PORT_BUFFER_ULONG(
05847   /*IN*/ PULONG  Port,
05848   /*IN*/ PULONG  Buffer,
05849   /*IN*/ ULONG  Count);
05850 
05851 NTOSAPI
05852 VOID
05853 DDKAPI
05854 WRITE_PORT_BUFFER_USHORT(
05855   /*IN*/ PUSHORT  Port,
05856   /*IN*/ PUSHORT  Buffer,
05857   /*IN*/ ULONG  Count);
05858 
05859 NTOSAPI
05860 VOID
05861 DDKAPI
05862 WRITE_PORT_UCHAR(
05863   /*IN*/ PUCHAR  Port,
05864   /*IN*/ UCHAR  Value);
05865 
05866 NTOSAPI
05867 VOID
05868 DDKAPI
05869 WRITE_PORT_ULONG(
05870   /*IN*/ PULONG  Port,
05871   /*IN*/ ULONG  Value);
05872 
05873 NTOSAPI
05874 VOID
05875 DDKAPI
05876 WRITE_PORT_USHORT(
05877   /*IN*/ PUSHORT  Port,
05878   /*IN*/ USHORT  Value);
05879 
05880 NTOSAPI
05881 VOID
05882 DDKAPI
05883 WRITE_REGISTER_BUFFER_UCHAR(
05884   /*IN*/ PUCHAR  Register,
05885   /*IN*/ PUCHAR  Buffer,
05886   /*IN*/ ULONG  Count);
05887 
05888 NTOSAPI
05889 VOID
05890 DDKAPI
05891 WRITE_REGISTER_BUFFER_ULONG(
05892   /*IN*/ PULONG  Register,
05893   /*IN*/ PULONG  Buffer,
05894   /*IN*/ ULONG  Count);
05895 
05896 NTOSAPI
05897 VOID
05898 DDKAPI
05899 WRITE_REGISTER_BUFFER_USHORT(
05900   /*IN*/ PUSHORT  Register,
05901   /*IN*/ PUSHORT  Buffer,
05902   /*IN*/ ULONG  Count);
05903 
05904 NTOSAPI
05905 VOID
05906 DDKAPI
05907 WRITE_REGISTER_UCHAR(
05908   /*IN*/ PUCHAR  Register,
05909   /*IN*/ UCHAR  Value);
05910 
05911 NTOSAPI
05912 VOID
05913 DDKAPI
05914 WRITE_REGISTER_ULONG(
05915   /*IN*/ PULONG  Register,
05916   /*IN*/ ULONG  Value);
05917 
05918 NTOSAPI
05919 VOID
05920 DDKAPI
05921 WRITE_REGISTER_USHORT(
05922   /*IN*/ PUSHORT  Register,
05923   /*IN*/ USHORT  Value);
05924 
05925 /** I/O manager routines **/
05926 
05927 NTOSAPI
05928 VOID
05929 DDKAPI
05930 IoAcquireCancelSpinLock(
05931   /*OUT*/ PKIRQL  Irql);
05932 
05933 NTOSAPI
05934 NTSTATUS
05935 DDKAPI
05936 IoAcquireRemoveLockEx(
05937   /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
05938   /*IN*/ PVOID  Tag  /*OPTIONAL*/,
05939   /*IN*/ PCSTR  File,
05940   /*IN*/ ULONG  Line,
05941   /*IN*/ ULONG  RemlockSize);
05942 
05943 /*
05944  * NTSTATUS
05945  * IoAcquireRemoveLock(
05946  * IN PIO_REMOVE_LOCK  RemoveLock,
05947  * IN PVOID  Tag OPTIONAL)
05948  */
05949 #define IoAcquireRemoveLock(_RemoveLock, \
05950                             _Tag) \
05951   IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
05952 
05953 /*
05954  * VOID
05955  * IoAdjustPagingPathCount(
05956  * IN PLONG  Count,
05957  * IN BOOLEAN  Increment)
05958  */
05959 #define IoAdjustPagingPathCount(_Count, \
05960                                 _Increment) \
05961 { \
05962   if (_Increment) \
05963     { \
05964       InterlockedIncrement(_Count); \
05965     } \
05966   else \
05967     { \
05968       InterlockedDecrement(_Count); \
05969     } \
05970 }
05971 
05972 NTOSAPI
05973 VOID
05974 DDKAPI
05975 IoAllocateController(
05976   /*IN*/ PCONTROLLER_OBJECT  ControllerObject,
05977   /*IN*/ PDEVICE_OBJECT  DeviceObject,
05978   /*IN*/ PDRIVER_CONTROL  ExecutionRoutine,
05979   /*IN*/ PVOID  Context);
05980 
05981 NTOSAPI
05982 NTSTATUS
05983 DDKAPI
05984 IoAllocateDriverObjectExtension(
05985   /*IN*/ PDRIVER_OBJECT  DriverObject,
05986   /*IN*/ PVOID  ClientIdentificationAddress,
05987   /*IN*/ ULONG  DriverObjectExtensionSize,
05988   /*OUT*/ PVOID  *DriverObjectExtension);
05989 
05990 typedef struct _IO_ERROR_LOG_PACKET { 
05991     UCHAR  MajorFunctionCode; 
05992     UCHAR  RetryCount; 
05993     USHORT  DumpDataSize; 
05994     USHORT  NumberOfStrings; 
05995     USHORT  StringOffset; 
05996     USHORT  EventCategory; 
05997     NTSTATUS  ErrorCode; 
05998     ULONG  UniqueErrorValue; 
05999     NTSTATUS  FinalStatus; 
06000     ULONG  SequenceNumber; 
06001     ULONG  IoControlCode; 
06002     LARGE_INTEGER  DeviceOffset; 
06003     ULONG  DumpData[1]; 
06004 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET; 
06005 
06006 NTOSAPI
06007 PVOID
06008 DDKAPI
06009 IoAllocateErrorLogEntry(
06010   /*IN*/ PVOID  IoObject,
06011   /*IN*/ UCHAR  EntrySize);
06012 
06013 NTOSAPI
06014 PIRP
06015 DDKAPI
06016 IoAllocateIrp(
06017   /*IN*/ CCHAR  StackSize,
06018   /*IN*/ BOOLEAN  ChargeQuota);
06019 
06020 NTOSAPI
06021 PMDL
06022 DDKAPI
06023 IoAllocateMdl(
06024   /*IN*/ PVOID  VirtualAddress,
06025   /*IN*/ ULONG  Length,
06026   /*IN*/ BOOLEAN  SecondaryBuffer,
06027   /*IN*/ BOOLEAN  ChargeQuota,
06028   /*IN OUT*/ PIRP  Irp  /*OPTIONAL*/);
06029 
06030 NTOSAPI
06031 PIO_WORKITEM
06032 DDKAPI
06033 IoAllocateWorkItem(
06034   /*IN*/ PDEVICE_OBJECT  DeviceObject);
06035 
06036 /*
06037  * VOID IoAssignArcName(
06038  * IN PUNICODE_STRING  ArcName,
06039  * IN PUNICODE_STRING  DeviceName);
06040  */
06041 #define IoAssignArcName(_ArcName, _DeviceName) ( \
06042   IoCreateSymbolicLink((_ArcName), (_DeviceName)))
06043 
06044 NTOSAPI
06045 NTSTATUS
06046 DDKAPI
06047 IoAttachDevice(
06048   /*IN*/ PDEVICE_OBJECT  SourceDevice,
06049   /*IN*/ PUNICODE_STRING  TargetDevice,
06050   /*OUT*/ PDEVICE_OBJECT  *AttachedDevice);
06051 
06052 NTOSAPI
06053 PDEVICE_OBJECT
06054 DDKAPI
06055 IoAttachDeviceToDeviceStack(
06056   /*IN*/ PDEVICE_OBJECT  SourceDevice,
06057   /*IN*/ PDEVICE_OBJECT  TargetDevice);
06058 
06059 NTOSAPI
06060 PIRP
06061 DDKAPI
06062 IoBuildAsynchronousFsdRequest(
06063   /*IN*/ ULONG  MajorFunction,
06064   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06065   /*IN OUT*/ PVOID  Buffer  /*OPTIONAL*/,
06066   /*IN*/ ULONG  Length  /*OPTIONAL*/,
06067   /*IN*/ PLARGE_INTEGER  StartingOffset  /*OPTIONAL*/,
06068   /*IN*/ PIO_STATUS_BLOCK  IoStatusBlock  /*OPTIONAL*/);
06069 
06070 NTOSAPI
06071 PIRP
06072 DDKAPI
06073 IoBuildDeviceIoControlRequest(
06074   /*IN*/ ULONG  IoControlCode,
06075   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06076   /*IN*/ PVOID  InputBuffer  /*OPTIONAL*/,
06077   /*IN*/ ULONG  InputBufferLength,
06078   /*OUT*/ PVOID  OutputBuffer  /*OPTIONAL*/,
06079   /*IN*/ ULONG  OutputBufferLength,
06080   /*IN*/ BOOLEAN  InternalDeviceIoControl,
06081   /*IN*/ PKEVENT  Event,
06082   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock);
06083 
06084 NTOSAPI
06085 VOID
06086 DDKAPI
06087 IoBuildPartialMdl(
06088   /*IN*/ PMDL  SourceMdl,
06089   /*IN OUT*/ PMDL  TargetMdl,
06090   /*IN*/ PVOID  VirtualAddress,
06091   /*IN*/ ULONG  Length);
06092 
06093 NTOSAPI
06094 PIRP
06095 DDKAPI
06096 IoBuildSynchronousFsdRequest(
06097   /*IN*/ ULONG  MajorFunction,
06098   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06099   /*IN OUT*/ PVOID  Buffer  /*OPTIONAL*/,
06100   /*IN*/ ULONG  Length  /*OPTIONAL*/,
06101   /*IN*/ PLARGE_INTEGER  StartingOffset  /*OPTIONAL*/,
06102   /*IN*/ PKEVENT  Event,
06103   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock);
06104 
06105 NTOSAPI
06106 NTSTATUS
06107 DDKFASTAPI
06108 IofCallDriver(
06109   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06110   /*IN OUT*/ PIRP  Irp);
06111 
06112 /*
06113  * NTSTATUS
06114  * IoCallDriver(
06115  * IN PDEVICE_OBJECT  DeviceObject,
06116  * IN OUT PIRP  Irp)
06117  */
06118 #define IoCallDriver IofCallDriver
06119 
06120 NTOSAPI
06121 VOID
06122 DDKAPI
06123 IoCancelFileOpen(
06124   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06125   /*IN*/ PFILE_OBJECT  FileObject);
06126 
06127 NTOSAPI
06128 BOOLEAN
06129 DDKAPI
06130 IoCancelIrp(
06131   /*IN*/ PIRP  Irp);
06132 
06133 NTOSAPI
06134 NTSTATUS
06135 DDKAPI
06136 IoCheckShareAccess(
06137   /*IN*/ ACCESS_MASK  DesiredAccess,
06138   /*IN*/ ULONG  DesiredShareAccess,
06139   /*IN OUT*/ PFILE_OBJECT  FileObject,
06140   /*IN OUT*/ PSHARE_ACCESS  ShareAccess,
06141   /*IN*/ BOOLEAN  Update);
06142 
06143 NTOSAPI
06144 VOID
06145 DDKFASTAPI
06146 IofCompleteRequest(
06147   /*IN*/ PIRP  Irp,
06148   /*IN*/ CCHAR  PriorityBoost);
06149 
06150 /*
06151  * VOID
06152  * IoCompleteRequest(
06153  * IN PIRP  Irp,
06154  * IN CCHAR  PriorityBoost)
06155  */
06156 #define IoCompleteRequest IofCompleteRequest
06157 
06158 NTOSAPI
06159 NTSTATUS
06160 DDKAPI
06161 IoConnectInterrupt(
06162   /*OUT*/ PKINTERRUPT  *InterruptObject,
06163   /*IN*/ PKSERVICE_ROUTINE  ServiceRoutine,
06164   /*IN*/ PVOID  ServiceContext,
06165   /*IN*/ PKSPIN_LOCK  SpinLock  /*OPTIONAL*/,
06166   /*IN*/ ULONG  Vector,
06167   /*IN*/ KIRQL  Irql,
06168   /*IN*/ KIRQL  SynchronizeIrql,
06169   /*IN*/ KINTERRUPT_MODE    InterruptMode,
06170   /*IN*/ BOOLEAN  ShareVector,
06171   /*IN*/ KAFFINITY  ProcessorEnableMask,
06172   /*IN*/ BOOLEAN  FloatingSave);
06173 
06174 /*
06175  * PIO_STACK_LOCATION
06176  * IoGetCurrentIrpStackLocation(
06177  * IN PIRP  Irp)
06178  */
06179 #define IoGetCurrentIrpStackLocation(_Irp) \
06180   ((_Irp)->Tail.Overlay.CurrentStackLocation)
06181 
06182 /*
06183  * PIO_STACK_LOCATION
06184  * IoGetNextIrpStackLocation(
06185  * IN PIRP  Irp)
06186  */
06187 #define IoGetNextIrpStackLocation(_Irp) \
06188   ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
06189 
06190 /*
06191  * VOID
06192  * IoCopyCurrentIrpStackLocationToNext(
06193  * IN PIRP  Irp)
06194  */
06195 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
06196 { \
06197   PIO_STACK_LOCATION _IrpSp; \
06198   PIO_STACK_LOCATION _NextIrpSp; \
06199   _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
06200   _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
06201   RtlCopyMemory(_NextIrpSp, _IrpSp, \
06202     FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
06203   _NextIrpSp->Control = 0; \
06204 }
06205 
06206 NTOSAPI
06207 PCONTROLLER_OBJECT
06208 DDKAPI
06209 IoCreateController(
06210   /*IN*/ ULONG  Size);
06211 
06212 NTOSAPI
06213 NTSTATUS
06214 DDKAPI
06215 IoCreateDevice(
06216   /*IN*/ PDRIVER_OBJECT  DriverObject,
06217   /*IN*/ ULONG  DeviceExtensionSize,
06218   /*IN*/ PUNICODE_STRING  DeviceName  /*OPTIONAL*/,
06219   /*IN*/ DEVICE_TYPE  DeviceType,
06220   /*IN*/ ULONG  DeviceCharacteristics,
06221   /*IN*/ BOOLEAN  Exclusive,
06222   /*OUT*/ PDEVICE_OBJECT  *DeviceObject);
06223 
06224 NTOSAPI
06225 NTSTATUS
06226 DDKAPI
06227 IoCreateDisk(
06228   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06229   /*IN*/ PCREATE_DISK  Disk);
06230 
06231 NTOSAPI
06232 NTSTATUS
06233 DDKAPI
06234 IoCreateFile(
06235   /*OUT*/ PHANDLE FileHandle,
06236   /*IN*/ ACCESS_MASK DesiredAccess,
06237   /*IN*/ POBJECT_ATTRIBUTES ObjectAttributes,
06238   /*OUT*/ PIO_STATUS_BLOCK IoStatusBlock,
06239   /*IN*/ PLARGE_INTEGER AllocationSize /*OPTIONAL*/,
06240   /*IN*/ ULONG FileAttributes,
06241   /*IN*/ ULONG ShareAccess,
06242   /*IN*/ ULONG Disposition,
06243   /*IN*/ ULONG CreateOptions,
06244   /*IN*/ PVOID EaBuffer /*OPTIONAL*/,
06245   /*IN*/ ULONG EaLength,
06246   /*IN*/ CREATE_FILE_TYPE CreateFileType,
06247   /*IN*/ PVOID ExtraCreateParameters /*OPTIONAL*/,
06248   /*IN*/ ULONG Options);
06249 
06250 NTOSAPI
06251 PKEVENT
06252 DDKAPI
06253 IoCreateNotificationEvent(
06254   /*IN*/ PUNICODE_STRING  EventName,
06255   /*OUT*/ PHANDLE  EventHandle);
06256 
06257 NTOSAPI
06258 NTSTATUS
06259 DDKAPI
06260 IoCreateSymbolicLink(
06261   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
06262   /*IN*/ PUNICODE_STRING  DeviceName);
06263 
06264 NTOSAPI
06265 PKEVENT
06266 DDKAPI
06267 IoCreateSynchronizationEvent(
06268   /*IN*/ PUNICODE_STRING  EventName,
06269   /*OUT*/ PHANDLE  EventHandle);
06270 
06271 NTOSAPI
06272 NTSTATUS
06273 DDKAPI
06274 IoCreateUnprotectedSymbolicLink(
06275   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
06276   /*IN*/ PUNICODE_STRING  DeviceName);
06277 
06278 NTOSAPI
06279 VOID
06280 DDKAPI
06281 IoCsqInitialize(
06282   PIO_CSQ  Csq,
06283   /*IN*/ PIO_CSQ_INSERT_IRP  CsqInsertIrp,
06284   /*IN*/ PIO_CSQ_REMOVE_IRP  CsqRemoveIrp,
06285   /*IN*/ PIO_CSQ_PEEK_NEXT_IRP  CsqPeekNextIrp,
06286   /*IN*/ PIO_CSQ_ACQUIRE_LOCK  CsqAcquireLock,
06287   /*IN*/ PIO_CSQ_RELEASE_LOCK  CsqReleaseLock,
06288   /*IN*/ PIO_CSQ_COMPLETE_CANCELED_IRP  CsqCompleteCanceledIrp);
06289 
06290 NTOSAPI
06291 VOID
06292 DDKAPI
06293 IoCsqInsertIrp(
06294   /*IN*/ PIO_CSQ  Csq,
06295   /*IN*/ PIRP  Irp,
06296   /*IN*/ PIO_CSQ_IRP_CONTEXT  Context);
06297 
06298 NTOSAPI
06299 PIRP
06300 DDKAPI
06301 IoCsqRemoveIrp(
06302   /*IN*/ PIO_CSQ  Csq,
06303   /*IN*/ PIO_CSQ_IRP_CONTEXT  Context);
06304 
06305 NTOSAPI
06306 PIRP
06307 DDKAPI
06308 IoCsqRemoveNextIrp(
06309   /*IN*/ PIO_CSQ  Csq,
06310   /*IN*/ PVOID  PeekContext);
06311 
06312 NTOSAPI
06313 VOID
06314 DDKAPI
06315 IoDeleteController(
06316   /*IN*/ PCONTROLLER_OBJECT  ControllerObject);
06317 
06318 NTOSAPI
06319 VOID
06320 DDKAPI
06321 IoDeleteDevice(
06322   /*IN*/ PDEVICE_OBJECT  DeviceObject);
06323 
06324 NTOSAPI
06325 NTSTATUS
06326 DDKAPI
06327 IoDeleteSymbolicLink(
06328   /*IN*/ PUNICODE_STRING  SymbolicLinkName);
06329 
06330 /*
06331  * VOID
06332  * IoDeassignArcName(
06333  * IN PUNICODE_STRING  ArcName)
06334  */
06335 #define IoDeassignArcName IoDeleteSymbolicLink
06336 
06337 NTOSAPI
06338 VOID
06339 DDKAPI
06340 IoDetachDevice(
06341   /*IN OUT*/ PDEVICE_OBJECT  TargetDevice);
06342 
06343 NTOSAPI
06344 VOID
06345 DDKAPI
06346 IoDisconnectInterrupt(
06347   /*IN*/ PKINTERRUPT  InterruptObject);
06348 
06349 NTOSAPI
06350 BOOLEAN
06351 DDKAPI
06352 IoForwardIrpSynchronously(
06353   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06354   /*IN*/ PIRP  Irp);
06355 
06356 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
06357 
06358 NTOSAPI
06359 VOID
06360 DDKAPI
06361 IoFreeController(
06362   /*IN*/ PCONTROLLER_OBJECT  ControllerObject);
06363 
06364 NTOSAPI
06365 VOID
06366 DDKAPI
06367 IoFreeErrorLogEntry(
06368   PVOID  ElEntry);
06369 
06370 NTOSAPI
06371 VOID
06372 DDKAPI
06373 IoFreeIrp(
06374   /*IN*/ PIRP  Irp);
06375 
06376 NTOSAPI
06377 VOID
06378 DDKAPI
06379 IoFreeMdl(
06380   /*IN*/ PMDL  Mdl);
06381 
06382 NTOSAPI
06383 VOID
06384 DDKAPI
06385 IoFreeWorkItem(
06386   /*IN*/ PIO_WORKITEM  pIOWorkItem);
06387 
06388 NTOSAPI
06389 PDEVICE_OBJECT
06390 DDKAPI
06391 IoGetAttachedDevice(
06392   /*IN*/ PDEVICE_OBJECT  DeviceObject);
06393 
06394 NTOSAPI
06395 PDEVICE_OBJECT
06396 DDKAPI
06397 IoGetAttachedDeviceReference(
06398   /*IN*/ PDEVICE_OBJECT  DeviceObject);
06399 
06400 NTOSAPI
06401 NTSTATUS
06402 DDKAPI
06403 IoGetBootDiskInformation(
06404   /*IN OUT*/ PBOOTDISK_INFORMATION  BootDiskInformation,
06405   /*IN*/ ULONG  Size);
06406 
06407 NTOSAPI
06408 PCONFIGURATION_INFORMATION
06409 DDKAPI
06410 IoGetConfigurationInformation( 
06411   VOID);
06412 
06413 NTOSAPI
06414 PEPROCESS
06415 DDKAPI
06416 IoGetCurrentProcess(
06417   VOID);
06418 
06419 NTOSAPI
06420 NTSTATUS
06421 DDKAPI
06422 IoGetDeviceInterfaceAlias(
06423   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
06424   /*IN*/ CONST GUID  *AliasInterfaceClassGuid,
06425   /*OUT*/ PUNICODE_STRING  AliasSymbolicLinkName);
06426 
06427 NTOSAPI
06428 NTSTATUS
06429 DDKAPI
06430 IoGetDeviceInterfaces(
06431   /*IN*/ CONST GUID  *InterfaceClassGuid,
06432   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject  /*OPTIONAL*/,
06433   /*IN*/ ULONG  Flags,
06434   /*OUT*/ PWSTR  *SymbolicLinkList);
06435 
06436 NTOSAPI
06437 NTSTATUS
06438 DDKAPI
06439 IoGetDeviceObjectPointer(
06440   /*IN*/ PUNICODE_STRING  ObjectName,
06441   /*IN*/ ACCESS_MASK  DesiredAccess,
06442   /*OUT*/ PFILE_OBJECT  *FileObject,
06443   /*OUT*/ PDEVICE_OBJECT  *DeviceObject);
06444 
06445 NTOSAPI
06446 NTSTATUS
06447 DDKAPI
06448 IoGetDeviceProperty(
06449   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06450   /*IN*/ DEVICE_REGISTRY_PROPERTY  DeviceProperty,
06451   /*IN*/ ULONG  BufferLength,
06452   /*OUT*/ PVOID  PropertyBuffer,
06453   /*OUT*/ PULONG  ResultLength);
06454 
06455 NTOSAPI
06456 PDEVICE_OBJECT
06457 DDKAPI
06458 IoGetDeviceToVerify(
06459   /*IN*/ PETHREAD  Thread);
06460 
06461 NTOSAPI
06462 PDMA_ADAPTER
06463 DDKAPI
06464 IoGetDmaAdapter(
06465   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
06466   /*IN*/ PDEVICE_DESCRIPTION  DeviceDescription,
06467   /*IN OUT*/ PULONG  NumberOfMapRegisters);
06468 
06469 NTOSAPI
06470 PVOID
06471 DDKAPI
06472 IoGetDriverObjectExtension(
06473   /*IN*/ PDRIVER_OBJECT  DriverObject,
06474   /*IN*/ PVOID  ClientIdentificationAddress);
06475 
06476 NTOSAPI
06477 PGENERIC_MAPPING
06478 DDKAPI
06479 IoGetFileObjectGenericMapping(
06480   VOID);
06481 
06482 /*
06483  * ULONG
06484  * IoGetFunctionCodeFromCtlCode(
06485  * IN ULONG  ControlCode)
06486  */
06487 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
06488   (((_ControlCode) >> 2) & 0x00000FFF)
06489 
06490 NTOSAPI
06491 PVOID
06492 DDKAPI
06493 IoGetInitialStack(
06494   VOID);
06495 
06496 NTOSAPI
06497 PDEVICE_OBJECT
06498 DDKAPI
06499 IoGetRelatedDeviceObject(
06500   /*IN*/ PFILE_OBJECT  FileObject);
06501 
06502 NTOSAPI
06503 ULONG
06504 DDKAPI
06505 IoGetRemainingStackSize(
06506   VOID);
06507 
06508 NTOSAPI
06509 VOID
06510 DDKAPI
06511 IoGetStackLimits(
06512   /*OUT*/ PULONG_PTR  LowLimit,
06513   /*OUT*/ PULONG_PTR  HighLimit);
06514 
06515 NTOSAPI
06516 VOID
06517 DDKAPI
06518 KeInitializeDpc(
06519   /*IN*/ PRKDPC  Dpc,
06520   /*IN*/ PKDEFERRED_ROUTINE  DeferredRoutine,
06521   /*IN*/ PVOID  DeferredContext);
06522 
06523 /*
06524  * VOID
06525  * IoInitializeDpcRequest(
06526  * IN PDEVICE_OBJECT DeviceObject,
06527  * IN PIO_DPC_ROUTINE DpcRoutine)
06528  */
06529 #define IoInitializeDpcRequest(_DeviceObject, \
06530                                _DpcRoutine) \
06531   KeInitializeDpc(&(_DeviceObject)->Dpc, \
06532     (PKDEFERRED_ROUTINE) (_DpcRoutine), \
06533     _DeviceObject)
06534 
06535 NTOSAPI
06536 VOID
06537 DDKAPI
06538 IoInitializeIrp(
06539   /*IN OUT*/ PIRP  Irp,
06540   /*IN*/ USHORT  PacketSize,
06541   /*IN*/ CCHAR  StackSize);
06542 
06543 NTOSAPI
06544 VOID
06545 DDKAPI
06546 IoInitializeRemoveLockEx(
06547   /*IN*/ PIO_REMOVE_LOCK Lock,
06548   /*IN*/ ULONG   AllocateTag,
06549   /*IN*/ ULONG   MaxLockedMinutes,
06550   /*IN*/ ULONG   HighWatermark,
06551   /*IN*/ ULONG   RemlockSize);
06552 
06553 /* VOID
06554  * IoInitializeRemoveLock(
06555  * IN PIO_REMOVE_LOCK  Lock,
06556  * IN ULONG  AllocateTag,
06557  * IN ULONG  MaxLockedMinutes,
06558  * IN ULONG  HighWatermark)
06559  */
06560 #define IoInitializeRemoveLock( \
06561   Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
06562   IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
06563     HighWatermark, sizeof(IO_REMOVE_LOCK))
06564 
06565 NTOSAPI
06566 NTSTATUS
06567 DDKAPI
06568 IoInitializeTimer(
06569   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06570   /*IN*/ PIO_TIMER_ROUTINE  TimerRoutine,
06571   /*IN*/ PVOID  Context);
06572 
06573 NTOSAPI
06574 VOID
06575 DDKAPI
06576 IoInvalidateDeviceRelations(
06577   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06578   /*IN*/ DEVICE_RELATION_TYPE  Type);
06579 
06580 NTOSAPI
06581 VOID
06582 DDKAPI
06583 IoInvalidateDeviceState(
06584   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject);
06585 
06586 NTOSAPI
06587 BOOLEAN
06588 DDKAPI
06589 IoIs32bitProcess(
06590   /*IN*/ PIRP  Irp  /*OPTIONAL*/);
06591 
06592 /*
06593  * BOOLEAN
06594  * IoIsErrorUserInduced(
06595  * IN NTSTATUS  Status);
06596  */
06597 #define IoIsErrorUserInduced(Status) \
06598     ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
06599    ((Status) == STATUS_IO_TIMEOUT) || \
06600    ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
06601    ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
06602    ((Status) == STATUS_VERIFY_REQUIRED) || \
06603    ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
06604    ((Status) == STATUS_WRONG_VOLUME)))
06605 
06606 NTOSAPI
06607 BOOLEAN
06608 DDKAPI
06609 IoIsWdmVersionAvailable(
06610   /*IN*/ UCHAR  MajorVersion,
06611   /*IN*/ UCHAR  MinorVersion);
06612 
06613 NTOSAPI
06614 PIRP
06615 DDKAPI
06616 IoMakeAssociatedIrp(
06617   /*IN*/ PIRP  Irp,
06618   /*IN*/ CCHAR  StackSize);
06619 
06620 /*
06621  * VOID
06622  * IoMarkIrpPending(
06623  * IN OUT PIRP  Irp)
06624  */
06625 #define IoMarkIrpPending(_Irp) \
06626   (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
06627 
06628 NTOSAPI
06629 NTSTATUS
06630 DDKAPI
06631 IoOpenDeviceInterfaceRegistryKey(
06632   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
06633   /*IN*/ ACCESS_MASK  DesiredAccess,
06634   /*OUT*/ PHANDLE  DeviceInterfaceKey);
06635 
06636 NTOSAPI
06637 NTSTATUS
06638 DDKAPI
06639 IoOpenDeviceRegistryKey(
06640   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06641   /*IN*/ ULONG  DevInstKeyType,
06642   /*IN*/ ACCESS_MASK  DesiredAccess,
06643   /*OUT*/ PHANDLE  DevInstRegKey);
06644 
06645 NTOSAPI
06646 NTSTATUS
06647 DDKAPI
06648 IoQueryDeviceDescription(
06649   /*IN*/ PINTERFACE_TYPE  BusType  /*OPTIONAL*/,
06650   /*IN*/ PULONG  BusNumber  /*OPTIONAL*/,
06651   /*IN*/ PCONFIGURATION_TYPE  ControllerType  /*OPTIONAL*/,
06652   /*IN*/ PULONG  ControllerNumber  /*OPTIONAL*/,
06653   /*IN*/ PCONFIGURATION_TYPE  PeripheralType  /*OPTIONAL*/,
06654   /*IN*/ PULONG  PeripheralNumber  /*OPTIONAL*/,
06655   /*IN*/ PIO_QUERY_DEVICE_ROUTINE  CalloutRoutine,
06656   /*IN*/ PVOID  Context);
06657 
06658 NTOSAPI
06659 VOID
06660 DDKAPI
06661 IoQueueWorkItem(
06662   /*IN*/ PIO_WORKITEM  pIOWorkItem,
06663   /*IN*/ PIO_WORKITEM_ROUTINE  Routine,
06664   /*IN*/ WORK_QUEUE_TYPE  QueueType,
06665   /*IN*/ PVOID  Context);
06666 
06667 NTOSAPI
06668 VOID
06669 DDKAPI
06670 IoRaiseHardError(
06671   /*IN*/ PIRP  Irp,
06672   /*IN*/ PVPB  Vpb  /*OPTIONAL*/,
06673   /*IN*/ PDEVICE_OBJECT  RealDeviceObject);
06674 
06675 NTOSAPI
06676 BOOLEAN
06677 DDKAPI
06678 IoRaiseInformationalHardError(
06679   /*IN*/ NTSTATUS  ErrorStatus,
06680   /*IN*/ PUNICODE_STRING  String  /*OPTIONAL*/,
06681   /*IN*/ PKTHREAD  Thread  /*OPTIONAL*/);
06682 
06683 NTOSAPI
06684 NTSTATUS
06685 DDKAPI
06686 IoReadDiskSignature(
06687   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06688   /*IN*/ ULONG  BytesPerSector,
06689   /*OUT*/ PDISK_SIGNATURE  Signature);
06690 
06691 NTOSAPI
06692 NTSTATUS
06693 DDKAPI
06694 IoReadPartitionTableEx(
06695   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06696   /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX  **PartitionBuffer);
06697 
06698 NTOSAPI
06699 VOID
06700 DDKAPI
06701 IoRegisterBootDriverReinitialization(
06702   /*IN*/ PDRIVER_OBJECT  DriverObject,
06703   /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
06704   /*IN*/ PVOID  Context);
06705 
06706 NTOSAPI
06707 VOID
06708 DDKAPI
06709 IoRegisterBootDriverReinitialization(
06710   /*IN*/ PDRIVER_OBJECT  DriverObject,
06711   /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
06712   /*IN*/ PVOID  Context);
06713 
06714 NTOSAPI
06715 NTSTATUS
06716 DDKAPI
06717 IoRegisterDeviceInterface(
06718   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
06719   /*IN*/ CONST GUID  *InterfaceClassGuid,
06720   /*IN*/ PUNICODE_STRING  ReferenceString  /*OPTIONAL*/,
06721   /*OUT*/ PUNICODE_STRING  SymbolicLinkName);
06722 
06723 NTOSAPI
06724 VOID
06725 DDKAPI
06726 IoRegisterDriverReinitialization(
06727   /*IN*/ PDRIVER_OBJECT  DriverObject,
06728   /*IN*/ PDRIVER_REINITIALIZE  DriverReinitializationRoutine,
06729   /*IN*/ PVOID  Context);
06730 
06731 NTOSAPI
06732 NTSTATUS
06733 DDKAPI
06734 IoRegisterPlugPlayNotification(
06735   /*IN*/ IO_NOTIFICATION_EVENT_CATEGORY  EventCategory,
06736   /*IN*/ ULONG  EventCategoryFlags,
06737   /*IN*/ PVOID  EventCategoryData  /*OPTIONAL*/,
06738   /*IN*/ PDRIVER_OBJECT  DriverObject,
06739   /*IN*/ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE  CallbackRoutine,
06740   /*IN*/ PVOID  Context,
06741   /*OUT*/ PVOID  *NotificationEntry);
06742 
06743 NTOSAPI
06744 NTSTATUS
06745 DDKAPI
06746 IoRegisterShutdownNotification(
06747   /*IN*/ PDEVICE_OBJECT  DeviceObject);
06748 
06749 NTOSAPI
06750 VOID
06751 DDKAPI
06752 IoReleaseCancelSpinLock(
06753   /*IN*/ KIRQL  Irql);
06754 
06755 NTOSAPI
06756 VOID
06757 DDKAPI
06758 IoReleaseRemoveLockAndWaitEx(
06759   /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
06760   /*IN*/ PVOID  Tag,
06761   /*IN*/ ULONG  RemlockSize);
06762 
06763 /*
06764  * VOID
06765  * IoReleaseRemoveLockAndWait(
06766  * IN PIO_REMOVE_LOCK  RemoveLock,
06767  * IN PVOID  Tag)
06768  */
06769 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
06770                                    _Tag) \
06771   IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
06772 
06773 NTOSAPI
06774 VOID
06775 DDKAPI
06776 IoReleaseRemoveLockEx(
06777   /*IN*/ PIO_REMOVE_LOCK  RemoveLock,
06778   /*IN*/ PVOID  Tag,
06779   /*IN*/ ULONG  RemlockSize);
06780 
06781 /*
06782  * VOID
06783  * IoReleaseRemoveLock(
06784  * IN PIO_REMOVE_LOCK  RemoveLock,
06785  * IN PVOID  Tag)
06786  */
06787 #define IoReleaseRemoveLock(_RemoveLock, \
06788                                    _Tag) \
06789   IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
06790 
06791 NTOSAPI
06792 VOID
06793 DDKAPI
06794 IoRemoveShareAccess(
06795   /*IN*/ PFILE_OBJECT  FileObject,
06796   /*IN OUT*/ PSHARE_ACCESS  ShareAccess);
06797 
06798 NTOSAPI
06799 NTSTATUS
06800 DDKAPI
06801 IoReportDetectedDevice(
06802   /*IN*/ PDRIVER_OBJECT  DriverObject,
06803   /*IN*/ INTERFACE_TYPE  LegacyBusType,
06804   /*IN*/ ULONG  BusNumber,
06805   /*IN*/ ULONG  SlotNumber,
06806   /*IN*/ PCM_RESOURCE_LIST  ResourceList,
06807   /*IN*/ PIO_RESOURCE_REQUIREMENTS_LIST  ResourceRequirements  /*OPTIONAL*/,
06808   /*IN*/ BOOLEAN  ResourceAssigned,
06809   /*IN OUT*/ PDEVICE_OBJECT  *DeviceObject);
06810 
06811 NTOSAPI
06812 NTSTATUS
06813 DDKAPI
06814 IoReportResourceForDetection(
06815   /*IN*/ PDRIVER_OBJECT  DriverObject,
06816   /*IN*/ PCM_RESOURCE_LIST  DriverList  /*OPTIONAL*/,
06817   /*IN*/ ULONG  DriverListSize  /*OPTIONAL*/,
06818   /*IN*/ PDEVICE_OBJECT  DeviceObject  /*OPTIONAL*/,
06819   /*IN*/ PCM_RESOURCE_LIST  DeviceList  /*OPTIONAL*/,
06820   /*IN*/ ULONG  DeviceListSize  /*OPTIONAL*/,
06821   /*OUT*/ PBOOLEAN  ConflictDetected);
06822 
06823 NTOSAPI
06824 NTSTATUS
06825 DDKAPI
06826 IoReportResourceUsage(
06827   /*IN*/ PUNICODE_STRING  DriverClassName  /*OPTIONAL*/,
06828   /*IN*/ PDRIVER_OBJECT  DriverObject,
06829   /*IN*/ PCM_RESOURCE_LIST  DriverList  /*OPTIONAL*/,
06830   /*IN*/ ULONG  DriverListSize  /*OPTIONAL*/,
06831   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06832   /*IN*/ PCM_RESOURCE_LIST  DeviceList  /*OPTIONAL*/,
06833   /*IN*/ ULONG  DeviceListSize  /*OPTIONAL*/,
06834   /*IN*/ BOOLEAN  OverrideConflict,
06835   /*OUT*/ PBOOLEAN  ConflictDetected);
06836 
06837 NTOSAPI
06838 NTSTATUS
06839 DDKAPI
06840 IoReportTargetDeviceChange(
06841   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
06842   /*IN*/ PVOID  NotificationStructure);
06843 
06844 NTOSAPI
06845 NTSTATUS
06846 DDKAPI
06847 IoReportTargetDeviceChangeAsynchronous(
06848   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject,
06849   /*IN*/ PVOID  NotificationStructure,
06850   /*IN*/ PDEVICE_CHANGE_COMPLETE_CALLBACK  Callback  /*OPTIONAL*/,
06851   /*IN*/ PVOID  Context  /*OPTIONAL*/);
06852 
06853 NTOSAPI
06854 VOID
06855 DDKAPI
06856 IoRequestDeviceEject(
06857   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject);
06858 
06859 /*
06860  * VOID
06861  * IoRequestDpc(
06862  * IN PDEVICE_OBJECT  DeviceObject,
06863  * IN PIRP  Irp,
06864  * IN PVOID  Context);
06865  */
06866 #define IoRequestDpc(DeviceObject, Irp, Context)( \
06867   KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
06868 
06869 NTOSAPI
06870 VOID
06871 DDKAPI
06872 IoReuseIrp(
06873   /*IN OUT*/ PIRP  Irp,
06874   /*IN*/ NTSTATUS  Status);
06875 
06876 /*
06877  * PDRIVER_CANCEL
06878  * IoSetCancelRoutine(
06879  * IN PIRP  Irp,
06880  * IN PDRIVER_CANCEL  CancelRoutine)
06881  */
06882 #define IoSetCancelRoutine(_Irp, \
06883                            _CancelRoutine) \
06884   ((PDRIVER_CANCEL) InterlockedExchangePointer( \
06885     (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
06886 
06887 /*
06888  * VOID
06889  * IoSetCompletionRoutine(
06890  * IN PIRP  Irp,
06891  * IN PIO_COMPLETION_ROUTINE  CompletionRoutine,
06892  * IN PVOID  Context,
06893  * IN BOOLEAN  InvokeOnSuccess,
06894  * IN BOOLEAN  InvokeOnError,
06895  * IN BOOLEAN  InvokeOnCancel)
06896  */
06897 #define IoSetCompletionRoutine(_Irp, \
06898                                _CompletionRoutine, \
06899                                _Context, \
06900                                _InvokeOnSuccess, \
06901                                _InvokeOnError, \
06902                                _InvokeOnCancel) \
06903 { \
06904   PIO_STACK_LOCATION _IrpSp; \
06905   ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
06906     _CompletionRoutine != NULL : TRUE); \
06907   _IrpSp = IoGetNextIrpStackLocation(_Irp); \
06908   _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
06909     _IrpSp->Context = (_Context); \
06910   _IrpSp->Control = 0; \
06911   if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
06912   if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
06913   if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
06914 }
06915 
06916 NTOSAPI
06917 VOID
06918 DDKAPI
06919 IoSetCompletionRoutineEx(
06920   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06921   /*IN*/ PIRP  Irp,
06922   /*IN*/ PIO_COMPLETION_ROUTINE  CompletionRoutine,
06923   /*IN*/ PVOID  Context,
06924   /*IN*/ BOOLEAN    InvokeOnSuccess,
06925   /*IN*/ BOOLEAN  InvokeOnError,
06926   /*IN*/ BOOLEAN  InvokeOnCancel);
06927 
06928 NTOSAPI
06929 NTSTATUS
06930 DDKAPI
06931 IoSetDeviceInterfaceState(
06932   /*IN*/ PUNICODE_STRING  SymbolicLinkName,
06933   /*IN*/ BOOLEAN  Enable);
06934 
06935 NTOSAPI
06936 VOID
06937 DDKAPI
06938 IoSetHardErrorOrVerifyDevice(
06939   /*IN*/ PIRP  Irp,
06940   /*IN*/ PDEVICE_OBJECT  DeviceObject);
06941 
06942 /*
06943  * VOID
06944  * IoSetNextIrpStackLocation(
06945  * IN OUT PIRP  Irp)
06946  */
06947 #define IoSetNextIrpStackLocation(_Irp) \
06948 { \
06949   (_Irp)->CurrentLocation--; \
06950   (_Irp)->Tail.Overlay.CurrentStackLocation--; \
06951 }
06952 
06953 NTOSAPI
06954 NTSTATUS
06955 DDKAPI
06956 IoSetPartitionInformationEx(
06957   /*IN*/ PDEVICE_OBJECT  DeviceObject,
06958   /*IN*/ ULONG  PartitionNumber,
06959   /*IN*/ struct _SET_PARTITION_INFORMATION_EX  *PartitionInfo);
06960 
06961 NTOSAPI
06962 VOID
06963 DDKAPI
06964 IoSetShareAccess(
06965   /*IN*/ ACCESS_MASK  DesiredAccess,
06966   /*IN*/ ULONG  DesiredShareAccess,
06967   /*IN OUT*/ PFILE_OBJECT  FileObject,
06968   /*OUT*/ PSHARE_ACCESS  ShareAccess);
06969 
06970 NTOSAPI
06971 VOID
06972 DDKAPI
06973 IoSetStartIoAttributes(
06974   /*IN*/ PDEVICE_OBJECT  DeviceObject, 
06975   /*IN*/ BOOLEAN  DeferredStartIo, 
06976   /*IN*/ BOOLEAN  NonCancelable); 
06977 
06978 NTOSAPI
06979 NTSTATUS
06980 DDKAPI
06981 IoSetSystemPartition(
06982   /*IN*/ PUNICODE_STRING  VolumeNameString);
06983 
06984 NTOSAPI
06985 BOOLEAN
06986 DDKAPI
06987 IoSetThreadHardErrorMode(
06988   /*IN*/ BOOLEAN  EnableHardErrors);
06989 
06990 /*
06991  * USHORT
06992  * IoSizeOfIrp(
06993  * IN CCHAR  StackSize)
06994  */
06995 #define IoSizeOfIrp(_StackSize) \
06996   ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
06997 
06998 /*
06999  * VOID
07000  * IoSkipCurrentIrpStackLocation(
07001  * IN PIRP  Irp)
07002  */
07003 #define IoSkipCurrentIrpStackLocation(_Irp) \
07004 { \
07005   (_Irp)->CurrentLocation++; \
07006   (_Irp)->Tail.Overlay.CurrentStackLocation++; \
07007 }
07008 
07009 NTOSAPI
07010 VOID
07011 DDKAPI
07012 IoStartNextPacket(
07013   /*IN*/ PDEVICE_OBJECT  DeviceObject,
07014   /*IN*/ BOOLEAN  Cancelable);
07015 
07016 NTOSAPI
07017 VOID
07018 DDKAPI
07019 IoStartNextPacketByKey(
07020   /*IN*/ PDEVICE_OBJECT  DeviceObject,
07021   /*IN*/ BOOLEAN  Cancelable,
07022   /*IN*/ ULONG  Key);
07023 
07024 NTOSAPI
07025 VOID
07026 DDKAPI
07027 IoStartPacket(
07028   /*IN*/ PDEVICE_OBJECT  DeviceObject,
07029   /*IN*/ PIRP  Irp,
07030   /*IN*/ PULONG  Key  /*OPTIONAL*/,
07031   /*IN*/ PDRIVER_CANCEL  CancelFunction  /*OPTIONAL*/);
07032 
07033 NTOSAPI
07034 VOID
07035 DDKAPI
07036 IoStartTimer(
07037   /*IN*/ PDEVICE_OBJECT  DeviceObject);
07038 
07039 NTOSAPI
07040 VOID
07041 DDKAPI
07042 IoStopTimer(
07043   /*IN*/ PDEVICE_OBJECT  DeviceObject);
07044 
07045 NTOSAPI
07046 NTSTATUS
07047 DDKAPI
07048 IoUnregisterPlugPlayNotification(
07049   /*IN*/ PVOID  NotificationEntry);
07050 
07051 NTOSAPI
07052 VOID
07053 DDKAPI
07054 IoUnregisterShutdownNotification(
07055   /*IN*/ PDEVICE_OBJECT  DeviceObject);
07056 
07057 NTOSAPI
07058 VOID
07059 DDKAPI
07060 IoUpdateShareAccess(
07061   /*IN*/ PFILE_OBJECT  FileObject,
07062   /*IN OUT*/ PSHARE_ACCESS  ShareAccess);
07063 
07064 NTOSAPI
07065 NTSTATUS
07066 DDKAPI
07067 IoVerifyPartitionTable(
07068   /*IN*/ PDEVICE_OBJECT  DeviceObject,
07069   /*IN*/ BOOLEAN  FixErrors);
07070 
07071 NTOSAPI
07072 NTSTATUS
07073 DDKAPI
07074 IoVolumeDeviceToDosName(
07075   /*IN*/ PVOID  VolumeDeviceObject,
07076   /*OUT*/ PUNICODE_STRING  DosName);
07077 
07078 NTOSAPI
07079 NTSTATUS
07080 DDKAPI
07081 IoWMIAllocateInstanceIds(
07082   /*IN*/ GUID  *Guid,
07083   /*IN*/ ULONG  InstanceCount,
07084   /*OUT*/ ULONG  *FirstInstanceId);
07085 
07086 NTOSAPI
07087 ULONG
07088 DDKAPI
07089 IoWMIDeviceObjectToProviderId(
07090   /*IN*/ PDEVICE_OBJECT  DeviceObject);
07091 
07092 NTOSAPI
07093 NTSTATUS
07094 DDKAPI
07095 IoWMIDeviceObjectToInstanceName(
07096   /*IN*/ PVOID  DataBlockObject,
07097   /*IN*/ PDEVICE_OBJECT  DeviceObject,
07098   /*OUT*/ PUNICODE_STRING  InstanceName);
07099 
07100 NTOSAPI
07101 NTSTATUS
07102 DDKAPI
07103 IoWMIExecuteMethod(
07104   /*IN*/ PVOID  DataBlockObject,
07105   /*IN*/ PUNICODE_STRING  InstanceName,
07106   /*IN*/ ULONG  MethodId,
07107   /*IN*/ ULONG  InBufferSize,
07108   /*IN OUT*/ PULONG  OutBufferSize,
07109   /*IN OUT*/  PUCHAR  InOutBuffer);
07110 
07111 NTOSAPI
07112 NTSTATUS
07113 DDKAPI
07114 IoWMIHandleToInstanceName(
07115   /*IN*/ PVOID  DataBlockObject,
07116   /*IN*/ HANDLE  FileHandle,
07117   /*OUT*/ PUNICODE_STRING  InstanceName);
07118 
07119 NTOSAPI
07120 NTSTATUS
07121 DDKAPI
07122 IoWMIOpenBlock(
07123   /*IN*/ GUID  *DataBlockGuid,
07124   /*IN*/ ULONG  DesiredAccess,
07125   /*OUT*/ PVOID  *DataBlockObject);
07126 
07127 NTOSAPI
07128 NTSTATUS
07129 DDKAPI
07130 IoWMIQueryAllData(
07131   /*IN*/ PVOID  DataBlockObject,
07132   /*IN OUT*/ ULONG  *InOutBufferSize,
07133   /*OUT*/ PVOID  OutBuffer);
07134 
07135 NTOSAPI
07136 NTSTATUS
07137 DDKAPI
07138 IoWMIQueryAllDataMultiple(
07139   /*IN*/ PVOID  *DataBlockObjectList,
07140   /*IN*/ ULONG  ObjectCount,
07141   /*IN OUT*/ ULONG  *InOutBufferSize,
07142   /*OUT*/ PVOID  OutBuffer);
07143 
07144 NTOSAPI
07145 NTSTATUS
07146 DDKAPI
07147 IoWMIQuerySingleInstance(
07148   /*IN*/ PVOID  DataBlockObject,
07149   /*IN*/ PUNICODE_STRING  InstanceName,
07150   /*IN OUT*/ ULONG  *InOutBufferSize,
07151   /*OUT*/ PVOID OutBuffer);
07152 
07153 NTOSAPI
07154 NTSTATUS
07155 DDKAPI
07156 IoWMIQuerySingleInstanceMultiple(
07157   /*IN*/ PVOID  *DataBlockObjectList,
07158   /*IN*/ PUNICODE_STRING  InstanceNames,
07159   /*IN*/ ULONG  ObjectCount,
07160   /*IN OUT*/ ULONG  *InOutBufferSize,
07161   /*OUT*/ PVOID  OutBuffer);
07162 
07163 NTOSAPI
07164 NTSTATUS
07165 DDKAPI
07166 IoWMIRegistrationControl(
07167   /*IN*/ PDEVICE_OBJECT  DeviceObject,
07168   /*IN*/ ULONG  Action);
07169 
07170 NTOSAPI
07171 NTSTATUS
07172 DDKAPI
07173 IoWMISetNotificationCallback(
07174   /*IN*/ PVOID  Object,
07175   /*IN*/ WMI_NOTIFICATION_CALLBACK  Callback,
07176   /*IN*/ PVOID  Context);
07177 
07178 NTOSAPI
07179 NTSTATUS
07180 DDKAPI
07181 IoWMISetSingleInstance(
07182   /*IN*/ PVOID  DataBlockObject,
07183   /*IN*/ PUNICODE_STRING  InstanceName,
07184   /*IN*/ ULONG  Version,
07185   /*IN*/ ULONG  ValueBufferSize,
07186   /*IN*/ PVOID  ValueBuffer);
07187 
07188 NTOSAPI
07189 NTSTATUS
07190 DDKAPI
07191 IoWMISetSingleItem(
07192   /*IN*/ PVOID  DataBlockObject,
07193   /*IN*/ PUNICODE_STRING  InstanceName,
07194   /*IN*/ ULONG  DataItemId,
07195   /*IN*/ ULONG  Version,
07196   /*IN*/ ULONG  ValueBufferSize,
07197   /*IN*/ PVOID  ValueBuffer);
07198 
07199 NTOSAPI
07200 NTSTATUS
07201 DDKAPI
07202 IoWMISuggestInstanceName(
07203   /*IN*/ PDEVICE_OBJECT  PhysicalDeviceObject /*OPTIONAL*/,
07204   /*IN*/ PUNICODE_STRING  SymbolicLinkName /*OPTIONAL*/,
07205   /*IN*/ BOOLEAN  CombineNames,
07206   /*OUT*/ PUNICODE_STRING  SuggestedInstanceName);
07207 
07208 NTOSAPI
07209 NTSTATUS
07210 DDKAPI
07211 IoWMIWriteEvent(
07212   /*IN*/ PVOID  WnodeEventItem);
07213 
07214 NTOSAPI
07215 VOID
07216 DDKAPI
07217 IoWriteErrorLogEntry(
07218   /*IN*/ PVOID  ElEntry);
07219 
07220 NTOSAPI
07221 NTSTATUS
07222 DDKAPI
07223 IoWritePartitionTableEx(
07224   /*IN*/ PDEVICE_OBJECT  DeviceObject,
07225   /*IN*/ struct _DRIVE_LAYOUT_INFORMATION_EX  *PartitionBuffer);
07226 
07227 
07228 
07229 /** Kernel routines **/
07230 
07231 NTOSAPI
07232 VOID
07233 DDKFASTAPI
07234 KeAcquireInStackQueuedSpinLock(
07235   /*IN*/ PKSPIN_LOCK  SpinLock,
07236   /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);
07237 
07238 NTOSAPI
07239 VOID
07240 DDKFASTAPI
07241 KeAcquireInStackQueuedSpinLockAtDpcLevel(
07242   /*IN*/ PKSPIN_LOCK  SpinLock,
07243   /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);
07244 
07245 NTOSAPI
07246 KIRQL
07247 DDKAPI
07248 KeAcquireInterruptSpinLock(
07249   /*IN*/ PKINTERRUPT  Interrupt);
07250 
07251 NTOSAPI
07252 VOID
07253 DDKAPI
07254 KeAcquireSpinLock(
07255   /*IN*/ PKSPIN_LOCK  SpinLock,
07256   /*OUT*/ PKIRQL  OldIrql);
07257 
07258 /* System Service Dispatch Table */
07259 typedef PVOID (NTAPI * SSDT)(VOID);
07260 typedef SSDT * PSSDT;
07261 
07262 /* System Service Parameters Table */
07263 typedef UCHAR SSPT, * PSSPT;
07264 
07265 typedef struct _SSDT_ENTRY {
07266     PSSDT  SSDT;
07267     PULONG  ServiceCounterTable;
07268     ULONG  NumberOfServices;
07269     PSSPT  SSPT;
07270 } SSDT_ENTRY, *PSSDT_ENTRY;
07271 
07272 NTOSAPI
07273 BOOLEAN
07274 DDKAPI
07275 KeAddSystemServiceTable(
07276   /*IN*/ PSSDT  SSDT,
07277   /*IN*/ PULONG  ServiceCounterTable,
07278   /*IN*/ ULONG  NumberOfServices,
07279   /*IN*/ PSSPT  SSPT,
07280   /*IN*/ ULONG  TableIndex);
07281 
07282 NTOSAPI
07283 BOOLEAN
07284 DDKAPI
07285 KeAreApcsDisabled(
07286   VOID);
07287 
07288 NTOSAPI
07289 VOID
07290 DDKAPI
07291 KeAttachProcess(
07292   /*IN*/ PEPROCESS  Process);
07293 
07294 NTOSAPI
07295 VOID
07296 DDKAPI
07297 KeBugCheck(
07298   /*IN*/ ULONG  BugCheckCode);
07299 
07300 NTOSAPI
07301 VOID
07302 DDKAPI
07303 KeBugCheckEx(
07304   /*IN*/ ULONG  BugCheckCode,
07305   /*IN*/ ULONG_PTR  BugCheckParameter1,
07306   /*IN*/ ULONG_PTR  BugCheckParameter2,
07307   /*IN*/ ULONG_PTR  BugCheckParameter3,
07308   /*IN*/ ULONG_PTR  BugCheckParameter4);
07309 
07310 NTOSAPI
07311 BOOLEAN
07312 DDKAPI
07313 KeCancelTimer(
07314   /*IN*/ PKTIMER  Timer);
07315 
07316 NTOSAPI
07317 VOID
07318 DDKAPI
07319 KeClearEvent(
07320   /*IN*/ PRKEVENT  Event);
07321 
07322 NTOSAPI
07323 NTSTATUS
07324 DDKAPI
07325 KeDelayExecutionThread(
07326   /*IN*/ KPROCESSOR_MODE  WaitMode,
07327   /*IN*/ BOOLEAN  Alertable,
07328   /*IN*/ PLARGE_INTEGER  Interval);
07329 
07330 NTOSAPI
07331 BOOLEAN
07332 DDKAPI
07333 KeDeregisterBugCheckCallback(
07334   /*IN*/ PKBUGCHECK_CALLBACK_RECORD  CallbackRecord);
07335 
07336 NTOSAPI
07337 VOID
07338 DDKAPI
07339 KeDetachProcess(
07340   VOID);
07341 
07342 NTOSAPI
07343 VOID
07344 DDKAPI
07345 KeEnterCriticalRegion(
07346   VOID);
07347 
07348 /*
07349  * VOID
07350  * KeFlushIoBuffers(
07351  * IN PMDL  Mdl,
07352  * IN BOOLEAN  ReadOperation,
07353  * IN BOOLEAN  DmaOperation)
07354  */
07355 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
07356 
07357 NTOSAPI
07358 VOID
07359 DDKAPI
07360 KeFlushQueuedDpcs(VOID);
07361 
07362 NTOSAPI
07363 PRKTHREAD
07364 DDKAPI
07365 KeGetCurrentThread(
07366   VOID);
07367 
07368 NTOSAPI
07369 KPROCESSOR_MODE
07370 DDKAPI
07371 KeGetPreviousMode(
07372   VOID);
07373 
07374 NTOSAPI
07375 ULONG
07376 DDKAPI
07377 KeGetRecommendedSharedDataAlignment(
07378   VOID);
07379 
07380 NTOSAPI
07381 VOID
07382 DDKAPI
07383 KeInitializeApc(
07384   /*IN*/ PKAPC  Apc,
07385   /*IN*/ PKTHREAD  Thread,
07386   /*IN*/ UCHAR  StateIndex,
07387   /*IN*/ PKKERNEL_ROUTINE  KernelRoutine,
07388   /*IN*/ PKRUNDOWN_ROUTINE  RundownRoutine,
07389   /*IN*/ PKNORMAL_ROUTINE  NormalRoutine,
07390   /*IN*/ UCHAR  Mode,
07391   /*IN*/ PVOID  Context);
07392 
07393 NTOSAPI
07394 VOID
07395 DDKAPI
07396 KeInitializeDeviceQueue(
07397   /*IN*/ PKDEVICE_QUEUE  DeviceQueue);
07398 
07399 NTOSAPI
07400 VOID
07401 DDKAPI
07402 KeInitializeMutex(
07403   /*IN*/ PRKMUTEX  Mutex,
07404   /*IN*/ ULONG  Level);
07405 
07406 NTOSAPI
07407 VOID
07408 DDKAPI
07409 KeInitializeSemaphore(
07410   /*IN*/ PRKSEMAPHORE  Semaphore,
07411   /*IN*/ LONG  Count,
07412   /*IN*/ LONG  Limit);
07413 
07414 NTOSAPI
07415 VOID
07416 DDKAPI
07417 KeInitializeSpinLock(
07418   /*IN*/ PKSPIN_LOCK  SpinLock);
07419 
07420 NTOSAPI
07421 VOID
07422 DDKAPI
07423 KeInitializeTimer(
07424   /*IN*/ PKTIMER  Timer);
07425 
07426 NTOSAPI
07427 VOID
07428 DDKAPI
07429 KeInitializeTimerEx(
07430   /*IN*/ PKTIMER  Timer,
07431   /*IN*/ TIMER_TYPE  Type);
07432 
07433 NTOSAPI
07434 BOOLEAN
07435 DDKAPI
07436 KeInsertByKeyDeviceQueue(
07437   /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
07438   /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry,
07439   /*IN*/ ULONG  SortKey);
07440 
07441 NTOSAPI
07442 BOOLEAN
07443 DDKAPI
07444 KeInsertDeviceQueue(
07445   /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
07446   /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
07447 
07448 NTOSAPI
07449 BOOLEAN
07450 DDKAPI
07451 KeInsertQueueDpc(
07452   /*IN*/ PRKDPC  Dpc,
07453   /*IN*/ PVOID  SystemArgument1,
07454   /*IN*/ PVOID  SystemArgument2);
07455 
07456 NTOSAPI
07457 VOID
07458 DDKAPI
07459 KeLeaveCriticalRegion(
07460   VOID);
07461 
07462 #define KeMemoryBarrier() asm("mfence;")
07463 
07464 NTOSAPI
07465 NTSTATUS
07466 DDKAPI
07467 KePulseEvent(
07468   /*IN*/ PRKEVENT  Event,
07469   /*IN*/ KPRIORITY  Increment,
07470   /*IN*/ BOOLEAN  Wait);
07471 
07472 NTOSAPI
07473 ULONGLONG
07474 DDKAPI
07475 KeQueryInterruptTime(
07476   VOID);
07477 
07478 NTOSAPI
07479 LARGE_INTEGER
07480 DDKAPI
07481 KeQueryPerformanceCounter(
07482   /*OUT*/ PLARGE_INTEGER  PerformanceFrequency  /*OPTIONAL*/);
07483 
07484 NTOSAPI
07485 KPRIORITY
07486 DDKAPI
07487 KeQueryPriorityThread(
07488   /*IN*/ PRKTHREAD  Thread);
07489 
07490 NTOSAPI
07491 VOID
07492 DDKAPI
07493 KeQuerySystemTime(
07494   /*OUT*/ PLARGE_INTEGER  CurrentTime);
07495 
07496 NTOSAPI
07497 VOID
07498 DDKAPI
07499 KeQueryTickCount(
07500   /*OUT*/ PLARGE_INTEGER  TickCount);
07501 
07502 NTOSAPI
07503 ULONG
07504 DDKAPI
07505 KeQueryTimeIncrement(
07506   VOID);
07507 
07508 NTOSAPI
07509 LONG
07510 DDKAPI
07511 KeReadStateEvent(
07512   /*IN*/ PRKEVENT  Event);
07513 
07514 NTOSAPI
07515 LONG
07516 DDKAPI
07517 KeReadStateMutex(
07518   /*IN*/ PRKMUTEX  Mutex);
07519 
07520 NTOSAPI
07521 LONG
07522 DDKAPI
07523 KeReadStateSemaphore(
07524   /*IN*/ PRKSEMAPHORE  Semaphore);
07525 
07526 NTOSAPI
07527 BOOLEAN
07528 DDKAPI
07529 KeReadStateTimer(
07530   /*IN*/ PKTIMER  Timer);
07531 
07532 NTOSAPI
07533 BOOLEAN
07534 DDKAPI
07535 KeRegisterBugCheckCallback(
07536   /*IN*/ PKBUGCHECK_CALLBACK_RECORD  CallbackRecord,
07537   /*IN*/ PKBUGCHECK_CALLBACK_ROUTINE  CallbackRoutine,
07538   /*IN*/ PVOID  Buffer,
07539   /*IN*/ ULONG  Length,
07540   /*IN*/ PUCHAR  Component);
07541 
07542 NTOSAPI
07543 VOID
07544 DDKFASTAPI
07545 KeReleaseInStackQueuedSpinLock(
07546   /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);
07547 
07548 NTOSAPI
07549 VOID
07550 DDKFASTAPI
07551 KeReleaseInStackQueuedSpinLockFromDpcLevel(
07552   /*IN*/ PKLOCK_QUEUE_HANDLE  LockHandle);
07553 
07554 NTOSAPI
07555 VOID
07556 DDKAPI
07557 KeReleaseInterruptSpinLock(
07558   /*IN*/ PKINTERRUPT  Interrupt,
07559   /*IN*/ KIRQL  OldIrql);
07560 
07561 NTOSAPI
07562 LONG
07563 DDKAPI
07564 KeReleaseMutex(
07565   /*IN*/ PRKMUTEX  Mutex,
07566   /*IN*/ BOOLEAN  Wait);
07567 
07568 NTOSAPI
07569 LONG
07570 DDKAPI
07571 KeReleaseSemaphore(
07572   /*IN*/ PRKSEMAPHORE  Semaphore,
07573   /*IN*/ KPRIORITY  Increment,
07574   /*IN*/ LONG  Adjustment,
07575   /*IN*/ BOOLEAN  Wait);
07576 
07577 NTOSAPI
07578 VOID
07579 DDKAPI
07580 KeReleaseSpinLock(
07581   /*IN*/ PKSPIN_LOCK  SpinLock,
07582   /*IN*/ KIRQL  NewIrql);
07583 
07584 NTOSAPI
07585 PKDEVICE_QUEUE_ENTRY
07586 DDKAPI 
07587 KeRemoveByKeyDeviceQueue(
07588   /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
07589   /*IN*/ ULONG  SortKey);
07590 
07591 NTOSAPI
07592 PKDEVICE_QUEUE_ENTRY
07593 DDKAPI
07594 KeRemoveDeviceQueue(
07595   /*IN*/ PKDEVICE_QUEUE  DeviceQueue);
07596 
07597 NTOSAPI
07598 BOOLEAN
07599 DDKAPI
07600 KeRemoveEntryDeviceQueue(
07601   /*IN*/ PKDEVICE_QUEUE  DeviceQueue,
07602   /*IN*/ PKDEVICE_QUEUE_ENTRY  DeviceQueueEntry);
07603 
07604 NTOSAPI
07605 BOOLEAN
07606 DDKAPI
07607 KeRemoveQueueDpc(
07608   /*IN*/ PRKDPC  Dpc);
07609 
07610 NTOSAPI
07611 LONG
07612 DDKAPI
07613 KeResetEvent(
07614   /*IN*/ PRKEVENT  Event);
07615 
07616 NTOSAPI
07617 NTSTATUS
07618 DDKAPI
07619 KeRestoreFloatingPointState(
07620   /*IN*/ PKFLOATING_SAVE  FloatSave);
07621 
07622 NTOSAPI
07623 NTSTATUS
07624 DDKAPI
07625 KeSaveFloatingPointState(
07626   /*OUT*/ PKFLOATING_SAVE  FloatSave);
07627 
07628 NTOSAPI
07629 LONG
07630 DDKAPI
07631 KeSetBasePriorityThread(
07632   /*IN*/ PRKTHREAD  Thread,
07633   /*IN*/ LONG  Increment);
07634 
07635 NTOSAPI
07636 LONG
07637 DDKAPI
07638 KeSetEvent(
07639   /*IN*/ PRKEVENT  Event,
07640   /*IN*/ KPRIORITY  Increment,
07641   /*IN*/ BOOLEAN  Wait);
07642 
07643 NTOSAPI
07644 VOID
07645 DDKAPI
07646 KeSetImportanceDpc(
07647   /*IN*/ PRKDPC  Dpc,
07648   /*IN*/ KDPC_IMPORTANCE  Importance);
07649 
07650 NTOSAPI
07651 KPRIORITY
07652 DDKAPI
07653 KeSetPriorityThread(
07654   /*IN*/ PKTHREAD  Thread,
07655   /*IN*/ KPRIORITY  Priority);
07656 
07657 NTOSAPI
07658 VOID
07659 DDKAPI
07660 KeSetTargetProcessorDpc(
07661   /*IN*/ PRKDPC  Dpc,
07662   /*IN*/ CCHAR  Number);
07663 
07664 NTOSAPI
07665 BOOLEAN
07666 DDKAPI
07667 KeSetTimer(
07668   /*IN*/ PKTIMER  Timer,
07669   /*IN*/ LARGE_INTEGER  DueTime,
07670   /*IN*/ PKDPC  Dpc  /*OPTIONAL*/);
07671 
07672 NTOSAPI
07673 BOOLEAN
07674 DDKAPI
07675 KeSetTimerEx(
07676   /*IN*/ PKTIMER  Timer,
07677   /*IN*/ LARGE_INTEGER  DueTime,
07678   /*IN*/ LONG  Period  /*OPTIONAL*/,
07679   /*IN*/ PKDPC  Dpc  /*OPTIONAL*/);
07680 
07681 NTOSAPI
07682 VOID
07683 DDKFASTAPI
07684 KeSetTimeUpdateNotifyRoutine(
07685   /*IN*/ PTIME_UPDATE_NOTIFY_ROUTINE  NotifyRoutine);
07686 
07687 NTOSAPI
07688 VOID
07689 DDKAPI
07690 KeStallExecutionProcessor(
07691   /*IN*/ ULONG  MicroSeconds);
07692 
07693 NTOSAPI
07694 BOOLEAN
07695 DDKAPI
07696 KeSynchronizeExecution(
07697   /*IN*/ PKINTERRUPT    Interrupt,
07698   /*IN*/ PKSYNCHRONIZE_ROUTINE  SynchronizeRoutine,
07699   /*IN*/ PVOID  SynchronizeContext);
07700 
07701 NTOSAPI
07702 NTSTATUS
07703 DDKAPI
07704 KeWaitForMultipleObjects(
07705   /*IN*/ ULONG  Count,
07706   /*IN*/ PVOID  Object[],
07707   /*IN*/ WAIT_TYPE  WaitType,
07708   /*IN*/ KWAIT_REASON  WaitReason,
07709   /*IN*/ KPROCESSOR_MODE  WaitMode,
07710   /*IN*/ BOOLEAN  Alertable,
07711   /*IN*/ PLARGE_INTEGER  Timeout  /*OPTIONAL */,
07712   /*IN*/ PKWAIT_BLOCK  WaitBlockArray  /*OPTIONAL*/);
07713 
07714 NTOSAPI
07715 NTSTATUS
07716 DDKAPI
07717 KeWaitForMutexObject(
07718   /*IN*/ PRKMUTEX  Mutex,
07719   /*IN*/ KWAIT_REASON  WaitReason,
07720   /*IN*/ KPROCESSOR_MODE  WaitMode,
07721   /*IN*/ BOOLEAN  Alertable,
07722   /*IN*/ PLARGE_INTEGER  Timeout  /*OPTIONAL*/);
07723 
07724 NTOSAPI
07725 NTSTATUS
07726 DDKAPI
07727 KeWaitForSingleObject(
07728   /*IN*/ PVOID  Object,
07729   /*IN*/ KWAIT_REASON  WaitReason,
07730   /*IN*/ KPROCESSOR_MODE  WaitMode,
07731   /*IN*/ BOOLEAN  Alertable,
07732   /*IN*/ PLARGE_INTEGER  Timeout  /*OPTIONAL*/);
07733 
07734 NTOSAPI
07735 VOID
07736 DDKAPI
07737 KeRaiseIrql(
07738   /*IN*/ KIRQL new_irql,
07739   /*OUT*/ PKIRQL old_irql);
07740 
07741 NTOSAPI
07742 VOID
07743 DDKAPI
07744 KeLowerIrql(
07745   /*IN*/ KIRQL irql);
07746 
07747 NTOSAPI
07748 KIRQL
07749 DDKAPI
07750 KeRaiseIrqlToDpcLevel(
07751   VOID);
07752 
07753 /** Memory manager routines **/
07754 
07755 NTOSAPI
07756 NTSTATUS
07757 DDKAPI
07758 MmAdvanceMdl(
07759   /*IN*/ PMDL  Mdl,
07760   /*IN*/ ULONG  NumberOfBytes);
07761 
07762 NTOSAPI
07763 PVOID
07764 DDKAPI
07765 MmAllocateContiguousMemory(
07766   /*IN*/ ULONG  NumberOfBytes,
07767   /*IN*/ PHYSICAL_ADDRESS  HighestAcceptableAddress);
07768 
07769 NTOSAPI
07770 PVOID
07771 DDKAPI
07772 MmAllocateContiguousMemorySpecifyCache(
07773   /*IN*/ SIZE_T  NumberOfBytes,
07774   /*IN*/ PHYSICAL_ADDRESS  LowestAcceptableAddress,
07775   /*IN*/ PHYSICAL_ADDRESS  HighestAcceptableAddress,
07776   /*IN*/ PHYSICAL_ADDRESS  BoundaryAddressMultiple  /*OPTIONAL*/,
07777   /*IN*/ MEMORY_CACHING_TYPE  CacheType);
07778 
07779 NTOSAPI
07780 PVOID
07781 DDKAPI
07782 MmAllocateMappingAddress(
07783   /*IN*/ SIZE_T  NumberOfBytes,
07784   /*IN*/ ULONG  PoolTag);
07785 
07786 NTOSAPI
07787 PVOID
07788 DDKAPI
07789 MmAllocateNonCachedMemory(
07790   /*IN*/ ULONG  NumberOfBytes);
07791 
07792 NTOSAPI
07793 PMDL
07794 DDKAPI
07795 MmAllocatePagesForMdl(
07796   /*IN*/ PHYSICAL_ADDRESS  LowAddress,
07797   /*IN*/ PHYSICAL_ADDRESS  HighAddress,
07798   /*IN*/ PHYSICAL_ADDRESS  SkipBytes,
07799   /*IN*/ SIZE_T  TotalBytes);
07800 
07801 NTOSAPI
07802 VOID
07803 DDKAPI
07804 MmBuildMdlForNonPagedPool(
07805   /*IN OUT*/ PMDL  MemoryDescriptorList);
07806 
07807 NTOSAPI
07808 NTSTATUS
07809 DDKAPI
07810 MmCreateSection(
07811   /*OUT*/ PSECTION_OBJECT  *SectionObject,
07812   /*IN*/ ACCESS_MASK  DesiredAccess,
07813   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
07814   /*IN*/ PLARGE_INTEGER  MaximumSize,
07815   /*IN*/ ULONG  SectionPageProtection,
07816   /*IN*/ ULONG  AllocationAttributes,
07817   /*IN*/ HANDLE  FileHandle  /*OPTIONAL*/,
07818   /*IN*/ PFILE_OBJECT  File  /*OPTIONAL*/);
07819 
07820 typedef enum _MMFLUSH_TYPE {
07821   MmFlushForDelete,
07822   MmFlushForWrite
07823 } MMFLUSH_TYPE;
07824 
07825 NTOSAPI
07826 BOOLEAN
07827 DDKAPI
07828 MmFlushImageSection(
07829   /*IN*/ PSECTION_OBJECT_POINTERS  SectionObjectPointer,
07830   /*IN*/ MMFLUSH_TYPE  FlushType);
07831 
07832 NTOSAPI
07833 VOID
07834 DDKAPI
07835 MmFreeContiguousMemory(
07836   /*IN*/ PVOID  BaseAddress);
07837 
07838 NTOSAPI
07839 VOID
07840 DDKAPI
07841 MmFreeContiguousMemorySpecifyCache(
07842   /*IN*/ PVOID  BaseAddress,
07843   /*IN*/ SIZE_T  NumberOfBytes,
07844   /*IN*/ MEMORY_CACHING_TYPE  CacheType);
07845 
07846 NTOSAPI
07847 VOID
07848 DDKAPI
07849 MmFreeMappingAddress(
07850   /*IN*/ PVOID  BaseAddress,
07851   /*IN*/ ULONG  PoolTag);
07852 
07853 NTOSAPI
07854 VOID
07855 DDKAPI
07856 MmFreeNonCachedMemory(
07857   /*IN*/ PVOID  BaseAddress,
07858   /*IN*/ SIZE_T  NumberOfBytes);
07859 
07860 NTOSAPI
07861 VOID
07862 DDKAPI
07863 MmFreePagesFromMdl(
07864   /*IN*/ PMDL  MemoryDescriptorList);
07865 
07866 /*
07867  * ULONG
07868  * MmGetMdlByteCount(
07869  * IN PMDL  Mdl)
07870  */
07871 #define MmGetMdlByteCount(_Mdl) \
07872   ((_Mdl)->ByteCount)
07873 
07874 /*
07875  * ULONG
07876  * MmGetMdlByteOffset(
07877  * IN PMDL  Mdl)
07878  */
07879 #define MmGetMdlByteOffset(_Mdl) \
07880   ((_Mdl)->ByteOffset)
07881 
07882 /*
07883  * PPFN_NUMBER
07884  * MmGetMdlPfnArray(
07885  * IN PMDL  Mdl)
07886  */
07887 #define MmGetMdlPfnArray(_Mdl) \
07888   ((PPFN_NUMBER) ((_Mdl) + 1))
07889 
07890 /*
07891  * PVOID
07892  * MmGetMdlVirtualAddress(
07893  * IN PMDL  Mdl)
07894  */
07895 #define MmGetMdlVirtualAddress(_Mdl) \
07896   ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
07897 
07898 NTOSAPI
07899 PHYSICAL_ADDRESS
07900 DDKAPI
07901 MmGetPhysicalAddress(
07902   /*IN*/ PVOID  BaseAddress);
07903 
07904 NTOSAPI
07905 PPHYSICAL_MEMORY_RANGE
07906 DDKAPI
07907 MmGetPhysicalMemoryRanges(
07908   VOID);
07909 
07910 NTOSAPI
07911 PVOID
07912 DDKAPI
07913 MmGetVirtualForPhysical(
07914   /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress);
07915 
07916 NTOSAPI
07917 PVOID
07918 DDKAPI
07919 MmMapLockedPagesSpecifyCache(
07920   /*IN*/ PMDL  MemoryDescriptorList,
07921   /*IN*/ KPROCESSOR_MODE  AccessMode,
07922   /*IN*/ MEMORY_CACHING_TYPE  CacheType,
07923   /*IN*/ PVOID  BaseAddress,
07924   /*IN*/ ULONG  BugCheckOnFailure,
07925   /*IN*/ MM_PAGE_PRIORITY  Priority);
07926 
07927 NTOSAPI
07928 PVOID
07929 DDKAPI
07930 MmMapLockedPagesWithReservedMapping(
07931   /*IN*/ PVOID  MappingAddress,
07932   /*IN*/ ULONG  PoolTag,
07933   /*IN*/ PMDL  MemoryDescriptorList,
07934   /*IN*/ MEMORY_CACHING_TYPE  CacheType);
07935 
07936 NTOSAPI
07937 NTSTATUS
07938 DDKAPI
07939 MmMapUserAddressesToPage(
07940   /*IN*/ PVOID  BaseAddress,
07941   /*IN*/ SIZE_T  NumberOfBytes,
07942   /*IN*/ PVOID  PageAddress);
07943 
07944 NTOSAPI
07945 PVOID
07946 DDKAPI
07947 MmMapVideoDisplay(
07948   /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress,
07949   /*IN*/ SIZE_T  NumberOfBytes,
07950   /*IN*/ MEMORY_CACHING_TYPE  CacheType);
07951 
07952 NTOSAPI
07953 NTSTATUS
07954 DDKAPI
07955 MmMapViewInSessionSpace(
07956   /*IN*/ PVOID  Section,
07957   /*OUT*/ PVOID  *MappedBase,
07958   /*IN OUT*/ PSIZE_T  ViewSize);
07959 
07960 NTOSAPI
07961 NTSTATUS
07962 DDKAPI
07963 MmMapViewInSystemSpace(
07964   /*IN*/ PVOID  Section,
07965   /*OUT*/ PVOID  *MappedBase,
07966   /*IN*/ PSIZE_T  ViewSize);
07967 
07968 NTOSAPI
07969 NTSTATUS
07970 DDKAPI
07971 MmMarkPhysicalMemoryAsBad(
07972   /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
07973   /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);
07974 
07975 NTOSAPI
07976 NTSTATUS
07977 DDKAPI
07978 MmMarkPhysicalMemoryAsGood(
07979   /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
07980   /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);
07981 
07982 /*
07983  * PVOID
07984  * MmGetSystemAddressForMdlSafe(
07985  * IN PMDL  Mdl,
07986  * IN MM_PAGE_PRIORITY  Priority)
07987  */
07988 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
07989   ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
07990     | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
07991     (_Mdl)->MappedSystemVa : \
07992     (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
07993       KernelMode, MmCached, NULL, FALSE, _Priority)
07994 
07995 NTOSAPI
07996 PVOID
07997 DDKAPI
07998 MmGetSystemRoutineAddress(
07999   /*IN*/ PUNICODE_STRING  SystemRoutineName);
08000 
08001 /*
08002  * ULONG
08003  * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
08004  * IN PVOID  Va,
08005  * IN ULONG  Size)
08006  */
08007 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
08008                                        _Size) \
08009   ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
08010     + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
08011 
08012 /*
08013  * VOID
08014  * MmInitializeMdl(
08015  * IN PMDL  MemoryDescriptorList,
08016  * IN PVOID  BaseVa,
08017  * IN SIZE_T  Length)
08018  */
08019 #define MmInitializeMdl(_MemoryDescriptorList, \
08020                         _BaseVa, \
08021                         _Length) \
08022 { \
08023   (_MemoryDescriptorList)->Next = (PMDL) NULL; \
08024   (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
08025     (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
08026   (_MemoryDescriptorList)->MdlFlags = 0; \
08027   (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
08028   (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
08029   (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
08030 }
08031 
08032 NTOSAPI
08033 BOOLEAN
08034 DDKAPI
08035 MmIsAddressValid(
08036   /*IN*/ PVOID  VirtualAddress);
08037 
08038 NTOSAPI
08039 LOGICAL
08040 DDKAPI
08041 MmIsDriverVerifying(
08042   /*IN*/ PDRIVER_OBJECT  DriverObject);
08043 
08044 NTOSAPI
08045 BOOLEAN
08046 DDKAPI
08047 MmIsThisAnNtAsSystem(
08048   VOID);
08049 
08050 NTOSAPI
08051 NTSTATUS
08052 DDKAPI
08053 MmIsVerifierEnabled(
08054   /*OUT*/ PULONG  VerifierFlags);
08055 
08056 NTOSAPI
08057 PVOID
08058 DDKAPI
08059 MmLockPagableDataSection(
08060   /*IN*/ PVOID  AddressWithinSection);
08061 
08062 NTOSAPI
08063 PVOID
08064 DDKAPI
08065 MmLockPagableImageSection(
08066   /*IN*/ PVOID  AddressWithinSection);
08067 
08068 /*
08069  * PVOID
08070  * MmLockPagableCodeSection(
08071  * IN PVOID  AddressWithinSection)
08072  */
08073 #define MmLockPagableCodeSection MmLockPagableDataSection
08074 
08075 NTOSAPI
08076 VOID
08077 DDKAPI
08078 MmLockPagableSectionByHandle(
08079   /*IN*/ PVOID  ImageSectionHandle);
08080 
08081 NTOSAPI
08082 PVOID
08083 DDKAPI
08084 MmMapIoSpace(
08085   /*IN*/ PHYSICAL_ADDRESS  PhysicalAddress,
08086   /*IN*/ ULONG  NumberOfBytes,
08087   /*IN*/ MEMORY_CACHING_TYPE  CacheEnable);
08088 
08089 NTOSAPI
08090 PVOID
08091 DDKAPI
08092 MmMapLockedPages(
08093   /*IN*/ PMDL  MemoryDescriptorList,
08094   /*IN*/ KPROCESSOR_MODE  AccessMode);
08095 
08096 NTOSAPI
08097 VOID
08098 DDKAPI
08099 MmPageEntireDriver(
08100   /*IN*/ PVOID  AddressWithinSection);
08101 
08102 NTOSAPI
08103 VOID
08104 DDKAPI
08105 MmProbeAndLockProcessPages(
08106   /*IN OUT*/ PMDL  MemoryDescriptorList,
08107   /*IN*/ PEPROCESS  Process,
08108   /*IN*/ KPROCESSOR_MODE  AccessMode,
08109   /*IN*/ LOCK_OPERATION  Operation);
08110 
08111 NTOSAPI
08112 NTSTATUS
08113 DDKAPI
08114 MmProtectMdlSystemAddress(
08115   /*IN*/ PMDL  MemoryDescriptorList,
08116   /*IN*/ ULONG  NewProtect);
08117 
08118 NTOSAPI
08119 VOID
08120 DDKAPI
08121 MmUnmapLockedPages(
08122   /*IN*/ PVOID  BaseAddress,
08123   /*IN*/ PMDL  MemoryDescriptorList);
08124 
08125 NTOSAPI
08126 NTSTATUS
08127 DDKAPI
08128 MmUnmapViewInSessionSpace(
08129   /*IN*/ PVOID  MappedBase);
08130 
08131 NTOSAPI
08132 NTSTATUS
08133 DDKAPI
08134 MmUnmapViewInSystemSpace(
08135   /*IN*/ PVOID MappedBase);
08136 
08137 NTOSAPI
08138 VOID
08139 DDKAPI
08140 MmUnsecureVirtualMemory(
08141   /*IN*/ HANDLE  SecureHandle);
08142 
08143 /*
08144  * VOID
08145  * MmPrepareMdlForReuse(
08146  * IN PMDL  Mdl)
08147  */
08148 #define MmPrepareMdlForReuse(_Mdl) \
08149 { \
08150   if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
08151     ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
08152     MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
08153   } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
08154     ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
08155   } \
08156 }
08157 
08158 NTOSAPI
08159 VOID
08160 DDKAPI
08161 MmProbeAndLockPages(
08162   /*IN OUT*/ PMDL  MemoryDescriptorList,
08163   /*IN*/ KPROCESSOR_MODE  AccessMode,
08164   /*IN*/ LOCK_OPERATION  Operation);
08165 
08166 NTOSAPI
08167 MM_SYSTEM_SIZE
08168 DDKAPI
08169 MmQuerySystemSize(
08170   VOID);
08171 
08172 NTOSAPI
08173 NTSTATUS
08174 DDKAPI
08175 MmRemovePhysicalMemory(
08176   /*IN*/ PPHYSICAL_ADDRESS  StartAddress,
08177   /*IN OUT*/ PLARGE_INTEGER  NumberOfBytes);
08178 
08179 NTOSAPI
08180 VOID
08181 DDKAPI
08182 MmResetDriverPaging(
08183   /*IN*/ PVOID  AddressWithinSection);
08184 
08185 NTOSAPI
08186 HANDLE
08187 DDKAPI
08188 MmSecureVirtualMemory(
08189   /*IN*/ PVOID  Address,
08190   /*IN*/ SIZE_T  Size,
08191   /*IN*/ ULONG  ProbeMode);
08192 
08193 NTOSAPI
08194 ULONG
08195 DDKAPI
08196 MmSizeOfMdl(
08197   /*IN*/ PVOID  Base,
08198   /*IN*/ SIZE_T  Length);
08199 
08200 NTOSAPI
08201 VOID
08202 DDKAPI
08203 MmUnlockPagableImageSection(
08204   /*IN*/ PVOID  ImageSectionHandle);
08205 
08206 NTOSAPI
08207 VOID
08208 DDKAPI
08209 MmUnlockPages(
08210   /*IN*/ PMDL  MemoryDescriptorList);
08211 
08212 NTOSAPI
08213 VOID
08214 DDKAPI
08215 MmUnmapIoSpace(
08216   /*IN*/ PVOID  BaseAddress,
08217   /*IN*/ SIZE_T  NumberOfBytes);
08218 
08219 NTOSAPI
08220 VOID
08221 DDKAPI
08222 MmUnmapReservedMapping(
08223   /*IN*/ PVOID  BaseAddress,
08224   /*IN*/ ULONG  PoolTag,
08225   /*IN*/ PMDL  MemoryDescriptorList);
08226 
08227 NTOSAPI
08228 VOID
08229 DDKAPI
08230 MmUnmapVideoDisplay(
08231   /*IN*/ PVOID  BaseAddress,
08232   /*IN*/ SIZE_T  NumberOfBytes);
08233 
08234 
08235 
08236 /** Object manager routines **/
08237 
08238 NTOSAPI
08239 NTSTATUS
08240 DDKAPI
08241 ObAssignSecurity(
08242   /*IN*/ PACCESS_STATE  AccessState,
08243   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
08244   /*IN*/ PVOID  Object,
08245   /*IN*/ POBJECT_TYPE  Type);
08246 
08247 NTOSAPI
08248 VOID
08249 DDKAPI
08250 ObDereferenceSecurityDescriptor(
08251   PSECURITY_DESCRIPTOR  SecurityDescriptor,
08252   ULONG  Count);
08253 
08254 NTOSAPI
08255 VOID
08256 DDKFASTAPI
08257 ObfDereferenceObject(
08258   /*IN*/ PVOID  Object);
08259 
08260 /*
08261  * VOID
08262  * ObDereferenceObject(
08263  * IN PVOID  Object)
08264  */
08265 #define ObDereferenceObject ObfDereferenceObject
08266 
08267 NTOSAPI
08268 NTSTATUS
08269 DDKAPI
08270 ObGetObjectSecurity(
08271   /*IN*/ PVOID  Object,
08272   /*OUT*/ PSECURITY_DESCRIPTOR  *SecurityDescriptor,
08273   /*OUT*/ PBOOLEAN  MemoryAllocated); 
08274 
08275 NTOSAPI
08276 NTSTATUS
08277 DDKAPI
08278 ObInsertObject(
08279   /*IN*/ PVOID  Object,
08280   /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
08281   /*IN*/ ACCESS_MASK  DesiredAccess,
08282   /*IN*/ ULONG  AdditionalReferences,
08283   /*OUT*/ PVOID*  ReferencedObject  /*OPTIONAL*/,
08284   /*OUT*/ PHANDLE  Handle);
08285 
08286 NTOSAPI
08287 VOID
08288 DDKFASTAPI
08289 ObfReferenceObject(
08290   /*IN*/ PVOID  Object);
08291 
08292 NTOSAPI
08293 NTSTATUS
08294 DDKAPI
08295 ObLogSecurityDescriptor(
08296   /*IN*/ PSECURITY_DESCRIPTOR  InputSecurityDescriptor,
08297   /*OUT*/ PSECURITY_DESCRIPTOR  *OutputSecurityDescriptor,
08298   /*IN*/ ULONG RefBias);
08299 /*
08300  * VOID
08301  * ObReferenceObject(
08302  * IN PVOID  Object)
08303  */
08304 #define ObReferenceObject ObfReferenceObject
08305 
08306 NTOSAPI
08307 VOID
08308 DDKAPI
08309 ObMakeTemporaryObject(
08310   /*IN*/ PVOID  Object);
08311 
08312 NTOSAPI
08313 NTSTATUS
08314 DDKAPI
08315 ObOpenObjectByName(
08316   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08317   /*IN*/ POBJECT_TYPE  ObjectType,
08318   /*IN OUT*/ PVOID  ParseContext  /*OPTIONAL*/,
08319   /*IN*/ KPROCESSOR_MODE  AccessMode,
08320   /*IN*/ ACCESS_MASK  DesiredAccess,
08321   /*IN*/ PACCESS_STATE  PassedAccessState,
08322   /*OUT*/ PHANDLE  Handle);
08323 
08324 NTOSAPI
08325 NTSTATUS
08326 DDKAPI
08327 ObOpenObjectByPointer(
08328   /*IN*/ PVOID  Object,
08329   /*IN*/ ULONG  HandleAttributes,
08330   /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
08331   /*IN*/ ACCESS_MASK  DesiredAccess  /*OPTIONAL*/,
08332   /*IN*/ POBJECT_TYPE  ObjectType  /*OPTIONAL*/,
08333   /*IN*/ KPROCESSOR_MODE  AccessMode,
08334   /*OUT*/ PHANDLE  Handle);
08335 
08336 NTOSAPI
08337 NTSTATUS
08338 DDKAPI
08339 ObQueryObjectAuditingByHandle(
08340   /*IN*/ HANDLE  Handle,
08341   /*OUT*/ PBOOLEAN  GenerateOnClose);
08342 
08343 NTOSAPI
08344 NTSTATUS
08345 DDKAPI
08346 ObReferenceObjectByHandle(
08347   /*IN*/ HANDLE  Handle,
08348   /*IN*/ ACCESS_MASK  DesiredAccess,
08349   /*IN*/ POBJECT_TYPE  ObjectType  /*OPTIONAL*/,
08350   /*IN*/ KPROCESSOR_MODE  AccessMode,
08351   /*OUT*/ PVOID  *Object,
08352   /*OUT*/ POBJECT_HANDLE_INFORMATION  HandleInformation  /*OPTIONAL*/);
08353 
08354 NTOSAPI
08355 NTSTATUS
08356 DDKAPI
08357 ObReferenceObjectByName(
08358   /*IN*/ PUNICODE_STRING  ObjectPath,
08359   /*IN*/ ULONG  Attributes,
08360   /*IN*/ PACCESS_STATE  PassedAccessState  /*OPTIONAL*/,
08361   /*IN*/ ACCESS_MASK  DesiredAccess  /*OPTIONAL*/,
08362   /*IN*/ POBJECT_TYPE  ObjectType,
08363   /*IN*/ KPROCESSOR_MODE  AccessMode,
08364   /*IN OUT*/ PVOID  ParseContext  /*OPTIONAL*/,
08365   /*OUT*/ PVOID  *Object);
08366 
08367 NTOSAPI
08368 NTSTATUS
08369 DDKAPI
08370 ObReferenceObjectByPointer(
08371   /*IN*/ PVOID  Object,
08372   /*IN*/ ACCESS_MASK  DesiredAccess,
08373   /*IN*/ POBJECT_TYPE  ObjectType,
08374   /*IN*/ KPROCESSOR_MODE  AccessMode);
08375 
08376 NTOSAPI
08377 VOID
08378 DDKAPI
08379 ObReferenceSecurityDescriptor(
08380   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
08381   /*IN*/ ULONG  Count);
08382 
08383 NTOSAPI
08384 VOID
08385 DDKAPI
08386 ObReleaseObjectSecurity(
08387   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
08388   /*IN*/ BOOLEAN  MemoryAllocated);
08389 
08390 
08391 
08392 /** Process manager routines **/
08393 
08394 NTOSAPI
08395 NTSTATUS
08396 DDKAPI
08397 PsCreateSystemProcess(
08398   /*IN*/ PHANDLE  ProcessHandle,
08399   /*IN*/ ACCESS_MASK  DesiredAccess,
08400   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08401 
08402 NTOSAPI
08403 NTSTATUS
08404 DDKAPI
08405 PsCreateSystemThread(
08406   /*OUT*/ PHANDLE  ThreadHandle,
08407   /*IN*/ ULONG  DesiredAccess,
08408   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
08409   /*IN*/ HANDLE  ProcessHandle  /*OPTIONAL*/,
08410   /*OUT*/ PCLIENT_ID  ClientId  /*OPTIONAL*/,
08411   /*IN*/ PKSTART_ROUTINE  StartRoutine,
08412   /*IN*/ PVOID  StartContext);
08413 
08414 /*
08415  * PEPROCESS
08416  * PsGetCurrentProcess(VOID)
08417  */
08418 #define PsGetCurrentProcess IoGetCurrentProcess
08419 
08420 NTOSAPI
08421 HANDLE
08422 DDKAPI
08423 PsGetCurrentProcessId(
08424   VOID);
08425 
08426 /*
08427  * PETHREAD
08428  * PsGetCurrentThread(VOID)
08429  */
08430 #define PsGetCurrentThread() \
08431   ((PETHREAD) KeGetCurrentThread())
08432 
08433 NTOSAPI
08434 HANDLE
08435 DDKAPI
08436 PsGetCurrentThreadId(
08437   VOID);
08438 
08439 NTOSAPI
08440 BOOLEAN
08441 DDKAPI
08442 PsGetVersion(
08443   PULONG  MajorVersion  /*OPTIONAL*/,
08444   PULONG  MinorVersion  /*OPTIONAL*/,
08445   PULONG  BuildNumber  /*OPTIONAL*/,
08446   PUNICODE_STRING  CSDVersion  /*OPTIONAL*/);
08447 
08448 NTOSAPI
08449 NTSTATUS
08450 DDKAPI
08451 PsRemoveCreateThreadNotifyRoutine(
08452   /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);
08453 
08454 NTOSAPI
08455 NTSTATUS
08456 DDKAPI
08457 PsRemoveLoadImageNotifyRoutine(
08458   /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);
08459 
08460 NTOSAPI
08461 NTSTATUS
08462 DDKAPI
08463 PsSetCreateProcessNotifyRoutine(
08464   /*IN*/ PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,
08465   /*IN*/ BOOLEAN  Remove);
08466 
08467 NTOSAPI
08468 NTSTATUS
08469 DDKAPI
08470 PsSetCreateThreadNotifyRoutine(
08471   /*IN*/ PCREATE_THREAD_NOTIFY_ROUTINE  NotifyRoutine);
08472 
08473 NTOSAPI
08474 NTSTATUS
08475 DDKAPI
08476 PsSetLoadImageNotifyRoutine(
08477   /*IN*/ PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine);
08478 
08479 NTOSAPI
08480 NTSTATUS
08481 DDKAPI
08482 PsTerminateSystemThread(
08483   /*IN*/ NTSTATUS  ExitStatus);
08484 
08485 
08486 
08487 /** Security reference monitor routines **/
08488 
08489 NTOSAPI
08490 BOOLEAN
08491 DDKAPI
08492 SeAccessCheck(
08493   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor,
08494   /*IN*/ PSECURITY_SUBJECT_CONTEXT  SubjectSecurityContext,
08495   /*IN*/ BOOLEAN  SubjectContextLocked,
08496   /*IN*/ ACCESS_MASK  DesiredAccess,
08497   /*IN*/ ACCESS_MASK  PreviouslyGrantedAccess,
08498   /*OUT*/ PPRIVILEGE_SET  *Privileges  /*OPTIONAL*/,
08499   /*IN*/ PGENERIC_MAPPING  GenericMapping,
08500   /*IN*/ KPROCESSOR_MODE  AccessMode,
08501   /*OUT*/ PACCESS_MASK  GrantedAccess,
08502   /*OUT*/ PNTSTATUS  AccessStatus);
08503 
08504 NTOSAPI
08505 NTSTATUS
08506 DDKAPI
08507 SeAssignSecurity(
08508   /*IN*/ PSECURITY_DESCRIPTOR  ParentDescriptor  /*OPTIONAL*/,
08509   /*IN*/ PSECURITY_DESCRIPTOR  ExplicitDescriptor  /*OPTIONAL*/,
08510   /*OUT*/ PSECURITY_DESCRIPTOR  *NewDescriptor,
08511   /*IN*/ BOOLEAN  IsDirectoryObject,
08512   /*IN*/ PSECURITY_SUBJECT_CONTEXT  SubjectContext,
08513   /*IN*/ PGENERIC_MAPPING  GenericMapping,
08514   /*IN*/ POOL_TYPE  PoolType);
08515 
08516 NTOSAPI
08517 NTSTATUS
08518 DDKAPI
08519 SeAssignSecurityEx(
08520   /*IN*/ PSECURITY_DESCRIPTOR  ParentDescriptor  /*OPTIONAL*/,
08521   /*IN*/ PSECURITY_DESCRIPTOR  ExplicitDescriptor  /*OPTIONAL*/,
08522   /*OUT*/ PSECURITY_DESCRIPTOR  *NewDescriptor,
08523   /*IN*/ GUID  *ObjectType  /*OPTIONAL*/,
08524   /*IN*/ BOOLEAN  IsDirectoryObject,
08525   /*IN*/ ULONG  AutoInheritFlags,
08526   /*IN*/ PSECURITY_SUBJECT_CONTEXT  SubjectContext,
08527   /*IN*/ PGENERIC_MAPPING  GenericMapping,
08528   /*IN*/ POOL_TYPE  PoolType);
08529 
08530 NTOSAPI
08531 NTSTATUS
08532 DDKAPI
08533 SeDeassignSecurity(
08534   /*IN OUT*/ PSECURITY_DESCRIPTOR  *SecurityDescriptor);
08535 
08536 NTOSAPI
08537 BOOLEAN
08538 DDKAPI
08539 SeSinglePrivilegeCheck(
08540   LUID  PrivilegeValue,
08541   KPROCESSOR_MODE  PreviousMode);
08542 
08543 NTOSAPI
08544 BOOLEAN
08545 DDKAPI
08546 SeValidSecurityDescriptor(
08547   /*IN*/ ULONG  Length,
08548   /*IN*/ PSECURITY_DESCRIPTOR  SecurityDescriptor);
08549 
08550 
08551 
08552 /** NtXxx routines **/
08553 
08554 NTOSAPI
08555 NTSTATUS
08556 DDKAPI
08557 NtOpenProcess(
08558   /*OUT*/ PHANDLE  ProcessHandle,
08559   /*IN*/ ACCESS_MASK  DesiredAccess,
08560   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08561   /*IN*/ PCLIENT_ID  ClientId  /*OPTIONAL*/);
08562 
08563 NTOSAPI
08564 NTSTATUS
08565 DDKAPI
08566 NtQueryInformationProcess(
08567   /*IN*/ HANDLE  ProcessHandle,
08568   /*IN*/ PROCESSINFOCLASS  ProcessInformationClass,
08569   /*OUT*/ PVOID  ProcessInformation,
08570   /*IN*/ ULONG  ProcessInformationLength,
08571   /*OUT*/ PULONG  ReturnLength /*OPTIONAL*/);
08572 
08573 
08574 
08575 /** NtXxx and ZwXxx routines **/
08576 
08577 NTOSAPI
08578 NTSTATUS
08579 DDKAPI
08580 NtCancelTimer(
08581   /*IN*/ HANDLE  TimerHandle,
08582   /*OUT*/ PBOOLEAN  CurrentState  /*OPTIONAL*/);
08583 
08584 NTOSAPI
08585 NTSTATUS
08586 DDKAPI
08587 ZwCancelTimer(
08588   /*IN*/ HANDLE  TimerHandle,
08589   /*OUT*/ PBOOLEAN  CurrentState  /*OPTIONAL*/);
08590 
08591 NTOSAPI
08592 NTSTATUS
08593 DDKAPI
08594 NtClose(
08595   /*IN*/ HANDLE  Handle);
08596 
08597 NTOSAPI
08598 NTSTATUS
08599 DDKAPI
08600 ZwClose(
08601   /*IN*/ HANDLE  Handle);
08602 
08603 NTOSAPI
08604 NTSTATUS
08605 DDKAPI
08606 NtCreateDirectoryObject(
08607   /*OUT*/ PHANDLE  DirectoryHandle,
08608   /*IN*/ ACCESS_MASK  DesiredAccess,
08609   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08610 
08611 NTOSAPI
08612 NTSTATUS
08613 DDKAPI
08614 ZwCreateDirectoryObject(
08615   /*OUT*/ PHANDLE  DirectoryHandle,
08616   /*IN*/ ACCESS_MASK  DesiredAccess,
08617   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08618 
08619 NTOSAPI
08620 NTSTATUS
08621 DDKAPI
08622 NtCreateEvent(
08623   /*OUT*/ PHANDLE  EventHandle,
08624   /*IN*/ ACCESS_MASK  DesiredAccess,
08625   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08626   /*IN*/ BOOLEAN  ManualReset,
08627   /*IN*/ BOOLEAN  InitialState);
08628 
08629 NTOSAPI
08630 NTSTATUS
08631 DDKAPI
08632 ZwCreateEvent(
08633   /*OUT*/ PHANDLE  EventHandle,
08634   /*IN*/ ACCESS_MASK  DesiredAccess,
08635   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08636   /*IN*/ BOOLEAN  ManualReset,
08637   /*IN*/ BOOLEAN  InitialState);
08638 
08639 NTOSAPI
08640 NTSTATUS
08641 DDKAPI
08642 NtCreateFile(
08643   /*OUT*/ PHANDLE  FileHandle,
08644   /*IN*/ ACCESS_MASK  DesiredAccess,
08645   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08646   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
08647   /*IN*/ PLARGE_INTEGER  AllocationSize  /*OPTIONAL*/,
08648   /*IN*/ ULONG  FileAttributes,
08649   /*IN*/ ULONG  ShareAccess,
08650   /*IN*/ ULONG  CreateDisposition,
08651   /*IN*/ ULONG  CreateOptions,
08652   /*IN*/ PVOID  EaBuffer  /*OPTIONAL*/,
08653   /*IN*/ ULONG  EaLength);
08654 
08655 NTOSAPI
08656 NTSTATUS
08657 DDKAPI
08658 ZwCreateFile(
08659   /*OUT*/ PHANDLE  FileHandle,
08660   /*IN*/ ACCESS_MASK  DesiredAccess,
08661   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08662   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
08663   /*IN*/ PLARGE_INTEGER  AllocationSize  /*OPTIONAL*/,
08664   /*IN*/ ULONG  FileAttributes,
08665   /*IN*/ ULONG  ShareAccess,
08666   /*IN*/ ULONG  CreateDisposition,
08667   /*IN*/ ULONG  CreateOptions,
08668   /*IN*/ PVOID  EaBuffer  /*OPTIONAL*/,
08669   /*IN*/ ULONG  EaLength);
08670 
08671 NTOSAPI
08672 NTSTATUS
08673 DDKAPI
08674 NtCreateKey(
08675   /*OUT*/ PHANDLE  KeyHandle,
08676   /*IN*/ ACCESS_MASK  DesiredAccess,
08677   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08678   /*IN*/ ULONG  TitleIndex,
08679   /*IN*/ PUNICODE_STRING  Class  /*OPTIONAL*/,
08680   /*IN*/ ULONG  CreateOptions,
08681   /*OUT*/ PULONG  Disposition  /*OPTIONAL*/);
08682 
08683 NTOSAPI
08684 NTSTATUS
08685 DDKAPI
08686 ZwCreateKey(
08687   /*OUT*/ PHANDLE  KeyHandle,
08688   /*IN*/ ACCESS_MASK  DesiredAccess,
08689   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08690   /*IN*/ ULONG  TitleIndex,
08691   /*IN*/ PUNICODE_STRING  Class  /*OPTIONAL*/,
08692   /*IN*/ ULONG  CreateOptions,
08693   /*OUT*/ PULONG  Disposition  /*OPTIONAL*/);
08694 
08695 NTOSAPI
08696 NTSTATUS
08697 DDKAPI
08698 NtCreateTimer(
08699   /*OUT*/ PHANDLE  TimerHandle,
08700   /*IN*/ ACCESS_MASK  DesiredAccess,
08701   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
08702   /*IN*/ TIMER_TYPE  TimerType);
08703 
08704 NTOSAPI
08705 NTSTATUS
08706 DDKAPI
08707 ZwCreateTimer(
08708   /*OUT*/ PHANDLE  TimerHandle,
08709   /*IN*/ ACCESS_MASK  DesiredAccess,
08710   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes  /*OPTIONAL*/,
08711   /*IN*/ TIMER_TYPE  TimerType);
08712 
08713 NTOSAPI
08714 NTSTATUS
08715 DDKAPI
08716 NtDeleteKey(
08717   /*IN*/ HANDLE  KeyHandle);
08718 
08719 NTOSAPI
08720 NTSTATUS
08721 DDKAPI
08722 ZwDeleteKey(
08723   /*IN*/ HANDLE  KeyHandle);
08724 
08725 NTOSAPI
08726 NTSTATUS
08727 DDKAPI
08728 NtDeleteValueKey(
08729   /*IN*/ HANDLE  KeyHandle,
08730   /*IN*/ PUNICODE_STRING  ValueName);
08731 
08732 NTOSAPI
08733 NTSTATUS
08734 DDKAPI
08735 ZwDeleteValueKey(
08736   /*IN*/ HANDLE  KeyHandle,
08737   /*IN*/ PUNICODE_STRING  ValueName);
08738 
08739 NTOSAPI
08740 NTSTATUS
08741 DDKAPI
08742 NtDeviceIoControlFile(
08743   /*IN*/ HANDLE  DeviceHandle,
08744   /*IN*/ HANDLE  Event  /*OPTIONAL*/, 
08745   /*IN*/ PIO_APC_ROUTINE  UserApcRoutine  /*OPTIONAL*/, 
08746   /*IN*/ PVOID  UserApcContext  /*OPTIONAL*/, 
08747   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock, 
08748   /*IN*/ ULONG  IoControlCode,
08749   /*IN*/ PVOID  InputBuffer, 
08750   /*IN*/ ULONG  InputBufferSize,
08751   /*OUT*/ PVOID  OutputBuffer,
08752   /*IN*/ ULONG  OutputBufferSize);
08753 
08754 NTOSAPI
08755 NTSTATUS
08756 DDKAPI
08757 ZwDeviceIoControlFile(
08758   /*IN*/ HANDLE  DeviceHandle,
08759   /*IN*/ HANDLE  Event  /*OPTIONAL*/, 
08760   /*IN*/ PIO_APC_ROUTINE  UserApcRoutine  /*OPTIONAL*/, 
08761   /*IN*/ PVOID  UserApcContext  /*OPTIONAL*/, 
08762   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock, 
08763   /*IN*/ ULONG  IoControlCode,
08764   /*IN*/ PVOID  InputBuffer, 
08765   /*IN*/ ULONG  InputBufferSize,
08766   /*OUT*/ PVOID  OutputBuffer,
08767   /*IN*/ ULONG  OutputBufferSize);
08768 
08769 NTOSAPI
08770 NTSTATUS
08771 DDKAPI
08772 NtEnumerateKey(
08773   /*IN*/ HANDLE  KeyHandle,
08774   /*IN*/ ULONG  Index,
08775   /*IN*/ KEY_INFORMATION_CLASS  KeyInformationClass,
08776   /*OUT*/ PVOID  KeyInformation,
08777   /*IN*/ ULONG  Length,
08778   /*OUT*/ PULONG  ResultLength);
08779 
08780 NTOSAPI
08781 NTSTATUS
08782 DDKAPI
08783 ZwEnumerateKey(
08784   /*IN*/ HANDLE  KeyHandle,
08785   /*IN*/ ULONG  Index,
08786   /*IN*/ KEY_INFORMATION_CLASS  KeyInformationClass,
08787   /*OUT*/ PVOID  KeyInformation,
08788   /*IN*/ ULONG  Length,
08789   /*OUT*/ PULONG  ResultLength);
08790 
08791 NTOSAPI
08792 NTSTATUS
08793 DDKAPI
08794 NtEnumerateValueKey(
08795   /*IN*/ HANDLE  KeyHandle,
08796   /*IN*/ ULONG  Index,
08797   /*IN*/ KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
08798   /*OUT*/ PVOID  KeyValueInformation,
08799   /*IN*/ ULONG  Length,
08800   /*OUT*/ PULONG  ResultLength);
08801 
08802 NTOSAPI
08803 NTSTATUS
08804 DDKAPI
08805 ZwEnumerateValueKey(
08806   /*IN*/ HANDLE  KeyHandle,
08807   /*IN*/ ULONG  Index,
08808   /*IN*/ KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
08809   /*OUT*/ PVOID  KeyValueInformation,
08810   /*IN*/ ULONG  Length,
08811   /*OUT*/ PULONG  ResultLength);
08812 
08813 NTOSAPI
08814 NTSTATUS
08815 DDKAPI
08816 NtFlushKey(
08817   /*IN*/ HANDLE  KeyHandle);
08818 
08819 NTOSAPI
08820 NTSTATUS
08821 DDKAPI
08822 ZwFlushKey(
08823   /*IN*/ HANDLE  KeyHandle);
08824 
08825 NTOSAPI
08826 NTSTATUS
08827 DDKAPI
08828 NtMakeTemporaryObject(
08829   /*IN*/ HANDLE  Handle);
08830 
08831 NTOSAPI
08832 NTSTATUS
08833 DDKAPI
08834 ZwMakeTemporaryObject(
08835   /*IN*/ HANDLE  Handle);
08836 
08837 NTOSAPI
08838 NTSTATUS
08839 DDKAPI
08840 NtMapViewOfSection(
08841   /*IN*/ HANDLE  SectionHandle,
08842   /*IN*/ HANDLE  ProcessHandle,
08843   /*IN OUT*/ PVOID  *BaseAddress,
08844   /*IN*/ ULONG  ZeroBits,
08845   /*IN*/ ULONG  CommitSize,
08846   /*IN OUT*/ PLARGE_INTEGER  SectionOffset  /*OPTIONAL*/,
08847   /*IN OUT*/ PSIZE_T  ViewSize,
08848   /*IN*/ SECTION_INHERIT  InheritDisposition,
08849   /*IN*/ ULONG  AllocationType,
08850   /*IN*/ ULONG  Protect);
08851 
08852 NTOSAPI
08853 NTSTATUS
08854 DDKAPI
08855 ZwMapViewOfSection(
08856   /*IN*/ HANDLE  SectionHandle,
08857   /*IN*/ HANDLE  ProcessHandle,
08858   /*IN OUT*/ PVOID  *BaseAddress,
08859   /*IN*/ ULONG  ZeroBits,
08860   /*IN*/ ULONG  CommitSize,
08861   /*IN OUT*/ PLARGE_INTEGER  SectionOffset  /*OPTIONAL*/,
08862   /*IN OUT*/ PSIZE_T  ViewSize,
08863   /*IN*/ SECTION_INHERIT  InheritDisposition,
08864   /*IN*/ ULONG  AllocationType,
08865   /*IN*/ ULONG  Protect);
08866 
08867 NTOSAPI
08868 NTSTATUS
08869 DDKAPI
08870 NtOpenFile(
08871   /*OUT*/ PHANDLE  FileHandle,
08872   /*IN*/ ACCESS_MASK  DesiredAccess,
08873   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08874   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
08875   /*IN*/ ULONG  ShareAccess,
08876   /*IN*/ ULONG  OpenOptions);
08877 
08878 NTOSAPI
08879 NTSTATUS
08880 DDKAPI
08881 ZwOpenFile(
08882   /*OUT*/ PHANDLE  FileHandle,
08883   /*IN*/ ACCESS_MASK  DesiredAccess,
08884   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes,
08885   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
08886   /*IN*/ ULONG  ShareAccess,
08887   /*IN*/ ULONG  OpenOptions);
08888 
08889 NTOSAPI
08890 NTSTATUS
08891 DDKAPI
08892 NtOpenKey(
08893   /*OUT*/ PHANDLE  KeyHandle,
08894   /*IN*/ ACCESS_MASK  DesiredAccess,
08895   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08896 
08897 NTOSAPI
08898 NTSTATUS
08899 DDKAPI
08900 ZwOpenKey(
08901   /*OUT*/ PHANDLE  KeyHandle,
08902   /*IN*/ ACCESS_MASK  DesiredAccess,
08903   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08904 
08905 NTOSAPI
08906 NTSTATUS
08907 DDKAPI
08908 NtOpenSection(
08909   /*OUT*/ PHANDLE  SectionHandle,
08910   /*IN*/ ACCESS_MASK  DesiredAccess,
08911   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08912 
08913 NTOSAPI
08914 NTSTATUS
08915 DDKAPI
08916 ZwOpenSection(
08917   /*OUT*/ PHANDLE  SectionHandle,
08918   /*IN*/ ACCESS_MASK  DesiredAccess,
08919   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08920 
08921 NTOSAPI
08922 NTSTATUS
08923 DDKAPI
08924 NtOpenSymbolicLinkObject(
08925   /*OUT*/ PHANDLE  LinkHandle,
08926   /*IN*/ ACCESS_MASK  DesiredAccess,
08927   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08928 
08929 NTOSAPI
08930 NTSTATUS
08931 DDKAPI
08932 ZwOpenSymbolicLinkObject(
08933   /*OUT*/ PHANDLE  LinkHandle,
08934   /*IN*/ ACCESS_MASK  DesiredAccess,
08935   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08936 
08937 NTOSAPI
08938 NTSTATUS
08939 DDKAPI
08940 NtOpenTimer(
08941   /*OUT*/ PHANDLE  TimerHandle,
08942   /*IN*/ ACCESS_MASK  DesiredAccess,
08943   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08944 
08945 NTOSAPI
08946 NTSTATUS
08947 DDKAPI
08948 ZwOpenTimer(
08949   /*OUT*/ PHANDLE  TimerHandle,
08950   /*IN*/ ACCESS_MASK  DesiredAccess,
08951   /*IN*/ POBJECT_ATTRIBUTES  ObjectAttributes);
08952 
08953 NTOSAPI
08954 NTSTATUS
08955 DDKAPI
08956 NtQueryInformationFile(
08957   /*IN*/ HANDLE  FileHandle,
08958   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
08959   /*OUT*/ PVOID  FileInformation,
08960   /*IN*/ ULONG  Length,
08961   /*IN*/ FILE_INFORMATION_CLASS  FileInformationClass);
08962 
08963 NTOSAPI
08964 NTSTATUS
08965 DDKAPI
08966 ZwQueryInformationFile(
08967   /*IN*/ HANDLE  FileHandle,
08968   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
08969   /*OUT*/ PVOID  FileInformation,
08970   /*IN*/ ULONG  Length,
08971   /*IN*/ FILE_INFORMATION_CLASS  FileInformationClass);
08972 
08973 NTOSAPI
08974 NTSTATUS
08975 DDKAPI
08976 NtQueryKey(
08977   /*IN*/ HANDLE  KeyHandle,
08978   /*IN*/ KEY_INFORMATION_CLASS  KeyInformationClass,
08979   /*OUT*/ PVOID  KeyInformation,
08980   /*IN*/ ULONG  Length,
08981   /*OUT*/ PULONG  ResultLength);
08982 
08983 NTOSAPI
08984 NTSTATUS
08985 DDKAPI
08986 ZwQueryKey(
08987   /*IN*/ HANDLE  KeyHandle,
08988   /*IN*/ KEY_INFORMATION_CLASS  KeyInformationClass,
08989   /*OUT*/ PVOID  KeyInformation,
08990   /*IN*/ ULONG  Length,
08991   /*OUT*/ PULONG  ResultLength);
08992 
08993 NTOSAPI
08994 NTSTATUS
08995 DDKAPI
08996 NtQuerySymbolicLinkObject(
08997   /*IN*/ HANDLE  LinkHandle,
08998   /*IN OUT*/ PUNICODE_STRING  LinkTarget,
08999   /*OUT*/ PULONG  ReturnedLength  /*OPTIONAL*/);
09000 
09001 NTOSAPI
09002 NTSTATUS
09003 DDKAPI
09004 ZwQuerySymbolicLinkObject(
09005   /*IN*/ HANDLE  LinkHandle,
09006   /*IN OUT*/ PUNICODE_STRING  LinkTarget,
09007   /*OUT*/ PULONG  ReturnedLength  /*OPTIONAL*/);
09008 
09009 NTOSAPI
09010 NTSTATUS
09011 DDKAPI
09012 NtQueryValueKey(
09013   /*IN*/ HANDLE  KeyHandle,
09014   /*IN*/ PUNICODE_STRING  ValueName,
09015   /*IN*/ KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
09016   /*OUT*/ PVOID  KeyValueInformation,
09017   /*IN*/ ULONG  Length,
09018   /*OUT*/ PULONG  ResultLength);
09019 
09020 NTOSAPI
09021 NTSTATUS
09022 DDKAPI
09023 ZwQueryValueKey(
09024   /*IN*/ HANDLE  KeyHandle,
09025   /*IN*/ PUNICODE_STRING  ValueName,
09026   /*IN*/ KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
09027   /*OUT*/ PVOID  KeyValueInformation,
09028   /*IN*/ ULONG  Length,
09029   /*OUT*/ PULONG  ResultLength);
09030 
09031 NTOSAPI
09032 NTSTATUS
09033 DDKAPI
09034 NtReadFile(
09035   /*IN*/ HANDLE  FileHandle,
09036   /*IN*/ HANDLE  Event  /*OPTIONAL*/,
09037   /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
09038   /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
09039   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
09040   /*OUT*/ PVOID  Buffer,
09041   /*IN*/ ULONG  Length,
09042   /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
09043   /*IN*/ PULONG  Key  /*OPTIONAL*/);
09044 
09045 NTOSAPI
09046 NTSTATUS
09047 DDKAPI
09048 ZwReadFile(
09049   /*IN*/ HANDLE  FileHandle,
09050   /*IN*/ HANDLE  Event  /*OPTIONAL*/,
09051   /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
09052   /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
09053   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
09054   /*OUT*/ PVOID  Buffer,
09055   /*IN*/ ULONG  Length,
09056   /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
09057   /*IN*/ PULONG  Key  /*OPTIONAL*/);
09058 
09059 NTOSAPI
09060 NTSTATUS
09061 DDKAPI
09062 NtSetEvent(
09063   /*IN*/ HANDLE  EventHandle,
09064   /*IN*/ PULONG  NumberOfThreadsReleased);
09065 
09066 NTOSAPI
09067 NTSTATUS
09068 DDKAPI
09069 ZwSetEvent(
09070   /*IN*/ HANDLE  EventHandle,
09071   /*IN*/ PULONG  NumberOfThreadsReleased);
09072 
09073 NTOSAPI
09074 NTSTATUS
09075 DDKAPI
09076 NtSetInformationFile(
09077   /*IN*/ HANDLE  FileHandle,
09078   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
09079   /*IN*/ PVOID  FileInformation,
09080   /*IN*/ ULONG  Length,
09081   /*IN*/ FILE_INFORMATION_CLASS  FileInformationClass);
09082 
09083 NTOSAPI
09084 NTSTATUS
09085 DDKAPI
09086 ZwSetInformationFile(
09087   /*IN*/ HANDLE  FileHandle,
09088   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
09089   /*IN*/ PVOID  FileInformation,
09090   /*IN*/ ULONG  Length,
09091   /*IN*/ FILE_INFORMATION_CLASS  FileInformationClass);
09092 
09093 NTOSAPI
09094 NTSTATUS
09095 DDKAPI
09096 NtSetInformationThread(
09097   /*IN*/ HANDLE  ThreadHandle,
09098   /*IN*/ THREADINFOCLASS  ThreadInformationClass,
09099   /*IN*/ PVOID  ThreadInformation,
09100   /*IN*/ ULONG  ThreadInformationLength);
09101 
09102 NTOSAPI
09103 NTSTATUS
09104 DDKAPI
09105 ZwSetInformationThread(
09106   /*IN*/ HANDLE  ThreadHandle,
09107   /*IN*/ THREADINFOCLASS  ThreadInformationClass,
09108   /*IN*/ PVOID  ThreadInformation,
09109   /*IN*/ ULONG  ThreadInformationLength);
09110 
09111 NTOSAPI
09112 NTSTATUS
09113 DDKAPI
09114 NtSetTimer(
09115   /*IN*/ HANDLE  TimerHandle,
09116   /*IN*/ PLARGE_INTEGER  DueTime,
09117   /*IN*/ PTIMER_APC_ROUTINE  TimerApcRoutine  /*OPTIONAL*/,
09118   /*IN*/ PVOID  TimerContext  /*OPTIONAL*/,
09119   /*IN*/ BOOLEAN  WakeTimer,
09120   /*IN*/ LONG  Period  /*OPTIONAL*/,
09121   /*OUT*/ PBOOLEAN  PreviousState  /*OPTIONAL*/);
09122 
09123 NTOSAPI
09124 NTSTATUS
09125 DDKAPI
09126 ZwSetTimer(
09127   /*IN*/ HANDLE  TimerHandle,
09128   /*IN*/ PLARGE_INTEGER  DueTime,
09129   /*IN*/ PTIMER_APC_ROUTINE  TimerApcRoutine  /*OPTIONAL*/,
09130   /*IN*/ PVOID  TimerContext  /*OPTIONAL*/,
09131   /*IN*/ BOOLEAN  WakeTimer,
09132   /*IN*/ LONG  Period  /*OPTIONAL*/,
09133   /*OUT*/ PBOOLEAN  PreviousState  /*OPTIONAL*/);
09134 
09135 NTOSAPI
09136 NTSTATUS
09137 DDKAPI
09138 NtSetValueKey(
09139   /*IN*/ HANDLE  KeyHandle,
09140   /*IN*/ PUNICODE_STRING  ValueName,
09141   /*IN*/ ULONG  TitleIndex  /*OPTIONAL*/,
09142   /*IN*/ ULONG  Type,
09143   /*IN*/ PVOID  Data,
09144   /*IN*/ ULONG  DataSize);
09145 
09146 NTOSAPI
09147 NTSTATUS
09148 DDKAPI
09149 ZwSetValueKey(
09150   /*IN*/ HANDLE  KeyHandle,
09151   /*IN*/ PUNICODE_STRING  ValueName,
09152   /*IN*/ ULONG  TitleIndex  /*OPTIONAL*/,
09153   /*IN*/ ULONG  Type,
09154   /*IN*/ PVOID  Data,
09155   /*IN*/ ULONG  DataSize);
09156 
09157 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
09158 #define AT_EXTENDABLE_FILE                0x00002000
09159 #define SEC_NO_CHANGE                     0x00400000
09160 #define AT_RESERVED                       0x20000000
09161 #define AT_ROUND_TO_PAGE                  0x40000000
09162 
09163 NTOSAPI
09164 NTSTATUS
09165 DDKAPI
09166 NtUnmapViewOfSection(
09167   /*IN*/ HANDLE  ProcessHandle,
09168   /*IN*/ PVOID  BaseAddress);
09169 
09170 NTOSAPI
09171 NTSTATUS
09172 DDKAPI
09173 ZwUnmapViewOfSection(
09174   /*IN*/ HANDLE  ProcessHandle,
09175   /*IN*/ PVOID  BaseAddress);
09176 
09177 NTOSAPI
09178 NTSTATUS
09179 DDKAPI
09180 NtWaitForSingleObject(
09181   /*IN*/ HANDLE  Object,
09182   /*IN*/ BOOLEAN  Alertable,
09183   /*IN*/ PLARGE_INTEGER  Time);
09184 
09185 NTOSAPI
09186 NTSTATUS
09187 DDKAPI
09188 ZwWaitForSingleObject(
09189   /*IN*/ HANDLE  Object,
09190   /*IN*/ BOOLEAN  Alertable,
09191   /*IN*/ PLARGE_INTEGER  Time);
09192 
09193 NTOSAPI
09194 NTSTATUS
09195 DDKAPI
09196 NtWriteFile(
09197   /*IN*/ HANDLE  FileHandle,
09198   /*IN*/ HANDLE  Event  /*OPTIONAL*/,
09199   /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
09200   /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
09201   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
09202   /*IN*/ PVOID  Buffer,
09203   /*IN*/ ULONG  Length,
09204   /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
09205   /*IN*/ PULONG  Key  /*OPTIONAL*/);
09206 
09207 NTOSAPI
09208 NTSTATUS
09209 DDKAPI
09210 ZwWriteFile(
09211   /*IN*/ HANDLE  FileHandle,
09212   /*IN*/ HANDLE  Event  /*OPTIONAL*/,
09213   /*IN*/ PIO_APC_ROUTINE  ApcRoutine  /*OPTIONAL*/,
09214   /*IN*/ PVOID  ApcContext  /*OPTIONAL*/,
09215   /*OUT*/ PIO_STATUS_BLOCK  IoStatusBlock,
09216   /*IN*/ PVOID  Buffer,
09217   /*IN*/ ULONG  Length,
09218   /*IN*/ PLARGE_INTEGER  ByteOffset  /*OPTIONAL*/,
09219   /*IN*/ PULONG  Key  /*OPTIONAL*/);
09220 
09221 
09222 
09223 /** Power management support routines **/
09224 
09225 NTOSAPI
09226 NTSTATUS
09227 DDKAPI
09228 PoCallDriver(
09229   /*IN*/ PDEVICE_OBJECT  DeviceObject,
09230   /*IN OUT*/ PIRP  Irp);
09231 
09232 NTOSAPI
09233 PULONG
09234 DDKAPI
09235 PoRegisterDeviceForIdleDetection(
09236   /*IN*/ PDEVICE_OBJECT  DeviceObject,
09237   /*IN*/ ULONG  ConservationIdleTime,
09238   /*IN*/ ULONG  PerformanceIdleTime,
09239   /*IN*/ DEVICE_POWER_STATE  State);
09240 
09241 NTOSAPI
09242 PVOID
09243 DDKAPI
09244 PoRegisterSystemState(
09245   /*IN*/ PVOID  StateHandle,
09246   /*IN*/ EXECUTION_STATE  Flags);
09247 
09248 NTOSAPI
09249 NTSTATUS
09250 DDKAPI
09251 PoRequestPowerIrp(
09252   /*IN*/ PDEVICE_OBJECT  DeviceObject,
09253   /*IN*/ UCHAR  MinorFunction,  
09254   /*IN*/ POWER_STATE  PowerState,
09255   /*IN*/ PREQUEST_POWER_COMPLETE  CompletionFunction,
09256   /*IN*/ PVOID  Context,
09257   /*OUT*/ PIRP  *Irp /*OPTIONAL*/);
09258 
09259 NTOSAPI
09260 NTSTATUS
09261 DDKAPI
09262 PoRequestShutdownEvent(
09263   /*OUT*/ PVOID  *Event);
09264 
09265 NTOSAPI
09266 VOID
09267 DDKAPI
09268 PoSetDeviceBusy(
09269   PULONG  IdlePointer); 
09270 
09271 NTOSAPI
09272 POWER_STATE
09273 DDKAPI
09274 PoSetPowerState(
09275   /*IN*/ PDEVICE_OBJECT  DeviceObject,
09276   /*IN*/ POWER_STATE_TYPE  Type,
09277   /*IN*/ POWER_STATE  State);
09278 
09279 NTOSAPI
09280 VOID
09281 DDKAPI
09282 PoSetSystemState(
09283   /*IN*/ EXECUTION_STATE  Flags);
09284 
09285 NTOSAPI
09286 VOID
09287 DDKAPI
09288 PoStartNextPowerIrp(
09289   /*IN*/ PIRP  Irp);
09290 
09291 NTOSAPI
09292 VOID
09293 DDKAPI
09294 PoUnregisterSystemState(
09295   /*IN*/ PVOID  StateHandle);
09296 
09297 
09298 
09299 /** WMI library support routines **/
09300 
09301 NTOSAPI
09302 NTSTATUS
09303 DDKAPI
09304 WmiCompleteRequest(
09305   /*IN*/ PDEVICE_OBJECT  DeviceObject,
09306   /*IN*/ PIRP  Irp,
09307   /*IN*/ NTSTATUS  Status,
09308   /*IN*/ ULONG  BufferUsed,
09309   /*IN*/ CCHAR  PriorityBoost);
09310 
09311 NTOSAPI
09312 NTSTATUS
09313 DDKAPI
09314 WmiFireEvent(
09315   /*IN*/ PDEVICE_OBJECT  DeviceObject,
09316   /*IN*/ LPGUID  Guid, 
09317   /*IN*/ ULONG  InstanceIndex,
09318   /*IN*/ ULONG  EventDataSize,
09319   /*IN*/ PVOID  EventData); 
09320 
09321 NTOSAPI
09322 NTSTATUS
09323 DDKAPI
09324 WmiQueryTraceInformation(
09325   /*IN*/ TRACE_INFORMATION_CLASS  TraceInformationClass,
09326   /*OUT*/ PVOID  TraceInformation,
09327   /*IN*/ ULONG  TraceInformationLength,
09328   /*OUT*/ PULONG  RequiredLength /*OPTIONAL*/,
09329   /*IN*/ PVOID  Buffer /*OPTIONAL*/);
09330 
09331 NTOSAPI
09332 NTSTATUS
09333 DDKAPI
09334 WmiSystemControl(
09335   /*IN*/ PWMILIB_CONTEXT  WmiLibInfo,
09336   /*IN*/ PDEVICE_OBJECT  DeviceObject,
09337   /*IN*/ PIRP  Irp,
09338   /*OUT*/ PSYSCTL_IRP_DISPOSITION  IrpDisposition);
09339 
09340 NTOSAPI
09341 NTSTATUS
09342 DDKCDECLAPI
09343 WmiTraceMessage(
09344   /*IN*/ TRACEHANDLE  LoggerHandle,
09345   /*IN*/ ULONG  MessageFlags,
09346   /*IN*/ LPGUID  MessageGuid,
09347   /*IN*/ USHORT  MessageNumber,
09348   /*IN*/ ...);
09349 
09350 #if 0
09351 /* FIXME: Get va_list from where? */
09352 NTOSAPI
09353 NTSTATUS
09354 DDKCDECLAPI
09355 WmiTraceMessageVa(
09356   /*IN*/ TRACEHANDLE  LoggerHandle,
09357   /*IN*/ ULONG  MessageFlags,
09358   /*IN*/ LPGUID  MessageGuid,
09359   /*IN*/ USHORT  MessageNumber,
09360   /*IN*/ va_list  MessageArgList);
09361 #endif
09362 
09363 
09364 /** Kernel debugger routines **/
09365 
09366 NTOSAPI
09367 VOID
09368 DDKAPI
09369 KdDisableDebugger(
09370   VOID);
09371 
09372 NTOSAPI
09373 VOID
09374 DDKAPI
09375 KdEnableDebugger(
09376   VOID);
09377 
09378 NTOSAPI
09379 VOID
09380 DDKAPI
09381 DbgBreakPoint(
09382   VOID);
09383 
09384 NTOSAPI
09385 VOID
09386 DDKAPI
09387 DbgBreakPointWithStatus(
09388   /*IN*/ ULONG  Status);
09389 
09390 NTOSAPI
09391 ULONG
09392 DDKCDECLAPI
09393 DbgPrint(
09394   /*IN*/ PCH  Format,
09395   /*IN*/ ...);
09396 
09397 NTOSAPI
09398 ULONG
09399 DDKCDECLAPI
09400 DbgPrintEx(
09401   /*IN*/ ULONG  ComponentId,
09402   /*IN*/ ULONG  Level,
09403   /*IN*/ PCH  Format,
09404   /*IN*/ ...);
09405 
09406 NTOSAPI
09407 ULONG
09408 DDKCDECLAPI
09409 DbgPrintReturnControlC(
09410   /*IN*/ PCH  Format,
09411   /*IN*/ ...);
09412 
09413 NTOSAPI
09414 NTSTATUS
09415 DDKAPI
09416 DbgQueryDebugFilterState(
09417   /*IN*/ ULONG  ComponentId,
09418   /*IN*/ ULONG  Level);
09419 
09420 NTOSAPI
09421 NTSTATUS
09422 DDKAPI
09423 DbgSetDebugFilterState(
09424   /*IN*/ ULONG  ComponentId,
09425   /*IN*/ ULONG  Level,
09426   /*IN*/ BOOLEAN  State);
09427 
09428 #ifdef DBG
09429 
09430 #define KdPrint(_x_) DbgPrint _x_
09431 #define KdPrintEx(_x_) DbgPrintEx _x_
09432 #define KdBreakPoint() DbgBreakPoint()
09433 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
09434 
09435 #else /* !DBG */
09436 
09437 #define KdPrint(_x_)
09438 #define KdPrintEx(_x_)
09439 #define KdBreakPoint()
09440 #define KdBreakPointWithStatus(s)
09441 
09442 #endif /* !DBG */
09443 
09444 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent;
09445 extern NTOSAPI PBOOLEAN KdDebuggerEnabled;
09446 #define KD_DEBUGGER_ENABLED     *KdDebuggerEnabled
09447 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
09448 
09449 #ifdef __cplusplus
09450 }
09451 #endif
09452 
09453 #endif /* __WINDDK_H */