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
35 ** Definitions specific to this Device Driver Kit
37 #define DDKAPI __stdcall
38 #define DDKFASTAPI __fastcall
39 #define DDKCDECLAPI __cdecl
41 #if defined(_NTOSKRNL_)
43 #define NTOSAPI DECL_EXPORT
45 #define DECLARE_INTERNAL_OBJECT(x) typedef struct _##x; typedef struct _##x *P##x;
46 #define DECLARE_INTERNAL_OBJECT2(x,y) typedef struct _##x; typedef struct _##x *P##y;
49 #define NTOSAPI DECL_IMPORT
51 #define DECLARE_INTERNAL_OBJECT(x) struct _##x; typedef struct _##x *P##x;
52 #define DECLARE_INTERNAL_OBJECT2(x,y) struct _##x; typedef struct _##x *P##y;
57 #define NTHALAPI DECL_EXPORT
61 #define NTHALAPI DECL_IMPORT
65 /* Pseudo modifiers for parameters */
72 #define VOLATILE volatile
74 #define RESTRICTED_POINTER
75 #define POINTER_ALIGNMENT
77 #ifdef NONAMELESSUNION
78 # define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name
79 # define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name
81 # define _DDK_DUMMYUNION_MEMBER(name) name
82 # define _DDK_DUMMYUNION_N_MEMBER(n, name) name
86 ** Forward declarations
98 struct _DEVICE_OBJECT
;
99 struct _DRIVER_OBJECT
;
100 struct _SECTION_OBJECT
;
101 struct _IO_STATUS_BLOCK
;
102 struct _DEVICE_DESCRIPTION
;
103 struct _SCATTER_GATHER_LIST
;
105 DECLARE_INTERNAL_OBJECT(ADAPTER_OBJECT
)
106 DECLARE_INTERNAL_OBJECT(DMA_ADAPTER
)
107 DECLARE_INTERNAL_OBJECT(IO_STATUS_BLOCK
)
108 DECLARE_INTERNAL_OBJECT(SECTION_OBJECT
)
111 /* FIXME: Unknown definitions */
112 struct _SET_PARTITION_INFORMATION_EX
;
113 typedef ULONG WAIT_TYPE
;
116 typedef HANDLE TRACEHANDLE
;
117 typedef PVOID PWMILIB_CONTEXT
;
118 typedef PVOID PSYSCTL_IRP_DISPOSITION
;
119 typedef ULONG LOGICAL
;
123 ** Routines specific to this DDK
125 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
127 static __inline
struct _KPCR
* KeGetCurrentKPCR(
131 #if defined(__GNUC__)
132 __asm__
__volatile__ ("movl %%fs:0x1C, %0\n\t"
136 #elif defined(_MSC_VER)
137 __asm mov eax
, fs
:[1Ch
]
138 __asm mov
[Value
], eax
140 return (struct _KPCR
*) Value
;
143 static __inline
struct _KPRCB
* KeGetCurrentPrcb(
147 #if defined(__GNUC__)
148 __asm__
__volatile__ ("movl %%fs:0x20, %0\n\t"
152 #elif defined(_MSC_VER)
153 __asm mov eax
, fs
:[20h
]
154 __asm mov
[Value
], eax
156 return (struct _KPRCB
*) Value
;
163 typedef LONG KPRIORITY
;
164 typedef UCHAR KIRQL
, *PKIRQL
;
165 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
166 typedef ULONG KAFFINITY
, *PKAFFINITY
;
167 typedef UCHAR KPROCESSOR_MODE
;
176 /* Structures not exposed to drivers */
177 typedef struct _IO_TIMER
*PIO_TIMER
;
178 typedef struct _KPROCESS
*PKPROCESS
;
179 typedef struct _EPROCESS
*PEPROCESS
;
180 typedef struct _ETHREAD
*PETHREAD
;
181 typedef struct _KINTERRUPT
*PKINTERRUPT
;
182 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
183 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
184 typedef struct _COMPRESSED_DATA_INFO
*PCOMPRESSED_DATA_INFO
;
185 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
186 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
187 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
188 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
189 typedef struct _PEB
*PPEB
;
190 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
193 #define MAXIMUM_PROCESSORS 32
195 #define MAXIMUM_WAIT_OBJECTS 64
197 #define METHOD_BUFFERED 0
198 #define METHOD_IN_DIRECT 1
199 #define METHOD_OUT_DIRECT 2
200 #define METHOD_NEITHER 3
202 #define LOW_PRIORITY 0
203 #define LOW_REALTIME_PRIORITY 16
204 #define HIGH_PRIORITY 31
205 #define MAXIMUM_PRIORITY 32
207 #define FILE_SUPERSEDED 0x00000000
208 #define FILE_OPENED 0x00000001
209 #define FILE_CREATED 0x00000002
210 #define FILE_OVERWRITTEN 0x00000003
211 #define FILE_EXISTS 0x00000004
212 #define FILE_DOES_NOT_EXIST 0x00000005
214 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
215 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
217 /* also in winnt.h */
218 #define FILE_LIST_DIRECTORY 0x00000001
219 #define FILE_READ_DATA 0x00000001
220 #define FILE_ADD_FILE 0x00000002
221 #define FILE_WRITE_DATA 0x00000002
222 #define FILE_ADD_SUBDIRECTORY 0x00000004
223 #define FILE_APPEND_DATA 0x00000004
224 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
225 #define FILE_READ_EA 0x00000008
226 #define FILE_WRITE_EA 0x00000010
227 #define FILE_EXECUTE 0x00000020
228 #define FILE_TRAVERSE 0x00000020
229 #define FILE_DELETE_CHILD 0x00000040
230 #define FILE_READ_ATTRIBUTES 0x00000080
231 #define FILE_WRITE_ATTRIBUTES 0x00000100
233 #define FILE_SHARE_READ 0x00000001
234 #define FILE_SHARE_WRITE 0x00000002
235 #define FILE_SHARE_DELETE 0x00000004
236 #define FILE_SHARE_VALID_FLAGS 0x00000007
238 #define FILE_ATTRIBUTE_READONLY 0x00000001
239 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
240 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
241 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
242 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
243 #define FILE_ATTRIBUTE_DEVICE 0x00000040
244 #define FILE_ATTRIBUTE_NORMAL 0x00000080
245 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
246 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
247 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
248 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
249 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
250 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
251 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
253 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
254 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
256 #define FILE_COPY_STRUCTURED_STORAGE 0x00000041
257 #define FILE_STRUCTURED_STORAGE 0x00000441
259 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
260 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
261 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
262 #define FILE_VALID_SET_FLAGS 0x00000036
264 #define FILE_SUPERSEDE 0x00000000
265 #define FILE_OPEN 0x00000001
266 #define FILE_CREATE 0x00000002
267 #define FILE_OPEN_IF 0x00000003
268 #define FILE_OVERWRITE 0x00000004
269 #define FILE_OVERWRITE_IF 0x00000005
270 #define FILE_MAXIMUM_DISPOSITION 0x00000005
272 #define FILE_DIRECTORY_FILE 0x00000001
273 #define FILE_WRITE_THROUGH 0x00000002
274 #define FILE_SEQUENTIAL_ONLY 0x00000004
275 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
276 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
277 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
278 #define FILE_NON_DIRECTORY_FILE 0x00000040
279 #define FILE_CREATE_TREE_CONNECTION 0x00000080
280 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
281 #define FILE_NO_EA_KNOWLEDGE 0x00000200
282 #define FILE_OPEN_FOR_RECOVERY 0x00000400
283 #define FILE_RANDOM_ACCESS 0x00000800
284 #define FILE_DELETE_ON_CLOSE 0x00001000
285 #define FILE_OPEN_BY_FILE_ID 0x00002000
286 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
287 #define FILE_NO_COMPRESSION 0x00008000
288 #define FILE_RESERVE_OPFILTER 0x00100000
289 #define FILE_OPEN_REPARSE_POINT 0x00200000
290 #define FILE_OPEN_NO_RECALL 0x00400000
291 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
293 #define FILE_ANY_ACCESS 0x00000000
294 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
295 #define FILE_READ_ACCESS 0x00000001
296 #define FILE_WRITE_ACCESS 0x00000002
298 #define FILE_ALL_ACCESS \
299 (STANDARD_RIGHTS_REQUIRED | \
303 #define FILE_GENERIC_EXECUTE \
304 (STANDARD_RIGHTS_EXECUTE | \
305 FILE_READ_ATTRIBUTES | \
309 #define FILE_GENERIC_READ \
310 (STANDARD_RIGHTS_READ | \
312 FILE_READ_ATTRIBUTES | \
316 #define FILE_GENERIC_WRITE \
317 (STANDARD_RIGHTS_WRITE | \
319 FILE_WRITE_ATTRIBUTES | \
325 #define DIRECTORY_QUERY (0x0001)
326 #define DIRECTORY_TRAVERSE (0x0002)
327 #define DIRECTORY_CREATE_OBJECT (0x0004)
328 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
329 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
331 #define EVENT_QUERY_STATE (0x0001)
332 #define EVENT_MODIFY_STATE (0x0002)
333 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
335 #define SEMAPHORE_QUERY_STATE (0x0001)
336 #define SEMAPHORE_MODIFY_STATE (0x0002)
337 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
339 /* Exported object types */
340 extern NTOSAPI POBJECT_TYPE ExDesktopObjectType
;
341 extern NTOSAPI POBJECT_TYPE ExEventObjectType
;
342 extern NTOSAPI POBJECT_TYPE ExSemaphoreObjectType
;
343 extern NTOSAPI POBJECT_TYPE ExWindowStationObjectType
;
344 extern NTOSAPI ULONG IoDeviceHandlerObjectSize
;
345 extern NTOSAPI POBJECT_TYPE IoDeviceHandlerObjectType
;
346 extern NTOSAPI POBJECT_TYPE IoDeviceObjectType
;
347 extern NTOSAPI POBJECT_TYPE IoDriverObjectType
;
348 extern NTOSAPI POBJECT_TYPE IoFileObjectType
;
349 extern NTOSAPI POBJECT_TYPE LpcPortObjectType
;
350 extern NTOSAPI POBJECT_TYPE MmSectionObjectType
;
351 extern NTOSAPI POBJECT_TYPE SeTokenObjectType
;
353 extern NTOSAPI CCHAR KeNumberProcessors
;
355 #define PROCESSOR_FEATURE_MAX 64
357 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
362 } ALTERNATIVE_ARCHITECTURE_TYPE
;
364 typedef struct _KSYSTEM_TIME
369 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
371 typedef struct _KUSER_SHARED_DATA
373 ULONG TickCountLowDeprecated
;
374 ULONG TickCountMultiplier
;
375 volatile KSYSTEM_TIME InterruptTime
;
376 volatile KSYSTEM_TIME SystemTime
;
377 volatile KSYSTEM_TIME TimeZoneBias
;
378 USHORT ImageNumberLow
;
379 USHORT ImageNumberHigh
;
380 WCHAR NtSystemRoot
[ 260 ];
381 ULONG MaxStackTraceDepth
;
382 ULONG CryptoExponent
;
384 ULONG LargePageMinimum
;
385 ULONG Reserved2
[ 7 ];
386 NT_PRODUCT_TYPE NtProductType
;
387 BOOLEAN ProductTypeIsValid
;
388 ULONG NtMajorVersion
;
389 ULONG NtMinorVersion
;
390 BOOLEAN ProcessorFeatures
[PROCESSOR_FEATURE_MAX
];
393 volatile ULONG TimeSlip
;
394 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture
;
395 LARGE_INTEGER SystemExpirationDate
;
397 BOOLEAN KdDebuggerEnabled
;
398 volatile ULONG ActiveConsoleId
;
399 volatile ULONG DismountCount
;
400 ULONG ComPlusPackage
;
401 ULONG LastSystemRITEventTickCount
;
402 ULONG NumberOfPhysicalPages
;
403 BOOLEAN SafeBootMode
;
406 ULONGLONG SystemCall
[4];
408 volatile KSYSTEM_TIME TickCount
;
409 volatile ULONG64 TickCountQuad
;
411 } KUSER_SHARED_DATA
, *PKUSER_SHARED_DATA
;
414 ** IRP function codes
417 #define IRP_MJ_CREATE 0x00
418 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
419 #define IRP_MJ_CLOSE 0x02
420 #define IRP_MJ_READ 0x03
421 #define IRP_MJ_WRITE 0x04
422 #define IRP_MJ_QUERY_INFORMATION 0x05
423 #define IRP_MJ_SET_INFORMATION 0x06
424 #define IRP_MJ_QUERY_EA 0x07
425 #define IRP_MJ_SET_EA 0x08
426 #define IRP_MJ_FLUSH_BUFFERS 0x09
427 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
428 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
429 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
430 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
431 #define IRP_MJ_DEVICE_CONTROL 0x0e
432 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
433 #define IRP_MJ_SCSI 0x0f
434 #define IRP_MJ_SHUTDOWN 0x10
435 #define IRP_MJ_LOCK_CONTROL 0x11
436 #define IRP_MJ_CLEANUP 0x12
437 #define IRP_MJ_CREATE_MAILSLOT 0x13
438 #define IRP_MJ_QUERY_SECURITY 0x14
439 #define IRP_MJ_SET_SECURITY 0x15
440 #define IRP_MJ_POWER 0x16
441 #define IRP_MJ_SYSTEM_CONTROL 0x17
442 #define IRP_MJ_DEVICE_CHANGE 0x18
443 #define IRP_MJ_QUERY_QUOTA 0x19
444 #define IRP_MJ_SET_QUOTA 0x1a
445 #define IRP_MJ_PNP 0x1b
446 #define IRP_MJ_PNP_POWER 0x1b
447 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
449 #define IRP_MN_QUERY_DIRECTORY 0x01
450 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
452 #define IRP_MN_USER_FS_REQUEST 0x00
453 #define IRP_MN_MOUNT_VOLUME 0x01
454 #define IRP_MN_VERIFY_VOLUME 0x02
455 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
456 #define IRP_MN_TRACK_LINK 0x04
457 #define IRP_MN_KERNEL_CALL 0x04
459 #define IRP_MN_LOCK 0x01
460 #define IRP_MN_UNLOCK_SINGLE 0x02
461 #define IRP_MN_UNLOCK_ALL 0x03
462 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
464 #define IRP_MN_NORMAL 0x00
465 #define IRP_MN_DPC 0x01
466 #define IRP_MN_MDL 0x02
467 #define IRP_MN_COMPLETE 0x04
468 #define IRP_MN_COMPRESSED 0x08
470 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
471 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
472 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
474 #define IRP_MN_SCSI_CLASS 0x01
476 #define IRP_MN_START_DEVICE 0x00
477 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
478 #define IRP_MN_REMOVE_DEVICE 0x02
479 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
480 #define IRP_MN_STOP_DEVICE 0x04
481 #define IRP_MN_QUERY_STOP_DEVICE 0x05
482 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
484 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
485 #define IRP_MN_QUERY_INTERFACE 0x08
486 #define IRP_MN_QUERY_CAPABILITIES 0x09
487 #define IRP_MN_QUERY_RESOURCES 0x0A
488 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
489 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
490 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
492 #define IRP_MN_READ_CONFIG 0x0F
493 #define IRP_MN_WRITE_CONFIG 0x10
494 #define IRP_MN_EJECT 0x11
495 #define IRP_MN_SET_LOCK 0x12
496 #define IRP_MN_QUERY_ID 0x13
497 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
498 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
499 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
500 #define IRP_MN_SURPRISE_REMOVAL 0x17
501 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
503 #define IRP_MN_WAIT_WAKE 0x00
504 #define IRP_MN_POWER_SEQUENCE 0x01
505 #define IRP_MN_SET_POWER 0x02
506 #define IRP_MN_QUERY_POWER 0x03
508 #define IRP_MN_QUERY_ALL_DATA 0x00
509 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
510 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
511 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
512 #define IRP_MN_ENABLE_EVENTS 0x04
513 #define IRP_MN_DISABLE_EVENTS 0x05
514 #define IRP_MN_ENABLE_COLLECTION 0x06
515 #define IRP_MN_DISABLE_COLLECTION 0x07
516 #define IRP_MN_REGINFO 0x08
517 #define IRP_MN_EXECUTE_METHOD 0x09
519 #define IRP_MN_REGINFO_EX 0x0b
521 typedef enum _IO_ALLOCATION_ACTION
{
524 DeallocateObjectKeepRegisters
525 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
527 typedef IO_ALLOCATION_ACTION
528 (DDKAPI
*PDRIVER_CONTROL
)(
529 IN
struct _DEVICE_OBJECT
*DeviceObject
,
531 IN PVOID MapRegisterBase
,
535 (DDKAPI
*PDRIVER_LIST_CONTROL
)(
536 IN
struct _DEVICE_OBJECT
*DeviceObject
,
538 IN
struct _SCATTER_GATHER_LIST
*ScatterGather
,
542 (DDKAPI
*PDRIVER_ADD_DEVICE
)(
543 IN
struct _DRIVER_OBJECT
*DriverObject
,
544 IN
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
547 (DDKAPI
*PIO_COMPLETION_ROUTINE
)(
548 IN
struct _DEVICE_OBJECT
*DeviceObject
,
553 (DDKAPI
*PDRIVER_CANCEL
)(
554 IN
struct _DEVICE_OBJECT
*DeviceObject
,
555 IN
struct _IRP
*Irp
);
558 (DDKAPI
*PKDEFERRED_ROUTINE
)(
559 IN
struct _KDPC
*Dpc
,
560 IN PVOID DeferredContext
,
561 IN PVOID SystemArgument1
,
562 IN PVOID SystemArgument2
);
565 (DDKAPI
*PDRIVER_DISPATCH
)(
566 IN
struct _DEVICE_OBJECT
*DeviceObject
,
567 IN
struct _IRP
*Irp
);
570 (DDKAPI
*PIO_DPC_ROUTINE
)(
571 IN
struct _KDPC
*Dpc
,
572 IN
struct _DEVICE_OBJECT
*DeviceObject
,
577 (DDKAPI
*PMM_DLL_INITIALIZE
)(
578 IN PUNICODE_STRING RegistryPath
);
581 (DDKAPI
*PMM_DLL_UNLOAD
)(
585 (DDKAPI
*PDRIVER_ENTRY
)(
586 IN
struct _DRIVER_OBJECT
*DriverObject
,
587 IN PUNICODE_STRING RegistryPath
);
590 (DDKAPI
*PDRIVER_INITIALIZE
)(
591 IN
struct _DRIVER_OBJECT
*DriverObject
,
592 IN PUNICODE_STRING RegistryPath
);
595 (DDKAPI
*PKSERVICE_ROUTINE
)(
596 IN
struct _KINTERRUPT
*Interrupt
,
597 IN PVOID ServiceContext
);
600 (DDKAPI
*PIO_TIMER_ROUTINE
)(
601 IN
struct _DEVICE_OBJECT
*DeviceObject
,
605 (DDKAPI
*PDRIVER_REINITIALIZE
)(
606 IN
struct _DRIVER_OBJECT
*DriverObject
,
611 (DDKAPI
*PDRIVER_STARTIO
)(
612 IN
struct _DEVICE_OBJECT
*DeviceObject
,
613 IN
struct _IRP
*Irp
);
616 (DDKAPI
*PKSYNCHRONIZE_ROUTINE
)(
617 IN PVOID SynchronizeContext
);
620 (DDKAPI
*PDRIVER_UNLOAD
)(
621 IN
struct _DRIVER_OBJECT
*DriverObject
);
626 ** Plug and Play structures
630 (DDKAPI
*PINTERFACE_REFERENCE
)(
634 (DDKAPI
*PINTERFACE_DEREFERENCE
)(
638 (DDKAPI
*PTRANSLATE_BUS_ADDRESS
)(
640 IN PHYSICAL_ADDRESS BusAddress
,
642 IN OUT PULONG AddressSpace
,
643 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
645 typedef struct _DMA_ADAPTER
*
646 (DDKAPI
*PGET_DMA_ADAPTER
)(
648 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
649 OUT PULONG NumberOfMapRegisters
);
652 (DDKAPI
*PGET_SET_DEVICE_DATA
)(
659 typedef union _POWER_STATE
{
660 SYSTEM_POWER_STATE SystemState
;
661 DEVICE_POWER_STATE DeviceState
;
662 } POWER_STATE
, *PPOWER_STATE
;
664 typedef enum _POWER_STATE_TYPE
{
667 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
669 typedef struct _BUS_INTERFACE_STANDARD
{
673 PINTERFACE_REFERENCE InterfaceReference
;
674 PINTERFACE_DEREFERENCE InterfaceDereference
;
675 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
676 PGET_DMA_ADAPTER GetDmaAdapter
;
677 PGET_SET_DEVICE_DATA SetBusData
;
678 PGET_SET_DEVICE_DATA GetBusData
;
679 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
681 typedef struct _DEVICE_CAPABILITIES
{
686 ULONG LockSupported
: 1;
687 ULONG EjectSupported
: 1;
689 ULONG DockDevice
: 1;
691 ULONG SilentInstall
: 1;
692 ULONG RawDeviceOK
: 1;
693 ULONG SurpriseRemovalOK
: 1;
694 ULONG WakeFromD0
: 1;
695 ULONG WakeFromD1
: 1;
696 ULONG WakeFromD2
: 1;
697 ULONG WakeFromD3
: 1;
698 ULONG HardwareDisabled
: 1;
699 ULONG NonDynamic
: 1;
700 ULONG WarmEjectSupported
: 1;
701 ULONG NoDisplayInUI
: 1;
705 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
706 SYSTEM_POWER_STATE SystemWake
;
707 DEVICE_POWER_STATE DeviceWake
;
711 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
713 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
717 GUID InterfaceClassGuid
;
718 PUNICODE_STRING SymbolicLinkName
;
719 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
721 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
725 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
729 typedef struct _INTERFACE
{
733 PINTERFACE_REFERENCE InterfaceReference
;
734 PINTERFACE_DEREFERENCE InterfaceDereference
;
735 } INTERFACE
, *PINTERFACE
;
737 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
741 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
743 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
745 /* PNP_DEVICE_STATE */
747 #define PNP_DEVICE_DISABLED 0x00000001
748 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
749 #define PNP_DEVICE_FAILED 0x00000004
750 #define PNP_DEVICE_REMOVED 0x00000008
751 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
752 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
754 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
758 struct _FILE_OBJECT
*FileObject
;
759 LONG NameBufferOffset
;
760 UCHAR CustomDataBuffer
[1];
761 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
763 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
767 struct _FILE_OBJECT
*FileObject
;
768 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
770 typedef enum _BUS_QUERY_ID_TYPE
{
773 BusQueryCompatibleIDs
,
775 BusQueryDeviceSerialNumber
776 } BUS_QUERY_ID_TYPE
, *PBUS_QUERY_ID_TYPE
;
778 typedef enum _DEVICE_TEXT_TYPE
{
779 DeviceTextDescription
,
780 DeviceTextLocationInformation
781 } DEVICE_TEXT_TYPE
, *PDEVICE_TEXT_TYPE
;
783 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
784 DeviceUsageTypeUndefined
,
785 DeviceUsageTypePaging
,
786 DeviceUsageTypeHibernation
,
787 DeviceUsageTypeDumpFile
788 } DEVICE_USAGE_NOTIFICATION_TYPE
;
790 typedef struct _POWER_SEQUENCE
{
794 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
797 DevicePropertyDeviceDescription
,
798 DevicePropertyHardwareID
,
799 DevicePropertyCompatibleIDs
,
800 DevicePropertyBootConfiguration
,
801 DevicePropertyBootConfigurationTranslated
,
802 DevicePropertyClassName
,
803 DevicePropertyClassGuid
,
804 DevicePropertyDriverKeyName
,
805 DevicePropertyManufacturer
,
806 DevicePropertyFriendlyName
,
807 DevicePropertyLocationInformation
,
808 DevicePropertyPhysicalDeviceObjectName
,
809 DevicePropertyBusTypeGuid
,
810 DevicePropertyLegacyBusType
,
811 DevicePropertyBusNumber
,
812 DevicePropertyEnumeratorName
,
813 DevicePropertyAddress
,
814 DevicePropertyUINumber
,
815 DevicePropertyInstallState
,
816 DevicePropertyRemovalPolicy
817 } DEVICE_REGISTRY_PROPERTY
;
819 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
820 EventCategoryReserved
,
821 EventCategoryHardwareProfileChange
,
822 EventCategoryDeviceInterfaceChange
,
823 EventCategoryTargetDeviceChange
824 } IO_NOTIFICATION_EVENT_CATEGORY
;
826 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
829 (DDKAPI
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
830 IN PVOID NotificationStructure
,
834 (DDKAPI
*PDEVICE_CHANGE_COMPLETE_CALLBACK
)(
842 #define SYMBOLIC_LINK_QUERY 0x0001
843 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
845 /* also in winnt,h */
846 #define DUPLICATE_CLOSE_SOURCE 0x00000001
847 #define DUPLICATE_SAME_ACCESS 0x00000002
848 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
851 typedef struct _OBJECT_NAME_INFORMATION
{
853 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
856 (DDKAPI
*PIO_APC_ROUTINE
)(
858 IN PIO_STATUS_BLOCK IoStatusBlock
,
861 typedef struct _IO_STATUS_BLOCK
{
862 _ANONYMOUS_UNION
union {
866 ULONG_PTR Information
;
870 (DDKAPI
*PKNORMAL_ROUTINE
)(
871 IN PVOID NormalContext
,
872 IN PVOID SystemArgument1
,
873 IN PVOID SystemArgument2
);
876 (DDKAPI
*PKKERNEL_ROUTINE
)(
877 IN
struct _KAPC
*Apc
,
878 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
879 IN OUT PVOID
*NormalContext
,
880 IN OUT PVOID
*SystemArgument1
,
881 IN OUT PVOID
*SystemArgument2
);
884 (DDKAPI
*PKRUNDOWN_ROUTINE
)(
885 IN
struct _KAPC
*Apc
);
888 (DDKAPI
*PKTRANSFER_ROUTINE
)(
891 typedef struct _KAPC
{
895 struct _KTHREAD
*Thread
;
896 LIST_ENTRY ApcListEntry
;
897 PKKERNEL_ROUTINE KernelRoutine
;
898 PKRUNDOWN_ROUTINE RundownRoutine
;
899 PKNORMAL_ROUTINE NormalRoutine
;
901 PVOID SystemArgument1
;
902 PVOID SystemArgument2
;
904 KPROCESSOR_MODE ApcMode
;
906 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
908 typedef struct _KDEVICE_QUEUE
{
911 LIST_ENTRY DeviceListHead
;
914 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
916 typedef struct _KDEVICE_QUEUE_ENTRY
{
917 LIST_ENTRY DeviceListEntry
;
920 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
921 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
923 #define LOCK_QUEUE_WAIT 1
924 #define LOCK_QUEUE_OWNER 2
926 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
927 LockQueueDispatcherLock
,
928 LockQueueContextSwapLock
,
930 LockQueueSystemSpaceLock
,
933 LockQueueNonPagedPoolLock
,
934 LockQueueIoCancelLock
,
935 LockQueueWorkQueueLock
,
937 LockQueueIoDatabaseLock
,
938 LockQueueIoCompletionLock
,
939 LockQueueNtfsStructLock
,
940 LockQueueAfdWorkQueueLock
,
943 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
945 typedef struct _KSPIN_LOCK_QUEUE
{
946 struct _KSPIN_LOCK_QUEUE
*VOLATILE Next
;
947 PKSPIN_LOCK VOLATILE Lock
;
948 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
950 typedef struct _KLOCK_QUEUE_HANDLE
{
951 KSPIN_LOCK_QUEUE LockQueue
;
953 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
955 typedef struct _KDPC
{
959 LIST_ENTRY DpcListEntry
;
960 PKDEFERRED_ROUTINE DeferredRoutine
;
961 PVOID DeferredContext
;
962 PVOID SystemArgument1
;
963 PVOID SystemArgument2
;
965 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
967 typedef struct _WAIT_CONTEXT_BLOCK
{
968 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
969 PDRIVER_CONTROL DeviceRoutine
;
971 ULONG NumberOfMapRegisters
;
974 PKDPC BufferChainingDpc
;
975 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
977 typedef struct _DISPATCHER_HEADER
{
983 LIST_ENTRY WaitListHead
;
984 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
986 typedef struct _KEVENT
{
987 DISPATCHER_HEADER Header
;
988 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
990 typedef struct _KSEMAPHORE
{
991 DISPATCHER_HEADER Header
;
993 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
995 typedef struct _FAST_MUTEX
{
997 struct _KTHREAD
*Owner
;
1001 } FAST_MUTEX
, *PFAST_MUTEX
;
1003 typedef struct _KGATE
1005 DISPATCHER_HEADER Header
;
1006 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
1008 typedef struct _KGUARDED_MUTEX
1011 struct _KTHREAD
* Owner
;
1016 SHORT KernelApcDisable
;
1017 SHORT SpecialApcDisable
;
1019 ULONG CombinedApcDisable
;
1021 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
, *RESTRICTED_POINTER PRKGUARDED_MUTEX
;
1023 typedef struct _KTIMER
{
1024 DISPATCHER_HEADER Header
;
1025 ULARGE_INTEGER DueTime
;
1026 LIST_ENTRY TimerListEntry
;
1029 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
1031 typedef struct _KMUTANT
{
1032 DISPATCHER_HEADER Header
;
1033 LIST_ENTRY MutantListEntry
;
1034 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
1037 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
1039 typedef enum _TIMER_TYPE
{
1041 SynchronizationTimer
1044 #define EVENT_INCREMENT 1
1045 #define IO_NO_INCREMENT 0
1046 #define IO_CD_ROM_INCREMENT 1
1047 #define IO_DISK_INCREMENT 1
1048 #define IO_KEYBOARD_INCREMENT 6
1049 #define IO_MAILSLOT_INCREMENT 2
1050 #define IO_MOUSE_INCREMENT 6
1051 #define IO_NAMED_PIPE_INCREMENT 2
1052 #define IO_NETWORK_INCREMENT 2
1053 #define IO_PARALLEL_INCREMENT 1
1054 #define IO_SERIAL_INCREMENT 2
1055 #define IO_SOUND_INCREMENT 8
1056 #define IO_VIDEO_INCREMENT 1
1057 #define SEMAPHORE_INCREMENT 1
1059 typedef struct _IRP
{
1062 struct _MDL
*MdlAddress
;
1065 struct _IRP
*MasterIrp
;
1069 LIST_ENTRY ThreadListEntry
;
1070 IO_STATUS_BLOCK IoStatus
;
1071 KPROCESSOR_MODE RequestorMode
;
1072 BOOLEAN PendingReturned
;
1074 CHAR CurrentLocation
;
1077 CCHAR ApcEnvironment
;
1078 UCHAR AllocationFlags
;
1079 PIO_STATUS_BLOCK UserIosb
;
1083 PIO_APC_ROUTINE UserApcRoutine
;
1084 PVOID UserApcContext
;
1085 } AsynchronousParameters
;
1086 LARGE_INTEGER AllocationSize
;
1088 PDRIVER_CANCEL CancelRoutine
;
1092 _ANONYMOUS_UNION
union {
1093 KDEVICE_QUEUE_ENTRY DeviceQueueEntry
;
1094 _ANONYMOUS_STRUCT
struct {
1095 PVOID DriverContext
[4];
1099 PCHAR AuxiliaryBuffer
;
1100 _ANONYMOUS_STRUCT
struct {
1101 LIST_ENTRY ListEntry
;
1102 _ANONYMOUS_UNION
union {
1103 struct _IO_STACK_LOCATION
*CurrentStackLocation
;
1107 struct _FILE_OBJECT
*OriginalFileObject
;
1110 PVOID CompletionKey
;
1113 typedef struct _IRP
*PIRP
;
1117 #define SL_FORCE_ACCESS_CHECK 0x01
1118 #define SL_OPEN_PAGING_FILE 0x02
1119 #define SL_OPEN_TARGET_DIRECTORY 0x04
1120 #define SL_CASE_SENSITIVE 0x80
1122 #define SL_KEY_SPECIFIED 0x01
1123 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
1124 #define SL_WRITE_THROUGH 0x04
1125 #define SL_FT_SEQUENTIAL_WRITE 0x08
1127 #define SL_FAIL_IMMEDIATELY 0x01
1128 #define SL_EXCLUSIVE_LOCK 0x02
1130 #define SL_RESTART_SCAN 0x01
1131 #define SL_RETURN_SINGLE_ENTRY 0x02
1132 #define SL_INDEX_SPECIFIED 0x04
1134 #define SL_WATCH_TREE 0x01
1136 #define SL_ALLOW_RAW_MOUNT 0x01
1138 #define CTL_CODE(DeviceType, Function, Method, Access)( \
1139 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
1141 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
1146 IRP_PAGING_IO
= 0x2,
1147 IRP_MOUNT_COMPLETION
= 0x2,
1148 IRP_SYNCHRONOUS_API
= 0x4,
1149 IRP_ASSOCIATED_IRP
= 0x8,
1150 IRP_BUFFERED_IO
= 0x10,
1151 IRP_DEALLOCATE_BUFFER
= 0x20,
1152 IRP_INPUT_OPERATION
= 0x40,
1153 IRP_SYNCHRONOUS_PAGING_IO
= 0x40,
1154 IRP_CREATE_OPERATION
= 0x80,
1155 IRP_READ_OPERATION
= 0x100,
1156 IRP_WRITE_OPERATION
= 0x200,
1157 IRP_CLOSE_OPERATION
= 0x400,
1158 IRP_DEFER_IO_COMPLETION
= 0x800,
1159 IRP_OB_QUERY_NAME
= 0x1000,
1160 IRP_HOLD_DEVICE_QUEUE
= 0x2000,
1161 IRP_RETRY_IO_COMPLETION
= 0x4000
1164 #define IRP_QUOTA_CHARGED 0x01
1165 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
1166 #define IRP_ALLOCATED_FIXED_SIZE 0x04
1167 #define IRP_LOOKASIDE_ALLOCATION 0x08
1169 typedef struct _BOOTDISK_INFORMATION
{
1170 LONGLONG BootPartitionOffset
;
1171 LONGLONG SystemPartitionOffset
;
1172 ULONG BootDeviceSignature
;
1173 ULONG SystemDeviceSignature
;
1174 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
1176 typedef struct _BOOTDISK_INFORMATION_EX
{
1177 LONGLONG BootPartitionOffset
;
1178 LONGLONG SystemPartitionOffset
;
1179 ULONG BootDeviceSignature
;
1180 ULONG SystemDeviceSignature
;
1181 GUID BootDeviceGuid
;
1182 GUID SystemDeviceGuid
;
1183 BOOLEAN BootDeviceIsGpt
;
1184 BOOLEAN SystemDeviceIsGpt
;
1185 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
1187 typedef struct _EISA_MEMORY_TYPE
{
1188 UCHAR ReadWrite
: 1;
1190 UCHAR Reserved0
: 1;
1193 UCHAR Reserved1
: 1;
1194 UCHAR MoreEntries
: 1;
1195 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
1197 #include <pshpack1.h>
1198 typedef struct _EISA_MEMORY_CONFIGURATION
{
1199 EISA_MEMORY_TYPE ConfigurationByte
;
1201 USHORT AddressLowWord
;
1202 UCHAR AddressHighByte
;
1204 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
1205 #include <poppack.h>
1207 typedef struct _EISA_IRQ_DESCRIPTOR
{
1208 UCHAR Interrupt
: 4;
1210 UCHAR LevelTriggered
: 1;
1212 UCHAR MoreEntries
: 1;
1213 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
1215 typedef struct _EISA_IRQ_CONFIGURATION
{
1216 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
1218 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
1220 typedef struct _DMA_CONFIGURATION_BYTE0
{
1224 UCHAR MoreEntries
: 1;
1225 } DMA_CONFIGURATION_BYTE0
;
1227 typedef struct _DMA_CONFIGURATION_BYTE1
{
1228 UCHAR Reserved0
: 2;
1229 UCHAR TransferSize
: 2;
1231 UCHAR Reserved1
: 2;
1232 } DMA_CONFIGURATION_BYTE1
;
1234 typedef struct _EISA_DMA_CONFIGURATION
{
1235 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
1236 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
1237 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
1239 #include <pshpack1.h>
1240 typedef struct _EISA_PORT_DESCRIPTOR
{
1241 UCHAR NumberPorts
: 5;
1244 UCHAR MoreEntries
: 1;
1245 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
1247 typedef struct _EISA_PORT_CONFIGURATION
{
1248 EISA_PORT_DESCRIPTOR Configuration
;
1250 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
1251 #include <poppack.h>
1253 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
1257 UCHAR MinorRevision
;
1258 UCHAR MajorRevision
;
1259 UCHAR Selections
[26];
1260 UCHAR FunctionFlags
;
1261 UCHAR TypeString
[80];
1262 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
1263 EISA_IRQ_CONFIGURATION EisaIrq
[7];
1264 EISA_DMA_CONFIGURATION EisaDma
[4];
1265 EISA_PORT_CONFIGURATION EisaPort
[20];
1266 UCHAR InitializationData
[60];
1267 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
1269 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
1271 #define EISA_FUNCTION_ENABLED 0x80
1272 #define EISA_FREE_FORM_DATA 0x40
1273 #define EISA_HAS_PORT_INIT_ENTRY 0x20
1274 #define EISA_HAS_PORT_RANGE 0x10
1275 #define EISA_HAS_DMA_ENTRY 0x08
1276 #define EISA_HAS_IRQ_ENTRY 0x04
1277 #define EISA_HAS_MEMORY_ENTRY 0x02
1278 #define EISA_HAS_TYPE_ENTRY 0x01
1279 #define EISA_HAS_INFORMATION \
1280 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
1281 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
1283 typedef struct _CM_EISA_SLOT_INFORMATION
{
1286 UCHAR MajorRevision
;
1287 UCHAR MinorRevision
;
1289 UCHAR NumberFunctions
;
1290 UCHAR FunctionInformation
;
1292 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
1294 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
1296 #define EISA_INVALID_SLOT 0x80
1297 #define EISA_INVALID_FUNCTION 0x81
1298 #define EISA_INVALID_CONFIGURATION 0x82
1299 #define EISA_EMPTY_SLOT 0x83
1300 #define EISA_INVALID_BIOS_CALL 0x86
1302 typedef struct _CM_FLOPPY_DEVICE_DATA
{
1308 UCHAR StepRateHeadUnloadTime
;
1311 UCHAR SectorLengthCode
;
1312 UCHAR SectorPerTrack
;
1313 UCHAR ReadWriteGapLength
;
1314 UCHAR DataTransferLength
;
1315 UCHAR FormatGapLength
;
1316 UCHAR FormatFillCharacter
;
1317 UCHAR HeadSettleTime
;
1318 UCHAR MotorSettleTime
;
1319 UCHAR MaximumTrackValue
;
1320 UCHAR DataTransferRate
;
1321 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
1323 typedef enum _INTERFACE_TYPE
{
1324 InterfaceTypeUndefined
= -1,
1341 MaximumInterfaceType
1342 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
1344 typedef struct _PNP_BUS_INFORMATION
{
1346 INTERFACE_TYPE LegacyBusType
;
1348 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
1350 #include <pshpack1.h>
1351 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
1353 UCHAR ShareDisposition
;
1357 PHYSICAL_ADDRESS Start
;
1361 PHYSICAL_ADDRESS Start
;
1370 PHYSICAL_ADDRESS Start
;
1390 } DeviceSpecificData
;
1392 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
1394 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
1396 #define CmResourceTypeNull 0
1397 #define CmResourceTypePort 1
1398 #define CmResourceTypeInterrupt 2
1399 #define CmResourceTypeMemory 3
1400 #define CmResourceTypeDma 4
1401 #define CmResourceTypeDeviceSpecific 5
1402 #define CmResourceTypeBusNumber 6
1403 #define CmResourceTypeMaximum 7
1404 #define CmResourceTypeNonArbitrated 128
1405 #define CmResourceTypeConfigData 128
1406 #define CmResourceTypeDevicePrivate 129
1407 #define CmResourceTypePcCardConfig 130
1408 #define CmResourceTypeMfCardConfig 131
1410 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
1412 typedef enum _CM_SHARE_DISPOSITION
{
1413 CmResourceShareUndetermined
,
1414 CmResourceShareDeviceExclusive
,
1415 CmResourceShareDriverExclusive
,
1416 CmResourceShareShared
1417 } CM_SHARE_DISPOSITION
;
1419 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
1421 #define CM_RESOURCE_PORT_MEMORY 0x0000
1422 #define CM_RESOURCE_PORT_IO 0x0001
1423 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
1424 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
1425 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
1426 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
1427 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
1428 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
1430 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
1432 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
1433 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
1435 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
1437 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
1438 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
1439 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
1440 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
1441 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
1442 #define CM_RESOURCE_MEMORY_24 0x0010
1443 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
1445 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
1447 #define CM_RESOURCE_DMA_8 0x0000
1448 #define CM_RESOURCE_DMA_16 0x0001
1449 #define CM_RESOURCE_DMA_32 0x0002
1450 #define CM_RESOURCE_DMA_8_AND_16 0x0004
1451 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
1452 #define CM_RESOURCE_DMA_TYPE_A 0x0010
1453 #define CM_RESOURCE_DMA_TYPE_B 0x0020
1454 #define CM_RESOURCE_DMA_TYPE_F 0x0040
1456 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
1460 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
1461 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
1463 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
1464 INTERFACE_TYPE InterfaceType
;
1466 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
1467 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
1469 typedef struct _CM_RESOURCE_LIST
{
1471 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
1472 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
1474 typedef struct _CM_INT13_DRIVE_PARAMETER
{
1477 USHORT SectorsPerTrack
;
1479 USHORT NumberDrives
;
1480 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
1481 #include <poppack.h>
1483 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
1488 USHORT KeyboardFlags
;
1489 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
1491 #define KEYBOARD_INSERT_ON 0x08
1492 #define KEYBOARD_CAPS_LOCK_ON 0x04
1493 #define KEYBOARD_NUM_LOCK_ON 0x02
1494 #define KEYBOARD_SCROLL_LOCK_ON 0x01
1495 #define KEYBOARD_ALT_KEY_DOWN 0x80
1496 #define KEYBOARD_CTRL_KEY_DOWN 0x40
1497 #define KEYBOARD_LEFT_SHIFT_DOWN 0x20
1498 #define KEYBOARD_RIGHT_SHIFT_DOWN 0x10
1500 typedef struct _CM_MCA_POS_DATA
{
1506 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
1508 typedef struct CM_Power_Data_s
{
1510 DEVICE_POWER_STATE PD_MostRecentPowerState
;
1511 ULONG PD_Capabilities
;
1515 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
1516 } CM_POWER_DATA
, *PCM_POWER_DATA
;
1518 #define PDCAP_D0_SUPPORTED 0x00000001
1519 #define PDCAP_D1_SUPPORTED 0x00000002
1520 #define PDCAP_D2_SUPPORTED 0x00000004
1521 #define PDCAP_D3_SUPPORTED 0x00000008
1522 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
1523 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
1524 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
1525 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
1526 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
1528 typedef struct _CM_SCSI_DEVICE_DATA
{
1531 UCHAR HostIdentifier
;
1532 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
1534 typedef struct _CM_SERIAL_DEVICE_DATA
{
1538 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
1540 /* IO_RESOURCE_DESCRIPTOR.Option */
1542 #define IO_RESOURCE_PREFERRED 0x01
1543 #define IO_RESOURCE_DEFAULT 0x02
1544 #define IO_RESOURCE_ALTERNATIVE 0x08
1546 typedef struct _IO_RESOURCE_DESCRIPTOR
{
1549 UCHAR ShareDisposition
;
1557 PHYSICAL_ADDRESS MinimumAddress
;
1558 PHYSICAL_ADDRESS MaximumAddress
;
1563 PHYSICAL_ADDRESS MinimumAddress
;
1564 PHYSICAL_ADDRESS MaximumAddress
;
1567 ULONG MinimumVector
;
1568 ULONG MaximumVector
;
1571 ULONG MinimumChannel
;
1572 ULONG MaximumChannel
;
1577 PHYSICAL_ADDRESS MinimumAddress
;
1578 PHYSICAL_ADDRESS MaximumAddress
;
1595 } IO_RESOURCE_DESCRIPTOR
, *PIO_RESOURCE_DESCRIPTOR
;
1597 typedef struct _IO_RESOURCE_LIST
{
1601 IO_RESOURCE_DESCRIPTOR Descriptors
[1];
1602 } IO_RESOURCE_LIST
, *PIO_RESOURCE_LIST
;
1604 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
{
1606 INTERFACE_TYPE InterfaceType
;
1610 ULONG AlternativeLists
;
1611 IO_RESOURCE_LIST List
[1];
1612 } IO_RESOURCE_REQUIREMENTS_LIST
, *PIO_RESOURCE_REQUIREMENTS_LIST
;
1614 typedef struct _IO_ERROR_LOG_PACKET
{
1615 UCHAR MajorFunctionCode
;
1617 USHORT DumpDataSize
;
1618 USHORT NumberOfStrings
;
1619 USHORT StringOffset
;
1620 USHORT EventCategory
;
1622 ULONG UniqueErrorValue
;
1623 NTSTATUS FinalStatus
;
1624 ULONG SequenceNumber
;
1625 ULONG IoControlCode
;
1626 LARGE_INTEGER DeviceOffset
;
1628 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
1630 typedef struct _IO_ERROR_LOG_MESSAGE
{
1633 USHORT DriverNameLength
;
1634 LARGE_INTEGER TimeStamp
;
1635 ULONG DriverNameOffset
;
1636 IO_ERROR_LOG_PACKET EntryData
;
1637 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
1639 #define ERROR_LOG_LIMIT_SIZE 240
1640 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
1641 sizeof(IO_ERROR_LOG_PACKET) + \
1642 (sizeof(WCHAR) * 40))
1644 typedef struct _CONTROLLER_OBJECT
{
1647 PVOID ControllerExtension
;
1648 KDEVICE_QUEUE DeviceWaitQueue
;
1650 LARGE_INTEGER Spare2
;
1651 } CONTROLLER_OBJECT
, *PCONTROLLER_OBJECT
;
1653 typedef enum _DMA_WIDTH
{
1658 } DMA_WIDTH
, *PDMA_WIDTH
;
1660 typedef enum _DMA_SPEED
{
1667 } DMA_SPEED
, *PDMA_SPEED
;
1669 /* DEVICE_DESCRIPTION.Version */
1671 #define DEVICE_DESCRIPTION_VERSION 0x0000
1672 #define DEVICE_DESCRIPTION_VERSION1 0x0001
1673 #define DEVICE_DESCRIPTION_VERSION2 0x0002
1675 typedef struct _DEVICE_DESCRIPTION
{
1678 BOOLEAN ScatterGather
;
1680 BOOLEAN AutoInitialize
;
1681 BOOLEAN Dma32BitAddresses
;
1682 BOOLEAN IgnoreCount
;
1684 BOOLEAN Dma64BitAddresses
;
1687 INTERFACE_TYPE InterfaceType
;
1690 ULONG MaximumLength
;
1692 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
1695 #define VPB_MOUNTED 0x0001
1696 #define VPB_LOCKED 0x0002
1697 #define VPB_PERSISTENT 0x0004
1698 #define VPB_REMOVE_PENDING 0x0008
1699 #define VPB_RAW_MOUNT 0x0010
1701 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
1703 typedef struct _VPB
{
1707 USHORT VolumeLabelLength
;
1708 struct _DEVICE_OBJECT
*DeviceObject
;
1709 struct _DEVICE_OBJECT
*RealDevice
;
1711 ULONG ReferenceCount
;
1712 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
1715 /* DEVICE_OBJECT.Flags */
1717 #define DO_VERIFY_VOLUME 0x00000002
1718 #define DO_BUFFERED_IO 0x00000004
1719 #define DO_EXCLUSIVE 0x00000008
1720 #define DO_DIRECT_IO 0x00000010
1721 #define DO_MAP_IO_BUFFER 0x00000020
1722 #define DO_DEVICE_HAS_NAME 0x00000040
1723 #define DO_DEVICE_INITIALIZING 0x00000080
1724 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
1725 #define DO_LONG_TERM_REQUESTS 0x00000200
1726 #define DO_NEVER_LAST_DEVICE 0x00000400
1727 #define DO_SHUTDOWN_REGISTERED 0x00000800
1728 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
1729 #define DO_POWER_PAGABLE 0x00002000
1730 #define DO_POWER_INRUSH 0x00004000
1731 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
1733 /* DEVICE_OBJECT.Characteristics */
1735 #define FILE_REMOVABLE_MEDIA 0x00000001
1736 #define FILE_READ_ONLY_DEVICE 0x00000002
1737 #define FILE_FLOPPY_DISKETTE 0x00000004
1738 #define FILE_WRITE_ONCE_MEDIA 0x00000008
1739 #define FILE_REMOTE_DEVICE 0x00000010
1740 #define FILE_DEVICE_IS_MOUNTED 0x00000020
1741 #define FILE_VIRTUAL_VOLUME 0x00000040
1742 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
1743 #define FILE_DEVICE_SECURE_OPEN 0x00000100
1745 /* DEVICE_OBJECT.AlignmentRequirement */
1747 #define FILE_BYTE_ALIGNMENT 0x00000000
1748 #define FILE_WORD_ALIGNMENT 0x00000001
1749 #define FILE_LONG_ALIGNMENT 0x00000003
1750 #define FILE_QUAD_ALIGNMENT 0x00000007
1751 #define FILE_OCTA_ALIGNMENT 0x0000000f
1752 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
1753 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
1754 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
1755 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
1756 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
1758 /* DEVICE_OBJECT.DeviceType */
1760 #define DEVICE_TYPE ULONG
1762 #define FILE_DEVICE_BEEP 0x00000001
1763 #define FILE_DEVICE_CD_ROM 0x00000002
1764 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
1765 #define FILE_DEVICE_CONTROLLER 0x00000004
1766 #define FILE_DEVICE_DATALINK 0x00000005
1767 #define FILE_DEVICE_DFS 0x00000006
1768 #define FILE_DEVICE_DISK 0x00000007
1769 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
1770 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
1771 #define FILE_DEVICE_INPORT_PORT 0x0000000a
1772 #define FILE_DEVICE_KEYBOARD 0x0000000b
1773 #define FILE_DEVICE_MAILSLOT 0x0000000c
1774 #define FILE_DEVICE_MIDI_IN 0x0000000d
1775 #define FILE_DEVICE_MIDI_OUT 0x0000000e
1776 #define FILE_DEVICE_MOUSE 0x0000000f
1777 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
1778 #define FILE_DEVICE_NAMED_PIPE 0x00000011
1779 #define FILE_DEVICE_NETWORK 0x00000012
1780 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
1781 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
1782 #define FILE_DEVICE_NULL 0x00000015
1783 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
1784 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
1785 #define FILE_DEVICE_PRINTER 0x00000018
1786 #define FILE_DEVICE_SCANNER 0x00000019
1787 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
1788 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
1789 #define FILE_DEVICE_SCREEN 0x0000001c
1790 #define FILE_DEVICE_SOUND 0x0000001d
1791 #define FILE_DEVICE_STREAMS 0x0000001e
1792 #define FILE_DEVICE_TAPE 0x0000001f
1793 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
1794 #define FILE_DEVICE_TRANSPORT 0x00000021
1795 #define FILE_DEVICE_UNKNOWN 0x00000022
1796 #define FILE_DEVICE_VIDEO 0x00000023
1797 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
1798 #define FILE_DEVICE_WAVE_IN 0x00000025
1799 #define FILE_DEVICE_WAVE_OUT 0x00000026
1800 #define FILE_DEVICE_8042_PORT 0x00000027
1801 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
1802 #define FILE_DEVICE_BATTERY 0x00000029
1803 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
1804 #define FILE_DEVICE_MODEM 0x0000002b
1805 #define FILE_DEVICE_VDM 0x0000002c
1806 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
1807 #define FILE_DEVICE_SMB 0x0000002e
1808 #define FILE_DEVICE_KS 0x0000002f
1809 #define FILE_DEVICE_CHANGER 0x00000030
1810 #define FILE_DEVICE_SMARTCARD 0x00000031
1811 #define FILE_DEVICE_ACPI 0x00000032
1812 #define FILE_DEVICE_DVD 0x00000033
1813 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
1814 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
1815 #define FILE_DEVICE_DFS_VOLUME 0x00000036
1816 #define FILE_DEVICE_SERENUM 0x00000037
1817 #define FILE_DEVICE_TERMSRV 0x00000038
1818 #define FILE_DEVICE_KSEC 0x00000039
1819 #define FILE_DEVICE_FIPS 0x0000003a
1821 typedef struct _DEVICE_OBJECT
{
1824 LONG ReferenceCount
;
1825 struct _DRIVER_OBJECT
*DriverObject
;
1826 struct _DEVICE_OBJECT
*NextDevice
;
1827 struct _DEVICE_OBJECT
*AttachedDevice
;
1828 struct _IRP
*CurrentIrp
;
1831 ULONG Characteristics
;
1833 PVOID DeviceExtension
;
1834 DEVICE_TYPE DeviceType
;
1837 LIST_ENTRY ListEntry
;
1838 WAIT_CONTEXT_BLOCK Wcb
;
1840 ULONG AlignmentRequirement
;
1841 KDEVICE_QUEUE DeviceQueue
;
1843 ULONG ActiveThreadCount
;
1844 PSECURITY_DESCRIPTOR SecurityDescriptor
;
1848 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
1850 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
1852 typedef enum _DEVICE_RELATION_TYPE
{
1857 TargetDeviceRelation
,
1859 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
1861 typedef struct _DEVICE_RELATIONS
{
1863 PDEVICE_OBJECT Objects
[1];
1864 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
1866 typedef struct _SCATTER_GATHER_ELEMENT
{
1867 PHYSICAL_ADDRESS Address
;
1870 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
1872 typedef struct _SCATTER_GATHER_LIST
{
1873 ULONG NumberOfElements
;
1875 SCATTER_GATHER_ELEMENT Elements
[0];
1876 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
1878 typedef struct _MDL
{
1882 struct _EPROCESS
*Process
;
1883 PVOID MappedSystemVa
;
1889 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1890 #define MDL_PAGES_LOCKED 0x0002
1891 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1892 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1893 #define MDL_PARTIAL 0x0010
1894 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1895 #define MDL_IO_PAGE_READ 0x0040
1896 #define MDL_WRITE_OPERATION 0x0080
1897 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1898 #define MDL_FREE_EXTRA_PTES 0x0200
1899 #define MDL_IO_SPACE 0x0800
1900 #define MDL_NETWORK_HEADER 0x1000
1901 #define MDL_MAPPING_CAN_FAIL 0x2000
1902 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1904 #define MDL_MAPPING_FLAGS ( \
1905 MDL_MAPPED_TO_SYSTEM_VA | \
1906 MDL_PAGES_LOCKED | \
1907 MDL_SOURCE_IS_NONPAGED_POOL | \
1908 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1909 MDL_PARENT_MAPPED_SYSTEM_VA | \
1914 (DDKAPI
*PPUT_DMA_ADAPTER
)(
1915 IN PDMA_ADAPTER DmaAdapter
);
1918 (DDKAPI
*PALLOCATE_COMMON_BUFFER
)(
1919 IN PDMA_ADAPTER DmaAdapter
,
1921 OUT PPHYSICAL_ADDRESS LogicalAddress
,
1922 IN BOOLEAN CacheEnabled
);
1925 (DDKAPI
*PFREE_COMMON_BUFFER
)(
1926 IN PDMA_ADAPTER DmaAdapter
,
1928 IN PHYSICAL_ADDRESS LogicalAddress
,
1929 IN PVOID VirtualAddress
,
1930 IN BOOLEAN CacheEnabled
);
1933 (DDKAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
1934 IN PDMA_ADAPTER DmaAdapter
,
1935 IN PDEVICE_OBJECT DeviceObject
,
1936 IN ULONG NumberOfMapRegisters
,
1937 IN PDRIVER_CONTROL ExecutionRoutine
,
1941 (DDKAPI
*PFLUSH_ADAPTER_BUFFERS
)(
1942 IN PDMA_ADAPTER DmaAdapter
,
1944 IN PVOID MapRegisterBase
,
1947 IN BOOLEAN WriteToDevice
);
1950 (DDKAPI
*PFREE_ADAPTER_CHANNEL
)(
1951 IN PDMA_ADAPTER DmaAdapter
);
1954 (DDKAPI
*PFREE_MAP_REGISTERS
)(
1955 IN PDMA_ADAPTER DmaAdapter
,
1956 PVOID MapRegisterBase
,
1957 ULONG NumberOfMapRegisters
);
1959 typedef PHYSICAL_ADDRESS
1960 (DDKAPI
*PMAP_TRANSFER
)(
1961 IN PDMA_ADAPTER DmaAdapter
,
1963 IN PVOID MapRegisterBase
,
1965 IN OUT PULONG Length
,
1966 IN BOOLEAN WriteToDevice
);
1969 (DDKAPI
*PGET_DMA_ALIGNMENT
)(
1970 IN PDMA_ADAPTER DmaAdapter
);
1973 (DDKAPI
*PREAD_DMA_COUNTER
)(
1974 IN PDMA_ADAPTER DmaAdapter
);
1977 (DDKAPI
*PGET_SCATTER_GATHER_LIST
)(
1978 IN PDMA_ADAPTER DmaAdapter
,
1979 IN PDEVICE_OBJECT DeviceObject
,
1983 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
1985 IN BOOLEAN WriteToDevice
);
1988 (DDKAPI
*PPUT_SCATTER_GATHER_LIST
)(
1989 IN PDMA_ADAPTER DmaAdapter
,
1990 IN PSCATTER_GATHER_LIST ScatterGather
,
1991 IN BOOLEAN WriteToDevice
);
1994 (DDKAPI
*PCALCULATE_SCATTER_GATHER_LIST_SIZE
)(
1995 IN PDMA_ADAPTER DmaAdapter
,
1996 IN PMDL Mdl OPTIONAL
,
1999 OUT PULONG ScatterGatherListSize
,
2000 OUT PULONG pNumberOfMapRegisters OPTIONAL
);
2003 (DDKAPI
*PBUILD_SCATTER_GATHER_LIST
)(
2004 IN PDMA_ADAPTER DmaAdapter
,
2005 IN PDEVICE_OBJECT DeviceObject
,
2009 IN PDRIVER_LIST_CONTROL ExecutionRoutine
,
2011 IN BOOLEAN WriteToDevice
,
2012 IN PVOID ScatterGatherBuffer
,
2013 IN ULONG ScatterGatherLength
);
2016 (DDKAPI
*PBUILD_MDL_FROM_SCATTER_GATHER_LIST
)(
2017 IN PDMA_ADAPTER DmaAdapter
,
2018 IN PSCATTER_GATHER_LIST ScatterGather
,
2019 IN PMDL OriginalMdl
,
2020 OUT PMDL
*TargetMdl
);
2022 typedef struct _DMA_OPERATIONS
{
2024 PPUT_DMA_ADAPTER PutDmaAdapter
;
2025 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer
;
2026 PFREE_COMMON_BUFFER FreeCommonBuffer
;
2027 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2028 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2029 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2030 PFREE_MAP_REGISTERS FreeMapRegisters
;
2031 PMAP_TRANSFER MapTransfer
;
2032 PGET_DMA_ALIGNMENT GetDmaAlignment
;
2033 PREAD_DMA_COUNTER ReadDmaCounter
;
2034 PGET_SCATTER_GATHER_LIST GetScatterGatherList
;
2035 PPUT_SCATTER_GATHER_LIST PutScatterGatherList
;
2036 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList
;
2037 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList
;
2038 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList
;
2039 } DMA_OPERATIONS
, *PDMA_OPERATIONS
;
2041 typedef struct _DMA_ADAPTER
{
2044 PDMA_OPERATIONS DmaOperations
;
2048 typedef enum _ARBITER_REQUEST_SOURCE
{
2049 ArbiterRequestUndefined
= -1,
2050 ArbiterRequestLegacyReported
,
2051 ArbiterRequestHalReported
,
2052 ArbiterRequestLegacyAssigned
,
2053 ArbiterRequestPnpDetected
,
2054 ArbiterRequestPnpEnumerated
2055 } ARBITER_REQUEST_SOURCE
;
2057 typedef enum _ARBITER_RESULT
{
2058 ArbiterResultUndefined
= -1,
2059 ArbiterResultSuccess
,
2060 ArbiterResultExternalConflict
,
2061 ArbiterResultNullRequest
2064 typedef enum _ARBITER_ACTION
{
2065 ArbiterActionTestAllocation
,
2066 ArbiterActionRetestAllocation
,
2067 ArbiterActionCommitAllocation
,
2068 ArbiterActionRollbackAllocation
,
2069 ArbiterActionQueryAllocatedResources
,
2070 ArbiterActionWriteReservedResources
,
2071 ArbiterActionQueryConflict
,
2072 ArbiterActionQueryArbitrate
,
2073 ArbiterActionAddReserved
,
2074 ArbiterActionBootAllocation
2075 } ARBITER_ACTION
, *PARBITER_ACTION
;
2077 typedef struct _ARBITER_CONFLICT_INFO
{
2078 PDEVICE_OBJECT OwningObject
;
2081 } ARBITER_CONFLICT_INFO
, *PARBITER_CONFLICT_INFO
;
2083 typedef struct _ARBITER_PARAMETERS
{
2086 IN OUT PLIST_ENTRY ArbitrationList
;
2087 IN ULONG AllocateFromCount
;
2088 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom
;
2092 IN OUT PLIST_ENTRY ArbitrationList
;
2093 IN ULONG AllocateFromCount
;
2094 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom
;
2098 IN OUT PLIST_ENTRY ArbitrationList
;
2102 OUT PCM_PARTIAL_RESOURCE_LIST
*AllocatedResources
;
2103 } QueryAllocatedResources
;
2106 IN PDEVICE_OBJECT PhysicalDeviceObject
;
2107 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource
;
2108 OUT PULONG ConflictCount
;
2109 OUT PARBITER_CONFLICT_INFO
*Conflicts
;
2113 IN PLIST_ENTRY ArbitrationList
;
2117 IN PDEVICE_OBJECT ReserveDevice
;
2120 } ARBITER_PARAMETERS
, *PARBITER_PARAMETERS
;
2122 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
2124 typedef struct _ARBITER_LIST_ENTRY
{
2125 LIST_ENTRY ListEntry
;
2126 ULONG AlternativeCount
;
2127 PIO_RESOURCE_DESCRIPTOR Alternatives
;
2128 PDEVICE_OBJECT PhysicalDeviceObject
;
2129 ARBITER_REQUEST_SOURCE RequestSource
;
2132 INTERFACE_TYPE InterfaceType
;
2135 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment
;
2136 PIO_RESOURCE_DESCRIPTOR SelectedAlternative
;
2137 ARBITER_RESULT Result
;
2138 } ARBITER_LIST_ENTRY
, *PARBITER_LIST_ENTRY
;
2141 (DDKAPI
*PARBITER_HANDLER
)(
2143 IN ARBITER_ACTION Action
,
2144 IN OUT PARBITER_PARAMETERS Parameters
);
2146 #define ARBITER_PARTIAL 0x00000001
2148 typedef struct _ARBITER_INTERFACE
{
2152 PINTERFACE_REFERENCE InterfaceReference
;
2153 PINTERFACE_DEREFERENCE InterfaceDereference
;
2154 PARBITER_HANDLER ArbiterHandler
;
2156 } ARBITER_INTERFACE
, *PARBITER_INTERFACE
;
2158 typedef enum _HAL_QUERY_INFORMATION_CLASS
{
2159 HalInstalledBusInformation
,
2160 HalProfileSourceInformation
,
2161 HalInformationClassUnused1
,
2162 HalPowerInformation
,
2163 HalProcessorSpeedInformation
,
2164 HalCallbackInformation
,
2165 HalMapRegisterInformation
,
2166 HalMcaLogInformation
,
2167 HalFrameBufferCachingInformation
,
2168 HalDisplayBiosInformation
,
2169 HalProcessorFeatureInformation
,
2170 HalNumaTopologyInterface
,
2171 HalErrorInformation
,
2172 HalCmcLogInformation
,
2173 HalCpeLogInformation
,
2174 HalQueryMcaInterface
,
2175 HalQueryAMLIIllegalIOPortAddresses
,
2176 HalQueryMaxHotPlugMemoryAddress
,
2177 HalPartitionIpiInterface
,
2178 HalPlatformInformation
,
2179 HalQueryProfileSourceList
2180 } HAL_QUERY_INFORMATION_CLASS
, *PHAL_QUERY_INFORMATION_CLASS
;
2182 typedef enum _HAL_SET_INFORMATION_CLASS
{
2183 HalProfileSourceInterval
,
2184 HalProfileSourceInterruptHandler
,
2185 HalMcaRegisterDriver
,
2186 HalKernelErrorHandler
,
2187 HalCmcRegisterDriver
,
2188 HalCpeRegisterDriver
,
2192 HalGenerateCmcInterrupt
2193 } HAL_SET_INFORMATION_CLASS
, *PHAL_SET_INFORMATION_CLASS
;
2195 /* Function Type Defintions for Dispatch Functions */
2198 (DDKAPI
*PDEVICE_CONTROL_COMPLETION
)(
2199 IN
struct _DEVICE_CONTROL_CONTEXT
*ControlContext
);
2201 typedef struct _DEVICE_CONTROL_CONTEXT
{
2203 PDEVICE_HANDLER_OBJECT DeviceHandler
;
2204 PDEVICE_OBJECT DeviceObject
;
2207 PULONG BufferLength
;
2209 } DEVICE_CONTROL_CONTEXT
, *PDEVICE_CONTROL_CONTEXT
;
2211 typedef struct _PM_DISPATCH_TABLE
{
2215 } PM_DISPATCH_TABLE
, *PPM_DISPATCH_TABLE
;
2217 typedef enum _RESOURCE_TRANSLATION_DIRECTION
{
2218 TranslateChildToParent
,
2219 TranslateParentToChild
2220 } RESOURCE_TRANSLATION_DIRECTION
;
2223 (DDKAPI
*PTRANSLATE_RESOURCE_HANDLER
)(
2225 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source
,
2226 IN RESOURCE_TRANSLATION_DIRECTION Direction
,
2227 IN ULONG AlternativesCount
,
2228 IN IO_RESOURCE_DESCRIPTOR Alternatives
[],
2229 IN PDEVICE_OBJECT PhysicalDeviceObject
,
2230 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target
);
2233 (DDKAPI
*PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER
)(
2235 IN PIO_RESOURCE_DESCRIPTOR Source
,
2236 IN PDEVICE_OBJECT PhysicalDeviceObject
,
2237 OUT PULONG TargetCount
,
2238 OUT PIO_RESOURCE_DESCRIPTOR
*Target
);
2240 typedef struct _TRANSLATOR_INTERFACE
{
2244 PINTERFACE_REFERENCE InterfaceReference
;
2245 PINTERFACE_DEREFERENCE InterfaceDereference
;
2246 PTRANSLATE_RESOURCE_HANDLER TranslateResources
;
2247 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements
;
2248 } TRANSLATOR_INTERFACE
, *PTRANSLATOR_INTERFACE
;
2251 (DDKAPI
*pHalDeviceControl
)(
2252 IN PDEVICE_HANDLER_OBJECT DeviceHandler
,
2253 IN PDEVICE_OBJECT DeviceObject
,
2254 IN ULONG ControlCode
,
2255 IN OUT PVOID Buffer OPTIONAL
,
2256 IN OUT PULONG BufferLength OPTIONAL
,
2258 IN PDEVICE_CONTROL_COMPLETION CompletionRoutine
);
2261 (DDKFASTAPI
*pHalExamineMBR
)(
2262 IN PDEVICE_OBJECT DeviceObject
,
2263 IN ULONG SectorSize
,
2264 IN ULONG MBRTypeIdentifier
,
2268 (DDKFASTAPI
*pHalIoAssignDriveLetters
)(
2269 IN
struct _LOADER_PARAMETER_BLOCK
*LoaderBlock
,
2270 IN PSTRING NtDeviceName
,
2271 OUT PUCHAR NtSystemPath
,
2272 OUT PSTRING NtSystemPathString
);
2275 (DDKFASTAPI
*pHalIoReadPartitionTable
)(
2276 IN PDEVICE_OBJECT DeviceObject
,
2277 IN ULONG SectorSize
,
2278 IN BOOLEAN ReturnRecognizedPartitions
,
2279 OUT
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
2282 (DDKFASTAPI
*pHalIoSetPartitionInformation
)(
2283 IN PDEVICE_OBJECT DeviceObject
,
2284 IN ULONG SectorSize
,
2285 IN ULONG PartitionNumber
,
2286 IN ULONG PartitionType
);
2289 (DDKFASTAPI
*pHalIoWritePartitionTable
)(
2290 IN PDEVICE_OBJECT DeviceObject
,
2291 IN ULONG SectorSize
,
2292 IN ULONG SectorsPerTrack
,
2293 IN ULONG NumberOfHeads
,
2294 IN
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
2296 typedef PBUS_HANDLER
2297 (DDKFASTAPI
*pHalHandlerForBus
)(
2298 IN INTERFACE_TYPE InterfaceType
,
2299 IN ULONG BusNumber
);
2302 (DDKFASTAPI
*pHalReferenceBusHandler
)(
2303 IN PBUS_HANDLER BusHandler
);
2306 (DDKAPI
*pHalQuerySystemInformation
)(
2307 IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
2308 IN ULONG BufferSize
,
2309 IN OUT PVOID Buffer
,
2310 OUT PULONG ReturnedLength
);
2313 (DDKAPI
*pHalSetSystemInformation
)(
2314 IN HAL_SET_INFORMATION_CLASS InformationClass
,
2315 IN ULONG BufferSize
,
2319 (DDKAPI
*pHalQueryBusSlots
)(
2320 IN PBUS_HANDLER BusHandler
,
2321 IN ULONG BufferSize
,
2322 OUT PULONG SlotNumbers
,
2323 OUT PULONG ReturnedLength
);
2326 (DDKAPI
*pHalInitPnpDriver
)(
2330 (DDKAPI
*pHalInitPowerManagement
)(
2331 IN PPM_DISPATCH_TABLE PmDriverDispatchTable
,
2332 OUT PPM_DISPATCH_TABLE
*PmHalDispatchTable
);
2334 typedef struct _DMA_ADAPTER
*
2335 (DDKAPI
*pHalGetDmaAdapter
)(
2337 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
2338 OUT PULONG NumberOfMapRegisters
);
2341 (DDKAPI
*pHalGetInterruptTranslator
)(
2342 IN INTERFACE_TYPE ParentInterfaceType
,
2343 IN ULONG ParentBusNumber
,
2344 IN INTERFACE_TYPE BridgeInterfaceType
,
2347 OUT PTRANSLATOR_INTERFACE Translator
,
2348 OUT PULONG BridgeBusNumber
);
2351 (DDKAPI
*pHalStartMirroring
)(
2355 (DDKAPI
*pHalEndMirroring
)(
2356 IN ULONG PassNumber
);
2359 (DDKAPI
*pHalMirrorPhysicalMemory
)(
2360 IN PHYSICAL_ADDRESS PhysicalAddress
,
2361 IN LARGE_INTEGER NumberOfBytes
);
2364 (DDKAPI
*pHalMirrorVerify
)(
2365 IN PHYSICAL_ADDRESS PhysicalAddress
,
2366 IN LARGE_INTEGER NumberOfBytes
);
2369 (DDKAPI
*pHalEndOfBoot
)(
2373 (DDKAPI
*PHAL_RESET_DISPLAY_PARAMETERS
)(
2374 ULONG Columns
, ULONG Rows
);
2378 pHalQuerySystemInformation HalQuerySystemInformation
;
2379 pHalSetSystemInformation HalSetSystemInformation
;
2380 pHalQueryBusSlots HalQueryBusSlots
;
2382 pHalExamineMBR HalExamineMBR
;
2383 pHalIoAssignDriveLetters HalIoAssignDriveLetters
;
2384 pHalIoReadPartitionTable HalIoReadPartitionTable
;
2385 pHalIoSetPartitionInformation HalIoSetPartitionInformation
;
2386 pHalIoWritePartitionTable HalIoWritePartitionTable
;
2387 pHalHandlerForBus HalReferenceHandlerForBus
;
2388 pHalReferenceBusHandler HalReferenceBusHandler
;
2389 pHalReferenceBusHandler HalDereferenceBusHandler
;
2390 pHalInitPnpDriver HalInitPnpDriver
;
2391 pHalInitPowerManagement HalInitPowerManagement
;
2392 pHalGetDmaAdapter HalGetDmaAdapter
;
2393 pHalGetInterruptTranslator HalGetInterruptTranslator
;
2394 pHalStartMirroring HalStartMirroring
;
2395 pHalEndMirroring HalEndMirroring
;
2396 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory
;
2397 pHalEndOfBoot HalEndOfBoot
;
2398 pHalMirrorVerify HalMirrorVerify
;
2399 } HAL_DISPATCH
, *PHAL_DISPATCH
;
2401 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)
2402 extern DECL_IMPORT PHAL_DISPATCH HalDispatchTable
;
2403 #define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable)
2405 extern DECL_EXPORT HAL_DISPATCH HalDispatchTable
;
2406 #define HALDISPATCH (&HalDispatchTable)
2409 #define HAL_DISPATCH_VERSION 3
2410 #define HalDispatchTableVersion HALDISPATCH->Version
2411 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
2412 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
2413 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
2414 #define HalDeviceControl HALDISPATCH->HalDeviceControl
2415 #define HalIoAssignDriveLetters HALDISPATCH->HalIoAssignDriveLetters
2416 #define HalIoReadPartitionTable HALDISPATCH->HalIoReadPartitionTable
2417 #define HalIoSetPartitionInformation HALDISPATCH->HalIoSetPartitionInformation
2418 #define HalIoWritePartitionTable HALDISPATCH->HalIoWritePartitionTable
2419 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
2420 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
2421 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
2423 typedef enum _FILE_INFORMATION_CLASS
{
2424 FileDirectoryInformation
= 1,
2425 FileFullDirectoryInformation
,
2426 FileBothDirectoryInformation
,
2427 FileBasicInformation
,
2428 FileStandardInformation
,
2429 FileInternalInformation
,
2431 FileAccessInformation
,
2432 FileNameInformation
,
2433 FileRenameInformation
,
2434 FileLinkInformation
,
2435 FileNamesInformation
,
2436 FileDispositionInformation
,
2437 FilePositionInformation
,
2438 FileFullEaInformation
,
2439 FileModeInformation
,
2440 FileAlignmentInformation
,
2442 FileAllocationInformation
,
2443 FileEndOfFileInformation
,
2444 FileAlternateNameInformation
,
2445 FileStreamInformation
,
2446 FilePipeInformation
,
2447 FilePipeLocalInformation
,
2448 FilePipeRemoteInformation
,
2449 FileMailslotQueryInformation
,
2450 FileMailslotSetInformation
,
2451 FileCompressionInformation
,
2452 FileObjectIdInformation
,
2453 FileCompletionInformation
,
2454 FileMoveClusterInformation
,
2455 FileQuotaInformation
,
2456 FileReparsePointInformation
,
2457 FileNetworkOpenInformation
,
2458 FileAttributeTagInformation
,
2459 FileTrackingInformation
,
2460 FileIdBothDirectoryInformation
,
2461 FileIdFullDirectoryInformation
,
2462 FileValidDataLengthInformation
,
2463 FileShortNameInformation
,
2464 FileMaximumInformation
2465 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
2467 typedef struct _FILE_POSITION_INFORMATION
{
2468 LARGE_INTEGER CurrentByteOffset
;
2469 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
2471 typedef struct _FILE_ALIGNMENT_INFORMATION
{
2472 ULONG AlignmentRequirement
;
2473 } FILE_ALIGNMENT_INFORMATION
, *PFILE_ALIGNMENT_INFORMATION
;
2475 typedef struct _FILE_NAME_INFORMATION
{
2476 ULONG FileNameLength
;
2478 } FILE_NAME_INFORMATION
, *PFILE_NAME_INFORMATION
;
2480 #include <pshpack8.h>
2481 typedef struct _FILE_BASIC_INFORMATION
{
2482 LARGE_INTEGER CreationTime
;
2483 LARGE_INTEGER LastAccessTime
;
2484 LARGE_INTEGER LastWriteTime
;
2485 LARGE_INTEGER ChangeTime
;
2486 ULONG FileAttributes
;
2487 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
2488 #include <poppack.h>
2490 typedef struct _FILE_STANDARD_INFORMATION
{
2491 LARGE_INTEGER AllocationSize
;
2492 LARGE_INTEGER EndOfFile
;
2493 ULONG NumberOfLinks
;
2494 BOOLEAN DeletePending
;
2496 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
2498 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
2499 LARGE_INTEGER CreationTime
;
2500 LARGE_INTEGER LastAccessTime
;
2501 LARGE_INTEGER LastWriteTime
;
2502 LARGE_INTEGER ChangeTime
;
2503 LARGE_INTEGER AllocationSize
;
2504 LARGE_INTEGER EndOfFile
;
2505 ULONG FileAttributes
;
2506 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
2508 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION
{
2509 ULONG FileAttributes
;
2511 } FILE_ATTRIBUTE_TAG_INFORMATION
, *PFILE_ATTRIBUTE_TAG_INFORMATION
;
2513 typedef struct _FILE_DISPOSITION_INFORMATION
{
2515 } FILE_DISPOSITION_INFORMATION
, *PFILE_DISPOSITION_INFORMATION
;
2517 typedef struct _FILE_QUOTA_INFORMATION
{
2518 ULONG NextEntryOffset
;
2520 LARGE_INTEGER ChangeTime
;
2521 LARGE_INTEGER QuotaUsed
;
2522 LARGE_INTEGER QuotaThreshold
;
2523 LARGE_INTEGER QuotaLimit
;
2525 } FILE_QUOTA_INFORMATION
, *PFILE_QUOTA_INFORMATION
;
2527 typedef struct _FILE_END_OF_FILE_INFORMATION
{
2528 LARGE_INTEGER EndOfFile
;
2529 } FILE_END_OF_FILE_INFORMATION
, *PFILE_END_OF_FILE_INFORMATION
;
2531 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
{
2532 LARGE_INTEGER ValidDataLength
;
2533 } FILE_VALID_DATA_LENGTH_INFORMATION
, *PFILE_VALID_DATA_LENGTH_INFORMATION
;
2535 typedef enum _FSINFOCLASS
{
2536 FileFsVolumeInformation
= 1,
2537 FileFsLabelInformation
,
2538 FileFsSizeInformation
,
2539 FileFsDeviceInformation
,
2540 FileFsAttributeInformation
,
2541 FileFsControlInformation
,
2542 FileFsFullSizeInformation
,
2543 FileFsObjectIdInformation
,
2544 FileFsDriverPathInformation
,
2545 FileFsMaximumInformation
2546 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
2548 typedef struct _FILE_FS_DEVICE_INFORMATION
{
2549 DEVICE_TYPE DeviceType
;
2550 ULONG Characteristics
;
2551 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
2553 typedef struct _FILE_FULL_EA_INFORMATION
{
2554 ULONG NextEntryOffset
;
2557 USHORT EaValueLength
;
2559 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
2561 typedef ULONG_PTR ERESOURCE_THREAD
;
2562 typedef ERESOURCE_THREAD
*PERESOURCE_THREAD
;
2564 typedef struct _OWNER_ENTRY
{
2565 ERESOURCE_THREAD OwnerThread
;
2566 _ANONYMOUS_UNION
union {
2570 } OWNER_ENTRY
, *POWNER_ENTRY
;
2572 /* ERESOURCE.Flag */
2574 #define ResourceNeverExclusive 0x0010
2575 #define ResourceReleaseByOtherThread 0x0020
2576 #define ResourceOwnedExclusive 0x0080
2578 #define RESOURCE_HASH_TABLE_SIZE 64
2580 typedef struct _ERESOURCE
{
2581 LIST_ENTRY SystemResourcesList
;
2582 POWNER_ENTRY OwnerTable
;
2585 PKSEMAPHORE SharedWaiters
;
2586 PKEVENT ExclusiveWaiters
;
2587 OWNER_ENTRY OwnerThreads
[2];
2588 ULONG ContentionCount
;
2589 USHORT NumberOfSharedWaiters
;
2590 USHORT NumberOfExclusiveWaiters
;
2591 _ANONYMOUS_UNION
union {
2593 ULONG_PTR CreatorBackTraceIndex
;
2595 KSPIN_LOCK SpinLock
;
2596 } ERESOURCE
, *PERESOURCE
;
2598 typedef struct _DRIVER_EXTENSION
{
2599 struct _DRIVER_OBJECT
*DriverObject
;
2600 PDRIVER_ADD_DEVICE AddDevice
;
2602 UNICODE_STRING ServiceKeyName
;
2603 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
2606 (DDKAPI
*PFAST_IO_CHECK_IF_POSSIBLE
)(
2607 IN
struct _FILE_OBJECT
*FileObject
,
2608 IN PLARGE_INTEGER FileOffset
,
2612 IN BOOLEAN CheckForReadOperation
,
2613 OUT PIO_STATUS_BLOCK IoStatus
,
2614 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2617 (DDKAPI
*PFAST_IO_READ
)(
2618 IN
struct _FILE_OBJECT
*FileObject
,
2619 IN PLARGE_INTEGER FileOffset
,
2624 OUT PIO_STATUS_BLOCK IoStatus
,
2625 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2628 (DDKAPI
*PFAST_IO_WRITE
)(
2629 IN
struct _FILE_OBJECT
*FileObject
,
2630 IN PLARGE_INTEGER FileOffset
,
2635 OUT PIO_STATUS_BLOCK IoStatus
,
2636 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2639 (DDKAPI
*PFAST_IO_QUERY_BASIC_INFO
)(
2640 IN
struct _FILE_OBJECT
*FileObject
,
2642 OUT PFILE_BASIC_INFORMATION Buffer
,
2643 OUT PIO_STATUS_BLOCK IoStatus
,
2644 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2647 (DDKAPI
*PFAST_IO_QUERY_STANDARD_INFO
)(
2648 IN
struct _FILE_OBJECT
*FileObject
,
2650 OUT PFILE_STANDARD_INFORMATION Buffer
,
2651 OUT PIO_STATUS_BLOCK IoStatus
,
2652 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2655 (DDKAPI
*PFAST_IO_LOCK
)(
2656 IN
struct _FILE_OBJECT
*FileObject
,
2657 IN PLARGE_INTEGER FileOffset
,
2658 IN PLARGE_INTEGER Length
,
2659 PEPROCESS ProcessId
,
2661 BOOLEAN FailImmediately
,
2662 BOOLEAN ExclusiveLock
,
2663 OUT PIO_STATUS_BLOCK IoStatus
,
2664 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2667 (DDKAPI
*PFAST_IO_UNLOCK_SINGLE
)(
2668 IN
struct _FILE_OBJECT
*FileObject
,
2669 IN PLARGE_INTEGER FileOffset
,
2670 IN PLARGE_INTEGER Length
,
2671 PEPROCESS ProcessId
,
2673 OUT PIO_STATUS_BLOCK IoStatus
,
2674 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2677 (DDKAPI
*PFAST_IO_UNLOCK_ALL
)(
2678 IN
struct _FILE_OBJECT
*FileObject
,
2679 PEPROCESS ProcessId
,
2680 OUT PIO_STATUS_BLOCK IoStatus
,
2681 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2684 (DDKAPI
*PFAST_IO_UNLOCK_ALL_BY_KEY
)(
2685 IN
struct _FILE_OBJECT
*FileObject
,
2686 PEPROCESS ProcessId
,
2688 OUT PIO_STATUS_BLOCK IoStatus
,
2689 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2692 (DDKAPI
*PFAST_IO_DEVICE_CONTROL
)(
2693 IN
struct _FILE_OBJECT
*FileObject
,
2695 IN PVOID InputBuffer OPTIONAL
,
2696 IN ULONG InputBufferLength
,
2697 OUT PVOID OutputBuffer OPTIONAL
,
2698 IN ULONG OutputBufferLength
,
2699 IN ULONG IoControlCode
,
2700 OUT PIO_STATUS_BLOCK IoStatus
,
2701 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2704 (DDKAPI
*PFAST_IO_ACQUIRE_FILE
)(
2705 IN
struct _FILE_OBJECT
*FileObject
);
2708 (DDKAPI
*PFAST_IO_RELEASE_FILE
)(
2709 IN
struct _FILE_OBJECT
*FileObject
);
2712 (DDKAPI
*PFAST_IO_DETACH_DEVICE
)(
2713 IN
struct _DEVICE_OBJECT
*SourceDevice
,
2714 IN
struct _DEVICE_OBJECT
*TargetDevice
);
2717 (DDKAPI
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
)(
2718 IN
struct _FILE_OBJECT
*FileObject
,
2720 OUT
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
2721 OUT
struct _IO_STATUS_BLOCK
*IoStatus
,
2722 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2725 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
2726 IN
struct _FILE_OBJECT
*FileObject
,
2727 IN PLARGE_INTEGER EndingOffset
,
2728 OUT
struct _ERESOURCE
**ResourceToRelease
,
2729 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2732 (DDKAPI
*PFAST_IO_MDL_READ
)(
2733 IN
struct _FILE_OBJECT
*FileObject
,
2734 IN PLARGE_INTEGER FileOffset
,
2738 OUT PIO_STATUS_BLOCK IoStatus
,
2739 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2742 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE
)(
2743 IN
struct _FILE_OBJECT
*FileObject
,
2745 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2748 (DDKAPI
*PFAST_IO_PREPARE_MDL_WRITE
)(
2749 IN
struct _FILE_OBJECT
*FileObject
,
2750 IN PLARGE_INTEGER FileOffset
,
2754 OUT PIO_STATUS_BLOCK IoStatus
,
2755 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2758 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE
)(
2759 IN
struct _FILE_OBJECT
*FileObject
,
2760 IN PLARGE_INTEGER FileOffset
,
2762 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2765 (DDKAPI
*PFAST_IO_READ_COMPRESSED
)(
2766 IN
struct _FILE_OBJECT
*FileObject
,
2767 IN PLARGE_INTEGER FileOffset
,
2772 OUT PIO_STATUS_BLOCK IoStatus
,
2773 OUT
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
2774 IN ULONG CompressedDataInfoLength
,
2775 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2778 (DDKAPI
*PFAST_IO_WRITE_COMPRESSED
)(
2779 IN
struct _FILE_OBJECT
*FileObject
,
2780 IN PLARGE_INTEGER FileOffset
,
2785 OUT PIO_STATUS_BLOCK IoStatus
,
2786 IN
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
2787 IN ULONG CompressedDataInfoLength
,
2788 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2791 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
2792 IN
struct _FILE_OBJECT
*FileObject
,
2794 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2797 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
2798 IN
struct _FILE_OBJECT
*FileObject
,
2799 IN PLARGE_INTEGER FileOffset
,
2801 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2804 (DDKAPI
*PFAST_IO_QUERY_OPEN
)(
2805 IN
struct _IRP
*Irp
,
2806 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
2807 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2810 (DDKAPI
*PFAST_IO_RELEASE_FOR_MOD_WRITE
)(
2811 IN
struct _FILE_OBJECT
*FileObject
,
2812 IN
struct _ERESOURCE
*ResourceToRelease
,
2813 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2816 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
)(
2817 IN
struct _FILE_OBJECT
*FileObject
,
2818 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2821 (DDKAPI
*PFAST_IO_RELEASE_FOR_CCFLUSH
) (
2822 IN
struct _FILE_OBJECT
*FileObject
,
2823 IN
struct _DEVICE_OBJECT
*DeviceObject
);
2825 typedef struct _FAST_IO_DISPATCH
{
2826 ULONG SizeOfFastIoDispatch
;
2827 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
2828 PFAST_IO_READ FastIoRead
;
2829 PFAST_IO_WRITE FastIoWrite
;
2830 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
2831 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
2832 PFAST_IO_LOCK FastIoLock
;
2833 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
2834 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
2835 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
2836 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
2837 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
2838 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
2839 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
2840 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
2841 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
2842 PFAST_IO_MDL_READ MdlRead
;
2843 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
2844 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
2845 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
2846 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
2847 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
2848 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
2849 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
2850 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
2851 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
2852 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
2853 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
2854 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
2856 #define DRVO_UNLOAD_INVOKED 0x00000001
2857 #define DRVO_LEGACY_DRIVER 0x00000002
2858 #define DRVO_BUILTIN_DRIVER 0x00000004
2859 #define DRVO_REINIT_REGISTERED 0x00000008
2860 #define DRVO_INITIALIZED 0x00000010
2861 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
2862 #define DRVO_LEGACY_RESOURCES 0x00000040
2864 typedef struct _DRIVER_OBJECT
{
2867 PDEVICE_OBJECT DeviceObject
;
2871 PVOID DriverSection
;
2872 PDRIVER_EXTENSION DriverExtension
;
2873 UNICODE_STRING DriverName
;
2874 PUNICODE_STRING HardwareDatabase
;
2875 PFAST_IO_DISPATCH FastIoDispatch
;
2876 PDRIVER_INITIALIZE DriverInit
;
2877 PDRIVER_STARTIO DriverStartIo
;
2878 PDRIVER_UNLOAD DriverUnload
;
2879 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
2881 typedef struct _DRIVER_OBJECT
*PDRIVER_OBJECT
;
2883 typedef struct _SECTION_OBJECT_POINTERS
{
2884 PVOID DataSectionObject
;
2885 PVOID SharedCacheMap
;
2886 PVOID ImageSectionObject
;
2887 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
2889 typedef struct _IO_COMPLETION_CONTEXT
{
2892 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
2894 /* FILE_OBJECT.Flags */
2896 #define FO_FILE_OPEN 0x00000001
2897 #define FO_SYNCHRONOUS_IO 0x00000002
2898 #define FO_ALERTABLE_IO 0x00000004
2899 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
2900 #define FO_WRITE_THROUGH 0x00000010
2901 #define FO_SEQUENTIAL_ONLY 0x00000020
2902 #define FO_CACHE_SUPPORTED 0x00000040
2903 #define FO_NAMED_PIPE 0x00000080
2904 #define FO_STREAM_FILE 0x00000100
2905 #define FO_MAILSLOT 0x00000200
2906 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
2907 #define FO_DIRECT_DEVICE_OPEN 0x00000800
2908 #define FO_FILE_MODIFIED 0x00001000
2909 #define FO_FILE_SIZE_CHANGED 0x00002000
2910 #define FO_CLEANUP_COMPLETE 0x00004000
2911 #define FO_TEMPORARY_FILE 0x00008000
2912 #define FO_DELETE_ON_CLOSE 0x00010000
2913 #define FO_OPENED_CASE_SENSITIVE 0x00020000
2914 #define FO_HANDLE_CREATED 0x00040000
2915 #define FO_FILE_FAST_IO_READ 0x00080000
2916 #define FO_RANDOM_ACCESS 0x00100000
2917 #define FO_FILE_OPEN_CANCELLED 0x00200000
2918 #define FO_VOLUME_OPEN 0x00400000
2919 #define FO_FILE_OBJECT_HAS_EXTENSION 0x00800000
2920 #define FO_REMOTE_ORIGIN 0x01000000
2922 typedef struct _FILE_OBJECT
{
2925 PDEVICE_OBJECT DeviceObject
;
2929 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
2930 PVOID PrivateCacheMap
;
2931 NTSTATUS FinalStatus
;
2932 struct _FILE_OBJECT
*RelatedFileObject
;
2933 BOOLEAN LockOperation
;
2934 BOOLEAN DeletePending
;
2936 BOOLEAN WriteAccess
;
2937 BOOLEAN DeleteAccess
;
2939 BOOLEAN SharedWrite
;
2940 BOOLEAN SharedDelete
;
2942 UNICODE_STRING FileName
;
2943 LARGE_INTEGER CurrentByteOffset
;
2949 PIO_COMPLETION_CONTEXT CompletionContext
;
2951 typedef struct _FILE_OBJECT
*PFILE_OBJECT
;
2953 typedef enum _SECURITY_OPERATION_CODE
{
2954 SetSecurityDescriptor
,
2955 QuerySecurityDescriptor
,
2956 DeleteSecurityDescriptor
,
2957 AssignSecurityDescriptor
2958 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
2960 #define INITIAL_PRIVILEGE_COUNT 3
2962 typedef struct _INITIAL_PRIVILEGE_SET
{
2963 ULONG PrivilegeCount
;
2965 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
2966 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
2968 typedef struct _SECURITY_SUBJECT_CONTEXT
{
2969 PACCESS_TOKEN ClientToken
;
2970 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
2971 PACCESS_TOKEN PrimaryToken
;
2972 PVOID ProcessAuditId
;
2973 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
2975 #include <pshpack4.h>
2976 typedef struct _ACCESS_STATE
{
2978 BOOLEAN SecurityEvaluated
;
2979 BOOLEAN GenerateAudit
;
2980 BOOLEAN GenerateOnClose
;
2981 BOOLEAN PrivilegesAllocated
;
2983 ACCESS_MASK RemainingDesiredAccess
;
2984 ACCESS_MASK PreviouslyGrantedAccess
;
2985 ACCESS_MASK OriginalDesiredAccess
;
2986 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
2987 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2990 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
2991 PRIVILEGE_SET PrivilegeSet
;
2994 BOOLEAN AuditPrivileges
;
2995 UNICODE_STRING ObjectName
;
2996 UNICODE_STRING ObjectTypeName
;
2997 } ACCESS_STATE
, *PACCESS_STATE
;
2998 #include <poppack.h>
3000 typedef struct _IO_SECURITY_CONTEXT
{
3001 PSECURITY_QUALITY_OF_SERVICE SecurityQos
;
3002 PACCESS_STATE AccessState
;
3003 ACCESS_MASK DesiredAccess
;
3004 ULONG FullCreateOptions
;
3005 } IO_SECURITY_CONTEXT
, *PIO_SECURITY_CONTEXT
;
3007 #define IO_TYPE_ADAPTER 1
3008 #define IO_TYPE_CONTROLLER 2
3009 #define IO_TYPE_DEVICE 3
3010 #define IO_TYPE_DRIVER 4
3011 #define IO_TYPE_FILE 5
3012 #define IO_TYPE_IRP 6
3013 #define IO_TYPE_MASTER_ADAPTER 7
3014 #define IO_TYPE_OPEN_PACKET 8
3015 #define IO_TYPE_TIMER 9
3016 #define IO_TYPE_VPB 10
3017 #define IO_TYPE_ERROR_LOG 11
3018 #define IO_TYPE_ERROR_MESSAGE 12
3019 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
3021 #define IO_TYPE_CSQ_IRP_CONTEXT 1
3022 #define IO_TYPE_CSQ 2
3026 typedef struct _IO_CSQ_IRP_CONTEXT
{
3029 struct _IO_CSQ
*Csq
;
3030 } IO_CSQ_IRP_CONTEXT
, *PIO_CSQ_IRP_CONTEXT
;
3033 (DDKAPI
*PIO_CSQ_INSERT_IRP
)(
3034 IN
struct _IO_CSQ
*Csq
,
3038 (DDKAPI
*PIO_CSQ_REMOVE_IRP
)(
3039 IN
struct _IO_CSQ
*Csq
,
3043 (DDKAPI
*PIO_CSQ_PEEK_NEXT_IRP
)(
3044 IN
struct _IO_CSQ
*Csq
,
3046 IN PVOID PeekContext
);
3049 (DDKAPI
*PIO_CSQ_ACQUIRE_LOCK
)(
3050 IN
struct _IO_CSQ
*Csq
,
3054 (DDKAPI
*PIO_CSQ_RELEASE_LOCK
)(
3055 IN
struct _IO_CSQ
*Csq
,
3059 (DDKAPI
*PIO_CSQ_COMPLETE_CANCELED_IRP
)(
3060 IN
struct _IO_CSQ
*Csq
,
3063 typedef struct _IO_CSQ
{
3065 PIO_CSQ_INSERT_IRP CsqInsertIrp
;
3066 PIO_CSQ_REMOVE_IRP CsqRemoveIrp
;
3067 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
;
3068 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
;
3069 PIO_CSQ_RELEASE_LOCK CsqReleaseLock
;
3070 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
;
3071 PVOID ReservePointer
;
3074 #if !defined(_ALPHA_)
3075 #include <pshpack4.h>
3077 typedef struct _IO_STACK_LOCATION
{
3078 UCHAR MajorFunction
;
3079 UCHAR MinorFunction
;
3084 PIO_SECURITY_CONTEXT SecurityContext
;
3086 USHORT POINTER_ALIGNMENT FileAttributes
;
3088 ULONG POINTER_ALIGNMENT EaLength
;
3090 /* FIXME: CreatePipe and CreateMailslot aren't defined in official
3091 * DDK/IFS headers. */
3093 PIO_SECURITY_CONTEXT SecurityContext
;
3097 struct _NAMED_PIPE_CREATE_PARAMETERS
*Parameters
;
3100 PIO_SECURITY_CONTEXT SecurityContext
;
3104 struct _MAILSLOT_CREATE_PARAMETERS
*Parameters
;
3108 ULONG POINTER_ALIGNMENT Key
;
3109 LARGE_INTEGER ByteOffset
;
3113 ULONG POINTER_ALIGNMENT Key
;
3114 LARGE_INTEGER ByteOffset
;
3118 PUNICODE_STRING FileName
;
3119 FILE_INFORMATION_CLASS FileInformationClass
;
3124 ULONG CompletionFilter
;
3128 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
3132 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass
;
3133 PFILE_OBJECT FileObject
;
3134 _ANONYMOUS_UNION
union {
3135 _ANONYMOUS_STRUCT
struct {
3136 BOOLEAN ReplaceIfExists
;
3137 BOOLEAN AdvanceOnly
;
3140 HANDLE DeleteHandle
;
3154 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass
;
3158 FS_INFORMATION_CLASS FsInformationClass
;
3161 ULONG OutputBufferLength
;
3162 ULONG InputBufferLength
;
3163 ULONG FsControlCode
;
3164 PVOID Type3InputBuffer
;
3165 } FileSystemControl
;
3167 PLARGE_INTEGER Length
;
3169 LARGE_INTEGER ByteOffset
;
3172 ULONG OutputBufferLength
;
3173 ULONG POINTER_ALIGNMENT InputBufferLength
;
3174 ULONG POINTER_ALIGNMENT IoControlCode
;
3175 PVOID Type3InputBuffer
;
3178 SECURITY_INFORMATION SecurityInformation
;
3179 ULONG POINTER_ALIGNMENT Length
;
3182 SECURITY_INFORMATION SecurityInformation
;
3183 PSECURITY_DESCRIPTOR SecurityDescriptor
;
3187 PDEVICE_OBJECT DeviceObject
;
3191 PDEVICE_OBJECT DeviceObject
;
3194 struct _SCSI_REQUEST_BLOCK
*Srb
;
3199 struct _FILE_GET_QUOTA_INFORMATION
*SidList
;
3200 ULONG SidListLength
;
3206 DEVICE_RELATION_TYPE Type
;
3207 } QueryDeviceRelations
;
3209 CONST GUID
*InterfaceType
;
3212 PINTERFACE Interface
;
3213 PVOID InterfaceSpecificData
;
3216 PDEVICE_CAPABILITIES Capabilities
;
3217 } DeviceCapabilities
;
3219 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList
;
3220 } FilterResourceRequirements
;
3225 ULONG POINTER_ALIGNMENT Length
;
3231 BUS_QUERY_ID_TYPE IdType
;
3234 DEVICE_TEXT_TYPE DeviceTextType
;
3235 LCID POINTER_ALIGNMENT LocaleId
;
3239 BOOLEAN Reserved
[3];
3240 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type
;
3241 } UsageNotification
;
3243 SYSTEM_POWER_STATE PowerState
;
3246 PPOWER_SEQUENCE PowerSequence
;
3249 ULONG SystemContext
;
3250 POWER_STATE_TYPE POINTER_ALIGNMENT Type
;
3251 POWER_STATE POINTER_ALIGNMENT State
;
3252 POWER_ACTION POINTER_ALIGNMENT ShutdownType
;
3255 PCM_RESOURCE_LIST AllocatedResources
;
3256 PCM_RESOURCE_LIST AllocatedResourcesTranslated
;
3259 ULONG_PTR ProviderId
;
3271 PDEVICE_OBJECT DeviceObject
;
3272 PFILE_OBJECT FileObject
;
3273 PIO_COMPLETION_ROUTINE CompletionRoutine
;
3275 } IO_STACK_LOCATION
, *PIO_STACK_LOCATION
;
3276 #if !defined(_ALPHA_)
3277 #include <poppack.h>
3280 /* IO_STACK_LOCATION.Control */
3282 #define SL_PENDING_RETURNED 0x01
3283 #define SL_INVOKE_ON_CANCEL 0x20
3284 #define SL_INVOKE_ON_SUCCESS 0x40
3285 #define SL_INVOKE_ON_ERROR 0x80
3287 typedef enum _KEY_INFORMATION_CLASS
{
3288 KeyBasicInformation
,
3292 KeyCachedInformation
,
3294 } KEY_INFORMATION_CLASS
;
3296 typedef struct _KEY_BASIC_INFORMATION
{
3297 LARGE_INTEGER LastWriteTime
;
3301 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
3303 typedef struct _KEY_FULL_INFORMATION
{
3304 LARGE_INTEGER LastWriteTime
;
3312 ULONG MaxValueNameLen
;
3313 ULONG MaxValueDataLen
;
3315 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
3317 typedef struct _KEY_NODE_INFORMATION
{
3318 LARGE_INTEGER LastWriteTime
;
3324 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
3326 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
3331 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
3333 typedef struct _KEY_VALUE_FULL_INFORMATION
{
3340 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
3342 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
3347 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
3349 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
3353 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
3355 typedef struct _KEY_VALUE_ENTRY
{
3356 PUNICODE_STRING ValueName
;
3360 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
3362 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
3363 KeyValueBasicInformation
,
3364 KeyValueFullInformation
,
3365 KeyValuePartialInformation
,
3366 KeyValueFullInformationAlign64
,
3367 KeyValuePartialInformationAlign64
3368 } KEY_VALUE_INFORMATION_CLASS
;
3370 typedef struct _KEY_WRITE_TIME_INFORMATION
{
3371 LARGE_INTEGER LastWriteTime
;
3372 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
3374 typedef struct _KEY_USER_FLAGS_INFORMATION
{
3376 } KEY_USER_FLAGS_INFORMATION
, *PKEY_USER_FLAGS_INFORMATION
;
3378 typedef enum _KEY_SET_INFORMATION_CLASS
{
3379 KeyWriteTimeInformation
,
3380 KeyUserFlagsInformation
,
3382 } KEY_SET_INFORMATION_CLASS
;
3384 #define REG_CREATED_NEW_KEY 0x00000001L
3385 #define REG_OPENED_EXISTING_KEY 0x00000002L
3388 /* KEY_VALUE_Xxx.Type */
3392 #define REG_EXPAND_SZ 2
3393 #define REG_BINARY 3
3395 #define REG_DWORD_LITTLE_ENDIAN 4
3396 #define REG_DWORD_BIG_ENDIAN 5
3398 #define REG_MULTI_SZ 7
3399 #define REG_RESOURCE_LIST 8
3400 #define REG_FULL_RESOURCE_DESCRIPTOR 9
3401 #define REG_RESOURCE_REQUIREMENTS_LIST 10
3402 #define REG_QWORD 11
3403 #define REG_QWORD_LITTLE_ENDIAN 11
3405 #define PCI_TYPE0_ADDRESSES 6
3406 #define PCI_TYPE1_ADDRESSES 2
3407 #define PCI_TYPE2_ADDRESSES 5
3409 typedef struct _PCI_COMMON_CONFIG
{
3418 UCHAR CacheLineSize
;
3423 struct _PCI_HEADER_TYPE_0
{
3424 ULONG BaseAddresses
[PCI_TYPE0_ADDRESSES
];
3428 ULONG ROMBaseAddress
;
3429 UCHAR CapabilitiesPtr
;
3432 UCHAR InterruptLine
;
3435 UCHAR MaximumLatency
;
3437 struct _PCI_HEADER_TYPE_1
{
3438 ULONG BaseAddresses
[PCI_TYPE1_ADDRESSES
];
3441 UCHAR SubordinateBus
;
3442 UCHAR SecondaryLatency
;
3445 USHORT SecondaryStatus
;
3448 USHORT PrefetchBase
;
3449 USHORT PrefetchLimit
;
3450 ULONG PrefetchBaseUpper32
;
3451 ULONG PrefetchLimitUpper32
;
3452 USHORT IOBaseUpper16
;
3453 USHORT IOLimitUpper16
;
3454 UCHAR CapabilitiesPtr
;
3456 ULONG ROMBaseAddress
;
3457 UCHAR InterruptLine
;
3459 USHORT BridgeControl
;
3461 struct _PCI_HEADER_TYPE_2
{
3462 ULONG SocketRegistersBaseAddress
;
3463 UCHAR CapabilitiesPtr
;
3465 USHORT SecondaryStatus
;
3468 UCHAR SubordinateBus
;
3469 UCHAR SecondaryLatency
;
3473 } Range
[PCI_TYPE2_ADDRESSES
- 1];
3474 UCHAR InterruptLine
;
3476 USHORT BridgeControl
;
3479 UCHAR DeviceSpecific
[192];
3480 } PCI_COMMON_CONFIG
, *PPCI_COMMON_CONFIG
;
3482 /* PCI_COMMON_CONFIG.Command */
3484 #define PCI_ENABLE_IO_SPACE 0x0001
3485 #define PCI_ENABLE_MEMORY_SPACE 0x0002
3486 #define PCI_ENABLE_BUS_MASTER 0x0004
3487 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
3488 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
3489 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
3490 #define PCI_ENABLE_PARITY 0x0040
3491 #define PCI_ENABLE_WAIT_CYCLE 0x0080
3492 #define PCI_ENABLE_SERR 0x0100
3493 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
3495 /* PCI_COMMON_CONFIG.Status */
3497 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
3498 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
3499 #define PCI_STATUS_UDF_SUPPORTED 0x0040
3500 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
3501 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
3502 #define PCI_STATUS_DEVSEL 0x0600
3503 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
3504 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
3505 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
3506 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
3507 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
3509 /* PCI_COMMON_CONFIG.HeaderType */
3511 #define PCI_MULTIFUNCTION 0x80
3512 #define PCI_DEVICE_TYPE 0x00
3513 #define PCI_BRIDGE_TYPE 0x01
3514 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
3516 #define PCI_CONFIGURATION_TYPE(PciData) \
3517 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
3519 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
3520 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
3522 /* PCI device classes */
3524 #define PCI_CLASS_PRE_20 0x00
3525 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
3526 #define PCI_CLASS_NETWORK_CTLR 0x02
3527 #define PCI_CLASS_DISPLAY_CTLR 0x03
3528 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
3529 #define PCI_CLASS_MEMORY_CTLR 0x05
3530 #define PCI_CLASS_BRIDGE_DEV 0x06
3531 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
3532 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
3533 #define PCI_CLASS_INPUT_DEV 0x09
3534 #define PCI_CLASS_DOCKING_STATION 0x0a
3535 #define PCI_CLASS_PROCESSOR 0x0b
3536 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
3538 /* PCI device subclasses for class 0 */
3540 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
3541 #define PCI_SUBCLASS_PRE_20_VGA 0x01
3543 /* PCI device subclasses for class 1 (mass storage controllers)*/
3545 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
3546 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
3547 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
3548 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
3549 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
3550 #define PCI_SUBCLASS_MSC_OTHER 0x80
3552 /* PCI device subclasses for class 2 (network controllers)*/
3554 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
3555 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
3556 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
3557 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
3558 #define PCI_SUBCLASS_NET_OTHER 0x80
3560 /* PCI device subclasses for class 3 (display controllers)*/
3562 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
3563 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
3564 #define PCI_SUBLCASS_VID_3D_CTLR 0x02
3565 #define PCI_SUBCLASS_VID_OTHER 0x80
3567 /* PCI device subclasses for class 4 (multimedia device)*/
3569 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
3570 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
3571 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
3572 #define PCI_SUBCLASS_MM_OTHER 0x80
3574 /* PCI device subclasses for class 5 (memory controller)*/
3576 #define PCI_SUBCLASS_MEM_RAM 0x00
3577 #define PCI_SUBCLASS_MEM_FLASH 0x01
3578 #define PCI_SUBCLASS_MEM_OTHER 0x80
3580 /* PCI device subclasses for class 6 (bridge device)*/
3582 #define PCI_SUBCLASS_BR_HOST 0x00
3583 #define PCI_SUBCLASS_BR_ISA 0x01
3584 #define PCI_SUBCLASS_BR_EISA 0x02
3585 #define PCI_SUBCLASS_BR_MCA 0x03
3586 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
3587 #define PCI_SUBCLASS_BR_PCMCIA 0x05
3588 #define PCI_SUBCLASS_BR_NUBUS 0x06
3589 #define PCI_SUBCLASS_BR_CARDBUS 0x07
3590 #define PCI_SUBCLASS_BR_OTHER 0x80
3592 /* PCI device subclasses for class C (serial bus controller)*/
3594 #define PCI_SUBCLASS_SB_IEEE1394 0x00
3595 #define PCI_SUBCLASS_SB_ACCESS 0x01
3596 #define PCI_SUBCLASS_SB_SSA 0x02
3597 #define PCI_SUBCLASS_SB_USB 0x03
3598 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
3600 #define PCI_MAX_DEVICES 32
3601 #define PCI_MAX_FUNCTION 8
3602 #define PCI_MAX_BRIDGE_NUMBER 0xFF
3603 #define PCI_INVALID_VENDORID 0xFFFF
3604 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
3606 #define PCI_ADDRESS_IO_SPACE 0x01
3607 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x06
3608 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x08
3609 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
3610 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
3611 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
3613 #define PCI_TYPE_32BIT 0
3614 #define PCI_TYPE_20BIT 2
3615 #define PCI_TYPE_64BIT 4
3617 typedef struct _PCI_SLOT_NUMBER
{
3620 ULONG DeviceNumber
: 5;
3621 ULONG FunctionNumber
: 3;
3622 ULONG Reserved
: 24;
3626 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
3628 typedef enum _POOL_TYPE
{
3631 NonPagedPoolMustSucceed
,
3633 NonPagedPoolCacheAligned
,
3634 PagedPoolCacheAligned
,
3635 NonPagedPoolCacheAlignedMustS
,
3637 NonPagedPoolSession
= 32,
3639 NonPagedPoolMustSucceedSession
,
3640 DontUseThisTypeSession
,
3641 NonPagedPoolCacheAlignedSession
,
3642 PagedPoolCacheAlignedSession
,
3643 NonPagedPoolCacheAlignedMustSSession
3646 typedef enum _EX_POOL_PRIORITY
{
3648 LowPoolPrioritySpecialPoolOverrun
= 8,
3649 LowPoolPrioritySpecialPoolUnderrun
= 9,
3650 NormalPoolPriority
= 16,
3651 NormalPoolPrioritySpecialPoolOverrun
= 24,
3652 NormalPoolPrioritySpecialPoolUnderrun
= 25,
3653 HighPoolPriority
= 32,
3654 HighPoolPrioritySpecialPoolOverrun
= 40,
3655 HighPoolPrioritySpecialPoolUnderrun
= 41
3658 /* PRIVILEGE_SET.Control */
3660 #define PRIVILEGE_SET_ALL_NECESSARY 1
3662 typedef struct _RTL_OSVERSIONINFOW
{
3663 ULONG dwOSVersionInfoSize
;
3664 ULONG dwMajorVersion
;
3665 ULONG dwMinorVersion
;
3666 ULONG dwBuildNumber
;
3668 WCHAR szCSDVersion
[128];
3669 } RTL_OSVERSIONINFOW
, *PRTL_OSVERSIONINFOW
;
3671 typedef struct _RTL_OSVERSIONINFOEXW
{
3672 ULONG dwOSVersionInfoSize
;
3673 ULONG dwMajorVersion
;
3674 ULONG dwMinorVersion
;
3675 ULONG dwBuildNumber
;
3677 WCHAR szCSDVersion
[128];
3678 USHORT wServicePackMajor
;
3679 USHORT wServicePackMinor
;
3683 } RTL_OSVERSIONINFOEXW
, *PRTL_OSVERSIONINFOEXW
;
3688 VerSetConditionMask(
3689 IN ULONGLONG ConditionMask
,
3691 IN UCHAR Condition
);
3693 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
3694 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
3695 (TypeBitMask), (ComparisonType)))
3697 /* RtlVerifyVersionInfo() TypeMask */
3699 #define VER_MINORVERSION 0x0000001
3700 #define VER_MAJORVERSION 0x0000002
3701 #define VER_BUILDNUMBER 0x0000004
3702 #define VER_PLATFORMID 0x0000008
3703 #define VER_SERVICEPACKMINOR 0x0000010
3704 #define VER_SERVICEPACKMAJOR 0x0000020
3705 #define VER_SUITENAME 0x0000040
3706 #define VER_PRODUCT_TYPE 0x0000080
3708 /* RtlVerifyVersionInfo() ComparisonType */
3711 #define VER_GREATER 2
3712 #define VER_GREATER_EQUAL 3
3714 #define VER_LESS_EQUAL 5
3718 #define VER_CONDITION_MASK 7
3719 #define VER_NUM_BITS_PER_CONDITION_MASK 3
3721 typedef struct _RTL_BITMAP
{
3724 } RTL_BITMAP
, *PRTL_BITMAP
;
3726 typedef struct _RTL_BITMAP_RUN
{
3727 ULONG StartingIndex
;
3729 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
3732 (DDKAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
3736 IN ULONG ValueLength
,
3738 IN PVOID EntryContext
);
3740 #define RTL_REGISTRY_ABSOLUTE 0
3741 #define RTL_REGISTRY_SERVICES 1
3742 #define RTL_REGISTRY_CONTROL 2
3743 #define RTL_REGISTRY_WINDOWS_NT 3
3744 #define RTL_REGISTRY_DEVICEMAP 4
3745 #define RTL_REGISTRY_USER 5
3746 #define RTL_REGISTRY_HANDLE 0x40000000
3747 #define RTL_REGISTRY_OPTIONAL 0x80000000
3749 /* RTL_QUERY_REGISTRY_TABLE.Flags */
3750 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3751 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3752 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3753 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3754 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3755 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3756 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
3758 typedef struct _RTL_QUERY_REGISTRY_TABLE
{
3759 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
3765 ULONG DefaultLength
;
3766 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
3768 typedef struct _TIME_FIELDS
{
3775 CSHORT Milliseconds
;
3777 } TIME_FIELDS
, *PTIME_FIELDS
;
3780 (DDKAPI
*PALLOCATE_FUNCTION
)(
3781 IN POOL_TYPE PoolType
,
3782 IN SIZE_T NumberOfBytes
,
3786 (DDKAPI
*PFREE_FUNCTION
)(
3789 typedef struct _GENERAL_LOOKASIDE
{
3790 SLIST_HEADER ListHead
;
3792 USHORT MaximumDepth
;
3793 ULONG TotalAllocates
;
3795 ULONG AllocateMisses
;
3806 PALLOCATE_FUNCTION Allocate
;
3807 PFREE_FUNCTION Free
;
3808 LIST_ENTRY ListEntry
;
3809 ULONG LastTotalAllocates
;
3811 ULONG LastAllocateMisses
;
3812 ULONG LastAllocateHits
;
3815 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
3817 typedef struct _NPAGED_LOOKASIDE_LIST
{
3818 GENERAL_LOOKASIDE L
;
3819 KSPIN_LOCK Obsoleted
;
3820 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
3822 typedef struct _PAGED_LOOKASIDE_LIST
{
3823 GENERAL_LOOKASIDE L
;
3824 FAST_MUTEX Obsoleted
;
3825 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
3827 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
3830 (DDKAPI
*PCALLBACK_FUNCTION
)(
3831 IN PVOID CallbackContext
,
3833 IN PVOID Argument2
);
3835 typedef enum _EVENT_TYPE
{
3837 SynchronizationEvent
3840 typedef enum _KWAIT_REASON
{
3878 typedef struct _KWAIT_BLOCK
{
3879 LIST_ENTRY WaitListEntry
;
3880 struct _KTHREAD
* RESTRICTED_POINTER Thread
;
3882 struct _KWAIT_BLOCK
* RESTRICTED_POINTER NextWaitBlock
;
3885 } KWAIT_BLOCK
, *PKWAIT_BLOCK
, *RESTRICTED_POINTER PRKWAIT_BLOCK
;
3887 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
3889 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
3891 BOOLEAN Reserved
[3];
3894 } IO_REMOVE_LOCK_COMMON_BLOCK
;
3896 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
3899 LONGLONG MaxLockedTicks
;
3901 LIST_ENTRY LockList
;
3903 LONG LowMemoryCount
;
3906 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
3907 } IO_REMOVE_LOCK_DBG_BLOCK
;
3909 typedef struct _IO_REMOVE_LOCK
{
3910 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
3912 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
3914 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
3916 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
3919 (DDKAPI
*PIO_WORKITEM_ROUTINE
)(
3920 IN PDEVICE_OBJECT DeviceObject
,
3923 typedef struct _SHARE_ACCESS
{
3931 } SHARE_ACCESS
, *PSHARE_ACCESS
;
3933 typedef enum _KINTERRUPT_MODE
{
3939 (DDKAPI
*PKINTERRUPT_ROUTINE
)(
3942 typedef enum _KPROFILE_SOURCE
{
3944 ProfileAlignmentFixup
,
3947 ProfileLoadInstructions
,
3948 ProfilePipelineFrozen
,
3949 ProfileBranchInstructions
,
3950 ProfileTotalNonissues
,
3951 ProfileDcacheMisses
,
3952 ProfileIcacheMisses
,
3954 ProfileBranchMispredictions
,
3955 ProfileStoreInstructions
,
3956 ProfileFpInstructions
,
3957 ProfileIntegerInstructions
,
3961 ProfileSpecialInstructions
,
3963 ProfileIcacheIssues
,
3964 ProfileDcacheAccesses
,
3965 ProfileMemoryBarrierCycles
,
3966 ProfileLoadLinkedIssues
,
3970 typedef enum _CREATE_FILE_TYPE
{
3972 CreateFileTypeNamedPipe
,
3973 CreateFileTypeMailslot
3976 typedef struct _CONFIGURATION_INFORMATION
{
3981 ULONG ScsiPortCount
;
3983 ULONG ParallelCount
;
3984 BOOLEAN AtDiskPrimaryAddressClaimed
;
3985 BOOLEAN AtDiskSecondaryAddressClaimed
;
3987 ULONG MediumChangerCount
;
3988 } CONFIGURATION_INFORMATION
, *PCONFIGURATION_INFORMATION
;
3990 typedef enum _CONFIGURATION_TYPE
{
3993 FloatingPointProcessor
,
4003 MultiFunctionAdapter
,
4017 FloppyDiskPeripheral
,
4030 RealModeIrqRoutingTable
,
4032 } CONFIGURATION_TYPE
, *PCONFIGURATION_TYPE
;
4034 #define IO_FORCE_ACCESS_CHECK 0x001
4035 #define IO_NO_PARAMETER_CHECKING 0x100
4038 (DDKAPI
*PIO_QUERY_DEVICE_ROUTINE
)(
4040 IN PUNICODE_STRING PathName
,
4041 IN INTERFACE_TYPE BusType
,
4043 IN PKEY_VALUE_FULL_INFORMATION
*BusInformation
,
4044 IN CONFIGURATION_TYPE ControllerType
,
4045 IN ULONG ControllerNumber
,
4046 IN PKEY_VALUE_FULL_INFORMATION
*ControllerInformation
,
4047 IN CONFIGURATION_TYPE PeripheralType
,
4048 IN ULONG PeripheralNumber
,
4049 IN PKEY_VALUE_FULL_INFORMATION
*PeripheralInformation
);
4051 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT
{
4052 IoQueryDeviceIdentifier
= 0,
4053 IoQueryDeviceConfigurationData
,
4054 IoQueryDeviceComponentInformation
,
4055 IoQueryDeviceMaxData
4056 } IO_QUERY_DEVICE_DATA_FORMAT
, *PIO_QUERY_DEVICE_DATA_FORMAT
;
4058 typedef enum _WORK_QUEUE_TYPE
{
4061 HyperCriticalWorkQueue
,
4066 (DDKAPI
*PWORKER_THREAD_ROUTINE
)(
4067 IN PVOID Parameter
);
4069 typedef struct _WORK_QUEUE_ITEM
{
4071 PWORKER_THREAD_ROUTINE WorkerRoutine
;
4073 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
4075 typedef enum _KBUGCHECK_CALLBACK_REASON
{
4077 KbCallbackReserved1
,
4078 KbCallbackSecondaryDumpData
,
4080 } KBUGCHECK_CALLBACK_REASON
;
4083 (DDKAPI
*PKBUGCHECK_REASON_CALLBACK_ROUTINE
)(
4084 IN KBUGCHECK_CALLBACK_REASON Reason
,
4085 IN
struct _KBUGCHECK_REASON_CALLBACK_RECORD
*Record
,
4086 IN OUT PVOID ReasonSpecificData
,
4087 IN ULONG ReasonSpecificDataLength
);
4089 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD
{
4091 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine
;
4094 KBUGCHECK_CALLBACK_REASON Reason
;
4096 } KBUGCHECK_REASON_CALLBACK_RECORD
, *PKBUGCHECK_REASON_CALLBACK_RECORD
;
4098 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE
{
4104 } KBUGCHECK_BUFFER_DUMP_STATE
;
4107 (DDKAPI
*PKBUGCHECK_CALLBACK_ROUTINE
)(
4111 typedef struct _KBUGCHECK_CALLBACK_RECORD
{
4113 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
;
4119 } KBUGCHECK_CALLBACK_RECORD
, *PKBUGCHECK_CALLBACK_RECORD
;
4123 * KeInitializeCallbackRecord(
4124 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
4126 #define KeInitializeCallbackRecord(CallbackRecord) \
4127 CallbackRecord->State = BufferEmpty;
4129 typedef enum _KDPC_IMPORTANCE
{
4135 typedef enum _MEMORY_CACHING_TYPE_ORIG
{
4136 MmFrameBufferCached
= 2
4137 } MEMORY_CACHING_TYPE_ORIG
;
4139 typedef enum _MEMORY_CACHING_TYPE
{
4140 MmNonCached
= FALSE
,
4142 MmWriteCombined
= MmFrameBufferCached
,
4143 MmHardwareCoherentCached
,
4144 MmNonCachedUnordered
,
4147 } MEMORY_CACHING_TYPE
;
4149 typedef enum _MM_PAGE_PRIORITY
{
4151 NormalPagePriority
= 16,
4152 HighPagePriority
= 32
4155 typedef enum _LOCK_OPERATION
{
4161 typedef enum _MM_SYSTEM_SIZE
{
4167 typedef struct _OBJECT_HANDLE_INFORMATION
{
4168 ULONG HandleAttributes
;
4169 ACCESS_MASK GrantedAccess
;
4170 } OBJECT_HANDLE_INFORMATION
, *POBJECT_HANDLE_INFORMATION
;
4172 typedef struct _CLIENT_ID
{
4173 HANDLE UniqueProcess
;
4174 HANDLE UniqueThread
;
4175 } CLIENT_ID
, *PCLIENT_ID
;
4178 (DDKAPI
*PKSTART_ROUTINE
)(
4179 IN PVOID StartContext
);
4182 (DDKAPI
*PCREATE_PROCESS_NOTIFY_ROUTINE
)(
4184 IN HANDLE ProcessId
,
4188 (DDKAPI
*PCREATE_THREAD_NOTIFY_ROUTINE
)(
4189 IN HANDLE ProcessId
,
4193 typedef struct _IMAGE_INFO
{
4194 _ANONYMOUS_UNION
union {
4196 _ANONYMOUS_STRUCT
struct {
4197 ULONG ImageAddressingMode
: 8;
4198 ULONG SystemModeImage
: 1;
4199 ULONG ImageMappedToAllPids
: 1;
4200 ULONG Reserved
: 22;
4204 ULONG ImageSelector
;
4206 ULONG ImageSectionNumber
;
4207 } IMAGE_INFO
, *PIMAGE_INFO
;
4209 #define IMAGE_ADDRESSING_MODE_32BIT 3
4212 (DDKAPI
*PLOAD_IMAGE_NOTIFY_ROUTINE
)(
4213 IN PUNICODE_STRING FullImageName
,
4214 IN HANDLE ProcessId
,
4215 IN PIMAGE_INFO ImageInfo
);
4217 typedef enum _PROCESSINFOCLASS
{
4218 ProcessBasicInformation
,
4223 ProcessBasePriority
,
4224 ProcessRaisePriority
,
4226 ProcessExceptionPort
,
4228 ProcessLdtInformation
,
4230 ProcessDefaultHardErrorMode
,
4231 ProcessIoPortHandlers
,
4232 ProcessPooledUsageAndLimits
,
4233 ProcessWorkingSetWatch
,
4234 ProcessUserModeIOPL
,
4235 ProcessEnableAlignmentFaultFixup
,
4236 ProcessPriorityClass
,
4237 ProcessWx86Information
,
4239 ProcessAffinityMask
,
4240 ProcessPriorityBoost
,
4242 ProcessSessionInformation
,
4243 ProcessForegroundInformation
,
4244 ProcessWow64Information
,
4245 ProcessImageFileName
,
4246 ProcessLUIDDeviceMapsEnabled
,
4247 ProcessBreakOnTermination
,
4248 ProcessDebugObjectHandle
,
4250 ProcessHandleTracing
,
4258 typedef enum _THREADINFOCLASS
{
4259 ThreadBasicInformation
,
4264 ThreadImpersonationToken
,
4265 ThreadDescriptorTableEntry
,
4266 ThreadEnableAlignmentFaultFixup
,
4267 ThreadEventPair_Reusable
,
4268 ThreadQuerySetWin32StartAddress
,
4270 ThreadPerformanceCount
,
4271 ThreadAmILastThread
,
4272 ThreadIdealProcessor
,
4273 ThreadPriorityBoost
,
4274 ThreadSetTlsArrayAddress
,
4276 ThreadHideFromDebugger
,
4277 ThreadBreakOnTermination
,
4281 #define ES_SYSTEM_REQUIRED 0x00000001
4282 #define ES_DISPLAY_REQUIRED 0x00000002
4283 #define ES_USER_PRESENT 0x00000004
4284 #define ES_CONTINUOUS 0x80000000
4286 typedef ULONG EXECUTION_STATE
;
4289 (DDKAPI
*PREQUEST_POWER_COMPLETE
)(
4290 IN PDEVICE_OBJECT DeviceObject
,
4291 IN UCHAR MinorFunction
,
4292 IN POWER_STATE PowerState
,
4294 IN PIO_STATUS_BLOCK IoStatus
);
4296 typedef enum _TRACE_INFORMATION_CLASS
{
4299 TraceEnableFlagsClass
,
4300 TraceEnableLevelClass
,
4301 GlobalLoggerHandleClass
,
4302 EventLoggerHandleClass
,
4303 AllLoggerHandlesClass
,
4304 TraceHandleByNameClass
4305 } TRACE_INFORMATION_CLASS
;
4308 (DDKAPI
*PEX_CALLBACK_FUNCTION
)(
4309 IN PVOID CallbackContext
,
4311 IN PVOID Argument2
);
4316 ** Storage structures
4318 typedef enum _PARTITION_STYLE
{
4319 PARTITION_STYLE_MBR
,
4323 typedef struct _CREATE_DISK_MBR
{
4325 } CREATE_DISK_MBR
, *PCREATE_DISK_MBR
;
4327 typedef struct _CREATE_DISK_GPT
{
4329 ULONG MaxPartitionCount
;
4330 } CREATE_DISK_GPT
, *PCREATE_DISK_GPT
;
4332 typedef struct _CREATE_DISK
{
4333 PARTITION_STYLE PartitionStyle
;
4334 _ANONYMOUS_UNION
union {
4335 CREATE_DISK_MBR Mbr
;
4336 CREATE_DISK_GPT Gpt
;
4338 } CREATE_DISK
, *PCREATE_DISK
;
4340 typedef struct _DISK_SIGNATURE
{
4341 ULONG PartitionStyle
;
4342 _ANONYMOUS_UNION
union {
4351 } DISK_SIGNATURE
, *PDISK_SIGNATURE
;
4354 (DDKFASTAPI
*PTIME_UPDATE_NOTIFY_ROUTINE
)(
4356 IN KPROCESSOR_MODE Mode
);
4358 #define DBG_STATUS_CONTROL_C 1
4359 #define DBG_STATUS_SYSRQ 2
4360 #define DBG_STATUS_BUGCHECK_FIRST 3
4361 #define DBG_STATUS_BUGCHECK_SECOND 4
4362 #define DBG_STATUS_FATAL 5
4363 #define DBG_STATUS_DEBUG_CONTROL 6
4364 #define DBG_STATUS_WORKER 7
4366 typedef struct _PHYSICAL_MEMORY_RANGE
{
4367 PHYSICAL_ADDRESS BaseAddress
;
4368 LARGE_INTEGER NumberOfBytes
;
4369 } PHYSICAL_MEMORY_RANGE
, *PPHYSICAL_MEMORY_RANGE
;
4372 (*PDRIVER_VERIFIER_THUNK_ROUTINE
)(
4375 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS
{
4376 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine
;
4377 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine
;
4378 } DRIVER_VERIFIER_THUNK_PAIRS
, *PDRIVER_VERIFIER_THUNK_PAIRS
;
4380 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
4381 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
4382 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
4383 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
4384 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
4386 #define HASH_STRING_ALGORITHM_DEFAULT 0
4387 #define HASH_STRING_ALGORITHM_X65599 1
4388 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
4390 typedef enum _SUITE_TYPE
{
4394 CommunicationServer
,
4396 SmallBusinessRestricted
,
4406 (DDKAPI
*PTIMER_APC_ROUTINE
)(
4407 IN PVOID TimerContext
,
4408 IN ULONG TimerLowValue
,
4409 IN LONG TimerHighValue
);
4418 (DDKAPI
*WMI_NOTIFICATION_CALLBACK
)(
4424 ** Architecture specific structures
4429 typedef ULONG PFN_NUMBER
, *PPFN_NUMBER
;
4431 #define PASSIVE_LEVEL 0
4434 #define DISPATCH_LEVEL 2
4435 #define PROFILE_LEVEL 27
4436 #define CLOCK1_LEVEL 28
4437 #define CLOCK2_LEVEL 28
4438 #define IPI_LEVEL 29
4439 #define SYNCH_LEVEL (IPI_LEVEL-1)
4440 #define POWER_LEVEL 30
4441 #define HIGH_LEVEL 31
4443 typedef struct _KPCR_TIB
{
4444 PVOID ExceptionList
; /* 00 */
4445 PVOID StackBase
; /* 04 */
4446 PVOID StackLimit
; /* 08 */
4447 PVOID SubSystemTib
; /* 0C */
4448 _ANONYMOUS_UNION
union {
4449 PVOID FiberData
; /* 10 */
4450 DWORD Version
; /* 10 */
4452 PVOID ArbitraryUserPointer
; /* 14 */
4453 struct _KPCR_TIB
*Self
; /* 18 */
4454 } KPCR_TIB
, *PKPCR_TIB
; /* 1C */
4456 #define PCR_MINOR_VERSION 1
4457 #define PCR_MAJOR_VERSION 1
4459 typedef struct _KPCR
{
4460 KPCR_TIB Tib
; /* 00 */
4461 struct _KPCR
*Self
; /* 1C */
4462 struct _KPRCB
*Prcb
; /* 20 */
4463 KIRQL Irql
; /* 24 */
4465 ULONG IrrActive
; /* 2C */
4467 PVOID KdVersionBlock
; /* 34 */
4468 PUSHORT IDT
; /* 38 */
4469 PUSHORT GDT
; /* 3C */
4470 struct _KTSS
*TSS
; /* 40 */
4471 USHORT MajorVersion
; /* 44 */
4472 USHORT MinorVersion
; /* 46 */
4473 KAFFINITY SetMember
; /* 48 */
4474 ULONG StallScaleFactor
; /* 4C */
4475 UCHAR SpareUnused
; /* 50 */
4476 UCHAR Number
; /* 51 */
4477 } KPCR
, *PKPCR
; /* 54 */
4479 typedef struct _KFLOATING_SAVE
{
4483 ULONG ErrorSelector
;
4488 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
4490 #define PAGE_SIZE 0x1000
4491 #define PAGE_SHIFT 12L
4493 extern NTOSAPI PVOID MmHighestUserAddress
;
4494 extern NTOSAPI PVOID MmSystemRangeStart
;
4495 extern NTOSAPI ULONG_PTR MmUserProbeAddress
;
4497 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
4498 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
4499 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
4500 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
4501 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
4503 #define KI_USER_SHARED_DATA 0xffdf0000
4504 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
4506 #define EFLAG_SIGN 0x8000
4507 #define EFLAG_ZERO 0x4000
4508 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
4510 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
4511 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
4512 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
4514 typedef enum _INTERLOCKED_RESULT
{
4515 ResultNegative
= RESULT_NEGATIVE
,
4516 ResultZero
= RESULT_ZERO
,
4517 ResultPositive
= RESULT_POSITIVE
4518 } INTERLOCKED_RESULT
;
4528 * KeGetCurrentProcessorNumber(
4531 #define KeGetCurrentProcessorNumber() \
4532 ((ULONG)KeGetCurrentKPCR()->Number)
4534 #if !defined(__INTERLOCKED_DECLARED)
4535 #define __INTERLOCKED_DECLARED
4540 InterlockedIncrement(
4541 IN PLONG VOLATILE Addend
);
4546 InterlockedDecrement(
4547 IN PLONG VOLATILE Addend
);
4552 InterlockedCompareExchange(
4553 IN OUT PLONG VOLATILE Destination
,
4560 InterlockedExchange(
4561 IN OUT PLONG VOLATILE Target
,
4567 InterlockedExchangeAdd(
4568 IN OUT PLONG VOLATILE Addend
,
4573 * InterlockedExchangePointer(
4574 * IN OUT PVOID VOLATILE *Target,
4577 #define InterlockedExchangePointer(Target, Value) \
4578 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
4582 * InterlockedCompareExchangePointer(
4583 * IN OUT PVOID *Destination,
4584 * IN PVOID Exchange,
4585 * IN PVOID Comparand)
4587 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
4588 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
4590 #endif /* !__INTERLOCKED_DECLARED */
4595 KefAcquireSpinLockAtDpcLevel(
4596 IN PKSPIN_LOCK SpinLock
);
4601 KefReleaseSpinLockFromDpcLevel(
4602 IN PKSPIN_LOCK SpinLock
);
4608 IN PKSPIN_LOCK SpinLock
);
4614 IN PKSPIN_LOCK SpinLock
,
4617 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
4618 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
4619 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
4620 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
4622 #define RtlCopyMemoryNonTemporal RtlCopyMemory
4624 #define KeGetDcacheFillSize() 1L
4631 ** Utillity functions
4634 #define ARGUMENT_PRESENT(ArgumentPointer) \
4635 ((BOOLEAN) ((PVOID)ArgumentPointer != (PVOID)NULL))
4642 #define BYTE_OFFSET(Va) \
4643 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
4650 #define BYTES_TO_PAGES(Size) \
4651 ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0))
4655 * CONTAINING_RECORD(
4660 #ifndef CONTAINING_RECORD
4661 #define CONTAINING_RECORD(Address, Type, Field) \
4662 ((Type *) (((ULONG_PTR) Address) - FIELD_OFFSET(Type, Field)))
4670 #ifndef FIELD_OFFSET
4671 #define FIELD_OFFSET(Type, Field) \
4672 ((LONG) (&(((Type *) 0)->Field)))
4680 #define PAGE_ALIGN(Va) \
4681 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
4686 * IN ULONG_PTR Size)
4688 #define ROUND_TO_PAGES(Size) \
4689 ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)))
4695 IN PVOID FailedAssertion
,
4697 IN ULONG LineNumber
,
4702 #define ASSERT(exp) \
4704 RtlAssert( #exp, __FILE__, __LINE__, NULL ), FALSE : TRUE)
4706 #define ASSERTMSG(msg, exp) \
4708 RtlAssert( #exp, __FILE__, __LINE__, msg ), FALSE : TRUE)
4710 #define RTL_SOFT_ASSERT(exp) \
4711 (VOID)((!(_exp)) ? \
4712 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
4714 #define RTL_SOFT_ASSERTMSG(msg, exp) \
4716 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
4718 #define RTL_VERIFY(exp) ASSERT(exp)
4719 #define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp)
4721 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
4722 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
4726 #define ASSERT(exp) ((VOID) 0)
4727 #define ASSERTMSG(msg, exp) ((VOID) 0)
4729 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
4730 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
4732 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
4733 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4735 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
4736 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
4742 ** Driver support routines
4745 /** Runtime library routines **/
4747 static __inline VOID
4749 IN PLIST_ENTRY ListHead
)
4751 ListHead
->Flink
= ListHead
->Blink
= ListHead
;
4754 static __inline VOID
4756 IN PLIST_ENTRY ListHead
,
4757 IN PLIST_ENTRY Entry
)
4759 PLIST_ENTRY OldFlink
;
4760 OldFlink
= ListHead
->Flink
;
4761 Entry
->Flink
= OldFlink
;
4762 Entry
->Blink
= ListHead
;
4763 OldFlink
->Blink
= Entry
;
4764 ListHead
->Flink
= Entry
;
4767 static __inline VOID
4769 IN PLIST_ENTRY ListHead
,
4770 IN PLIST_ENTRY Entry
)
4772 PLIST_ENTRY OldBlink
;
4773 OldBlink
= ListHead
->Blink
;
4774 Entry
->Flink
= ListHead
;
4775 Entry
->Blink
= OldBlink
;
4776 OldBlink
->Flink
= Entry
;
4777 ListHead
->Blink
= Entry
;
4783 * IN PLIST_ENTRY ListHead)
4785 #define IsListEmpty(_ListHead) \
4786 ((_ListHead)->Flink == (_ListHead))
4789 * PSINGLE_LIST_ENTRY
4791 * IN PSINGLE_LIST_ENTRY ListHead)
4793 #define PopEntryList(ListHead) \
4796 PSINGLE_LIST_ENTRY _FirstEntry; \
4797 _FirstEntry = (ListHead)->Next; \
4798 if (_FirstEntry != NULL) \
4799 (ListHead)->Next = _FirstEntry->Next; \
4805 * IN PSINGLE_LIST_ENTRY ListHead,
4806 * IN PSINGLE_LIST_ENTRY Entry)
4808 #define PushEntryList(_ListHead, _Entry) \
4809 (_Entry)->Next = (_ListHead)->Next; \
4810 (_ListHead)->Next = (_Entry); \
4812 static __inline BOOLEAN
4814 IN PLIST_ENTRY Entry
)
4816 PLIST_ENTRY OldFlink
;
4817 PLIST_ENTRY OldBlink
;
4819 OldFlink
= Entry
->Flink
;
4820 OldBlink
= Entry
->Blink
;
4821 OldFlink
->Blink
= OldBlink
;
4822 OldBlink
->Flink
= OldFlink
;
4823 return (OldFlink
== OldBlink
);
4826 static __inline PLIST_ENTRY
4828 IN PLIST_ENTRY ListHead
)
4833 Entry
= ListHead
->Flink
;
4834 Flink
= Entry
->Flink
;
4835 ListHead
->Flink
= Flink
;
4836 Flink
->Blink
= ListHead
;
4840 static __inline PLIST_ENTRY
4842 IN PLIST_ENTRY ListHead
)
4847 Entry
= ListHead
->Blink
;
4848 Blink
= Entry
->Blink
;
4849 ListHead
->Blink
= Blink
;
4850 Blink
->Flink
= ListHead
;
4854 #if !defined(_WINBASE_H) || _WIN32_WINNT < 0x0501
4859 InterlockedPopEntrySList(
4860 IN PSLIST_HEADER ListHead
);
4865 InterlockedPushEntrySList(
4866 IN PSLIST_HEADER ListHead
,
4867 IN PSLIST_ENTRY ListEntry
);
4874 * IN PSLIST_HEADER SListHead)
4876 #define QueryDepthSList(_SListHead) \
4877 ((USHORT) ((_SListHead)->Alignment & 0xffff))
4879 #define InterlockedFlushSList(ListHead) ExInterlockedFlushSList(ListHead)
4884 RtlAnsiStringToUnicodeSize(
4885 IN PANSI_STRING AnsiString
);
4890 RtlAnsiStringToUnicodeString(
4891 IN OUT PUNICODE_STRING DestinationString
,
4892 IN PANSI_STRING SourceString
,
4893 IN BOOLEAN AllocateDestinationString
);
4898 RtlAppendUnicodeStringToString(
4899 IN OUT PUNICODE_STRING Destination
,
4900 IN PUNICODE_STRING Source
);
4905 RtlAppendUnicodeToString(
4906 IN OUT PUNICODE_STRING Destination
,
4913 IN PRTL_BITMAP BitMapHeader
,
4914 IN ULONG StartingIndex
,
4921 IN PRTL_BITMAP BitMapHeader
,
4922 IN ULONG StartingIndex
,
4930 IN ULONG Base OPTIONAL
,
4931 IN OUT PULONG Value
);
4937 IN PRTL_BITMAP BitMapHeader
,
4938 IN ULONG BitPosition
);
4943 RtlCheckRegistryKey(
4944 IN ULONG RelativeTo
,
4951 IN PRTL_BITMAP BitMapHeader
);
4957 PRTL_BITMAP BitMapHeader
,
4964 IN PRTL_BITMAP BitMapHeader
,
4965 IN ULONG StartingIndex
,
4966 IN ULONG NumberToClear
);
4972 IN CONST VOID
*Source1
,
4973 IN CONST VOID
*Source2
,
4982 BOOLEAN CaseInSensitive
);
4987 RtlCompareUnicodeString(
4988 IN PUNICODE_STRING String1
,
4989 IN PUNICODE_STRING String2
,
4990 IN BOOLEAN CaseInSensitive
);
4995 RtlConvertLongToLargeInteger(
4996 IN LONG SignedInteger
);
5001 RtlConvertLongToLuid(
5007 RtlConvertUlongToLargeInteger(
5008 IN ULONG UnsignedInteger
);
5013 RtlConvertUlongToLuid(
5019 * IN VOID UNALIGNED *Destination,
5020 * IN CONST VOID UNALIGNED *Source,
5023 #ifndef RtlCopyMemory
5024 #define RtlCopyMemory(Destination, Source, Length) \
5025 memcpy(Destination, Source, Length)
5028 #ifndef RtlCopyBytes
5029 #define RtlCopyBytes RtlCopyMemory
5036 IN VOID UNALIGNED
*Destination
,
5037 IN CONST VOID UNALIGNED
*Source
,
5044 IN OUT PSTRING DestinationString
,
5045 IN PSTRING SourceString OPTIONAL
);
5050 RtlCopyUnicodeString(
5051 IN OUT PUNICODE_STRING DestinationString
,
5052 IN PUNICODE_STRING SourceString
);
5057 RtlCreateRegistryKey(
5058 IN ULONG RelativeTo
,
5064 RtlCreateSecurityDescriptor(
5065 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
5071 RtlDeleteRegistryValue(
5072 IN ULONG RelativeTo
,
5074 IN PCWSTR ValueName
);
5082 #define RtlEqualLuid(Luid1, \
5084 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
5089 * IN VOID UNALIGNED *Destination,
5090 * IN CONST VOID UNALIGNED *Source,
5093 #define RtlEqualMemory(Destination, Source, Length) (!memcmp(Destination, Source, Length))
5101 IN BOOLEAN CaseInSensitive
);
5106 RtlEqualUnicodeString(
5107 IN CONST UNICODE_STRING
*String1
,
5108 IN CONST UNICODE_STRING
*String2
,
5109 IN BOOLEAN CaseInSensitive
);
5114 * IN VOID UNALIGNED *Destination,
5118 #ifndef RtlFillMemory
5119 #define RtlFillMemory(Destination, Length, Fill) \
5120 memset(Destination, Fill, Length)
5123 #ifndef RtlFillBytes
5124 #define RtlFillBytes RtlFillMemory
5131 IN PRTL_BITMAP BitMapHeader
,
5132 IN ULONG NumberToFind
,
5133 IN ULONG HintIndex
);
5138 RtlFindClearBitsAndSet(
5139 IN PRTL_BITMAP BitMapHeader
,
5140 IN ULONG NumberToFind
,
5141 IN ULONG HintIndex
);
5147 IN PRTL_BITMAP BitMapHeader
,
5148 OUT PRTL_BITMAP_RUN RunArray
,
5149 IN ULONG SizeOfRunArray
,
5150 IN BOOLEAN LocateLongestRuns
);
5155 RtlFindFirstRunClear(
5156 IN PRTL_BITMAP BitMapHeader
,
5157 OUT PULONG StartingIndex
);
5162 RtlFindLastBackwardRunClear(
5163 IN PRTL_BITMAP BitMapHeader
,
5165 OUT PULONG StartingRunIndex
);
5170 RtlFindLeastSignificantBit(
5176 RtlFindLongestRunClear(
5177 IN PRTL_BITMAP BitMapHeader
,
5178 OUT PULONG StartingIndex
);
5183 RtlFindMostSignificantBit(
5189 RtlFindNextForwardRunClear(
5190 IN PRTL_BITMAP BitMapHeader
,
5192 OUT PULONG StartingRunIndex
);
5198 IN PRTL_BITMAP BitMapHeader
,
5199 IN ULONG NumberToFind
,
5200 IN ULONG HintIndex
);
5205 RtlFindSetBitsAndClear(
5206 IN PRTL_BITMAP BitMapHeader
,
5207 IN ULONG NumberToFind
,
5208 IN ULONG HintIndex
);
5214 IN PANSI_STRING AnsiString
);
5219 RtlFreeUnicodeString(
5220 IN PUNICODE_STRING UnicodeString
);
5225 RtlGetCallersAddress(
5226 OUT PVOID
*CallersAddress
,
5227 OUT PVOID
*CallersCaller
);
5233 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
5239 IN PUNICODE_STRING GuidString
,
5245 RtlHashUnicodeString(
5246 IN CONST UNICODE_STRING
*String
,
5247 IN BOOLEAN CaseInSensitive
,
5248 IN ULONG HashAlgorithm
,
5249 OUT PULONG HashValue
);
5255 IN OUT PANSI_STRING DestinationString
,
5256 IN PCSZ SourceString
);
5261 RtlInitializeBitMap(
5262 IN PRTL_BITMAP BitMapHeader
,
5263 IN PULONG BitMapBuffer
,
5264 IN ULONG SizeOfBitMap
);
5270 IN OUT PSTRING DestinationString
,
5271 IN PCSZ SourceString
);
5276 RtlInitUnicodeString(
5277 IN OUT PUNICODE_STRING DestinationString
,
5278 IN PCWSTR SourceString
);
5283 RtlInt64ToUnicodeString(
5285 IN ULONG Base OPTIONAL
,
5286 IN OUT PUNICODE_STRING String
);
5291 RtlIntegerToUnicodeString(
5293 IN ULONG Base OPTIONAL
,
5294 IN OUT PUNICODE_STRING String
);
5299 RtlIntPtrToUnicodeString(
5301 ULONG Base OPTIONAL
,
5302 PUNICODE_STRING String
);
5309 #define RtlIsZeroLuid(_L1) \
5310 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
5315 RtlLengthSecurityDescriptor(
5316 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
5322 IN OUT PACCESS_MASK AccessMask
,
5323 IN PGENERIC_MAPPING GenericMapping
);
5328 * IN VOID UNALIGNED *Destination,
5329 * IN CONST VOID UNALIGNED *Source,
5332 #define RtlMoveMemory memmove
5337 RtlNumberOfClearBits(
5338 IN PRTL_BITMAP BitMapHeader
);
5344 IN PRTL_BITMAP BitMapHeader
);
5349 RtlPrefetchMemoryNonTemporal(
5356 RtlPrefixUnicodeString(
5357 IN PUNICODE_STRING String1
,
5358 IN PUNICODE_STRING String2
,
5359 IN BOOLEAN CaseInSensitive
);
5364 RtlQueryRegistryValues(
5365 IN ULONG RelativeTo
,
5367 IN PRTL_QUERY_REGISTRY_TABLE QueryTable
,
5369 IN PVOID Environment OPTIONAL
);
5375 IN OUT PULONG DestinationAddress
,
5376 IN PULONG SourceAddress
);
5382 IN OUT PUSHORT DestinationAddress
,
5383 IN PUSHORT SourceAddress
);
5389 IN PRTL_BITMAP BitMapHeader
);
5395 PRTL_BITMAP BitMapHeader
,
5402 IN PRTL_BITMAP BitMapHeader
,
5403 IN ULONG StartingIndex
,
5404 IN ULONG NumberToSet
);
5409 RtlSetDaclSecurityDescriptor(
5410 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
5411 IN BOOLEAN DaclPresent
,
5412 IN PACL Dacl OPTIONAL
,
5413 IN BOOLEAN DaclDefaulted OPTIONAL
);
5426 IN OUT PULONGLONG Address
,
5433 IN OUT PULONG_PTR Address
,
5434 IN ULONG_PTR Value
);
5448 OUT PUNICODE_STRING GuidString
);
5454 IN PRTL_BITMAP BitMapHeader
,
5455 IN ULONG BitNumber
);
5460 RtlTimeFieldsToTime(
5461 IN PTIME_FIELDS TimeFields
,
5462 IN PLARGE_INTEGER Time
);
5467 RtlTimeToTimeFields(
5468 IN PLARGE_INTEGER Time
,
5469 IN PTIME_FIELDS TimeFields
);
5480 RtlUlonglongByteSwap(
5481 IN ULONGLONG Source
);
5486 RtlUnicodeStringToAnsiSize(
5487 IN PUNICODE_STRING UnicodeString
);
5492 RtlUnicodeStringToAnsiString(
5493 IN OUT PANSI_STRING DestinationString
,
5494 IN PUNICODE_STRING SourceString
,
5495 IN BOOLEAN AllocateDestinationString
);
5500 RtlUnicodeStringToInteger(
5501 IN PUNICODE_STRING String
,
5502 IN ULONG Base OPTIONAL
,
5508 RtlUpcaseUnicodeChar(
5509 IN WCHAR SourceCharacter
);
5514 RtlUpcaseUnicodeString(
5515 IN OUT PUNICODE_STRING DestinationString OPTIONAL
,
5516 IN PCUNICODE_STRING SourceString
,
5517 IN BOOLEAN AllocateDestinationString
);
5529 IN OUT PSTRING DestinationString
,
5530 IN PSTRING SourceString
);
5541 RtlValidRelativeSecurityDescriptor(
5542 IN PSECURITY_DESCRIPTOR_RELATIVE SecurityDescriptorInput
,
5543 IN ULONG SecurityDescriptorLength
,
5544 IN SECURITY_INFORMATION RequiredInformation
);
5549 RtlValidSecurityDescriptor(
5550 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
5555 RtlVerifyVersionInfo(
5556 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
5558 IN ULONGLONG ConditionMask
);
5563 RtlVolumeDeviceToDosName(
5564 IN PVOID VolumeDeviceObject
,
5565 OUT PUNICODE_STRING DosName
);
5578 RtlWriteRegistryValue(
5579 IN ULONG RelativeTo
,
5581 IN PCWSTR ValueName
,
5584 IN ULONG ValueLength
);
5589 RtlxUnicodeStringToAnsiSize(
5590 IN PUNICODE_STRING UnicodeString
);
5595 * IN VOID UNALIGNED *Destination,
5598 #ifndef RtlZeroMemory
5599 #define RtlZeroMemory(Destination, Length) \
5600 memset(Destination, 0, Length)
5603 #ifndef RtlZeroBytes
5604 #define RtlZeroBytes RtlZeroMemory
5608 /* Guarded Mutex routines */
5612 KeAcquireGuardedMutex(
5613 PKGUARDED_MUTEX GuardedMutex
5618 KeAcquireGuardedMutexUnsafe(
5619 PKGUARDED_MUTEX GuardedMutex
5624 KeEnterGuardedRegion(VOID
);
5628 KeLeaveGuardedRegion(VOID
);
5632 KeInitializeGuardedMutex(
5633 PKGUARDED_MUTEX GuardedMutex
5638 KeReleaseGuardedMutexUnsafe(
5639 PKGUARDED_MUTEX GuardedMutex
5644 KeReleaseGuardedMutex(
5645 PKGUARDED_MUTEX GuardedMutex
5650 KeTryToAcquireGuardedMutex(
5651 PKGUARDED_MUTEX GuardedMutex
5654 /** Executive support routines **/
5664 IN PFAST_MUTEX FastMutex
);
5669 ExAcquireFastMutexUnsafe(
5670 IN PFAST_MUTEX FastMutex
);
5675 ExAcquireResourceExclusiveLite(
5676 IN PERESOURCE Resource
,
5682 ExAcquireResourceSharedLite(
5683 IN PERESOURCE Resource
,
5689 ExAcquireSharedStarveExclusive(
5690 IN PERESOURCE Resource
,
5696 ExAcquireSharedWaitForExclusive(
5697 IN PERESOURCE Resource
,
5700 static __inline PVOID
5701 ExAllocateFromNPagedLookasideList(
5702 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
5706 Lookaside
->L
.TotalAllocates
++;
5707 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
5708 if (Entry
== NULL
) {
5709 Lookaside
->L
.AllocateMisses
++;
5710 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
, Lookaside
->L
.Size
, Lookaside
->L
.Tag
);
5715 static __inline PVOID
5716 ExAllocateFromPagedLookasideList(
5717 IN PPAGED_LOOKASIDE_LIST Lookaside
)
5721 Lookaside
->L
.TotalAllocates
++;
5722 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
5723 if (Entry
== NULL
) {
5724 Lookaside
->L
.AllocateMisses
++;
5725 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
, Lookaside
->L
.Size
, Lookaside
->L
.Tag
);
5733 ExAllocatePoolWithQuotaTag(
5734 IN POOL_TYPE PoolType
,
5735 IN SIZE_T NumberOfBytes
,
5741 ExAllocatePoolWithTag(
5742 IN POOL_TYPE PoolType
,
5743 IN SIZE_T NumberOfBytes
,
5748 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
5749 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
5751 #else /* !POOL_TAGGING */
5757 IN POOL_TYPE PoolType
,
5758 IN SIZE_T NumberOfBytes
);
5763 ExAllocatePoolWithQuota(
5764 IN POOL_TYPE PoolType
,
5765 IN SIZE_T NumberOfBytes
);
5767 #endif /* POOL_TAGGING */
5772 ExAllocatePoolWithTagPriority(
5773 IN POOL_TYPE PoolType
,
5774 IN SIZE_T NumberOfBytes
,
5776 IN EX_POOL_PRIORITY Priority
);
5781 ExConvertExclusiveToSharedLite(
5782 IN PERESOURCE Resource
);
5788 OUT PCALLBACK_OBJECT
*CallbackObject
,
5789 IN POBJECT_ATTRIBUTES ObjectAttributes
,
5791 IN BOOLEAN AllowMultipleCallbacks
);
5796 ExDeleteNPagedLookasideList(
5797 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
5802 ExDeletePagedLookasideList(
5803 IN PPAGED_LOOKASIDE_LIST Lookaside
);
5808 ExDeleteResourceLite(
5809 IN PERESOURCE Resource
);
5817 #define PROTECTED_POOL 0x80000000
5820 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
5830 #define ExQueryDepthSList(ListHead) QueryDepthSList(ListHead)
5832 static __inline VOID
5833 ExFreeToNPagedLookasideList(
5834 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
5837 Lookaside
->L
.TotalFrees
++;
5838 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
5839 Lookaside
->L
.FreeMisses
++;
5840 (Lookaside
->L
.Free
)(Entry
);
5842 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
5846 static __inline VOID
5847 ExFreeToPagedLookasideList(
5848 IN PPAGED_LOOKASIDE_LIST Lookaside
,
5851 Lookaside
->L
.TotalFrees
++;
5852 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
5853 Lookaside
->L
.FreeMisses
++;
5854 (Lookaside
->L
.Free
)(Entry
);
5856 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
5862 * ExGetCurrentResourceThread(
5865 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD) PsGetCurrentThread())
5870 ExGetExclusiveWaiterCount(
5871 IN PERESOURCE Resource
);
5882 ExGetSharedWaiterCount(
5883 IN PERESOURCE Resource
);
5895 * ExInitializeFastMutex(
5896 * IN PFAST_MUTEX FastMutex)
5898 #define ExInitializeFastMutex(_FastMutex) \
5900 (_FastMutex)->Count = 1; \
5901 (_FastMutex)->Owner = NULL; \
5902 (_FastMutex)->Contention = 0; \
5903 KeInitializeEvent(&(_FastMutex)->Event, SynchronizationEvent, FALSE); \
5909 ExInitializeNPagedLookasideList(
5910 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
5911 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
5912 IN PFREE_FUNCTION Free OPTIONAL
,
5921 ExInitializePagedLookasideList(
5922 IN PPAGED_LOOKASIDE_LIST Lookaside
,
5923 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
5924 IN PFREE_FUNCTION Free OPTIONAL
,
5933 ExInitializeResourceLite(
5934 IN PERESOURCE Resource
);
5938 * InitializeSListHead(
5939 * IN PSLIST_HEADER SListHead)
5941 #define InitializeSListHead(_SListHead) \
5942 (_SListHead)->Alignment = 0
5944 #define ExInitializeSListHead InitializeSListHead
5949 ExInterlockedAddLargeInteger(
5950 IN PLARGE_INTEGER Addend
,
5951 IN LARGE_INTEGER Increment
,
5952 IN PKSPIN_LOCK Lock
);
5957 ExInterlockedAddLargeStatistic(
5958 IN PLARGE_INTEGER Addend
,
5959 IN ULONG Increment
);
5964 ExInterlockedAddUlong(
5972 ExInterlockedCompareExchange64(
5973 IN OUT PLONGLONG Destination
,
5974 IN PLONGLONG Exchange
,
5975 IN PLONGLONG Comparand
,
5976 IN PKSPIN_LOCK Lock
);
5981 ExfInterlockedCompareExchange64(
5982 IN OUT LONGLONG
volatile *Destination
,
5983 IN PLONGLONG Exchange
,
5984 IN PLONGLONG Comperand
);
5989 ExInterlockedFlushSList(
5990 IN PSLIST_HEADER ListHead
);
5995 ExInterlockedInsertHeadList(
5996 IN PLIST_ENTRY ListHead
,
5997 IN PLIST_ENTRY ListEntry
,
5998 IN PKSPIN_LOCK Lock
);
6003 ExInterlockedInsertTailList(
6004 IN PLIST_ENTRY ListHead
,
6005 IN PLIST_ENTRY ListEntry
,
6006 IN PKSPIN_LOCK Lock
);
6011 ExInterlockedPopEntryList(
6012 IN PSINGLE_LIST_ENTRY ListHead
,
6013 IN PKSPIN_LOCK Lock
);
6016 * PSINGLE_LIST_ENTRY
6017 * ExInterlockedPopEntrySList(
6018 * IN PSLIST_HEADER ListHead,
6019 * IN PKSPIN_LOCK Lock)
6021 #define ExInterlockedPopEntrySList(_ListHead, \
6023 InterlockedPopEntrySList(_ListHead)
6028 ExInterlockedPushEntryList(
6029 IN PSINGLE_LIST_ENTRY ListHead
,
6030 IN PSINGLE_LIST_ENTRY ListEntry
,
6031 IN PKSPIN_LOCK Lock
);
6034 * PSINGLE_LIST_ENTRY FASTCALL
6035 * ExInterlockedPushEntrySList(
6036 * IN PSLIST_HEADER ListHead,
6037 * IN PSINGLE_LIST_ENTRY ListEntry,
6038 * IN PKSPIN_LOCK Lock)
6040 #define ExInterlockedPushEntrySList(_ListHead, \
6043 InterlockedPushEntrySList(_ListHead, _ListEntry)
6048 ExInterlockedRemoveHeadList(
6049 IN PLIST_ENTRY ListHead
,
6050 IN PKSPIN_LOCK Lock
);
6055 ExIsProcessorFeaturePresent(
6056 IN ULONG ProcessorFeature
);
6061 ExIsResourceAcquiredExclusiveLite(
6062 IN PERESOURCE Resource
);
6067 ExIsResourceAcquiredLite(
6068 IN PERESOURCE Resource
);
6073 ExIsResourceAcquiredSharedLite(
6074 IN PERESOURCE Resource
);
6079 ExLocalTimeToSystemTime(
6080 IN PLARGE_INTEGER LocalTime
,
6081 OUT PLARGE_INTEGER SystemTime
);
6087 IN PCALLBACK_OBJECT CallbackObject
,
6089 IN PVOID Argument2
);
6094 ExRaiseAccessViolation(
6100 ExRaiseDatatypeMisalignment(
6107 IN NTSTATUS Status
);
6113 IN PCALLBACK_OBJECT CallbackObject
,
6114 IN PCALLBACK_FUNCTION CallbackFunction
,
6115 IN PVOID CallbackContext
);
6120 ExReinitializeResourceLite(
6121 IN PERESOURCE Resource
);
6131 IN PFAST_MUTEX FastMutex
);
6136 ExReleaseFastMutexUnsafe(
6137 IN PFAST_MUTEX FastMutex
);
6142 ExReleaseResourceForThreadLite(
6143 IN PERESOURCE Resource
,
6144 IN ERESOURCE_THREAD ResourceThreadId
);
6149 ExReleaseResourceLite(
6150 IN PERESOURCE Resource
);
6155 ExSetResourceOwnerPointer(
6156 IN PERESOURCE Resource
,
6157 IN PVOID OwnerPointer
);
6162 ExSetTimerResolution(
6163 IN ULONG DesiredTime
,
6164 IN BOOLEAN SetResolution
);
6169 ExSystemTimeToLocalTime(
6170 IN PLARGE_INTEGER SystemTime
,
6171 OUT PLARGE_INTEGER LocalTime
);
6180 ExTryToAcquireFastMutex(
6181 IN PFAST_MUTEX FastMutex
);
6186 ExTryToAcquireResourceExclusiveLite(
6187 IN PERESOURCE Resource
);
6192 ExUnregisterCallback(
6193 IN PVOID CbRegistration
);
6205 IN SUITE_TYPE SuiteType
);
6209 #define PAGED_CODE() { \
6210 if (KeGetCurrentIrql() > APC_LEVEL) { \
6211 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
6218 #define PAGED_CODE()
6226 IN CONST VOID
*Address
,
6228 IN ULONG Alignment
);
6234 IN CONST VOID
*Address
,
6236 IN ULONG Alignment
);
6240 /** Configuration manager routines **/
6246 IN PEX_CALLBACK_FUNCTION Function
,
6248 IN OUT PLARGE_INTEGER Cookie
);
6253 CmUnRegisterCallback(
6254 IN LARGE_INTEGER Cookie
);
6258 /** Filesystem runtime library routines **/
6263 FsRtlIsTotalDeviceFailure(
6264 IN NTSTATUS Status
);
6268 /** Hardware abstraction layer routines **/
6274 IN ULONG Frequency
);
6280 IN PDEVICE_OBJECT DeviceObject
,
6281 IN ULONG SectorSize
,
6282 IN ULONG MBRTypeIdentifier
,
6288 READ_PORT_BUFFER_UCHAR(
6296 READ_PORT_BUFFER_ULONG(
6304 READ_PORT_BUFFER_USHORT(
6330 READ_REGISTER_BUFFER_UCHAR(
6338 READ_REGISTER_BUFFER_ULONG(
6346 READ_REGISTER_BUFFER_USHORT(
6347 IN PUSHORT Register
,
6354 READ_REGISTER_UCHAR(
6355 IN PUCHAR Register
);
6360 READ_REGISTER_ULONG(
6361 IN PULONG Register
);
6366 READ_REGISTER_USHORT(
6367 IN PUSHORT Register
);
6372 WRITE_PORT_BUFFER_UCHAR(
6380 WRITE_PORT_BUFFER_ULONG(
6388 WRITE_PORT_BUFFER_USHORT(
6417 WRITE_REGISTER_BUFFER_UCHAR(
6425 WRITE_REGISTER_BUFFER_ULONG(
6433 WRITE_REGISTER_BUFFER_USHORT(
6434 IN PUSHORT Register
,
6441 WRITE_REGISTER_UCHAR(
6448 WRITE_REGISTER_ULONG(
6455 WRITE_REGISTER_USHORT(
6456 IN PUSHORT Register
,
6459 /** I/O manager routines **/
6464 IoAcquireCancelSpinLock(
6470 IoAcquireRemoveLockEx(
6471 IN PIO_REMOVE_LOCK RemoveLock
,
6472 IN OPTIONAL PVOID Tag OPTIONAL
,
6475 IN ULONG RemlockSize
);
6479 * IoAcquireRemoveLock(
6480 * IN PIO_REMOVE_LOCK RemoveLock,
6481 * IN OPTIONAL PVOID Tag)
6483 #define IoAcquireRemoveLock(_RemoveLock, \
6485 IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK))
6489 * IoAdjustPagingPathCount(
6491 * IN BOOLEAN Increment)
6493 #define IoAdjustPagingPathCount(_Count, \
6498 InterlockedIncrement(_Count); \
6502 InterlockedDecrement(_Count); \
6509 IoAllocateController(
6510 IN PCONTROLLER_OBJECT ControllerObject
,
6511 IN PDEVICE_OBJECT DeviceObject
,
6512 IN PDRIVER_CONTROL ExecutionRoutine
,
6518 IoAllocateDriverObjectExtension(
6519 IN PDRIVER_OBJECT DriverObject
,
6520 IN PVOID ClientIdentificationAddress
,
6521 IN ULONG DriverObjectExtensionSize
,
6522 OUT PVOID
*DriverObjectExtension
);
6527 IoAllocateErrorLogEntry(
6529 IN UCHAR EntrySize
);
6536 IN BOOLEAN ChargeQuota
);
6542 IN PVOID VirtualAddress
,
6544 IN BOOLEAN SecondaryBuffer
,
6545 IN BOOLEAN ChargeQuota
,
6546 IN OUT PIRP Irp OPTIONAL
);
6552 IN PDEVICE_OBJECT DeviceObject
);
6555 * VOID IoAssignArcName(
6556 * IN PUNICODE_STRING ArcName,
6557 * IN PUNICODE_STRING DeviceName);
6559 #define IoAssignArcName(_ArcName, _DeviceName) ( \
6560 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
6566 IN PDEVICE_OBJECT SourceDevice
,
6567 IN PUNICODE_STRING TargetDevice
,
6568 OUT PDEVICE_OBJECT
*AttachedDevice
);
6573 IoAttachDeviceToDeviceStack(
6574 IN PDEVICE_OBJECT SourceDevice
,
6575 IN PDEVICE_OBJECT TargetDevice
);
6580 IoBuildAsynchronousFsdRequest(
6581 IN ULONG MajorFunction
,
6582 IN PDEVICE_OBJECT DeviceObject
,
6583 IN OUT PVOID Buffer OPTIONAL
,
6584 IN ULONG Length OPTIONAL
,
6585 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
6586 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
6591 IoBuildDeviceIoControlRequest(
6592 IN ULONG IoControlCode
,
6593 IN PDEVICE_OBJECT DeviceObject
,
6594 IN PVOID InputBuffer OPTIONAL
,
6595 IN ULONG InputBufferLength
,
6596 OUT PVOID OutputBuffer OPTIONAL
,
6597 IN ULONG OutputBufferLength
,
6598 IN BOOLEAN InternalDeviceIoControl
,
6600 OUT PIO_STATUS_BLOCK IoStatusBlock
);
6607 IN OUT PMDL TargetMdl
,
6608 IN PVOID VirtualAddress
,
6614 IoBuildSynchronousFsdRequest(
6615 IN ULONG MajorFunction
,
6616 IN PDEVICE_OBJECT DeviceObject
,
6617 IN OUT PVOID Buffer OPTIONAL
,
6618 IN ULONG Length OPTIONAL
,
6619 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
6621 OUT PIO_STATUS_BLOCK IoStatusBlock
);
6627 IN PDEVICE_OBJECT DeviceObject
,
6633 * IN PDEVICE_OBJECT DeviceObject,
6636 #define IoCallDriver IofCallDriver
6642 IN PDEVICE_OBJECT DeviceObject
,
6643 IN PFILE_OBJECT FileObject
);
6655 IN ACCESS_MASK DesiredAccess
,
6656 IN ULONG DesiredShareAccess
,
6657 IN OUT PFILE_OBJECT FileObject
,
6658 IN OUT PSHARE_ACCESS ShareAccess
,
6666 IN CCHAR PriorityBoost
);
6670 * IoCompleteRequest(
6672 * IN CCHAR PriorityBoost)
6674 #define IoCompleteRequest IofCompleteRequest
6680 OUT PKINTERRUPT
*InterruptObject
,
6681 IN PKSERVICE_ROUTINE ServiceRoutine
,
6682 IN PVOID ServiceContext
,
6683 IN PKSPIN_LOCK SpinLock OPTIONAL
,
6686 IN KIRQL SynchronizeIrql
,
6687 IN KINTERRUPT_MODE InterruptMode
,
6688 IN BOOLEAN ShareVector
,
6689 IN KAFFINITY ProcessorEnableMask
,
6690 IN BOOLEAN FloatingSave
);
6693 * PIO_STACK_LOCATION
6694 * IoGetCurrentIrpStackLocation(
6697 #define IoGetCurrentIrpStackLocation(_Irp) \
6698 ((_Irp)->Tail.Overlay.CurrentStackLocation)
6701 * PIO_STACK_LOCATION
6702 * IoGetNextIrpStackLocation(
6705 #define IoGetNextIrpStackLocation(_Irp) \
6706 ((_Irp)->Tail.Overlay.CurrentStackLocation - 1)
6710 * IoCopyCurrentIrpStackLocationToNext(
6713 #define IoCopyCurrentIrpStackLocationToNext(_Irp) \
6715 PIO_STACK_LOCATION _IrpSp; \
6716 PIO_STACK_LOCATION _NextIrpSp; \
6717 _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \
6718 _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \
6719 RtlCopyMemory(_NextIrpSp, _IrpSp, \
6720 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
6721 _NextIrpSp->Control = 0; \
6734 IN PDRIVER_OBJECT DriverObject
,
6735 IN ULONG DeviceExtensionSize
,
6736 IN PUNICODE_STRING DeviceName OPTIONAL
,
6737 IN DEVICE_TYPE DeviceType
,
6738 IN ULONG DeviceCharacteristics
,
6739 IN BOOLEAN Exclusive
,
6740 OUT PDEVICE_OBJECT
*DeviceObject
);
6746 IN PDEVICE_OBJECT DeviceObject
,
6747 IN PCREATE_DISK Disk
);
6753 OUT PHANDLE FileHandle
,
6754 IN ACCESS_MASK DesiredAccess
,
6755 IN POBJECT_ATTRIBUTES ObjectAttributes
,
6756 OUT PIO_STATUS_BLOCK IoStatusBlock
,
6757 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
6758 IN ULONG FileAttributes
,
6759 IN ULONG ShareAccess
,
6760 IN ULONG Disposition
,
6761 IN ULONG CreateOptions
,
6762 IN PVOID EaBuffer OPTIONAL
,
6764 IN CREATE_FILE_TYPE CreateFileType
,
6765 IN PVOID ExtraCreateParameters OPTIONAL
,
6771 IoCreateNotificationEvent(
6772 IN PUNICODE_STRING EventName
,
6773 OUT PHANDLE EventHandle
);
6778 IoCreateSymbolicLink(
6779 IN PUNICODE_STRING SymbolicLinkName
,
6780 IN PUNICODE_STRING DeviceName
);
6785 IoCreateSynchronizationEvent(
6786 IN PUNICODE_STRING EventName
,
6787 OUT PHANDLE EventHandle
);
6792 IoCreateUnprotectedSymbolicLink(
6793 IN PUNICODE_STRING SymbolicLinkName
,
6794 IN PUNICODE_STRING DeviceName
);
6801 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
6802 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
6803 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
6804 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
6805 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
6806 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
6814 IN PIO_CSQ_IRP_CONTEXT Context
);
6821 IN PIO_CSQ_IRP_CONTEXT Context
);
6828 IN PVOID PeekContext
);
6834 IN PCONTROLLER_OBJECT ControllerObject
);
6840 IN PDEVICE_OBJECT DeviceObject
);
6845 IoDeleteSymbolicLink(
6846 IN PUNICODE_STRING SymbolicLinkName
);
6850 * IoDeassignArcName(
6851 * IN PUNICODE_STRING ArcName)
6853 #define IoDeassignArcName IoDeleteSymbolicLink
6859 IN OUT PDEVICE_OBJECT TargetDevice
);
6864 IoDisconnectInterrupt(
6865 IN PKINTERRUPT InterruptObject
);
6870 IoForwardIrpSynchronously(
6871 IN PDEVICE_OBJECT DeviceObject
,
6874 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
6880 IN PCONTROLLER_OBJECT ControllerObject
);
6885 IoFreeErrorLogEntry(
6904 IN PIO_WORKITEM pIOWorkItem
);
6909 IoGetAttachedDevice(
6910 IN PDEVICE_OBJECT DeviceObject
);
6915 IoGetAttachedDeviceReference(
6916 IN PDEVICE_OBJECT DeviceObject
);
6921 IoGetBootDiskInformation(
6922 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
6926 PCONFIGURATION_INFORMATION
6928 IoGetConfigurationInformation(
6934 IoGetCurrentProcess(
6940 IoGetDeviceInterfaceAlias(
6941 IN PUNICODE_STRING SymbolicLinkName
,
6942 IN CONST GUID
*AliasInterfaceClassGuid
,
6943 OUT PUNICODE_STRING AliasSymbolicLinkName
);
6948 IoGetDeviceInterfaces(
6949 IN CONST GUID
*InterfaceClassGuid
,
6950 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
6952 OUT PWSTR
*SymbolicLinkList
);
6957 IoGetDeviceObjectPointer(
6958 IN PUNICODE_STRING ObjectName
,
6959 IN ACCESS_MASK DesiredAccess
,
6960 OUT PFILE_OBJECT
*FileObject
,
6961 OUT PDEVICE_OBJECT
*DeviceObject
);
6966 IoGetDeviceProperty(
6967 IN PDEVICE_OBJECT DeviceObject
,
6968 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
6969 IN ULONG BufferLength
,
6970 OUT PVOID PropertyBuffer
,
6971 OUT PULONG ResultLength
);
6976 IoGetDeviceToVerify(
6977 IN PETHREAD Thread
);
6983 IN PDEVICE_OBJECT PhysicalDeviceObject
,
6984 IN PDEVICE_DESCRIPTION DeviceDescription
,
6985 IN OUT PULONG NumberOfMapRegisters
);
6990 IoGetDriverObjectExtension(
6991 IN PDRIVER_OBJECT DriverObject
,
6992 IN PVOID ClientIdentificationAddress
);
6997 IoGetFileObjectGenericMapping(
7002 * IoGetFunctionCodeFromCtlCode(
7003 * IN ULONG ControlCode)
7005 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
7006 (((_ControlCode) >> 2) & 0x00000FFF)
7017 IoGetRelatedDeviceObject(
7018 IN PFILE_OBJECT FileObject
);
7023 IoGetRemainingStackSize(
7030 OUT PULONG_PTR LowLimit
,
7031 OUT PULONG_PTR HighLimit
);
7038 IN PKDEFERRED_ROUTINE DeferredRoutine
,
7039 IN PVOID DeferredContext
);
7043 * IoInitializeDpcRequest(
7044 * IN PDEVICE_OBJECT DeviceObject,
7045 * IN PIO_DPC_ROUTINE DpcRoutine)
7047 #define IoInitializeDpcRequest(_DeviceObject, \
7049 KeInitializeDpc(&(_DeviceObject)->Dpc, \
7050 (PKDEFERRED_ROUTINE) (_DpcRoutine), \
7058 IN USHORT PacketSize
,
7059 IN CCHAR StackSize
);
7064 IoInitializeRemoveLockEx(
7065 IN PIO_REMOVE_LOCK Lock
,
7066 IN ULONG AllocateTag
,
7067 IN ULONG MaxLockedMinutes
,
7068 IN ULONG HighWatermark
,
7069 IN ULONG RemlockSize
);
7072 * IoInitializeRemoveLock(
7073 * IN PIO_REMOVE_LOCK Lock,
7074 * IN ULONG AllocateTag,
7075 * IN ULONG MaxLockedMinutes,
7076 * IN ULONG HighWatermark)
7078 #define IoInitializeRemoveLock( \
7079 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
7080 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
7081 HighWatermark, sizeof(IO_REMOVE_LOCK))
7087 IN PDEVICE_OBJECT DeviceObject
,
7088 IN PIO_TIMER_ROUTINE TimerRoutine
,
7094 IoInvalidateDeviceRelations(
7095 IN PDEVICE_OBJECT DeviceObject
,
7096 IN DEVICE_RELATION_TYPE Type
);
7101 IoInvalidateDeviceState(
7102 IN PDEVICE_OBJECT PhysicalDeviceObject
);
7108 IN PIRP Irp OPTIONAL
);
7112 * IoIsErrorUserInduced(
7113 * IN NTSTATUS Status);
7115 #define IoIsErrorUserInduced(Status) \
7116 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
7117 ((Status) == STATUS_IO_TIMEOUT) || \
7118 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
7119 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
7120 ((Status) == STATUS_VERIFY_REQUIRED) || \
7121 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
7122 ((Status) == STATUS_WRONG_VOLUME)))
7127 IoIsWdmVersionAvailable(
7128 IN UCHAR MajorVersion
,
7129 IN UCHAR MinorVersion
);
7134 IoMakeAssociatedIrp(
7136 IN CCHAR StackSize
);
7143 #define IoMarkIrpPending(_Irp) \
7144 (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED)
7149 IoOpenDeviceInterfaceRegistryKey(
7150 IN PUNICODE_STRING SymbolicLinkName
,
7151 IN ACCESS_MASK DesiredAccess
,
7152 OUT PHANDLE DeviceInterfaceKey
);
7154 #define PLUGPLAY_REGKEY_DEVICE 1
7155 #define PLUGPLAY_REGKEY_DRIVER 2
7156 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
7161 IoOpenDeviceRegistryKey(
7162 IN PDEVICE_OBJECT DeviceObject
,
7163 IN ULONG DevInstKeyType
,
7164 IN ACCESS_MASK DesiredAccess
,
7165 OUT PHANDLE DevInstRegKey
);
7170 IoQueryDeviceDescription(
7171 IN PINTERFACE_TYPE BusType OPTIONAL
,
7172 IN PULONG BusNumber OPTIONAL
,
7173 IN PCONFIGURATION_TYPE ControllerType OPTIONAL
,
7174 IN PULONG ControllerNumber OPTIONAL
,
7175 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL
,
7176 IN PULONG PeripheralNumber OPTIONAL
,
7177 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
,
7184 IN PIO_WORKITEM pIOWorkItem
,
7185 IN PIO_WORKITEM_ROUTINE Routine
,
7186 IN WORK_QUEUE_TYPE QueueType
,
7194 IN PVPB Vpb OPTIONAL
,
7195 IN PDEVICE_OBJECT RealDeviceObject
);
7200 IoRaiseInformationalHardError(
7201 IN NTSTATUS ErrorStatus
,
7202 IN PUNICODE_STRING String OPTIONAL
,
7203 IN PKTHREAD Thread OPTIONAL
);
7208 IoReadDiskSignature(
7209 IN PDEVICE_OBJECT DeviceObject
,
7210 IN ULONG BytesPerSector
,
7211 OUT PDISK_SIGNATURE Signature
);
7216 IoReadPartitionTableEx(
7217 IN PDEVICE_OBJECT DeviceObject
,
7218 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
**PartitionBuffer
);
7223 IoRegisterBootDriverReinitialization(
7224 IN PDRIVER_OBJECT DriverObject
,
7225 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
7231 IoRegisterBootDriverReinitialization(
7232 IN PDRIVER_OBJECT DriverObject
,
7233 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
7239 IoRegisterDeviceInterface(
7240 IN PDEVICE_OBJECT PhysicalDeviceObject
,
7241 IN CONST GUID
*InterfaceClassGuid
,
7242 IN PUNICODE_STRING ReferenceString OPTIONAL
,
7243 OUT PUNICODE_STRING SymbolicLinkName
);
7248 IoRegisterDriverReinitialization(
7249 IN PDRIVER_OBJECT DriverObject
,
7250 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
7256 IoRegisterPlugPlayNotification(
7257 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
7258 IN ULONG EventCategoryFlags
,
7259 IN PVOID EventCategoryData OPTIONAL
,
7260 IN PDRIVER_OBJECT DriverObject
,
7261 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
7263 OUT PVOID
*NotificationEntry
);
7268 IoRegisterShutdownNotification(
7269 IN PDEVICE_OBJECT DeviceObject
);
7274 IoReleaseCancelSpinLock(
7280 IoReleaseRemoveLockAndWaitEx(
7281 IN PIO_REMOVE_LOCK RemoveLock
,
7283 IN ULONG RemlockSize
);
7288 IoReleaseRemoveLockEx(
7289 IN PIO_REMOVE_LOCK RemoveLock
,
7291 IN ULONG RemlockSize
);
7295 * IoReleaseRemoveLock(
7296 * IN PIO_REMOVE_LOCK RemoveLock,
7299 #define IoReleaseRemoveLock(_RemoveLock, \
7301 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7305 * IoReleaseRemoveLockAndWait(
7306 * IN PIO_REMOVE_LOCK RemoveLock,
7309 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
7311 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
7316 IoRemoveShareAccess(
7317 IN PFILE_OBJECT FileObject
,
7318 IN OUT PSHARE_ACCESS ShareAccess
);
7323 IoReportDetectedDevice(
7324 IN PDRIVER_OBJECT DriverObject
,
7325 IN INTERFACE_TYPE LegacyBusType
,
7327 IN ULONG SlotNumber
,
7328 IN PCM_RESOURCE_LIST ResourceList
,
7329 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL
,
7330 IN BOOLEAN ResourceAssigned
,
7331 IN OUT PDEVICE_OBJECT
*DeviceObject
);
7336 IoReportResourceForDetection(
7337 IN PDRIVER_OBJECT DriverObject
,
7338 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
7339 IN ULONG DriverListSize OPTIONAL
,
7340 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
7341 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
7342 IN ULONG DeviceListSize OPTIONAL
,
7343 OUT PBOOLEAN ConflictDetected
);
7348 IoReportResourceUsage(
7349 IN PUNICODE_STRING DriverClassName OPTIONAL
,
7350 IN PDRIVER_OBJECT DriverObject
,
7351 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
7352 IN ULONG DriverListSize OPTIONAL
,
7353 IN PDEVICE_OBJECT DeviceObject
,
7354 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
7355 IN ULONG DeviceListSize OPTIONAL
,
7356 IN BOOLEAN OverrideConflict
,
7357 OUT PBOOLEAN ConflictDetected
);
7362 IoReportTargetDeviceChange(
7363 IN PDEVICE_OBJECT PhysicalDeviceObject
,
7364 IN PVOID NotificationStructure
);
7369 IoReportTargetDeviceChangeAsynchronous(
7370 IN PDEVICE_OBJECT PhysicalDeviceObject
,
7371 IN PVOID NotificationStructure
,
7372 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
7373 IN PVOID Context OPTIONAL
);
7378 IoRequestDeviceEject(
7379 IN PDEVICE_OBJECT PhysicalDeviceObject
);
7384 * IN PDEVICE_OBJECT DeviceObject,
7386 * IN PVOID Context);
7388 #define IoRequestDpc(DeviceObject, Irp, Context)( \
7389 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
7396 IN NTSTATUS Status
);
7400 * IoSetCancelRoutine(
7402 * IN PDRIVER_CANCEL CancelRoutine)
7404 #define IoSetCancelRoutine(_Irp, \
7406 ((PDRIVER_CANCEL) InterlockedExchangePointer( \
7407 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine)))
7411 * IoSetCompletionRoutine(
7413 * IN PIO_COMPLETION_ROUTINE CompletionRoutine,
7415 * IN BOOLEAN InvokeOnSuccess,
7416 * IN BOOLEAN InvokeOnError,
7417 * IN BOOLEAN InvokeOnCancel)
7419 #define IoSetCompletionRoutine(_Irp, \
7420 _CompletionRoutine, \
7426 PIO_STACK_LOCATION _IrpSp; \
7427 ASSERT(_InvokeOnSuccess || _InvokeOnError || _InvokeOnCancel ? \
7428 _CompletionRoutine != NULL : TRUE); \
7429 _IrpSp = IoGetNextIrpStackLocation(_Irp); \
7430 _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \
7431 _IrpSp->Context = (_Context); \
7432 _IrpSp->Control = 0; \
7433 if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \
7434 if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \
7435 if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \
7441 IoSetCompletionRoutineEx(
7442 IN PDEVICE_OBJECT DeviceObject
,
7444 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
7446 IN BOOLEAN InvokeOnSuccess
,
7447 IN BOOLEAN InvokeOnError
,
7448 IN BOOLEAN InvokeOnCancel
);
7453 IoSetDeviceInterfaceState(
7454 IN PUNICODE_STRING SymbolicLinkName
,
7460 IoSetHardErrorOrVerifyDevice(
7462 IN PDEVICE_OBJECT DeviceObject
);
7466 * IoSetNextIrpStackLocation(
7469 #define IoSetNextIrpStackLocation(_Irp) \
7471 (_Irp)->CurrentLocation--; \
7472 (_Irp)->Tail.Overlay.CurrentStackLocation--; \
7478 IoSetPartitionInformationEx(
7479 IN PDEVICE_OBJECT DeviceObject
,
7480 IN ULONG PartitionNumber
,
7481 IN
struct _SET_PARTITION_INFORMATION_EX
*PartitionInfo
);
7487 IN ACCESS_MASK DesiredAccess
,
7488 IN ULONG DesiredShareAccess
,
7489 IN OUT PFILE_OBJECT FileObject
,
7490 OUT PSHARE_ACCESS ShareAccess
);
7495 IoSetStartIoAttributes(
7496 IN PDEVICE_OBJECT DeviceObject
,
7497 IN BOOLEAN DeferredStartIo
,
7498 IN BOOLEAN NonCancelable
);
7503 IoSetSystemPartition(
7504 IN PUNICODE_STRING VolumeNameString
);
7509 IoSetThreadHardErrorMode(
7510 IN BOOLEAN EnableHardErrors
);
7515 * IN CCHAR StackSize)
7517 #define IoSizeOfIrp(_StackSize) \
7518 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
7522 * IoSkipCurrentIrpStackLocation(
7525 #define IoSkipCurrentIrpStackLocation(_Irp) \
7527 (_Irp)->CurrentLocation++; \
7528 (_Irp)->Tail.Overlay.CurrentStackLocation++; \
7535 IN PDEVICE_OBJECT DeviceObject
,
7536 IN BOOLEAN Cancelable
);
7541 IoStartNextPacketByKey(
7542 IN PDEVICE_OBJECT DeviceObject
,
7543 IN BOOLEAN Cancelable
,
7550 IN PDEVICE_OBJECT DeviceObject
,
7552 IN PULONG Key OPTIONAL
,
7553 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
7559 IN PDEVICE_OBJECT DeviceObject
);
7565 IN PDEVICE_OBJECT DeviceObject
);
7570 IoUnregisterPlugPlayNotification(
7571 IN PVOID NotificationEntry
);
7576 IoUnregisterShutdownNotification(
7577 IN PDEVICE_OBJECT DeviceObject
);
7582 IoUpdateShareAccess(
7583 IN PFILE_OBJECT FileObject
,
7584 IN OUT PSHARE_ACCESS ShareAccess
);
7589 IoVerifyPartitionTable(
7590 IN PDEVICE_OBJECT DeviceObject
,
7591 IN BOOLEAN FixErrors
);
7596 IoVolumeDeviceToDosName(
7597 IN PVOID VolumeDeviceObject
,
7598 OUT PUNICODE_STRING DosName
);
7603 IoWMIAllocateInstanceIds(
7605 IN ULONG InstanceCount
,
7606 OUT ULONG
*FirstInstanceId
);
7611 IoWMIDeviceObjectToProviderId(
7612 IN PDEVICE_OBJECT DeviceObject
);
7617 IoWMIDeviceObjectToInstanceName(
7618 IN PVOID DataBlockObject
,
7619 IN PDEVICE_OBJECT DeviceObject
,
7620 OUT PUNICODE_STRING InstanceName
);
7626 IN PVOID DataBlockObject
,
7627 IN PUNICODE_STRING InstanceName
,
7629 IN ULONG InBufferSize
,
7630 IN OUT PULONG OutBufferSize
,
7631 IN OUT PUCHAR InOutBuffer
);
7636 IoWMIHandleToInstanceName(
7637 IN PVOID DataBlockObject
,
7638 IN HANDLE FileHandle
,
7639 OUT PUNICODE_STRING InstanceName
);
7645 IN GUID
*DataBlockGuid
,
7646 IN ULONG DesiredAccess
,
7647 OUT PVOID
*DataBlockObject
);
7653 IN PVOID DataBlockObject
,
7654 IN OUT ULONG
*InOutBufferSize
,
7655 OUT PVOID OutBuffer
);
7660 IoWMIQueryAllDataMultiple(
7661 IN PVOID
*DataBlockObjectList
,
7662 IN ULONG ObjectCount
,
7663 IN OUT ULONG
*InOutBufferSize
,
7664 OUT PVOID OutBuffer
);
7669 IoWMIQuerySingleInstance(
7670 IN PVOID DataBlockObject
,
7671 IN PUNICODE_STRING InstanceName
,
7672 IN OUT ULONG
*InOutBufferSize
,
7673 OUT PVOID OutBuffer
);
7678 IoWMIQuerySingleInstanceMultiple(
7679 IN PVOID
*DataBlockObjectList
,
7680 IN PUNICODE_STRING InstanceNames
,
7681 IN ULONG ObjectCount
,
7682 IN OUT ULONG
*InOutBufferSize
,
7683 OUT PVOID OutBuffer
);
7688 IoWMIRegistrationControl(
7689 IN PDEVICE_OBJECT DeviceObject
,
7695 IoWMISetNotificationCallback(
7697 IN WMI_NOTIFICATION_CALLBACK Callback
,
7703 IoWMISetSingleInstance(
7704 IN PVOID DataBlockObject
,
7705 IN PUNICODE_STRING InstanceName
,
7707 IN ULONG ValueBufferSize
,
7708 IN PVOID ValueBuffer
);
7714 IN PVOID DataBlockObject
,
7715 IN PUNICODE_STRING InstanceName
,
7716 IN ULONG DataItemId
,
7718 IN ULONG ValueBufferSize
,
7719 IN PVOID ValueBuffer
);
7724 IoWMISuggestInstanceName(
7725 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
7726 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
7727 IN BOOLEAN CombineNames
,
7728 OUT PUNICODE_STRING SuggestedInstanceName
);
7734 IN PVOID WnodeEventItem
);
7739 IoWriteErrorLogEntry(
7745 IoWritePartitionTableEx(
7746 IN PDEVICE_OBJECT DeviceObject
,
7747 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
*PartitionBuffer
);
7751 /** Kernel routines **/
7756 KeAcquireInStackQueuedSpinLock(
7757 IN PKSPIN_LOCK SpinLock
,
7758 IN PKLOCK_QUEUE_HANDLE LockHandle
);
7763 KeAcquireInStackQueuedSpinLockAtDpcLevel(
7764 IN PKSPIN_LOCK SpinLock
,
7765 IN PKLOCK_QUEUE_HANDLE LockHandle
);
7770 KeAcquireInterruptSpinLock(
7771 IN PKINTERRUPT Interrupt
);
7774 /* System Service Dispatch Table */
7775 typedef PVOID (NTAPI
* SSDT
)(VOID
);
7776 typedef SSDT
* PSSDT
;
7778 /* System Service Parameters Table */
7779 typedef UCHAR SSPT
, * PSSPT
;
7781 typedef struct _SSDT_ENTRY
{
7783 PULONG ServiceCounterTable
;
7784 ULONG NumberOfServices
;
7786 } SSDT_ENTRY
, *PSSDT_ENTRY
;
7791 KeAddSystemServiceTable(
7793 IN PULONG ServiceCounterTable
,
7794 IN ULONG NumberOfServices
,
7796 IN ULONG TableIndex
);
7808 IN ULONG BugCheckCode
);
7814 IN ULONG BugCheckCode
,
7815 IN ULONG_PTR BugCheckParameter1
,
7816 IN ULONG_PTR BugCheckParameter2
,
7817 IN ULONG_PTR BugCheckParameter3
,
7818 IN ULONG_PTR BugCheckParameter4
);
7835 KeDelayExecutionThread(
7836 IN KPROCESSOR_MODE WaitMode
,
7837 IN BOOLEAN Alertable
,
7838 IN PLARGE_INTEGER Interval
);
7843 KeDeregisterBugCheckCallback(
7844 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord
);
7849 KeEnterCriticalRegion(
7856 * IN BOOLEAN ReadOperation,
7857 * IN BOOLEAN DmaOperation)
7859 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
7876 KeGetRecommendedSharedDataAlignment(
7882 KeInitializeDeviceQueue(
7883 IN PKDEVICE_QUEUE DeviceQueue
);
7895 KeInitializeSemaphore(
7896 IN PRKSEMAPHORE Semaphore
,
7903 KeInitializeSpinLock(
7904 IN PKSPIN_LOCK SpinLock
);
7915 KeInitializeTimerEx(
7917 IN TIMER_TYPE Type
);
7922 KeInsertByKeyDeviceQueue(
7923 IN PKDEVICE_QUEUE DeviceQueue
,
7924 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
,
7930 KeInsertDeviceQueue(
7931 IN PKDEVICE_QUEUE DeviceQueue
,
7932 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
7939 IN PVOID SystemArgument1
,
7940 IN PVOID SystemArgument2
);
7945 KeLeaveCriticalRegion(
7953 volatile LONG Barrier
;
7954 #if defined(__GNUC__)
7955 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
7956 #elif defined(_MSC_VER)
7957 __asm xchg
[Barrier
], eax
7966 IN KPRIORITY Increment
,
7972 KeQueryInterruptTime(
7978 KeQueryPerformanceCounter(
7979 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
7984 KeQueryPriorityThread(
7985 IN PRKTHREAD Thread
);
7991 OUT PLARGE_INTEGER CurrentTime
);
7997 OUT PLARGE_INTEGER TickCount
);
8002 KeQueryTimeIncrement(
8020 KeReadStateSemaphore(
8021 IN PRKSEMAPHORE Semaphore
);
8032 KeRegisterBugCheckCallback(
8033 IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord
,
8034 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine
,
8037 IN PUCHAR Component
);
8042 KeReleaseInStackQueuedSpinLock(
8043 IN PKLOCK_QUEUE_HANDLE LockHandle
);
8048 KeReleaseInStackQueuedSpinLockFromDpcLevel(
8049 IN PKLOCK_QUEUE_HANDLE LockHandle
);
8054 KeReleaseInterruptSpinLock(
8055 IN PKINTERRUPT Interrupt
,
8069 IN PRKSEMAPHORE Semaphore
,
8070 IN KPRIORITY Increment
,
8075 PKDEVICE_QUEUE_ENTRY
8077 KeRemoveByKeyDeviceQueue(
8078 IN PKDEVICE_QUEUE DeviceQueue
,
8082 PKDEVICE_QUEUE_ENTRY
8084 KeRemoveDeviceQueue(
8085 IN PKDEVICE_QUEUE DeviceQueue
);
8090 KeRemoveEntryDeviceQueue(
8091 IN PKDEVICE_QUEUE DeviceQueue
,
8092 IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
);
8109 KeRestoreFloatingPointState(
8110 IN PKFLOATING_SAVE FloatSave
);
8115 KeSaveFloatingPointState(
8116 OUT PKFLOATING_SAVE FloatSave
);
8121 KeSetBasePriorityThread(
8122 IN PRKTHREAD Thread
,
8130 IN KPRIORITY Increment
,
8138 IN KDPC_IMPORTANCE Importance
);
8143 KeSetPriorityThread(
8145 IN KPRIORITY Priority
);
8150 KeSetTargetProcessorDpc(
8159 IN LARGE_INTEGER DueTime
,
8160 IN PKDPC Dpc OPTIONAL
);
8167 IN LARGE_INTEGER DueTime
,
8168 IN LONG Period OPTIONAL
,
8169 IN PKDPC Dpc OPTIONAL
);
8174 KeSetTimeUpdateNotifyRoutine(
8175 IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
);
8180 KeStallExecutionProcessor(
8181 IN ULONG MicroSeconds
);
8186 KeSynchronizeExecution(
8187 IN PKINTERRUPT Interrupt
,
8188 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine
,
8189 IN PVOID SynchronizeContext
);
8194 KeWaitForMultipleObjects(
8197 IN WAIT_TYPE WaitType
,
8198 IN KWAIT_REASON WaitReason
,
8199 IN KPROCESSOR_MODE WaitMode
,
8200 IN BOOLEAN Alertable
,
8201 IN PLARGE_INTEGER Timeout OPTIONAL
,
8202 IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
);
8207 KeWaitForMutexObject(
8209 IN KWAIT_REASON WaitReason
,
8210 IN KPROCESSOR_MODE WaitMode
,
8211 IN BOOLEAN Alertable
,
8212 IN PLARGE_INTEGER Timeout OPTIONAL
);
8217 KeWaitForSingleObject(
8219 IN KWAIT_REASON WaitReason
,
8220 IN KPROCESSOR_MODE WaitMode
,
8221 IN BOOLEAN Alertable
,
8222 IN PLARGE_INTEGER Timeout OPTIONAL
);
8241 KeRaiseIrqlToDpcLevel(
8247 KeRaiseIrqlToSynchLevel(
8250 #define KeLowerIrql(a) KfLowerIrql(a)
8251 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8270 KeRaiseIrqlToDpcLevel(
8275 /** Memory manager routines **/
8282 IN ULONG NumberOfBytes
);
8287 MmAllocateContiguousMemory(
8288 IN ULONG NumberOfBytes
,
8289 IN PHYSICAL_ADDRESS HighestAcceptableAddress
);
8294 MmAllocateContiguousMemorySpecifyCache(
8295 IN SIZE_T NumberOfBytes
,
8296 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
8297 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
8298 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
8299 IN MEMORY_CACHING_TYPE CacheType
);
8304 MmAllocateMappingAddress(
8305 IN SIZE_T NumberOfBytes
,
8311 MmAllocateNonCachedMemory(
8312 IN ULONG NumberOfBytes
);
8317 MmAllocatePagesForMdl(
8318 IN PHYSICAL_ADDRESS LowAddress
,
8319 IN PHYSICAL_ADDRESS HighAddress
,
8320 IN PHYSICAL_ADDRESS SkipBytes
,
8321 IN SIZE_T TotalBytes
);
8326 MmBuildMdlForNonPagedPool(
8327 IN OUT PMDL MemoryDescriptorList
);
8333 OUT PSECTION_OBJECT
*SectionObject
,
8334 IN ACCESS_MASK DesiredAccess
,
8335 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
8336 IN PLARGE_INTEGER MaximumSize
,
8337 IN ULONG SectionPageProtection
,
8338 IN ULONG AllocationAttributes
,
8339 IN HANDLE FileHandle OPTIONAL
,
8340 IN PFILE_OBJECT File OPTIONAL
);
8342 typedef enum _MMFLUSH_TYPE
{
8350 MmFlushImageSection(
8351 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
8352 IN MMFLUSH_TYPE FlushType
);
8357 MmFreeContiguousMemory(
8358 IN PVOID BaseAddress
);
8363 MmFreeContiguousMemorySpecifyCache(
8364 IN PVOID BaseAddress
,
8365 IN SIZE_T NumberOfBytes
,
8366 IN MEMORY_CACHING_TYPE CacheType
);
8371 MmFreeMappingAddress(
8372 IN PVOID BaseAddress
,
8378 MmFreeNonCachedMemory(
8379 IN PVOID BaseAddress
,
8380 IN SIZE_T NumberOfBytes
);
8386 IN PMDL MemoryDescriptorList
);
8390 * MmGetMdlByteCount(
8393 #define MmGetMdlByteCount(_Mdl) \
8398 * MmGetMdlByteOffset(
8401 #define MmGetMdlByteOffset(_Mdl) \
8402 ((_Mdl)->ByteOffset)
8409 #define MmGetMdlPfnArray(_Mdl) \
8410 ((PPFN_NUMBER) ((_Mdl) + 1))
8414 * MmGetMdlVirtualAddress(
8417 #define MmGetMdlVirtualAddress(_Mdl) \
8418 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
8423 MmGetPhysicalAddress(
8424 IN PVOID BaseAddress
);
8427 PPHYSICAL_MEMORY_RANGE
8429 MmGetPhysicalMemoryRanges(
8435 MmGetVirtualForPhysical(
8436 IN PHYSICAL_ADDRESS PhysicalAddress
);
8441 MmMapLockedPagesSpecifyCache(
8442 IN PMDL MemoryDescriptorList
,
8443 IN KPROCESSOR_MODE AccessMode
,
8444 IN MEMORY_CACHING_TYPE CacheType
,
8445 IN PVOID BaseAddress
,
8446 IN ULONG BugCheckOnFailure
,
8447 IN MM_PAGE_PRIORITY Priority
);
8452 MmMapLockedPagesWithReservedMapping(
8453 IN PVOID MappingAddress
,
8455 IN PMDL MemoryDescriptorList
,
8456 IN MEMORY_CACHING_TYPE CacheType
);
8461 MmMapUserAddressesToPage(
8462 IN PVOID BaseAddress
,
8463 IN SIZE_T NumberOfBytes
,
8464 IN PVOID PageAddress
);
8470 IN PHYSICAL_ADDRESS PhysicalAddress
,
8471 IN SIZE_T NumberOfBytes
,
8472 IN MEMORY_CACHING_TYPE CacheType
);
8477 MmMapViewInSessionSpace(
8479 OUT PVOID
*MappedBase
,
8480 IN OUT PSIZE_T ViewSize
);
8485 MmMapViewInSystemSpace(
8487 OUT PVOID
*MappedBase
,
8488 IN PSIZE_T ViewSize
);
8493 MmMarkPhysicalMemoryAsBad(
8494 IN PPHYSICAL_ADDRESS StartAddress
,
8495 IN OUT PLARGE_INTEGER NumberOfBytes
);
8500 MmMarkPhysicalMemoryAsGood(
8501 IN PPHYSICAL_ADDRESS StartAddress
,
8502 IN OUT PLARGE_INTEGER NumberOfBytes
);
8506 * MmGetSystemAddressForMdlSafe(
8508 * IN MM_PAGE_PRIORITY Priority)
8510 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
8511 ((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
8512 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
8513 (_Mdl)->MappedSystemVa : \
8514 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
8515 KernelMode, MmCached, NULL, FALSE, _Priority)
8520 MmGetSystemRoutineAddress(
8521 IN PUNICODE_STRING SystemRoutineName
);
8525 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
8529 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \
8531 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
8532 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
8537 * IN PMDL MemoryDescriptorList,
8541 #define MmInitializeMdl(_MemoryDescriptorList, \
8545 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
8546 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
8547 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
8548 (_MemoryDescriptorList)->MdlFlags = 0; \
8549 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
8550 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
8551 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
8558 IN PVOID VirtualAddress
);
8563 MmIsDriverVerifying(
8564 IN PDRIVER_OBJECT DriverObject
);
8569 MmIsThisAnNtAsSystem(
8575 MmIsVerifierEnabled(
8576 OUT PULONG VerifierFlags
);
8581 MmLockPagableDataSection(
8582 IN PVOID AddressWithinSection
);
8587 MmLockPagableImageSection(
8588 IN PVOID AddressWithinSection
);
8592 * MmLockPagableCodeSection(
8593 * IN PVOID AddressWithinSection)
8595 #define MmLockPagableCodeSection MmLockPagableDataSection
8600 MmLockPagableSectionByHandle(
8601 IN PVOID ImageSectionHandle
);
8607 IN PHYSICAL_ADDRESS PhysicalAddress
,
8608 IN ULONG NumberOfBytes
,
8609 IN MEMORY_CACHING_TYPE CacheEnable
);
8615 IN PMDL MemoryDescriptorList
,
8616 IN KPROCESSOR_MODE AccessMode
);
8622 IN PVOID AddressWithinSection
);
8627 MmProbeAndLockProcessPages(
8628 IN OUT PMDL MemoryDescriptorList
,
8629 IN PEPROCESS Process
,
8630 IN KPROCESSOR_MODE AccessMode
,
8631 IN LOCK_OPERATION Operation
);
8636 MmProtectMdlSystemAddress(
8637 IN PMDL MemoryDescriptorList
,
8638 IN ULONG NewProtect
);
8644 IN PVOID BaseAddress
,
8645 IN PMDL MemoryDescriptorList
);
8650 MmUnmapViewInSessionSpace(
8651 IN PVOID MappedBase
);
8656 MmUnmapViewInSystemSpace(
8657 IN PVOID MappedBase
);
8662 MmUnsecureVirtualMemory(
8663 IN HANDLE SecureHandle
);
8667 * MmPrepareMdlForReuse(
8670 #define MmPrepareMdlForReuse(_Mdl) \
8672 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
8673 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
8674 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
8675 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
8676 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
8683 MmProbeAndLockPages(
8684 IN OUT PMDL MemoryDescriptorList
,
8685 IN KPROCESSOR_MODE AccessMode
,
8686 IN LOCK_OPERATION Operation
);
8697 MmRemovePhysicalMemory(
8698 IN PPHYSICAL_ADDRESS StartAddress
,
8699 IN OUT PLARGE_INTEGER NumberOfBytes
);
8704 MmResetDriverPaging(
8705 IN PVOID AddressWithinSection
);
8710 MmSecureVirtualMemory(
8713 IN ULONG ProbeMode
);
8725 MmUnlockPagableImageSection(
8726 IN PVOID ImageSectionHandle
);
8732 IN PMDL MemoryDescriptorList
);
8738 IN PVOID BaseAddress
,
8739 IN SIZE_T NumberOfBytes
);
8744 MmUnmapReservedMapping(
8745 IN PVOID BaseAddress
,
8747 IN PMDL MemoryDescriptorList
);
8752 MmUnmapVideoDisplay(
8753 IN PVOID BaseAddress
,
8754 IN SIZE_T NumberOfBytes
);
8758 /** Object manager routines **/
8764 IN PACCESS_STATE AccessState
,
8765 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
8767 IN POBJECT_TYPE Type
);
8772 ObDereferenceSecurityDescriptor(
8773 PSECURITY_DESCRIPTOR SecurityDescriptor
,
8779 ObfDereferenceObject(
8784 * ObDereferenceObject(
8787 #define ObDereferenceObject ObfDereferenceObject
8792 ObGetObjectSecurity(
8794 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
,
8795 OUT PBOOLEAN MemoryAllocated
);
8802 IN PACCESS_STATE PassedAccessState OPTIONAL
,
8803 IN ACCESS_MASK DesiredAccess
,
8804 IN ULONG AdditionalReferences
,
8805 OUT PVOID
* ReferencedObject OPTIONAL
,
8806 OUT PHANDLE Handle
);
8817 ObLogSecurityDescriptor(
8818 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor
,
8819 OUT PSECURITY_DESCRIPTOR
*OutputSecurityDescriptor
,
8823 * ObReferenceObject(
8826 #define ObReferenceObject ObfReferenceObject
8831 ObMakeTemporaryObject(
8838 IN POBJECT_ATTRIBUTES ObjectAttributes
,
8839 IN POBJECT_TYPE ObjectType
,
8840 IN OUT PVOID ParseContext OPTIONAL
,
8841 IN KPROCESSOR_MODE AccessMode
,
8842 IN ACCESS_MASK DesiredAccess
,
8843 IN PACCESS_STATE PassedAccessState
,
8844 OUT PHANDLE Handle
);
8849 ObOpenObjectByPointer(
8851 IN ULONG HandleAttributes
,
8852 IN PACCESS_STATE PassedAccessState OPTIONAL
,
8853 IN ACCESS_MASK DesiredAccess OPTIONAL
,
8854 IN POBJECT_TYPE ObjectType OPTIONAL
,
8855 IN KPROCESSOR_MODE AccessMode
,
8856 OUT PHANDLE Handle
);
8861 ObQueryObjectAuditingByHandle(
8863 OUT PBOOLEAN GenerateOnClose
);
8868 ObReferenceObjectByHandle(
8870 IN ACCESS_MASK DesiredAccess
,
8871 IN POBJECT_TYPE ObjectType OPTIONAL
,
8872 IN KPROCESSOR_MODE AccessMode
,
8874 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
8879 ObReferenceObjectByName(
8880 IN PUNICODE_STRING ObjectPath
,
8881 IN ULONG Attributes
,
8882 IN PACCESS_STATE PassedAccessState OPTIONAL
,
8883 IN ACCESS_MASK DesiredAccess OPTIONAL
,
8884 IN POBJECT_TYPE ObjectType
,
8885 IN KPROCESSOR_MODE AccessMode
,
8886 IN OUT PVOID ParseContext OPTIONAL
,
8892 ObReferenceObjectByPointer(
8894 IN ACCESS_MASK DesiredAccess
,
8895 IN POBJECT_TYPE ObjectType
,
8896 IN KPROCESSOR_MODE AccessMode
);
8901 ObReferenceSecurityDescriptor(
8902 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
8908 ObReleaseObjectSecurity(
8909 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
8910 IN BOOLEAN MemoryAllocated
);
8914 /** Process manager routines **/
8919 PsCreateSystemProcess(
8920 IN PHANDLE ProcessHandle
,
8921 IN ACCESS_MASK DesiredAccess
,
8922 IN POBJECT_ATTRIBUTES ObjectAttributes
);
8927 PsCreateSystemThread(
8928 OUT PHANDLE ThreadHandle
,
8929 IN ULONG DesiredAccess
,
8930 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
8931 IN HANDLE ProcessHandle OPTIONAL
,
8932 OUT PCLIENT_ID ClientId OPTIONAL
,
8933 IN PKSTART_ROUTINE StartRoutine
,
8934 IN PVOID StartContext
);
8938 * PsGetCurrentProcess(VOID)
8940 #define PsGetCurrentProcess IoGetCurrentProcess
8945 PsGetCurrentProcessId(
8950 * PsGetCurrentThread(VOID)
8952 #define PsGetCurrentThread() \
8953 ((PETHREAD) KeGetCurrentThread())
8958 PsGetCurrentThreadId(
8965 PULONG MajorVersion OPTIONAL
,
8966 PULONG MinorVersion OPTIONAL
,
8967 PULONG BuildNumber OPTIONAL
,
8968 PUNICODE_STRING CSDVersion OPTIONAL
);
8973 PsRemoveCreateThreadNotifyRoutine(
8974 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
8979 PsRemoveLoadImageNotifyRoutine(
8980 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
8985 PsSetCreateProcessNotifyRoutine(
8986 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine
,
8992 PsSetCreateThreadNotifyRoutine(
8993 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
8998 PsSetLoadImageNotifyRoutine(
8999 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
9004 PsTerminateSystemThread(
9005 IN NTSTATUS ExitStatus
);
9009 /** Security reference monitor routines **/
9015 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
9016 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
9017 IN BOOLEAN SubjectContextLocked
,
9018 IN ACCESS_MASK DesiredAccess
,
9019 IN ACCESS_MASK PreviouslyGrantedAccess
,
9020 OUT PPRIVILEGE_SET
*Privileges OPTIONAL
,
9021 IN PGENERIC_MAPPING GenericMapping
,
9022 IN KPROCESSOR_MODE AccessMode
,
9023 OUT PACCESS_MASK GrantedAccess
,
9024 OUT PNTSTATUS AccessStatus
);
9030 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
9031 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
9032 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
9033 IN BOOLEAN IsDirectoryObject
,
9034 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
9035 IN PGENERIC_MAPPING GenericMapping
,
9036 IN POOL_TYPE PoolType
);
9042 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
9043 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
9044 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
9045 IN GUID
*ObjectType OPTIONAL
,
9046 IN BOOLEAN IsDirectoryObject
,
9047 IN ULONG AutoInheritFlags
,
9048 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
9049 IN PGENERIC_MAPPING GenericMapping
,
9050 IN POOL_TYPE PoolType
);
9056 IN OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
);
9061 SeSinglePrivilegeCheck(
9062 LUID PrivilegeValue
,
9063 KPROCESSOR_MODE PreviousMode
);
9068 SeValidSecurityDescriptor(
9070 IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
9074 /** NtXxx routines **/
9080 OUT PHANDLE ProcessHandle
,
9081 IN ACCESS_MASK DesiredAccess
,
9082 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9083 IN PCLIENT_ID ClientId OPTIONAL
);
9088 NtQueryInformationProcess(
9089 IN HANDLE ProcessHandle
,
9090 IN PROCESSINFOCLASS ProcessInformationClass
,
9091 OUT PVOID ProcessInformation
,
9092 IN ULONG ProcessInformationLength
,
9093 OUT PULONG ReturnLength OPTIONAL
);
9097 /** NtXxx and ZwXxx routines **/
9103 IN HANDLE TimerHandle
,
9104 OUT PBOOLEAN CurrentState OPTIONAL
);
9121 ZwCreateDirectoryObject(
9122 OUT PHANDLE DirectoryHandle
,
9123 IN ACCESS_MASK DesiredAccess
,
9124 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9130 OUT PHANDLE EventHandle
,
9131 IN ACCESS_MASK DesiredAccess
,
9132 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9133 IN EVENT_TYPE EventType
,
9134 IN BOOLEAN InitialState
);
9140 OUT PHANDLE EventHandle
,
9141 IN ACCESS_MASK DesiredAccess
,
9142 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9143 IN EVENT_TYPE EventType
,
9144 IN BOOLEAN InitialState
);
9150 OUT PHANDLE FileHandle
,
9151 IN ACCESS_MASK DesiredAccess
,
9152 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9153 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9154 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
9155 IN ULONG FileAttributes
,
9156 IN ULONG ShareAccess
,
9157 IN ULONG CreateDisposition
,
9158 IN ULONG CreateOptions
,
9159 IN PVOID EaBuffer OPTIONAL
,
9166 OUT PHANDLE KeyHandle
,
9167 IN ACCESS_MASK DesiredAccess
,
9168 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9169 IN ULONG TitleIndex
,
9170 IN PUNICODE_STRING Class OPTIONAL
,
9171 IN ULONG CreateOptions
,
9172 OUT PULONG Disposition OPTIONAL
);
9178 OUT PHANDLE TimerHandle
,
9179 IN ACCESS_MASK DesiredAccess
,
9180 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
9181 IN TIMER_TYPE TimerType
);
9187 IN HANDLE KeyHandle
);
9193 IN HANDLE KeyHandle
,
9194 IN PUNICODE_STRING ValueName
);
9199 NtDeviceIoControlFile(
9200 IN HANDLE DeviceHandle
,
9201 IN HANDLE Event OPTIONAL
,
9202 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
9203 IN PVOID UserApcContext OPTIONAL
,
9204 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9205 IN ULONG IoControlCode
,
9206 IN PVOID InputBuffer
,
9207 IN ULONG InputBufferSize
,
9208 OUT PVOID OutputBuffer
,
9209 IN ULONG OutputBufferSize
);
9214 ZwDeviceIoControlFile(
9215 IN HANDLE DeviceHandle
,
9216 IN HANDLE Event OPTIONAL
,
9217 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
9218 IN PVOID UserApcContext OPTIONAL
,
9219 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9220 IN ULONG IoControlCode
,
9221 IN PVOID InputBuffer
,
9222 IN ULONG InputBufferSize
,
9223 OUT PVOID OutputBuffer
,
9224 IN ULONG OutputBufferSize
);
9230 IN HANDLE KeyHandle
,
9232 IN KEY_INFORMATION_CLASS KeyInformationClass
,
9233 OUT PVOID KeyInformation
,
9235 OUT PULONG ResultLength
);
9240 ZwEnumerateValueKey(
9241 IN HANDLE KeyHandle
,
9243 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
9244 OUT PVOID KeyValueInformation
,
9246 OUT PULONG ResultLength
);
9252 IN HANDLE KeyHandle
);
9257 ZwMakeTemporaryObject(
9264 IN HANDLE SectionHandle
,
9265 IN HANDLE ProcessHandle
,
9266 IN OUT PVOID
*BaseAddress
,
9268 IN ULONG CommitSize
,
9269 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
9270 IN OUT PSIZE_T ViewSize
,
9271 IN SECTION_INHERIT InheritDisposition
,
9272 IN ULONG AllocationType
,
9279 IN HANDLE SectionHandle
,
9280 IN HANDLE ProcessHandle
,
9281 IN OUT PVOID
*BaseAddress
,
9283 IN ULONG CommitSize
,
9284 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL
,
9285 IN OUT PSIZE_T ViewSize
,
9286 IN SECTION_INHERIT InheritDisposition
,
9287 IN ULONG AllocationType
,
9294 OUT PHANDLE FileHandle
,
9295 IN ACCESS_MASK DesiredAccess
,
9296 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9297 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9298 IN ULONG ShareAccess
,
9299 IN ULONG OpenOptions
);
9305 OUT PHANDLE FileHandle
,
9306 IN ACCESS_MASK DesiredAccess
,
9307 IN POBJECT_ATTRIBUTES ObjectAttributes
,
9308 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9309 IN ULONG ShareAccess
,
9310 IN ULONG OpenOptions
);
9316 OUT PHANDLE KeyHandle
,
9317 IN ACCESS_MASK DesiredAccess
,
9318 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9324 OUT PHANDLE SectionHandle
,
9325 IN ACCESS_MASK DesiredAccess
,
9326 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9331 ZwOpenSymbolicLinkObject(
9332 OUT PHANDLE LinkHandle
,
9333 IN ACCESS_MASK DesiredAccess
,
9334 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9340 OUT PHANDLE TimerHandle
,
9341 IN ACCESS_MASK DesiredAccess
,
9342 IN POBJECT_ATTRIBUTES ObjectAttributes
);
9347 ZwQueryInformationFile(
9348 IN HANDLE FileHandle
,
9349 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9350 OUT PVOID FileInformation
,
9352 IN FILE_INFORMATION_CLASS FileInformationClass
);
9358 IN HANDLE KeyHandle
,
9359 IN KEY_INFORMATION_CLASS KeyInformationClass
,
9360 OUT PVOID KeyInformation
,
9362 OUT PULONG ResultLength
);
9367 ZwQuerySymbolicLinkObject(
9368 IN HANDLE LinkHandle
,
9369 IN OUT PUNICODE_STRING LinkTarget
,
9370 OUT PULONG ReturnedLength OPTIONAL
);
9376 IN HANDLE KeyHandle
,
9377 IN PUNICODE_STRING ValueName
,
9378 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass
,
9379 OUT PVOID KeyValueInformation
,
9381 OUT PULONG ResultLength
);
9387 IN HANDLE FileHandle
,
9388 IN HANDLE Event OPTIONAL
,
9389 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
9390 IN PVOID ApcContext OPTIONAL
,
9391 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9394 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
9395 IN PULONG Key OPTIONAL
);
9401 IN HANDLE FileHandle
,
9402 IN HANDLE Event OPTIONAL
,
9403 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
9404 IN PVOID ApcContext OPTIONAL
,
9405 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9408 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
9409 IN PULONG Key OPTIONAL
);
9415 IN HANDLE EventHandle
,
9416 OUT PLONG PreviousState OPTIONAL
);
9422 IN HANDLE EventHandle
,
9423 OUT PLONG PreviousState OPTIONAL
);
9428 ZwSetInformationFile(
9429 IN HANDLE FileHandle
,
9430 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9431 IN PVOID FileInformation
,
9433 IN FILE_INFORMATION_CLASS FileInformationClass
);
9438 ZwSetInformationThread(
9439 IN HANDLE ThreadHandle
,
9440 IN THREADINFOCLASS ThreadInformationClass
,
9441 IN PVOID ThreadInformation
,
9442 IN ULONG ThreadInformationLength
);
9448 IN HANDLE TimerHandle
,
9449 IN PLARGE_INTEGER DueTime
,
9450 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL
,
9451 IN PVOID TimerContext OPTIONAL
,
9452 IN BOOLEAN WakeTimer
,
9453 IN LONG Period OPTIONAL
,
9454 OUT PBOOLEAN PreviousState OPTIONAL
);
9460 IN HANDLE KeyHandle
,
9461 IN PUNICODE_STRING ValueName
,
9462 IN ULONG TitleIndex OPTIONAL
,
9467 /* [Nt|Zw]MapViewOfSection.InheritDisposition constants */
9468 #define AT_EXTENDABLE_FILE 0x00002000
9469 #define SEC_NO_CHANGE 0x00400000
9470 #define AT_RESERVED 0x20000000
9471 #define AT_ROUND_TO_PAGE 0x40000000
9476 NtUnmapViewOfSection(
9477 IN HANDLE ProcessHandle
,
9478 IN PVOID BaseAddress
);
9483 ZwUnmapViewOfSection(
9484 IN HANDLE ProcessHandle
,
9485 IN PVOID BaseAddress
);
9490 NtWaitForSingleObject(
9491 IN HANDLE ObjectHandle
,
9492 IN BOOLEAN Alertable
,
9493 IN PLARGE_INTEGER TimeOut OPTIONAL
);
9498 ZwWaitForSingleObject(
9499 IN HANDLE ObjectHandle
,
9500 IN BOOLEAN Alertable
,
9501 IN PLARGE_INTEGER TimeOut OPTIONAL
);
9507 IN HANDLE FileHandle
,
9508 IN HANDLE Event OPTIONAL
,
9509 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
9510 IN PVOID ApcContext OPTIONAL
,
9511 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9514 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
9515 IN PULONG Key OPTIONAL
);
9521 IN HANDLE FileHandle
,
9522 IN HANDLE Event OPTIONAL
,
9523 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
9524 IN PVOID ApcContext OPTIONAL
,
9525 OUT PIO_STATUS_BLOCK IoStatusBlock
,
9528 IN PLARGE_INTEGER ByteOffset OPTIONAL
,
9529 IN PULONG Key OPTIONAL
);
9533 /** Power management support routines **/
9539 IN PDEVICE_OBJECT DeviceObject
,
9545 PoRegisterDeviceForIdleDetection(
9546 IN PDEVICE_OBJECT DeviceObject
,
9547 IN ULONG ConservationIdleTime
,
9548 IN ULONG PerformanceIdleTime
,
9549 IN DEVICE_POWER_STATE State
);
9554 PoRegisterSystemState(
9555 IN PVOID StateHandle
,
9556 IN EXECUTION_STATE Flags
);
9562 IN PDEVICE_OBJECT DeviceObject
,
9563 IN UCHAR MinorFunction
,
9564 IN POWER_STATE PowerState
,
9565 IN PREQUEST_POWER_COMPLETE CompletionFunction
,
9567 OUT PIRP
*Irp OPTIONAL
);
9572 PoRequestShutdownEvent(
9579 PULONG IdlePointer
);
9585 IN PDEVICE_OBJECT DeviceObject
,
9586 IN POWER_STATE_TYPE Type
,
9587 IN POWER_STATE State
);
9593 IN EXECUTION_STATE Flags
);
9598 PoStartNextPowerIrp(
9604 PoUnregisterSystemState(
9605 IN PVOID StateHandle
);
9609 /** WMI library support routines **/
9615 IN PDEVICE_OBJECT DeviceObject
,
9618 IN ULONG BufferUsed
,
9619 IN CCHAR PriorityBoost
);
9625 IN PDEVICE_OBJECT DeviceObject
,
9627 IN ULONG InstanceIndex
,
9628 IN ULONG EventDataSize
,
9629 IN PVOID EventData
);
9634 WmiQueryTraceInformation(
9635 IN TRACE_INFORMATION_CLASS TraceInformationClass
,
9636 OUT PVOID TraceInformation
,
9637 IN ULONG TraceInformationLength
,
9638 OUT PULONG RequiredLength OPTIONAL
,
9639 IN PVOID Buffer OPTIONAL
);
9645 IN PWMILIB_CONTEXT WmiLibInfo
,
9646 IN PDEVICE_OBJECT DeviceObject
,
9648 OUT PSYSCTL_IRP_DISPOSITION IrpDisposition
);
9654 IN TRACEHANDLE LoggerHandle
,
9655 IN ULONG MessageFlags
,
9656 IN LPGUID MessageGuid
,
9657 IN USHORT MessageNumber
,
9661 /* FIXME: Get va_list from where? */
9666 IN TRACEHANDLE LoggerHandle
,
9667 IN ULONG MessageFlags
,
9668 IN LPGUID MessageGuid
,
9669 IN USHORT MessageNumber
,
9670 IN
va_list MessageArgList
);
9674 /** Kernel debugger routines **/
9697 DbgBreakPointWithStatus(
9711 IN ULONG ComponentId
,
9719 DbgPrintReturnControlC(
9726 DbgQueryDebugFilterState(
9727 IN ULONG ComponentId
,
9733 DbgSetDebugFilterState(
9734 IN ULONG ComponentId
,
9741 KeRosPrintAddress ( PVOID address
);
9746 KeRosDumpStackFrames ( PULONG Frame
, ULONG FrameCount
);
9750 #define KdPrint(_x_) DbgPrint _x_
9751 #define KdPrintEx(_x_) DbgPrintEx _x_
9752 #define KdBreakPoint() DbgBreakPoint()
9753 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
9757 #define KdPrint(_x_)
9758 #define KdPrintEx(_x_)
9759 #define KdBreakPoint()
9760 #define KdBreakPointWithStatus(s)
9764 #if defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
9766 extern NTOSAPI PBOOLEAN KdDebuggerNotPresent
;
9767 extern NTOSAPI PBOOLEAN KdDebuggerEnabled
;
9768 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
9769 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
9773 extern BOOLEAN KdDebuggerNotPresent
;
9774 extern BOOLEAN KdDebuggerEnabled
;
9775 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
9776 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
9784 #endif /* __WINDDK_H */