4 /* Helper macro to enable gcc's extension. */
5 #ifndef __GNU_EXTENSION
7 #define __GNU_EXTENSION __extension__
9 #define __GNU_EXTENSION
23 #endif /* GUID_DEFINED */
31 #define NTKERNELAPI DECLSPEC_IMPORT
34 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
36 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
43 // Indicate if #pragma alloc_text() is supported
45 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
46 #define ALLOC_PRAGMA 1
50 // Indicate if #pragma data_seg() is supported
52 #if defined(_M_IX86) || defined(_M_AMD64)
53 #define ALLOC_DATA_PRAGMA 1
62 #define ALIGN_DOWN(s, t) \
63 ((ULONG)(s) & ~(sizeof(t) - 1))
65 #define ALIGN_UP(s, t) \
66 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
68 #define ALIGN_DOWN_POINTER(p, t) \
69 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
71 #define ALIGN_UP_POINTER(p, t) \
72 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
78 #ifndef __IID_ALIGNED__
79 #define __IID_ALIGNED__
81 inline int IsEqualGUIDAligned(REFGUID guid1
, REFGUID guid2
)
83 return ((*(PLONGLONG
)(&guid1
) == *(PLONGLONG
)(&guid2
)) && (*((PLONGLONG
)(&guid1
) + 1) == *((PLONGLONG
)(&guid2
) + 1)));
86 #define IsEqualGUIDAligned(guid1, guid2) \
87 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
92 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
94 #define POINTER_ALIGNMENT
98 ** Forward declarations
107 struct _DEVICE_OBJECT
;
108 struct _DRIVER_OBJECT
;
109 struct _IO_STATUS_BLOCK
;
110 struct _DEVICE_DESCRIPTION
;
111 struct _SCATTER_GATHER_LIST
;
112 struct _DRIVE_LAYOUT_INFORMATION
;
114 struct _COMPRESSED_DATA_INFO
;
119 typedef UCHAR KPROCESSOR_MODE
;
120 typedef LONG KPRIORITY
;
121 typedef PVOID PSECURITY_DESCRIPTOR
;
122 typedef ULONG SECURITY_INFORMATION
, *PSECURITY_INFORMATION
;
124 /* Structures not exposed to drivers */
125 typedef struct _OBJECT_TYPE
*POBJECT_TYPE
;
126 typedef struct _HAL_DISPATCH_TABLE
*PHAL_DISPATCH_TABLE
;
127 typedef struct _HAL_PRIVATE_DISPATCH_TABLE
*PHAL_PRIVATE_DISPATCH_TABLE
;
128 typedef struct _DEVICE_HANDLER_OBJECT
*PDEVICE_HANDLER_OBJECT
;
129 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
131 typedef struct _ADAPTER_OBJECT
*PADAPTER_OBJECT
;
132 typedef struct _CALLBACK_OBJECT
*PCALLBACK_OBJECT
;
133 typedef struct _ETHREAD
*PETHREAD
;
134 typedef struct _EPROCESS
*PEPROCESS
;
135 typedef struct _IO_TIMER
*PIO_TIMER
;
136 typedef struct _KINTERRUPT
*PKINTERRUPT
;
137 typedef struct _KPROCESS
*PKPROCESS
;
138 typedef struct _KTHREAD
*PKTHREAD
, *PRKTHREAD
;
141 typedef struct _CONTEXT
*PCONTEXT
;
147 typedef UCHAR KIRQL
, *PKIRQL
;
156 // Power States/Levels
158 typedef enum _SYSTEM_POWER_STATE
{
159 PowerSystemUnspecified
,
161 PowerSystemSleeping1
,
162 PowerSystemSleeping2
,
163 PowerSystemSleeping3
,
164 PowerSystemHibernate
,
167 } SYSTEM_POWER_STATE
, *PSYSTEM_POWER_STATE
;
169 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
171 typedef enum _POWER_INFORMATION_LEVEL
{
174 VerifySystemPolicyAc
,
175 VerifySystemPolicyDc
,
176 SystemPowerCapabilities
,
178 SystemPowerStateHandler
,
179 ProcessorStateHandler
,
180 SystemPowerPolicyCurrent
,
181 AdministratorPowerPolicy
,
182 SystemReserveHiberFile
,
183 ProcessorInformation
,
184 SystemPowerInformation
,
185 ProcessorStateHandler2
,
188 SystemExecutionState
,
189 SystemPowerStateNotifyHandler
,
190 ProcessorPowerPolicyAc
,
191 ProcessorPowerPolicyDc
,
192 VerifyProcessorPowerPolicyAc
,
193 VerifyProcessorPowerPolicyDc
,
194 ProcessorPowerPolicyCurrent
195 } POWER_INFORMATION_LEVEL
;
201 PowerActionHibernate
,
203 PowerActionShutdownReset
,
204 PowerActionShutdownOff
,
206 } POWER_ACTION
, *PPOWER_ACTION
;
208 typedef enum _DEVICE_POWER_STATE
{
209 PowerDeviceUnspecified
,
215 } DEVICE_POWER_STATE
, *PDEVICE_POWER_STATE
;
217 #define ES_SYSTEM_REQUIRED 0x00000001
218 #define ES_DISPLAY_REQUIRED 0x00000002
219 #define ES_USER_PRESENT 0x00000004
220 #define ES_CONTINUOUS 0x80000000
222 typedef ULONG EXECUTION_STATE
;
230 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
231 #define ZwCurrentProcess() NtCurrentProcess()
232 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
233 #define ZwCurrentThread() NtCurrentThread()
236 #define KIP0PCRADDRESS 0xffdff000
240 #define MAXIMUM_PROCESSORS 64
242 #define MAXIMUM_PROCESSORS 32
245 #define MAXIMUM_WAIT_OBJECTS 64
247 #define EX_RUNDOWN_ACTIVE 0x1
248 #define EX_RUNDOWN_COUNT_SHIFT 0x1
249 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
251 #define METHOD_BUFFERED 0
252 #define METHOD_IN_DIRECT 1
253 #define METHOD_OUT_DIRECT 2
254 #define METHOD_NEITHER 3
256 #define LOW_PRIORITY 0
257 #define LOW_REALTIME_PRIORITY 16
258 #define HIGH_PRIORITY 31
259 #define MAXIMUM_PRIORITY 32
261 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
263 #define MAXIMUM_FILENAME_LENGTH 256
265 #define FILE_SUPERSEDED 0x00000000
266 #define FILE_OPENED 0x00000001
267 #define FILE_CREATED 0x00000002
268 #define FILE_OVERWRITTEN 0x00000003
269 #define FILE_EXISTS 0x00000004
270 #define FILE_DOES_NOT_EXIST 0x00000005
272 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
273 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
275 /* also in winnt.h */
276 #define FILE_LIST_DIRECTORY 0x00000001
277 #define FILE_READ_DATA 0x00000001
278 #define FILE_ADD_FILE 0x00000002
279 #define FILE_WRITE_DATA 0x00000002
280 #define FILE_ADD_SUBDIRECTORY 0x00000004
281 #define FILE_APPEND_DATA 0x00000004
282 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
283 #define FILE_READ_EA 0x00000008
284 #define FILE_WRITE_EA 0x00000010
285 #define FILE_EXECUTE 0x00000020
286 #define FILE_TRAVERSE 0x00000020
287 #define FILE_DELETE_CHILD 0x00000040
288 #define FILE_READ_ATTRIBUTES 0x00000080
289 #define FILE_WRITE_ATTRIBUTES 0x00000100
291 #define FILE_SHARE_READ 0x00000001
292 #define FILE_SHARE_WRITE 0x00000002
293 #define FILE_SHARE_DELETE 0x00000004
294 #define FILE_SHARE_VALID_FLAGS 0x00000007
296 #define FILE_ATTRIBUTE_READONLY 0x00000001
297 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
298 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
299 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
300 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
301 #define FILE_ATTRIBUTE_DEVICE 0x00000040
302 #define FILE_ATTRIBUTE_NORMAL 0x00000080
303 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
304 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
305 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
306 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
307 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
308 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
309 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
311 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
312 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
314 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
315 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
316 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
317 #define FILE_VALID_SET_FLAGS 0x00000036
319 #define FILE_SUPERSEDE 0x00000000
320 #define FILE_OPEN 0x00000001
321 #define FILE_CREATE 0x00000002
322 #define FILE_OPEN_IF 0x00000003
323 #define FILE_OVERWRITE 0x00000004
324 #define FILE_OVERWRITE_IF 0x00000005
325 #define FILE_MAXIMUM_DISPOSITION 0x00000005
327 #define FILE_DIRECTORY_FILE 0x00000001
328 #define FILE_WRITE_THROUGH 0x00000002
329 #define FILE_SEQUENTIAL_ONLY 0x00000004
330 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
331 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
332 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
333 #define FILE_NON_DIRECTORY_FILE 0x00000040
334 #define FILE_CREATE_TREE_CONNECTION 0x00000080
335 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
336 #define FILE_NO_EA_KNOWLEDGE 0x00000200
337 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
338 #define FILE_RANDOM_ACCESS 0x00000800
339 #define FILE_DELETE_ON_CLOSE 0x00001000
340 #define FILE_OPEN_BY_FILE_ID 0x00002000
341 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
342 #define FILE_NO_COMPRESSION 0x00008000
343 #define FILE_RESERVE_OPFILTER 0x00100000
344 #define FILE_OPEN_REPARSE_POINT 0x00200000
345 #define FILE_OPEN_NO_RECALL 0x00400000
346 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
348 #define FILE_ANY_ACCESS 0x00000000
349 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
350 #define FILE_READ_ACCESS 0x00000001
351 #define FILE_WRITE_ACCESS 0x00000002
353 #define FILE_ALL_ACCESS \
354 (STANDARD_RIGHTS_REQUIRED | \
358 #define FILE_GENERIC_EXECUTE \
359 (STANDARD_RIGHTS_EXECUTE | \
360 FILE_READ_ATTRIBUTES | \
364 #define FILE_GENERIC_READ \
365 (STANDARD_RIGHTS_READ | \
367 FILE_READ_ATTRIBUTES | \
371 #define FILE_GENERIC_WRITE \
372 (STANDARD_RIGHTS_WRITE | \
374 FILE_WRITE_ATTRIBUTES | \
381 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
383 #define OBJECT_TYPE_CREATE (0x0001)
384 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
386 #define DIRECTORY_QUERY (0x0001)
387 #define DIRECTORY_TRAVERSE (0x0002)
388 #define DIRECTORY_CREATE_OBJECT (0x0004)
389 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
390 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
392 #define EVENT_QUERY_STATE (0x0001)
393 #define EVENT_MODIFY_STATE (0x0002)
394 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
396 #define SEMAPHORE_QUERY_STATE (0x0001)
397 #define SEMAPHORE_MODIFY_STATE (0x0002)
398 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
400 #define FM_LOCK_BIT (0x1)
401 #define FM_LOCK_BIT_V (0x0)
402 #define FM_LOCK_WAITER_WOKEN (0x2)
403 #define FM_LOCK_WAITER_INC (0x4)
409 #define SYMBOLIC_LINK_QUERY 0x0001
410 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
412 /* also in winnt,h */
413 #define DUPLICATE_CLOSE_SOURCE 0x00000001
414 #define DUPLICATE_SAME_ACCESS 0x00000002
415 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
418 typedef struct _OBJECT_NAME_INFORMATION
{
420 } OBJECT_NAME_INFORMATION
, *POBJECT_NAME_INFORMATION
;
423 // Resource list definitions
425 typedef int CM_RESOURCE_TYPE
;
427 #define CmResourceTypeNull 0
428 #define CmResourceTypePort 1
429 #define CmResourceTypeInterrupt 2
430 #define CmResourceTypeMemory 3
431 #define CmResourceTypeDma 4
432 #define CmResourceTypeDeviceSpecific 5
433 #define CmResourceTypeBusNumber 6
434 #define CmResourceTypeNonArbitrated 128
435 #define CmResourceTypeConfigData 128
436 #define CmResourceTypeDevicePrivate 129
437 #define CmResourceTypePcCardConfig 130
438 #define CmResourceTypeMfCardConfig 131
443 extern ULONG NtGlobalFlag
;
446 // Section map options
448 typedef enum _SECTION_INHERIT
{
454 // Section access rights
456 #define SECTION_QUERY 0x0001
457 #define SECTION_MAP_WRITE 0x0002
458 #define SECTION_MAP_READ 0x0004
459 #define SECTION_MAP_EXECUTE 0x0008
460 #define SECTION_EXTEND_SIZE 0x0010
461 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
463 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
464 SECTION_MAP_WRITE | \
466 SECTION_MAP_EXECUTE | \
469 #define SESSION_QUERY_ACCESS 0x0001
470 #define SESSION_MODIFY_ACCESS 0x0002
472 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
473 SESSION_QUERY_ACCESS | \
474 SESSION_MODIFY_ACCESS)
478 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
480 #define PAGE_NOACCESS 0x01
481 #define PAGE_READONLY 0x02
482 #define PAGE_READWRITE 0x04
483 #define PAGE_WRITECOPY 0x08
484 #define PAGE_EXECUTE 0x10
485 #define PAGE_EXECUTE_READ 0x20
486 #define PAGE_EXECUTE_READWRITE 0x40
487 #define PAGE_EXECUTE_WRITECOPY 0x80
488 #define PAGE_GUARD 0x100
489 #define PAGE_NOCACHE 0x200
490 #define PAGE_WRITECOMBINE 0x400
492 #define MEM_COMMIT 0x1000
493 #define MEM_RESERVE 0x2000
494 #define MEM_DECOMMIT 0x4000
495 #define MEM_RELEASE 0x8000
496 #define MEM_FREE 0x10000
497 #define MEM_PRIVATE 0x20000
498 #define MEM_MAPPED 0x40000
499 #define MEM_RESET 0x80000
500 #define MEM_TOP_DOWN 0x100000
501 #define MEM_LARGE_PAGES 0x20000000
502 #define MEM_4MB_PAGES 0x80000000
504 #define SEC_RESERVE 0x4000000
505 #define SEC_LARGE_PAGES 0x80000000
507 #define PROCESS_DUP_HANDLE (0x0040)
509 #if (NTDDI_VERSION >= NTDDI_VISTA)
510 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
513 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
520 // Processor features
522 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
523 #define PF_FLOATING_POINT_EMULATED 1
524 #define PF_COMPARE_EXCHANGE_DOUBLE 2
525 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
526 #define PF_PPC_MOVEMEM_64BIT_OK 4
527 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
528 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
529 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
530 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
531 #define PF_PAE_ENABLED 9
532 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
533 #define PF_SSE_DAZ_MODE_AVAILABLE 11
534 #define PF_NX_ENABLED 12
535 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
536 #define PF_COMPARE_EXCHANGE128 14
537 #define PF_COMPARE64_EXCHANGE128 15
538 #define PF_CHANNELS_ENABLED 16
543 // Intrinsics (note: taken from our winnt.h)
546 #if defined(__GNUC__)
548 static __inline__ BOOLEAN
549 InterlockedBitTestAndSet(IN LONG
volatile *Base
,
554 __asm__
__volatile__("lock "
557 :"=r" (OldBit
),"+m" (*Base
)
562 return (_InterlockedOr(Base
, 1 << Bit
) >> Bit
) & 1;
566 static __inline__ BOOLEAN
567 InterlockedBitTestAndReset(IN LONG
volatile *Base
,
572 __asm__
__volatile__("lock "
575 :"=r" (OldBit
),"+m" (*Base
)
580 return (_InterlockedAnd(Base
, ~(1 << Bit
)) >> Bit
) & 1;
586 #define BitScanForward _BitScanForward
587 #define BitScanReverse _BitScanReverse
589 #define BitTest _bittest
590 #define BitTestAndComplement _bittestandcomplement
591 #define BitTestAndSet _bittestandset
592 #define BitTestAndReset _bittestandreset
593 #define InterlockedBitTestAndSet _interlockedbittestandset
594 #define InterlockedBitTestAndReset _interlockedbittestandreset
597 /** INTERLOCKED FUNCTIONS *****************************************************/
599 #if !defined(__INTERLOCKED_DECLARED)
600 #define __INTERLOCKED_DECLARED
603 #if defined(NO_INTERLOCKED_INTRINSICS)
607 InterlockedIncrement(
608 IN OUT LONG
volatile *Addend
);
613 InterlockedDecrement(
614 IN OUT LONG
volatile *Addend
);
619 InterlockedCompareExchange(
620 IN OUT LONG
volatile *Destination
,
628 IN OUT LONG
volatile *Destination
,
634 InterlockedExchangeAdd(
635 IN OUT LONG
volatile *Addend
,
638 #else // !defined(NO_INTERLOCKED_INTRINSICS)
640 #define InterlockedExchange _InterlockedExchange
641 #define InterlockedIncrement _InterlockedIncrement
642 #define InterlockedDecrement _InterlockedDecrement
643 #define InterlockedExchangeAdd _InterlockedExchangeAdd
644 #define InterlockedCompareExchange _InterlockedCompareExchange
645 #define InterlockedOr _InterlockedOr
646 #define InterlockedAnd _InterlockedAnd
647 #define InterlockedXor _InterlockedXor
649 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
651 #endif // defined (_X86_)
653 #if !defined (_WIN64)
656 * InterlockedExchangePointer(
657 * IN OUT PVOID volatile *Target,
660 #define InterlockedExchangePointer(Target, Value) \
661 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
665 * InterlockedCompareExchangePointer(
666 * IN OUT PVOID *Destination,
668 * IN PVOID Comparand)
670 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
671 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
673 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
674 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
675 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
677 #endif // !defined (_WIN64)
679 #if defined (_M_AMD64)
681 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
682 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
683 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
684 #define InterlockedAnd _InterlockedAnd
685 #define InterlockedOr _InterlockedOr
686 #define InterlockedXor _InterlockedXor
687 #define InterlockedIncrement _InterlockedIncrement
688 #define InterlockedDecrement _InterlockedDecrement
689 #define InterlockedAdd _InterlockedAdd
690 #define InterlockedExchange _InterlockedExchange
691 #define InterlockedExchangeAdd _InterlockedExchangeAdd
692 #define InterlockedCompareExchange _InterlockedCompareExchange
693 #define InterlockedAnd64 _InterlockedAnd64
694 #define InterlockedOr64 _InterlockedOr64
695 #define InterlockedXor64 _InterlockedXor64
696 #define InterlockedIncrement64 _InterlockedIncrement64
697 #define InterlockedDecrement64 _InterlockedDecrement64
698 #define InterlockedAdd64 _InterlockedAdd64
699 #define InterlockedExchange64 _InterlockedExchange64
700 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
701 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
702 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
703 #define InterlockedExchangePointer _InterlockedExchangePointer
704 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
705 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
709 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
710 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
714 IN OUT LONG64
volatile *Addend
,
717 return InterlockedExchangeAdd64(Addend
, Value
) + Value
;
722 #endif /* !__INTERLOCKED_DECLARED */
725 #define YieldProcessor _mm_pause
726 #elif defined (_M_AMD64)
727 #define YieldProcessor _mm_pause
728 #elif defined(_M_PPC)
729 #define YieldProcessor() __asm__ __volatile__("nop");
730 #elif defined(_M_MIPS)
731 #define YieldProcessor() __asm__ __volatile__("nop");
732 #elif defined(_M_ARM)
733 #define YieldProcessor()
735 #error Unknown architecture
741 #ifndef _SLIST_HEADER_
742 #define _SLIST_HEADER_
745 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
*PSLIST_ENTRY
;
746 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY
{
749 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER
{
756 ULONGLONG Sequence
:9;
757 ULONGLONG NextEntry
:39;
758 ULONGLONG HeaderType
:1;
760 ULONGLONG Reserved
:59;
765 ULONGLONG Sequence
:48;
766 ULONGLONG HeaderType
:1;
768 ULONGLONG Reserved
:2;
769 ULONGLONG NextEntry
:60;
771 } SLIST_HEADER
, *PSLIST_HEADER
;
773 #define SLIST_ENTRY SINGLE_LIST_ENTRY
774 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
775 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
776 typedef union _SLIST_HEADER
{
783 } SLIST_HEADER
, *PSLIST_HEADER
;
786 #endif /* _SLIST_HEADER_ */
789 // Thread Access Rights
791 #define THREAD_TERMINATE (0x0001)
792 #define THREAD_SUSPEND_RESUME (0x0002)
793 #define THREAD_ALERT (0x0004)
794 #define THREAD_GET_CONTEXT (0x0008)
795 #define THREAD_SET_CONTEXT (0x0010)
796 #define THREAD_SET_INFORMATION (0x0020)
797 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
798 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
799 #if (NTDDI_VERSION >= NTDDI_VISTA)
800 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
803 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
808 // Service Start Types
810 #define SERVICE_BOOT_START 0x00000000
811 #define SERVICE_SYSTEM_START 0x00000001
812 #define SERVICE_AUTO_START 0x00000002
813 #define SERVICE_DEMAND_START 0x00000003
814 #define SERVICE_DISABLED 0x00000004
819 #define EXCEPTION_NONCONTINUABLE 1
820 #define EXCEPTION_MAXIMUM_PARAMETERS 15
822 typedef struct _EXCEPTION_RECORD
{
823 NTSTATUS ExceptionCode
;
824 ULONG ExceptionFlags
;
825 struct _EXCEPTION_RECORD
*ExceptionRecord
;
826 PVOID ExceptionAddress
;
827 ULONG NumberParameters
;
828 ULONG_PTR ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
829 } EXCEPTION_RECORD
, *PEXCEPTION_RECORD
;
831 typedef struct _EXCEPTION_RECORD32
{
832 NTSTATUS ExceptionCode
;
833 ULONG ExceptionFlags
;
834 ULONG ExceptionRecord
;
835 ULONG ExceptionAddress
;
836 ULONG NumberParameters
;
837 ULONG ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
838 } EXCEPTION_RECORD32
, *PEXCEPTION_RECORD32
;
840 typedef struct _EXCEPTION_RECORD64
{
841 NTSTATUS ExceptionCode
;
842 ULONG ExceptionFlags
;
843 ULONG64 ExceptionRecord
;
844 ULONG64 ExceptionAddress
;
845 ULONG NumberParameters
;
846 ULONG __unusedAlignment
;
847 ULONG64 ExceptionInformation
[EXCEPTION_MAXIMUM_PARAMETERS
];
848 } EXCEPTION_RECORD64
, *PEXCEPTION_RECORD64
;
850 typedef struct _EXCEPTION_POINTERS
{
851 PEXCEPTION_RECORD ExceptionRecord
;
852 PCONTEXT ContextRecord
;
853 } EXCEPTION_POINTERS
, *PEXCEPTION_POINTERS
;
860 typedef struct _QUOTA_LIMITS
{
861 SIZE_T PagedPoolLimit
;
862 SIZE_T NonPagedPoolLimit
;
863 SIZE_T MinimumWorkingSetSize
;
864 SIZE_T MaximumWorkingSetSize
;
865 SIZE_T PagefileLimit
;
866 LARGE_INTEGER TimeLimit
;
867 } QUOTA_LIMITS
, *PQUOTA_LIMITS
;
869 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
870 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
871 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
872 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
873 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
876 /******************************************************************************
877 * WINBASE Functions *
878 ******************************************************************************/
879 #if !defined(_WINBASE_)
883 #define InterlockedPopEntrySList(Head) \
884 ExpInterlockedPopEntrySList(Head)
886 #define InterlockedPushEntrySList(Head, Entry) \
887 ExpInterlockedPushEntrySList(Head, Entry)
889 #define InterlockedFlushSList(Head) \
890 ExpInterlockedFlushSList(Head)
892 #define QueryDepthSList(Head) \
893 ExQueryDepthSList(Head)
895 #else // !defined(_WIN64)
900 InterlockedPopEntrySList(
901 IN PSLIST_HEADER ListHead
);
906 InterlockedPushEntrySList(
907 IN PSLIST_HEADER ListHead
,
908 IN PSLIST_ENTRY ListEntry
);
910 #define InterlockedFlushSList(ListHead) \
911 ExInterlockedFlushSList(ListHead)
913 #define QueryDepthSList(Head) \
914 ExQueryDepthSList(Head)
916 #endif // !defined(_WIN64)
918 #endif // !defined(_WINBASE_)
920 /******************************************************************************
922 ******************************************************************************/
924 #define ASSERT_APC(Object) \
925 ASSERT((Object)->Type == ApcObject)
927 #define ASSERT_DPC(Object) \
928 ASSERT(((Object)->Type == 0) || \
929 ((Object)->Type == DpcObject) || \
930 ((Object)->Type == ThreadedDpcObject))
932 #define ASSERT_DEVICE_QUEUE(Object) \
933 ASSERT((Object)->Type == DeviceQueueObject)
936 #define DPC_THREADED 1
938 #define GM_LOCK_BIT 0x1
939 #define GM_LOCK_BIT_V 0x0
940 #define GM_LOCK_WAITER_WOKEN 0x2
941 #define GM_LOCK_WAITER_INC 0x4
943 #define LOCK_QUEUE_WAIT 1
944 #define LOCK_QUEUE_OWNER 2
945 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
946 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
948 #define PROCESSOR_FEATURE_MAX 64
950 typedef enum _KINTERRUPT_POLARITY
{
951 InterruptPolarityUnknown
,
954 } KINTERRUPT_POLARITY
, *PKINTERRUPT_POLARITY
;
956 typedef enum _KPROFILE_SOURCE
{
958 ProfileAlignmentFixup
,
961 ProfileLoadInstructions
,
962 ProfilePipelineFrozen
,
963 ProfileBranchInstructions
,
964 ProfileTotalNonissues
,
968 ProfileBranchMispredictions
,
969 ProfileStoreInstructions
,
970 ProfileFpInstructions
,
971 ProfileIntegerInstructions
,
975 ProfileSpecialInstructions
,
978 ProfileDcacheAccesses
,
979 ProfileMemoryBarrierCycles
,
980 ProfileLoadLinkedIssues
,
984 typedef enum _KWAIT_REASON
{
1025 typedef enum _KD_OPTION
{
1026 KD_OPTION_SET_BLOCK_ENABLE
,
1029 typedef enum _INTERFACE_TYPE
{
1030 InterfaceTypeUndefined
= -1,
1047 MaximumInterfaceType
1048 } INTERFACE_TYPE
, *PINTERFACE_TYPE
;
1051 (DDKAPI
*PKNORMAL_ROUTINE
)(
1052 IN PVOID NormalContext
,
1053 IN PVOID SystemArgument1
,
1054 IN PVOID SystemArgument2
);
1057 (DDKAPI
*PKRUNDOWN_ROUTINE
)(
1058 IN
struct _KAPC
*Apc
);
1061 (DDKAPI
*PKKERNEL_ROUTINE
)(
1062 IN
struct _KAPC
*Apc
,
1063 IN OUT PKNORMAL_ROUTINE
*NormalRoutine
,
1064 IN OUT PVOID
*NormalContext
,
1065 IN OUT PVOID
*SystemArgument1
,
1066 IN OUT PVOID
*SystemArgument2
);
1068 typedef struct _KAPC
1075 struct _KTHREAD
*Thread
;
1076 LIST_ENTRY ApcListEntry
;
1077 PKKERNEL_ROUTINE KernelRoutine
;
1078 PKRUNDOWN_ROUTINE RundownRoutine
;
1079 PKNORMAL_ROUTINE NormalRoutine
;
1080 PVOID NormalContext
;
1081 PVOID SystemArgument1
;
1082 PVOID SystemArgument2
;
1083 CCHAR ApcStateIndex
;
1084 KPROCESSOR_MODE ApcMode
;
1086 } KAPC
, *PKAPC
, *RESTRICTED_POINTER PRKAPC
;
1088 typedef struct _KDEVICE_QUEUE_ENTRY
{
1089 LIST_ENTRY DeviceListEntry
;
1092 } KDEVICE_QUEUE_ENTRY
, *PKDEVICE_QUEUE_ENTRY
,
1093 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY
;
1095 typedef PVOID PKIPI_CONTEXT
;
1099 (NTAPI
*PKIPI_WORKER
)(
1100 IN PKIPI_CONTEXT PacketContext
,
1101 IN PVOID Parameter1
,
1102 IN PVOID Parameter2
,
1106 typedef ULONG_PTR KSPIN_LOCK
, *PKSPIN_LOCK
;
1108 typedef struct _KSPIN_LOCK_QUEUE
{
1109 struct _KSPIN_LOCK_QUEUE
*volatile Next
;
1110 PKSPIN_LOCK
volatile Lock
;
1111 } KSPIN_LOCK_QUEUE
, *PKSPIN_LOCK_QUEUE
;
1113 typedef struct _KLOCK_QUEUE_HANDLE
{
1114 KSPIN_LOCK_QUEUE LockQueue
;
1116 } KLOCK_QUEUE_HANDLE
, *PKLOCK_QUEUE_HANDLE
;
1118 #if defined(_AMD64_)
1120 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER
;
1122 #define LockQueueDispatcherLock 0
1123 #define LockQueueExpansionLock 1
1124 #define LockQueuePfnLock 2
1125 #define LockQueueSystemSpaceLock 3
1126 #define LockQueueVacbLock 4
1127 #define LockQueueMasterLock 5
1128 #define LockQueueNonPagedPoolLock 6
1129 #define LockQueueIoCancelLock 7
1130 #define LockQueueWorkQueueLock 8
1131 #define LockQueueIoVpbLock 9
1132 #define LockQueueIoDatabaseLock 10
1133 #define LockQueueIoCompletionLock 11
1134 #define LockQueueNtfsStructLock 12
1135 #define LockQueueAfdWorkQueueLock 13
1136 #define LockQueueBcbLock 14
1137 #define LockQueueMmNonPagedPoolLock 15
1138 #define LockQueueUnusedSpare16 16
1139 #define LockQueueTimerTableLock 17
1140 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
1144 typedef enum _KSPIN_LOCK_QUEUE_NUMBER
{
1145 LockQueueDispatcherLock
,
1146 LockQueueExpansionLock
,
1148 LockQueueSystemSpaceLock
,
1150 LockQueueMasterLock
,
1151 LockQueueNonPagedPoolLock
,
1152 LockQueueIoCancelLock
,
1153 LockQueueWorkQueueLock
,
1155 LockQueueIoDatabaseLock
,
1156 LockQueueIoCompletionLock
,
1157 LockQueueNtfsStructLock
,
1158 LockQueueAfdWorkQueueLock
,
1160 LockQueueMmNonPagedPoolLock
,
1161 LockQueueUnusedSpare16
,
1162 LockQueueTimerTableLock
,
1163 LockQueueMaximumLock
= LockQueueTimerTableLock
+ LOCK_QUEUE_TIMER_TABLE_LOCKS
1164 } KSPIN_LOCK_QUEUE_NUMBER
, *PKSPIN_LOCK_QUEUE_NUMBER
;
1169 (DDKAPI
*PKDEFERRED_ROUTINE
)(
1170 IN
struct _KDPC
*Dpc
,
1171 IN PVOID DeferredContext
,
1172 IN PVOID SystemArgument1
,
1173 IN PVOID SystemArgument2
);
1175 typedef struct _KDPC
1179 volatile USHORT Number
;
1180 LIST_ENTRY DpcListEntry
;
1181 PKDEFERRED_ROUTINE DeferredRoutine
;
1182 PVOID DeferredContext
;
1183 PVOID SystemArgument1
;
1184 PVOID SystemArgument2
;
1185 volatile PVOID DpcData
;
1186 } KDPC
, *PKDPC
, *RESTRICTED_POINTER PRKDPC
;
1188 typedef enum _IO_ALLOCATION_ACTION
{
1191 DeallocateObjectKeepRegisters
1192 } IO_ALLOCATION_ACTION
, *PIO_ALLOCATION_ACTION
;
1194 typedef IO_ALLOCATION_ACTION
1195 (DDKAPI
*PDRIVER_CONTROL
)(
1196 IN
struct _DEVICE_OBJECT
*DeviceObject
,
1197 IN
struct _IRP
*Irp
,
1198 IN PVOID MapRegisterBase
,
1201 typedef struct _WAIT_CONTEXT_BLOCK
{
1202 KDEVICE_QUEUE_ENTRY WaitQueueEntry
;
1203 PDRIVER_CONTROL DeviceRoutine
;
1204 PVOID DeviceContext
;
1205 ULONG NumberOfMapRegisters
;
1208 PKDPC BufferChainingDpc
;
1209 } WAIT_CONTEXT_BLOCK
, *PWAIT_CONTEXT_BLOCK
;
1211 typedef struct _KDEVICE_QUEUE
{
1214 LIST_ENTRY DeviceListHead
;
1216 #if defined(_AMD64_)
1220 LONG64 Reserved
: 8;
1228 } KDEVICE_QUEUE
, *PKDEVICE_QUEUE
, *RESTRICTED_POINTER PRKDEVICE_QUEUE
;
1230 typedef struct _DISPATCHER_HEADER
1232 __GNU_EXTENSION
union
1234 __GNU_EXTENSION
struct
1237 __GNU_EXTENSION
union
1242 __GNU_EXTENSION
union
1247 __GNU_EXTENSION
union
1250 BOOLEAN DebugActive
;
1256 LIST_ENTRY WaitListHead
;
1257 } DISPATCHER_HEADER
, *PDISPATCHER_HEADER
;
1259 typedef struct _KGATE
1261 DISPATCHER_HEADER Header
;
1262 } KGATE
, *PKGATE
, *RESTRICTED_POINTER PRKGATE
;
1264 typedef struct _KGUARDED_MUTEX
1266 volatile LONG Count
;
1270 __GNU_EXTENSION
union
1272 __GNU_EXTENSION
struct
1274 SHORT KernelApcDisable
;
1275 SHORT SpecialApcDisable
;
1277 ULONG CombinedApcDisable
;
1279 } KGUARDED_MUTEX
, *PKGUARDED_MUTEX
;
1281 typedef struct _KMUTANT
{
1282 DISPATCHER_HEADER Header
;
1283 LIST_ENTRY MutantListEntry
;
1284 struct _KTHREAD
*RESTRICTED_POINTER OwnerThread
;
1287 } KMUTANT
, *PKMUTANT
, *RESTRICTED_POINTER PRKMUTANT
, KMUTEX
, *PKMUTEX
, *RESTRICTED_POINTER PRKMUTEX
;
1289 typedef struct _KTIMER
{
1290 DISPATCHER_HEADER Header
;
1291 ULARGE_INTEGER DueTime
;
1292 LIST_ENTRY TimerListEntry
;
1298 } KTIMER
, *PKTIMER
, *RESTRICTED_POINTER PRKTIMER
;
1300 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
1305 } ALTERNATIVE_ARCHITECTURE_TYPE
;
1307 typedef struct _KSYSTEM_TIME
1312 } KSYSTEM_TIME
, *PKSYSTEM_TIME
;
1314 typedef struct _KEVENT
{
1315 DISPATCHER_HEADER Header
;
1316 } KEVENT
, *PKEVENT
, *RESTRICTED_POINTER PRKEVENT
;
1318 typedef struct _KSEMAPHORE
{
1319 DISPATCHER_HEADER Header
;
1321 } KSEMAPHORE
, *PKSEMAPHORE
, *RESTRICTED_POINTER PRKSEMAPHORE
;
1323 typedef struct _PNP_BUS_INFORMATION
{
1325 INTERFACE_TYPE LegacyBusType
;
1327 } PNP_BUS_INFORMATION
, *PPNP_BUS_INFORMATION
;
1329 /******************************************************************************
1330 * Memory manager Types *
1331 ******************************************************************************/
1333 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1334 #define MDL_PAGES_LOCKED 0x0002
1335 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1336 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1337 #define MDL_PARTIAL 0x0010
1338 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1339 #define MDL_IO_PAGE_READ 0x0040
1340 #define MDL_WRITE_OPERATION 0x0080
1341 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1342 #define MDL_FREE_EXTRA_PTES 0x0200
1343 #define MDL_DESCRIBES_AWE 0x0400
1344 #define MDL_IO_SPACE 0x0800
1345 #define MDL_NETWORK_HEADER 0x1000
1346 #define MDL_MAPPING_CAN_FAIL 0x2000
1347 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1348 #define MDL_INTERNAL 0x8000
1350 #define MDL_MAPPING_FLAGS ( \
1351 MDL_MAPPED_TO_SYSTEM_VA | \
1352 MDL_PAGES_LOCKED | \
1353 MDL_SOURCE_IS_NONPAGED_POOL | \
1354 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1355 MDL_PARENT_MAPPED_SYSTEM_VA | \
1359 typedef struct _MDL
{
1363 struct _EPROCESS
*Process
;
1364 PVOID MappedSystemVa
;
1371 /******************************************************************************
1372 * Memory manager Functions *
1373 ******************************************************************************/
1375 /* PVOID MmGetSystemAddressForMdl(
1378 #define MmGetSystemAddressForMdl(Mdl) \
1379 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
1380 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1381 ((Mdl)->MappedSystemVa) : \
1382 (MmMapLockedPages((Mdl), KernelMode)))
1385 * MmGetSystemAddressForMdlSafe(
1387 * IN MM_PAGE_PRIORITY Priority)
1389 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
1390 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
1391 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1392 (_Mdl)->MappedSystemVa : \
1393 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
1394 KernelMode, MmCached, NULL, FALSE, (_Priority)))
1396 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1401 IN PMDL MemoryDescriptorList OPTIONAL
,
1407 /******************************************************************************
1408 * Security Manager Types *
1409 ******************************************************************************/
1412 // Access/Security Stuff
1414 typedef ULONG ACCESS_MASK
, *PACCESS_MASK
;
1415 typedef PVOID PACCESS_TOKEN
;
1417 #define DELETE 0x00010000L
1418 #define READ_CONTROL 0x00020000L
1419 #define WRITE_DAC 0x00040000L
1420 #define WRITE_OWNER 0x00080000L
1421 #define SYNCHRONIZE 0x00100000L
1422 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
1423 #define STANDARD_RIGHTS_READ READ_CONTROL
1424 #define STANDARD_RIGHTS_WRITE READ_CONTROL
1425 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
1426 #define STANDARD_RIGHTS_ALL 0x001F0000L
1427 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
1428 #define ACCESS_SYSTEM_SECURITY 0x01000000L
1429 #define MAXIMUM_ALLOWED 0x02000000L
1430 #define GENERIC_READ 0x80000000L
1431 #define GENERIC_WRITE 0x40000000L
1432 #define GENERIC_EXECUTE 0x20000000L
1433 #define GENERIC_ALL 0x10000000L
1435 typedef struct _GENERIC_MAPPING
{
1436 ACCESS_MASK GenericRead
;
1437 ACCESS_MASK GenericWrite
;
1438 ACCESS_MASK GenericExecute
;
1439 ACCESS_MASK GenericAll
;
1440 } GENERIC_MAPPING
, *PGENERIC_MAPPING
;
1442 #define ACL_REVISION 2
1443 #define ACL_REVISION_DS 4
1445 #define ACL_REVISION1 1
1446 #define ACL_REVISION2 2
1447 #define ACL_REVISION3 3
1448 #define ACL_REVISION4 4
1449 #define MIN_ACL_REVISION ACL_REVISION2
1450 #define MAX_ACL_REVISION ACL_REVISION4
1452 typedef struct _ACL
{
1461 // Current security descriptor revision value
1463 #define SECURITY_DESCRIPTOR_REVISION (1)
1464 #define SECURITY_DESCRIPTOR_REVISION1 (1)
1467 // Privilege attributes
1469 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
1470 #define SE_PRIVILEGE_ENABLED (0x00000002L)
1471 #define SE_PRIVILEGE_REMOVED (0X00000004L)
1472 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
1474 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
1475 SE_PRIVILEGE_ENABLED | \
1476 SE_PRIVILEGE_REMOVED | \
1477 SE_PRIVILEGE_USED_FOR_ACCESS)
1479 #include <pshpack4.h>
1480 typedef struct _LUID_AND_ATTRIBUTES
{
1483 } LUID_AND_ATTRIBUTES
, *PLUID_AND_ATTRIBUTES
;
1484 #include <poppack.h>
1486 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY
[ANYSIZE_ARRAY
];
1487 typedef LUID_AND_ATTRIBUTES_ARRAY
*PLUID_AND_ATTRIBUTES_ARRAY
;
1492 #define PRIVILEGE_SET_ALL_NECESSARY (1)
1494 typedef struct _PRIVILEGE_SET
{
1495 ULONG PrivilegeCount
;
1497 LUID_AND_ATTRIBUTES Privilege
[ANYSIZE_ARRAY
];
1498 } PRIVILEGE_SET
,*PPRIVILEGE_SET
;
1500 typedef enum _SECURITY_IMPERSONATION_LEVEL
{
1502 SecurityIdentification
,
1503 SecurityImpersonation
,
1505 } SECURITY_IMPERSONATION_LEVEL
, * PSECURITY_IMPERSONATION_LEVEL
;
1507 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
1508 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
1509 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
1510 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
1512 #define SECURITY_DYNAMIC_TRACKING (TRUE)
1513 #define SECURITY_STATIC_TRACKING (FALSE)
1515 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE
, *PSECURITY_CONTEXT_TRACKING_MODE
;
1517 typedef struct _SECURITY_QUALITY_OF_SERVICE
{
1519 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
1520 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
;
1521 BOOLEAN EffectiveOnly
;
1522 } SECURITY_QUALITY_OF_SERVICE
, *PSECURITY_QUALITY_OF_SERVICE
;
1524 typedef struct _SE_IMPERSONATION_STATE
{
1525 PACCESS_TOKEN Token
;
1527 BOOLEAN EffectiveOnly
;
1528 SECURITY_IMPERSONATION_LEVEL Level
;
1529 } SE_IMPERSONATION_STATE
, *PSE_IMPERSONATION_STATE
;
1531 #define OWNER_SECURITY_INFORMATION (0x00000001L)
1532 #define GROUP_SECURITY_INFORMATION (0x00000002L)
1533 #define DACL_SECURITY_INFORMATION (0x00000004L)
1534 #define SACL_SECURITY_INFORMATION (0x00000008L)
1535 #define LABEL_SECURITY_INFORMATION (0x00000010L)
1537 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
1538 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
1539 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
1540 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
1542 typedef enum _SECURITY_OPERATION_CODE
{
1543 SetSecurityDescriptor
,
1544 QuerySecurityDescriptor
,
1545 DeleteSecurityDescriptor
,
1546 AssignSecurityDescriptor
1547 } SECURITY_OPERATION_CODE
, *PSECURITY_OPERATION_CODE
;
1549 #define INITIAL_PRIVILEGE_COUNT 3
1551 typedef struct _INITIAL_PRIVILEGE_SET
{
1552 ULONG PrivilegeCount
;
1554 LUID_AND_ATTRIBUTES Privilege
[INITIAL_PRIVILEGE_COUNT
];
1555 } INITIAL_PRIVILEGE_SET
, * PINITIAL_PRIVILEGE_SET
;
1557 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
1558 #define SE_CREATE_TOKEN_PRIVILEGE 2
1559 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
1560 #define SE_LOCK_MEMORY_PRIVILEGE 4
1561 #define SE_INCREASE_QUOTA_PRIVILEGE 5
1562 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
1563 #define SE_TCB_PRIVILEGE 7
1564 #define SE_SECURITY_PRIVILEGE 8
1565 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
1566 #define SE_LOAD_DRIVER_PRIVILEGE 10
1567 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
1568 #define SE_SYSTEMTIME_PRIVILEGE 12
1569 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
1570 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
1571 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
1572 #define SE_CREATE_PERMANENT_PRIVILEGE 16
1573 #define SE_BACKUP_PRIVILEGE 17
1574 #define SE_RESTORE_PRIVILEGE 18
1575 #define SE_SHUTDOWN_PRIVILEGE 19
1576 #define SE_DEBUG_PRIVILEGE 20
1577 #define SE_AUDIT_PRIVILEGE 21
1578 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
1579 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
1580 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
1581 #define SE_UNDOCK_PRIVILEGE 25
1582 #define SE_SYNC_AGENT_PRIVILEGE 26
1583 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
1584 #define SE_MANAGE_VOLUME_PRIVILEGE 28
1585 #define SE_IMPERSONATE_PRIVILEGE 29
1586 #define SE_CREATE_GLOBAL_PRIVILEGE 30
1587 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
1588 #define SE_RELABEL_PRIVILEGE 32
1589 #define SE_INC_WORKING_SET_PRIVILEGE 33
1590 #define SE_TIME_ZONE_PRIVILEGE 34
1591 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
1592 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
1594 typedef struct _SECURITY_SUBJECT_CONTEXT
{
1595 PACCESS_TOKEN ClientToken
;
1596 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
;
1597 PACCESS_TOKEN PrimaryToken
;
1598 PVOID ProcessAuditId
;
1599 } SECURITY_SUBJECT_CONTEXT
, *PSECURITY_SUBJECT_CONTEXT
;
1601 #include <pshpack4.h>
1602 typedef struct _ACCESS_STATE
{
1604 BOOLEAN SecurityEvaluated
;
1605 BOOLEAN GenerateAudit
;
1606 BOOLEAN GenerateOnClose
;
1607 BOOLEAN PrivilegesAllocated
;
1609 ACCESS_MASK RemainingDesiredAccess
;
1610 ACCESS_MASK PreviouslyGrantedAccess
;
1611 ACCESS_MASK OriginalDesiredAccess
;
1612 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext
;
1613 PSECURITY_DESCRIPTOR SecurityDescriptor
;
1616 INITIAL_PRIVILEGE_SET InitialPrivilegeSet
;
1617 PRIVILEGE_SET PrivilegeSet
;
1620 BOOLEAN AuditPrivileges
;
1621 UNICODE_STRING ObjectName
;
1622 UNICODE_STRING ObjectTypeName
;
1623 } ACCESS_STATE
, *PACCESS_STATE
;
1624 #include <poppack.h>
1626 /******************************************************************************
1627 * Configuration Manager Types *
1628 ******************************************************************************/
1630 /* KEY_VALUE_Xxx.Type */
1634 #define REG_EXPAND_SZ 2
1635 #define REG_BINARY 3
1637 #define REG_DWORD_LITTLE_ENDIAN 4
1638 #define REG_DWORD_BIG_ENDIAN 5
1640 #define REG_MULTI_SZ 7
1641 #define REG_RESOURCE_LIST 8
1642 #define REG_FULL_RESOURCE_DESCRIPTOR 9
1643 #define REG_RESOURCE_REQUIREMENTS_LIST 10
1644 #define REG_QWORD 11
1645 #define REG_QWORD_LITTLE_ENDIAN 11
1648 // Registry Access Rights
1650 #define KEY_QUERY_VALUE (0x0001)
1651 #define KEY_SET_VALUE (0x0002)
1652 #define KEY_CREATE_SUB_KEY (0x0004)
1653 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
1654 #define KEY_NOTIFY (0x0010)
1655 #define KEY_CREATE_LINK (0x0020)
1656 #define KEY_WOW64_32KEY (0x0200)
1657 #define KEY_WOW64_64KEY (0x0100)
1658 #define KEY_WOW64_RES (0x0300)
1660 #define KEY_READ ((STANDARD_RIGHTS_READ |\
1662 KEY_ENUMERATE_SUB_KEYS |\
1667 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
1669 KEY_CREATE_SUB_KEY) \
1673 #define KEY_EXECUTE ((KEY_READ) \
1677 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
1680 KEY_CREATE_SUB_KEY |\
1681 KEY_ENUMERATE_SUB_KEYS |\
1688 // Registry Open/Create Options
1690 #define REG_OPTION_RESERVED (0x00000000L)
1691 #define REG_OPTION_NON_VOLATILE (0x00000000L)
1692 #define REG_OPTION_VOLATILE (0x00000001L)
1693 #define REG_OPTION_CREATE_LINK (0x00000002L)
1694 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
1695 #define REG_OPTION_OPEN_LINK (0x00000008L)
1697 #define REG_LEGAL_OPTION \
1698 (REG_OPTION_RESERVED |\
1699 REG_OPTION_NON_VOLATILE |\
1700 REG_OPTION_VOLATILE |\
1701 REG_OPTION_CREATE_LINK |\
1702 REG_OPTION_BACKUP_RESTORE |\
1703 REG_OPTION_OPEN_LINK)
1706 // Key creation/open disposition
1708 #define REG_CREATED_NEW_KEY (0x00000001L)
1709 #define REG_OPENED_EXISTING_KEY (0x00000002L)
1712 // Key restore & hive load flags
1714 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
1715 #define REG_REFRESH_HIVE (0x00000002L)
1716 #define REG_NO_LAZY_FLUSH (0x00000004L)
1717 #define REG_FORCE_RESTORE (0x00000008L)
1718 #define REG_APP_HIVE (0x00000010L)
1719 #define REG_PROCESS_PRIVATE (0x00000020L)
1720 #define REG_START_JOURNAL (0x00000040L)
1721 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
1722 #define REG_HIVE_NO_RM (0x00000100L)
1723 #define REG_HIVE_SINGLE_LOG (0x00000200L)
1728 #define REG_FORCE_UNLOAD 1
1731 // Notify Filter Values
1733 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
1734 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
1735 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
1736 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
1738 #define REG_LEGAL_CHANGE_FILTER \
1739 (REG_NOTIFY_CHANGE_NAME |\
1740 REG_NOTIFY_CHANGE_ATTRIBUTES |\
1741 REG_NOTIFY_CHANGE_LAST_SET |\
1742 REG_NOTIFY_CHANGE_SECURITY)
1744 typedef struct _CM_FLOPPY_DEVICE_DATA
{
1750 UCHAR StepRateHeadUnloadTime
;
1753 UCHAR SectorLengthCode
;
1754 UCHAR SectorPerTrack
;
1755 UCHAR ReadWriteGapLength
;
1756 UCHAR DataTransferLength
;
1757 UCHAR FormatGapLength
;
1758 UCHAR FormatFillCharacter
;
1759 UCHAR HeadSettleTime
;
1760 UCHAR MotorSettleTime
;
1761 UCHAR MaximumTrackValue
;
1762 UCHAR DataTransferRate
;
1763 } CM_FLOPPY_DEVICE_DATA
, *PCM_FLOPPY_DEVICE_DATA
;
1765 #include <pshpack4.h>
1766 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR
{
1768 UCHAR ShareDisposition
;
1772 PHYSICAL_ADDRESS Start
;
1776 PHYSICAL_ADDRESS Start
;
1784 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1786 __GNU_EXTENSION
union {
1789 USHORT MessageCount
;
1802 PHYSICAL_ADDRESS Start
;
1822 } DeviceSpecificData
;
1823 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1825 PHYSICAL_ADDRESS Start
;
1829 PHYSICAL_ADDRESS Start
;
1833 PHYSICAL_ADDRESS Start
;
1838 } CM_PARTIAL_RESOURCE_DESCRIPTOR
, *PCM_PARTIAL_RESOURCE_DESCRIPTOR
;
1839 #include <poppack.h>
1841 #include <pshpack1.h>
1842 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
1844 #define CmResourceTypeNull 0
1845 #define CmResourceTypePort 1
1846 #define CmResourceTypeInterrupt 2
1847 #define CmResourceTypeMemory 3
1848 #define CmResourceTypeDma 4
1849 #define CmResourceTypeDeviceSpecific 5
1850 #define CmResourceTypeBusNumber 6
1851 #define CmResourceTypeMemoryLarge 7
1852 #define CmResourceTypeNonArbitrated 128
1853 #define CmResourceTypeConfigData 128
1854 #define CmResourceTypeDevicePrivate 129
1855 #define CmResourceTypePcCardConfig 130
1856 #define CmResourceTypeMfCardConfig 131
1858 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
1860 typedef enum _CM_SHARE_DISPOSITION
{
1861 CmResourceShareUndetermined
,
1862 CmResourceShareDeviceExclusive
,
1863 CmResourceShareDriverExclusive
,
1864 CmResourceShareShared
1865 } CM_SHARE_DISPOSITION
;
1867 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
1869 #define CM_RESOURCE_PORT_MEMORY 0x0000
1870 #define CM_RESOURCE_PORT_IO 0x0001
1871 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
1872 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
1873 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
1874 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
1875 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
1876 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
1877 #define CM_RESOURCE_PORT_BAR 0x0100
1879 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
1881 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
1882 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
1883 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
1884 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
1886 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
1888 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
1889 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
1890 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
1891 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
1892 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
1893 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
1894 #define CM_RESOURCE_MEMORY_24 0x0010
1895 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
1896 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
1897 #define CM_RESOURCE_MEMORY_BAR 0x0080
1898 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
1900 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
1902 #define CM_RESOURCE_DMA_8 0x0000
1903 #define CM_RESOURCE_DMA_16 0x0001
1904 #define CM_RESOURCE_DMA_32 0x0002
1905 #define CM_RESOURCE_DMA_8_AND_16 0x0004
1906 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
1907 #define CM_RESOURCE_DMA_TYPE_A 0x0010
1908 #define CM_RESOURCE_DMA_TYPE_B 0x0020
1909 #define CM_RESOURCE_DMA_TYPE_F 0x0040
1911 typedef struct _CM_PARTIAL_RESOURCE_LIST
{
1915 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors
[1];
1916 } CM_PARTIAL_RESOURCE_LIST
, *PCM_PARTIAL_RESOURCE_LIST
;
1918 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR
{
1919 INTERFACE_TYPE InterfaceType
;
1921 CM_PARTIAL_RESOURCE_LIST PartialResourceList
;
1922 } CM_FULL_RESOURCE_DESCRIPTOR
, *PCM_FULL_RESOURCE_DESCRIPTOR
;
1924 typedef struct _CM_RESOURCE_LIST
{
1926 CM_FULL_RESOURCE_DESCRIPTOR List
[1];
1927 } CM_RESOURCE_LIST
, *PCM_RESOURCE_LIST
;
1929 typedef struct _CM_INT13_DRIVE_PARAMETER
{
1932 USHORT SectorsPerTrack
;
1934 USHORT NumberDrives
;
1935 } CM_INT13_DRIVE_PARAMETER
, *PCM_INT13_DRIVE_PARAMETER
;
1937 typedef struct _CM_PNP_BIOS_DEVICE_NODE
1942 UCHAR DeviceType
[3];
1943 USHORT DeviceAttributes
;
1944 } CM_PNP_BIOS_DEVICE_NODE
,*PCM_PNP_BIOS_DEVICE_NODE
;
1946 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
1951 USHORT ControlField
;
1953 ULONG EventFlagAddress
;
1954 USHORT RealModeEntryOffset
;
1955 USHORT RealModeEntrySegment
;
1956 USHORT ProtectedModeEntryOffset
;
1957 ULONG ProtectedModeCodeBaseAddress
;
1959 USHORT RealModeDataBaseAddress
;
1960 ULONG ProtectedModeDataBaseAddress
;
1961 } CM_PNP_BIOS_INSTALLATION_CHECK
, *PCM_PNP_BIOS_INSTALLATION_CHECK
;
1963 #include <poppack.h>
1965 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
1967 ULONG BytesPerSector
;
1968 ULONG NumberOfCylinders
;
1969 ULONG SectorsPerTrack
;
1970 ULONG NumberOfHeads
;
1971 } CM_DISK_GEOMETRY_DEVICE_DATA
, *PCM_DISK_GEOMETRY_DEVICE_DATA
;
1973 typedef struct _CM_KEYBOARD_DEVICE_DATA
{
1978 USHORT KeyboardFlags
;
1979 } CM_KEYBOARD_DEVICE_DATA
, *PCM_KEYBOARD_DEVICE_DATA
;
1981 typedef struct _CM_MCA_POS_DATA
{
1987 } CM_MCA_POS_DATA
, *PCM_MCA_POS_DATA
;
1989 #if (NTDDI_VERSION >= NTDDI_WINXP)
1990 typedef struct CM_Power_Data_s
{
1992 DEVICE_POWER_STATE PD_MostRecentPowerState
;
1993 ULONG PD_Capabilities
;
1997 DEVICE_POWER_STATE PD_PowerStateMapping
[PowerSystemMaximum
];
1998 SYSTEM_POWER_STATE PD_DeepestSystemWake
;
1999 } CM_POWER_DATA
, *PCM_POWER_DATA
;
2001 #define PDCAP_D0_SUPPORTED 0x00000001
2002 #define PDCAP_D1_SUPPORTED 0x00000002
2003 #define PDCAP_D2_SUPPORTED 0x00000004
2004 #define PDCAP_D3_SUPPORTED 0x00000008
2005 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2006 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2007 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2008 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2009 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2011 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2013 typedef struct _CM_SCSI_DEVICE_DATA
{
2016 UCHAR HostIdentifier
;
2017 } CM_SCSI_DEVICE_DATA
, *PCM_SCSI_DEVICE_DATA
;
2019 typedef struct _CM_SERIAL_DEVICE_DATA
{
2023 } CM_SERIAL_DEVICE_DATA
, *PCM_SERIAL_DEVICE_DATA
;
2025 typedef enum _KEY_INFORMATION_CLASS
{
2026 KeyBasicInformation
,
2030 KeyCachedInformation
,
2032 } KEY_INFORMATION_CLASS
;
2034 typedef struct _KEY_BASIC_INFORMATION
{
2035 LARGE_INTEGER LastWriteTime
;
2039 } KEY_BASIC_INFORMATION
, *PKEY_BASIC_INFORMATION
;
2041 typedef struct _KEY_FULL_INFORMATION
{
2042 LARGE_INTEGER LastWriteTime
;
2050 ULONG MaxValueNameLen
;
2051 ULONG MaxValueDataLen
;
2053 } KEY_FULL_INFORMATION
, *PKEY_FULL_INFORMATION
;
2055 typedef struct _KEY_NODE_INFORMATION
{
2056 LARGE_INTEGER LastWriteTime
;
2062 } KEY_NODE_INFORMATION
, *PKEY_NODE_INFORMATION
;
2064 typedef struct _KEY_VALUE_BASIC_INFORMATION
{
2069 } KEY_VALUE_BASIC_INFORMATION
, *PKEY_VALUE_BASIC_INFORMATION
;
2071 typedef struct _KEY_VALUE_FULL_INFORMATION
{
2078 } KEY_VALUE_FULL_INFORMATION
, *PKEY_VALUE_FULL_INFORMATION
;
2080 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
{
2085 } KEY_VALUE_PARTIAL_INFORMATION
, *PKEY_VALUE_PARTIAL_INFORMATION
;
2087 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
{
2091 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64
;
2093 typedef struct _KEY_VALUE_ENTRY
{
2094 PUNICODE_STRING ValueName
;
2098 } KEY_VALUE_ENTRY
, *PKEY_VALUE_ENTRY
;
2100 typedef enum _KEY_VALUE_INFORMATION_CLASS
{
2101 KeyValueBasicInformation
,
2102 KeyValueFullInformation
,
2103 KeyValuePartialInformation
,
2104 KeyValueFullInformationAlign64
,
2105 KeyValuePartialInformationAlign64
2106 } KEY_VALUE_INFORMATION_CLASS
;
2108 typedef struct _KEY_WRITE_TIME_INFORMATION
{
2109 LARGE_INTEGER LastWriteTime
;
2110 } KEY_WRITE_TIME_INFORMATION
, *PKEY_WRITE_TIME_INFORMATION
;
2112 typedef enum _KEY_SET_INFORMATION_CLASS
{
2113 KeyWriteTimeInformation
,
2114 KeyWow64FlagsInformation
,
2115 KeyControlFlagsInformation
,
2116 KeySetVirtualizationInformation
,
2117 KeySetDebugInformation
,
2118 KeySetHandleTagsInformation
,
2120 } KEY_SET_INFORMATION_CLASS
;
2122 /******************************************************************************
2123 * I/O Manager Functions *
2124 ******************************************************************************/
2126 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2127 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2129 #define DMA_MACROS_DEFINED
2133 IoAllocateAdapterChannel(
2134 IN PADAPTER_OBJECT AdapterObject
,
2135 IN PDEVICE_OBJECT DeviceObject
,
2136 IN ULONG NumberOfMapRegisters
,
2137 IN PDRIVER_CONTROL ExecutionRoutine
,
2140 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
2141 AllocateAdapterChannel
=
2142 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
2143 ASSERT(AllocateAdapterChannel
);
2144 return AllocateAdapterChannel(DmaAdapter
,
2146 NumberOfMapRegisters
,
2153 IoFlushAdapterBuffers(
2154 IN PADAPTER_OBJECT AdapterObject
,
2156 IN PVOID MapRegisterBase
,
2159 IN BOOLEAN WriteToDevice
)
2161 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
2162 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
2163 ASSERT(FlushAdapterBuffers
);
2164 return FlushAdapterBuffers(DmaAdapter
,
2174 IoFreeAdapterChannel(
2175 IN PADAPTER_OBJECT AdapterObject
)
2177 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
2178 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
2179 ASSERT(FreeAdapterChannel
);
2180 FreeAdapterChannel(DmaAdapter
);
2186 IN PADAPTER_OBJECT AdapterObject
,
2187 IN PVOID MapRegisterBase
,
2188 IN ULONG NumberOfMapRegisters
)
2190 PFREE_MAP_REGISTERS FreeMapRegisters
;
2191 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
2192 ASSERT(FreeMapRegisters
);
2193 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
2199 IN PDMA_ADAPTER DmaAdapter
,
2201 IN PVOID MapRegisterBase
,
2203 IN OUT PULONG Length
,
2204 IN BOOLEAN WriteToDevice
)
2206 PMAP_TRANSFER MapTransfer
;
2208 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
2209 ASSERT(MapTransfer
);
2210 return MapTransfer(DmaAdapter
,
2219 /* PCI_COMMON_CONFIG.Command */
2221 #define PCI_ENABLE_IO_SPACE 0x0001
2222 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2223 #define PCI_ENABLE_BUS_MASTER 0x0004
2224 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2225 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2226 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2227 #define PCI_ENABLE_PARITY 0x0040
2228 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2229 #define PCI_ENABLE_SERR 0x0100
2230 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2231 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
2233 /* PCI_COMMON_CONFIG.Status */
2235 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
2236 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2237 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2238 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2239 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2240 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2241 #define PCI_STATUS_DEVSEL 0x0600
2242 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2243 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2244 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2245 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2246 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2248 /* PCI_COMMON_CONFIG.HeaderType */
2250 #define PCI_MULTIFUNCTION 0x80
2251 #define PCI_DEVICE_TYPE 0x00
2252 #define PCI_BRIDGE_TYPE 0x01
2253 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2255 #define PCI_CONFIGURATION_TYPE(PciData) \
2256 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2258 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2259 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2261 /* PCI device classes */
2263 #define PCI_CLASS_PRE_20 0x00
2264 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
2265 #define PCI_CLASS_NETWORK_CTLR 0x02
2266 #define PCI_CLASS_DISPLAY_CTLR 0x03
2267 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
2268 #define PCI_CLASS_MEMORY_CTLR 0x05
2269 #define PCI_CLASS_BRIDGE_DEV 0x06
2270 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
2271 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
2272 #define PCI_CLASS_INPUT_DEV 0x09
2273 #define PCI_CLASS_DOCKING_STATION 0x0a
2274 #define PCI_CLASS_PROCESSOR 0x0b
2275 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
2276 #define PCI_CLASS_WIRELESS_CTLR 0x0d
2277 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
2278 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
2279 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
2280 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
2282 /* PCI device subclasses for class 0 */
2284 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
2285 #define PCI_SUBCLASS_PRE_20_VGA 0x01
2287 /* PCI device subclasses for class 1 (mass storage controllers)*/
2289 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
2290 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
2291 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
2292 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
2293 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
2294 #define PCI_SUBCLASS_MSC_OTHER 0x80
2296 /* PCI device subclasses for class 2 (network controllers)*/
2298 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
2299 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
2300 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
2301 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
2302 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
2303 #define PCI_SUBCLASS_NET_OTHER 0x80
2305 /* PCI device subclasses for class 3 (display controllers)*/
2307 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
2308 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
2309 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
2310 #define PCI_SUBCLASS_VID_OTHER 0x80
2312 /* PCI device subclasses for class 4 (multimedia device)*/
2314 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
2315 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
2316 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
2317 #define PCI_SUBCLASS_MM_OTHER 0x80
2319 /* PCI device subclasses for class 5 (memory controller)*/
2321 #define PCI_SUBCLASS_MEM_RAM 0x00
2322 #define PCI_SUBCLASS_MEM_FLASH 0x01
2323 #define PCI_SUBCLASS_MEM_OTHER 0x80
2325 /* PCI device subclasses for class 6 (bridge device)*/
2327 #define PCI_SUBCLASS_BR_HOST 0x00
2328 #define PCI_SUBCLASS_BR_ISA 0x01
2329 #define PCI_SUBCLASS_BR_EISA 0x02
2330 #define PCI_SUBCLASS_BR_MCA 0x03
2331 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
2332 #define PCI_SUBCLASS_BR_PCMCIA 0x05
2333 #define PCI_SUBCLASS_BR_NUBUS 0x06
2334 #define PCI_SUBCLASS_BR_CARDBUS 0x07
2335 #define PCI_SUBCLASS_BR_RACEWAY 0x08
2336 #define PCI_SUBCLASS_BR_OTHER 0x80
2338 /* PCI device subclasses for class C (serial bus controller)*/
2340 #define PCI_SUBCLASS_SB_IEEE1394 0x00
2341 #define PCI_SUBCLASS_SB_ACCESS 0x01
2342 #define PCI_SUBCLASS_SB_SSA 0x02
2343 #define PCI_SUBCLASS_SB_USB 0x03
2344 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
2345 #define PCI_SUBCLASS_SB_SMBUS 0x05
2347 #define PCI_MAX_DEVICES 32
2348 #define PCI_MAX_FUNCTION 8
2349 #define PCI_MAX_BRIDGE_NUMBER 0xFF
2350 #define PCI_INVALID_VENDORID 0xFFFF
2351 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
2353 #define PCI_ADDRESS_IO_SPACE 0x00000001
2354 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
2355 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
2356 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
2357 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
2358 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
2360 #define PCI_TYPE_32BIT 0
2361 #define PCI_TYPE_20BIT 2
2362 #define PCI_TYPE_64BIT 4
2364 #define POOL_COLD_ALLOCATION 256
2365 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
2366 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
2368 #define PCI_TYPE0_ADDRESSES 6
2369 #define PCI_TYPE1_ADDRESSES 2
2370 #define PCI_TYPE2_ADDRESSES 5
2372 #define IO_TYPE_ADAPTER 1
2373 #define IO_TYPE_CONTROLLER 2
2374 #define IO_TYPE_DEVICE 3
2375 #define IO_TYPE_DRIVER 4
2376 #define IO_TYPE_FILE 5
2377 #define IO_TYPE_IRP 6
2378 #define IO_TYPE_MASTER_ADAPTER 7
2379 #define IO_TYPE_OPEN_PACKET 8
2380 #define IO_TYPE_TIMER 9
2381 #define IO_TYPE_VPB 10
2382 #define IO_TYPE_ERROR_LOG 11
2383 #define IO_TYPE_ERROR_MESSAGE 12
2384 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
2386 #define IO_TYPE_CSQ_IRP_CONTEXT 1
2387 #define IO_TYPE_CSQ 2
2388 #define IO_TYPE_CSQ_EX 3
2390 /* IO_RESOURCE_DESCRIPTOR.Option */
2392 #define IO_RESOURCE_PREFERRED 0x01
2393 #define IO_RESOURCE_DEFAULT 0x02
2394 #define IO_RESOURCE_ALTERNATIVE 0x08
2396 /* DEVICE_OBJECT.Flags */
2398 #define DO_VERIFY_VOLUME 0x00000002
2399 #define DO_BUFFERED_IO 0x00000004
2400 #define DO_EXCLUSIVE 0x00000008
2401 #define DO_DIRECT_IO 0x00000010
2402 #define DO_MAP_IO_BUFFER 0x00000020
2403 #define DO_DEVICE_INITIALIZING 0x00000080
2404 #define DO_SHUTDOWN_REGISTERED 0x00000800
2405 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
2406 #define DO_POWER_PAGABLE 0x00002000
2407 #define DO_POWER_INRUSH 0x00004000
2409 /* DEVICE_OBJECT.Characteristics */
2411 #define FILE_REMOVABLE_MEDIA 0x00000001
2412 #define FILE_READ_ONLY_DEVICE 0x00000002
2413 #define FILE_FLOPPY_DISKETTE 0x00000004
2414 #define FILE_WRITE_ONCE_MEDIA 0x00000008
2415 #define FILE_REMOTE_DEVICE 0x00000010
2416 #define FILE_DEVICE_IS_MOUNTED 0x00000020
2417 #define FILE_VIRTUAL_VOLUME 0x00000040
2418 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
2419 #define FILE_DEVICE_SECURE_OPEN 0x00000100
2420 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
2421 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
2422 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
2424 /* DEVICE_OBJECT.AlignmentRequirement */
2426 #define FILE_BYTE_ALIGNMENT 0x00000000
2427 #define FILE_WORD_ALIGNMENT 0x00000001
2428 #define FILE_LONG_ALIGNMENT 0x00000003
2429 #define FILE_QUAD_ALIGNMENT 0x00000007
2430 #define FILE_OCTA_ALIGNMENT 0x0000000f
2431 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
2432 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
2433 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
2434 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
2435 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
2437 /* DEVICE_OBJECT.DeviceType */
2439 #define DEVICE_TYPE ULONG
2441 #define FILE_DEVICE_BEEP 0x00000001
2442 #define FILE_DEVICE_CD_ROM 0x00000002
2443 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
2444 #define FILE_DEVICE_CONTROLLER 0x00000004
2445 #define FILE_DEVICE_DATALINK 0x00000005
2446 #define FILE_DEVICE_DFS 0x00000006
2447 #define FILE_DEVICE_DISK 0x00000007
2448 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
2449 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
2450 #define FILE_DEVICE_INPORT_PORT 0x0000000a
2451 #define FILE_DEVICE_KEYBOARD 0x0000000b
2452 #define FILE_DEVICE_MAILSLOT 0x0000000c
2453 #define FILE_DEVICE_MIDI_IN 0x0000000d
2454 #define FILE_DEVICE_MIDI_OUT 0x0000000e
2455 #define FILE_DEVICE_MOUSE 0x0000000f
2456 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
2457 #define FILE_DEVICE_NAMED_PIPE 0x00000011
2458 #define FILE_DEVICE_NETWORK 0x00000012
2459 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
2460 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
2461 #define FILE_DEVICE_NULL 0x00000015
2462 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
2463 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
2464 #define FILE_DEVICE_PRINTER 0x00000018
2465 #define FILE_DEVICE_SCANNER 0x00000019
2466 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
2467 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
2468 #define FILE_DEVICE_SCREEN 0x0000001c
2469 #define FILE_DEVICE_SOUND 0x0000001d
2470 #define FILE_DEVICE_STREAMS 0x0000001e
2471 #define FILE_DEVICE_TAPE 0x0000001f
2472 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
2473 #define FILE_DEVICE_TRANSPORT 0x00000021
2474 #define FILE_DEVICE_UNKNOWN 0x00000022
2475 #define FILE_DEVICE_VIDEO 0x00000023
2476 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
2477 #define FILE_DEVICE_WAVE_IN 0x00000025
2478 #define FILE_DEVICE_WAVE_OUT 0x00000026
2479 #define FILE_DEVICE_8042_PORT 0x00000027
2480 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
2481 #define FILE_DEVICE_BATTERY 0x00000029
2482 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
2483 #define FILE_DEVICE_MODEM 0x0000002b
2484 #define FILE_DEVICE_VDM 0x0000002c
2485 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
2486 #define FILE_DEVICE_SMB 0x0000002e
2487 #define FILE_DEVICE_KS 0x0000002f
2488 #define FILE_DEVICE_CHANGER 0x00000030
2489 #define FILE_DEVICE_SMARTCARD 0x00000031
2490 #define FILE_DEVICE_ACPI 0x00000032
2491 #define FILE_DEVICE_DVD 0x00000033
2492 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
2493 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
2494 #define FILE_DEVICE_DFS_VOLUME 0x00000036
2495 #define FILE_DEVICE_SERENUM 0x00000037
2496 #define FILE_DEVICE_TERMSRV 0x00000038
2497 #define FILE_DEVICE_KSEC 0x00000039
2498 #define FILE_DEVICE_FIPS 0x0000003a
2499 #define FILE_DEVICE_INFINIBAND 0x0000003b
2500 #define FILE_DEVICE_VMBUS 0x0000003e
2501 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003f
2502 #define FILE_DEVICE_WPD 0x00000040
2503 #define FILE_DEVICE_BLUETOOTH 0x00000041
2504 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
2505 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
2506 #define FILE_DEVICE_BIOMETRIC 0x00000044
2507 #define FILE_DEVICE_PMI 0x00000045
2509 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
2511 typedef struct _VPB
{
2515 USHORT VolumeLabelLength
;
2516 struct _DEVICE_OBJECT
*DeviceObject
;
2517 struct _DEVICE_OBJECT
*RealDevice
;
2519 ULONG ReferenceCount
;
2520 WCHAR VolumeLabel
[MAXIMUM_VOLUME_LABEL_LENGTH
/ sizeof(WCHAR
)];
2523 typedef struct _DEVICE_OBJECT
{
2526 LONG ReferenceCount
;
2527 struct _DRIVER_OBJECT
*DriverObject
;
2528 struct _DEVICE_OBJECT
*NextDevice
;
2529 struct _DEVICE_OBJECT
*AttachedDevice
;
2530 struct _IRP
*CurrentIrp
;
2533 ULONG Characteristics
;
2535 PVOID DeviceExtension
;
2536 DEVICE_TYPE DeviceType
;
2539 LIST_ENTRY ListEntry
;
2540 WAIT_CONTEXT_BLOCK Wcb
;
2542 ULONG AlignmentRequirement
;
2543 KDEVICE_QUEUE DeviceQueue
;
2545 ULONG ActiveThreadCount
;
2546 PSECURITY_DESCRIPTOR SecurityDescriptor
;
2550 struct _DEVOBJ_EXTENSION
*DeviceObjectExtension
;
2552 } DEVICE_OBJECT
, *PDEVICE_OBJECT
;
2554 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK
* PIO_REMOVE_LOCK_TRACKING_BLOCK
;
2556 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK
{
2558 BOOLEAN Reserved
[3];
2559 volatile LONG IoCount
;
2561 } IO_REMOVE_LOCK_COMMON_BLOCK
;
2563 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK
{
2566 LONGLONG MaxLockedTicks
;
2568 LIST_ENTRY LockList
;
2570 volatile LONG LowMemoryCount
;
2573 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks
;
2574 } IO_REMOVE_LOCK_DBG_BLOCK
;
2576 typedef struct _IO_REMOVE_LOCK
{
2577 IO_REMOVE_LOCK_COMMON_BLOCK Common
;
2579 IO_REMOVE_LOCK_DBG_BLOCK Dbg
;
2581 } IO_REMOVE_LOCK
, *PIO_REMOVE_LOCK
;
2583 typedef struct _IO_WORKITEM
*PIO_WORKITEM
;
2586 (DDKAPI IO_WORKITEM_ROUTINE
)(
2587 IN PDEVICE_OBJECT DeviceObject
,
2589 typedef IO_WORKITEM_ROUTINE
*PIO_WORKITEM_ROUTINE
;
2591 typedef struct _SHARE_ACCESS
{
2599 } SHARE_ACCESS
, *PSHARE_ACCESS
;
2604 typedef struct _PCI_SLOT_NUMBER
{
2607 ULONG DeviceNumber
: 5;
2608 ULONG FunctionNumber
: 3;
2609 ULONG Reserved
: 24;
2613 } PCI_SLOT_NUMBER
, *PPCI_SLOT_NUMBER
;
2615 typedef struct _IO_STATUS_BLOCK
{
2616 _ANONYMOUS_UNION
union {
2620 ULONG_PTR Information
;
2621 } IO_STATUS_BLOCK
, *PIO_STATUS_BLOCK
;
2624 (DDKAPI
*PIO_APC_ROUTINE
)(
2625 IN PVOID ApcContext
,
2626 IN PIO_STATUS_BLOCK IoStatusBlock
,
2629 #define EVENT_INCREMENT 1
2630 #define IO_NO_INCREMENT 0
2631 #define IO_CD_ROM_INCREMENT 1
2632 #define IO_DISK_INCREMENT 1
2633 #define IO_KEYBOARD_INCREMENT 6
2634 #define IO_MAILSLOT_INCREMENT 2
2635 #define IO_MOUSE_INCREMENT 6
2636 #define IO_NAMED_PIPE_INCREMENT 2
2637 #define IO_NETWORK_INCREMENT 2
2638 #define IO_PARALLEL_INCREMENT 1
2639 #define IO_SERIAL_INCREMENT 2
2640 #define IO_SOUND_INCREMENT 8
2641 #define IO_VIDEO_INCREMENT 1
2642 #define SEMAPHORE_INCREMENT 1
2644 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
2646 typedef struct _BOOTDISK_INFORMATION
{
2647 LONGLONG BootPartitionOffset
;
2648 LONGLONG SystemPartitionOffset
;
2649 ULONG BootDeviceSignature
;
2650 ULONG SystemDeviceSignature
;
2651 } BOOTDISK_INFORMATION
, *PBOOTDISK_INFORMATION
;
2653 typedef struct _BOOTDISK_INFORMATION_EX
{
2654 LONGLONG BootPartitionOffset
;
2655 LONGLONG SystemPartitionOffset
;
2656 ULONG BootDeviceSignature
;
2657 ULONG SystemDeviceSignature
;
2658 GUID BootDeviceGuid
;
2659 GUID SystemDeviceGuid
;
2660 BOOLEAN BootDeviceIsGpt
;
2661 BOOLEAN SystemDeviceIsGpt
;
2662 } BOOTDISK_INFORMATION_EX
, *PBOOTDISK_INFORMATION_EX
;
2664 typedef struct _EISA_MEMORY_TYPE
{
2665 UCHAR ReadWrite
: 1;
2667 UCHAR Reserved0
: 1;
2670 UCHAR Reserved1
: 1;
2671 UCHAR MoreEntries
: 1;
2672 } EISA_MEMORY_TYPE
, *PEISA_MEMORY_TYPE
;
2674 #include <pshpack1.h>
2675 typedef struct _EISA_MEMORY_CONFIGURATION
{
2676 EISA_MEMORY_TYPE ConfigurationByte
;
2678 USHORT AddressLowWord
;
2679 UCHAR AddressHighByte
;
2681 } EISA_MEMORY_CONFIGURATION
, *PEISA_MEMORY_CONFIGURATION
;
2682 #include <poppack.h>
2684 typedef struct _EISA_IRQ_DESCRIPTOR
{
2685 UCHAR Interrupt
: 4;
2687 UCHAR LevelTriggered
: 1;
2689 UCHAR MoreEntries
: 1;
2690 } EISA_IRQ_DESCRIPTOR
, *PEISA_IRQ_DESCRIPTOR
;
2692 typedef struct _EISA_IRQ_CONFIGURATION
{
2693 EISA_IRQ_DESCRIPTOR ConfigurationByte
;
2695 } EISA_IRQ_CONFIGURATION
, *PEISA_IRQ_CONFIGURATION
;
2697 typedef struct _DMA_CONFIGURATION_BYTE0
{
2701 UCHAR MoreEntries
: 1;
2702 } DMA_CONFIGURATION_BYTE0
;
2704 typedef struct _DMA_CONFIGURATION_BYTE1
{
2705 UCHAR Reserved0
: 2;
2706 UCHAR TransferSize
: 2;
2708 UCHAR Reserved1
: 2;
2709 } DMA_CONFIGURATION_BYTE1
;
2711 typedef struct _EISA_DMA_CONFIGURATION
{
2712 DMA_CONFIGURATION_BYTE0 ConfigurationByte0
;
2713 DMA_CONFIGURATION_BYTE1 ConfigurationByte1
;
2714 } EISA_DMA_CONFIGURATION
, *PEISA_DMA_CONFIGURATION
;
2716 #include <pshpack1.h>
2717 typedef struct _EISA_PORT_DESCRIPTOR
{
2718 UCHAR NumberPorts
: 5;
2721 UCHAR MoreEntries
: 1;
2722 } EISA_PORT_DESCRIPTOR
, *PEISA_PORT_DESCRIPTOR
;
2724 typedef struct _EISA_PORT_CONFIGURATION
{
2725 EISA_PORT_DESCRIPTOR Configuration
;
2727 } EISA_PORT_CONFIGURATION
, *PEISA_PORT_CONFIGURATION
;
2728 #include <poppack.h>
2730 typedef struct _CM_EISA_FUNCTION_INFORMATION
{
2734 UCHAR MinorRevision
;
2735 UCHAR MajorRevision
;
2736 UCHAR Selections
[26];
2737 UCHAR FunctionFlags
;
2738 UCHAR TypeString
[80];
2739 EISA_MEMORY_CONFIGURATION EisaMemory
[9];
2740 EISA_IRQ_CONFIGURATION EisaIrq
[7];
2741 EISA_DMA_CONFIGURATION EisaDma
[4];
2742 EISA_PORT_CONFIGURATION EisaPort
[20];
2743 UCHAR InitializationData
[60];
2744 } CM_EISA_FUNCTION_INFORMATION
, *PCM_EISA_FUNCTION_INFORMATION
;
2746 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
2748 #define EISA_FUNCTION_ENABLED 0x80
2749 #define EISA_FREE_FORM_DATA 0x40
2750 #define EISA_HAS_PORT_INIT_ENTRY 0x20
2751 #define EISA_HAS_PORT_RANGE 0x10
2752 #define EISA_HAS_DMA_ENTRY 0x08
2753 #define EISA_HAS_IRQ_ENTRY 0x04
2754 #define EISA_HAS_MEMORY_ENTRY 0x02
2755 #define EISA_HAS_TYPE_ENTRY 0x01
2756 #define EISA_HAS_INFORMATION \
2757 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
2758 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
2760 typedef struct _CM_EISA_SLOT_INFORMATION
{
2763 UCHAR MajorRevision
;
2764 UCHAR MinorRevision
;
2766 UCHAR NumberFunctions
;
2767 UCHAR FunctionInformation
;
2769 } CM_EISA_SLOT_INFORMATION
, *PCM_EISA_SLOT_INFORMATION
;
2771 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
2773 #define EISA_INVALID_SLOT 0x80
2774 #define EISA_INVALID_FUNCTION 0x81
2775 #define EISA_INVALID_CONFIGURATION 0x82
2776 #define EISA_EMPTY_SLOT 0x83
2777 #define EISA_INVALID_BIOS_CALL 0x86
2780 ** Plug and Play structures
2784 (DDKAPI
*PINTERFACE_REFERENCE
)(
2788 (DDKAPI
*PINTERFACE_DEREFERENCE
)(
2792 (DDKAPI
*PTRANSLATE_BUS_ADDRESS
)(
2794 IN PHYSICAL_ADDRESS BusAddress
,
2796 IN OUT PULONG AddressSpace
,
2797 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
2799 typedef struct _DMA_ADAPTER
*
2800 (DDKAPI
*PGET_DMA_ADAPTER
)(
2802 IN
struct _DEVICE_DESCRIPTION
*DeviceDescriptor
,
2803 OUT PULONG NumberOfMapRegisters
);
2806 (DDKAPI
*PGET_SET_DEVICE_DATA
)(
2813 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
2814 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
2815 #define PCI_USE_REVISION 0x00000002
2816 #define PCI_USE_VENDEV_IDS 0x00000004
2817 #define PCI_USE_CLASS_SUBCLASS 0x00000008
2818 #define PCI_USE_PROGIF 0x00000010
2819 #define PCI_USE_LOCAL_BUS 0x00000020
2820 #define PCI_USE_LOCAL_DEVICE 0x00000040
2822 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS
{
2833 } PCI_DEVICE_PRESENCE_PARAMETERS
, *PPCI_DEVICE_PRESENCE_PARAMETERS
;
2836 (DDKAPI
*PPCI_IS_DEVICE_PRESENT
)(
2839 IN UCHAR RevisionID
,
2840 IN USHORT SubVendorID
,
2841 IN USHORT SubSystemID
,
2845 (DDKAPI
*PPCI_IS_DEVICE_PRESENT_EX
)(
2847 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters
);
2849 typedef union _POWER_STATE
{
2850 SYSTEM_POWER_STATE SystemState
;
2851 DEVICE_POWER_STATE DeviceState
;
2852 } POWER_STATE
, *PPOWER_STATE
;
2854 typedef enum _POWER_STATE_TYPE
{
2855 SystemPowerState
= 0,
2857 } POWER_STATE_TYPE
, *PPOWER_STATE_TYPE
;
2859 typedef struct _BUS_INTERFACE_STANDARD
{
2863 PINTERFACE_REFERENCE InterfaceReference
;
2864 PINTERFACE_DEREFERENCE InterfaceDereference
;
2865 PTRANSLATE_BUS_ADDRESS TranslateBusAddress
;
2866 PGET_DMA_ADAPTER GetDmaAdapter
;
2867 PGET_SET_DEVICE_DATA SetBusData
;
2868 PGET_SET_DEVICE_DATA GetBusData
;
2869 } BUS_INTERFACE_STANDARD
, *PBUS_INTERFACE_STANDARD
;
2871 typedef struct _PCI_DEVICE_PRESENT_INTERFACE
{
2875 PINTERFACE_REFERENCE InterfaceReference
;
2876 PINTERFACE_DEREFERENCE InterfaceDereference
;
2877 PPCI_IS_DEVICE_PRESENT IsDevicePresent
;
2878 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx
;
2879 } PCI_DEVICE_PRESENT_INTERFACE
, *PPCI_DEVICE_PRESENT_INTERFACE
;
2881 typedef struct _DEVICE_CAPABILITIES
{
2886 ULONG LockSupported
: 1;
2887 ULONG EjectSupported
: 1;
2888 ULONG Removable
: 1;
2889 ULONG DockDevice
: 1;
2891 ULONG SilentInstall
: 1;
2892 ULONG RawDeviceOK
: 1;
2893 ULONG SurpriseRemovalOK
: 1;
2894 ULONG WakeFromD0
: 1;
2895 ULONG WakeFromD1
: 1;
2896 ULONG WakeFromD2
: 1;
2897 ULONG WakeFromD3
: 1;
2898 ULONG HardwareDisabled
: 1;
2899 ULONG NonDynamic
: 1;
2900 ULONG WarmEjectSupported
: 1;
2901 ULONG NoDisplayInUI
: 1;
2902 ULONG Reserved
: 14;
2905 DEVICE_POWER_STATE DeviceState
[PowerSystemMaximum
];
2906 SYSTEM_POWER_STATE SystemWake
;
2907 DEVICE_POWER_STATE DeviceWake
;
2911 } DEVICE_CAPABILITIES
, *PDEVICE_CAPABILITIES
;
2913 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION
{
2917 GUID InterfaceClassGuid
;
2918 PUNICODE_STRING SymbolicLinkName
;
2919 } DEVICE_INTERFACE_CHANGE_NOTIFICATION
, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION
;
2921 typedef struct _HWPROFILE_CHANGE_NOTIFICATION
{
2925 } HWPROFILE_CHANGE_NOTIFICATION
, *PHWPROFILE_CHANGE_NOTIFICATION
;
2929 typedef struct _INTERFACE
{
2933 PINTERFACE_REFERENCE InterfaceReference
;
2934 PINTERFACE_DEREFERENCE InterfaceDereference
;
2935 } INTERFACE
, *PINTERFACE
;
2937 typedef struct _PLUGPLAY_NOTIFICATION_HEADER
{
2941 } PLUGPLAY_NOTIFICATION_HEADER
, *PPLUGPLAY_NOTIFICATION_HEADER
;
2943 typedef ULONG PNP_DEVICE_STATE
, *PPNP_DEVICE_STATE
;
2945 /* PNP_DEVICE_STATE */
2947 #define PNP_DEVICE_DISABLED 0x00000001
2948 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
2949 #define PNP_DEVICE_FAILED 0x00000004
2950 #define PNP_DEVICE_REMOVED 0x00000008
2951 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
2952 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
2954 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION
{
2958 struct _FILE_OBJECT
*FileObject
;
2959 LONG NameBufferOffset
;
2960 UCHAR CustomDataBuffer
[1];
2961 } TARGET_DEVICE_CUSTOM_NOTIFICATION
, *PTARGET_DEVICE_CUSTOM_NOTIFICATION
;
2963 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION
{
2967 struct _FILE_OBJECT
*FileObject
;
2968 } TARGET_DEVICE_REMOVAL_NOTIFICATION
, *PTARGET_DEVICE_REMOVAL_NOTIFICATION
;
2970 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE
{
2971 DeviceUsageTypeUndefined
,
2972 DeviceUsageTypePaging
,
2973 DeviceUsageTypeHibernation
,
2974 DeviceUsageTypeDumpFile
2975 } DEVICE_USAGE_NOTIFICATION_TYPE
;
2977 typedef struct _POWER_SEQUENCE
{
2981 } POWER_SEQUENCE
, *PPOWER_SEQUENCE
;
2984 DevicePropertyDeviceDescription
= 0x0,
2985 DevicePropertyHardwareID
= 0x1,
2986 DevicePropertyCompatibleIDs
= 0x2,
2987 DevicePropertyBootConfiguration
= 0x3,
2988 DevicePropertyBootConfigurationTranslated
= 0x4,
2989 DevicePropertyClassName
= 0x5,
2990 DevicePropertyClassGuid
= 0x6,
2991 DevicePropertyDriverKeyName
= 0x7,
2992 DevicePropertyManufacturer
= 0x8,
2993 DevicePropertyFriendlyName
= 0x9,
2994 DevicePropertyLocationInformation
= 0xa,
2995 DevicePropertyPhysicalDeviceObjectName
= 0xb,
2996 DevicePropertyBusTypeGuid
= 0xc,
2997 DevicePropertyLegacyBusType
= 0xd,
2998 DevicePropertyBusNumber
= 0xe,
2999 DevicePropertyEnumeratorName
= 0xf,
3000 DevicePropertyAddress
= 0x10,
3001 DevicePropertyUINumber
= 0x11,
3002 DevicePropertyInstallState
= 0x12,
3003 DevicePropertyRemovalPolicy
= 0x13,
3004 DevicePropertyResourceRequirements
= 0x14,
3005 DevicePropertyAllocatedResources
= 0x15,
3006 DevicePropertyContainerID
= 0x16
3007 } DEVICE_REGISTRY_PROPERTY
;
3009 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY
{
3010 EventCategoryReserved
,
3011 EventCategoryHardwareProfileChange
,
3012 EventCategoryDeviceInterfaceChange
,
3013 EventCategoryTargetDeviceChange
3014 } IO_NOTIFICATION_EVENT_CATEGORY
;
3016 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
3019 (DDKAPI
*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE
)(
3020 IN PVOID NotificationStructure
,
3024 (DDKAPI
*PDEVICE_CHANGE_COMPLETE_CALLBACK
)(
3027 typedef enum _FILE_INFORMATION_CLASS
{
3028 FileDirectoryInformation
= 1,
3029 FileFullDirectoryInformation
,
3030 FileBothDirectoryInformation
,
3031 FileBasicInformation
,
3032 FileStandardInformation
,
3033 FileInternalInformation
,
3035 FileAccessInformation
,
3036 FileNameInformation
,
3037 FileRenameInformation
,
3038 FileLinkInformation
,
3039 FileNamesInformation
,
3040 FileDispositionInformation
,
3041 FilePositionInformation
,
3042 FileFullEaInformation
,
3043 FileModeInformation
,
3044 FileAlignmentInformation
,
3046 FileAllocationInformation
,
3047 FileEndOfFileInformation
,
3048 FileAlternateNameInformation
,
3049 FileStreamInformation
,
3050 FilePipeInformation
,
3051 FilePipeLocalInformation
,
3052 FilePipeRemoteInformation
,
3053 FileMailslotQueryInformation
,
3054 FileMailslotSetInformation
,
3055 FileCompressionInformation
,
3056 FileObjectIdInformation
,
3057 FileCompletionInformation
,
3058 FileMoveClusterInformation
,
3059 FileQuotaInformation
,
3060 FileReparsePointInformation
,
3061 FileNetworkOpenInformation
,
3062 FileAttributeTagInformation
,
3063 FileTrackingInformation
,
3064 FileIdBothDirectoryInformation
,
3065 FileIdFullDirectoryInformation
,
3066 FileValidDataLengthInformation
,
3067 FileShortNameInformation
,
3068 FileIoCompletionNotificationInformation
,
3069 FileIoStatusBlockRangeInformation
,
3070 FileIoPriorityHintInformation
,
3071 FileSfioReserveInformation
,
3072 FileSfioVolumeInformation
,
3073 FileHardLinkInformation
,
3074 FileProcessIdsUsingFileInformation
,
3075 FileNormalizedNameInformation
,
3076 FileNetworkPhysicalNameInformation
,
3077 FileIdGlobalTxDirectoryInformation
,
3078 FileIsRemoteDeviceInformation
,
3079 FileAttributeCacheInformation
,
3080 FileNumaNodeInformation
,
3081 FileStandardLinkInformation
,
3082 FileRemoteProtocolInformation
,
3083 FileMaximumInformation
3084 } FILE_INFORMATION_CLASS
, *PFILE_INFORMATION_CLASS
;
3086 typedef struct _FILE_POSITION_INFORMATION
{
3087 LARGE_INTEGER CurrentByteOffset
;
3088 } FILE_POSITION_INFORMATION
, *PFILE_POSITION_INFORMATION
;
3090 #include <pshpack8.h>
3091 typedef struct _FILE_BASIC_INFORMATION
{
3092 LARGE_INTEGER CreationTime
;
3093 LARGE_INTEGER LastAccessTime
;
3094 LARGE_INTEGER LastWriteTime
;
3095 LARGE_INTEGER ChangeTime
;
3096 ULONG FileAttributes
;
3097 } FILE_BASIC_INFORMATION
, *PFILE_BASIC_INFORMATION
;
3098 #include <poppack.h>
3100 typedef struct _FILE_STANDARD_INFORMATION
{
3101 LARGE_INTEGER AllocationSize
;
3102 LARGE_INTEGER EndOfFile
;
3103 ULONG NumberOfLinks
;
3104 BOOLEAN DeletePending
;
3106 } FILE_STANDARD_INFORMATION
, *PFILE_STANDARD_INFORMATION
;
3108 typedef struct _FILE_NETWORK_OPEN_INFORMATION
{
3109 LARGE_INTEGER CreationTime
;
3110 LARGE_INTEGER LastAccessTime
;
3111 LARGE_INTEGER LastWriteTime
;
3112 LARGE_INTEGER ChangeTime
;
3113 LARGE_INTEGER AllocationSize
;
3114 LARGE_INTEGER EndOfFile
;
3115 ULONG FileAttributes
;
3116 } FILE_NETWORK_OPEN_INFORMATION
, *PFILE_NETWORK_OPEN_INFORMATION
;
3118 typedef enum _FSINFOCLASS
{
3119 FileFsVolumeInformation
= 1,
3120 FileFsLabelInformation
,
3121 FileFsSizeInformation
,
3122 FileFsDeviceInformation
,
3123 FileFsAttributeInformation
,
3124 FileFsControlInformation
,
3125 FileFsFullSizeInformation
,
3126 FileFsObjectIdInformation
,
3127 FileFsDriverPathInformation
,
3128 FileFsVolumeFlagsInformation
,
3129 FileFsMaximumInformation
3130 } FS_INFORMATION_CLASS
, *PFS_INFORMATION_CLASS
;
3132 typedef struct _FILE_FS_DEVICE_INFORMATION
{
3133 DEVICE_TYPE DeviceType
;
3134 ULONG Characteristics
;
3135 } FILE_FS_DEVICE_INFORMATION
, *PFILE_FS_DEVICE_INFORMATION
;
3137 typedef struct _FILE_FULL_EA_INFORMATION
{
3138 ULONG NextEntryOffset
;
3141 USHORT EaValueLength
;
3143 } FILE_FULL_EA_INFORMATION
, *PFILE_FULL_EA_INFORMATION
;
3145 typedef struct _FAST_MUTEX
3152 } FAST_MUTEX
, *PFAST_MUTEX
;
3154 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
3156 typedef struct _OWNER_ENTRY
{
3157 ERESOURCE_THREAD OwnerThread
;
3158 _ANONYMOUS_UNION
union {
3162 } OWNER_ENTRY
, *POWNER_ENTRY
;
3164 typedef struct _ERESOURCE
3166 LIST_ENTRY SystemResourcesList
;
3167 POWNER_ENTRY OwnerTable
;
3170 volatile PKSEMAPHORE SharedWaiters
;
3171 volatile PKEVENT ExclusiveWaiters
;
3172 OWNER_ENTRY OwnerEntry
;
3173 ULONG ActiveEntries
;
3174 ULONG ContentionCount
;
3175 ULONG NumberOfSharedWaiters
;
3176 ULONG NumberOfExclusiveWaiters
;
3177 __GNU_EXTENSION
union
3180 ULONG_PTR CreatorBackTraceIndex
;
3182 KSPIN_LOCK SpinLock
;
3183 } ERESOURCE
, *PERESOURCE
;
3185 /* ERESOURCE.Flag */
3187 #define ResourceNeverExclusive 0x0010
3188 #define ResourceReleaseByOtherThread 0x0020
3189 #define ResourceOwnedExclusive 0x0080
3191 #define RESOURCE_HASH_TABLE_SIZE 64
3194 (DDKAPI
*PFAST_IO_CHECK_IF_POSSIBLE
)(
3195 IN
struct _FILE_OBJECT
*FileObject
,
3196 IN PLARGE_INTEGER FileOffset
,
3200 IN BOOLEAN CheckForReadOperation
,
3201 OUT PIO_STATUS_BLOCK IoStatus
,
3202 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3205 (DDKAPI
*PFAST_IO_READ
)(
3206 IN
struct _FILE_OBJECT
*FileObject
,
3207 IN PLARGE_INTEGER FileOffset
,
3212 OUT PIO_STATUS_BLOCK IoStatus
,
3213 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3216 (DDKAPI
*PFAST_IO_WRITE
)(
3217 IN
struct _FILE_OBJECT
*FileObject
,
3218 IN PLARGE_INTEGER FileOffset
,
3223 OUT PIO_STATUS_BLOCK IoStatus
,
3224 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3227 (DDKAPI
*PFAST_IO_QUERY_BASIC_INFO
)(
3228 IN
struct _FILE_OBJECT
*FileObject
,
3230 OUT PFILE_BASIC_INFORMATION Buffer
,
3231 OUT PIO_STATUS_BLOCK IoStatus
,
3232 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3235 (DDKAPI
*PFAST_IO_QUERY_STANDARD_INFO
)(
3236 IN
struct _FILE_OBJECT
*FileObject
,
3238 OUT PFILE_STANDARD_INFORMATION Buffer
,
3239 OUT PIO_STATUS_BLOCK IoStatus
,
3240 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3243 (DDKAPI
*PFAST_IO_LOCK
)(
3244 IN
struct _FILE_OBJECT
*FileObject
,
3245 IN PLARGE_INTEGER FileOffset
,
3246 IN PLARGE_INTEGER Length
,
3247 PEPROCESS ProcessId
,
3249 BOOLEAN FailImmediately
,
3250 BOOLEAN ExclusiveLock
,
3251 OUT PIO_STATUS_BLOCK IoStatus
,
3252 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3255 (DDKAPI
*PFAST_IO_UNLOCK_SINGLE
)(
3256 IN
struct _FILE_OBJECT
*FileObject
,
3257 IN PLARGE_INTEGER FileOffset
,
3258 IN PLARGE_INTEGER Length
,
3259 PEPROCESS ProcessId
,
3261 OUT PIO_STATUS_BLOCK IoStatus
,
3262 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3265 (DDKAPI
*PFAST_IO_UNLOCK_ALL
)(
3266 IN
struct _FILE_OBJECT
*FileObject
,
3267 PEPROCESS ProcessId
,
3268 OUT PIO_STATUS_BLOCK IoStatus
,
3269 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3272 (DDKAPI
*PFAST_IO_UNLOCK_ALL_BY_KEY
)(
3273 IN
struct _FILE_OBJECT
*FileObject
,
3276 OUT PIO_STATUS_BLOCK IoStatus
,
3277 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3280 (DDKAPI
*PFAST_IO_DEVICE_CONTROL
)(
3281 IN
struct _FILE_OBJECT
*FileObject
,
3283 IN PVOID InputBuffer OPTIONAL
,
3284 IN ULONG InputBufferLength
,
3285 OUT PVOID OutputBuffer OPTIONAL
,
3286 IN ULONG OutputBufferLength
,
3287 IN ULONG IoControlCode
,
3288 OUT PIO_STATUS_BLOCK IoStatus
,
3289 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3292 (DDKAPI
*PFAST_IO_ACQUIRE_FILE
)(
3293 IN
struct _FILE_OBJECT
*FileObject
);
3296 (DDKAPI
*PFAST_IO_RELEASE_FILE
)(
3297 IN
struct _FILE_OBJECT
*FileObject
);
3300 (DDKAPI
*PFAST_IO_DETACH_DEVICE
)(
3301 IN
struct _DEVICE_OBJECT
*SourceDevice
,
3302 IN
struct _DEVICE_OBJECT
*TargetDevice
);
3305 (DDKAPI
*PFAST_IO_QUERY_NETWORK_OPEN_INFO
)(
3306 IN
struct _FILE_OBJECT
*FileObject
,
3308 OUT
struct _FILE_NETWORK_OPEN_INFORMATION
*Buffer
,
3309 OUT
struct _IO_STATUS_BLOCK
*IoStatus
,
3310 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3313 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_MOD_WRITE
)(
3314 IN
struct _FILE_OBJECT
*FileObject
,
3315 IN PLARGE_INTEGER EndingOffset
,
3316 OUT
struct _ERESOURCE
**ResourceToRelease
,
3317 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3320 (DDKAPI
*PFAST_IO_MDL_READ
)(
3321 IN
struct _FILE_OBJECT
*FileObject
,
3322 IN PLARGE_INTEGER FileOffset
,
3326 OUT PIO_STATUS_BLOCK IoStatus
,
3327 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3330 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE
)(
3331 IN
struct _FILE_OBJECT
*FileObject
,
3333 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3336 (DDKAPI
*PFAST_IO_PREPARE_MDL_WRITE
)(
3337 IN
struct _FILE_OBJECT
*FileObject
,
3338 IN PLARGE_INTEGER FileOffset
,
3342 OUT PIO_STATUS_BLOCK IoStatus
,
3343 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3346 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE
)(
3347 IN
struct _FILE_OBJECT
*FileObject
,
3348 IN PLARGE_INTEGER FileOffset
,
3350 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3353 (DDKAPI
*PFAST_IO_READ_COMPRESSED
)(
3354 IN
struct _FILE_OBJECT
*FileObject
,
3355 IN PLARGE_INTEGER FileOffset
,
3360 OUT PIO_STATUS_BLOCK IoStatus
,
3361 OUT
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
3362 IN ULONG CompressedDataInfoLength
,
3363 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3366 (DDKAPI
*PFAST_IO_WRITE_COMPRESSED
)(
3367 IN
struct _FILE_OBJECT
*FileObject
,
3368 IN PLARGE_INTEGER FileOffset
,
3373 OUT PIO_STATUS_BLOCK IoStatus
,
3374 IN
struct _COMPRESSED_DATA_INFO
*CompressedDataInfo
,
3375 IN ULONG CompressedDataInfoLength
,
3376 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3379 (DDKAPI
*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED
)(
3380 IN
struct _FILE_OBJECT
*FileObject
,
3382 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3385 (DDKAPI
*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED
)(
3386 IN
struct _FILE_OBJECT
*FileObject
,
3387 IN PLARGE_INTEGER FileOffset
,
3389 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3392 (DDKAPI
*PFAST_IO_QUERY_OPEN
)(
3393 IN
struct _IRP
*Irp
,
3394 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
3395 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3398 (DDKAPI
*PFAST_IO_RELEASE_FOR_MOD_WRITE
)(
3399 IN
struct _FILE_OBJECT
*FileObject
,
3400 IN
struct _ERESOURCE
*ResourceToRelease
,
3401 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3404 (DDKAPI
*PFAST_IO_ACQUIRE_FOR_CCFLUSH
)(
3405 IN
struct _FILE_OBJECT
*FileObject
,
3406 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3409 (DDKAPI
*PFAST_IO_RELEASE_FOR_CCFLUSH
) (
3410 IN
struct _FILE_OBJECT
*FileObject
,
3411 IN
struct _DEVICE_OBJECT
*DeviceObject
);
3413 typedef struct _FAST_IO_DISPATCH
{
3414 ULONG SizeOfFastIoDispatch
;
3415 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
;
3416 PFAST_IO_READ FastIoRead
;
3417 PFAST_IO_WRITE FastIoWrite
;
3418 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo
;
3419 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo
;
3420 PFAST_IO_LOCK FastIoLock
;
3421 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle
;
3422 PFAST_IO_UNLOCK_ALL FastIoUnlockAll
;
3423 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey
;
3424 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl
;
3425 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection
;
3426 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection
;
3427 PFAST_IO_DETACH_DEVICE FastIoDetachDevice
;
3428 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo
;
3429 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite
;
3430 PFAST_IO_MDL_READ MdlRead
;
3431 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete
;
3432 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite
;
3433 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete
;
3434 PFAST_IO_READ_COMPRESSED FastIoReadCompressed
;
3435 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed
;
3436 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed
;
3437 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed
;
3438 PFAST_IO_QUERY_OPEN FastIoQueryOpen
;
3439 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite
;
3440 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush
;
3441 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush
;
3442 } FAST_IO_DISPATCH
, *PFAST_IO_DISPATCH
;
3444 typedef struct _SECTION_OBJECT_POINTERS
{
3445 PVOID DataSectionObject
;
3446 PVOID SharedCacheMap
;
3447 PVOID ImageSectionObject
;
3448 } SECTION_OBJECT_POINTERS
, *PSECTION_OBJECT_POINTERS
;
3450 typedef struct _IO_COMPLETION_CONTEXT
{
3453 } IO_COMPLETION_CONTEXT
, *PIO_COMPLETION_CONTEXT
;
3455 /* FILE_OBJECT.Flags */
3457 #define FO_FILE_OPEN 0x00000001
3458 #define FO_SYNCHRONOUS_IO 0x00000002
3459 #define FO_ALERTABLE_IO 0x00000004
3460 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
3461 #define FO_WRITE_THROUGH 0x00000010
3462 #define FO_SEQUENTIAL_ONLY 0x00000020
3463 #define FO_CACHE_SUPPORTED 0x00000040
3464 #define FO_NAMED_PIPE 0x00000080
3465 #define FO_STREAM_FILE 0x00000100
3466 #define FO_MAILSLOT 0x00000200
3467 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
3468 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
3469 #define FO_DIRECT_DEVICE_OPEN 0x00000800
3470 #define FO_FILE_MODIFIED 0x00001000
3471 #define FO_FILE_SIZE_CHANGED 0x00002000
3472 #define FO_CLEANUP_COMPLETE 0x00004000
3473 #define FO_TEMPORARY_FILE 0x00008000
3474 #define FO_DELETE_ON_CLOSE 0x00010000
3475 #define FO_OPENED_CASE_SENSITIVE 0x00020000
3476 #define FO_HANDLE_CREATED 0x00040000
3477 #define FO_FILE_FAST_IO_READ 0x00080000
3478 #define FO_RANDOM_ACCESS 0x00100000
3479 #define FO_FILE_OPEN_CANCELLED 0x00200000
3480 #define FO_VOLUME_OPEN 0x00400000
3481 #define FO_REMOTE_ORIGIN 0x01000000
3482 #define FO_DISALLOW_EXCLUSIVE 0x02000000
3483 #define FO_SKIP_COMPLETION_PORT 0x02000000
3484 #define FO_SKIP_SET_EVENT 0x04000000
3485 #define FO_SKIP_SET_FAST_IO 0x08000000
3488 #define VPB_MOUNTED 0x0001
3489 #define VPB_LOCKED 0x0002
3490 #define VPB_PERSISTENT 0x0004
3491 #define VPB_REMOVE_PENDING 0x0008
3492 #define VPB_RAW_MOUNT 0x0010
3493 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
3497 #define SL_FORCE_ACCESS_CHECK 0x01
3498 #define SL_OPEN_PAGING_FILE 0x02
3499 #define SL_OPEN_TARGET_DIRECTORY 0x04
3500 #define SL_CASE_SENSITIVE 0x80
3502 #define SL_KEY_SPECIFIED 0x01
3503 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
3504 #define SL_WRITE_THROUGH 0x04
3505 #define SL_FT_SEQUENTIAL_WRITE 0x08
3507 #define SL_FAIL_IMMEDIATELY 0x01
3508 #define SL_EXCLUSIVE_LOCK 0x02
3510 #define SL_RESTART_SCAN 0x01
3511 #define SL_RETURN_SINGLE_ENTRY 0x02
3512 #define SL_INDEX_SPECIFIED 0x04
3514 #define SL_WATCH_TREE 0x01
3516 #define SL_ALLOW_RAW_MOUNT 0x01
3518 #define CTL_CODE(DeviceType, Function, Method, Access)( \
3519 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
3521 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
3523 #define IRP_NOCACHE 0x00000001
3524 #define IRP_PAGING_IO 0x00000002
3525 #define IRP_MOUNT_COMPLETION 0x00000002
3526 #define IRP_SYNCHRONOUS_API 0x00000004
3527 #define IRP_ASSOCIATED_IRP 0x00000008
3528 #define IRP_BUFFERED_IO 0x00000010
3529 #define IRP_DEALLOCATE_BUFFER 0x00000020
3530 #define IRP_INPUT_OPERATION 0x00000040
3531 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
3532 #define IRP_CREATE_OPERATION 0x00000080
3533 #define IRP_READ_OPERATION 0x00000100
3534 #define IRP_WRITE_OPERATION 0x00000200
3535 #define IRP_CLOSE_OPERATION 0x00000400
3536 #define IRP_DEFER_IO_COMPLETION 0x00000800
3537 #define IRP_OB_QUERY_NAME 0x00001000
3538 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
3540 #define IRP_QUOTA_CHARGED 0x01
3541 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
3542 #define IRP_ALLOCATED_FIXED_SIZE 0x04
3543 #define IRP_LOOKASIDE_ALLOCATION 0x08
3546 ** IRP function codes
3549 #define IRP_MJ_CREATE 0x00
3550 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
3551 #define IRP_MJ_CLOSE 0x02
3552 #define IRP_MJ_READ 0x03
3553 #define IRP_MJ_WRITE 0x04
3554 #define IRP_MJ_QUERY_INFORMATION 0x05
3555 #define IRP_MJ_SET_INFORMATION 0x06
3556 #define IRP_MJ_QUERY_EA 0x07
3557 #define IRP_MJ_SET_EA 0x08
3558 #define IRP_MJ_FLUSH_BUFFERS 0x09
3559 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
3560 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
3561 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
3562 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
3563 #define IRP_MJ_DEVICE_CONTROL 0x0e
3564 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
3565 #define IRP_MJ_SCSI 0x0f
3566 #define IRP_MJ_SHUTDOWN 0x10
3567 #define IRP_MJ_LOCK_CONTROL 0x11
3568 #define IRP_MJ_CLEANUP 0x12
3569 #define IRP_MJ_CREATE_MAILSLOT 0x13
3570 #define IRP_MJ_QUERY_SECURITY 0x14
3571 #define IRP_MJ_SET_SECURITY 0x15
3572 #define IRP_MJ_POWER 0x16
3573 #define IRP_MJ_SYSTEM_CONTROL 0x17
3574 #define IRP_MJ_DEVICE_CHANGE 0x18
3575 #define IRP_MJ_QUERY_QUOTA 0x19
3576 #define IRP_MJ_SET_QUOTA 0x1a
3577 #define IRP_MJ_PNP 0x1b
3578 #define IRP_MJ_PNP_POWER 0x1b
3579 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
3581 #define IRP_MN_SCSI_CLASS 0x01
3583 #define IRP_MN_START_DEVICE 0x00
3584 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
3585 #define IRP_MN_REMOVE_DEVICE 0x02
3586 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
3587 #define IRP_MN_STOP_DEVICE 0x04
3588 #define IRP_MN_QUERY_STOP_DEVICE 0x05
3589 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
3591 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
3592 #define IRP_MN_QUERY_INTERFACE 0x08
3593 #define IRP_MN_QUERY_CAPABILITIES 0x09
3594 #define IRP_MN_QUERY_RESOURCES 0x0A
3595 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
3596 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
3597 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
3599 #define IRP_MN_READ_CONFIG 0x0F
3600 #define IRP_MN_WRITE_CONFIG 0x10
3601 #define IRP_MN_EJECT 0x11
3602 #define IRP_MN_SET_LOCK 0x12
3603 #define IRP_MN_QUERY_ID 0x13
3604 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
3605 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
3606 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
3607 #define IRP_MN_SURPRISE_REMOVAL 0x17
3609 #define IRP_MN_WAIT_WAKE 0x00
3610 #define IRP_MN_POWER_SEQUENCE 0x01
3611 #define IRP_MN_SET_POWER 0x02
3612 #define IRP_MN_QUERY_POWER 0x03
3614 #define IRP_MN_QUERY_ALL_DATA 0x00
3615 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
3616 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
3617 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
3618 #define IRP_MN_ENABLE_EVENTS 0x04
3619 #define IRP_MN_DISABLE_EVENTS 0x05
3620 #define IRP_MN_ENABLE_COLLECTION 0x06
3621 #define IRP_MN_DISABLE_COLLECTION 0x07
3622 #define IRP_MN_REGINFO 0x08
3623 #define IRP_MN_EXECUTE_METHOD 0x09
3625 #define IRP_MN_REGINFO_EX 0x0b
3627 typedef struct _FILE_OBJECT
3631 PDEVICE_OBJECT DeviceObject
;
3635 PSECTION_OBJECT_POINTERS SectionObjectPointer
;
3636 PVOID PrivateCacheMap
;
3637 NTSTATUS FinalStatus
;
3638 struct _FILE_OBJECT
*RelatedFileObject
;
3639 BOOLEAN LockOperation
;
3640 BOOLEAN DeletePending
;
3642 BOOLEAN WriteAccess
;
3643 BOOLEAN DeleteAccess
;
3645 BOOLEAN SharedWrite
;
3646 BOOLEAN SharedDelete
;
3648 UNICODE_STRING FileName
;
3649 LARGE_INTEGER CurrentByteOffset
;
3650 volatile ULONG Waiters
;
3651 volatile ULONG Busy
;
3655 volatile PIO_COMPLETION_CONTEXT CompletionContext
;
3656 KSPIN_LOCK IrpListLock
;
3658 volatile PVOID FileObjectExtension
;
3660 typedef struct _FILE_OBJECT
*PFILE_OBJECT
;
3662 typedef struct _IO_ERROR_LOG_PACKET
{
3663 UCHAR MajorFunctionCode
;
3665 USHORT DumpDataSize
;
3666 USHORT NumberOfStrings
;
3667 USHORT StringOffset
;
3668 USHORT EventCategory
;
3670 ULONG UniqueErrorValue
;
3671 NTSTATUS FinalStatus
;
3672 ULONG SequenceNumber
;
3673 ULONG IoControlCode
;
3674 LARGE_INTEGER DeviceOffset
;
3676 } IO_ERROR_LOG_PACKET
, *PIO_ERROR_LOG_PACKET
;
3678 typedef struct _IO_ERROR_LOG_MESSAGE
{
3681 USHORT DriverNameLength
;
3682 LARGE_INTEGER TimeStamp
;
3683 ULONG DriverNameOffset
;
3684 IO_ERROR_LOG_PACKET EntryData
;
3685 } IO_ERROR_LOG_MESSAGE
, *PIO_ERROR_LOG_MESSAGE
;
3687 #define ERROR_LOG_LIMIT_SIZE 240
3688 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
3689 sizeof(IO_ERROR_LOG_PACKET) + \
3690 (sizeof(WCHAR) * 40))
3691 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
3692 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
3693 #define IO_ERROR_LOG_MESSAGE_LENGTH \
3694 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
3695 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
3696 PORT_MAXIMUM_MESSAGE_LENGTH)
3697 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
3698 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
3700 typedef enum _DMA_WIDTH
{
3705 } DMA_WIDTH
, *PDMA_WIDTH
;
3707 typedef enum _DMA_SPEED
{
3714 } DMA_SPEED
, *PDMA_SPEED
;
3716 /* DEVICE_DESCRIPTION.Version */
3718 #define DEVICE_DESCRIPTION_VERSION 0x0000
3719 #define DEVICE_DESCRIPTION_VERSION1 0x0001
3720 #define DEVICE_DESCRIPTION_VERSION2 0x0002
3722 typedef struct _DEVICE_DESCRIPTION
{
3725 BOOLEAN ScatterGather
;
3727 BOOLEAN AutoInitialize
;
3728 BOOLEAN Dma32BitAddresses
;
3729 BOOLEAN IgnoreCount
;
3731 BOOLEAN Dma64BitAddresses
;
3734 INTERFACE_TYPE InterfaceType
;
3737 ULONG MaximumLength
;
3739 } DEVICE_DESCRIPTION
, *PDEVICE_DESCRIPTION
;
3741 typedef enum _DEVICE_RELATION_TYPE
{
3746 TargetDeviceRelation
,
3749 } DEVICE_RELATION_TYPE
, *PDEVICE_RELATION_TYPE
;
3751 typedef struct _DEVICE_RELATIONS
{
3753 PDEVICE_OBJECT Objects
[1];
3754 } DEVICE_RELATIONS
, *PDEVICE_RELATIONS
;
3756 typedef struct _DEVOBJ_EXTENSION
3760 PDEVICE_OBJECT DeviceObject
;
3761 } DEVOBJ_EXTENSION
, *PDEVOBJ_EXTENSION
;
3763 typedef struct _SCATTER_GATHER_ELEMENT
{
3764 PHYSICAL_ADDRESS Address
;
3767 } SCATTER_GATHER_ELEMENT
, *PSCATTER_GATHER_ELEMENT
;
3769 #if defined(_MSC_EXTENSIONS)
3771 #if _MSC_VER >= 1200
3772 #pragma warning(push)
3774 #pragma warning(disable:4200)
3775 typedef struct _SCATTER_GATHER_LIST
{
3776 ULONG NumberOfElements
;
3778 SCATTER_GATHER_ELEMENT Elements
[1];
3779 } SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
3781 #if _MSC_VER >= 1200
3782 #pragma warning(pop)
3784 #pragma warning(default:4200)
3789 struct _SCATTER_GATHER_LIST
;
3790 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST
, *PSCATTER_GATHER_LIST
;
3795 (DDKAPI DRIVER_ADD_DEVICE
)(
3796 IN
struct _DRIVER_OBJECT
*DriverObject
,
3797 IN
struct _DEVICE_OBJECT
*PhysicalDeviceObject
);
3798 typedef DRIVER_ADD_DEVICE
*PDRIVER_ADD_DEVICE
;
3800 typedef struct _DRIVER_EXTENSION
{
3801 struct _DRIVER_OBJECT
*DriverObject
;
3802 PDRIVER_ADD_DEVICE AddDevice
;
3804 UNICODE_STRING ServiceKeyName
;
3805 } DRIVER_EXTENSION
, *PDRIVER_EXTENSION
;
3807 #define DRVO_UNLOAD_INVOKED 0x00000001
3808 #define DRVO_LEGACY_DRIVER 0x00000002
3809 #define DRVO_BUILTIN_DRIVER 0x00000004
3812 (DDKAPI DRIVER_INITIALIZE
)(
3813 IN
struct _DRIVER_OBJECT
*DriverObject
,
3814 IN PUNICODE_STRING RegistryPath
);
3815 typedef DRIVER_INITIALIZE
*PDRIVER_INITIALIZE
;
3818 (DDKAPI DRIVER_STARTIO
)(
3819 IN
struct _DEVICE_OBJECT
*DeviceObject
,
3820 IN
struct _IRP
*Irp
);
3821 typedef DRIVER_STARTIO
*PDRIVER_STARTIO
;
3824 (DDKAPI DRIVER_UNLOAD
)(
3825 IN
struct _DRIVER_OBJECT
*DriverObject
);
3826 typedef DRIVER_UNLOAD
*PDRIVER_UNLOAD
;
3829 (DDKAPI DRIVER_DISPATCH
)(
3830 IN
struct _DEVICE_OBJECT
*DeviceObject
,
3831 IN
struct _IRP
*Irp
);
3832 typedef DRIVER_DISPATCH
*PDRIVER_DISPATCH
;
3834 typedef struct _DRIVER_OBJECT
{
3837 PDEVICE_OBJECT DeviceObject
;
3841 PVOID DriverSection
;
3842 PDRIVER_EXTENSION DriverExtension
;
3843 UNICODE_STRING DriverName
;
3844 PUNICODE_STRING HardwareDatabase
;
3845 struct _FAST_IO_DISPATCH
*FastIoDispatch
;
3846 PDRIVER_INITIALIZE DriverInit
;
3847 PDRIVER_STARTIO DriverStartIo
;
3848 PDRIVER_UNLOAD DriverUnload
;
3849 PDRIVER_DISPATCH MajorFunction
[IRP_MJ_MAXIMUM_FUNCTION
+ 1];
3851 typedef struct _DRIVER_OBJECT
*PDRIVER_OBJECT
;
3853 typedef struct _DMA_ADAPTER
{
3856 struct _DMA_OPERATIONS
* DmaOperations
;
3857 } DMA_ADAPTER
, *PDMA_ADAPTER
;
3860 (DDKAPI
*PPUT_DMA_ADAPTER
)(
3861 IN PDMA_ADAPTER DmaAdapter
);
3864 (DDKAPI
*PALLOCATE_COMMON_BUFFER
)(
3865 IN PDMA_ADAPTER DmaAdapter
,
3867 OUT PPHYSICAL_ADDRESS LogicalAddress
,
3868 IN BOOLEAN CacheEnabled
);
3871 (DDKAPI
*PFREE_COMMON_BUFFER
)(
3872 IN PDMA_ADAPTER DmaAdapter
,
3874 IN PHYSICAL_ADDRESS LogicalAddress
,
3875 IN PVOID VirtualAddress
,
3876 IN BOOLEAN CacheEnabled
);
3879 (DDKAPI
*PALLOCATE_ADAPTER_CHANNEL
)(
3880 IN PDMA_ADAPTER DmaAdapter
,
3881 IN PDEVICE_OBJECT DeviceObject
,
3882 IN ULONG NumberOfMapRegisters
,
3883 IN PDRIVER_CONTROL ExecutionRoutine
,
3887 (DDKAPI
*PFLUSH_ADAPTER_BUFFERS
)(
3888 IN PDMA_ADAPTER DmaAdapter
,
3890 IN PVOID MapRegisterBase
,