OSDN Git Service

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