4 * Windows Device Driver Kit
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
27 #pragma GCC system_header
37 ** Definitions specific to this Device Driver Kit
39 #define DDKAPI __stdcall
40 #define DDKFASTAPI __fastcall
41 #define FASTCALL __fastcall
42 #define DDKCDECLAPI __cdecl
44 /* FIXME: REMOVE THIS UNCOMPATIBLE CRUFT!!! */
50 #define NTKERNELAPI DECLSPEC_IMPORT
55 #define NTOSAPI NTKERNELAPI
57 #if defined(_NTOSKRNL_)
58 #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
59 #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
61 #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
62 #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
66 #define NTHALAPI DECLSPEC_IMPORT
71 /* Pseudo modifiers for parameters */
78 #define VOLATILE volatile
80 #define RESTRICTED_POINTER
81 #define POINTER_ALIGNMENT
82 #define DECLSPEC_ADDRSAFE
84 #ifdef NONAMELESSUNION
85 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
86 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
88 # define _DDK_DUMMYUNION_MEMBER(name) name
89 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
92 #if !defined(_NTSYSTEM_)
93 #define NTSYSAPI DECLSPEC_IMPORT
94 #define NTSYSCALLAPI DECLSPEC_IMPORT
97 #if defined(_NTDLLBUILD_)
100 #define NTSYSCALLAPI DECLSPEC_ADDRSAFE
107 #define ALIGN_DOWN(s, t) \
108 ((ULONG)(s) & ~(sizeof(t) - 1))
110 #define ALIGN_UP(s, t) \
111 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
113 #define ALIGN_DOWN_POINTER(p, t) \
114 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
116 #define ALIGN_UP_POINTER(p, t) \
117 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
120 ** Forward declarations
132 struct _DEVICE_OBJECT
;
133 struct _DRIVER_OBJECT
;
134 struct _IO_STATUS_BLOCK
;
135 struct _DEVICE_DESCRIPTION
;
136 struct _SCATTER_GATHER_LIST
;
137 struct _DRIVE_LAYOUT_INFORMATION
;
138 struct _DRIVE_LAYOUT_INFORMATION_EX
;
140 typedef PVOID PSECURITY_DESCRIPTOR
;
141 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
144 DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT
)
145 DECLARE_INTERNAL_OBJECT(DMA_ADAPTER
)
146 DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK
)
149 /* FIXME: Unknown definitions */
150 struct _SET_PARTITION_INFORMATION_EX
;
151 typedef ULONG WAIT_TYPE
;
154 typedef HANDLE TRACEHANDLE
;
155 typedef PVOID PWMILIB_CONTEXT
;
156 typedef PVOID PSYSCTL_IRP_DISPOSITION
;
157 typedef ULONG LOGICAL
;
161 ** Routines specific to this DDK
163 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
169 typedef LONG KPRIORITY
;
170 typedef UCHAR KIRQL
, *PKIRQL
;
171 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
172 typedef UCHAR KPROCESSOR_MODE
;
184 LONGLONG UseThisFieldToCopy
;
185 float DoNotUseThisField
;
189 /* Structures not exposed to drivers */
190 typedef struct _IO_TIMER
*PIO_TIMER
;
191 typedef struct _KPROCESS
*PKPROCESS
;
192 typedef struct _EPROCESS
*PEPROCESS
;
193 typedef struct _ETHREAD
*PETHREAD
;
194 typedef struct _KINTERRUPT
*PKINTERRUPT
;
195 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
196 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
197 typedef struct _COMPRESSED_DATA_INFO
*PCOMPRESSED_DATA_INFO
;
198 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
199 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
200 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
201 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
202 typedef struct _PEB
*PPEB
;
203 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
206 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
207 #define ZwCurrentProcess() NtCurrentProcess()
208 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
209 #define ZwCurrentThread() NtCurrentThread()
211 #define KIP0PCRADDRESS 0xff000000
213 #define KIP0PCRADDRESS 0xffdff000
216 #define KERNEL_STACK_SIZE 12288
217 #define KERNEL_LARGE_STACK_SIZE 61440
220 #define DPFLTR_ERROR_LEVEL 0
221 #define DPFLTR_WARNING_LEVEL 1
222 #define DPFLTR_TRACE_LEVEL 2
223 #define DPFLTR_INFO_LEVEL 3
224 #define DPFLTR_MASK 0x80000000
226 #define MAXIMUM_PROCESSORS 32
228 #define MAXIMUM_WAIT_OBJECTS 64
230 #define EX_RUNDOWN_ACTIVE 0x1
231 #define EX_RUNDOWN_COUNT_SHIFT 0x1
232 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
234 #define METHOD_BUFFERED 0
235 #define METHOD_IN_DIRECT 1
236 #define METHOD_OUT_DIRECT 2
237 #define METHOD_NEITHER 3
239 #define LOW_PRIORITY 0
240 #define LOW_REALTIME_PRIORITY 16
241 #define HIGH_PRIORITY 31
242 #define MAXIMUM_PRIORITY 32
244 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
246 #define FILE_SUPERSEDED 0x00000000
247 #define FILE_OPENED 0x00000001
248 #define FILE_CREATED 0x00000002
249 #define FILE_OVERWRITTEN 0x00000003
250 #define FILE_EXISTS 0x00000004
251 #define FILE_DOES_NOT_EXIST 0x00000005
253 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
254 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
256 /* also in winnt.h */
257 #define FILE_LIST_DIRECTORY 0x00000001
258 #define FILE_READ_DATA 0x00000001
259 #define FILE_ADD_FILE 0x00000002
260 #define FILE_WRITE_DATA 0x00000002
261 #define FILE_ADD_SUBDIRECTORY 0x00000004
262 #define FILE_APPEND_DATA 0x00000004
263 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
264 #define FILE_READ_EA 0x00000008
265 #define FILE_WRITE_EA 0x00000010
266 #define FILE_EXECUTE 0x00000020
267 #define FILE_TRAVERSE 0x00000020
268 #define FILE_DELETE_CHILD 0x00000040
269 #define FILE_READ_ATTRIBUTES 0x00000080
270 #define FILE_WRITE_ATTRIBUTES 0x00000100
272 #define FILE_SHARE_READ 0x00000001
273 #define FILE_SHARE_WRITE 0x00000002
274 #define FILE_SHARE_DELETE 0x00000004
275 #define FILE_SHARE_VALID_FLAGS 0x00000007
277 #define FILE_ATTRIBUTE_READONLY 0x00000001
278 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
279 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
280 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
281 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
282 #define FILE_ATTRIBUTE_DEVICE 0x00000040
283 #define FILE_ATTRIBUTE_NORMAL 0x00000080
284 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
285 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
286 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
287 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
288 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
289 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
290 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
292 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
293 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
295 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
296 #define FILE_STRUCTURED_STORAGE 0x00000441
298 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
299 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
300 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
301 #define FILE_VALID_SET_FLAGS 0x00000036
303 #define FILE_SUPERSEDE 0x00000000
304 #define FILE_OPEN 0x00000001
305 #define FILE_CREATE 0x00000002
306 #define FILE_OPEN_IF 0x00000003
307 #define FILE_OVERWRITE 0x00000004
308 #define FILE_OVERWRITE_IF 0x00000005
309 #define FILE_MAXIMUM_DISPOSITION 0x00000005
311 #define FILE_DIRECTORY_FILE 0x00000001
312 #define FILE_WRITE_THROUGH 0x00000002
313 #define FILE_SEQUENTIAL_ONLY 0x00000004
314 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
315 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
316 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
317 #define FILE_NON_DIRECTORY_FILE 0x00000040
318 #define FILE_CREATE_TREE_CONNECTION 0x00000080
319 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
320 #define FILE_NO_EA_KNOWLEDGE 0x00000200
321 #define FILE_OPEN_FOR_RECOVERY 0x00000400
322 #define FILE_RANDOM_ACCESS 0x00000800
323 #define FILE_DELETE_ON_CLOSE 0x00001000
324 #define FILE_OPEN_BY_FILE_ID 0x00002000
325 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
326 #define FILE_NO_COMPRESSION 0x00008000
327 #define FILE_RESERVE_OPFILTER 0x00100000
328 #define FILE_OPEN_REPARSE_POINT 0x00200000
329 #define FILE_OPEN_NO_RECALL 0x00400000
330 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
332 #define FILE_ANY_ACCESS 0x00000000
333 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
334 #define FILE_READ_ACCESS 0x00000001
335 #define FILE_WRITE_ACCESS 0x00000002
337 #define FILE_ALL_ACCESS \
338 (STANDARD_RIGHTS_REQUIRED | \
342 #define FILE_GENERIC_EXECUTE \
343 (STANDARD_RIGHTS_EXECUTE | \
344 FILE_READ_ATTRIBUTES | \
348 #define FILE_GENERIC_READ \
349 (STANDARD_RIGHTS_READ | \
351 FILE_READ_ATTRIBUTES | \
355 #define FILE_GENERIC_WRITE \
356 (STANDARD_RIGHTS_WRITE | \
358 FILE_WRITE_ATTRIBUTES | \
364 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
366 #define OBJECT_TYPE_CREATE (0x0001)
367 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
369 #define DIRECTORY_QUERY (0x0001)
370 #define DIRECTORY_TRAVERSE (0x0002)
371 #define DIRECTORY_CREATE_OBJECT (0x0004)
372 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
373 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
375 #define EVENT_QUERY_STATE (0x0001)
376 #define EVENT_MODIFY_STATE (0x0002)
377 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
379 #define SEMAPHORE_QUERY_STATE (0x0001)
380 #define SEMAPHORE_MODIFY_STATE (0x0002)
381 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
383 #define THREAD_ALERT (0x0004)
385 #define FM_LOCK_BIT (0x1)
386 #define FM_LOCK_BIT_V (0x0)
387 #define FM_LOCK_WAITER_WOKEN (0x2)
388 #define FM_LOCK_WAITER_INC (0x4)
390 /* Exported object types */
391 extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType
;
392 extern POBJECT_TYPE NTSYSAPI ExEventObjectType
;
393 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType
;
394 extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType
;
395 extern ULONG NTSYSAPI IoDeviceHandlerObjectSize
;
396 extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType
;
397 extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType
;
398 extern POBJECT_TYPE NTSYSAPI IoDriverObjectType
;
399 extern POBJECT_TYPE NTSYSAPI IoFileObjectType
;
400 extern POBJECT_TYPE NTSYSAPI PsThreadType
;
401 extern POBJECT_TYPE NTSYSAPI LpcPortObjectType
;
402 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType
;
404 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
405 extern volatile CCHAR NTSYSAPI KeNumberProcessors
;
407 #if (NTDDI_VERSION >= NTDDI_WINXP)
408 extern CCHAR NTSYSAPI KeNumberProcessors
;
410 //extern PCCHAR KeNumberProcessors;
411 extern NTSYSAPI CCHAR KeNumberProcessors
; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first.
415 #define PROCESSOR_FEATURE_MAX 64
416 #define MAX_WOW64_SHARED_ENTRIES 16
418 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
423 } ALTERNATIVE_ARCHITECTURE_TYPE
;
425 typedef struct _KSYSTEM_TIME
430 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
432 extern volatile KSYSTEM_TIME KeTickCount
;
434 typedef struct _KUSER_SHARED_DATA
436 ULONG TickCountLowDeprecated
;
437 ULONG TickCountMultiplier
;
438 volatile KSYSTEM_TIME InterruptTime
;
439 volatile KSYSTEM_TIME SystemTime
;
440 volatile KSYSTEM_TIME TimeZoneBias
;
441 USHORT ImageNumberLow
;
442 USHORT ImageNumberHigh
;
443 WCHAR NtSystemRoot
[260];
444 ULONG MaxStackTraceDepth
;
445 ULONG CryptoExponent
;
447 ULONG LargePageMinimum
;
449 NT_PRODUCT_TYPE NtProductType
;
450 BOOLEAN ProductTypeIsValid
;
451 ULONG NtMajorVersion
;
452 ULONG NtMinorVersion
;
453 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
456 volatile ULONG TimeSlip
;
457 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
458 LARGE_INTEGER SystemExpirationDate
;
460 BOOLEAN KdDebuggerEnabled
;
461 volatile ULONG ActiveConsoleId
;
462 volatile ULONG DismountCount
;
463 ULONG ComPlusPackage
;
464 ULONG LastSystemRITEventTickCount
;
465 ULONG NumberOfPhysicalPages
;
466 BOOLEAN SafeBootMode
;
469 ULONGLONG TestRetInstruction
;
471 ULONG SystemCallReturn
;
472 ULONGLONG SystemCallPad
[3];
474 volatile KSYSTEM_TIME TickCount
;
475 volatile ULONG64 TickCountQuad
;
478 LONGLONG ConsoleSessionForegroundProcessId
;
479 ULONG Wow64SharedInformation
[MAX_WOW64_SHARED_ENTRIES
];
480 ULONG UserModeGlobalLogging
;
481 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
484 ** IRP function codes
487 #define IRP_MJ_CREATE 0x00
488 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
489 #define IRP_MJ_CLOSE 0x02
490 #define IRP_MJ_READ 0x03
491 #define IRP_MJ_WRITE 0x04
492 #define IRP_MJ_QUERY_INFORMATION 0x05
493 #define IRP_MJ_SET_INFORMATION 0x06
494 #define IRP_MJ_QUERY_EA 0x07
495 #define IRP_MJ_SET_EA 0x08
496 #define IRP_MJ_FLUSH_BUFFERS 0x09
497 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
498 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
499 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
500 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
501 #define IRP_MJ_DEVICE_CONTROL 0x0e
502 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
503 #define IRP_MJ_SCSI 0x0f
504 #define IRP_MJ_SHUTDOWN 0x10
505 #define IRP_MJ_LOCK_CONTROL 0x11
506 #define IRP_MJ_CLEANUP 0x12
507 #define IRP_MJ_CREATE_MAILSLOT 0x13
508 #define IRP_MJ_QUERY_SECURITY 0x14
509 #define IRP_MJ_SET_SECURITY 0x15
510 #define IRP_MJ_POWER 0x16
511 #define IRP_MJ_SYSTEM_CONTROL 0x17
512 #define IRP_MJ_DEVICE_CHANGE 0x18
513 #define IRP_MJ_QUERY_QUOTA 0x19
514 #define IRP_MJ_SET_QUOTA 0x1a
515 #define IRP_MJ_PNP 0x1b
516 #define IRP_MJ_PNP_POWER 0x1b
517 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
519 #define IRP_MN_QUERY_DIRECTORY 0x01
520 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
522 #define IRP_MN_USER_FS_REQUEST 0x00
523 #define IRP_MN_MOUNT_VOLUME 0x01
524 #define IRP_MN_VERIFY_VOLUME 0x02
525 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
526 #define IRP_MN_TRACK_LINK 0x04
527 #define IRP_MN_KERNEL_CALL 0x04
529 #define IRP_MN_LOCK 0x01
530 #define IRP_MN_UNLOCK_SINGLE 0x02
531 #define IRP_MN_UNLOCK_ALL 0x03
532 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
534 #define IRP_MN_NORMAL 0x00
535 #define IRP_MN_DPC 0x01
536 #define IRP_MN_MDL 0x02
537 #define IRP_MN_COMPLETE 0x04
538 #define IRP_MN_COMPRESSED 0x08
540 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
541 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
542 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
544 #define IRP_MN_SCSI_CLASS 0x01
546 #define IRP_MN_START_DEVICE 0x00
547 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
548 #define IRP_MN_REMOVE_DEVICE 0x02
549 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
550 #define IRP_MN_STOP_DEVICE 0x04
551 #define IRP_MN_QUERY_STOP_DEVICE 0x05
552 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
554 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
555 #define IRP_MN_QUERY_INTERFACE 0x08
556 #define IRP_MN_QUERY_CAPABILITIES 0x09
557 #define IRP_MN_QUERY_RESOURCES 0x0A
558 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
559 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
560 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
562 #define IRP_MN_READ_CONFIG 0x0F
563 #define IRP_MN_WRITE_CONFIG 0x10
564 #define IRP_MN_EJECT 0x11
565 #define IRP_MN_SET_LOCK 0x12
566 #define IRP_MN_QUERY_ID 0x13
567 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
568 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
569 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
570 #define IRP_MN_SURPRISE_REMOVAL 0x17
571 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
573 #define IRP_MN_WAIT_WAKE 0x00
574 #define IRP_MN_POWER_SEQUENCE 0x01
575 #define IRP_MN_SET_POWER 0x02
576 #define IRP_MN_QUERY_POWER 0x03
578 #define IRP_MN_QUERY_ALL_DATA 0x00
579 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
580 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
581 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
582 #define IRP_MN_ENABLE_EVENTS 0x04
583 #define IRP_MN_DISABLE_EVENTS 0x05
584 #define IRP_MN_ENABLE_COLLECTION 0x06
585 #define IRP_MN_DISABLE_COLLECTION 0x07
586 #define IRP_MN_REGINFO 0x08
587 #define IRP_MN_EXECUTE_METHOD 0x09
589 #define IRP_MN_REGINFO_EX 0x0b
591 typedef enum _IO_ALLOCATION_ACTION
{
594 DeallocateObjectKeepRegisters
595 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
597 typedef IO_ALLOCATION_ACTION
598 (DDKAPI
*PDRIVER_CONTROL
)(
599 IN
struct _DEVICE_OBJECT
*DeviceObject
,
601 IN PVOID MapRegisterBase
,
604 typedef EXCEPTION_DISPOSITION
605 (DDKAPI
*PEXCEPTION_ROUTINE
)(
606 IN
struct _EXCEPTION_RECORD
*ExceptionRecord
,
607 IN PVOID EstablisherFrame
,
608 IN OUT
struct _CONTEXT
*ContextRecord
,
609 IN OUT PVOID DispatcherContext
);
612 (DDKAPI
*PDRIVER_LIST_CONTROL
)(
613 IN
struct _DEVICE_OBJECT
*DeviceObject
,
615 IN
struct _SCATTER_GATHER_LIST
*ScatterGather
,
619 (DDKAPI
*PDRIVER_ADD_DEVICE
)(
620 IN
struct _DRIVER_OBJECT
*DriverObject
,
621 IN
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
624 (DDKAPI
*PIO_COMPLETION_ROUTINE
)(
625 IN
struct _DEVICE_OBJECT
*DeviceObject
,
630 (DDKAPI
*PDRIVER_CANCEL
)(
631 IN
struct _DEVICE_OBJECT
*DeviceObject
,
632 IN
struct _IRP
*Irp
);
635 (DDKAPI
*PKDEFERRED_ROUTINE
)(
636 IN
struct _KDPC
*Dpc
,
637 IN PVOID DeferredContext
,
638 IN PVOID SystemArgument1
,
639 IN PVOID SystemArgument2
);
642 (DDKAPI
*PDRIVER_DISPATCH
)(
643 IN
struct _DEVICE_OBJECT
*DeviceObject
,
644 IN
struct _IRP
*Irp
);
647 (DDKAPI
*PIO_DPC_ROUTINE
)(
648 IN
struct _KDPC
*Dpc
,
649 IN
struct _DEVICE_OBJECT
*DeviceObject
,
654 (DDKAPI
*PMM_DLL_INITIALIZE
)(
655 IN PUNICODE_STRING RegistryPath
);
658 (DDKAPI
*PMM_DLL_UNLOAD
)(
662 (DDKAPI
*PDRIVER_ENTRY
)(
663 IN
struct _DRIVER_OBJECT
*DriverObject
,
664 IN PUNICODE_STRING RegistryPath
);
667 (DDKAPI
*PDRIVER_INITIALIZE
)(
668 IN
struct _DRIVER_OBJECT
*DriverObject
,
669 IN PUNICODE_STRING RegistryPath
);
672 (DDKAPI
*PKSERVICE_ROUTINE
)(
673 IN
struct _KINTERRUPT
*Interrupt
,
674 IN PVOID ServiceContext
);
677 (DDKAPI
*PIO_TIMER_ROUTINE
)(
678 IN
struct _DEVICE_OBJECT
*DeviceObject
,
682 (DDKAPI
*PDRIVER_REINITIALIZE
)(
683 IN
struct _DRIVER_OBJECT
*DriverObject
,
688 (DDKAPI
*PDRIVER_STARTIO
)(
689 IN
struct _DEVICE_OBJECT
*DeviceObject
,
690 IN
struct _IRP
*Irp
);
693 (DDKAPI
*PKSYNCHRONIZE_ROUTINE
)(
694 IN PVOID SynchronizeContext
);
697 (DDKAPI
*PDRIVER_UNLOAD
)(
698 IN
struct _DRIVER_OBJECT
*DriverObject
);
703 ** Plug and Play structures
707 (DDKAPI
*PINTERFACE_REFERENCE
)(
711 (DDKAPI
*PINTERFACE_DEREFERENCE
)(
715 (DDKAPI
*PTRANSLATE_BUS_ADDRESS
)(
717 IN PHYSICAL_ADDRESS BusAddress
,
719 IN OUT PULONG AddressSpace
,
720 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
722 typedef struct _DMA_ADAPTER
*
723 (DDKAPI
*PGET_DMA_ADAPTER
)(
725 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
726 OUT PULONG NumberOfMapRegisters
);
729 (DDKAPI
*PGET_SET_DEVICE_DATA
)(
736 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
737 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
738 #define PCI_USE_REVISION 0x00000002
739 #define PCI_USE_VENDEV_IDS 0x00000004
740 #define PCI_USE_CLASS_SUBCLASS 0x00000008
741 #define PCI_USE_PROGIF 0x00000010
742 #define PCI_USE_LOCAL_BUS 0x00000020
743 #define PCI_USE_LOCAL_DEVICE 0x00000040
745 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS
{
756 } PCI_DEVICE_PRESENCE_PARAMETERS
, *PPCI_DEVICE_PRESENCE_PARAMETERS
;
759 (DDKAPI
*PPCI_IS_DEVICE_PRESENT
)(
763 IN USHORT SubVendorID
,
764 IN USHORT SubSystemID
,
768 (DDKAPI
*PPCI_IS_DEVICE_PRESENT_EX
)(
770 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
);
772 typedef union _POWER_STATE
{
773 SYSTEM_POWER_STATE SystemState
;
774 DEVICE_POWER_STATE DeviceState
;
775 } POWER_STATE
, *PPOWER_STATE
;
777 typedef enum _POWER_STATE_TYPE
{
780 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
782 typedef struct _BUS_INTERFACE_STANDARD
{
786 PINTERFACE_REFERENCE InterfaceReference
;
787 PINTERFACE_DEREFERENCE InterfaceDereference
;
788 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
789 PGET_DMA_ADAPTER GetDmaAdapter
;
790 PGET_SET_DEVICE_DATA SetBusData
;
791 PGET_SET_DEVICE_DATA GetBusData
;
792 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
794 typedef struct _PCI_DEVICE_PRESENT_INTERFACE
{
798 PINTERFACE_REFERENCE InterfaceReference
;
799 PINTERFACE_DEREFERENCE InterfaceDereference
;
800 PPCI_IS_DEVICE_PRESENT IsDevicePresent
;
801 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx
;
802 } PCI_DEVICE_PRESENT_INTERFACE
, *PPCI_DEVICE_PRESENT_INTERFACE
;
804 typedef struct _DEVICE_CAPABILITIES
{
809 ULONG LockSupported
: 1;
810 ULONG EjectSupported
: 1;
812 ULONG DockDevice
: 1;
814 ULONG SilentInstall
: 1;
815 ULONG RawDeviceOK
: 1;
816 ULONG SurpriseRemovalOK
: 1;
817 ULONG WakeFromD0
: 1;
818 ULONG WakeFromD1
: 1;
819 ULONG WakeFromD2
: 1;
820 ULONG WakeFromD3
: 1;
821 ULONG HardwareDisabled
: 1;
822 ULONG NonDynamic
: 1;
823 ULONG WarmEjectSupported
: 1;
824 ULONG NoDisplayInUI
: 1;
828 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
829 SYSTEM_POWER_STATE SystemWake
;
830 DEVICE_POWER_STATE DeviceWake
;
834 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
836 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
840 GUID InterfaceClassGuid
;
841 PUNICODE_STRING SymbolicLinkName
;
842 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
844 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
848 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
852 typedef struct _INTERFACE
{
856 PINTERFACE_REFERENCE InterfaceReference
;
857 PINTERFACE_DEREFERENCE InterfaceDereference
;
858 } INTERFACE
, *PINTERFACE
;
860 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
864 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
866 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
868 /* PNP_DEVICE_STATE */
870 #define PNP_DEVICE_DISABLED 0x00000001
871 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
872 #define PNP_DEVICE_FAILED 0x00000004
873 #define PNP_DEVICE_REMOVED 0x00000008
874 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
875 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
877 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
881 struct _FILE_OBJECT
*FileObject
;
882 LONG NameBufferOffset
;
883 UCHAR CustomDataBuffer
[1];
884 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
886 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
890 struct _FILE_OBJECT
*FileObject
;
891 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
893 typedef enum _BUS_QUERY_ID_TYPE
{
896 BusQueryCompatibleIDs
,
898 BusQueryDeviceSerialNumber
899 } BUS_QUERY_ID_TYPE
, *PBUS_QUERY_ID_TYPE
;
901 typedef enum _DEVICE_TEXT_TYPE
{
902 DeviceTextDescription
,
903 DeviceTextLocationInformation
904 } DEVICE_TEXT_TYPE
, *PDEVICE_TEXT_TYPE
;
906 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
907 DeviceUsageTypeUndefined
,
908 DeviceUsageTypePaging
,
909 DeviceUsageTypeHibernation
,
910 DeviceUsageTypeDumpFile
911 } DEVICE_USAGE_NOTIFICATION_TYPE
;
913 typedef struct _POWER_SEQUENCE
{
917 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
920 DevicePropertyDeviceDescription
,
921 DevicePropertyHardwareID
,
922 DevicePropertyCompatibleIDs
,
923 DevicePropertyBootConfiguration
,
924 DevicePropertyBootConfigurationTranslated
,
925 DevicePropertyClassName
,
926 DevicePropertyClassGuid
,
927 DevicePropertyDriverKeyName
,
928 DevicePropertyManufacturer
,
929 DevicePropertyFriendlyName
,
930 DevicePropertyLocationInformation
,
931 DevicePropertyPhysicalDeviceObjectName
,
932 DevicePropertyBusTypeGuid
,
933 DevicePropertyLegacyBusType
,
934 DevicePropertyBusNumber
,
935 DevicePropertyEnumeratorName
,
936 DevicePropertyAddress
,
937 DevicePropertyUINumber
,
938 DevicePropertyInstallState
,
939 DevicePropertyRemovalPolicy
940 } DEVICE_REGISTRY_PROPERTY
;
942 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
943 EventCategoryReserved
,
944 EventCategoryHardwareProfileChange
,
945 EventCategoryDeviceInterfaceChange
,
946 EventCategoryTargetDeviceChange
947 } IO_NOTIFICATION_EVENT_CATEGORY
;
949 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
952 (DDKAPI
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
953 IN PVOID NotificationStructure
,
957 (DDKAPI
*PDEVICE_CHANGE_COMPLETE_CALLBACK
)(
965 #define SYMBOLIC_LINK_QUERY 0x0001
966 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
968 /* also in winnt,h */
969 #define DUPLICATE_CLOSE_SOURCE 0x00000001
970 #define DUPLICATE_SAME_ACCESS 0x00000002
971 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
974 typedef struct _OBJECT_NAME_INFORMATION
{
976 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
979 (DDKAPI
*PIO_APC_ROUTINE
)(
981 IN PIO_STATUS_BLOCK IoStatusBlock
,
984 typedef struct _IO_STATUS_BLOCK
{
985 _ANONYMOUS_UNION
union {
989 ULONG_PTR Information
;
993 (DDKAPI
*PKNORMAL_ROUTINE
)(
994 IN PVOID NormalContext
,
995 IN PVOID SystemArgument1
,
996 IN PVOID SystemArgument2
);
999 (DDKAPI
*PKKERNEL_ROUTINE
)(
1000 IN
struct _KAPC
*Apc
,
1001 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
1002 IN OUT PVOID
*NormalContext
,
1003 IN OUT PVOID
*SystemArgument1
,
1004 IN OUT PVOID
*SystemArgument2
);
1007 (DDKAPI
*PKRUNDOWN_ROUTINE
)(
1008 IN
struct _KAPC
*Apc
);
1011 (DDKAPI
*PKTRANSFER_ROUTINE
)(
1014 typedef struct _KAPC
1021 struct _KTHREAD
*Thread
;
1022 LIST_ENTRY ApcListEntry
;
1023 PKKERNEL_ROUTINE KernelRoutine
;
1024 PKRUNDOWN_ROUTINE RundownRoutine
;
1025 PKNORMAL_ROUTINE NormalRoutine
;
1026 PVOID NormalContext
;
1027 PVOID SystemArgument1
;
1028 PVOID SystemArgument2
;
1029 CCHAR ApcStateIndex
;
1030 KPROCESSOR_MODE ApcMode
;
1032 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
1034 typedef struct _KDEVICE_QUEUE
{
1037 LIST_ENTRY DeviceListHead
;
1040 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
1042 typedef struct _KDEVICE_QUEUE_ENTRY
{
1043 LIST_ENTRY DeviceListEntry
;
1046 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
1047 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
1049 #define LOCK_QUEUE_WAIT 1
1050 #define LOCK_QUEUE_OWNER 2
1051 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
1052 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
1054 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
1056 LockQueueDispatcherLock
,
1057 LockQueueExpansionLock
,
1059 LockQueueSystemSpaceLock
,
1061 LockQueueMasterLock
,
1062 LockQueueNonPagedPoolLock
,
1063 LockQueueIoCancelLock
,
1064 LockQueueWorkQueueLock
,
1066 LockQueueIoDatabaseLock
,
1067 LockQueueIoCompletionLock
,
1068 LockQueueNtfsStructLock
,
1069 LockQueueAfdWorkQueueLock
,
1071 LockQueueMmNonPagedPoolLock
,
1072 LockQueueUnusedSpare16
,
1073 LockQueueTimerTableLock
,
1074 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
1075 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
1077 typedef struct _KSPIN_LOCK_QUEUE
{
1078 struct _KSPIN_LOCK_QUEUE
*VOLATILE Next
;
1079 PKSPIN_LOCK VOLATILE Lock
;
1080 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
1082 typedef struct _KLOCK_QUEUE_HANDLE
{
1083 KSPIN_LOCK_QUEUE LockQueue
;
1085 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
1087 #define DPC_NORMAL 0
1088 #define DPC_THREADED 1
1090 #define ASSERT_APC(Object) \
1091 ASSERT((Object)->Type == ApcObject)
1093 #define ASSERT_DPC(Object) \
1094 ASSERT(((Object)->Type == 0) || \
1095 ((Object)->Type == DpcObject) || \
1096 ((Object)->Type == ThreadedDpcObject))
1098 #define ASSERT_DEVICE_QUEUE(Object) \
1099 ASSERT((Object)->Type == DeviceQueueObject)
1101 typedef struct _KDPC
1106 LIST_ENTRY DpcListEntry
;
1107 PKDEFERRED_ROUTINE DeferredRoutine
;
1108 PVOID DeferredContext
;
1109 PVOID SystemArgument1
;
1110 PVOID SystemArgument2
;
1111 volatile PVOID DpcData
;
1112 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
1114 typedef PVOID PKIPI_CONTEXT
;
1119 IN PKIPI_CONTEXT PacketContext
,
1120 IN PVOID Parameter1
,
1121 IN PVOID Parameter2
,
1125 typedef struct _WAIT_CONTEXT_BLOCK
{
1126 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
1127 PDRIVER_CONTROL DeviceRoutine
;
1128 PVOID DeviceContext
;
1129 ULONG NumberOfMapRegisters
;
1132 PKDPC BufferChainingDpc
;
1133 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
1135 typedef struct _DISPATCHER_HEADER
1155 BOOLEAN DebugActive
;
1161 LIST_ENTRY WaitListHead
;
1162 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1164 typedef struct _KEVENT
{
1165 DISPATCHER_HEADER Header
;
1166 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1168 typedef struct _KSEMAPHORE
{
1169 DISPATCHER_HEADER Header
;
1171 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1173 typedef struct _FAST_MUTEX
1180 } FAST_MUTEX
, *PFAST_MUTEX
;
1182 typedef struct _EX_RUNDOWN_REF
1189 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
1191 #define ASSERT_GATE(object) \
1192 ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
1193 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
1195 typedef struct _KGATE
1197 DISPATCHER_HEADER Header
;
1198 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
1200 #define GM_LOCK_BIT 0x1
1201 #define GM_LOCK_BIT_V 0x0
1202 #define GM_LOCK_WAITER_WOKEN 0x2
1203 #define GM_LOCK_WAITER_INC 0x4
1205 typedef struct _KGUARDED_MUTEX
1207 volatile LONG Count
;
1215 SHORT KernelApcDisable
;
1216 SHORT SpecialApcDisable
;
1218 ULONG CombinedApcDisable
;
1220 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
1222 #define TIMER_TABLE_SIZE 512
1223 #define TIMER_TABLE_SHIFT 9
1225 typedef struct _KTIMER
{
1226 DISPATCHER_HEADER Header
;
1227 ULARGE_INTEGER DueTime
;
1228 LIST_ENTRY TimerListEntry
;
1231 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
1233 #define ASSERT_TIMER(E) \
1234 ASSERT(((E)->Header.Type == TimerNotificationObject) || \
1235 ((E)->Header.Type == TimerSynchronizationObject))
1237 #define ASSERT_MUTANT(E) \
1238 ASSERT((E)->Header.Type == MutantObject)
1240 #define ASSERT_SEMAPHORE(E) \
1241 ASSERT((E)->Header.Type == SemaphoreObject)
1243 #define ASSERT_EVENT(E) \
1244 ASSERT(((E)->Header.Type == NotificationEvent) || \
1245 ((E)->Header.Type == SynchronizationEvent))
1247 typedef struct _KMUTANT
{
1248 DISPATCHER_HEADER Header
;
1249 LIST_ENTRY MutantListEntry
;
1250 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
1253 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
1255 typedef enum _TIMER_TYPE
{
1257 SynchronizationTimer
1260 #define EVENT_INCREMENT 1
1261 #define IO_NO_INCREMENT 0
1262 #define IO_CD_ROM_INCREMENT 1
1263 #define IO_DISK_INCREMENT 1
1264 #define IO_KEYBOARD_INCREMENT 6
1265 #define IO_MAILSLOT_INCREMENT 2
1266 #define IO_MOUSE_INCREMENT 6
1267 #define IO_NAMED_PIPE_INCREMENT 2
1268 #define IO_NETWORK_INCREMENT 2
1269 #define IO_PARALLEL_INCREMENT 1
1270 #define IO_SERIAL_INCREMENT 2
1271 #define IO_SOUND_INCREMENT 8
1272 #define IO_VIDEO_INCREMENT 1
1273 #define SEMAPHORE_INCREMENT 1
1275 typedef struct _IRP
{
1278 struct _MDL
*MdlAddress
;
1281 struct _IRP
*MasterIrp
;
1285 LIST_ENTRY ThreadListEntry
;
1286 IO_STATUS_BLOCK IoStatus
;
1287 KPROCESSOR_MODE RequestorMode
;
1288 BOOLEAN PendingReturned
;
1290 CHAR CurrentLocation
;
1293 CCHAR ApcEnvironment
;
1294 UCHAR AllocationFlags
;
1295 PIO_STATUS_BLOCK UserIosb
;
1299 PIO_APC_ROUTINE UserApcRoutine
;
1300 PVOID UserApcContext
;
1301 } AsynchronousParameters
;
1302 LARGE_INTEGER AllocationSize
;
1304 PDRIVER_CANCEL CancelRoutine
;
1308 _ANONYMOUS_UNION
union {
1309 KDEVICE_QUEUE_ENTRY DeviceQueueEntry
;
1310 _ANONYMOUS_STRUCT
struct {
1311 PVOID DriverContext
[4];
1315 PCHAR AuxiliaryBuffer
;
1316 _ANONYMOUS_STRUCT
struct {
1317 LIST_ENTRY ListEntry
;
1318 _ANONYMOUS_UNION
union {
1319 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
1323 struct _FILE_OBJECT
*OriginalFileObject
;
1326 PVOID CompletionKey
;
1329 typedef struct _IRP
*PIRP
;
1333 #define SL_FORCE_ACCESS_CHECK 0x01
1334 #define SL_OPEN_PAGING_FILE 0x02
1335 #define SL_OPEN_TARGET_DIRECTORY 0x04
1336 #define SL_CASE_SENSITIVE 0x80
1338 #define SL_KEY_SPECIFIED 0x01
1339 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
1340 #define SL_WRITE_THROUGH 0x04
1341 #define SL_FT_SEQUENTIAL_WRITE 0x08
1343 #define SL_FAIL_IMMEDIATELY 0x01
1344 #define SL_EXCLUSIVE_LOCK 0x02
1346 #define SL_RESTART_SCAN 0x01
1347 #define SL_RETURN_SINGLE_ENTRY 0x02
1348 #define SL_INDEX_SPECIFIED 0x04
1350 #define SL_WATCH_TREE 0x01
1352 #define SL_ALLOW_RAW_MOUNT 0x01
1354 #define CTL_CODE(DeviceType, Function, Method, Access)( \
1355 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
1357 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
1362 IRP_PAGING_IO
= 0x2,
1363 IRP_MOUNT_COMPLETION
= 0x2,
1364 IRP_SYNCHRONOUS_API
= 0x4,
1365 IRP_ASSOCIATED_IRP
= 0x8,
1366 IRP_BUFFERED_IO
= 0x10,
1367 IRP_DEALLOCATE_BUFFER
= 0x20,
1368 IRP_INPUT_OPERATION
= 0x40,
1369 IRP_SYNCHRONOUS_PAGING_IO
= 0x40,
1370 IRP_CREATE_OPERATION
= 0x80,
1371 IRP_READ_OPERATION
= 0x100,
1372 IRP_WRITE_OPERATION
= 0x200,
1373 IRP_CLOSE_OPERATION
= 0x400,
1374 IRP_DEFER_IO_COMPLETION
= 0x800,
1375 IRP_OB_QUERY_NAME
= 0x1000,
1376 IRP_HOLD_DEVICE_QUEUE
= 0x2000,
1377 IRP_RETRY_IO_COMPLETION
= 0x4000
1380 #define IRP_QUOTA_CHARGED 0x01
1381 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
1382 #define IRP_ALLOCATED_FIXED_SIZE 0x04
1383 #define IRP_LOOKASIDE_ALLOCATION 0x08
1385 typedef struct _BOOTDISK_INFORMATION
{
1386 LONGLONG BootPartitionOffset
;
1387 LONGLONG SystemPartitionOffset
;
1388 ULONG BootDeviceSignature
;
1389 ULONG SystemDeviceSignature
;
1390 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
1392 typedef struct _BOOTDISK_INFORMATION_EX
{
1393 LONGLONG BootPartitionOffset
;
1394 LONGLONG SystemPartitionOffset
;
1395 ULONG BootDeviceSignature
;
1396 ULONG SystemDeviceSignature
;
1397 GUID BootDeviceGuid
;
1398 GUID SystemDeviceGuid
;
1399 BOOLEAN BootDeviceIsGpt
;
1400 BOOLEAN SystemDeviceIsGpt
;
1401 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
1403 typedef struct _EISA_MEMORY_TYPE
{
1404 UCHAR ReadWrite
: 1;
1406 UCHAR Reserved0
: 1;
1409 UCHAR Reserved1
: 1;
1410 UCHAR MoreEntries
: 1;
1411 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
1413 #include <pshpack1.h>
1414 typedef struct _EISA_MEMORY_CONFIGURATION
{
1415 EISA_MEMORY_TYPE ConfigurationByte
;
1417 USHORT AddressLowWord
;
1418 UCHAR AddressHighByte
;
1420 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
1421 #include <poppack.h>
1423 typedef struct _EISA_IRQ_DESCRIPTOR
{
1424 UCHAR Interrupt
: 4;
1426 UCHAR LevelTriggered
: 1;
1428 UCHAR MoreEntries
: 1;
1429 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
1431 typedef struct _EISA_IRQ_CONFIGURATION
{
1432 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
1434 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
1436 typedef struct _DMA_CONFIGURATION_BYTE0
{
1440 UCHAR MoreEntries
: 1;
1441 } DMA_CONFIGURATION_BYTE0
;
1443 typedef struct _DMA_CONFIGURATION_BYTE1
{
1444 UCHAR Reserved0
: 2;
1445 UCHAR TransferSize
: 2;
1447 UCHAR Reserved1
: 2;
1448 } DMA_CONFIGURATION_BYTE1
;
1450 typedef struct _EISA_DMA_CONFIGURATION
{
1451 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
1452 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
1453 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
1455 #include <pshpack1.h>
1456 typedef struct _EISA_PORT_DESCRIPTOR
{
1457 UCHAR NumberPorts
: 5;
1460 UCHAR MoreEntries
: 1;
1461 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
1463 typedef struct _EISA_PORT_CONFIGURATION
{
1464 EISA_PORT_DESCRIPTOR Configuration
;
1466 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
1467 #include <poppack.h>
1469 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
1473 UCHAR MinorRevision
;
1474 UCHAR MajorRevision
;
1475 UCHAR Selections
[26];
1476 UCHAR FunctionFlags
;
1477 UCHAR TypeString
[80];
1478 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
1479 EISA_IRQ_CONFIGURATION EisaIrq
[7];
1480 EISA_DMA_CONFIGURATION EisaDma
[4];
1481 EISA_PORT_CONFIGURATION EisaPort
[20];
1482 UCHAR InitializationData
[60];
1483 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
1485 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
1487 #define EISA_FUNCTION_ENABLED 0x80
1488 #define EISA_FREE_FORM_DATA 0x40
1489 #define EISA_HAS_PORT_INIT_ENTRY 0x20
1490 #define EISA_HAS_PORT_RANGE 0x10
1491 #define EISA_HAS_DMA_ENTRY 0x08
1492 #define EISA_HAS_IRQ_ENTRY 0x04
1493 #define EISA_HAS_MEMORY_ENTRY 0x02
1494 #define EISA_HAS_TYPE_ENTRY 0x01
1495 #define EISA_HAS_INFORMATION \
1496 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
1497 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
1499 typedef struct _CM_EISA_SLOT_INFORMATION
{
1502 UCHAR MajorRevision
;
1503 UCHAR MinorRevision
;
1505 UCHAR NumberFunctions
;
1506 UCHAR FunctionInformation
;
1508 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
1510 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
1512 #define EISA_INVALID_SLOT 0x80
1513 #define EISA_INVALID_FUNCTION 0x81
1514 #define EISA_INVALID_CONFIGURATION 0x82
1515 #define EISA_EMPTY_SLOT 0x83
1516 #define EISA_INVALID_BIOS_CALL 0x86
1518 typedef struct _CM_FLOPPY_DEVICE_DATA
{
1524 UCHAR StepRateHeadUnloadTime
;
1527 UCHAR SectorLengthCode
;
1528 UCHAR SectorPerTrack
;
1529 UCHAR ReadWriteGapLength
;
1530 UCHAR DataTransferLength
;
1531 UCHAR FormatGapLength
;
1532 UCHAR FormatFillCharacter
;
1533 UCHAR HeadSettleTime
;
1534 UCHAR MotorSettleTime
;
1535 UCHAR MaximumTrackValue
;
1536 UCHAR DataTransferRate
;
1537 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
1539 typedef enum _INTERFACE_TYPE
{
1540 InterfaceTypeUndefined
= -1,
1557 MaximumInterfaceType
1558 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
1560 typedef struct _PNP_BUS_INFORMATION
{
1562 INTERFACE_TYPE LegacyBusType
;
1564 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
1566 #include <pshpack1.h>
1567 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
1569 UCHAR ShareDisposition
;
1573 PHYSICAL_ADDRESS Start
;
1577 PHYSICAL_ADDRESS Start
;
1586 PHYSICAL_ADDRESS Start
;
1606 } DeviceSpecificData
;
1608 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
1610 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
1612 #define CmResourceTypeNull 0
1613 #define CmResourceTypePort 1
1614 #define CmResourceTypeInterrupt 2
1615 #define CmResourceTypeMemory 3
1616 #define CmResourceTypeDma 4
1617 #define CmResourceTypeDeviceSpecific 5
1618 #define CmResourceTypeBusNumber 6
1619 #define CmResourceTypeMaximum 7
1620 #define CmResourceTypeNonArbitrated 128
1621 #define CmResourceTypeConfigData 128
1622 #define CmResourceTypeDevicePrivate 129
1623 #define CmResourceTypePcCardConfig 130
1624 #define CmResourceTypeMfCardConfig 131
1626 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
1628 typedef enum _CM_SHARE_DISPOSITION
{
1629 CmResourceShareUndetermined
,
1630 CmResourceShareDeviceExclusive
,
1631 CmResourceShareDriverExclusive
,
1632 CmResourceShareShared
1633 } CM_SHARE_DISPOSITION
;
1635 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
1637 #define CM_RESOURCE_PORT_MEMORY 0x0000
1638 #define CM_RESOURCE_PORT_IO 0x0001
1639 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
1640 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
1641 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
1642 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
1643 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
1644 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
1646 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
1648 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
1649 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
1651 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
1653 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
1654 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
1655 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
1656 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
1657 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
1658 #define CM_RESOURCE_MEMORY_24 0x0010
1659 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
1661 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
1663 #define CM_RESOURCE_DMA_8 0x0000
1664 #define CM_RESOURCE_DMA_16 0x0001
1665 #define CM_RESOURCE_DMA_32 0x0002
1666 #define CM_RESOURCE_DMA_8_AND_16 0x0004
1667 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
1668 #define CM_RESOURCE_DMA_TYPE_A 0x0010
1669 #define CM_RESOURCE_DMA_TYPE_B 0x0020
1670 #define CM_RESOURCE_DMA_TYPE_F 0x0040
1672 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
1676 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
1677 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
1679 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
1680 INTERFACE_TYPE InterfaceType
;
1682 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
1683 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
1685 typedef struct _CM_RESOURCE_LIST
{
1687 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
1688 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
1690 typedef struct _CM_INT13_DRIVE_PARAMETER
{
1693 USHORT SectorsPerTrack
;
1695 USHORT NumberDrives
;
1696 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
1697 #include <poppack.h>
1699 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
1704 USHORT KeyboardFlags
;
1705 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
1707 #define KEYBOARD_INSERT_ON 0x08
1708 #define KEYBOARD_CAPS_LOCK_ON 0x04
1709 #define KEYBOARD_NUM_LOCK_ON 0x02
1710 #define KEYBOARD_SCROLL_LOCK_ON 0x01
1711 #define KEYBOARD_ALT_KEY_DOWN 0x80
1712 #define KEYBOARD_CTRL_KEY_DOWN 0x40
1713 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
1714 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
1716 typedef struct _CM_MCA_POS_DATA
{
1722 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
1724 typedef struct CM_Power_Data_s
{
1726 DEVICE_POWER_STATE PD_MostRecentPowerState
;
1727 ULONG PD_Capabilities
;
1731 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
1732 } CM_POWER_DATA
, *PCM_POWER_DATA
;
1734 #define PDCAP_D0_SUPPORTED 0x00000001
1735 #define PDCAP_D1_SUPPORTED 0x00000002
1736 #define PDCAP_D2_SUPPORTED 0x00000004
1737 #define PDCAP_D3_SUPPORTED 0x00000008
1738 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
1739 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
1740 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
1741 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
1742 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
1744 typedef struct _CM_SCSI_DEVICE_DATA
{
1747 UCHAR HostIdentifier
;
1748 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
1750 typedef struct _CM_SERIAL_DEVICE_DATA
{
1754 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
1756 typedef struct _VM_COUNTERS
1758 SIZE_T PeakVirtualSize
;
1760 ULONG PageFaultCount
;
1761 SIZE_T PeakWorkingSetSize
;
1762 SIZE_T WorkingSetSize
;
1763 SIZE_T QuotaPeakPagedPoolUsage
;
1764 SIZE_T QuotaPagedPoolUsage
;
1765 SIZE_T QuotaPeakNonPagedPoolUsage
;
1766 SIZE_T QuotaNonPagedPoolUsage
;
1767 SIZE_T PagefileUsage
;
1768 SIZE_T PeakPagefileUsage
;
1769 } VM_COUNTERS
, *PVM_COUNTERS
;
1771 typedef struct _VM_COUNTERS_EX
1773 SIZE_T PeakVirtualSize
;
1775 ULONG PageFaultCount
;
1776 SIZE_T PeakWorkingSetSize
;
1777 SIZE_T WorkingSetSize
;
1778 SIZE_T QuotaPeakPagedPoolUsage
;
1779 SIZE_T QuotaPagedPoolUsage
;
1780 SIZE_T QuotaPeakNonPagedPoolUsage
;
1781 SIZE_T QuotaNonPagedPoolUsage
;
1782 SIZE_T PagefileUsage
;
1783 SIZE_T PeakPagefileUsage
;
1784 SIZE_T PrivateUsage
;
1785 } VM_COUNTERS_EX
, *PVM_COUNTERS_EX
;
1787 typedef struct _POOLED_USAGE_AND_LIMITS
1789 SIZE_T PeakPagedPoolUsage
;
1790 SIZE_T PagedPoolUsage
;
1791 SIZE_T PagedPoolLimit
;
1792 SIZE_T PeakNonPagedPoolUsage
;
1793 SIZE_T NonPagedPoolUsage
;
1794 SIZE_T NonPagedPoolLimit
;
1795 SIZE_T PeakPagefileUsage
;
1796 SIZE_T PagefileUsage
;
1797 SIZE_T PagefileLimit
;
1798 } POOLED_USAGE_AND_LIMITS
, *PPOOLED_USAGE_AND_LIMITS
;
1800 typedef enum _KINTERRUPT_POLARITY
1802 InterruptPolarityUnknown
,
1803 InterruptActiveHigh
,
1805 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
1807 /* IO_RESOURCE_DESCRIPTOR.Option */
1809 #define IO_RESOURCE_PREFERRED 0x01
1810 #define IO_RESOURCE_DEFAULT 0x02
1811 #define IO_RESOURCE_ALTERNATIVE 0x08
1813 typedef struct _IO_RESOURCE_DESCRIPTOR
{
1816 UCHAR ShareDisposition
;
1824 PHYSICAL_ADDRESS MinimumAddress
;
1825 PHYSICAL_ADDRESS MaximumAddress
;
1830 PHYSICAL_ADDRESS MinimumAddress
;
1831 PHYSICAL_ADDRESS MaximumAddress
;
1834 ULONG MinimumVector
;
1835 ULONG MaximumVector
;
1838 ULONG MinimumChannel
;
1839 ULONG MaximumChannel
;
1844 PHYSICAL_ADDRESS MinimumAddress
;
1845 PHYSICAL_ADDRESS MaximumAddress
;
1862 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
1864 typedef struct _IO_RESOURCE_LIST
{
1868 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
1869 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
1871 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
1873 INTERFACE_TYPE InterfaceType
;
1877 ULONG AlternativeLists
;
1878 IO_RESOURCE_LIST List
[1];
1879 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
1881 typedef struct _IO_ERROR_LOG_PACKET
{
1882 UCHAR MajorFunctionCode
;
1884 USHORT DumpDataSize
;
1885 USHORT NumberOfStrings
;
1886 USHORT StringOffset
;
1887 USHORT EventCategory
;
1889 ULONG UniqueErrorValue
;
1890 NTSTATUS FinalStatus
;
1891 ULONG SequenceNumber
;
1892 ULONG IoControlCode
;
1893 LARGE_INTEGER DeviceOffset
;
1895 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
1897 typedef struct _IO_ERROR_LOG_MESSAGE
{
1900 USHORT DriverNameLength
;
1901 LARGE_INTEGER TimeStamp
;
1902 ULONG DriverNameOffset
;
1903 IO_ERROR_LOG_PACKET EntryData
;
1904 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
1906 #define ERROR_LOG_LIMIT_SIZE 240
1907 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
1908 sizeof(IO_ERROR_LOG_PACKET) + \
1909 (sizeof(WCHAR) * 40))
1910 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
1911 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
1912 #define IO_ERROR_LOG_MESSAGE_LENGTH \
1913 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
1914 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
1915 PORT_MAXIMUM_MESSAGE_LENGTH)
1916 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
1917 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
1919 typedef struct _CONTROLLER_OBJECT
{
1922 PVOID ControllerExtension
;
1923 KDEVICE_QUEUE DeviceWaitQueue
;
1925 LARGE_INTEGER Spare2
;
1926 } CONTROLLER_OBJECT
, *PCONTROLLER_OBJECT
;
1928 typedef enum _DMA_WIDTH
{
1933 } DMA_WIDTH
, *PDMA_WIDTH
;
1935 typedef enum _DMA_SPEED
{
1942 } DMA_SPEED
, *PDMA_SPEED
;
1944 /* DEVICE_DESCRIPTION.Version */
1946 #define DEVICE_DESCRIPTION_VERSION 0x0000
1947 #define DEVICE_DESCRIPTION_VERSION1 0x0001
1948 #define DEVICE_DESCRIPTION_VERSION2 0x0002
1950 typedef struct _DEVICE_DESCRIPTION
{
1953 BOOLEAN ScatterGather
;
1955 BOOLEAN AutoInitialize
;
1956 BOOLEAN Dma32BitAddresses
;
1957 BOOLEAN IgnoreCount
;
1959 BOOLEAN Dma64BitAddresses
;
1962 INTERFACE_TYPE InterfaceType
;
1965 ULONG MaximumLength
;
1967 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
1970 #define VPB_MOUNTED 0x0001
1971 #define VPB_LOCKED 0x0002
1972 #define VPB_PERSISTENT 0x0004
1973 #define VPB_REMOVE_PENDING 0x0008
1974 #define VPB_RAW_MOUNT 0x0010
1976 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
1978 typedef struct _VPB
{
1982 USHORT VolumeLabelLength
;
1983 struct _DEVICE_OBJECT
*DeviceObject
;
1984 struct _DEVICE_OBJECT
*RealDevice
;
1986 ULONG ReferenceCount
;
1987 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
1990 /* DEVICE_OBJECT.Flags */
1992 #define DO_VERIFY_VOLUME 0x00000002
1993 #define DO_BUFFERED_IO 0x00000004
1994 #define DO_EXCLUSIVE 0x00000008
1995 #define DO_DIRECT_IO 0x00000010
1996 #define DO_MAP_IO_BUFFER 0x00000020
1997 #define DO_DEVICE_HAS_NAME 0x00000040
1998 #define DO_DEVICE_INITIALIZING 0x00000080
1999 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
2000 #define DO_LONG_TERM_REQUESTS 0x00000200
2001 #define DO_NEVER_LAST_DEVICE 0x00000400
2002 #define DO_SHUTDOWN_REGISTERED 0x00000800
2003 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
2004 #define DO_POWER_PAGABLE 0x00002000
2005 #define DO_POWER_INRUSH 0x00004000
2006 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
2008 /* DEVICE_OBJECT.Characteristics */
2010 #define FILE_REMOVABLE_MEDIA 0x00000001
2011 #define FILE_READ_ONLY_DEVICE 0x00000002
2012 #define FILE_FLOPPY_DISKETTE 0x00000004
2013 #define FILE_WRITE_ONCE_MEDIA 0x00000008
2014 #define FILE_REMOTE_DEVICE 0x00000010
2015 #define FILE_DEVICE_IS_MOUNTED 0x00000020
2016 #define FILE_VIRTUAL_VOLUME 0x00000040
2017 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
2018 #define FILE_DEVICE_SECURE_OPEN 0x00000100
2020 /* DEVICE_OBJECT.AlignmentRequirement */
2022 #define FILE_BYTE_ALIGNMENT 0x00000000
2023 #define FILE_WORD_ALIGNMENT 0x00000001
2024 #define FILE_LONG_ALIGNMENT 0x00000003
2025 #define FILE_QUAD_ALIGNMENT 0x00000007
2026 #define FILE_OCTA_ALIGNMENT 0x0000000f
2027 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
2028 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
2029 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
2030 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
2031 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
2033 /* DEVICE_OBJECT.DeviceType */
2035 #define DEVICE_TYPE ULONG
2037 #define FILE_DEVICE_BEEP 0x00000001
2038 #define FILE_DEVICE_CD_ROM 0x00000002
2039 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
2040 #define FILE_DEVICE_CONTROLLER 0x00000004
2041 #define FILE_DEVICE_DATALINK 0x00000005
2042 #define FILE_DEVICE_DFS 0x00000006
2043 #define FILE_DEVICE_DISK 0x00000007
2044 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
2045 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
2046 #define FILE_DEVICE_INPORT_PORT 0x0000000a
2047 #define FILE_DEVICE_KEYBOARD 0x0000000b
2048 #define FILE_DEVICE_MAILSLOT 0x0000000c
2049 #define FILE_DEVICE_MIDI_IN 0x0000000d
2050 #define FILE_DEVICE_MIDI_OUT 0x0000000e
2051 #define FILE_DEVICE_MOUSE 0x0000000f
2052 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
2053 #define FILE_DEVICE_NAMED_PIPE 0x00000011
2054 #define FILE_DEVICE_NETWORK 0x00000012
2055 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
2056 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
2057 #define FILE_DEVICE_NULL 0x00000015
2058 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
2059 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
2060 #define FILE_DEVICE_PRINTER 0x00000018
2061 #define FILE_DEVICE_SCANNER 0x00000019
2062 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
2063 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
2064 #define FILE_DEVICE_SCREEN 0x0000001c
2065 #define FILE_DEVICE_SOUND 0x0000001d
2066 #define FILE_DEVICE_STREAMS 0x0000001e
2067 #define FILE_DEVICE_TAPE 0x0000001f
2068 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
2069 #define FILE_DEVICE_TRANSPORT 0x00000021
2070 #define FILE_DEVICE_UNKNOWN 0x00000022
2071 #define FILE_DEVICE_VIDEO 0x00000023
2072 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
2073 #define FILE_DEVICE_WAVE_IN 0x00000025
2074 #define FILE_DEVICE_WAVE_OUT 0x00000026
2075 #define FILE_DEVICE_8042_PORT 0x00000027
2076 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
2077 #define FILE_DEVICE_BATTERY 0x00000029
2078 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
2079 #define FILE_DEVICE_MODEM 0x0000002b
2080 #define FILE_DEVICE_VDM 0x0000002c
2081 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
2082 #define FILE_DEVICE_SMB 0x0000002e
2083 #define FILE_DEVICE_KS 0x0000002f
2084 #define FILE_DEVICE_CHANGER 0x00000030
2085 #define FILE_DEVICE_SMARTCARD 0x00000031
2086 #define FILE_DEVICE_ACPI 0x00000032
2087 #define FILE_DEVICE_DVD 0x00000033
2088 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
2089 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
2090 #define FILE_DEVICE_DFS_VOLUME 0x00000036
2091 #define FILE_DEVICE_SERENUM 0x00000037
2092 #define FILE_DEVICE_TERMSRV 0x00000038
2093 #define FILE_DEVICE_KSEC 0x00000039
2094 #define FILE_DEVICE_FIPS 0x0000003a
2096 typedef struct _DEVICE_OBJECT
{
2099 LONG ReferenceCount
;
2100 struct _DRIVER_OBJECT
*DriverObject
;
2101 struct _DEVICE_OBJECT
*NextDevice
;
2102 struct _DEVICE_OBJECT
*AttachedDevice
;
2103 struct _IRP
*CurrentIrp
;
2106 ULONG Characteristics
;
2108 PVOID DeviceExtension
;
2109 DEVICE_TYPE DeviceType
;
2112 LIST_ENTRY ListEntry
;
2113 WAIT_CONTEXT_BLOCK Wcb
;
2115 ULONG AlignmentRequirement
;
2116 KDEVICE_QUEUE DeviceQueue
;
2118 ULONG ActiveThreadCount
;
2119 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2123 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
2125 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
2127 typedef enum _DEVICE_RELATION_TYPE
{
2132 TargetDeviceRelation
,
2134 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
2136 typedef struct _DEVICE_RELATIONS
{
2138 PDEVICE_OBJECT Objects
[1];
2139 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
2141 typedef struct _SCATTER_GATHER_ELEMENT
{
2142 PHYSICAL_ADDRESS Address
;
2145 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
2147 typedef struct _SCATTER_GATHER_LIST
{
2148 ULONG NumberOfElements
;
2150 SCATTER_GATHER_ELEMENT Elements
[0];
2151 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
2153 typedef struct _MDL
{
2157 struct _EPROCESS
*Process
;
2158 PVOID MappedSystemVa
;
2164 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
2165 #define MDL_PAGES_LOCKED 0x0002
2166 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
2167 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
2168 #define MDL_PARTIAL 0x0010
2169 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
2170 #define MDL_IO_PAGE_READ 0x0040
2171 #define MDL_WRITE_OPERATION 0x0080
2172 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
2173 #define MDL_FREE_EXTRA_PTES 0x0200
2174 #define MDL_IO_SPACE 0x0800
2175 #define MDL_NETWORK_HEADER 0x1000
2176 #define MDL_MAPPING_CAN_FAIL 0x2000
2177 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
2179 #define MDL_MAPPING_FLAGS ( \
2180 MDL_MAPPED_TO_SYSTEM_VA | \
2181 MDL_PAGES_LOCKED | \
2182 MDL_SOURCE_IS_NONPAGED_POOL | \
2183 MDL_PARTIAL_HAS_BEEN_MAPPED | \
2184 MDL_PARENT_MAPPED_SYSTEM_VA | \
2188 typedef struct _DRIVER_EXTENSION
{
2189 struct _DRIVER_OBJECT
*DriverObject
;
2190 PDRIVER_ADD_DEVICE AddDevice
;
2192 UNICODE_STRING ServiceKeyName
;
2193 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
2195 #define DRVO_UNLOAD_INVOKED 0x00000001
2196 #define DRVO_LEGACY_DRIVER 0x00000002
2197 #define DRVO_BUILTIN_DRIVER 0x00000004
2198 #define DRVO_REINIT_REGISTERED 0x00000008
2199 #define DRVO_INITIALIZED 0x00000010
2200 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
2201 #define DRVO_LEGACY_RESOURCES 0x00000040
2203 typedef struct _DRIVER_OBJECT
{
2206 PDEVICE_OBJECT DeviceObject
;
2210 PVOID DriverSection
;
2211 PDRIVER_EXTENSION DriverExtension
;
2212 UNICODE_STRING DriverName
;
2213 PUNICODE_STRING HardwareDatabase
;
2214 struct _FAST_IO_DISPATCH
*FastIoDispatch
;
2215 PDRIVER_INITIALIZE DriverInit
;
2216 PDRIVER_STARTIO DriverStartIo
;
2217 PDRIVER_UNLOAD DriverUnload
;
2218 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
2220 typedef struct _DRIVER_OBJECT
*PDRIVER_OBJECT
;
2223 (DDKAPI
*PPUT_DMA_ADAPTER
)(
2224 IN PDMA_ADAPTER DmaAdapter
);
2227 (DDKAPI
*PALLOCATE_COMMON_BUFFER
)(
2228 IN PDMA_ADAPTER DmaAdapter
,
2230 OUT PPHYSICAL_ADDRESS LogicalAddress
,
2231 IN BOOLEAN CacheEnabled
);
2234 (DDKAPI
*PFREE_COMMON_BUFFER
)(
2235 IN PDMA_ADAPTER DmaAdapter
,
2237 IN PHYSICAL_ADDRESS LogicalAddress
,
2238 IN PVOID VirtualAddress
,
2239 IN BOOLEAN CacheEnabled
);
2242 (DDKAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
2243 IN PDMA_ADAPTER DmaAdapter
,
2244 IN PDEVICE_OBJECT DeviceObject
,
2245 IN ULONG NumberOfMapRegisters
,
2246 IN PDRIVER_CONTROL ExecutionRoutine
,
2250 (DDKAPI
*PFLUSH_ADAPTER_BUFFERS
)(
2251 IN PDMA_ADAPTER DmaAdapter
,
2253 IN PVOID MapRegisterBase
,
2256 IN BOOLEAN WriteToDevice
);
2259 (DDKAPI
*PFREE_ADAPTER_CHANNEL
)(
2260 IN PDMA_ADAPTER DmaAdapter
);
2263 (DDKAPI
*PFREE_MAP_REGISTERS
)(
2264 IN PDMA_ADAPTER DmaAdapter
,
2265 PVOID MapRegisterBase
,
2266 ULONG NumberOfMapRegisters
);
2268 typedef PHYSICAL_ADDRESS
2269 (DDKAPI
*PMAP_TRANSFER
)(
2270 IN PDMA_ADAPTER DmaAdapter
,
2272 IN PVOID MapRegisterBase
,
2274 IN OUT PULONG Length
,
2275 IN BOOLEAN WriteToDevice
);
2278 (DDKAPI
*PGET_DMA_ALIGNMENT
)(
2279 IN PDMA_ADAPTER DmaAdapter
);
2282 (DDKAPI
*PREAD_DMA_COUNTER
)(
2283 IN PDMA_ADAPTER DmaAdapter
);
2286 (DDKAPI
*PGET_SCATTER_GATHER_LIST
)(
2287 IN PDMA_ADAPTER DmaAdapter
,
2288 IN PDEVICE_OBJECT DeviceObject
,
2292 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
2294 IN BOOLEAN WriteToDevice
);
2297 (DDKAPI
*PPUT_SCATTER_GATHER_LIST
)(
2298 IN PDMA_ADAPTER DmaAdapter
,
2299 IN PSCATTER_GATHER_LIST ScatterGather
,
2300 IN BOOLEAN WriteToDevice
);
2303 (DDKAPI
*PCALCULATE_SCATTER_GATHER_LIST_SIZE
)(
2304 IN PDMA_ADAPTER DmaAdapter
,
2305 IN PMDL Mdl OPTIONAL
,
2308 OUT PULONG ScatterGatherListSize
,
2309 OUT PULONG pNumberOfMapRegisters OPTIONAL
);
2312 (DDKAPI
*PBUILD_SCATTER_GATHER_LIST
)(
2313 IN PDMA_ADAPTER DmaAdapter
,
2314 IN PDEVICE_OBJECT DeviceObject
,
2318 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
2320 IN BOOLEAN WriteToDevice
,
2321 IN PVOID ScatterGatherBuffer
,
2322 IN ULONG ScatterGatherLength
);
2325 (DDKAPI
*PBUILD_MDL_FROM_SCATTER_GATHER_LIST
)(
2326 IN PDMA_ADAPTER DmaAdapter
,
2327 IN PSCATTER_GATHER_LIST ScatterGather
,
2328 IN PMDL OriginalMdl
,
2329 OUT PMDL
*TargetMdl
);
2331 typedef struct _DMA_OPERATIONS
{
2333 PPUT_DMA_ADAPTER PutDmaAdapter
;
2334 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
;
2335 PFREE_COMMON_BUFFER FreeCommonBuffer
;
2336 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2337 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2338 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2339 PFREE_MAP_REGISTERS FreeMapRegisters
;
2340 PMAP_TRANSFER MapTransfer
;
2341 PGET_DMA_ALIGNMENT GetDmaAlignment
;
2342 PREAD_DMA_COUNTER ReadDmaCounter
;
2343 PGET_SCATTER_GATHER_LIST GetScatterGatherList
;
2344 PPUT_SCATTER_GATHER_LIST PutScatterGatherList
;
2345 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList
;
2346 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList
;
2347 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList
;
2348 } DMA_OPERATIONS
, *PDMA_OPERATIONS
;
2350 typedef struct _DMA_ADAPTER
{
2353 PDMA_OPERATIONS DmaOperations
;
2357 typedef enum _ARBITER_REQUEST_SOURCE
{
2358 ArbiterRequestUndefined
= -1,
2359 ArbiterRequestLegacyReported
,
2360 ArbiterRequestHalReported
,
2361 ArbiterRequestLegacyAssigned
,
2362 ArbiterRequestPnpDetected
,
2363 ArbiterRequestPnpEnumerated
2364 } ARBITER_REQUEST_SOURCE
;
2366 typedef enum _ARBITER_RESULT
{
2367 ArbiterResultUndefined
= -1,
2368 ArbiterResultSuccess
,
2369 ArbiterResultExternalConflict
,
2370 ArbiterResultNullRequest
2373 typedef enum _ARBITER_ACTION
{
2374 ArbiterActionTestAllocation
,
2375 ArbiterActionRetestAllocation
,
2376 ArbiterActionCommitAllocation
,
2377 ArbiterActionRollbackAllocation
,
2378 ArbiterActionQueryAllocatedResources
,
2379 ArbiterActionWriteReservedResources
,
2380 ArbiterActionQueryConflict
,
2381 ArbiterActionQueryArbitrate
,
2382 ArbiterActionAddReserved
,
2383 ArbiterActionBootAllocation
2384 } ARBITER_ACTION
, *PARBITER_ACTION
;
2386 typedef struct _ARBITER_CONFLICT_INFO
{
2387 PDEVICE_OBJECT OwningObject
;
2390 } ARBITER_CONFLICT_INFO
, *PARBITER_CONFLICT_INFO
;
2392 typedef struct _ARBITER_PARAMETERS
{
2395 IN OUT PLIST_ENTRY ArbitrationList
;
2396 IN ULONG AllocateFromCount
;
2397 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom
;
2401 IN OUT PLIST_ENTRY ArbitrationList
;
2402 IN ULONG AllocateFromCount
;
2403 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom
;
2407 IN OUT PLIST_ENTRY ArbitrationList
;
2411 OUT PCM_PARTIAL_RESOURCE_LIST
*AllocatedResources
;
2412 } QueryAllocatedResources
;
2415 IN PDEVICE_OBJECT PhysicalDeviceObject
;
2416 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource
;
2417 OUT PULONG ConflictCount
;
2418 OUT PARBITER_CONFLICT_INFO
*Conflicts
;
2422 IN PLIST_ENTRY ArbitrationList
;
2426 IN PDEVICE_OBJECT ReserveDevice
;
2429 } ARBITER_PARAMETERS
, *PARBITER_PARAMETERS
;
2431 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
2433 typedef struct _ARBITER_LIST_ENTRY
{
2434 LIST_ENTRY ListEntry
;
2435 ULONG AlternativeCount
;
2436 PIO_RESOURCE_DESCRIPTOR Alternatives
;
2437 PDEVICE_OBJECT PhysicalDeviceObject
;
2438 ARBITER_REQUEST_SOURCE RequestSource
;
2441 INTERFACE_TYPE InterfaceType
;
2444 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment
;
2445 PIO_RESOURCE_DESCRIPTOR SelectedAlternative
;
2446 ARBITER_RESULT Result
;
2447 } ARBITER_LIST_ENTRY
, *PARBITER_LIST_ENTRY
;
2450 (DDKAPI
*PARBITER_HANDLER
)(
2452 IN ARBITER_ACTION Action
,
2453 IN OUT PARBITER_PARAMETERS Parameters
);
2455 #define ARBITER_PARTIAL 0x00000001
2457 typedef struct _ARBITER_INTERFACE
{
2461 PINTERFACE_REFERENCE InterfaceReference
;
2462 PINTERFACE_DEREFERENCE InterfaceDereference
;
2463 PARBITER_HANDLER ArbiterHandler
;
2465 } ARBITER_INTERFACE
, *PARBITER_INTERFACE
;
2467 typedef enum _HAL_QUERY_INFORMATION_CLASS
{
2468 HalInstalledBusInformation
,
2469 HalProfileSourceInformation
,
2470 HalInformationClassUnused1
,
2471 HalPowerInformation
,
2472 HalProcessorSpeedInformation
,
2473 HalCallbackInformation
,
2474 HalMapRegisterInformation
,
2475 HalMcaLogInformation
,
2476 HalFrameBufferCachingInformation
,
2477 HalDisplayBiosInformation
,
2478 HalProcessorFeatureInformation
,
2479 HalNumaTopologyInterface
,
2480 HalErrorInformation
,
2481 HalCmcLogInformation
,
2482 HalCpeLogInformation
,
2483 HalQueryMcaInterface
,
2484 HalQueryAMLIIllegalIOPortAddresses
,
2485 HalQueryMaxHotPlugMemoryAddress
,
2486 HalPartitionIpiInterface
,
2487 HalPlatformInformation
,
2488 HalQueryProfileSourceList
2489 } HAL_QUERY_INFORMATION_CLASS
, *PHAL_QUERY_INFORMATION_CLASS
;
2491 typedef enum _HAL_SET_INFORMATION_CLASS
{
2492 HalProfileSourceInterval
,
2493 HalProfileSourceInterruptHandler
,
2494 HalMcaRegisterDriver
,
2495 HalKernelErrorHandler
,
2496 HalCmcRegisterDriver
,
2497 HalCpeRegisterDriver
,
2501 HalGenerateCmcInterrupt
2502 } HAL_SET_INFORMATION_CLASS
, *PHAL_SET_INFORMATION_CLASS
;
2504 typedef struct _MAP_REGISTER_ENTRY
2507 BOOLEAN WriteToDevice
;
2508 } MAP_REGISTER_ENTRY
, *PMAP_REGISTER_ENTRY
;
2515 PUCHAR TranslatedAddress
;
2517 } DEBUG_DEVICE_ADDRESS
, *PDEBUG_DEVICE_ADDRESS
;
2521 PHYSICAL_ADDRESS Start
;
2522 PHYSICAL_ADDRESS MaxEnd
;
2523 PVOID VirtualAddress
;
2527 } DEBUG_MEMORY_REQUIREMENTS
, *PDEBUG_MEMORY_REQUIREMENTS
;
2538 BOOLEAN Initialized
;
2539 DEBUG_DEVICE_ADDRESS BaseAddress
[6];
2540 DEBUG_MEMORY_REQUIREMENTS Memory
;
2541 } DEBUG_DEVICE_DESCRIPTOR
, *PDEBUG_DEVICE_DESCRIPTOR
;
2543 /* Function Type Defintions for Dispatch Functions */
2546 (DDKAPI
*PDEVICE_CONTROL_COMPLETION
)(
2547 IN
struct _DEVICE_CONTROL_CONTEXT
*ControlContext
);
2549 typedef struct _DEVICE_CONTROL_CONTEXT
{
2551 PDEVICE_HANDLER_OBJECT DeviceHandler
;
2552 PDEVICE_OBJECT DeviceObject
;
2555 PULONG BufferLength
;
2557 } DEVICE_CONTROL_CONTEXT
, *PDEVICE_CONTROL_CONTEXT
;
2559 typedef struct _PM_DISPATCH_TABLE
{
2563 } PM_DISPATCH_TABLE
, *PPM_DISPATCH_TABLE
;
2565 typedef enum _RESOURCE_TRANSLATION_DIRECTION
{
2566 TranslateChildToParent
,
2567 TranslateParentToChild
2568 } RESOURCE_TRANSLATION_DIRECTION
;
2571 (DDKAPI
*PTRANSLATE_RESOURCE_HANDLER
)(
2573 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source
,
2574 IN RESOURCE_TRANSLATION_DIRECTION Direction
,
2575 IN ULONG AlternativesCount
,
2576 IN IO_RESOURCE_DESCRIPTOR Alternatives
[],
2577 IN PDEVICE_OBJECT PhysicalDeviceObject
,
2578 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target
);
2581 (DDKAPI
*PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER
)(
2583 IN PIO_RESOURCE_DESCRIPTOR Source
,
2584 IN PDEVICE_OBJECT PhysicalDeviceObject
,
2585 OUT PULONG TargetCount
,
2586 OUT PIO_RESOURCE_DESCRIPTOR
*Target
);
2588 typedef struct _TRANSLATOR_INTERFACE
{
2592 PINTERFACE_REFERENCE InterfaceReference
;
2593 PINTERFACE_DEREFERENCE InterfaceDereference
;
2594 PTRANSLATE_RESOURCE_HANDLER TranslateResources
;
2595 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements
;
2596 } TRANSLATOR_INTERFACE
, *PTRANSLATOR_INTERFACE
;
2599 (DDKAPI
*pHalDeviceControl
)(
2600 IN PDEVICE_HANDLER_OBJECT DeviceHandler
,
2601 IN PDEVICE_OBJECT DeviceObject
,
2602 IN ULONG ControlCode
,
2603 IN OUT PVOID Buffer OPTIONAL
,
2604 IN OUT PULONG BufferLength OPTIONAL
,
2606 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine
);
2609 (DDKFASTAPI
*pHalExamineMBR
)(
2610 IN PDEVICE_OBJECT DeviceObject
,
2611 IN ULONG SectorSize
,
2612 IN ULONG MBRTypeIdentifier
,
2616 (DDKFASTAPI
*pHalIoAssignDriveLetters
)(
2617 IN
struct _LOADER_PARAMETER_BLOCK
*LoaderBlock
,
2618 IN PSTRING NtDeviceName
,
2619 OUT PUCHAR NtSystemPath
,
2620 OUT PSTRING NtSystemPathString
);
2623 (DDKFASTAPI
*pHalIoReadPartitionTable
)(
2624 IN PDEVICE_OBJECT DeviceObject
,
2625 IN ULONG SectorSize
,
2626 IN BOOLEAN ReturnRecognizedPartitions
,
2627 OUT
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
2630 (DDKFASTAPI
*pHalIoSetPartitionInformation
)(
2631 IN PDEVICE_OBJECT DeviceObject
,
2632 IN ULONG SectorSize
,
2633 IN ULONG PartitionNumber
,
2634 IN ULONG PartitionType
);
2637 (DDKFASTAPI
*pHalIoWritePartitionTable
)(
2638 IN PDEVICE_OBJECT DeviceObject
,
2639 IN ULONG SectorSize
,
2640 IN ULONG SectorsPerTrack
,
2641 IN ULONG NumberOfHeads
,
2642 IN
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
2644 typedef PBUS_HANDLER
2645 (DDKFASTAPI
*pHalHandlerForBus
)(
2646 IN INTERFACE_TYPE InterfaceType
,
2647 IN ULONG BusNumber
);
2650 (DDKFASTAPI
*pHalReferenceBusHandler
)(
2651 IN PBUS_HANDLER BusHandler
);
2654 (DDKAPI
*pHalQuerySystemInformation
)(
2655 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
2656 IN ULONG BufferSize
,
2657 IN OUT PVOID Buffer
,
2658 OUT PULONG ReturnedLength
);
2661 (DDKAPI
*pHalSetSystemInformation
)(
2662 IN HAL_SET_INFORMATION_CLASS InformationClass
,
2663 IN ULONG BufferSize
,
2667 (DDKAPI
*pHalQueryBusSlots
)(
2668 IN PBUS_HANDLER BusHandler
,
2669 IN ULONG BufferSize
,
2670 OUT PULONG SlotNumbers
,
2671 OUT PULONG ReturnedLength
);
2674 (DDKAPI
*pHalInitPnpDriver
)(
2678 (DDKAPI
*pHalInitPowerManagement
)(
2679 IN PPM_DISPATCH_TABLE PmDriverDispatchTable
,
2680 OUT PPM_DISPATCH_TABLE
*PmHalDispatchTable
);
2682 typedef struct _DMA_ADAPTER
*
2683 (DDKAPI
*pHalGetDmaAdapter
)(
2685 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
2686 OUT PULONG NumberOfMapRegisters
);
2689 (DDKAPI
*pHalGetInterruptTranslator
)(
2690 IN INTERFACE_TYPE ParentInterfaceType
,
2691 IN ULONG ParentBusNumber
,
2692 IN INTERFACE_TYPE BridgeInterfaceType
,
2695 OUT PTRANSLATOR_INTERFACE Translator
,
2696 OUT PULONG BridgeBusNumber
);
2699 (DDKAPI
*pHalStartMirroring
)(
2703 (DDKAPI
*pHalEndMirroring
)(
2704 IN ULONG PassNumber
);
2707 (DDKAPI
*pHalMirrorPhysicalMemory
)(
2708 IN PHYSICAL_ADDRESS PhysicalAddress
,
2709 IN LARGE_INTEGER NumberOfBytes
);
2712 (DDKAPI
*pHalMirrorVerify
)(
2713 IN PHYSICAL_ADDRESS PhysicalAddress
,
2714 IN LARGE_INTEGER NumberOfBytes
);
2717 (DDKAPI
*pHalEndOfBoot
)(
2722 (DDKAPI
*pHalTranslateBusAddress
)(
2723 IN INTERFACE_TYPE InterfaceType
,
2725 IN PHYSICAL_ADDRESS BusAddress
,
2726 IN OUT PULONG AddressSpace
,
2727 OUT PPHYSICAL_ADDRESS TranslatedAddress
2732 (DDKAPI
*pHalAssignSlotResources
)(
2733 IN PUNICODE_STRING RegistryPath
,
2734 IN PUNICODE_STRING DriverClassName OPTIONAL
,
2735 IN PDRIVER_OBJECT DriverObject
,
2736 IN PDEVICE_OBJECT DeviceObject
,
2737 IN INTERFACE_TYPE BusType
,
2739 IN ULONG SlotNumber
,
2740 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
2745 (DDKAPI
*pHalHaltSystem
)(
2751 (DDKAPI
*pHalResetDisplay
)(
2757 (DDKAPI
*pHalVectorToIDTEntry
)(
2763 (DDKAPI
*pHalFindBusAddressTranslation
)(
2764 IN PHYSICAL_ADDRESS BusAddress
,
2765 IN OUT PULONG AddressSpace
,
2766 OUT PPHYSICAL_ADDRESS TranslatedAddress
,
2767 IN OUT PULONG_PTR Context
,
2773 (DDKAPI
*pKdSetupPciDeviceForDebugging
)(
2774 IN PVOID LoaderBlock OPTIONAL
,
2775 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
2780 (DDKAPI
*pKdReleasePciDeviceForDebugging
)(
2781 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
2786 (DDKAPI
*pKdGetAcpiTablePhase0
)(
2787 IN
struct _LOADER_PARAMETER_BLOCK
*LoaderBlock
,
2793 (DDKAPI
*pKdCheckPowerButton
)(
2799 (DDKAPI
*pHalGetInterruptVector
)(
2800 IN INTERFACE_TYPE InterfaceType
,
2802 IN ULONG BusInterruptLevel
,
2803 IN ULONG BusInterruptVector
,
2805 OUT PKAFFINITY Affinity
2810 (DDKAPI
*pHalGetVectorInput
)(
2812 IN KAFFINITY Affinity
,
2814 OUT PKINTERRUPT_POLARITY Polarity
2819 (DDKAPI
*pKdMapPhysicalMemory64
)(
2820 IN PHYSICAL_ADDRESS PhysicalAddress
,
2821 IN ULONG NumberPages
2826 (DDKAPI
*pKdUnmapVirtualAddress
)(
2827 IN PVOID VirtualAddress
,
2828 IN ULONG NumberPages
2833 (DDKAPI
*pKdGetPciDataByOffset
)(
2835 IN ULONG SlotNumber
,
2843 (DDKAPI
*pKdSetPciDataByOffset
)(
2845 IN ULONG SlotNumber
,
2852 (DDKAPI
*PHAL_RESET_DISPLAY_PARAMETERS
)(
2853 ULONG Columns
, ULONG Rows
);
2857 pHalQuerySystemInformation HalQuerySystemInformation
;
2858 pHalSetSystemInformation HalSetSystemInformation
;
2859 pHalQueryBusSlots HalQueryBusSlots
;
2861 pHalExamineMBR HalExamineMBR
;
2862 pHalIoAssignDriveLetters HalIoAssignDriveLetters
;
2863 pHalIoReadPartitionTable HalIoReadPartitionTable
;
2864 pHalIoSetPartitionInformation HalIoSetPartitionInformation
;
2865 pHalIoWritePartitionTable HalIoWritePartitionTable
;
2866 pHalHandlerForBus HalReferenceHandlerForBus
;
2867 pHalReferenceBusHandler HalReferenceBusHandler
;
2868 pHalReferenceBusHandler HalDereferenceBusHandler
;
2869 pHalInitPnpDriver HalInitPnpDriver
;
2870 pHalInitPowerManagement HalInitPowerManagement
;
2871 pHalGetDmaAdapter HalGetDmaAdapter
;
2872 pHalGetInterruptTranslator HalGetInterruptTranslator
;
2873 pHalStartMirroring HalStartMirroring
;
2874 pHalEndMirroring HalEndMirroring
;
2875 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory
;
2876 pHalEndOfBoot HalEndOfBoot
;
2877 pHalMirrorVerify HalMirrorVerify
;
2878 } HAL_DISPATCH
, *PHAL_DISPATCH
;
2880 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_)
2881 extern DECL_IMPORT PHAL_DISPATCH HalDispatchTable
;
2882 #define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
2884 extern DECL_EXPORT HAL_DISPATCH HalDispatchTable
;
2885 #define HALDISPATCH (&HalDispatchTable)
2888 #define HAL_DISPATCH_VERSION 3
2889 #define HalDispatchTableVersion HALDISPATCH->Version
2890 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
2891 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
2892 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
2893 #define HalDeviceControl HALDISPATCH->HalDeviceControl
2894 #define HalIoAssignDriveLetters HALDISPATCH->HalIoAssignDriveLetters
2895 #define HalIoReadPartitionTable HALDISPATCH->HalIoReadPartitionTable
2896 #define HalIoSetPartitionInformation HALDISPATCH->HalIoSetPartitionInformation
2897 #define HalIoWritePartitionTable HALDISPATCH->HalIoWritePartitionTable
2898 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
2899 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
2900 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
2901 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
2902 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
2903 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
2904 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
2905 #define HalStartMirroring HALDISPATCH->HalStartMirroring
2906 #define HalEndMirroring HALDISPATCH->HalEndMirroring
2907 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
2908 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
2909 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
2911 typedef enum _FILE_INFORMATION_CLASS
{
2912 FileDirectoryInformation
= 1,
2913 FileFullDirectoryInformation
,
2914 FileBothDirectoryInformation
,
2915 FileBasicInformation
,
2916 FileStandardInformation
,
2917 FileInternalInformation
,
2919 FileAccessInformation
,
2920 FileNameInformation
,
2921 FileRenameInformation
,
2922 FileLinkInformation
,
2923 FileNamesInformation
,
2924 FileDispositionInformation
,
2925 FilePositionInformation
,
2926 FileFullEaInformation
,
2927 FileModeInformation
,
2928 FileAlignmentInformation
,
2930 FileAllocationInformation
,
2931 FileEndOfFileInformation
,
2932 FileAlternateNameInformation
,
2933 FileStreamInformation
,
2934 FilePipeInformation
,
2935 FilePipeLocalInformation
,
2936 FilePipeRemoteInformation
,
2937 FileMailslotQueryInformation
,
2938 FileMailslotSetInformation
,
2939 FileCompressionInformation
,
2940 FileObjectIdInformation
,
2941 FileCompletionInformation
,
2942 FileMoveClusterInformation
,
2943 FileQuotaInformation
,
2944 FileReparsePointInformation
,
2945 FileNetworkOpenInformation
,
2946 FileAttributeTagInformation
,
2947 FileTrackingInformation
,
2948 FileIdBothDirectoryInformation
,
2949 FileIdFullDirectoryInformation
,
2950 FileValidDataLengthInformation
,
2951 FileShortNameInformation
,
2952 FileMaximumInformation
2953 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
2955 typedef struct _FILE_POSITION_INFORMATION
{
2956 LARGE_INTEGER CurrentByteOffset
;
2957 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
2959 typedef struct _FILE_ALIGNMENT_INFORMATION
{
2960 ULONG AlignmentRequirement
;
2961 } FILE_ALIGNMENT_INFORMATION
, *PFILE_ALIGNMENT_INFORMATION
;
2963 typedef struct _FILE_NAME_INFORMATION
{
2964 ULONG FileNameLength
;
2966 } FILE_NAME_INFORMATION
, *PFILE_NAME_INFORMATION
;
2968 #include <pshpack8.h>
2969 typedef struct _FILE_BASIC_INFORMATION
{
2970 LARGE_INTEGER CreationTime
;
2971 LARGE_INTEGER LastAccessTime
;
2972 LARGE_INTEGER LastWriteTime
;
2973 LARGE_INTEGER ChangeTime
;
2974 ULONG FileAttributes
;
2975 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
2976 #include <poppack.h>
2978 typedef struct _FILE_STANDARD_INFORMATION
{
2979 LARGE_INTEGER AllocationSize
;
2980 LARGE_INTEGER EndOfFile
;
2981 ULONG NumberOfLinks
;
2982 BOOLEAN DeletePending
;
2984 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
2986 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
2987 LARGE_INTEGER CreationTime
;
2988 LARGE_INTEGER LastAccessTime
;
2989 LARGE_INTEGER LastWriteTime
;
2990 LARGE_INTEGER ChangeTime
;
2991 LARGE_INTEGER AllocationSize
;
2992 LARGE_INTEGER EndOfFile
;
2993 ULONG FileAttributes
;
2994 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
2996 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION
{
2997 ULONG FileAttributes
;
2999 } FILE_ATTRIBUTE_TAG_INFORMATION
, *PFILE_ATTRIBUTE_TAG_INFORMATION
;
3001 typedef struct _FILE_DISPOSITION_INFORMATION
{
3003 } FILE_DISPOSITION_INFORMATION
, *PFILE_DISPOSITION_INFORMATION
;
3005 typedef struct _FILE_END_OF_FILE_INFORMATION
{
3006 LARGE_INTEGER EndOfFile
;
3007 } FILE_END_OF_FILE_INFORMATION
, *PFILE_END_OF_FILE_INFORMATION
;
3009 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
{
3010 LARGE_INTEGER ValidDataLength
;
3011 } FILE_VALID_DATA_LENGTH_INFORMATION
, *PFILE_VALID_DATA_LENGTH_INFORMATION
;
3013 typedef enum _FSINFOCLASS
{
3014 FileFsVolumeInformation
= 1,
3015 FileFsLabelInformation
,
3016 FileFsSizeInformation
,
3017 FileFsDeviceInformation
,
3018 FileFsAttributeInformation
,
3019 FileFsControlInformation
,
3020 FileFsFullSizeInformation
,
3021 FileFsObjectIdInformation
,
3022 FileFsDriverPathInformation
,
3023 FileFsMaximumInformation
3024 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
3026 typedef struct _FILE_FS_DEVICE_INFORMATION
{
3027 DEVICE_TYPE DeviceType
;
3028 ULONG Characteristics
;
3029 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
3031 typedef struct _FILE_FULL_EA_INFORMATION
{
3032 ULONG NextEntryOffset
;
3035 USHORT EaValueLength
;
3037 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
3039 typedef ULONG_PTR ERESOURCE_THREAD
;
3040 typedef ERESOURCE_THREAD
*PERESOURCE_THREAD
;
3042 typedef struct _OWNER_ENTRY
{
3043 ERESOURCE_THREAD OwnerThread
;
3044 _ANONYMOUS_UNION
union {
3048 } OWNER_ENTRY
, *POWNER_ENTRY
;
3050 /* ERESOURCE.Flag */
3052 #define ResourceNeverExclusive 0x0010
3053 #define ResourceReleaseByOtherThread 0x0020
3054 #define ResourceOwnedExclusive 0x0080
3056 #define RESOURCE_HASH_TABLE_SIZE 64
3058 typedef struct _ERESOURCE
{
3059 LIST_ENTRY SystemResourcesList
;
3060 POWNER_ENTRY OwnerTable
;
3063 PKSEMAPHORE SharedWaiters
;
3064 PKEVENT ExclusiveWaiters
;
3065 OWNER_ENTRY OwnerThreads
[2];
3066 ULONG ContentionCount
;
3067 USHORT NumberOfSharedWaiters
;
3068 USHORT NumberOfExclusiveWaiters
;
3069 _ANONYMOUS_UNION
union {
3071 ULONG_PTR CreatorBackTraceIndex
;
3073 KSPIN_LOCK SpinLock
;
3074 } ERESOURCE
, *PERESOURCE
;
3076 typedef struct _DEVOBJ_EXTENSION
3080 PDEVICE_OBJECT DeviceObject
;
3081 } DEVOBJ_EXTENSION
, *PDEVOBJ_EXTENSION
;
3084 (DDKAPI
*PFAST_IO_CHECK_IF_POSSIBLE
)(
3085 IN
struct _FILE_OBJECT
*FileObject
,
3086 IN PLARGE_INTEGER FileOffset
,
3090 IN BOOLEAN CheckForReadOperation
,
3091 OUT PIO_STATUS_BLOCK IoStatus
,
3092 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3095 (DDKAPI
*PFAST_IO_READ
)(
3096 IN
struct _FILE_OBJECT
*FileObject
,
3097 IN PLARGE_INTEGER FileOffset
,
3102 OUT PIO_STATUS_BLOCK IoStatus
,
3103 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3106 (DDKAPI
*PFAST_IO_WRITE
)(
3107 IN
struct _FILE_OBJECT
*FileObject
,
3108 IN PLARGE_INTEGER FileOffset
,
3113 OUT PIO_STATUS_BLOCK IoStatus
,
3114 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3117 (DDKAPI
*PFAST_IO_QUERY_BASIC_INFO
)(
3118 IN
struct _FILE_OBJECT
*FileObject
,
3120 OUT PFILE_BASIC_INFORMATION Buffer
,
3121 OUT PIO_STATUS_BLOCK IoStatus
,
3122 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3125 (DDKAPI
*PFAST_IO_QUERY_STANDARD_INFO
)(
3126 IN
struct _FILE_OBJECT
*FileObject
,
3128 OUT PFILE_STANDARD_INFORMATION Buffer
,
3129 OUT PIO_STATUS_BLOCK IoStatus
,
3130 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3133 (DDKAPI
*PFAST_IO_LOCK
)(
3134 IN
struct _FILE_OBJECT
*FileObject
,
3135 IN PLARGE_INTEGER FileOffset
,
3136 IN PLARGE_INTEGER Length
,
3137 PEPROCESS ProcessId
,
3139 BOOLEAN FailImmediately
,
3140 BOOLEAN ExclusiveLock
,
3141 OUT PIO_STATUS_BLOCK IoStatus
,
3142 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3145 (DDKAPI
*PFAST_IO_UNLOCK_SINGLE
)(
3146 IN
struct _FILE_OBJECT
*FileObject
,
3147 IN PLARGE_INTEGER FileOffset
,
3148 IN PLARGE_INTEGER Length
,
3149 PEPROCESS ProcessId
,
3151 OUT PIO_STATUS_BLOCK IoStatus
,
3152 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3155 (DDKAPI
*PFAST_IO_UNLOCK_ALL
)(
3156 IN
struct _FILE_OBJECT
*FileObject
,
3157 PEPROCESS ProcessId
,
3158 OUT PIO_STATUS_BLOCK IoStatus
,
3159 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3162 (DDKAPI
*PFAST_IO_UNLOCK_ALL_BY_KEY
)(
3163 IN
struct _FILE_OBJECT
*FileObject
,
3164 PEPROCESS ProcessId
,
3166 OUT PIO_STATUS_BLOCK IoStatus
,
3167 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3170 (DDKAPI
*PFAST_IO_DEVICE_CONTROL
)(
3171 IN
struct _FILE_OBJECT
*FileObject
,
3173 IN PVOID InputBuffer OPTIONAL
,
3174 IN ULONG InputBufferLength
,
3175 OUT PVOID OutputBuffer OPTIONAL
,
3176 IN ULONG OutputBufferLength
,
3177 IN ULONG IoControlCode
,
3178 OUT PIO_STATUS_BLOCK IoStatus
,
3179 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3182 (DDKAPI
*PFAST_IO_ACQUIRE_FILE
)(
3183 IN
struct _FILE_OBJECT
*FileObject
);
3186 (DDKAPI
*PFAST_IO_RELEASE_FILE
)(
3187 IN
struct _FILE_OBJECT
*FileObject
);
3190 (DDKAPI
*PFAST_IO_DETACH_DEVICE
)(
3191 IN
struct _DEVICE_OBJECT
*SourceDevice
,
3192 IN
struct _DEVICE_OBJECT
*TargetDevice
);
3195 (DDKAPI
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
)(
3196 IN
struct _FILE_OBJECT
*FileObject
,
3198 OUT
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
3199 OUT
struct _IO_STATUS_BLOCK
*IoStatus
,
3200 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3203 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
3204 IN
struct _FILE_OBJECT
*FileObject
,
3205 IN PLARGE_INTEGER EndingOffset
,
3206 OUT
struct _ERESOURCE
**ResourceToRelease
,
3207 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3210 (DDKAPI
*PFAST_IO_MDL_READ
)(
3211 IN
struct _FILE_OBJECT
*FileObject
,
3212 IN PLARGE_INTEGER FileOffset
,
3216 OUT PIO_STATUS_BLOCK IoStatus
,
3217 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3220 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE
)(
3221 IN
struct _FILE_OBJECT
*FileObject
,
3223 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3226 (DDKAPI
*PFAST_IO_PREPARE_MDL_WRITE
)(
3227 IN
struct _FILE_OBJECT
*FileObject
,
3228 IN PLARGE_INTEGER FileOffset
,
3232 OUT PIO_STATUS_BLOCK IoStatus
,
3233 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3236 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE
)(
3237 IN
struct _FILE_OBJECT
*FileObject
,
3238 IN PLARGE_INTEGER FileOffset
,
3240 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3243 (DDKAPI
*PFAST_IO_READ_COMPRESSED
)(
3244 IN
struct _FILE_OBJECT
*FileObject
,
3245 IN PLARGE_INTEGER FileOffset
,
3250 OUT PIO_STATUS_BLOCK IoStatus
,
3251 OUT
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
3252 IN ULONG CompressedDataInfoLength
,
3253 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3256 (DDKAPI
*PFAST_IO_WRITE_COMPRESSED
)(
3257 IN
struct _FILE_OBJECT
*FileObject
,
3258 IN PLARGE_INTEGER FileOffset
,
3263 OUT PIO_STATUS_BLOCK IoStatus
,
3264 IN
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
3265 IN ULONG CompressedDataInfoLength
,
3266 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3269 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
3270 IN
struct _FILE_OBJECT
*FileObject
,
3272 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3275 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
3276 IN
struct _FILE_OBJECT
*FileObject
,
3277 IN PLARGE_INTEGER FileOffset
,
3279 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3282 (DDKAPI
*PFAST_IO_QUERY_OPEN
)(
3283 IN
struct _IRP
*Irp
,
3284 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
3285 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3288 (DDKAPI
*PFAST_IO_RELEASE_FOR_MOD_WRITE
)(
3289 IN
struct _FILE_OBJECT
*FileObject
,
3290 IN
struct _ERESOURCE
*ResourceToRelease
,
3291 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3294 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
)(
3295 IN
struct _FILE_OBJECT
*FileObject
,
3296 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3299 (DDKAPI
*PFAST_IO_RELEASE_FOR_CCFLUSH
) (
3300 IN
struct _FILE_OBJECT
*FileObject
,
3301 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3303 typedef struct _FAST_IO_DISPATCH
{
3304 ULONG SizeOfFastIoDispatch
;
3305 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
3306 PFAST_IO_READ FastIoRead
;
3307 PFAST_IO_WRITE FastIoWrite
;
3308 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
3309 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
3310 PFAST_IO_LOCK FastIoLock
;
3311 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
3312 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
3313 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
3314 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
3315 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
3316 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
3317 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
3318 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
3319 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
3320 PFAST_IO_MDL_READ MdlRead
;
3321 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
3322 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
3323 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
3324 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
3325 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
3326 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
3327 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
3328 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
3329 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
3330 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
3331 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
3332 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
3334 typedef struct _SECTION_OBJECT_POINTERS
{
3335 PVOID DataSectionObject
;
3336 PVOID SharedCacheMap
;
3337 PVOID ImageSectionObject
;
3338 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
3340 typedef struct _IO_COMPLETION_CONTEXT
{
3343 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
3345 /* FILE_OBJECT.Flags */
3347 #define FO_FILE_OPEN 0x00000001
3348 #define FO_SYNCHRONOUS_IO 0x00000002
3349 #define FO_ALERTABLE_IO 0x00000004
3350 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
3351 #define FO_WRITE_THROUGH 0x00000010
3352 #define FO_SEQUENTIAL_ONLY 0x00000020
3353 #define FO_CACHE_SUPPORTED 0x00000040
3354 #define FO_NAMED_PIPE 0x00000080
3355 #define FO_STREAM_FILE 0x00000100
3356 #define FO_MAILSLOT 0x00000200
3357 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
3358 #define FO_DIRECT_DEVICE_OPEN 0x00000800
3359 #define FO_FILE_MODIFIED 0x00001000
3360 #define FO_FILE_SIZE_CHANGED 0x00002000
3361 #define FO_CLEANUP_COMPLETE 0x00004000
3362 #define FO_TEMPORARY_FILE 0x00008000
3363 #define FO_DELETE_ON_CLOSE 0x00010000
3364 #define FO_OPENED_CASE_SENSITIVE 0x00020000
3365 #define FO_HANDLE_CREATED 0x00040000
3366 #define FO_FILE_FAST_IO_READ 0x00080000
3367 #define FO_RANDOM_ACCESS 0x00100000
3368 #define FO_FILE_OPEN_CANCELLED 0x00200000
3369 #define FO_VOLUME_OPEN 0x00400000
3370 #define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000
3371 #define FO_REMOTE_ORIGIN 0x01000000
3373 typedef struct _FILE_OBJECT
{
3376 PDEVICE_OBJECT DeviceObject
;
3380 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
3381 PVOID PrivateCacheMap
;
3382 NTSTATUS FinalStatus
;
3383 struct _FILE_OBJECT
*RelatedFileObject
;
3384 BOOLEAN LockOperation
;
3385 BOOLEAN DeletePending
;
3387 BOOLEAN WriteAccess
;
3388 BOOLEAN DeleteAccess
;
3390 BOOLEAN SharedWrite
;
3391 BOOLEAN SharedDelete
;
3393 UNICODE_STRING FileName
;
3394 LARGE_INTEGER CurrentByteOffset
;
3400 PIO_COMPLETION_CONTEXT CompletionContext
;
3402 typedef struct _FILE_OBJECT
*PFILE_OBJECT
;
3404 typedef enum _SECURITY_OPERATION_CODE
{
3405 SetSecurityDescriptor
,
3406 QuerySecurityDescriptor
,
3407 DeleteSecurityDescriptor
,
3408 AssignSecurityDescriptor
3409 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
3411 #define INITIAL_PRIVILEGE_COUNT 3
3413 typedef struct _INITIAL_PRIVILEGE_SET
{
3414 ULONG PrivilegeCount
;
3416 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
3417 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
3419 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
3420 #define SE_CREATE_TOKEN_PRIVILEGE 2
3421 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
3422 #define SE_LOCK_MEMORY_PRIVILEGE 4
3423 #define SE_INCREASE_QUOTA_PRIVILEGE 5
3424 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
3425 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
3426 #define SE_TCB_PRIVILEGE 7
3427 #define SE_SECURITY_PRIVILEGE 8
3428 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
3429 #define SE_LOAD_DRIVER_PRIVILEGE 10
3430 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
3431 #define SE_SYSTEMTIME_PRIVILEGE 12
3432 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
3433 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
3434 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
3435 #define SE_CREATE_PERMANENT_PRIVILEGE 16
3436 #define SE_BACKUP_PRIVILEGE 17
3437 #define SE_RESTORE_PRIVILEGE 18
3438 #define SE_SHUTDOWN_PRIVILEGE 19
3439 #define SE_DEBUG_PRIVILEGE 20
3440 #define SE_AUDIT_PRIVILEGE 21
3441 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
3442 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
3443 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
3444 #define SE_UNDOCK_PRIVILEGE 25
3445 #define SE_SYNC_AGENT_PRIVILEGE 26
3446 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
3447 #define SE_MANAGE_VOLUME_PRIVILEGE 28
3448 #define SE_IMPERSONATE_PRIVILEGE 29
3449 #define SE_CREATE_GLOBAL_PRIVILEGE 30
3450 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_GLOBAL_PRIVILEGE
3452 typedef struct _SECURITY_SUBJECT_CONTEXT
{
3453 PACCESS_TOKEN ClientToken
;
3454 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
3455 PACCESS_TOKEN PrimaryToken
;
3456 PVOID ProcessAuditId
;
3457 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
3459 #include <pshpack4.h>
3460 typedef struct _ACCESS_STATE
{
3462 BOOLEAN SecurityEvaluated
;
3463 BOOLEAN GenerateAudit
;
3464 BOOLEAN GenerateOnClose
;
3465 BOOLEAN PrivilegesAllocated
;
3467 ACCESS_MASK RemainingDesiredAccess
;
3468 ACCESS_MASK PreviouslyGrantedAccess
;
3469 ACCESS_MASK OriginalDesiredAccess
;
3470 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
3471 PSECURITY_DESCRIPTOR SecurityDescriptor
;
3474 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
3475 PRIVILEGE_SET PrivilegeSet
;
3478 BOOLEAN AuditPrivileges
;
3479 UNICODE_STRING ObjectName
;
3480 UNICODE_STRING ObjectTypeName
;
3481 } ACCESS_STATE
, *PACCESS_STATE
;
3482 #include <poppack.h>
3484 typedef struct _IO_SECURITY_CONTEXT
{
3485 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
3486 PACCESS_STATE AccessState
;
3487 ACCESS_MASK DesiredAccess
;
3488 ULONG FullCreateOptions
;
3489 } IO_SECURITY_CONTEXT
, *PIO_SECURITY_CONTEXT
;
3491 #define IO_TYPE_ADAPTER 1
3492 #define IO_TYPE_CONTROLLER 2
3493 #define IO_TYPE_DEVICE 3
3494 #define IO_TYPE_DRIVER 4
3495 #define IO_TYPE_FILE 5
3496 #define IO_TYPE_IRP 6
3497 #define IO_TYPE_MASTER_ADAPTER 7
3498 #define IO_TYPE_OPEN_PACKET 8
3499 #define IO_TYPE_TIMER 9
3500 #define IO_TYPE_VPB 10
3501 #define IO_TYPE_ERROR_LOG 11
3502 #define IO_TYPE_ERROR_MESSAGE 12
3503 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
3505 #define IO_TYPE_CSQ_IRP_CONTEXT 1
3506 #define IO_TYPE_CSQ 2
3510 typedef struct _IO_CSQ_IRP_CONTEXT
{
3513 struct _IO_CSQ
*Csq
;
3514 } IO_CSQ_IRP_CONTEXT
, *PIO_CSQ_IRP_CONTEXT
;
3517 (DDKAPI
*PIO_CSQ_INSERT_IRP
)(
3518 IN
struct _IO_CSQ
*Csq
,
3522 (DDKAPI
*PIO_CSQ_REMOVE_IRP
)(
3523 IN
struct _IO_CSQ
*Csq
,
3527 (DDKAPI
*PIO_CSQ_PEEK_NEXT_IRP
)(
3528 IN
struct _IO_CSQ
*Csq
,
3530 IN PVOID PeekContext
);
3533 (DDKAPI
*PIO_CSQ_ACQUIRE_LOCK
)(
3534 IN
struct _IO_CSQ
*Csq
,
3538 (DDKAPI
*PIO_CSQ_RELEASE_LOCK
)(
3539 IN
struct _IO_CSQ
*Csq
,
3543 (DDKAPI
*PIO_CSQ_COMPLETE_CANCELED_IRP
)(
3544 IN
struct _IO_CSQ
*Csq
,
3547 typedef struct _IO_CSQ
{
3549 PIO_CSQ_INSERT_IRP CsqInsertIrp
;
3550 PIO_CSQ_REMOVE_IRP CsqRemoveIrp
;
3551 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
;
3552 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
;
3553 PIO_CSQ_RELEASE_LOCK CsqReleaseLock
;
3554 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
;
3555 PVOID ReservePointer
;
3558 #if !defined(_ALPHA_)
3559 #include <pshpack4.h>
3561 typedef struct _IO_STACK_LOCATION
{
3562 UCHAR MajorFunction
;
3563 UCHAR MinorFunction
;
3568 PIO_SECURITY_CONTEXT SecurityContext
;
3570 USHORT POINTER_ALIGNMENT FileAttributes
;
3572 ULONG POINTER_ALIGNMENT EaLength
;
3576 ULONG POINTER_ALIGNMENT Key
;
3577 LARGE_INTEGER ByteOffset
;
3581 ULONG POINTER_ALIGNMENT Key
;
3582 LARGE_INTEGER ByteOffset
;
3586 PUNICODE_STRING FileName
;
3587 FILE_INFORMATION_CLASS FileInformationClass
;
3592 ULONG CompletionFilter
;
3596 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
3600 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
3601 PFILE_OBJECT FileObject
;
3602 _ANONYMOUS_UNION
union {
3603 _ANONYMOUS_STRUCT
struct {
3604 BOOLEAN ReplaceIfExists
;
3605 BOOLEAN AdvanceOnly
;
3608 HANDLE DeleteHandle
;
3622 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass
;
3626 FS_INFORMATION_CLASS FsInformationClass
;
3629 ULONG OutputBufferLength
;
3630 ULONG InputBufferLength
;
3631 ULONG FsControlCode
;
3632 PVOID Type3InputBuffer
;
3633 } FileSystemControl
;
3635 PLARGE_INTEGER Length
;
3637 LARGE_INTEGER ByteOffset
;
3640 ULONG OutputBufferLength
;
3641 ULONG POINTER_ALIGNMENT InputBufferLength
;
3642 ULONG POINTER_ALIGNMENT IoControlCode
;
3643 PVOID Type3InputBuffer
;
3646 SECURITY_INFORMATION SecurityInformation
;
3647 ULONG POINTER_ALIGNMENT Length
;
3650 SECURITY_INFORMATION SecurityInformation
;
3651 PSECURITY_DESCRIPTOR SecurityDescriptor
;
3655 PDEVICE_OBJECT DeviceObject
;
3659 PDEVICE_OBJECT DeviceObject
;
3662 struct _SCSI_REQUEST_BLOCK
*Srb
;
3667 struct _FILE_GET_QUOTA_INFORMATION
*SidList
;
3668 ULONG SidListLength
;
3674 DEVICE_RELATION_TYPE Type
;
3675 } QueryDeviceRelations
;
3677 CONST GUID
*InterfaceType
;
3680 PINTERFACE Interface
;
3681 PVOID InterfaceSpecificData
;
3684 PDEVICE_CAPABILITIES Capabilities
;
3685 } DeviceCapabilities
;
3687 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList
;
3688 } FilterResourceRequirements
;
3693 ULONG POINTER_ALIGNMENT Length
;
3699 BUS_QUERY_ID_TYPE IdType
;
3702 DEVICE_TEXT_TYPE DeviceTextType
;
3703 LCID POINTER_ALIGNMENT LocaleId
;
3707 BOOLEAN Reserved
[3];
3708 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type
;
3709 } UsageNotification
;
3711 SYSTEM_POWER_STATE PowerState
;
3714 PPOWER_SEQUENCE PowerSequence
;
3717 ULONG SystemContext
;
3718 POWER_STATE_TYPE POINTER_ALIGNMENT Type
;
3719 POWER_STATE POINTER_ALIGNMENT State
;
3720 POWER_ACTION POINTER_ALIGNMENT ShutdownType
;
3723 PCM_RESOURCE_LIST AllocatedResources
;
3724 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
3727 ULONG_PTR ProviderId
;
3739 PDEVICE_OBJECT DeviceObject
;
3740 PFILE_OBJECT FileObject
;
3741 PIO_COMPLETION_ROUTINE CompletionRoutine
;
3743 } IO_STACK_LOCATION
, *PIO_STACK_LOCATION
;
3744 #if !defined(_ALPHA_)
3745 #include <poppack.h>
3748 /* IO_STACK_LOCATION.Control */
3750 #define SL_PENDING_RETURNED 0x01
3751 #define SL_INVOKE_ON_CANCEL 0x20
3752 #define SL_INVOKE_ON_SUCCESS 0x40
3753 #define SL_INVOKE_ON_ERROR 0x80
3755 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
3757 #define PCI_WHICHSPACE_CONFIG 0x0
3758 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
3760 typedef enum _KEY_INFORMATION_CLASS
{
3761 KeyBasicInformation
,
3765 KeyCachedInformation
,
3767 } KEY_INFORMATION_CLASS
;
3769 typedef struct _KEY_BASIC_INFORMATION
{
3770 LARGE_INTEGER LastWriteTime
;
3774 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
3776 typedef struct _KEY_FULL_INFORMATION
{
3777 LARGE_INTEGER LastWriteTime
;
3785 ULONG MaxValueNameLen
;
3786 ULONG MaxValueDataLen
;
3788 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
3790 typedef struct _KEY_NODE_INFORMATION
{
3791 LARGE_INTEGER LastWriteTime
;
3797 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
3799 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
3804 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
3806 typedef struct _KEY_VALUE_FULL_INFORMATION
{
3813 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
3815 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
3820 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
3822 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
3826 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
3828 typedef struct _KEY_VALUE_ENTRY
{
3829 PUNICODE_STRING ValueName
;
3833 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
3835 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
3836 KeyValueBasicInformation
,
3837 KeyValueFullInformation
,
3838 KeyValuePartialInformation
,
3839 KeyValueFullInformationAlign64
,
3840 KeyValuePartialInformationAlign64
3841 } KEY_VALUE_INFORMATION_CLASS
;
3843 typedef struct _KEY_WRITE_TIME_INFORMATION
{
3844 LARGE_INTEGER LastWriteTime
;
3845 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
3847 typedef struct _KEY_USER_FLAGS_INFORMATION
{
3849 } KEY_USER_FLAGS_INFORMATION
, *PKEY_USER_FLAGS_INFORMATION
;
3851 typedef enum _KEY_SET_INFORMATION_CLASS
{
3852 KeyWriteTimeInformation
,
3853 KeyUserFlagsInformation
,
3855 } KEY_SET_INFORMATION_CLASS
;
3857 #define REG_CREATED_NEW_KEY 0x00000001L
3858 #define REG_OPENED_EXISTING_KEY 0x00000002L
3861 /* KEY_VALUE_Xxx.Type */
3865 #define REG_EXPAND_SZ 2
3866 #define REG_BINARY 3
3868 #define REG_DWORD_LITTLE_ENDIAN 4
3869 #define REG_DWORD_BIG_ENDIAN 5
3871 #define REG_MULTI_SZ 7
3872 #define REG_RESOURCE_LIST 8
3873 #define REG_FULL_RESOURCE_DESCRIPTOR 9
3874 #define REG_RESOURCE_REQUIREMENTS_LIST 10
3875 #define REG_QWORD 11
3876 #define REG_QWORD_LITTLE_ENDIAN 11
3878 #define PCI_TYPE0_ADDRESSES 6
3879 #define PCI_TYPE1_ADDRESSES 2
3880 #define PCI_TYPE2_ADDRESSES 5
3882 typedef struct _PCI_COMMON_CONFIG
{
3891 UCHAR CacheLineSize
;
3896 struct _PCI_HEADER_TYPE_0
{
3897 ULONG BaseAddresses
[PCI_TYPE0_ADDRESSES
];
3901 ULONG ROMBaseAddress
;
3902 UCHAR CapabilitiesPtr
;
3905 UCHAR InterruptLine
;
3908 UCHAR MaximumLatency
;
3910 struct _PCI_HEADER_TYPE_1
{
3911 ULONG BaseAddresses
[PCI_TYPE1_ADDRESSES
];
3914 UCHAR SubordinateBus
;
3915 UCHAR SecondaryLatency
;
3918 USHORT SecondaryStatus
;
3921 USHORT PrefetchBase
;
3922 USHORT PrefetchLimit
;
3923 ULONG PrefetchBaseUpper32
;
3924 ULONG PrefetchLimitUpper32
;
3925 USHORT IOBaseUpper16
;
3926 USHORT IOLimitUpper16
;
3927 UCHAR CapabilitiesPtr
;
3929 ULONG ROMBaseAddress
;
3930 UCHAR InterruptLine
;
3932 USHORT BridgeControl
;
3934 struct _PCI_HEADER_TYPE_2
{
3935 ULONG SocketRegistersBaseAddress
;
3936 UCHAR CapabilitiesPtr
;
3938 USHORT SecondaryStatus
;
3941 UCHAR SubordinateBus
;
3942 UCHAR SecondaryLatency
;
3946 } Range
[PCI_TYPE2_ADDRESSES
- 1];
3947 UCHAR InterruptLine
;
3949 USHORT BridgeControl
;
3952 UCHAR DeviceSpecific
[192];
3953 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
3955 /* PCI_COMMON_CONFIG.Command */
3957 #define PCI_ENABLE_IO_SPACE 0x0001
3958 #define PCI_ENABLE_MEMORY_SPACE 0x0002
3959 #define PCI_ENABLE_BUS_MASTER 0x0004
3960 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
3961 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
3962 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
3963 #define PCI_ENABLE_PARITY 0x0040
3964 #define PCI_ENABLE_WAIT_CYCLE 0x0080
3965 #define PCI_ENABLE_SERR 0x0100
3966 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
3968 /* PCI_COMMON_CONFIG.Status */
3970 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
3971 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
3972 #define PCI_STATUS_UDF_SUPPORTED 0x0040
3973 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
3974 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
3975 #define PCI_STATUS_DEVSEL 0x0600
3976 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
3977 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
3978 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
3979 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
3980 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
3982 /* PCI_COMMON_CONFIG.HeaderType */
3984 #define PCI_MULTIFUNCTION 0x80
3985 #define PCI_DEVICE_TYPE 0x00
3986 #define PCI_BRIDGE_TYPE 0x01
3987 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
3989 #define PCI_CONFIGURATION_TYPE(PciData) \
3990 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
3992 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
3993 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
3995 /* PCI device classes */
3997 #define PCI_CLASS_PRE_20 0x00
3998 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
3999 #define PCI_CLASS_NETWORK_CTLR 0x02
4000 #define PCI_CLASS_DISPLAY_CTLR 0x03
4001 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
4002 #define PCI_CLASS_MEMORY_CTLR 0x05
4003 #define PCI_CLASS_BRIDGE_DEV 0x06
4004 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
4005 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
4006 #define PCI_CLASS_INPUT_DEV 0x09
4007 #define PCI_CLASS_DOCKING_STATION 0x0a
4008 #define PCI_CLASS_PROCESSOR 0x0b
4009 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
4011 /* PCI device subclasses for class 0 */
4013 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
4014 #define PCI_SUBCLASS_PRE_20_VGA 0x01
4016 /* PCI device subclasses for class 1 (mass storage controllers)*/
4018 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
4019 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
4020 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
4021 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
4022 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
4023 #define PCI_SUBCLASS_MSC_OTHER 0x80
4025 /* PCI device subclasses for class 2 (network controllers)*/
4027 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
4028 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
4029 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
4030 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
4031 #define PCI_SUBCLASS_NET_OTHER 0x80
4033 /* PCI device subclasses for class 3 (display controllers)*/
4035 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
4036 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
4037 #define PCI_SUBLCASS_VID_3D_CTLR 0x02
4038 #define PCI_SUBCLASS_VID_OTHER 0x80
4040 /* PCI device subclasses for class 4 (multimedia device)*/
4042 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
4043 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
4044 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
4045 #define PCI_SUBCLASS_MM_OTHER 0x80
4047 /* PCI device subclasses for class 5 (memory controller)*/
4049 #define PCI_SUBCLASS_MEM_RAM 0x00
4050 #define PCI_SUBCLASS_MEM_FLASH 0x01
4051 #define PCI_SUBCLASS_MEM_OTHER 0x80
4053 /* PCI device subclasses for class 6 (bridge device)*/
4055 #define PCI_SUBCLASS_BR_HOST 0x00
4056 #define PCI_SUBCLASS_BR_ISA 0x01
4057 #define PCI_SUBCLASS_BR_EISA 0x02
4058 #define PCI_SUBCLASS_BR_MCA 0x03
4059 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
4060 #define PCI_SUBCLASS_BR_PCMCIA 0x05
4061 #define PCI_SUBCLASS_BR_NUBUS 0x06
4062 #define PCI_SUBCLASS_BR_CARDBUS 0x07
4063 #define PCI_SUBCLASS_BR_OTHER 0x80
4065 /* PCI device subclasses for class C (serial bus controller)*/
4067 #define PCI_SUBCLASS_SB_IEEE1394 0x00
4068 #define PCI_SUBCLASS_SB_ACCESS 0x01
4069 #define PCI_SUBCLASS_SB_SSA 0x02
4070 #define PCI_SUBCLASS_SB_USB 0x03
4071 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
4073 #define PCI_MAX_DEVICES 32
4074 #define PCI_MAX_FUNCTION 8
4075 #define PCI_MAX_BRIDGE_NUMBER 0xFF
4076 #define PCI_INVALID_VENDORID 0xFFFF
4077 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
4079 #define PCI_ADDRESS_IO_SPACE 0x01
4080 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x06
4081 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x08
4082 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
4083 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
4084 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
4086 #define PCI_TYPE_32BIT 0
4087 #define PCI_TYPE_20BIT 2
4088 #define PCI_TYPE_64BIT 4
4090 typedef struct _PCI_SLOT_NUMBER
{
4093 ULONG DeviceNumber
: 5;
4094 ULONG FunctionNumber
: 3;
4095 ULONG Reserved
: 24;
4099 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
4101 typedef enum _POOL_TYPE
{
4104 NonPagedPoolMustSucceed
,
4106 NonPagedPoolCacheAligned
,
4107 PagedPoolCacheAligned
,
4108 NonPagedPoolCacheAlignedMustS
,
4110 NonPagedPoolSession
= 32,
4112 NonPagedPoolMustSucceedSession
,
4113 DontUseThisTypeSession
,
4114 NonPagedPoolCacheAlignedSession
,
4115 PagedPoolCacheAlignedSession
,
4116 NonPagedPoolCacheAlignedMustSSession
4119 #define POOL_COLD_ALLOCATION 256
4120 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
4121 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
4124 typedef enum _EX_POOL_PRIORITY
{
4126 LowPoolPrioritySpecialPoolOverrun
= 8,
4127 LowPoolPrioritySpecialPoolUnderrun
= 9,
4128 NormalPoolPriority
= 16,
4129 NormalPoolPrioritySpecialPoolOverrun
= 24,
4130 NormalPoolPrioritySpecialPoolUnderrun
= 25,
4131 HighPoolPriority
= 32,
4132 HighPoolPrioritySpecialPoolOverrun
= 40,
4133 HighPoolPrioritySpecialPoolUnderrun
= 41
4136 /* PRIVILEGE_SET.Control */
4138 #define PRIVILEGE_SET_ALL_NECESSARY 1
4140 typedef struct _RTL_OSVERSIONINFOW
{
4141 ULONG dwOSVersionInfoSize
;
4142 ULONG dwMajorVersion
;
4143 ULONG dwMinorVersion
;
4144 ULONG dwBuildNumber
;
4146 WCHAR szCSDVersion
[128];
4147 } RTL_OSVERSIONINFOW
, *PRTL_OSVERSIONINFOW
;
4149 typedef struct _RTL_OSVERSIONINFOEXW
{
4150 ULONG dwOSVersionInfoSize
;
4151 ULONG dwMajorVersion
;
4152 ULONG dwMinorVersion
;
4153 ULONG dwBuildNumber
;
4155 WCHAR szCSDVersion
[128];
4156 USHORT wServicePackMajor
;
4157 USHORT wServicePackMinor
;
4161 } RTL_OSVERSIONINFOEXW
, *PRTL_OSVERSIONINFOEXW
;
4166 VerSetConditionMask(
4167 IN ULONGLONG ConditionMask
,
4169 IN UCHAR Condition
);
4171 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
4172 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
4173 (TypeBitMask), (ComparisonType)))
4175 /* RtlVerifyVersionInfo() TypeMask */
4177 #define VER_MINORVERSION 0x0000001
4178 #define VER_MAJORVERSION 0x0000002
4179 #define VER_BUILDNUMBER 0x0000004
4180 #define VER_PLATFORMID 0x0000008
4181 #define VER_SERVICEPACKMINOR 0x0000010
4182 #define VER_SERVICEPACKMAJOR 0x0000020
4183 #define VER_SUITENAME 0x0000040
4184 #define VER_PRODUCT_TYPE 0x0000080
4186 /* RtlVerifyVersionInfo() ComparisonType */
4189 #define VER_GREATER 2
4190 #define VER_GREATER_EQUAL 3
4192 #define VER_LESS_EQUAL 5
4196 #define VER_CONDITION_MASK 7
4197 #define VER_NUM_BITS_PER_CONDITION_MASK 3
4199 typedef struct _RTL_BITMAP
{
4202 } RTL_BITMAP
, *PRTL_BITMAP
;
4204 typedef struct _RTL_BITMAP_RUN
{
4205 ULONG StartingIndex
;
4207 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
4210 (NTAPI
*PRTL_CONFLICT_RANGE_CALLBACK
) (
4212 struct _RTL_RANGE
*Range
4216 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
4220 IN ULONG ValueLength
,
4222 IN PVOID EntryContext
);
4224 #define RTL_REGISTRY_ABSOLUTE 0
4225 #define RTL_REGISTRY_SERVICES 1
4226 #define RTL_REGISTRY_CONTROL 2
4227 #define RTL_REGISTRY_WINDOWS_NT 3
4228 #define RTL_REGISTRY_DEVICEMAP 4
4229 #define RTL_REGISTRY_USER 5
4230 #define RTL_REGISTRY_HANDLE 0x40000000
4231 #define RTL_REGISTRY_OPTIONAL 0x80000000
4233 /* RTL_QUERY_REGISTRY_TABLE.Flags */
4234 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
4235 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
4236 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
4237 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
4238 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
4239 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
4240 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
4242 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
4243 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
4249 ULONG DefaultLength
;
4250 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
4252 typedef struct _TIME_FIELDS
{
4259 CSHORT Milliseconds
;
4261 } TIME_FIELDS
, *PTIME_FIELDS
;
4264 (DDKAPI
*PALLOCATE_FUNCTION
)(
4265 IN POOL_TYPE PoolType
,
4266 IN SIZE_T NumberOfBytes
,
4270 (DDKAPI
*PFREE_FUNCTION
)(
4273 typedef struct _GENERAL_LOOKASIDE
{
4274 SLIST_HEADER ListHead
;
4276 USHORT MaximumDepth
;
4277 ULONG TotalAllocates
;
4279 ULONG AllocateMisses
;
4290 PALLOCATE_FUNCTION Allocate
;
4291 PFREE_FUNCTION Free
;
4292 LIST_ENTRY ListEntry
;
4293 ULONG LastTotalAllocates
;
4295 ULONG LastAllocateMisses
;
4296 ULONG LastAllocateHits
;
4299 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
4301 typedef struct _NPAGED_LOOKASIDE_LIST
{
4302 GENERAL_LOOKASIDE L
;
4303 KSPIN_LOCK Obsoleted
;
4304 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
4306 typedef struct _PAGED_LOOKASIDE_LIST
{
4307 GENERAL_LOOKASIDE L
;
4308 FAST_MUTEX Obsoleted
;
4309 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
4311 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
4314 (DDKAPI
*PCALLBACK_FUNCTION
)(
4315 IN PVOID CallbackContext
,
4317 IN PVOID Argument2
);
4319 typedef enum _EVENT_TYPE
{
4321 SynchronizationEvent
4324 typedef enum _KWAIT_REASON
{
4362 typedef struct _KWAIT_BLOCK
{
4363 LIST_ENTRY WaitListEntry
;
4364 struct _KTHREAD
* RESTRICTED_POINTER Thread
;
4366 struct _KWAIT_BLOCK
* RESTRICTED_POINTER NextWaitBlock
;
4370 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *RESTRICTED_POINTER PRKWAIT_BLOCK
;
4372 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
4374 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
4376 BOOLEAN Reserved
[3];
4379 } IO_REMOVE_LOCK_COMMON_BLOCK
;
4381 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
4384 LONGLONG MaxLockedTicks
;
4386 LIST_ENTRY LockList
;
4388 LONG LowMemoryCount
;
4391 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
4392 } IO_REMOVE_LOCK_DBG_BLOCK
;
4394 typedef struct _IO_REMOVE_LOCK
{
4395 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
4397 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
4399 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
4401 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
4404 (DDKAPI
*PIO_WORKITEM_ROUTINE
)(
4405 IN PDEVICE_OBJECT DeviceObject
,
4408 typedef struct _SHARE_ACCESS
{
4416 } SHARE_ACCESS
, *PSHARE_ACCESS
;
4418 typedef enum _KINTERRUPT_MODE
{
4423 #define THREAD_WAIT_OBJECTS 3
4426 (DDKAPI
*PKINTERRUPT_ROUTINE
)(
4429 typedef enum _KPROFILE_SOURCE
{
4431 ProfileAlignmentFixup
,
4434 ProfileLoadInstructions
,
4435 ProfilePipelineFrozen
,
4436 ProfileBranchInstructions
,
4437 ProfileTotalNonissues
,
4438 ProfileDcacheMisses
,
4439 ProfileIcacheMisses
,
4441 ProfileBranchMispredictions
,
4442 ProfileStoreInstructions
,
4443 ProfileFpInstructions
,
4444 ProfileIntegerInstructions
,
4448 ProfileSpecialInstructions
,
4450 ProfileIcacheIssues
,
4451 ProfileDcacheAccesses
,
4452 ProfileMemoryBarrierCycles
,
4453 ProfileLoadLinkedIssues
,
4457 typedef enum _CREATE_FILE_TYPE
{
4459 CreateFileTypeNamedPipe
,
4460 CreateFileTypeMailslot
4463 typedef struct _CONFIGURATION_INFORMATION
{
4468 ULONG ScsiPortCount
;
4470 ULONG ParallelCount
;
4471 BOOLEAN AtDiskPrimaryAddressClaimed
;
4472 BOOLEAN AtDiskSecondaryAddressClaimed
;
4474 ULONG MediumChangerCount
;
4475 } CONFIGURATION_INFORMATION
, *PCONFIGURATION_INFORMATION
;
4477 typedef enum _CONFIGURATION_TYPE
{
4480 FloatingPointProcessor
,
4490 MultiFunctionAdapter
,
4504 FloppyDiskPeripheral
,
4517 RealModeIrqRoutingTable
,
4519 } CONFIGURATION_TYPE
, *PCONFIGURATION_TYPE
;
4521 #define IO_FORCE_ACCESS_CHECK 0x001
4522 #define IO_NO_PARAMETER_CHECKING 0x100
4525 (DDKAPI
*PIO_QUERY_DEVICE_ROUTINE
)(
4527 IN PUNICODE_STRING PathName
,
4528 IN INTERFACE_TYPE BusType
,
4530 IN PKEY_VALUE_FULL_INFORMATION
*BusInformation
,
4531 IN CONFIGURATION_TYPE ControllerType
,
4532 IN ULONG ControllerNumber
,
4533 IN PKEY_VALUE_FULL_INFORMATION
*ControllerInformation
,
4534 IN CONFIGURATION_TYPE PeripheralType
,
4535 IN ULONG PeripheralNumber
,
4536 IN PKEY_VALUE_FULL_INFORMATION
*PeripheralInformation
);
4538 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT
{
4539 IoQueryDeviceIdentifier
= 0,
4540 IoQueryDeviceConfigurationData
,
4541 IoQueryDeviceComponentInformation
,
4542 IoQueryDeviceMaxData
4543 } IO_QUERY_DEVICE_DATA_FORMAT
, *PIO_QUERY_DEVICE_DATA_FORMAT
;
4545 typedef enum _WORK_QUEUE_TYPE
{
4548 HyperCriticalWorkQueue
,
4553 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
4554 IN PVOID Parameter
);
4556 typedef struct _WORK_QUEUE_ITEM
{
4558 PWORKER_THREAD_ROUTINE WorkerRoutine
;
4560 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
4562 typedef enum _KBUGCHECK_CALLBACK_REASON
{
4564 KbCallbackReserved1
,
4565 KbCallbackSecondaryDumpData
,
4567 } KBUGCHECK_CALLBACK_REASON
;
4570 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
4571 IN KBUGCHECK_CALLBACK_REASON Reason
,
4572 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
4573 IN OUT PVOID ReasonSpecificData
,
4574 IN ULONG ReasonSpecificDataLength
);
4576 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
4578 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
4581 KBUGCHECK_CALLBACK_REASON Reason
;
4583 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
4585 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
4591 } KBUGCHECK_BUFFER_DUMP_STATE
;
4594 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
4598 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
4600 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
4606 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
4610 * KeInitializeCallbackRecord(
4611 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
4613 #define KeInitializeCallbackRecord(CallbackRecord) \
4614 CallbackRecord->State = BufferEmpty;
4616 typedef enum _KDPC_IMPORTANCE
{
4622 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
4623 MmFrameBufferCached
= 2
4624 } MEMORY_CACHING_TYPE_ORIG
;
4626 typedef enum _MEMORY_CACHING_TYPE
{
4627 MmNonCached
= FALSE
,
4629 MmWriteCombined
= MmFrameBufferCached
,
4630 MmHardwareCoherentCached
,
4631 MmNonCachedUnordered
,
4634 } MEMORY_CACHING_TYPE
;
4636 typedef enum _MM_PAGE_PRIORITY
{
4638 NormalPagePriority
= 16,
4639 HighPagePriority
= 32
4642 typedef enum _LOCK_OPERATION
{
4648 typedef enum _MM_SYSTEM_SIZE
{
4654 typedef struct _OBJECT_HANDLE_INFORMATION
{
4655 ULONG HandleAttributes
;
4656 ACCESS_MASK GrantedAccess
;
4657 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
4659 typedef struct _CLIENT_ID
{
4660 HANDLE UniqueProcess
;
4661 HANDLE UniqueThread
;
4662 } CLIENT_ID
, *PCLIENT_ID
;
4665 (DDKAPI
*PKSTART_ROUTINE
)(
4666 IN PVOID StartContext
);
4669 (DDKAPI
*PCREATE_PROCESS_NOTIFY_ROUTINE
)(
4671 IN HANDLE ProcessId
,
4675 (DDKAPI
*PCREATE_THREAD_NOTIFY_ROUTINE
)(
4676 IN HANDLE ProcessId
,
4680 typedef struct _IMAGE_INFO
{
4681 _ANONYMOUS_UNION
union {
4683 _ANONYMOUS_STRUCT
struct {
4684 ULONG ImageAddressingMode
: 8;
4685 ULONG SystemModeImage
: 1;
4686 ULONG ImageMappedToAllPids
: 1;
4687 ULONG Reserved
: 22;
4691 ULONG ImageSelector
;
4693 ULONG ImageSectionNumber
;
4694 } IMAGE_INFO
, *PIMAGE_INFO
;
4696 #define IMAGE_ADDRESSING_MODE_32BIT 3
4699 (DDKAPI
*PLOAD_IMAGE_NOTIFY_ROUTINE
)(
4700 IN PUNICODE_STRING FullImageName
,
4701 IN HANDLE ProcessId
,
4702 IN PIMAGE_INFO ImageInfo
);
4704 typedef enum _PROCESSINFOCLASS
{
4705 ProcessBasicInformation
,
4710 ProcessBasePriority
,
4711 ProcessRaisePriority
,
4713 ProcessExceptionPort
,
4715 ProcessLdtInformation
,
4717 ProcessDefaultHardErrorMode
,
4718 ProcessIoPortHandlers
,
4719 ProcessPooledUsageAndLimits
,
4720 ProcessWorkingSetWatch
,
4721 ProcessUserModeIOPL
,
4722 ProcessEnableAlignmentFaultFixup
,
4723 ProcessPriorityClass
,
4724 ProcessWx86Information
,
4726 ProcessAffinityMask
,
4727 ProcessPriorityBoost
,
4729 ProcessSessionInformation
,
4730 ProcessForegroundInformation
,
4731 ProcessWow64Information
,
4732 ProcessImageFileName
,
4733 ProcessLUIDDeviceMapsEnabled
,
4734 ProcessBreakOnTermination
,
4735 ProcessDebugObjectHandle
,
4737 ProcessHandleTracing
,
4739 ProcessExecuteFlags
,
4740 ProcessTlsInformation
,
4742 ProcessImageInformation
,
4744 ProcessPagePriority
,
4745 ProcessInstrumentationCallback
,
4749 typedef enum _THREADINFOCLASS
{
4750 ThreadBasicInformation
,
4755 ThreadImpersonationToken
,
4756 ThreadDescriptorTableEntry
,
4757 ThreadEnableAlignmentFaultFixup
,
4758 ThreadEventPair_Reusable
,
4759 ThreadQuerySetWin32StartAddress
,
4761 ThreadPerformanceCount
,
4762 ThreadAmILastThread
,
4763 ThreadIdealProcessor
,
4764 ThreadPriorityBoost
,
4765 ThreadSetTlsArrayAddress
,
4767 ThreadHideFromDebugger
,
4768 ThreadBreakOnTermination
,
4769 ThreadSwitchLegacyState
,
4771 ThreadLastSystemCall
,
4775 ThreadActualBasePriority
,
4779 typedef struct _PROCESS_BASIC_INFORMATION
4781 NTSTATUS ExitStatus
;
4782 PPEB PebBaseAddress
;
4783 ULONG_PTR AffinityMask
;
4784 KPRIORITY BasePriority
;
4785 ULONG_PTR UniqueProcessId
;
4786 ULONG_PTR InheritedFromUniqueProcessId
;
4787 } PROCESS_BASIC_INFORMATION
,*PPROCESS_BASIC_INFORMATION
;
4789 typedef struct _PROCESS_WS_WATCH_INFORMATION
4793 } PROCESS_WS_WATCH_INFORMATION
, *PPROCESS_WS_WATCH_INFORMATION
;
4795 typedef struct _PROCESS_DEVICEMAP_INFORMATION
4801 HANDLE DirectoryHandle
;
4806 UCHAR DriveType
[32];
4809 } PROCESS_DEVICEMAP_INFORMATION
, *PPROCESS_DEVICEMAP_INFORMATION
;
4811 typedef struct _KERNEL_USER_TIMES
4813 LARGE_INTEGER CreateTime
;
4814 LARGE_INTEGER ExitTime
;
4815 LARGE_INTEGER KernelTime
;
4816 LARGE_INTEGER UserTime
;
4817 } KERNEL_USER_TIMES
, *PKERNEL_USER_TIMES
;
4819 typedef struct _PROCESS_ACCESS_TOKEN
4823 } PROCESS_ACCESS_TOKEN
, *PPROCESS_ACCESS_TOKEN
;
4825 typedef struct _PROCESS_SESSION_INFORMATION
4828 } PROCESS_SESSION_INFORMATION
, *PPROCESS_SESSION_INFORMATION
;
4830 #define ES_SYSTEM_REQUIRED 0x00000001
4831 #define ES_DISPLAY_REQUIRED 0x00000002
4832 #define ES_USER_PRESENT 0x00000004
4833 #define ES_CONTINUOUS 0x80000000
4835 typedef ULONG EXECUTION_STATE
;
4838 (DDKAPI
*PREQUEST_POWER_COMPLETE
)(
4839 IN PDEVICE_OBJECT DeviceObject
,
4840 IN UCHAR MinorFunction
,
4841 IN POWER_STATE PowerState
,
4843 IN PIO_STATUS_BLOCK IoStatus
);
4845 typedef enum _TRACE_INFORMATION_CLASS
{
4848 TraceEnableFlagsClass
,
4849 TraceEnableLevelClass
,
4850 GlobalLoggerHandleClass
,
4851 EventLoggerHandleClass
,
4852 AllLoggerHandlesClass
,
4853 TraceHandleByNameClass
4854 } TRACE_INFORMATION_CLASS
;
4856 typedef enum _REG_NOTIFY_CLASS
4859 RegNtPreDeleteKey
= RegNtDeleteKey
,
4861 RegNtPreSetValueKey
= RegNtSetValueKey
,
4862 RegNtDeleteValueKey
,
4863 RegNtPreDeleteValueKey
= RegNtDeleteValueKey
,
4864 RegNtSetInformationKey
,
4865 RegNtPreSetInformationKey
= RegNtSetInformationKey
,
4867 RegNtPreRenameKey
= RegNtRenameKey
,
4869 RegNtPreEnumerateKey
= RegNtEnumerateKey
,
4870 RegNtEnumerateValueKey
,
4871 RegNtPreEnumerateValueKey
= RegNtEnumerateValueKey
,
4873 RegNtPreQueryKey
= RegNtQueryKey
,
4875 RegNtPreQueryValueKey
= RegNtQueryValueKey
,
4876 RegNtQueryMultipleValueKey
,
4877 RegNtPreQueryMultipleValueKey
= RegNtQueryMultipleValueKey
,
4882 RegNtKeyHandleClose
,
4883 RegNtPreKeyHandleClose
= RegNtKeyHandleClose
,
4885 RegNtPostSetValueKey
,
4886 RegNtPostDeleteValueKey
,
4887 RegNtPostSetInformationKey
,
4889 RegNtPostEnumerateKey
,
4890 RegNtPostEnumerateValueKey
,
4892 RegNtPostQueryValueKey
,
4893 RegNtPostQueryMultipleValueKey
,
4894 RegNtPostKeyHandleClose
,
4895 RegNtPreCreateKeyEx
,
4896 RegNtPostCreateKeyEx
,
4899 } REG_NOTIFY_CLASS
, *PREG_NOTIFY_CLASS
;
4902 (NTAPI
*PEX_CALLBACK_FUNCTION
)(
4903 IN PVOID CallbackContext
,
4908 typedef struct _REG_DELETE_KEY_INFORMATION
4911 } REG_DELETE_KEY_INFORMATION
, *PREG_DELETE_KEY_INFORMATION
;
4913 typedef struct _REG_SET_VALUE_KEY_INFORMATION
4916 PUNICODE_STRING ValueName
;
4921 } REG_SET_VALUE_KEY_INFORMATION
, *PREG_SET_VALUE_KEY_INFORMATION
;
4923 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION
4926 PUNICODE_STRING ValueName
;
4927 } REG_DELETE_VALUE_KEY_INFORMATION
, *PREG_DELETE_VALUE_KEY_INFORMATION
;
4929 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION
4932 KEY_SET_INFORMATION_CLASS KeySetInformationClass
;
4933 PVOID KeySetInformation
;
4934 ULONG KeySetInformationLength
;
4935 } REG_SET_INFORMATION_KEY_INFORMATION
, *PREG_SET_INFORMATION_KEY_INFORMATION
;
4937 typedef struct _REG_ENUMERATE_KEY_INFORMATION
4941 KEY_INFORMATION_CLASS KeyInformationClass
;
4942 PVOID KeyInformation
;
4944 PULONG ResultLength
;
4945 } REG_ENUMERATE_KEY_INFORMATION
, *PREG_ENUMERATE_KEY_INFORMATION
;
4947 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION
4951 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
4952 PVOID KeyValueInformation
;
4954 PULONG ResultLength
;
4955 } REG_ENUMERATE_VALUE_KEY_INFORMATION
, *PREG_ENUMERATE_VALUE_KEY_INFORMATION
;
4957 typedef struct _REG_QUERY_KEY_INFORMATION
4960 KEY_INFORMATION_CLASS KeyInformationClass
;
4961 PVOID KeyInformation
;
4963 PULONG ResultLength
;
4964 } REG_QUERY_KEY_INFORMATION
, *PREG_QUERY_KEY_INFORMATION
;
4966 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION
4969 PUNICODE_STRING ValueName
;
4970 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
;
4971 PVOID KeyValueInformation
;
4973 PULONG ResultLength
;
4974 } REG_QUERY_VALUE_KEY_INFORMATION
, *PREG_QUERY_VALUE_KEY_INFORMATION
;
4976 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
4979 PKEY_VALUE_ENTRY ValueEntries
;
4982 PULONG BufferLength
;
4983 PULONG RequiredBufferLength
;
4984 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION
;
4986 typedef struct _REG_PRE_CREATE_KEY_INFORMATION
4988 PUNICODE_STRING CompleteName
;
4989 } REG_PRE_CREATE_KEY_INFORMATION
, *PREG_PRE_CREATE_KEY_INFORMATION
;
4991 typedef struct _REG_POST_CREATE_KEY_INFORMATION
4993 PUNICODE_STRING CompleteName
;
4996 } REG_POST_CREATE_KEY_INFORMATION
, *PREG_POST_CREATE_KEY_INFORMATION
;
4998 typedef struct _REG_PRE_OPEN_KEY_INFORMATION
5000 PUNICODE_STRING CompleteName
;
5001 } REG_PRE_OPEN_KEY_INFORMATION
, *PREG_PRE_OPEN_KEY_INFORMATION
;
5003 typedef struct _REG_POST_OPEN_KEY_INFORMATION
5005 PUNICODE_STRING CompleteName
;
5008 } REG_POST_OPEN_KEY_INFORMATION
, *PREG_POST_OPEN_KEY_INFORMATION
;
5010 typedef struct _REG_POST_OPERATION_INFORMATION
5014 } REG_POST_OPERATION_INFORMATION
,*PREG_POST_OPERATION_INFORMATION
;
5016 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION
5019 } REG_KEY_HANDLE_CLOSE_INFORMATION
, *PREG_KEY_HANDLE_CLOSE_INFORMATION
;
5022 ** Storage structures
5024 typedef enum _PARTITION_STYLE
{
5025 PARTITION_STYLE_MBR
,
5029 typedef struct _CREATE_DISK_MBR
{
5031 } CREATE_DISK_MBR
, *PCREATE_DISK_MBR
;
5033 typedef struct _CREATE_DISK_GPT
{
5035 ULONG MaxPartitionCount
;
5036 } CREATE_DISK_GPT
, *PCREATE_DISK_GPT
;
5038 typedef struct _CREATE_DISK
{
5039 PARTITION_STYLE PartitionStyle
;
5040 _ANONYMOUS_UNION
union {
5041 CREATE_DISK_MBR Mbr
;
5042 CREATE_DISK_GPT Gpt
;
5044 } CREATE_DISK
, *PCREATE_DISK
;
5046 typedef struct _DISK_SIGNATURE
{
5047 ULONG PartitionStyle
;
5048 _ANONYMOUS_UNION
union {
5057 } DISK_SIGNATURE
, *PDISK_SIGNATURE
;
5060 (DDKFASTAPI
*PTIME_UPDATE_NOTIFY_ROUTINE
)(
5062 IN KPROCESSOR_MODE Mode
);
5064 #define DBG_STATUS_CONTROL_C 1
5065 #define DBG_STATUS_SYSRQ 2
5066 #define DBG_STATUS_BUGCHECK_FIRST 3
5067 #define DBG_STATUS_BUGCHECK_SECOND 4
5068 #define DBG_STATUS_FATAL 5
5069 #define DBG_STATUS_DEBUG_CONTROL 6
5070 #define DBG_STATUS_WORKER 7
5072 typedef struct _PHYSICAL_MEMORY_RANGE
{
5073 PHYSICAL_ADDRESS BaseAddress
;
5074 LARGE_INTEGER NumberOfBytes
;
5075 } PHYSICAL_MEMORY_RANGE
, *PPHYSICAL_MEMORY_RANGE
;
5078 (*PDRIVER_VERIFIER_THUNK_ROUTINE
)(
5081 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS
{
5082 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine
;
5083 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine
;
5084 } DRIVER_VERIFIER_THUNK_PAIRS
, *PDRIVER_VERIFIER_THUNK_PAIRS
;
5086 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
5087 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
5088 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
5089 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
5090 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
5092 #define HASH_STRING_ALGORITHM_DEFAULT 0
5093 #define HASH_STRING_ALGORITHM_X65599 1
5094 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
5096 typedef enum _SUITE_TYPE
{
5100 CommunicationServer
,
5102 SmallBusinessRestricted
,
5112 (DDKAPI
*PTIMER_APC_ROUTINE
)(
5113 IN PVOID TimerContext
,
5114 IN ULONG TimerLowValue
,
5115 IN LONG TimerHighValue
);
5124 (DDKAPI
*WMI_NOTIFICATION_CALLBACK
)(
5130 ** Architecture specific structures
5135 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
5137 #define PASSIVE_LEVEL 0
5140 #define DISPATCH_LEVEL 2
5141 #define PROFILE_LEVEL 27
5142 #define CLOCK1_LEVEL 28
5143 #define CLOCK2_LEVEL 28
5144 #define IPI_LEVEL 29
5145 #define POWER_LEVEL 30
5146 #define HIGH_LEVEL 31
5148 typedef struct _KPCR_TIB
{
5149 PVOID ExceptionList
; /* 00 */
5150 PVOID StackBase
; /* 04 */
5151 PVOID StackLimit
; /* 08 */
5152 PVOID SubSystemTib
; /* 0C */
5153 _ANONYMOUS_UNION
union {
5154 PVOID FiberData
; /* 10 */
5155 DWORD Version
; /* 10 */
5157 PVOID ArbitraryUserPointer
; /* 14 */
5158 struct _KPCR_TIB
*Self
; /* 18 */
5159 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
5161 #define PCR_MINOR_VERSION 1
5162 #define PCR_MAJOR_VERSION 1
5164 typedef struct _KPCR
{
5165 KPCR_TIB Tib
; /* 00 */
5166 struct _KPCR
*Self
; /* 1C */
5167 struct _KPRCB
*Prcb
; /* 20 */
5168 KIRQL Irql
; /* 24 */
5170 ULONG IrrActive
; /* 2C */
5172 PVOID KdVersionBlock
; /* 34 */
5173 PUSHORT IDT
; /* 38 */
5174 PUSHORT GDT
; /* 3C */
5175 struct _KTSS
*TSS
; /* 40 */
5176 USHORT MajorVersion
; /* 44 */
5177 USHORT MinorVersion
; /* 46 */
5178 KAFFINITY SetMember
; /* 48 */
5179 ULONG StallScaleFactor
; /* 4C */
5180 UCHAR SpareUnused
; /* 50 */
5181 UCHAR Number
; /* 51 */
5182 } KPCR
, *PKPCR
; /* 54 */
5184 typedef struct _KFLOATING_SAVE
{
5188 ULONG ErrorSelector
;
5193 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
5195 #define PAGE_SIZE 0x1000
5196 #define PAGE_SHIFT 12L
5198 extern NTOSAPI PVOID MmHighestUserAddress
;
5199 extern NTOSAPI PVOID MmSystemRangeStart
;
5200 extern NTOSAPI ULONG_PTR MmUserProbeAddress
;
5202 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5203 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5204 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5205 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5206 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
5208 #define KI_USER_SHARED_DATA 0xffdf0000
5209 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
5211 #define EFLAG_SIGN 0x8000
5212 #define EFLAG_ZERO 0x4000
5213 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
5215 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5216 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
5217 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
5219 typedef enum _INTERLOCKED_RESULT
{
5220 ResultNegative
= RESULT_NEGATIVE
,
5221 ResultZero
= RESULT_ZERO
,
5222 ResultPositive
= RESULT_POSITIVE
5223 } INTERLOCKED_RESULT
;
5234 KeGetCurrentProcessorNumber(VOID
)
5236 #if defined(__GNUC__)
5238 __asm__
__volatile__ (
5239 "movl %%fs:%c1, %0\n"
5241 : "i" (FIELD_OFFSET(KPCR
, Number
))
5244 #elif defined(_MSC_VER)
5245 #if _MSC_FULL_VER >= 13012035
5246 return (ULONG
)__readfsbyte(FIELD_OFFSET(KPCR
, Number
));
5248 __asm
{ movzx eax
, _PCR KPCR
.Number
}
5251 #error Unknown compiler
5255 #if !defined(__INTERLOCKED_DECLARED)
5256 #define __INTERLOCKED_DECLARED
5261 InterlockedIncrement(
5262 IN OUT LONG
volatile *Addend
);
5267 InterlockedDecrement(
5268 IN OUT LONG
volatile *Addend
);
5273 InterlockedCompareExchange(
5274 IN OUT LONG
volatile *Destination
,
5281 InterlockedExchange(
5282 IN OUT LONG
volatile *Destination
,
5288 InterlockedExchangeAdd(
5289 IN OUT LONG
volatile *Addend
,
5294 * InterlockedExchangePointer(
5295 * IN OUT PVOID VOLATILE *Target,
5298 #define InterlockedExchangePointer(Target, Value) \
5299 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
5303 * InterlockedCompareExchangePointer(
5304 * IN OUT PVOID *Destination,
5305 * IN PVOID Exchange,
5306 * IN PVOID Comparand)
5308 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
5309 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
5311 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
5312 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
5313 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
5315 #endif /* !__INTERLOCKED_DECLARED */
5320 KefAcquireSpinLockAtDpcLevel(
5321 IN PKSPIN_LOCK SpinLock
);
5326 KefReleaseSpinLockFromDpcLevel(
5327 IN PKSPIN_LOCK SpinLock
);
5333 IN PKSPIN_LOCK SpinLock
);
5339 IN PKSPIN_LOCK SpinLock
,
5342 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
5343 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
5344 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
5345 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
5347 #define RtlCopyMemoryNonTemporal RtlCopyMemory
5349 #define KeGetDcacheFillSize() 1L
5356 ** Utillity functions
5359 #define ARGUMENT_PRESENT(ArgumentPointer) \
5360 ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
5367 #define BYTE_OFFSET(Va) \
5368 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
5375 #define BYTES_TO_PAGES(Size) \
5376 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
5380 * CONTAINING_RECORD(
5385 #ifndef CONTAINING_RECORD
5386 #define CONTAINING_RECORD(address, type, field) \
5387 ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
5395 #ifndef FIELD_OFFSET
5396 #define FIELD_OFFSET(Type, Field) \
5397 ((LONG) (&(((Type *) 0)->Field)))
5405 #define PAGE_ALIGN(Va) \
5406 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
5411 * IN ULONG_PTR Size)
5413 #define ROUND_TO_PAGES(Size) \
5414 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
5420 IN PVOID FailedAssertion
,
5422 IN ULONG LineNumber
,
5427 #define ASSERT(exp) \
5429 RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE : TRUE)
5431 #define ASSERTMSG(msg, exp) \
5433 RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE : TRUE)
5435 #define RTL_SOFT_ASSERT(exp) \
5436 (VOID)((!(_exp)) ? \
5437 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5439 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5441 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5443 #define RTL_VERIFY(exp) ASSERT(exp)
5444 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
5446 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5447 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5451 #define ASSERT(exp) ((VOID) 0)
5452 #define ASSERTMSG(msg, exp) ((VOID) 0)
5454 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5455 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5457 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5458 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5460 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5461 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5465 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
5466 #if defined(_NTSYSTEM_) || defined(__GNUC__)
5467 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
5468 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
5470 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
5471 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
5472 #endif /* _NT_SYSTEM */
5474 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG
;
5475 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG
;
5478 ** Driver support routines
5481 /** Runtime library routines **/
5483 static __inline VOID
5485 IN PLIST_ENTRY ListHead
)
5487 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
5490 static __inline VOID
5492 IN PLIST_ENTRY ListHead
,
5493 IN PLIST_ENTRY Entry
)
5495 PLIST_ENTRY OldFlink
;
5496 OldFlink
= ListHead
->Flink
;
5497 Entry
->Flink
= OldFlink
;
5498 Entry
->Blink
= ListHead
;
5499 OldFlink
->Blink
= Entry
;
5500 ListHead
->Flink
= Entry
;
5503 static __inline VOID
5505 IN PLIST_ENTRY ListHead
,
5506 IN PLIST_ENTRY Entry
)
5508 PLIST_ENTRY OldBlink
;
5509 OldBlink
= ListHead
->Blink
;
5510 Entry
->Flink
= ListHead
;
5511 Entry
->Blink
= OldBlink
;
5512 OldBlink
->Flink
= Entry
;
5513 ListHead
->Blink
= Entry
;
5519 * IN PLIST_ENTRY ListHead)
5521 #define IsListEmpty(_ListHead) \
5522 ((_ListHead)->Flink == (_ListHead))
5525 * PSINGLE_LIST_ENTRY
5527 * IN PSINGLE_LIST_ENTRY ListHead)
5529 #define PopEntryList(ListHead) \
5532 PSINGLE_LIST_ENTRY _FirstEntry; \
5533 _FirstEntry = (ListHead)->Next; \
5534 if (_FirstEntry != NULL) \
5535 (ListHead)->Next = _FirstEntry->Next; \
5541 * IN PSINGLE_LIST_ENTRY ListHead,
5542 * IN PSINGLE_LIST_ENTRY Entry)
5544 #define PushEntryList(_ListHead, _Entry) \
5545 (_Entry)->Next = (_ListHead)->Next; \
5546 (_ListHead)->Next = (_Entry); \
5548 static __inline BOOLEAN
5550 IN PLIST_ENTRY Entry
)
5552 PLIST_ENTRY OldFlink
;
5553 PLIST_ENTRY OldBlink
;
5555 OldFlink
= Entry
->Flink
;
5556 OldBlink
= Entry
->Blink
;
5557 OldFlink
->Blink
= OldBlink
;
5558 OldBlink
->Flink
= OldFlink
;
5559 return (OldFlink
== OldBlink
);
5562 static __inline PLIST_ENTRY
5564 IN PLIST_ENTRY ListHead
)
5569 Entry
= ListHead
->Flink
;
5570 Flink
= Entry
->Flink
;
5571 ListHead
->Flink
= Flink
;
5572 Flink
->Blink
= ListHead
;
5576 static __inline PLIST_ENTRY
5578 IN PLIST_ENTRY ListHead
)
5583 Entry
= ListHead
->Blink
;
5584 Blink
= Entry
->Blink
;
5585 ListHead
->Blink
= Blink
;
5586 Blink
->Flink
= ListHead
;
5590 #if !defined(_WINBASE_H) || _WIN32_WINNT < 0x0501
5595 InterlockedPopEntrySList(
5596 IN PSLIST_HEADER ListHead
);
5601 InterlockedPushEntrySList(
5602 IN PSLIST_HEADER ListHead
,
5603 IN PSLIST_ENTRY ListEntry
);
5610 * IN PSLIST_HEADER SListHead)
5612 #define QueryDepthSList(_SListHead) \
5613 ((USHORT) ((_SListHead)->Alignment & 0xffff))
5615 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
5620 RtlxAnsiStringToUnicodeSize(
5621 IN PCANSI_STRING AnsiString
);
5623 #define RtlAnsiStringToUnicodeSize(STRING) ( \
5624 NLS_MB_CODE_PAGE_TAG ? \
5625 RtlxAnsiStringToUnicodeSize(STRING) : \
5626 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
5632 RtlAnsiStringToUnicodeString(
5633 IN OUT PUNICODE_STRING DestinationString
,
5634 IN PANSI_STRING SourceString
,
5635 IN BOOLEAN AllocateDestinationString
);
5640 RtlAppendUnicodeStringToString(
5641 IN OUT PUNICODE_STRING Destination
,
5642 IN PCUNICODE_STRING Source
);
5647 RtlAppendUnicodeToString(
5648 IN OUT PUNICODE_STRING Destination
,
5655 IN PRTL_BITMAP BitMapHeader
,
5656 IN ULONG StartingIndex
,
5663 IN PRTL_BITMAP BitMapHeader
,
5664 IN ULONG StartingIndex
,
5672 IN ULONG Base OPTIONAL
,
5673 IN OUT PULONG Value
);
5679 IN PRTL_BITMAP BitMapHeader
,
5680 IN ULONG BitPosition
);
5685 RtlCheckRegistryKey(
5686 IN ULONG RelativeTo
,
5693 IN PRTL_BITMAP BitMapHeader
);
5699 PRTL_BITMAP BitMapHeader
,
5706 IN PRTL_BITMAP BitMapHeader
,
5707 IN ULONG StartingIndex
,
5708 IN ULONG NumberToClear
);
5714 IN CONST VOID
*Source1
,
5715 IN CONST VOID
*Source2
,
5724 BOOLEAN CaseInSensitive
);
5729 RtlCompareUnicodeString(
5730 IN PCUNICODE_STRING String1
,
5731 IN PCUNICODE_STRING String2
,
5732 IN BOOLEAN CaseInSensitive
);
5737 RtlConvertLongToLargeInteger(LONG SignedInteger
)
5739 LARGE_INTEGER Result
;
5741 Result
.QuadPart
= SignedInteger
;
5748 RtlConvertLongToLuid(
5754 RtlConvertUlongToLargeInteger(
5755 IN ULONG UnsignedInteger
);
5760 RtlConvertUlongToLuid(
5766 * IN VOID UNALIGNED *Destination,
5767 * IN CONST VOID UNALIGNED *Source,
5770 #ifndef RtlCopyMemory
5771 #define RtlCopyMemory(Destination, Source, Length) \
5772 memcpy(Destination, Source, Length)
5775 #ifndef RtlCopyBytes
5776 #define RtlCopyBytes RtlCopyMemory
5783 IN VOID UNALIGNED
*Destination
,
5784 IN CONST VOID UNALIGNED
*Source
,
5791 IN OUT PSTRING DestinationString
,
5792 IN PSTRING SourceString OPTIONAL
);
5797 RtlCopyUnicodeString(
5798 IN OUT PUNICODE_STRING DestinationString
,
5799 IN PCUNICODE_STRING SourceString
);
5804 RtlCreateRegistryKey(
5805 IN ULONG RelativeTo
,
5811 RtlCreateSecurityDescriptor(
5812 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
5818 RtlDeleteRegistryValue(
5819 IN ULONG RelativeTo
,
5821 IN PCWSTR ValueName
);
5829 #define RtlEqualLuid(Luid1, \
5831 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
5836 * IN VOID UNALIGNED *Destination,
5837 * IN CONST VOID UNALIGNED *Source,
5840 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
5848 IN BOOLEAN CaseInSensitive
);
5853 RtlEqualUnicodeString(
5854 IN CONST UNICODE_STRING
*String1
,
5855 IN CONST UNICODE_STRING
*String2
,
5856 IN BOOLEAN CaseInSensitive
);
5861 * IN VOID UNALIGNED *Destination,
5865 #ifndef RtlFillMemory
5866 #define RtlFillMemory(Destination, Length, Fill) \
5867 memset(Destination, Fill, Length)
5870 #ifndef RtlFillBytes
5871 #define RtlFillBytes RtlFillMemory
5878 IN PRTL_BITMAP BitMapHeader
,
5879 IN ULONG NumberToFind
,
5880 IN ULONG HintIndex
);
5885 RtlFindClearBitsAndSet(
5886 IN PRTL_BITMAP BitMapHeader
,
5887 IN ULONG NumberToFind
,
5888 IN ULONG HintIndex
);
5894 IN PRTL_BITMAP BitMapHeader
,
5895 OUT PRTL_BITMAP_RUN RunArray
,
5896 IN ULONG SizeOfRunArray
,
5897 IN BOOLEAN LocateLongestRuns
);
5902 RtlFindFirstRunClear(
5903 IN PRTL_BITMAP BitMapHeader
,
5904 OUT PULONG StartingIndex
);
5909 RtlFindLastBackwardRunClear(
5910 IN PRTL_BITMAP BitMapHeader
,
5912 OUT PULONG StartingRunIndex
);
5917 RtlFindLeastSignificantBit(
5923 RtlFindLongestRunClear(
5924 IN PRTL_BITMAP BitMapHeader
,
5925 OUT PULONG StartingIndex
);
5930 RtlFindMostSignificantBit(
5936 RtlFindNextForwardRunClear(
5937 IN PRTL_BITMAP BitMapHeader
,
5939 OUT PULONG StartingRunIndex
);
5945 IN PRTL_BITMAP BitMapHeader
,
5946 IN ULONG NumberToFind
,
5947 IN ULONG HintIndex
);
5952 RtlFindSetBitsAndClear(
5953 IN PRTL_BITMAP BitMapHeader
,
5954 IN ULONG NumberToFind
,
5955 IN ULONG HintIndex
);
5961 IN PANSI_STRING AnsiString
);
5966 RtlFreeUnicodeString(
5967 IN PUNICODE_STRING UnicodeString
);
5972 RtlGetCallersAddress(
5973 OUT PVOID
*CallersAddress
,
5974 OUT PVOID
*CallersCaller
);
5980 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
5986 IN PUNICODE_STRING GuidString
,
5992 RtlHashUnicodeString(
5993 IN CONST UNICODE_STRING
*String
,
5994 IN BOOLEAN CaseInSensitive
,
5995 IN ULONG HashAlgorithm
,
5996 OUT PULONG HashValue
);
6002 IN OUT PANSI_STRING DestinationString
,
6003 IN PCSZ SourceString
);
6008 RtlInitializeBitMap(
6009 IN PRTL_BITMAP BitMapHeader
,
6010 IN PULONG BitMapBuffer
,
6011 IN ULONG SizeOfBitMap
);
6017 IN OUT PSTRING DestinationString
,
6018 IN PCSZ SourceString
);
6023 RtlInitUnicodeString(
6024 IN OUT PUNICODE_STRING DestinationString
,
6025 IN PCWSTR SourceString
);
6030 RtlInt64ToUnicodeString(
6032 IN ULONG Base OPTIONAL
,
6033 IN OUT PUNICODE_STRING String
);
6038 RtlIntegerToUnicodeString(
6040 IN ULONG Base OPTIONAL
,
6041 IN OUT PUNICODE_STRING String
);
6046 RtlIntPtrToUnicodeString(
6048 ULONG Base OPTIONAL
,
6049 PUNICODE_STRING String
);
6056 #define RtlIsZeroLuid(_L1) \
6057 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
6062 RtlLengthSecurityDescriptor(
6063 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
6069 IN OUT PACCESS_MASK AccessMask
,
6070 IN PGENERIC_MAPPING GenericMapping
);
6075 * IN VOID UNALIGNED *Destination,
6076 * IN CONST VOID UNALIGNED *Source,
6079 #define RtlMoveMemory memmove
6084 RtlNumberOfClearBits(
6085 IN PRTL_BITMAP BitMapHeader
);
6091 IN PRTL_BITMAP BitMapHeader
);
6096 RtlPrefetchMemoryNonTemporal(
6103 RtlPrefixUnicodeString(
6104 IN PCUNICODE_STRING String1
,
6105 IN PCUNICODE_STRING String2
,
6106 IN BOOLEAN CaseInSensitive
);
6111 RtlQueryRegistryValues(
6112 IN ULONG RelativeTo
,
6114 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
6116 IN PVOID Environment OPTIONAL
);
6119 #define LONG_SIZE (sizeof(LONG))
6120 #define LONG_MASK (LONG_SIZE - 1)
6124 * RtlRetrieveUlong (
6125 * PULONG DestinationAddress,
6126 * PULONG SourceAddress
6129 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
6130 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
6132 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
6133 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
6134 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
6135 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
6139 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
6146 IN OUT PUSHORT DestinationAddress
,
6147 IN PUSHORT SourceAddress
);
6153 IN PRTL_BITMAP BitMapHeader
);
6159 PRTL_BITMAP BitMapHeader
,
6166 IN PRTL_BITMAP BitMapHeader
,
6167 IN ULONG StartingIndex
,
6168 IN ULONG NumberToSet
);
6173 RtlSetDaclSecurityDescriptor(
6174 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
6175 IN BOOLEAN DaclPresent
,
6176 IN PACL Dacl OPTIONAL
,
6177 IN BOOLEAN DaclDefaulted OPTIONAL
);
6190 IN OUT PULONGLONG Address
,
6197 IN OUT PULONG_PTR Address
,
6198 IN ULONG_PTR Value
);
6212 OUT PUNICODE_STRING GuidString
);
6218 IN PRTL_BITMAP BitMapHeader
,
6219 IN ULONG BitNumber
);
6224 RtlTimeFieldsToTime(
6225 IN PTIME_FIELDS TimeFields
,
6226 IN PLARGE_INTEGER Time
);
6231 RtlTimeToTimeFields(
6232 IN PLARGE_INTEGER Time
,
6233 IN PTIME_FIELDS TimeFields
);
6242 RtlUlonglongByteSwap(
6243 IN ULONGLONG Source
);
6245 #define RtlUnicodeStringToAnsiSize(STRING) ( \
6246 NLS_MB_CODE_PAGE_TAG ? \
6247 RtlxUnicodeStringToAnsiSize(STRING) : \
6248 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
6253 RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString
,
6255 IN USHORT BufferSize
)
6257 UnicodeString
->Length
= 0;
6258 UnicodeString
->MaximumLength
= BufferSize
;
6259 UnicodeString
->Buffer
= Buffer
;
6265 RtlUnicodeStringToAnsiString(
6266 IN OUT PANSI_STRING DestinationString
,
6267 IN PCUNICODE_STRING SourceString
,
6268 IN BOOLEAN AllocateDestinationString
);
6273 RtlUnicodeStringToInteger(
6274 IN PCUNICODE_STRING String
,
6275 IN ULONG Base OPTIONAL
,
6281 RtlUpcaseUnicodeChar(
6282 IN WCHAR SourceCharacter
);
6287 RtlUpcaseUnicodeString(
6288 IN OUT PUNICODE_STRING DestinationString OPTIONAL
,
6289 IN PCUNICODE_STRING SourceString
,
6290 IN BOOLEAN AllocateDestinationString
);
6302 IN OUT PSTRING DestinationString
,
6303 IN PSTRING SourceString
);
6313 RtlValidRelativeSecurityDescriptor(
6314 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput
,
6315 IN ULONG SecurityDescriptorLength
,
6316 IN SECURITY_INFORMATION RequiredInformation
);
6321 RtlValidSecurityDescriptor(
6322 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
6327 RtlVerifyVersionInfo(
6328 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
6330 IN ULONGLONG ConditionMask
);
6335 RtlVolumeDeviceToDosName(
6336 IN PVOID VolumeDeviceObject
,
6337 OUT PUNICODE_STRING DosName
);
6350 RtlWriteRegistryValue(
6351 IN ULONG RelativeTo
,
6353 IN PCWSTR ValueName
,
6356 IN ULONG ValueLength
);
6361 RtlxUnicodeStringToAnsiSize(
6362 IN PCUNICODE_STRING UnicodeString
);
6367 * IN VOID UNALIGNED *Destination,
6370 #ifndef RtlZeroMemory
6371 #define RtlZeroMemory(Destination, Length) \
6372 memset(Destination, 0, Length)
6375 #ifndef RtlZeroBytes
6376 #define RtlZeroBytes RtlZeroMemory
6380 /* Guarded Mutex routines */
6384 KeAcquireGuardedMutex(
6385 IN OUT PKGUARDED_MUTEX GuardedMutex
6390 KeAcquireGuardedMutexUnsafe(
6391 IN OUT PKGUARDED_MUTEX GuardedMutex
6396 KeEnterGuardedRegion(
6402 KeLeaveGuardedRegion(
6408 KeInitializeGuardedMutex(
6409 OUT PKGUARDED_MUTEX GuardedMutex
6414 KeReleaseGuardedMutexUnsafe(
6415 IN OUT PKGUARDED_MUTEX GuardedMutex
6420 KeReleaseGuardedMutex(
6421 IN OUT PKGUARDED_MUTEX GuardedMutex
6426 KeTryToAcquireGuardedMutex(
6427 IN OUT PKGUARDED_MUTEX GuardedMutex
6431 #define ExInitializeFastMutex(_FastMutex) \
6433 (_FastMutex)->Count = FM_LOCK_BIT; \
6434 (_FastMutex)->Owner = NULL; \
6435 (_FastMutex)->Contention = 0; \
6436 KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \
6442 ExAcquireFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex
);
6447 ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex
);
6449 #if defined(_NTHAL_) && defined(_X86_)
6453 ExiAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex
);
6458 ExiReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex
);
6463 ExiTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex
);
6465 #define ExAcquireFastMutex(FastMutex) ExiAcquireFastMutex(FastMutex)
6466 #define ExReleaseFastMutex(FastMutex) ExiReleaseFastMutex(FastMutex)
6467 #define ExTryToAcquireFastMutex(FastMutex) ExiTryToAcquireFastMutex(FastMutex)
6474 ExAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex
);
6479 ExReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex
);
6484 ExTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex
);
6487 /** Executive support routines **/
6492 ExAcquireResourceExclusiveLite(
6493 IN PERESOURCE Resource
,
6499 ExAcquireResourceSharedLite(
6500 IN PERESOURCE Resource
,
6506 ExAcquireSharedStarveExclusive(
6507 IN PERESOURCE Resource
,
6513 ExAcquireSharedWaitForExclusive(
6514 IN PERESOURCE Resource
,
6517 static __inline PVOID
6518 ExAllocateFromNPagedLookasideList(
6519 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
6523 Lookaside
->L
.TotalAllocates
++;
6524 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
6525 if (Entry
== NULL
) {
6526 Lookaside
->L
.AllocateMisses
++;
6527 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
, Lookaside
->L
.Size
, Lookaside
->L
.Tag
);
6532 static __inline PVOID
6533 ExAllocateFromPagedLookasideList(
6534 IN PPAGED_LOOKASIDE_LIST Lookaside
)
6538 Lookaside
->L
.TotalAllocates
++;
6539 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
6540 if (Entry
== NULL
) {
6541 Lookaside
->L
.AllocateMisses
++;
6542 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
, Lookaside
->L
.Size
, Lookaside
->L
.Tag
);
6550 ExAllocatePoolWithQuotaTag(
6551 IN POOL_TYPE PoolType
,
6552 IN SIZE_T NumberOfBytes
,
6558 ExAllocatePoolWithTag(
6559 IN POOL_TYPE PoolType
,
6560 IN SIZE_T NumberOfBytes
,
6565 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
6566 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
6568 #else /* !POOL_TAGGING */
6574 IN POOL_TYPE PoolType
,
6575 IN SIZE_T NumberOfBytes
);
6580 ExAllocatePoolWithQuota(
6581 IN POOL_TYPE PoolType
,
6582 IN SIZE_T NumberOfBytes
);
6584 #endif /* POOL_TAGGING */
6589 ExAllocatePoolWithTagPriority(
6590 IN POOL_TYPE PoolType
,
6591 IN SIZE_T NumberOfBytes
,
6593 IN EX_POOL_PRIORITY Priority
);
6598 ExConvertExclusiveToSharedLite(
6599 IN PERESOURCE Resource
);
6605 OUT PCALLBACK_OBJECT
*CallbackObject
,
6606 IN POBJECT_ATTRIBUTES ObjectAttributes
,
6608 IN BOOLEAN AllowMultipleCallbacks
);
6613 ExDeleteNPagedLookasideList(
6614 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
6619 ExDeletePagedLookasideList(
6620 IN PPAGED_LOOKASIDE_LIST Lookaside
);
6625 ExDeleteResourceLite(
6626 IN PERESOURCE Resource
);
6634 #define PROTECTED_POOL 0x80000000
6637 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
6647 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
6649 static __inline VOID
6650 ExFreeToNPagedLookasideList(
6651 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
6654 Lookaside
->L
.TotalFrees
++;
6655 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
6656 Lookaside
->L
.FreeMisses
++;
6657 (Lookaside
->L
.Free
)(Entry
);
6659 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
6663 static __inline VOID
6664 ExFreeToPagedLookasideList(
6665 IN PPAGED_LOOKASIDE_LIST Lookaside
,
6668 Lookaside
->L
.TotalFrees
++;
6669 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
6670 Lookaside
->L
.FreeMisses
++;
6671 (Lookaside
->L
.Free
)(Entry
);
6673 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
6679 * ExGetCurrentResourceThread(
6682 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
6687 ExGetExclusiveWaiterCount(
6688 IN PERESOURCE Resource
);
6699 ExGetSharedWaiterCount(
6700 IN PERESOURCE Resource
);
6713 ExInitializeNPagedLookasideList(
6714 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
6715 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
6716 IN PFREE_FUNCTION Free OPTIONAL
,
6725 ExInitializePagedLookasideList(
6726 IN PPAGED_LOOKASIDE_LIST Lookaside
,
6727 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
6728 IN PFREE_FUNCTION Free OPTIONAL
,
6737 ExInitializeResourceLite(
6738 IN PERESOURCE Resource
);
6742 * InitializeSListHead(
6743 * IN PSLIST_HEADER SListHead)
6745 #define InitializeSListHead(_SListHead) \
6746 (_SListHead)->Alignment = 0
6748 #define ExInitializeSListHead InitializeSListHead
6753 ExInterlockedAddLargeInteger(
6754 IN PLARGE_INTEGER Addend
,
6755 IN LARGE_INTEGER Increment
,
6756 IN PKSPIN_LOCK Lock
);
6761 ExInterlockedAddLargeStatistic(
6762 IN PLARGE_INTEGER Addend
,
6763 IN ULONG Increment
);
6768 ExInterlockedAddUlong(
6776 ExInterlockedCompareExchange64(
6777 IN OUT PLONGLONG Destination
,
6778 IN PLONGLONG Exchange
,
6779 IN PLONGLONG Comparand
,
6780 IN PKSPIN_LOCK Lock
);
6785 ExfInterlockedCompareExchange64(
6786 IN OUT LONGLONG
volatile *Destination
,
6787 IN PLONGLONG Exchange
,
6788 IN PLONGLONG Comperand
);
6793 ExInterlockedFlushSList(
6794 IN PSLIST_HEADER ListHead
);
6799 ExInterlockedInsertHeadList(
6800 IN PLIST_ENTRY ListHead
,
6801 IN PLIST_ENTRY ListEntry
,
6802 IN PKSPIN_LOCK Lock
);
6807 ExInterlockedInsertTailList(
6808 IN PLIST_ENTRY ListHead
,
6809 IN PLIST_ENTRY ListEntry
,
6810 IN PKSPIN_LOCK Lock
);
6815 ExInterlockedPopEntryList(
6816 IN PSINGLE_LIST_ENTRY ListHead
,
6817 IN PKSPIN_LOCK Lock
);
6820 * PSINGLE_LIST_ENTRY
6821 * ExInterlockedPopEntrySList(
6822 * IN PSLIST_HEADER ListHead,
6823 * IN PKSPIN_LOCK Lock)
6825 #define ExInterlockedPopEntrySList(_ListHead, \
6827 InterlockedPopEntrySList(_ListHead)
6832 ExInterlockedPushEntryList(
6833 IN PSINGLE_LIST_ENTRY ListHead
,
6834 IN PSINGLE_LIST_ENTRY ListEntry
,
6835 IN PKSPIN_LOCK Lock
);
6838 * PSINGLE_LIST_ENTRY FASTCALL
6839 * ExInterlockedPushEntrySList(
6840 * IN PSLIST_HEADER ListHead,
6841 * IN PSINGLE_LIST_ENTRY ListEntry,
6842 * IN PKSPIN_LOCK Lock)
6844 #define ExInterlockedPushEntrySList(_ListHead, \
6847 InterlockedPushEntrySList(_ListHead, _ListEntry)
6852 ExInterlockedRemoveHeadList(
6853 IN PLIST_ENTRY ListHead
,
6854 IN PKSPIN_LOCK Lock
);
6859 ExIsProcessorFeaturePresent(
6860 IN ULONG ProcessorFeature
);
6865 ExIsResourceAcquiredExclusiveLite(
6866 IN PERESOURCE Resource
);
6871 ExIsResourceAcquiredLite(
6872 IN PERESOURCE Resource
);
6877 ExIsResourceAcquiredSharedLite(
6878 IN PERESOURCE Resource
);
6883 ExLocalTimeToSystemTime(
6884 IN PLARGE_INTEGER LocalTime
,
6885 OUT PLARGE_INTEGER SystemTime
);
6891 IN PCALLBACK_OBJECT CallbackObject
,
6893 IN PVOID Argument2
);
6898 ExRaiseAccessViolation(
6904 ExRaiseDatatypeMisalignment(
6911 IN NTSTATUS Status
);
6917 IN PCALLBACK_OBJECT CallbackObject
,
6918 IN PCALLBACK_FUNCTION CallbackFunction
,
6919 IN PVOID CallbackContext
);
6924 ExReinitializeResourceLite(
6925 IN PERESOURCE Resource
);
6930 ExReleaseResourceForThreadLite(
6931 IN PERESOURCE Resource
,
6932 IN ERESOURCE_THREAD ResourceThreadId
);
6937 ExReleaseResourceLite(
6938 IN PERESOURCE Resource
);
6943 ExSetResourceOwnerPointer(
6944 IN PERESOURCE Resource
,
6945 IN PVOID OwnerPointer
);
6950 ExSetTimerResolution(
6951 IN ULONG DesiredTime
,
6952 IN BOOLEAN SetResolution
);
6957 ExSystemTimeToLocalTime(
6958 IN PLARGE_INTEGER SystemTime
,
6959 OUT PLARGE_INTEGER LocalTime
);
6964 ExTryToAcquireResourceExclusiveLite(
6965 IN PERESOURCE Resource
);
6970 ExUnregisterCallback(
6971 IN PVOID CbRegistration
);
6983 IN SUITE_TYPE SuiteType
);
6987 #define PAGED_CODE() { \
6988 if (KeGetCurrentIrql() > APC_LEVEL) { \
6989 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
6996 #define PAGED_CODE()
7004 IN CONST VOID
*Address
,
7006 IN ULONG Alignment
);
7014 IN ULONG Alignment
);
7018 /** Configuration manager routines **/
7024 IN PEX_CALLBACK_FUNCTION Function
,
7026 IN OUT PLARGE_INTEGER Cookie
);
7031 CmUnRegisterCallback(
7032 IN LARGE_INTEGER Cookie
);
7036 /** Filesystem runtime library routines **/
7041 FsRtlIsTotalDeviceFailure(
7042 IN NTSTATUS Status
);
7046 /** Hardware abstraction layer routines **/
7052 IN ULONG Frequency
);
7058 IN PDEVICE_OBJECT DeviceObject
,
7059 IN ULONG SectorSize
,
7060 IN ULONG MBRTypeIdentifier
,
7066 PADAPTER_OBJECT AdapterObject
7072 IoAllocateAdapterChannel(
7073 IN PADAPTER_OBJECT AdapterObject
,
7074 IN PDEVICE_OBJECT DeviceObject
,
7075 IN ULONG NumberOfMapRegisters
,
7076 IN PDRIVER_CONTROL ExecutionRoutine
,
7083 READ_PORT_BUFFER_UCHAR(
7091 READ_PORT_BUFFER_ULONG(
7099 READ_PORT_BUFFER_USHORT(
7125 READ_REGISTER_BUFFER_UCHAR(
7133 READ_REGISTER_BUFFER_ULONG(
7141 READ_REGISTER_BUFFER_USHORT(
7142 IN PUSHORT Register
,
7149 READ_REGISTER_UCHAR(
7150 IN PUCHAR Register
);
7155 READ_REGISTER_ULONG(
7156 IN PULONG Register
);
7161 READ_REGISTER_USHORT(
7162 IN PUSHORT Register
);
7167 WRITE_PORT_BUFFER_UCHAR(
7175 WRITE_PORT_BUFFER_ULONG(
7183 WRITE_PORT_BUFFER_USHORT(
7212 WRITE_REGISTER_BUFFER_UCHAR(
7220 WRITE_REGISTER_BUFFER_ULONG(
7228 WRITE_REGISTER_BUFFER_USHORT(
7229 IN PUSHORT Register
,
7236 WRITE_REGISTER_UCHAR(
7243 WRITE_REGISTER_ULONG(
7250 WRITE_REGISTER_USHORT(
7251 IN PUSHORT Register
,
7254 /** I/O manager routines **/
7259 IoAcquireCancelSpinLock(
7265 IoAcquireRemoveLockEx(
7266 IN PIO_REMOVE_LOCK RemoveLock
,
7267 IN OPTIONAL PVOID Tag OPTIONAL
,
7270 IN ULONG RemlockSize
);
7274 * IoAcquireRemoveLock(
7275 * IN PIO_REMOVE_LOCK RemoveLock,
7276 * IN OPTIONAL PVOID Tag)
7278 #define IoAcquireRemoveLock(_RemoveLock, \
7280 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
7284 * IoAdjustPagingPathCount(
7286 * IN BOOLEAN Increment)
7288 #define IoAdjustPagingPathCount(_Count, \
7293 InterlockedIncrement(_Count); \
7297 InterlockedDecrement(_Count); \
7304 IoAllocateController(
7305 IN PCONTROLLER_OBJECT ControllerObject
,
7306 IN PDEVICE_OBJECT DeviceObject
,
7307 IN PDRIVER_CONTROL ExecutionRoutine
,
7313 IoAllocateDriverObjectExtension(
7314 IN PDRIVER_OBJECT DriverObject
,
7315 IN PVOID ClientIdentificationAddress
,
7316 IN ULONG DriverObjectExtensionSize
,
7317 OUT PVOID
*DriverObjectExtension
);
7322 IoAllocateErrorLogEntry(
7324 IN UCHAR EntrySize
);
7331 IN BOOLEAN ChargeQuota
);
7337 IN PVOID VirtualAddress
,
7339 IN BOOLEAN SecondaryBuffer
,
7340 IN BOOLEAN ChargeQuota
,
7341 IN OUT PIRP Irp OPTIONAL
);
7347 IN PDEVICE_OBJECT DeviceObject
);
7350 * VOID IoAssignArcName(
7351 * IN PUNICODE_STRING ArcName,
7352 * IN PUNICODE_STRING DeviceName);
7354 #define IoAssignArcName(_ArcName, _DeviceName) ( \
7355 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
7361 IN PDEVICE_OBJECT SourceDevice
,
7362 IN PUNICODE_STRING TargetDevice
,
7363 OUT PDEVICE_OBJECT
*AttachedDevice
);
7368 IoAttachDeviceToDeviceStack(
7369 IN PDEVICE_OBJECT SourceDevice
,
7370 IN PDEVICE_OBJECT TargetDevice
);
7375 IoBuildAsynchronousFsdRequest(
7376 IN ULONG MajorFunction
,
7377 IN PDEVICE_OBJECT DeviceObject
,
7378 IN OUT PVOID Buffer OPTIONAL
,
7379 IN ULONG Length OPTIONAL
,
7380 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
7381 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
7386 IoBuildDeviceIoControlRequest(
7387 IN ULONG IoControlCode
,
7388 IN PDEVICE_OBJECT DeviceObject
,
7389 IN PVOID InputBuffer OPTIONAL
,
7390 IN ULONG InputBufferLength
,
7391 OUT PVOID OutputBuffer OPTIONAL
,
7392 IN ULONG OutputBufferLength
,
7393 IN BOOLEAN InternalDeviceIoControl
,
7395 OUT PIO_STATUS_BLOCK IoStatusBlock
);
7402 IN OUT PMDL TargetMdl
,
7403 IN PVOID VirtualAddress
,
7409 IoBuildSynchronousFsdRequest(
7410 IN ULONG MajorFunction
,
7411 IN PDEVICE_OBJECT DeviceObject
,
7412 IN OUT PVOID Buffer OPTIONAL
,
7413 IN ULONG Length OPTIONAL
,
7414 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
7416 OUT PIO_STATUS_BLOCK IoStatusBlock
);
7422 IN PDEVICE_OBJECT DeviceObject
,
7428 * IN PDEVICE_OBJECT DeviceObject,
7431 #define IoCallDriver IofCallDriver
7437 IN PDEVICE_OBJECT DeviceObject
,
7438 IN PFILE_OBJECT FileObject
);
7450 IN ACCESS_MASK DesiredAccess
,
7451 IN ULONG DesiredShareAccess
,
7452 IN OUT PFILE_OBJECT FileObject
,
7453 IN OUT PSHARE_ACCESS ShareAccess
,
7461 IN CCHAR PriorityBoost
);
7465 * IoCompleteRequest(
7467 * IN CCHAR PriorityBoost)
7469 #define IoCompleteRequest IofCompleteRequest
7475 OUT PKINTERRUPT
*InterruptObject
,
7476 IN PKSERVICE_ROUTINE ServiceRoutine
,
7477 IN PVOID ServiceContext
,
7478 IN PKSPIN_LOCK SpinLock OPTIONAL
,
7481 IN KIRQL SynchronizeIrql
,
7482 IN KINTERRUPT_MODE InterruptMode
,
7483 IN BOOLEAN ShareVector
,
7484 IN KAFFINITY ProcessorEnableMask
,
7485 IN BOOLEAN FloatingSave
);
7488 * PIO_STACK_LOCATION
7489 * IoGetCurrentIrpStackLocation(
7492 #define IoGetCurrentIrpStackLocation(_Irp) \
7493 ((_Irp)->Tail.Overlay.CurrentStackLocation)
7496 * PIO_STACK_LOCATION
7497 * IoGetNextIrpStackLocation(
7500 #define IoGetNextIrpStackLocation(_Irp) \
7501 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
7505 * IoCopyCurrentIrpStackLocationToNext(
7508 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
7510 PIO_STACK_LOCATION _IrpSp; \
7511 PIO_STACK_LOCATION _NextIrpSp; \
7512 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
7513 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
7514 RtlCopyMemory(_NextIrpSp, _IrpSp, \
7515 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
7516 _NextIrpSp->Control = 0; \
7529 IN PDRIVER_OBJECT DriverObject
,
7530 IN ULONG DeviceExtensionSize
,
7531 IN PUNICODE_STRING DeviceName OPTIONAL
,
7532 IN DEVICE_TYPE DeviceType
,
7533 IN ULONG DeviceCharacteristics
,
7534 IN BOOLEAN Exclusive
,
7535 OUT PDEVICE_OBJECT
*DeviceObject
);
7541 IN PDEVICE_OBJECT DeviceObject
,
7542 IN PCREATE_DISK Disk
);
7548 OUT PHANDLE FileHandle
,
7549 IN ACCESS_MASK DesiredAccess
,
7550 IN POBJECT_ATTRIBUTES ObjectAttributes
,
7551 OUT PIO_STATUS_BLOCK IoStatusBlock
,
7552 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
7553 IN ULONG FileAttributes
,
7554 IN ULONG ShareAccess
,
7555 IN ULONG Disposition
,
7556 IN ULONG CreateOptions
,
7557 IN PVOID EaBuffer OPTIONAL
,
7559 IN CREATE_FILE_TYPE CreateFileType
,
7560 IN PVOID ExtraCreateParameters OPTIONAL
,
7566 IoCreateNotificationEvent(
7567 IN PUNICODE_STRING EventName
,
7568 OUT PHANDLE EventHandle
);
7573 IoCreateSymbolicLink(
7574 IN PUNICODE_STRING SymbolicLinkName
,
7575 IN PUNICODE_STRING DeviceName
);
7580 IoCreateSynchronizationEvent(
7581 IN PUNICODE_STRING EventName
,
7582 OUT PHANDLE EventHandle
);
7587 IoCreateUnprotectedSymbolicLink(
7588 IN PUNICODE_STRING SymbolicLinkName
,
7589 IN PUNICODE_STRING DeviceName
);
7596 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
7597 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
7598 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
7599 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
7600 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
7601 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
7609 IN PIO_CSQ_IRP_CONTEXT Context
);
7616 IN PIO_CSQ_IRP_CONTEXT Context
);
7623 IN PVOID PeekContext
);
7629 IN PCONTROLLER_OBJECT ControllerObject
);
7635 IN PDEVICE_OBJECT DeviceObject
);
7640 IoDeleteSymbolicLink(
7641 IN PUNICODE_STRING SymbolicLinkName
);
7645 * IoDeassignArcName(
7646 * IN PUNICODE_STRING ArcName)
7648 #define IoDeassignArcName IoDeleteSymbolicLink
7654 IN OUT PDEVICE_OBJECT TargetDevice
);
7659 IoDisconnectInterrupt(
7660 IN PKINTERRUPT InterruptObject
);
7665 IoForwardIrpSynchronously(
7666 IN PDEVICE_OBJECT DeviceObject
,
7669 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
7675 IN PCONTROLLER_OBJECT ControllerObject
);
7680 IoFreeErrorLogEntry(
7699 IN PIO_WORKITEM pIOWorkItem
);
7704 IoGetAttachedDevice(
7705 IN PDEVICE_OBJECT DeviceObject
);
7710 IoGetAttachedDeviceReference(
7711 IN PDEVICE_OBJECT DeviceObject
);
7716 IoGetBootDiskInformation(
7717 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
7721 PCONFIGURATION_INFORMATION
7723 IoGetConfigurationInformation(
7729 IoGetCurrentProcess(
7735 IoGetDeviceInterfaceAlias(
7736 IN PUNICODE_STRING SymbolicLinkName
,
7737 IN CONST GUID
*AliasInterfaceClassGuid
,
7738 OUT PUNICODE_STRING AliasSymbolicLinkName
);
7740 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
7745 IoGetDeviceInterfaces(
7746 IN CONST GUID
*InterfaceClassGuid
,
7747 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
7749 OUT PWSTR
*SymbolicLinkList
);
7754 IoGetDeviceObjectPointer(
7755 IN PUNICODE_STRING ObjectName
,
7756 IN ACCESS_MASK DesiredAccess
,
7757 OUT PFILE_OBJECT
*FileObject
,
7758 OUT PDEVICE_OBJECT
*DeviceObject
);
7763 IoGetDeviceProperty(
7764 IN PDEVICE_OBJECT DeviceObject
,
7765 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
7766 IN ULONG BufferLength
,
7767 OUT PVOID PropertyBuffer
,
7768 OUT PULONG ResultLength
);
7773 IoGetDeviceToVerify(
7774 IN PETHREAD Thread
);
7780 IN PDEVICE_OBJECT PhysicalDeviceObject
,
7781 IN PDEVICE_DESCRIPTION DeviceDescription
,
7782 IN OUT PULONG NumberOfMapRegisters
);
7787 IoGetDriverObjectExtension(
7788 IN PDRIVER_OBJECT DriverObject
,
7789 IN PVOID ClientIdentificationAddress
);
7794 IoGetFileObjectGenericMapping(
7799 * IoGetFunctionCodeFromCtlCode(
7800 * IN ULONG ControlCode)
7802 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
7803 (((_ControlCode) >> 2) & 0x00000FFF)
7814 IoGetRelatedDeviceObject(
7815 IN PFILE_OBJECT FileObject
);
7820 IoGetRemainingStackSize(
7827 OUT PULONG_PTR LowLimit
,
7828 OUT PULONG_PTR HighLimit
);
7835 IN PKDEFERRED_ROUTINE DeferredRoutine
,
7836 IN PVOID DeferredContext
);
7840 * IoInitializeDpcRequest(
7841 * IN PDEVICE_OBJECT DeviceObject,
7842 * IN PIO_DPC_ROUTINE DpcRoutine)
7844 #define IoInitializeDpcRequest(_DeviceObject, \
7846 KeInitializeDpc(&(_DeviceObject)->Dpc, \
7847 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
7855 IN USHORT PacketSize
,
7856 IN CCHAR StackSize
);
7861 IoInitializeRemoveLockEx(
7862 IN PIO_REMOVE_LOCK Lock
,
7863 IN ULONG AllocateTag
,
7864 IN ULONG MaxLockedMinutes
,
7865 IN ULONG HighWatermark
,
7866 IN ULONG RemlockSize
);
7869 * IoInitializeRemoveLock(
7870 * IN PIO_REMOVE_LOCK Lock,
7871 * IN ULONG AllocateTag,
7872 * IN ULONG MaxLockedMinutes,
7873 * IN ULONG HighWatermark)
7875 #define IoInitializeRemoveLock( \
7876 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
7877 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
7878 HighWatermark, sizeof(IO_REMOVE_LOCK))
7884 IN PDEVICE_OBJECT DeviceObject
,
7885 IN PIO_TIMER_ROUTINE TimerRoutine
,
7891 IoInvalidateDeviceRelations(
7892 IN PDEVICE_OBJECT DeviceObject
,
7893 IN DEVICE_RELATION_TYPE Type
);
7898 IoInvalidateDeviceState(
7899 IN PDEVICE_OBJECT PhysicalDeviceObject
);
7905 IN PIRP Irp OPTIONAL
);
7909 * IoIsErrorUserInduced(
7910 * IN NTSTATUS Status);
7912 #define IoIsErrorUserInduced(Status) \
7913 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
7914 ((Status) == STATUS_IO_TIMEOUT) || \
7915 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
7916 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
7917 ((Status) == STATUS_VERIFY_REQUIRED) || \
7918 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
7919 ((Status) == STATUS_WRONG_VOLUME)))
7924 IoIsWdmVersionAvailable(
7925 IN UCHAR MajorVersion
,
7926 IN UCHAR MinorVersion
);
7931 IoMakeAssociatedIrp(
7933 IN CCHAR StackSize
);
7940 #define IoMarkIrpPending(_Irp) \
7941 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
7946 IoOpenDeviceInterfaceRegistryKey(
7947 IN PUNICODE_STRING SymbolicLinkName
,
7948 IN ACCESS_MASK DesiredAccess
,
7949 OUT PHANDLE DeviceInterfaceKey
);
7951 #define PLUGPLAY_REGKEY_DEVICE 1
7952 #define PLUGPLAY_REGKEY_DRIVER 2
7953 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
7958 IoOpenDeviceRegistryKey(
7959 IN PDEVICE_OBJECT DeviceObject
,
7960 IN ULONG DevInstKeyType
,
7961 IN ACCESS_MASK DesiredAccess
,
7962 OUT PHANDLE DevInstRegKey
);
7967 IoQueryDeviceDescription(
7968 IN PINTERFACE_TYPE BusType OPTIONAL
,
7969 IN PULONG BusNumber OPTIONAL
,
7970 IN PCONFIGURATION_TYPE ControllerType OPTIONAL
,
7971 IN PULONG ControllerNumber OPTIONAL
,
7972 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL
,
7973 IN PULONG PeripheralNumber OPTIONAL
,
7974 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
,
7981 IN PIO_WORKITEM pIOWorkItem
,
7982 IN PIO_WORKITEM_ROUTINE Routine
,
7983 IN WORK_QUEUE_TYPE QueueType
,
7991 IN PVPB Vpb OPTIONAL
,
7992 IN PDEVICE_OBJECT RealDeviceObject
);
7997 IoRaiseInformationalHardError(
7998 IN NTSTATUS ErrorStatus
,
7999 IN PUNICODE_STRING String OPTIONAL
,
8000 IN PKTHREAD Thread OPTIONAL
);
8005 IoReadDiskSignature(
8006 IN PDEVICE_OBJECT DeviceObject
,
8007 IN ULONG BytesPerSector
,
8008 OUT PDISK_SIGNATURE Signature
);
8013 IoReadPartitionTableEx(
8014 IN PDEVICE_OBJECT DeviceObject
,
8015 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
**PartitionBuffer
);
8020 IoRegisterBootDriverReinitialization(
8021 IN PDRIVER_OBJECT DriverObject
,
8022 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
8028 IoRegisterBootDriverReinitialization(
8029 IN PDRIVER_OBJECT DriverObject
,
8030 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
8036 IoRegisterDeviceInterface(
8037 IN PDEVICE_OBJECT PhysicalDeviceObject
,
8038 IN CONST GUID
*InterfaceClassGuid
,
8039 IN PUNICODE_STRING ReferenceString OPTIONAL
,
8040 OUT PUNICODE_STRING SymbolicLinkName
);
8045 IoRegisterDriverReinitialization(
8046 IN PDRIVER_OBJECT DriverObject
,
8047 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
8053 IoRegisterPlugPlayNotification(
8054 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
8055 IN ULONG EventCategoryFlags
,
8056 IN PVOID EventCategoryData OPTIONAL
,
8057 IN PDRIVER_OBJECT DriverObject
,
8058 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
8060 OUT PVOID
*NotificationEntry
);
8065 IoRegisterShutdownNotification(
8066 IN PDEVICE_OBJECT DeviceObject
);
8071 IoReleaseCancelSpinLock(
8077 IoReleaseRemoveLockAndWaitEx(
8078 IN PIO_REMOVE_LOCK RemoveLock
,
8080 IN ULONG RemlockSize
);
8085 IoReleaseRemoveLockEx(
8086 IN PIO_REMOVE_LOCK RemoveLock
,
8088 IN ULONG RemlockSize
);
8092 * IoReleaseRemoveLock(
8093 * IN PIO_REMOVE_LOCK RemoveLock,
8096 #define IoReleaseRemoveLock(_RemoveLock, \
8098 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8102 * IoReleaseRemoveLockAndWait(
8103 * IN PIO_REMOVE_LOCK RemoveLock,
8106 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
8108 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8113 IoRemoveShareAccess(
8114 IN PFILE_OBJECT FileObject
,
8115 IN OUT PSHARE_ACCESS ShareAccess
);
8120 IoReportDetectedDevice(
8121 IN PDRIVER_OBJECT DriverObject
,
8122 IN INTERFACE_TYPE LegacyBusType
,
8124 IN ULONG SlotNumber
,
8125 IN PCM_RESOURCE_LIST ResourceList
,
8126 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL
,
8127 IN BOOLEAN ResourceAssigned
,
8128 IN OUT PDEVICE_OBJECT
*DeviceObject
);
8133 IoReportResourceForDetection(
8134 IN PDRIVER_OBJECT DriverObject
,
8135 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
8136 IN ULONG DriverListSize OPTIONAL
,
8137 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
8138 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
8139 IN ULONG DeviceListSize OPTIONAL
,
8140 OUT PBOOLEAN ConflictDetected
);
8145 IoReportResourceUsage(
8146 IN PUNICODE_STRING DriverClassName OPTIONAL
,
8147 IN PDRIVER_OBJECT DriverObject
,
8148 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
8149 IN ULONG DriverListSize OPTIONAL
,
8150 IN PDEVICE_OBJECT DeviceObject
,
8151 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
8152 IN ULONG DeviceListSize OPTIONAL
,
8153 IN BOOLEAN OverrideConflict
,
8154 OUT PBOOLEAN ConflictDetected
);
8159 IoReportTargetDeviceChange(
8160 IN PDEVICE_OBJECT PhysicalDeviceObject
,
8161 IN PVOID NotificationStructure
);
8166 IoReportTargetDeviceChangeAsynchronous(
8167 IN PDEVICE_OBJECT PhysicalDeviceObject
,
8168 IN PVOID NotificationStructure
,
8169 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
8170 IN PVOID Context OPTIONAL
);
8175 IoRequestDeviceEject(
8176 IN PDEVICE_OBJECT PhysicalDeviceObject
);
8181 * IN PDEVICE_OBJECT DeviceObject,
8183 * IN PVOID Context);
8185 #define IoRequestDpc(DeviceObject, Irp, Context)( \
8186 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
8193 IN NTSTATUS Status
);
8197 * IoSetCancelRoutine(
8199 * IN PDRIVER_CANCEL CancelRoutine)
8201 #define IoSetCancelRoutine(_Irp, \
8203 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
8204 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
8208 * IoSetCompletionRoutine(
8210 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
8212 * IN BOOLEAN InvokeOnSuccess,
8213 * IN BOOLEAN InvokeOnError,
8214 * IN BOOLEAN InvokeOnCancel)
8216 #define IoSetCompletionRoutine(_Irp, \
8217 _CompletionRoutine, \
8223 PIO_STACK_LOCATION _IrpSp; \
8224 ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
8225 _CompletionRoutine != NULL : TRUE); \
8226 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
8227 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
8228 _IrpSp->Context = (_Context); \
8229 _IrpSp->Control = 0; \
8230 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
8231 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
8232 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
8238 IoSetCompletionRoutineEx(
8239 IN PDEVICE_OBJECT DeviceObject
,
8241 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
8243 IN BOOLEAN InvokeOnSuccess
,
8244 IN BOOLEAN InvokeOnError
,
8245 IN BOOLEAN InvokeOnCancel
);
8250 IoSetDeviceInterfaceState(
8251 IN PUNICODE_STRING SymbolicLinkName
,
8257 IoSetHardErrorOrVerifyDevice(
8259 IN PDEVICE_OBJECT DeviceObject
);
8263 * IoSetNextIrpStackLocation(
8266 #define IoSetNextIrpStackLocation(_Irp) \
8268 (_Irp)->CurrentLocation--; \
8269 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
8275 IoSetPartitionInformationEx(
8276 IN PDEVICE_OBJECT DeviceObject
,
8277 IN ULONG PartitionNumber
,
8278 IN
struct _SET_PARTITION_INFORMATION_EX
*PartitionInfo
);
8284 IN ACCESS_MASK DesiredAccess
,
8285 IN ULONG DesiredShareAccess
,
8286 IN OUT PFILE_OBJECT FileObject
,
8287 OUT PSHARE_ACCESS ShareAccess
);
8292 IoSetStartIoAttributes(
8293 IN PDEVICE_OBJECT DeviceObject
,
8294 IN BOOLEAN DeferredStartIo
,
8295 IN BOOLEAN NonCancelable
);
8300 IoSetSystemPartition(
8301 IN PUNICODE_STRING VolumeNameString
);
8306 IoSetThreadHardErrorMode(
8307 IN BOOLEAN EnableHardErrors
);
8312 * IN CCHAR StackSize)
8314 #define IoSizeOfIrp(_StackSize) \
8315 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
8319 * IoSkipCurrentIrpStackLocation(
8322 #define IoSkipCurrentIrpStackLocation(_Irp) \
8324 (_Irp)->CurrentLocation++; \
8325 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
8332 IN PDEVICE_OBJECT DeviceObject
,
8333 IN BOOLEAN Cancelable
);
8338 IoStartNextPacketByKey(
8339 IN PDEVICE_OBJECT DeviceObject
,
8340 IN BOOLEAN Cancelable
,
8347 IN PDEVICE_OBJECT DeviceObject
,
8349 IN PULONG Key OPTIONAL
,
8350 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
8356 IN PDEVICE_OBJECT DeviceObject
);
8362 IN PDEVICE_OBJECT DeviceObject
);
8367 IoUnregisterPlugPlayNotification(
8368 IN PVOID NotificationEntry
);
8373 IoUnregisterShutdownNotification(
8374 IN PDEVICE_OBJECT DeviceObject
);
8379 IoUpdateShareAccess(
8380 IN PFILE_OBJECT FileObject
,
8381 IN OUT PSHARE_ACCESS ShareAccess
);
8386 IoVerifyPartitionTable(
8387 IN PDEVICE_OBJECT DeviceObject
,
8388 IN BOOLEAN FixErrors
);
8393 IoVolumeDeviceToDosName(
8394 IN PVOID VolumeDeviceObject
,
8395 OUT PUNICODE_STRING DosName
);
8400 IoWMIAllocateInstanceIds(
8402 IN ULONG InstanceCount
,
8403 OUT ULONG
*FirstInstanceId
);
8408 IoWMIDeviceObjectToProviderId(
8409 IN PDEVICE_OBJECT DeviceObject
);
8414 IoWMIDeviceObjectToInstanceName(
8415 IN PVOID DataBlockObject
,
8416 IN PDEVICE_OBJECT DeviceObject
,
8417 OUT PUNICODE_STRING InstanceName
);
8423 IN PVOID DataBlockObject
,
8424 IN PUNICODE_STRING InstanceName
,
8426 IN ULONG InBufferSize
,
8427 IN OUT PULONG OutBufferSize
,
8428 IN OUT PUCHAR InOutBuffer
);
8433 IoWMIHandleToInstanceName(
8434 IN PVOID DataBlockObject
,
8435 IN HANDLE FileHandle
,
8436 OUT PUNICODE_STRING InstanceName
);
8442 IN GUID
*DataBlockGuid
,
8443 IN ULONG DesiredAccess
,
8444 OUT PVOID
*DataBlockObject
);
8450 IN PVOID DataBlockObject
,
8451 IN OUT ULONG
*InOutBufferSize
,
8452 OUT PVOID OutBuffer
);
8457 IoWMIQueryAllDataMultiple(
8458 IN PVOID
*DataBlockObjectList
,
8459 IN ULONG ObjectCount
,
8460 IN OUT ULONG
*InOutBufferSize
,
8461 OUT PVOID OutBuffer
);
8466 IoWMIQuerySingleInstance(
8467 IN PVOID DataBlockObject
,
8468 IN PUNICODE_STRING InstanceName
,
8469 IN OUT ULONG
*InOutBufferSize
,
8470 OUT PVOID OutBuffer
);
8475 IoWMIQuerySingleInstanceMultiple(
8476 IN PVOID
*DataBlockObjectList
,
8477 IN PUNICODE_STRING InstanceNames
,
8478 IN ULONG ObjectCount
,
8479 IN OUT ULONG
*InOutBufferSize
,
8480 OUT PVOID OutBuffer
);
8485 IoWMIRegistrationControl(
8486 IN PDEVICE_OBJECT DeviceObject
,
8492 IoWMISetNotificationCallback(
8494 IN WMI_NOTIFICATION_CALLBACK Callback
,
8500 IoWMISetSingleInstance(
8501 IN PVOID DataBlockObject
,
8502 IN PUNICODE_STRING InstanceName
,
8504 IN ULONG ValueBufferSize
,
8505 IN PVOID ValueBuffer
);
8511 IN PVOID DataBlockObject
,
8512 IN PUNICODE_STRING InstanceName
,
8513 IN ULONG DataItemId
,
8515 IN ULONG ValueBufferSize
,
8516 IN PVOID ValueBuffer
);
8521 IoWMISuggestInstanceName(
8522 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
8523 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
8524 IN BOOLEAN CombineNames
,
8525 OUT PUNICODE_STRING SuggestedInstanceName
);
8531 IN PVOID WnodeEventItem
);
8536 IoWriteErrorLogEntry(
8542 IoWritePartitionTableEx(
8543 IN PDEVICE_OBJECT DeviceObject
,
8544 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
*PartitionBuffer
);
8548 /** Kernel routines **/
8553 KeAcquireInStackQueuedSpinLock(
8554 IN PKSPIN_LOCK SpinLock
,
8555 IN PKLOCK_QUEUE_HANDLE LockHandle
);
8560 KeAcquireInStackQueuedSpinLockAtDpcLevel(
8561 IN PKSPIN_LOCK SpinLock
,
8562 IN PKLOCK_QUEUE_HANDLE LockHandle
);
8567 KeAcquireInterruptSpinLock(
8568 IN PKINTERRUPT Interrupt
);
8580 IN ULONG BugCheckCode
);
8586 IN ULONG BugCheckCode
,
8587 IN ULONG_PTR BugCheckParameter1
,
8588 IN ULONG_PTR BugCheckParameter2
,
8589 IN ULONG_PTR BugCheckParameter3
,
8590 IN ULONG_PTR BugCheckParameter4
);
8607 KeDelayExecutionThread(
8608 IN KPROCESSOR_MODE WaitMode
,
8609 IN BOOLEAN Alertable
,
8610 IN PLARGE_INTEGER Interval
);
8615 KeDeregisterBugCheckCallback(
8616 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
8621 KeEnterCriticalRegion(
8628 * IN BOOLEAN ReadOperation,
8629 * IN BOOLEAN DmaOperation)
8631 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8636 KeFlushWriteBuffer(VOID
);
8653 KeGetRecommendedSharedDataAlignment(
8659 KeInitializeDeviceQueue(
8660 IN PKDEVICE_QUEUE DeviceQueue
);
8672 KeInitializeSemaphore(
8673 IN PRKSEMAPHORE Semaphore
,
8680 KeInitializeSpinLock(
8681 IN PKSPIN_LOCK SpinLock
);
8692 KeInitializeTimerEx(
8694 IN TIMER_TYPE Type
);
8699 KeInsertByKeyDeviceQueue(
8700 IN PKDEVICE_QUEUE DeviceQueue
,
8701 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
8707 KeInsertDeviceQueue(
8708 IN PKDEVICE_QUEUE DeviceQueue
,
8709 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
8716 IN PVOID SystemArgument1
,
8717 IN PVOID SystemArgument2
);
8722 KeLeaveCriticalRegion(
8732 volatile LONG Barrier
;
8733 #if defined(__GNUC__)
8734 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
8735 #elif defined(_MSC_VER)
8736 __asm xchg
[Barrier
], eax
8747 IN KPRIORITY Increment
,
8753 KeQueryInterruptTime(
8759 KeQueryPerformanceCounter(
8760 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
8765 KeQueryPriorityThread(
8766 IN PRKTHREAD Thread
);
8772 OUT PLARGE_INTEGER CurrentTime
);
8778 OUT PLARGE_INTEGER TickCount
);
8783 KeQueryTimeIncrement(
8802 KeReadStateSemaphore(
8803 IN PRKSEMAPHORE Semaphore
);
8814 KeRegisterBugCheckCallback(
8815 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
8816 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
8819 IN PUCHAR Component
);
8824 KeReleaseInStackQueuedSpinLock(
8825 IN PKLOCK_QUEUE_HANDLE LockHandle
);
8830 KeReleaseInStackQueuedSpinLockFromDpcLevel(
8831 IN PKLOCK_QUEUE_HANDLE LockHandle
);
8836 KeReleaseInterruptSpinLock(
8837 IN PKINTERRUPT Interrupt
,
8851 IN PRKSEMAPHORE Semaphore
,
8852 IN KPRIORITY Increment
,
8857 PKDEVICE_QUEUE_ENTRY
8859 KeRemoveByKeyDeviceQueue(
8860 IN PKDEVICE_QUEUE DeviceQueue
,
8864 PKDEVICE_QUEUE_ENTRY
8866 KeRemoveDeviceQueue(
8867 IN PKDEVICE_QUEUE DeviceQueue
);
8872 KeRemoveEntryDeviceQueue(
8873 IN PKDEVICE_QUEUE DeviceQueue
,
8874 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
8891 KeRestoreFloatingPointState(
8892 IN PKFLOATING_SAVE FloatSave
);
8897 KeRevertToUserAffinityThread(VOID
);
8902 KeSaveFloatingPointState(
8903 OUT PKFLOATING_SAVE FloatSave
);
8908 KeSetBasePriorityThread(
8909 IN PRKTHREAD Thread
,
8917 IN KPRIORITY Increment
,
8925 IN KDPC_IMPORTANCE Importance
);
8930 KeSetPriorityThread(
8932 IN KPRIORITY Priority
);
8937 KeSetSystemAffinityThread(
8938 IN KAFFINITY Affinity
);
8943 KeSetTargetProcessorDpc(
8952 IN LARGE_INTEGER DueTime
,
8953 IN PKDPC Dpc OPTIONAL
);
8960 IN LARGE_INTEGER DueTime
,
8961 IN LONG Period OPTIONAL
,
8962 IN PKDPC Dpc OPTIONAL
);
8967 KeSetTimeUpdateNotifyRoutine(
8968 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
);
8973 KeStallExecutionProcessor(
8974 IN ULONG MicroSeconds
);
8979 KeSynchronizeExecution(
8980 IN PKINTERRUPT Interrupt
,
8981 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
8982 IN PVOID SynchronizeContext
);
8987 KeWaitForMultipleObjects(
8990 IN WAIT_TYPE WaitType
,
8991 IN KWAIT_REASON WaitReason
,
8992 IN KPROCESSOR_MODE WaitMode
,
8993 IN BOOLEAN Alertable
,
8994 IN PLARGE_INTEGER Timeout OPTIONAL
,
8995 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
9000 KeWaitForMutexObject(
9002 IN KWAIT_REASON WaitReason
,
9003 IN KPROCESSOR_MODE WaitMode
,
9004 IN BOOLEAN Alertable
,
9005 IN PLARGE_INTEGER Timeout OPTIONAL
);
9010 KeWaitForSingleObject(
9012 IN KWAIT_REASON WaitReason
,
9013 IN KPROCESSOR_MODE WaitMode
,
9014 IN BOOLEAN Alertable
,
9015 IN PLARGE_INTEGER Timeout OPTIONAL
);
9019 (NTAPI
*PKIPI_BROADCAST_WORKER
)(
9020 IN ULONG_PTR Argument
9027 IN PKIPI_BROADCAST_WORKER BroadcastFunction
,
9028 IN ULONG_PTR Context
9048 KeRaiseIrqlToDpcLevel(
9054 KeRaiseIrqlToSynchLevel(
9057 #define KeLowerIrql(a) KfLowerIrql(a)
9058 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9077 KeRaiseIrqlToDpcLevel(
9082 /** Memory manager routines **/
9089 IN ULONG NumberOfBytes
);
9094 MmAllocateContiguousMemory(
9095 IN ULONG NumberOfBytes
,
9096 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
9101 MmAllocateContiguousMemorySpecifyCache(
9102 IN SIZE_T NumberOfBytes
,
9103 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
9104 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
9105 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
9106 IN MEMORY_CACHING_TYPE CacheType
);
9111 MmAllocateMappingAddress(
9112 IN SIZE_T NumberOfBytes
,
9118 MmAllocateNonCachedMemory(
9119 IN ULONG NumberOfBytes
);
9124 MmAllocatePagesForMdl(
9125 IN PHYSICAL_ADDRESS LowAddress
,
9126 IN PHYSICAL_ADDRESS HighAddress
,
9127 IN PHYSICAL_ADDRESS SkipBytes
,
9128 IN SIZE_T TotalBytes
);
9133 MmBuildMdlForNonPagedPool(
9134 IN OUT PMDL MemoryDescriptorList
);
9140 OUT PVOID
*SectionObject
,
9141 IN ACCESS_MASK DesiredAccess
,
9142 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9143 IN PLARGE_INTEGER MaximumSize
,
9144 IN ULONG SectionPageProtection
,
9145 IN ULONG AllocationAttributes
,
9146 IN HANDLE FileHandle OPTIONAL
,
9147 IN PFILE_OBJECT File OPTIONAL
);
9149 typedef enum _MMFLUSH_TYPE
{
9157 MmFlushImageSection(
9158 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
9159 IN MMFLUSH_TYPE FlushType
);
9164 MmFreeContiguousMemory(
9165 IN PVOID BaseAddress
);
9170 MmFreeContiguousMemorySpecifyCache(
9171 IN PVOID BaseAddress
,
9172 IN SIZE_T NumberOfBytes
,
9173 IN MEMORY_CACHING_TYPE CacheType
);
9178 MmFreeMappingAddress(
9179 IN PVOID BaseAddress
,
9185 MmFreeNonCachedMemory(
9186 IN PVOID BaseAddress
,
9187 IN SIZE_T NumberOfBytes
);
9193 IN PMDL MemoryDescriptorList
);
9197 * MmGetMdlByteCount(
9200 #define MmGetMdlByteCount(_Mdl) \
9205 * MmGetMdlByteOffset(
9208 #define MmGetMdlByteOffset(_Mdl) \
9209 ((_Mdl)->ByteOffset)
9216 #define MmGetMdlPfnArray(_Mdl) \
9217 ((PPFN_NUMBER) ((_Mdl) + 1))
9221 * MmGetMdlVirtualAddress(
9224 #define MmGetMdlVirtualAddress(_Mdl) \
9225 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
9230 MmGetPhysicalAddress(
9231 IN PVOID BaseAddress
);
9234 PPHYSICAL_MEMORY_RANGE
9236 MmGetPhysicalMemoryRanges(
9242 MmGetVirtualForPhysical(
9243 IN PHYSICAL_ADDRESS PhysicalAddress
);
9248 MmMapLockedPagesSpecifyCache(
9249 IN PMDL MemoryDescriptorList
,
9250 IN KPROCESSOR_MODE AccessMode
,
9251 IN MEMORY_CACHING_TYPE CacheType
,
9252 IN PVOID BaseAddress
,
9253 IN ULONG BugCheckOnFailure
,
9254 IN MM_PAGE_PRIORITY Priority
);
9259 MmMapLockedPagesWithReservedMapping(
9260 IN PVOID MappingAddress
,
9262 IN PMDL MemoryDescriptorList
,
9263 IN MEMORY_CACHING_TYPE CacheType
);
9268 MmMapUserAddressesToPage(
9269 IN PVOID BaseAddress
,
9270 IN SIZE_T NumberOfBytes
,
9271 IN PVOID PageAddress
);
9277 IN PHYSICAL_ADDRESS PhysicalAddress
,
9278 IN SIZE_T NumberOfBytes
,
9279 IN MEMORY_CACHING_TYPE CacheType
);
9284 MmMapViewInSessionSpace(
9286 OUT PVOID
*MappedBase
,
9287 IN OUT PSIZE_T ViewSize
);
9292 MmMapViewInSystemSpace(
9294 OUT PVOID
*MappedBase
,
9295 IN PSIZE_T ViewSize
);
9300 MmMarkPhysicalMemoryAsBad(
9301 IN PPHYSICAL_ADDRESS StartAddress
,
9302 IN OUT PLARGE_INTEGER NumberOfBytes
);
9307 MmMarkPhysicalMemoryAsGood(
9308 IN PPHYSICAL_ADDRESS StartAddress
,
9309 IN OUT PLARGE_INTEGER NumberOfBytes
);
9313 * MmGetSystemAddressForMdlSafe(
9315 * IN MM_PAGE_PRIORITY Priority)
9317 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
9318 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
9319 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
9320 (_Mdl)->MappedSystemVa : \
9321 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
9322 KernelMode, MmCached, NULL, FALSE, _Priority)
9327 MmGetSystemRoutineAddress(
9328 IN PUNICODE_STRING SystemRoutineName
);
9332 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
9336 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
9338 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
9339 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
9344 * IN PMDL MemoryDescriptorList,
9348 #define MmInitializeMdl(_MemoryDescriptorList, \
9352 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
9353 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
9354 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
9355 (_MemoryDescriptorList)->MdlFlags = 0; \
9356 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
9357 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
9358 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
9365 IN PVOID VirtualAddress
);
9370 MmIsDriverVerifying(
9371 IN PDRIVER_OBJECT DriverObject
);
9376 MmIsThisAnNtAsSystem(
9382 MmIsVerifierEnabled(
9383 OUT PULONG VerifierFlags
);
9388 MmLockPagableDataSection(
9389 IN PVOID AddressWithinSection
);
9394 MmLockPagableImageSection(
9395 IN PVOID AddressWithinSection
);
9399 * MmLockPagableCodeSection(
9400 * IN PVOID AddressWithinSection)
9402 #define MmLockPagableCodeSection MmLockPagableDataSection
9407 MmLockPagableSectionByHandle(
9408 IN PVOID ImageSectionHandle
);
9414 IN PHYSICAL_ADDRESS PhysicalAddress
,
9415 IN ULONG NumberOfBytes
,
9416 IN MEMORY_CACHING_TYPE CacheEnable
);
9422 IN PMDL MemoryDescriptorList
,
9423 IN KPROCESSOR_MODE AccessMode
);
9429 IN PVOID AddressWithinSection
);
9434 MmProbeAndLockProcessPages(
9435 IN OUT PMDL MemoryDescriptorList
,
9436 IN PEPROCESS Process
,
9437 IN KPROCESSOR_MODE AccessMode
,
9438 IN LOCK_OPERATION Operation
);
9443 MmProtectMdlSystemAddress(
9444 IN PMDL MemoryDescriptorList
,
9445 IN ULONG NewProtect
);
9451 IN PVOID BaseAddress
,
9452 IN PMDL MemoryDescriptorList
);
9457 MmUnmapViewInSessionSpace(
9458 IN PVOID MappedBase
);
9463 MmUnmapViewInSystemSpace(
9464 IN PVOID MappedBase
);
9469 MmUnsecureVirtualMemory(
9470 IN HANDLE SecureHandle
);
9474 * MmPrepareMdlForReuse(
9477 #define MmPrepareMdlForReuse(_Mdl) \
9479 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
9480 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
9481 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
9482 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
9483 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
9490 MmProbeAndLockPages(
9491 IN OUT PMDL MemoryDescriptorList
,
9492 IN KPROCESSOR_MODE AccessMode
,
9493 IN LOCK_OPERATION Operation
);
9504 MmRemovePhysicalMemory(
9505 IN PPHYSICAL_ADDRESS StartAddress
,
9506 IN OUT PLARGE_INTEGER NumberOfBytes
);
9511 MmResetDriverPaging(
9512 IN PVOID AddressWithinSection
);
9517 MmSecureVirtualMemory(
9520 IN ULONG ProbeMode
);
9532 MmUnlockPagableImageSection(
9533 IN PVOID ImageSectionHandle
);
9539 IN PMDL MemoryDescriptorList
);
9545 IN PVOID BaseAddress
,
9546 IN SIZE_T NumberOfBytes
);
9551 MmUnmapReservedMapping(
9552 IN PVOID BaseAddress
,
9554 IN PMDL MemoryDescriptorList
);
9559 MmUnmapVideoDisplay(
9560 IN PVOID BaseAddress
,
9561 IN SIZE_T NumberOfBytes
);
9565 /** Object manager routines **/
9571 IN PACCESS_STATE AccessState
,
9572 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
9574 IN POBJECT_TYPE Type
);
9579 ObDereferenceSecurityDescriptor(
9580 PSECURITY_DESCRIPTOR SecurityDescriptor
,
9586 ObfDereferenceObject(
9591 * ObDereferenceObject(
9594 #define ObDereferenceObject ObfDereferenceObject
9599 ObGetObjectSecurity(
9601 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
9602 OUT PBOOLEAN MemoryAllocated
);
9609 IN PACCESS_STATE PassedAccessState OPTIONAL
,
9610 IN ACCESS_MASK DesiredAccess
,
9611 IN ULONG AdditionalReferences
,
9612 OUT PVOID
* ReferencedObject OPTIONAL
,
9613 OUT PHANDLE Handle
);
9624 ObLogSecurityDescriptor(
9625 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor
,
9626 OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
9630 * ObReferenceObject(
9633 #define ObReferenceObject ObfReferenceObject
9638 ObMakeTemporaryObject(
9645 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9646 IN POBJECT_TYPE ObjectType
,
9647 IN KPROCESSOR_MODE AccessMode
,
9648 IN PACCESS_STATE PassedAccessState
,
9649 IN ACCESS_MASK DesiredAccess
,
9650 IN OUT PVOID ParseContext OPTIONAL
,
9651 OUT PHANDLE Handle
);
9656 ObOpenObjectByPointer(
9658 IN ULONG HandleAttributes
,
9659 IN PACCESS_STATE PassedAccessState OPTIONAL
,
9660 IN ACCESS_MASK DesiredAccess OPTIONAL
,
9661 IN POBJECT_TYPE ObjectType OPTIONAL
,
9662 IN KPROCESSOR_MODE AccessMode
,
9663 OUT PHANDLE Handle
);
9668 ObQueryObjectAuditingByHandle(
9670 OUT PBOOLEAN GenerateOnClose
);
9675 ObReferenceObjectByHandle(
9677 IN ACCESS_MASK DesiredAccess
,
9678 IN POBJECT_TYPE ObjectType OPTIONAL
,
9679 IN KPROCESSOR_MODE AccessMode
,
9681 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
9686 ObReferenceObjectByName(
9687 IN PUNICODE_STRING ObjectPath
,
9688 IN ULONG Attributes
,
9689 IN PACCESS_STATE PassedAccessState OPTIONAL
,
9690 IN ACCESS_MASK DesiredAccess OPTIONAL
,
9691 IN POBJECT_TYPE ObjectType
,
9692 IN KPROCESSOR_MODE AccessMode
,
9693 IN OUT PVOID ParseContext OPTIONAL
,
9699 ObReferenceObjectByPointer(
9701 IN ACCESS_MASK DesiredAccess
,
9702 IN POBJECT_TYPE ObjectType
,
9703 IN KPROCESSOR_MODE AccessMode
);
9708 ObReferenceSecurityDescriptor(
9709 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
9715 ObReleaseObjectSecurity(
9716 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
9717 IN BOOLEAN MemoryAllocated
);
9721 /** Process manager routines **/
9726 PsCreateSystemProcess(
9727 IN PHANDLE ProcessHandle
,
9728 IN ACCESS_MASK DesiredAccess
,
9729 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9734 PsCreateSystemThread(
9735 OUT PHANDLE ThreadHandle
,
9736 IN ULONG DesiredAccess
,
9737 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9738 IN HANDLE ProcessHandle OPTIONAL
,
9739 OUT PCLIENT_ID ClientId OPTIONAL
,
9740 IN PKSTART_ROUTINE StartRoutine
,
9741 IN PVOID StartContext
);
9745 * PsGetCurrentProcess(VOID)
9747 #define PsGetCurrentProcess IoGetCurrentProcess
9752 PsGetCurrentProcessId(
9757 * PsGetCurrentThread(VOID)
9759 #define PsGetCurrentThread() \
9760 ((PETHREAD) KeGetCurrentThread())
9765 PsGetCurrentThreadId(
9772 PULONG MajorVersion OPTIONAL
,
9773 PULONG MinorVersion OPTIONAL
,
9774 PULONG BuildNumber OPTIONAL
,
9775 PUNICODE_STRING CSDVersion OPTIONAL
);
9780 PsRemoveCreateThreadNotifyRoutine(
9781 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
9786 PsRemoveLoadImageNotifyRoutine(
9787 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
9792 PsSetCreateProcessNotifyRoutine(
9793 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine
,
9799 PsSetCreateThreadNotifyRoutine(
9800 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
9805 PsSetLoadImageNotifyRoutine(
9806 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
9811 PsTerminateSystemThread(
9812 IN NTSTATUS ExitStatus
);
9816 /** Security reference monitor routines **/
9822 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
9823 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
9824 IN BOOLEAN SubjectContextLocked
,
9825 IN ACCESS_MASK DesiredAccess
,
9826 IN ACCESS_MASK PreviouslyGrantedAccess
,
9827 OUT PPRIVILEGE_SET
*Privileges OPTIONAL
,
9828 IN PGENERIC_MAPPING GenericMapping
,
9829 IN KPROCESSOR_MODE AccessMode
,
9830 OUT PACCESS_MASK GrantedAccess
,
9831 OUT PNTSTATUS AccessStatus
);
9837 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
9838 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
9839 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
9840 IN BOOLEAN IsDirectoryObject
,
9841 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
9842 IN PGENERIC_MAPPING GenericMapping
,
9843 IN POOL_TYPE PoolType
);
9849 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
9850 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
9851 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
9852 IN GUID
*ObjectType OPTIONAL
,
9853 IN BOOLEAN IsDirectoryObject
,
9854 IN ULONG AutoInheritFlags
,
9855 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
9856 IN PGENERIC_MAPPING GenericMapping
,
9857 IN POOL_TYPE PoolType
);
9863 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
);
9868 SeSinglePrivilegeCheck(
9869 LUID PrivilegeValue
,
9870 KPROCESSOR_MODE PreviousMode
);
9875 SeValidSecurityDescriptor(
9877 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
9881 /** NtXxx routines **/
9887 OUT PHANDLE ProcessHandle
,
9888 IN ACCESS_MASK DesiredAccess
,
9889 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9890 IN PCLIENT_ID ClientId OPTIONAL
);
9895 NtQueryInformationProcess(
9896 IN HANDLE ProcessHandle
,
9897 IN PROCESSINFOCLASS ProcessInformationClass
,
9898 OUT PVOID ProcessInformation
,
9899 IN ULONG ProcessInformationLength
,
9900 OUT PULONG ReturnLength OPTIONAL
);
9904 /** NtXxx and ZwXxx routines **/
9910 IN HANDLE TimerHandle
,
9911 OUT PBOOLEAN CurrentState OPTIONAL
);
9928 ZwCreateDirectoryObject(
9929 OUT PHANDLE DirectoryHandle
,
9930 IN ACCESS_MASK DesiredAccess
,
9931 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9937 OUT PHANDLE EventHandle
,
9938 IN ACCESS_MASK DesiredAccess
,
9939 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9940 IN EVENT_TYPE EventType
,
9941 IN BOOLEAN InitialState
);
9947 OUT PHANDLE EventHandle
,
9948 IN ACCESS_MASK DesiredAccess
,
9949 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9950 IN EVENT_TYPE EventType
,
9951 IN BOOLEAN InitialState
);
9957 OUT PHANDLE FileHandle
,
9958 IN ACCESS_MASK DesiredAccess
,
9959 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9960 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9961 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
9962 IN ULONG FileAttributes
,
9963 IN ULONG ShareAccess
,
9964 IN ULONG CreateDisposition
,
9965 IN ULONG CreateOptions
,
9966 IN PVOID EaBuffer OPTIONAL
,
9973 OUT PHANDLE KeyHandle
,
9974 IN ACCESS_MASK DesiredAccess
,
9975 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9976 IN ULONG TitleIndex
,
9977 IN PUNICODE_STRING Class OPTIONAL
,
9978 IN ULONG CreateOptions
,
9979 OUT PULONG Disposition OPTIONAL
);
9985 OUT PHANDLE TimerHandle
,
9986 IN ACCESS_MASK DesiredAccess
,
9987 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9988 IN TIMER_TYPE TimerType
);
9994 IN HANDLE KeyHandle
);
10000 IN HANDLE KeyHandle
,
10001 IN PUNICODE_STRING ValueName
);
10006 NtDeviceIoControlFile(
10007 IN HANDLE DeviceHandle
,
10008 IN HANDLE Event OPTIONAL
,
10009 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
10010 IN PVOID UserApcContext OPTIONAL
,
10011 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10012 IN ULONG IoControlCode
,
10013 IN PVOID InputBuffer
,
10014 IN ULONG InputBufferSize
,
10015 OUT PVOID OutputBuffer
,
10016 IN ULONG OutputBufferSize
);
10021 ZwDeviceIoControlFile(
10022 IN HANDLE DeviceHandle
,
10023 IN HANDLE Event OPTIONAL
,
10024 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
10025 IN PVOID UserApcContext OPTIONAL
,
10026 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10027 IN ULONG IoControlCode
,
10028 IN PVOID InputBuffer
,
10029 IN ULONG InputBufferSize
,
10030 OUT PVOID OutputBuffer
,
10031 IN ULONG OutputBufferSize
);
10037 IN HANDLE KeyHandle
,
10039 IN KEY_INFORMATION_CLASS KeyInformationClass
,
10040 OUT PVOID KeyInformation
,
10042 OUT PULONG ResultLength
);
10047 ZwEnumerateValueKey(
10048 IN HANDLE KeyHandle
,
10050 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
10051 OUT PVOID KeyValueInformation
,
10053 OUT PULONG ResultLength
);
10059 IN HANDLE KeyHandle
);
10064 ZwMakeTemporaryObject(
10070 NtMapViewOfSection(
10071 IN HANDLE SectionHandle
,
10072 IN HANDLE ProcessHandle
,
10073 IN OUT PVOID
*BaseAddress
,
10075 IN ULONG CommitSize
,
10076 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
10077 IN OUT PSIZE_T ViewSize
,
10078 IN SECTION_INHERIT InheritDisposition
,
10079 IN ULONG AllocationType
,
10085 ZwMapViewOfSection(
10086 IN HANDLE SectionHandle
,
10087 IN HANDLE ProcessHandle
,
10088 IN OUT PVOID
*BaseAddress
,
10090 IN ULONG CommitSize
,
10091 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
10092 IN OUT PSIZE_T ViewSize
,
10093 IN SECTION_INHERIT InheritDisposition
,
10094 IN ULONG AllocationType
,
10101 OUT PHANDLE FileHandle
,
10102 IN ACCESS_MASK DesiredAccess
,
10103 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10104 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10105 IN ULONG ShareAccess
,
10106 IN ULONG OpenOptions
);
10112 OUT PHANDLE FileHandle
,
10113 IN ACCESS_MASK DesiredAccess
,
10114 IN POBJECT_ATTRIBUTES ObjectAttributes
,
10115 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10116 IN ULONG ShareAccess
,
10117 IN ULONG OpenOptions
);
10123 OUT PHANDLE KeyHandle
,
10124 IN ACCESS_MASK DesiredAccess
,
10125 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10131 OUT PHANDLE SectionHandle
,
10132 IN ACCESS_MASK DesiredAccess
,
10133 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10138 ZwOpenSymbolicLinkObject(
10139 OUT PHANDLE LinkHandle
,
10140 IN ACCESS_MASK DesiredAccess
,
10141 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10147 OUT PHANDLE TimerHandle
,
10148 IN ACCESS_MASK DesiredAccess
,
10149 IN POBJECT_ATTRIBUTES ObjectAttributes
);
10154 ZwQueryInformationFile(
10155 IN HANDLE FileHandle
,
10156 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10157 OUT PVOID FileInformation
,
10159 IN FILE_INFORMATION_CLASS FileInformationClass
);
10165 IN HANDLE KeyHandle
,
10166 IN KEY_INFORMATION_CLASS KeyInformationClass
,
10167 OUT PVOID KeyInformation
,
10169 OUT PULONG ResultLength
);
10174 ZwQuerySymbolicLinkObject(
10175 IN HANDLE LinkHandle
,
10176 IN OUT PUNICODE_STRING LinkTarget
,
10177 OUT PULONG ReturnedLength OPTIONAL
);
10183 IN HANDLE KeyHandle
,
10184 IN PUNICODE_STRING ValueName
,
10185 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
10186 OUT PVOID KeyValueInformation
,
10188 OUT PULONG ResultLength
);
10194 IN HANDLE FileHandle
,
10195 IN HANDLE Event OPTIONAL
,
10196 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
10197 IN PVOID ApcContext OPTIONAL
,
10198 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10201 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
10202 IN PULONG Key OPTIONAL
);
10208 IN HANDLE FileHandle
,
10209 IN HANDLE Event OPTIONAL
,
10210 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
10211 IN PVOID ApcContext OPTIONAL
,
10212 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10215 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
10216 IN PULONG Key OPTIONAL
);
10222 IN HANDLE EventHandle
,
10223 OUT PLONG PreviousState OPTIONAL
);
10229 IN HANDLE EventHandle
,
10230 OUT PLONG PreviousState OPTIONAL
);
10235 ZwSetInformationFile(
10236 IN HANDLE FileHandle
,
10237 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10238 IN PVOID FileInformation
,
10240 IN FILE_INFORMATION_CLASS FileInformationClass
);
10245 ZwSetInformationThread(
10246 IN HANDLE ThreadHandle
,
10247 IN THREADINFOCLASS ThreadInformationClass
,
10248 IN PVOID ThreadInformation
,
10249 IN ULONG ThreadInformationLength
);
10255 IN HANDLE TimerHandle
,
10256 IN PLARGE_INTEGER DueTime
,
10257 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL
,
10258 IN PVOID TimerContext OPTIONAL
,
10259 IN BOOLEAN WakeTimer
,
10260 IN LONG Period OPTIONAL
,
10261 OUT PBOOLEAN PreviousState OPTIONAL
);
10267 IN HANDLE KeyHandle
,
10268 IN PUNICODE_STRING ValueName
,
10269 IN ULONG TitleIndex OPTIONAL
,
10272 IN ULONG DataSize
);
10274 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
10275 #define AT_EXTENDABLE_FILE 0x00002000
10276 #define AT_RESERVED 0x20000000
10277 #define AT_ROUND_TO_PAGE 0x40000000
10282 NtUnmapViewOfSection(
10283 IN HANDLE ProcessHandle
,
10284 IN PVOID BaseAddress
);
10289 ZwUnmapViewOfSection(
10290 IN HANDLE ProcessHandle
,
10291 IN PVOID BaseAddress
);
10296 NtWaitForSingleObject(
10297 IN HANDLE ObjectHandle
,
10298 IN BOOLEAN Alertable
,
10299 IN PLARGE_INTEGER TimeOut OPTIONAL
);
10304 ZwWaitForSingleObject(
10305 IN HANDLE ObjectHandle
,
10306 IN BOOLEAN Alertable
,
10307 IN PLARGE_INTEGER TimeOut OPTIONAL
);
10313 IN HANDLE FileHandle
,
10314 IN HANDLE Event OPTIONAL
,
10315 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
10316 IN PVOID ApcContext OPTIONAL
,
10317 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10320 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
10321 IN PULONG Key OPTIONAL
);
10327 IN HANDLE FileHandle
,
10328 IN HANDLE Event OPTIONAL
,
10329 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
10330 IN PVOID ApcContext OPTIONAL
,
10331 OUT PIO_STATUS_BLOCK IoStatusBlock
,
10334 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
10335 IN PULONG Key OPTIONAL
);
10339 /** Power management support routines **/
10345 IN PDEVICE_OBJECT DeviceObject
,
10351 PoRegisterDeviceForIdleDetection(
10352 IN PDEVICE_OBJECT DeviceObject
,
10353 IN ULONG ConservationIdleTime
,
10354 IN ULONG PerformanceIdleTime
,
10355 IN DEVICE_POWER_STATE State
);
10360 PoRegisterSystemState(
10361 IN PVOID StateHandle
,
10362 IN EXECUTION_STATE Flags
);
10368 IN PDEVICE_OBJECT DeviceObject
,
10369 IN UCHAR MinorFunction
,
10370 IN POWER_STATE PowerState
,
10371 IN PREQUEST_POWER_COMPLETE CompletionFunction
,
10373 OUT PIRP
*Irp OPTIONAL
);
10378 PoRequestShutdownEvent(
10385 PULONG IdlePointer
);
10391 IN PDEVICE_OBJECT DeviceObject
,
10392 IN POWER_STATE_TYPE Type
,
10393 IN POWER_STATE State
);
10399 IN EXECUTION_STATE Flags
);
10404 PoStartNextPowerIrp(
10410 PoUnregisterSystemState(
10411 IN PVOID StateHandle
);
10415 /** WMI library support routines **/
10420 WmiCompleteRequest(
10421 IN PDEVICE_OBJECT DeviceObject
,
10423 IN NTSTATUS Status
,
10424 IN ULONG BufferUsed
,
10425 IN CCHAR PriorityBoost
);
10431 IN PDEVICE_OBJECT DeviceObject
,
10433 IN ULONG InstanceIndex
,
10434 IN ULONG EventDataSize
,
10435 IN PVOID EventData
);
10440 WmiQueryTraceInformation(
10441 IN TRACE_INFORMATION_CLASS TraceInformationClass
,
10442 OUT PVOID TraceInformation
,
10443 IN ULONG TraceInformationLength
,
10444 OUT PULONG RequiredLength OPTIONAL
,
10445 IN PVOID Buffer OPTIONAL
);
10451 IN PWMILIB_CONTEXT WmiLibInfo
,
10452 IN PDEVICE_OBJECT DeviceObject
,
10454 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition
);
10460 IN TRACEHANDLE LoggerHandle
,
10461 IN ULONG MessageFlags
,
10462 IN LPGUID MessageGuid
,
10463 IN USHORT MessageNumber
,
10467 /* FIXME: Get va_list from where? */
10472 IN TRACEHANDLE LoggerHandle
,
10473 IN ULONG MessageFlags
,
10474 IN LPGUID MessageGuid
,
10475 IN USHORT MessageNumber
,
10476 IN
va_list MessageArgList
);
10480 /** Kernel debugger routines **/
10502 DbgBreakPointWithStatus(
10514 IN ULONG ComponentId
,
10522 DbgPrintReturnControlC(
10529 DbgQueryDebugFilterState(
10530 IN ULONG ComponentId
,
10536 DbgSetDebugFilterState(
10537 IN ULONG ComponentId
,
10543 #define KdPrint(_x_) DbgPrint _x_
10544 #define KdPrintEx(_x_) DbgPrintEx _x_
10545 #define KdBreakPoint() DbgBreakPoint()
10546 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
10550 #define KdPrint(_x_)
10551 #define KdPrintEx(_x_)
10552 #define KdBreakPoint()
10553 #define KdBreakPointWithStatus(s)
10557 #if defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
10559 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent
;
10560 extern NTOSAPI PBOOLEAN KdDebuggerEnabled
;
10561 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
10562 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
10566 extern BOOLEAN KdDebuggerNotPresent
;
10567 extern BOOLEAN KdDebuggerEnabled
;
10568 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10569 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10577 #endif /* __WINDDK_H */