1 $if (_WDMDDK_ || _NTDDK_)
2 /******************************************************************************
3 * I/O Manager Types *
4 ******************************************************************************/
5 $endif (_WDMDDK_ || _NTDDK_)
6
7 $if (_WDMDDK_)
8
9 #define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS
10
11 #define CONNECT_FULLY_SPECIFIED 0x1
12 #define CONNECT_LINE_BASED 0x2
13 #define CONNECT_MESSAGE_BASED 0x3
14 #define CONNECT_FULLY_SPECIFIED_GROUP 0x4
15 #define CONNECT_CURRENT_VERSION 0x4
16
17 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 0x8
18 #define POOL_RAISE_IF_ALLOCATION_FAILURE 0x10
19 #define POOL_COLD_ALLOCATION 0x100
20 #define POOL_NX_ALLOCATION 0x200
21 #define POOL_ZERO_ALLOCATION 0x400
22
23 #define IO_TYPE_ADAPTER 1
24 #define IO_TYPE_CONTROLLER 2
25 #define IO_TYPE_DEVICE 3
26 #define IO_TYPE_DRIVER 4
27 #define IO_TYPE_FILE 5
28 #define IO_TYPE_IRP 6
29 #define IO_TYPE_MASTER_ADAPTER 7
30 #define IO_TYPE_OPEN_PACKET 8
31 #define IO_TYPE_TIMER 9
32 #define IO_TYPE_VPB 10
33 #define IO_TYPE_ERROR_LOG 11
34 #define IO_TYPE_ERROR_MESSAGE 12
35 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
36
37 #define IO_TYPE_CSQ_IRP_CONTEXT 1
38 #define IO_TYPE_CSQ 2
39 #define IO_TYPE_CSQ_EX 3
40
41 /* IO_RESOURCE_DESCRIPTOR.Option */
42 #define IO_RESOURCE_PREFERRED 0x01
43 #define IO_RESOURCE_DEFAULT 0x02
44 #define IO_RESOURCE_ALTERNATIVE 0x08
45
46 $endif (_WDMDDK_)
47 $if (_WDMDDK_ || _DEVIOCTL_)
48 /* DEVICE_OBJECT.DeviceType */
49 #define DEVICE_TYPE ULONG
50
51 #define FILE_DEVICE_BEEP 0x00000001
52 #define FILE_DEVICE_CD_ROM 0x00000002
53 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
54 #define FILE_DEVICE_CONTROLLER 0x00000004
55 #define FILE_DEVICE_DATALINK 0x00000005
56 #define FILE_DEVICE_DFS 0x00000006
57 #define FILE_DEVICE_DISK 0x00000007
58 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
59 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
60 #define FILE_DEVICE_INPORT_PORT 0x0000000a
61 #define FILE_DEVICE_KEYBOARD 0x0000000b
62 #define FILE_DEVICE_MAILSLOT 0x0000000c
63 #define FILE_DEVICE_MIDI_IN 0x0000000d
64 #define FILE_DEVICE_MIDI_OUT 0x0000000e
65 #define FILE_DEVICE_MOUSE 0x0000000f
66 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
67 #define FILE_DEVICE_NAMED_PIPE 0x00000011
68 #define FILE_DEVICE_NETWORK 0x00000012
69 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
70 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
71 #define FILE_DEVICE_NULL 0x00000015
72 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
73 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
74 #define FILE_DEVICE_PRINTER 0x00000018
75 #define FILE_DEVICE_SCANNER 0x00000019
76 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
77 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
78 #define FILE_DEVICE_SCREEN 0x0000001c
79 #define FILE_DEVICE_SOUND 0x0000001d
80 #define FILE_DEVICE_STREAMS 0x0000001e
81 #define FILE_DEVICE_TAPE 0x0000001f
82 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
83 #define FILE_DEVICE_TRANSPORT 0x00000021
84 #define FILE_DEVICE_UNKNOWN 0x00000022
85 #define FILE_DEVICE_VIDEO 0x00000023
86 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
87 #define FILE_DEVICE_WAVE_IN 0x00000025
88 #define FILE_DEVICE_WAVE_OUT 0x00000026
89 #define FILE_DEVICE_8042_PORT 0x00000027
90 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
91 #define FILE_DEVICE_BATTERY 0x00000029
92 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
93 #define FILE_DEVICE_MODEM 0x0000002b
94 #define FILE_DEVICE_VDM 0x0000002c
95 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
96 #define FILE_DEVICE_SMB 0x0000002e
97 #define FILE_DEVICE_KS 0x0000002f
98 #define FILE_DEVICE_CHANGER 0x00000030
99 #define FILE_DEVICE_SMARTCARD 0x00000031
100 #define FILE_DEVICE_ACPI 0x00000032
101 #define FILE_DEVICE_DVD 0x00000033
102 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
103 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
104 #define FILE_DEVICE_DFS_VOLUME 0x00000036
105 #define FILE_DEVICE_SERENUM 0x00000037
106 #define FILE_DEVICE_TERMSRV 0x00000038
107 #define FILE_DEVICE_KSEC 0x00000039
108 #define FILE_DEVICE_FIPS 0x0000003a
109 #define FILE_DEVICE_INFINIBAND 0x0000003b
110 #define FILE_DEVICE_VMBUS 0x0000003e
111 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003f
112 #define FILE_DEVICE_WPD 0x00000040
113 #define FILE_DEVICE_BLUETOOTH 0x00000041
114 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
115 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
116 #define FILE_DEVICE_BIOMETRIC 0x00000044
117 #define FILE_DEVICE_PMI 0x00000045
118 #define FILE_DEVICE_EHSTOR 0x00000046
119 #define FILE_DEVICE_DEVAPI 0x00000047
120 #define FILE_DEVICE_GPIO 0x00000048
121 #define FILE_DEVICE_USBEX 0x00000049
122 #define FILE_DEVICE_CONSOLE 0x00000050
123 #define FILE_DEVICE_NFP 0x00000051
124 #define FILE_DEVICE_SYSENV 0x00000052
125 #define FILE_DEVICE_VIRTUAL_BLOCK 0x00000053
126 #define FILE_DEVICE_POINT_OF_SERVICE 0x00000054
127 #define FILE_DEVICE_STORAGE_REPLICATION 0x00000055
128 #define FILE_DEVICE_TRUST_ENV 0x00000056
129 #define FILE_DEVICE_UCM 0x00000057
130 #define FILE_DEVICE_UCMTCPCI 0x00000058
131 #define FILE_DEVICE_PERSISTENT_MEMORY 0x00000059
132 #define FILE_DEVICE_NVDIMM 0x0000005a
133 #define FILE_DEVICE_HOLOGRAPHIC 0x0000005b
134 #define FILE_DEVICE_SDFXHCI 0x0000005c
135 #define FILE_DEVICE_UCMUCSI 0x0000005d
136
137 $endif (_WDMDDK_ || _DEVIOCTL_)
138 $if (_WDMDDK_)
139 #if defined(NT_PROCESSOR_GROUPS)
140
141 typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
142
143 enum _IRQ_DEVICE_POLICY_USHORT {
144 IrqPolicyMachineDefault = 0,
145 IrqPolicyAllCloseProcessors = 1,
146 IrqPolicyOneCloseProcessor = 2,
147 IrqPolicyAllProcessorsInMachine = 3,
148 IrqPolicyAllProcessorsInGroup = 3,
149 IrqPolicySpecifiedProcessors = 4,
150 IrqPolicySpreadMessagesAcrossAllProcessors = 5};
151
152 #else /* defined(NT_PROCESSOR_GROUPS) */
153
154 typedef enum _IRQ_DEVICE_POLICY {
155 IrqPolicyMachineDefault = 0,
156 IrqPolicyAllCloseProcessors,
157 IrqPolicyOneCloseProcessor,
158 IrqPolicyAllProcessorsInMachine,
159 IrqPolicySpecifiedProcessors,
160 IrqPolicySpreadMessagesAcrossAllProcessors
161 } IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
162
163 #endif
164
165 typedef enum _IRQ_PRIORITY {
166 IrqPriorityUndefined = 0,
167 IrqPriorityLow,
168 IrqPriorityNormal,
169 IrqPriorityHigh
170 } IRQ_PRIORITY, *PIRQ_PRIORITY;
171
172 typedef enum _IRQ_GROUP_POLICY {
173 GroupAffinityAllGroupZero = 0,
174 GroupAffinityDontCare
175 } IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY;
176
177 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
178
179 typedef struct _OBJECT_HANDLE_INFORMATION {
180 ULONG HandleAttributes;
181 ACCESS_MASK GrantedAccess;
182 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
183
184 typedef struct _CLIENT_ID {
185 HANDLE UniqueProcess;
186 HANDLE UniqueThread;
187 } CLIENT_ID, *PCLIENT_ID;
188
189 typedef struct _VPB {
190 CSHORT Type;
191 CSHORT Size;
192 USHORT Flags;
193 USHORT VolumeLabelLength;
194 struct _DEVICE_OBJECT *DeviceObject;
195 struct _DEVICE_OBJECT *RealDevice;
196 ULONG SerialNumber;
197 ULONG ReferenceCount;
198 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
199 } VPB, *PVPB;
200
201 typedef enum _IO_ALLOCATION_ACTION {
202 KeepObject = 1,
203 DeallocateObject,
204 DeallocateObjectKeepRegisters
205 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
206
207 _Function_class_(DRIVER_CONTROL)
208 _IRQL_requires_same_
209 typedef IO_ALLOCATION_ACTION
210 (NTAPI DRIVER_CONTROL)(
211 _In_ struct _DEVICE_OBJECT *DeviceObject,
212 _Inout_ struct _IRP *Irp,
213 _In_ PVOID MapRegisterBase,
214 _In_ PVOID Context);
215 typedef DRIVER_CONTROL *PDRIVER_CONTROL;
216
217 typedef struct _WAIT_CONTEXT_BLOCK {
218 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
219 PDRIVER_CONTROL DeviceRoutine;
220 PVOID DeviceContext;
221 ULONG NumberOfMapRegisters;
222 PVOID DeviceObject;
223 PVOID CurrentIrp;
224 PKDPC BufferChainingDpc;
225 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
226
227 $endif (_WDMDDK_)
228 $if (_NTDDK_)
229 /* DEVICE_OBJECT.Flags */
230 #define DO_DEVICE_HAS_NAME 0x00000040
231 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
232 #define DO_LONG_TERM_REQUESTS 0x00000200
233 #define DO_NEVER_LAST_DEVICE 0x00000400
234 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
235 #define DO_SUPPORTS_TRANSACTIONS 0x00040000
236 #define DO_FORCE_NEITHER_IO 0x00080000
237 #define DO_VOLUME_DEVICE_OBJECT 0x00100000
238 #define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
239 #define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
240 #define DO_DISALLOW_EXECUTE 0x00800000
241
242 $endif (_NTDDK_)
243 $if (_WDMDDK_)
244 /* DEVICE_OBJECT.Flags */
245 #define DO_UNLOAD_PENDING 0x00000001
246 #define DO_VERIFY_VOLUME 0x00000002
247 #define DO_BUFFERED_IO 0x00000004
248 #define DO_EXCLUSIVE 0x00000008
249 #define DO_DIRECT_IO 0x00000010
250 #define DO_MAP_IO_BUFFER 0x00000020
251 #define DO_DEVICE_INITIALIZING 0x00000080
252 #define DO_SHUTDOWN_REGISTERED 0x00000800
253 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
254 #define DO_POWER_PAGABLE 0x00002000
255 #define DO_POWER_INRUSH 0x00004000
256
257 /* DEVICE_OBJECT.Characteristics */
258 #define FILE_REMOVABLE_MEDIA 0x00000001
259 #define FILE_READ_ONLY_DEVICE 0x00000002
260 #define FILE_FLOPPY_DISKETTE 0x00000004
261 #define FILE_WRITE_ONCE_MEDIA 0x00000008
262 #define FILE_REMOTE_DEVICE 0x00000010
263 #define FILE_DEVICE_IS_MOUNTED 0x00000020
264 #define FILE_VIRTUAL_VOLUME 0x00000040
265 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
266 #define FILE_DEVICE_SECURE_OPEN 0x00000100
267 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
268 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
269 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
270 #define FILE_PORTABLE_DEVICE 0x00004000
271 #define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000
272
273 /* DEVICE_OBJECT.AlignmentRequirement */
274 #define FILE_BYTE_ALIGNMENT 0x00000000
275 #define FILE_WORD_ALIGNMENT 0x00000001
276 #define FILE_LONG_ALIGNMENT 0x00000003
277 #define FILE_QUAD_ALIGNMENT 0x00000007
278 #define FILE_OCTA_ALIGNMENT 0x0000000f
279 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
280 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
281 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
282 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
283 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
284
285 $endif (_WDMDDK_)
286
287 $if (_WDMDDK_)
288 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
289 CSHORT Type;
290 USHORT Size;
291 LONG ReferenceCount;
292 struct _DRIVER_OBJECT *DriverObject;
293 struct _DEVICE_OBJECT *NextDevice;
294 struct _DEVICE_OBJECT *AttachedDevice;
295 struct _IRP *CurrentIrp;
296 PIO_TIMER Timer;
297 ULONG Flags;
298 ULONG Characteristics;
299 volatile PVPB Vpb;
300 PVOID DeviceExtension;
301 DEVICE_TYPE DeviceType;
302 CCHAR StackSize;
303 union {
304 LIST_ENTRY ListEntry;
305 WAIT_CONTEXT_BLOCK Wcb;
306 } Queue;
307 ULONG AlignmentRequirement;
308 KDEVICE_QUEUE DeviceQueue;
309 KDPC Dpc;
310 ULONG ActiveThreadCount;
311 PSECURITY_DESCRIPTOR SecurityDescriptor;
312 KEVENT DeviceLock;
313 USHORT SectorSize;
314 USHORT Spare1;
315 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
316 PVOID Reserved;
317 } DEVICE_OBJECT, *PDEVICE_OBJECT;
318
319 typedef enum _IO_SESSION_STATE {
320 IoSessionStateCreated = 1,
321 IoSessionStateInitialized,
322 IoSessionStateConnected,
323 IoSessionStateDisconnected,
324 IoSessionStateDisconnectedLoggedOn,
325 IoSessionStateLoggedOn,
326 IoSessionStateLoggedOff,
327 IoSessionStateTerminated,
328 IoSessionStateMax
329 } IO_SESSION_STATE, *PIO_SESSION_STATE;
330
331 typedef enum _IO_COMPLETION_ROUTINE_RESULT {
332 ContinueCompletion = STATUS_CONTINUE_COMPLETION,
333 StopCompletion = STATUS_MORE_PROCESSING_REQUIRED
334 } IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT;
335
336 typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY {
337 PHYSICAL_ADDRESS MessageAddress;
338 KAFFINITY TargetProcessorSet;
339 PKINTERRUPT InterruptObject;
340 ULONG MessageData;
341 ULONG Vector;
342 KIRQL Irql;
343 KINTERRUPT_MODE Mode;
344 KINTERRUPT_POLARITY Polarity;
345 } IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY;
346
347 typedef struct _IO_INTERRUPT_MESSAGE_INFO {
348 KIRQL UnifiedIrql;
349 ULONG MessageCount;
350 IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1];
351 } IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO;
352
353 typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS {
354 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
355 _Out_ PKINTERRUPT *InterruptObject;
356 _In_ PKSERVICE_ROUTINE ServiceRoutine;
357 _In_ PVOID ServiceContext;
358 _In_opt_ PKSPIN_LOCK SpinLock;
359 _In_ KIRQL SynchronizeIrql;
360 _In_ BOOLEAN FloatingSave;
361 _In_ BOOLEAN ShareVector;
362 _In_ ULONG Vector;
363 _In_ KIRQL Irql;
364 _In_ KINTERRUPT_MODE InterruptMode;
365 _In_ KAFFINITY ProcessorEnableMask;
366 _In_ USHORT Group;
367 } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS;
368
369 typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS {
370 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
371 _Out_ PKINTERRUPT *InterruptObject;
372 _In_ PKSERVICE_ROUTINE ServiceRoutine;
373 _In_ PVOID ServiceContext;
374 _In_opt_ PKSPIN_LOCK SpinLock;
375 _In_opt_ KIRQL SynchronizeIrql;
376 _In_ BOOLEAN FloatingSave;
377 } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS;
378
379 typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
380 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
381 union {
382 _Out_ PVOID *Generic;
383 _Out_ PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable;
384 _Out_ PKINTERRUPT *InterruptObject;
385 } ConnectionContext;
386 _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine;
387 _In_ PVOID ServiceContext;
388 _In_opt_ PKSPIN_LOCK SpinLock;
389 _In_opt_ KIRQL SynchronizeIrql;
390 _In_ BOOLEAN FloatingSave;
391 _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine;
392 } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS;
393
394 typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
395 _Inout_ ULONG Version;
396 _ANONYMOUS_UNION union {
397 IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
398 IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
399 IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
400 } DUMMYUNIONNAME;
401 } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
402
403 typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
404 _In_ ULONG Version;
405 union {
406 _In_ PVOID Generic;
407 _In_ PKINTERRUPT InterruptObject;
408 _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable;
409 } ConnectionContext;
410 } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS;
411
412 typedef struct _IO_REPORT_INTERRUPT_ACTIVE_STATE_PARAMETERS
413 {
414 ULONG Version;
415 union
416 {
417 PVOID Generic;
418 PKINTERRUPT InterruptObject;
419 PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable;
420 } ConnectionContext;
421 } IO_REPORT_INTERRUPT_ACTIVE_STATE_PARAMETERS, *PIO_REPORT_INTERRUPT_ACTIVE_STATE_PARAMETERS;
422
423 typedef enum _IO_ACCESS_TYPE {
424 ReadAccess,
425 WriteAccess,
426 ModifyAccess
427 } IO_ACCESS_TYPE;
428
429 typedef enum _IO_ACCESS_MODE {
430 SequentialAccess,
431 RandomAccess
432 } IO_ACCESS_MODE;
433
434 typedef enum _IO_CONTAINER_NOTIFICATION_CLASS {
435 IoSessionStateNotification,
436 IoMaxContainerNotificationClass
437 } IO_CONTAINER_NOTIFICATION_CLASS;
438
439 typedef struct _IO_SESSION_STATE_NOTIFICATION {
440 ULONG Size;
441 ULONG Flags;
442 PVOID IoObject;
443 ULONG EventMask;
444 PVOID Context;
445 } IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION;
446
447 typedef enum _IO_CONTAINER_INFORMATION_CLASS {
448 IoSessionStateInformation,
449 IoMaxContainerInformationClass
450 } IO_CONTAINER_INFORMATION_CLASS;
451
452 typedef struct _IO_SESSION_STATE_INFORMATION {
453 ULONG SessionId;
454 IO_SESSION_STATE SessionState;
455 BOOLEAN LocalSession;
456 } IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION;
457
458 #if (NTDDI_VERSION >= NTDDI_WIN7)
459
460 typedef NTSTATUS
461 (NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)(
462 VOID);
463
464 typedef NTSTATUS
465 (NTAPI IO_SESSION_NOTIFICATION_FUNCTION)(
466 _In_ PVOID SessionObject,
467 _In_ PVOID IoObject,
468 _In_ ULONG Event,
469 _In_ PVOID Context,
470 _In_reads_bytes_opt_(PayloadLength) PVOID NotificationPayload,
471 _In_ ULONG PayloadLength);
472
473 typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION;
474
475 #endif
476
477 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
478
479 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
480 BOOLEAN Removed;
481 BOOLEAN Reserved[3];
482 volatile LONG IoCount;
483 KEVENT RemoveEvent;
484 } IO_REMOVE_LOCK_COMMON_BLOCK;
485
486 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
487 LONG Signature;
488 LONG HighWatermark;
489 LONGLONG MaxLockedTicks;
490 LONG AllocateTag;
491 LIST_ENTRY LockList;
492 KSPIN_LOCK Spin;
493 volatile LONG LowMemoryCount;
494 ULONG Reserved1[4];
495 PVOID Reserved2;
496 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
497 } IO_REMOVE_LOCK_DBG_BLOCK;
498
499 typedef struct _IO_REMOVE_LOCK {
500 IO_REMOVE_LOCK_COMMON_BLOCK Common;
501 #if DBG
502 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
503 #endif
504 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
505
506 typedef struct _IO_WORKITEM *PIO_WORKITEM;
507
508 _Function_class_(IO_WORKITEM_ROUTINE)
509 _IRQL_requires_(PASSIVE_LEVEL)
510 _IRQL_requires_same_
511 typedef VOID
512 (NTAPI IO_WORKITEM_ROUTINE)(
513 _In_ PDEVICE_OBJECT DeviceObject,
514 _In_opt_ PVOID Context);
515 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
516
517 typedef VOID
518 (NTAPI IO_WORKITEM_ROUTINE_EX)(
519 _In_ PVOID IoObject,
520 _In_opt_ PVOID Context,
521 _In_ PIO_WORKITEM IoWorkItem);
522 typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
523
524 typedef struct _SHARE_ACCESS {
525 ULONG OpenCount;
526 ULONG Readers;
527 ULONG Writers;
528 ULONG Deleters;
529 ULONG SharedRead;
530 ULONG SharedWrite;
531 ULONG SharedDelete;
532 } SHARE_ACCESS, *PSHARE_ACCESS;
533
534 typedef enum _CREATE_FILE_TYPE {
535 CreateFileTypeNone,
536 CreateFileTypeNamedPipe,
537 CreateFileTypeMailslot
538 } CREATE_FILE_TYPE;
539
540 #define IO_FORCE_ACCESS_CHECK 0x001
541 #define IO_NO_PARAMETER_CHECKING 0x100
542
543 #define IO_REPARSE 0x0
544 #define IO_REMOUNT 0x1
545
546 typedef struct _IO_STATUS_BLOCK {
547 _ANONYMOUS_UNION union {
548 NTSTATUS Status;
549 PVOID Pointer;
550 } DUMMYUNIONNAME;
551 ULONG_PTR Information;
552 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
553
554 #if defined(_WIN64)
555 typedef struct _IO_STATUS_BLOCK32 {
556 NTSTATUS Status;
557 ULONG Information;
558 } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
559 #endif
560
561 typedef VOID
562 (NTAPI *PIO_APC_ROUTINE)(
563 _In_ PVOID ApcContext,
564 _In_ PIO_STATUS_BLOCK IoStatusBlock,
565 _In_ ULONG Reserved);
566
567 #define PIO_APC_ROUTINE_DEFINED
568
569 typedef enum _IO_SESSION_EVENT {
570 IoSessionEventIgnore = 0,
571 IoSessionEventCreated,
572 IoSessionEventTerminated,
573 IoSessionEventConnected,
574 IoSessionEventDisconnected,
575 IoSessionEventLogon,
576 IoSessionEventLogoff,
577 IoSessionEventMax
578 } IO_SESSION_EVENT, *PIO_SESSION_EVENT;
579
580 #define IO_SESSION_STATE_ALL_EVENTS 0xffffffff
581 #define IO_SESSION_STATE_CREATION_EVENT 0x00000001
582 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
583 #define IO_SESSION_STATE_CONNECT_EVENT 0x00000004
584 #define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008
585 #define IO_SESSION_STATE_LOGON_EVENT 0x00000010
586 #define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020
587
588 #define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f
589
590 #define IO_SESSION_MAX_PAYLOAD_SIZE 256L
591
592 typedef struct _IO_SESSION_CONNECT_INFO {
593 ULONG SessionId;
594 BOOLEAN LocalSession;
595 } IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO;
596
597 #define EVENT_INCREMENT 1
598 #define IO_NO_INCREMENT 0
599 #define IO_CD_ROM_INCREMENT 1
600 #define IO_DISK_INCREMENT 1
601 #define IO_KEYBOARD_INCREMENT 6
602 #define IO_MAILSLOT_INCREMENT 2
603 #define IO_MOUSE_INCREMENT 6
604 #define IO_NAMED_PIPE_INCREMENT 2
605 #define IO_NETWORK_INCREMENT 2
606 #define IO_PARALLEL_INCREMENT 1
607 #define IO_SERIAL_INCREMENT 2
608 #define IO_SOUND_INCREMENT 8
609 #define IO_VIDEO_INCREMENT 1
610 #define SEMAPHORE_INCREMENT 1
611
612 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
613
614 typedef struct _BOOTDISK_INFORMATION {
615 LONGLONG BootPartitionOffset;
616 LONGLONG SystemPartitionOffset;
617 ULONG BootDeviceSignature;
618 ULONG SystemDeviceSignature;
619 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
620
621 typedef struct _BOOTDISK_INFORMATION_EX {
622 LONGLONG BootPartitionOffset;
623 LONGLONG SystemPartitionOffset;
624 ULONG BootDeviceSignature;
625 ULONG SystemDeviceSignature;
626 GUID BootDeviceGuid;
627 GUID SystemDeviceGuid;
628 BOOLEAN BootDeviceIsGpt;
629 BOOLEAN SystemDeviceIsGpt;
630 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
631
632 #if (NTDDI_VERSION >= NTDDI_WIN7)
633
634 typedef struct _LOADER_PARTITION_INFORMATION_EX {
635 ULONG PartitionStyle;
636 ULONG PartitionNumber;
637 _ANONYMOUS_UNION union {
638 ULONG Signature;
639 GUID DeviceId;
640 } DUMMYUNIONNAME;
641 ULONG Flags;
642 } LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
643
644 typedef struct _BOOTDISK_INFORMATION_LITE {
645 ULONG NumberEntries;
646 LOADER_PARTITION_INFORMATION_EX Entries[1];
647 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
648
649 #else
650
651 #if (NTDDI_VERSION >= NTDDI_VISTA)
652 typedef struct _BOOTDISK_INFORMATION_LITE {
653 ULONG BootDeviceSignature;
654 ULONG SystemDeviceSignature;
655 GUID BootDeviceGuid;
656 GUID SystemDeviceGuid;
657 BOOLEAN BootDeviceIsGpt;
658 BOOLEAN SystemDeviceIsGpt;
659 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
660 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
661
662 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
663
664 #include <pshpack1.h>
665
666 typedef struct _EISA_MEMORY_TYPE {
667 UCHAR ReadWrite:1;
668 UCHAR Cached:1;
669 UCHAR Reserved0:1;
670 UCHAR Type:2;
671 UCHAR Shared:1;
672 UCHAR Reserved1:1;
673 UCHAR MoreEntries:1;
674 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
675
676 typedef struct _EISA_MEMORY_CONFIGURATION {
677 EISA_MEMORY_TYPE ConfigurationByte;
678 UCHAR DataSize;
679 USHORT AddressLowWord;
680 UCHAR AddressHighByte;
681 USHORT MemorySize;
682 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
683
684 typedef struct _EISA_IRQ_DESCRIPTOR {
685 UCHAR Interrupt:4;
686 UCHAR Reserved:1;
687 UCHAR LevelTriggered:1;
688 UCHAR Shared:1;
689 UCHAR MoreEntries:1;
690 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
691
692 typedef struct _EISA_IRQ_CONFIGURATION {
693 EISA_IRQ_DESCRIPTOR ConfigurationByte;
694 UCHAR Reserved;
695 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
696
697 typedef struct _DMA_CONFIGURATION_BYTE0 {
698 UCHAR Channel:3;
699 UCHAR Reserved:3;
700 UCHAR Shared:1;
701 UCHAR MoreEntries:1;
702 } DMA_CONFIGURATION_BYTE0;
703
704 typedef struct _DMA_CONFIGURATION_BYTE1 {
705 UCHAR Reserved0:2;
706 UCHAR TransferSize:2;
707 UCHAR Timing:2;
708 UCHAR Reserved1:2;
709 } DMA_CONFIGURATION_BYTE1;
710
711 typedef struct _EISA_DMA_CONFIGURATION {
712 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
713 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
714 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
715
716 typedef struct _EISA_PORT_DESCRIPTOR {
717 UCHAR NumberPorts:5;
718 UCHAR Reserved:1;
719 UCHAR Shared:1;
720 UCHAR MoreEntries:1;
721 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
722
723 typedef struct _EISA_PORT_CONFIGURATION {
724 EISA_PORT_DESCRIPTOR Configuration;
725 USHORT PortAddress;
726 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
727
728 typedef struct _CM_EISA_SLOT_INFORMATION {
729 UCHAR ReturnCode;
730 UCHAR ReturnFlags;
731 UCHAR MajorRevision;
732 UCHAR MinorRevision;
733 USHORT Checksum;
734 UCHAR NumberFunctions;
735 UCHAR FunctionInformation;
736 ULONG CompressedId;
737 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
738
739 typedef struct _CM_EISA_FUNCTION_INFORMATION {
740 ULONG CompressedId;
741 UCHAR IdSlotFlags1;
742 UCHAR IdSlotFlags2;
743 UCHAR MinorRevision;
744 UCHAR MajorRevision;
745 UCHAR Selections[26];
746 UCHAR FunctionFlags;
747 UCHAR TypeString[80];
748 EISA_MEMORY_CONFIGURATION EisaMemory[9];
749 EISA_IRQ_CONFIGURATION EisaIrq[7];
750 EISA_DMA_CONFIGURATION EisaDma[4];
751 EISA_PORT_CONFIGURATION EisaPort[20];
752 UCHAR InitializationData[60];
753 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
754
755 #include <poppack.h>
756
757 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
758
759 #define EISA_FUNCTION_ENABLED 0x80
760 #define EISA_FREE_FORM_DATA 0x40
761 #define EISA_HAS_PORT_INIT_ENTRY 0x20
762 #define EISA_HAS_PORT_RANGE 0x10
763 #define EISA_HAS_DMA_ENTRY 0x08
764 #define EISA_HAS_IRQ_ENTRY 0x04
765 #define EISA_HAS_MEMORY_ENTRY 0x02
766 #define EISA_HAS_TYPE_ENTRY 0x01
767 #define EISA_HAS_INFORMATION \
768 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
769 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
770
771 #define EISA_MORE_ENTRIES 0x80
772 #define EISA_SYSTEM_MEMORY 0x00
773 #define EISA_MEMORY_TYPE_RAM 0x01
774
775 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
776
777 #define EISA_INVALID_SLOT 0x80
778 #define EISA_INVALID_FUNCTION 0x81
779 #define EISA_INVALID_CONFIGURATION 0x82
780 #define EISA_EMPTY_SLOT 0x83
781 #define EISA_INVALID_BIOS_CALL 0x86
782
783 /*
784 ** Plug and Play structures
785 */
786
787 typedef VOID
788 (NTAPI *PINTERFACE_REFERENCE)(
789 PVOID Context);
790
791 typedef VOID
792 (NTAPI *PINTERFACE_DEREFERENCE)(
793 PVOID Context);
794
795 _Function_class_(TRANSLATE_BUS_ADDRESS)
796 _IRQL_requires_same_
797 typedef BOOLEAN
798 (NTAPI TRANSLATE_BUS_ADDRESS)(
799 _Inout_opt_ PVOID Context,
800 _In_ PHYSICAL_ADDRESS BusAddress,
801 _In_ ULONG Length,
802 _Out_ PULONG AddressSpace,
803 _Out_ PPHYSICAL_ADDRESS TranslatedAddress);
804 typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
805
806 _Function_class_(GET_DMA_ADAPTER)
807 _IRQL_requires_same_
808 typedef struct _DMA_ADAPTER*
809 (NTAPI GET_DMA_ADAPTER)(
810 _Inout_opt_ PVOID Context,
811 _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor,
812 _Out_ PULONG NumberOfMapRegisters);
813 typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
814
815 _Function_class_(GET_SET_DEVICE_DATA)
816 _IRQL_requires_same_
817 typedef ULONG
818 (NTAPI GET_SET_DEVICE_DATA)(
819 _Inout_opt_ PVOID Context,
820 _In_ ULONG DataType,
821 _Inout_updates_bytes_(Length) PVOID Buffer,
822 _In_ ULONG Offset,
823 _In_ ULONG Length);
824 typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
825
826 typedef enum _DEVICE_INSTALL_STATE {
827 InstallStateInstalled,
828 InstallStateNeedsReinstall,
829 InstallStateFailedInstall,
830 InstallStateFinishInstall
831 } DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE;
832
833 typedef struct _LEGACY_BUS_INFORMATION {
834 GUID BusTypeGuid;
835 INTERFACE_TYPE LegacyBusType;
836 ULONG BusNumber;
837 } LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
838
839 typedef enum _DEVICE_REMOVAL_POLICY {
840 RemovalPolicyExpectNoRemoval = 1,
841 RemovalPolicyExpectOrderlyRemoval = 2,
842 RemovalPolicyExpectSurpriseRemoval = 3
843 } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY;
844
845 typedef VOID
846 (NTAPI *PREENUMERATE_SELF)(
847 _In_ PVOID Context);
848
849 typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD {
850 USHORT Size;
851 USHORT Version;
852 PVOID Context;
853 PINTERFACE_REFERENCE InterfaceReference;
854 PINTERFACE_DEREFERENCE InterfaceDereference;
855 PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf;
856 } REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD;
857
858 typedef VOID
859 (NTAPI *PIO_DEVICE_EJECT_CALLBACK)(
860 _In_ NTSTATUS Status,
861 _Inout_opt_ PVOID Context);
862
863 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1
864
865 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
866 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
867 #define PCI_USE_REVISION 0x00000002
868 #define PCI_USE_VENDEV_IDS 0x00000004
869 #define PCI_USE_CLASS_SUBCLASS 0x00000008
870 #define PCI_USE_PROGIF 0x00000010
871 #define PCI_USE_LOCAL_BUS 0x00000020
872 #define PCI_USE_LOCAL_DEVICE 0x00000040
873
874 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
875 ULONG Size;
876 ULONG Flags;
877 USHORT VendorID;
878 USHORT DeviceID;
879 UCHAR RevisionID;
880 USHORT SubVendorID;
881 USHORT SubSystemID;
882 UCHAR BaseClass;
883 UCHAR SubClass;
884 UCHAR ProgIf;
885 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
886
887 _IRQL_requires_max_(PASSIVE_LEVEL)
888 _Must_inspect_result_
889 typedef BOOLEAN
890 (NTAPI PCI_IS_DEVICE_PRESENT)(
891 _In_ USHORT VendorID,
892 _In_ USHORT DeviceID,
893 _In_ UCHAR RevisionID,
894 _In_ USHORT SubVendorID,
895 _In_ USHORT SubSystemID,
896 _In_ ULONG Flags);
897 typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
898
899 _IRQL_requires_max_(PASSIVE_LEVEL)
900 _Must_inspect_result_
901 typedef BOOLEAN
902 (NTAPI PCI_IS_DEVICE_PRESENT_EX)(
903 _In_ PVOID Context,
904 _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
905 typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
906
907 typedef struct _BUS_INTERFACE_STANDARD {
908 USHORT Size;
909 USHORT Version;
910 PVOID Context;
911 PINTERFACE_REFERENCE InterfaceReference;
912 PINTERFACE_DEREFERENCE InterfaceDereference;
913 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
914 PGET_DMA_ADAPTER GetDmaAdapter;
915 PGET_SET_DEVICE_DATA SetBusData;
916 PGET_SET_DEVICE_DATA GetBusData;
917 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
918
919 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
920 USHORT Size;
921 USHORT Version;
922 PVOID Context;
923 PINTERFACE_REFERENCE InterfaceReference;
924 PINTERFACE_DEREFERENCE InterfaceDereference;
925 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
926 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
927 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
928
929 _Struct_size_bytes_(Size)
930 typedef struct _DEVICE_CAPABILITIES {
931 _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES)) USHORT Size;
932 USHORT Version;
933 ULONG DeviceD1:1;
934 ULONG DeviceD2:1;
935 ULONG LockSupported:1;
936 ULONG EjectSupported:1;
937 ULONG Removable:1;
938 ULONG DockDevice:1;
939 ULONG UniqueID:1;
940 ULONG SilentInstall:1;
941 ULONG RawDeviceOK:1;
942 ULONG SurpriseRemovalOK:1;
943 ULONG WakeFromD0:1;
944 ULONG WakeFromD1:1;
945 ULONG WakeFromD2:1;
946 ULONG WakeFromD3:1;
947 ULONG HardwareDisabled:1;
948 ULONG NonDynamic:1;
949 ULONG WarmEjectSupported:1;
950 ULONG NoDisplayInUI:1;
951 ULONG Reserved1:1;
952 ULONG WakeFromInterrupt:1;
953 ULONG SecureDevice:1;
954 ULONG ChildOfVgaEnabledBridge:1;
955 ULONG DecodeIoOnBoot:1;
956 ULONG Reserved:9;
957 ULONG Address;
958 ULONG UINumber;
959 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
960 SYSTEM_POWER_STATE SystemWake;
961 DEVICE_POWER_STATE DeviceWake;
962 ULONG D1Latency;
963 ULONG D2Latency;
964 ULONG D3Latency;
965 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
966
967 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
968 USHORT Version;
969 USHORT Size;
970 GUID Event;
971 GUID InterfaceClassGuid;
972 PUNICODE_STRING SymbolicLinkName;
973 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
974
975 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
976 USHORT Version;
977 USHORT Size;
978 GUID Event;
979 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
980
981 #undef INTERFACE
982
983 typedef struct _INTERFACE {
984 USHORT Size;
985 USHORT Version;
986 PVOID Context;
987 PINTERFACE_REFERENCE InterfaceReference;
988 PINTERFACE_DEREFERENCE InterfaceDereference;
989 } INTERFACE, *PINTERFACE;
990
991 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
992 USHORT Version;
993 USHORT Size;
994 GUID Event;
995 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
996
997 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
998
999 /* PNP_DEVICE_STATE */
1000
1001 #define PNP_DEVICE_DISABLED 0x00000001
1002 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
1003 #define PNP_DEVICE_FAILED 0x00000004
1004 #define PNP_DEVICE_REMOVED 0x00000008
1005 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
1006 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
1007
1008 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
1009 USHORT Version;
1010 USHORT Size;
1011 GUID Event;
1012 struct _FILE_OBJECT *FileObject;
1013 LONG NameBufferOffset;
1014 UCHAR CustomDataBuffer[1];
1015 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
1016
1017 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
1018 USHORT Version;
1019 USHORT Size;
1020 GUID Event;
1021 struct _FILE_OBJECT *FileObject;
1022 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
1023
1024 #if (NTDDI_VERSION >= NTDDI_VISTA)
1025 #include <devpropdef.h>
1026 #define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001
1027 #endif
1028
1029 #define PNP_REPLACE_NO_MAP MAXLONGLONG
1030
1031 _Must_inspect_result_
1032 typedef NTSTATUS
1033 (NTAPI *PREPLACE_MAP_MEMORY)(
1034 _In_ PHYSICAL_ADDRESS TargetPhysicalAddress,
1035 _In_ PHYSICAL_ADDRESS SparePhysicalAddress,
1036 _Inout_ PLARGE_INTEGER NumberOfBytes,
1037 _Outptr_ PVOID *TargetAddress,
1038 _Outptr_ PVOID *SpareAddress);
1039
1040 typedef struct _PNP_REPLACE_MEMORY_LIST {
1041 ULONG AllocatedCount;
1042 ULONG Count;
1043 ULONGLONG TotalLength;
1044 struct {
1045 PHYSICAL_ADDRESS Address;
1046 ULONGLONG Length;
1047 } Ranges[ANYSIZE_ARRAY];
1048 } PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST;
1049
1050 typedef struct _PNP_REPLACE_PROCESSOR_LIST {
1051 PKAFFINITY Affinity;
1052 _Field_range_(<=, MAXIMUM_GROUPS) ULONG GroupCount;
1053 ULONG AllocatedCount;
1054 ULONG Count;
1055 ULONG ApicIds[ANYSIZE_ARRAY];
1056 } PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST;
1057
1058 typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 {
1059 KAFFINITY AffinityMask;
1060 ULONG AllocatedCount;
1061 ULONG Count;
1062 ULONG ApicIds[ANYSIZE_ARRAY];
1063 } PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1;
1064
1065 #define PNP_REPLACE_PARAMETERS_VERSION 2
1066
1067 typedef struct _PNP_REPLACE_PARAMETERS {
1068 ULONG Size;
1069 ULONG Version;
1070 ULONG64 Target;
1071 ULONG64 Spare;
1072 PPNP_REPLACE_PROCESSOR_LIST TargetProcessors;
1073 PPNP_REPLACE_PROCESSOR_LIST SpareProcessors;
1074 PPNP_REPLACE_MEMORY_LIST TargetMemory;
1075 PPNP_REPLACE_MEMORY_LIST SpareMemory;
1076 PREPLACE_MAP_MEMORY MapMemory;
1077 } PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS;
1078
1079 typedef VOID
1080 (NTAPI *PREPLACE_UNLOAD)(
1081 VOID);
1082
1083 _Must_inspect_result_
1084 typedef NTSTATUS
1085 (NTAPI *PREPLACE_BEGIN)(
1086 _In_ PPNP_REPLACE_PARAMETERS Parameters,
1087 _Outptr_ PVOID *Context);
1088
1089 _Must_inspect_result_
1090 typedef NTSTATUS
1091 (NTAPI *PREPLACE_END)(
1092 _In_ PVOID Context);
1093
1094 _Must_inspect_result_
1095 typedef NTSTATUS
1096 (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)(
1097 _In_ PVOID Context,
1098 _In_ PHYSICAL_ADDRESS PhysicalAddress,
1099 _In_ LARGE_INTEGER ByteCount);
1100
1101 _Must_inspect_result_
1102 typedef NTSTATUS
1103 (NTAPI *PREPLACE_SET_PROCESSOR_ID)(
1104 _In_ PVOID Context,
1105 _In_ ULONG ApicId,
1106 _In_ BOOLEAN Target);
1107
1108 _Must_inspect_result_
1109 typedef NTSTATUS
1110 (NTAPI *PREPLACE_SWAP)(
1111 _In_ PVOID Context);
1112
1113 _Must_inspect_result_
1114 typedef NTSTATUS
1115 (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)(
1116 _In_ PVOID Context);
1117
1118 _Must_inspect_result_
1119 typedef NTSTATUS
1120 (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)(
1121 _In_ PVOID Context);
1122
1123 _Must_inspect_result_
1124 typedef NTSTATUS
1125 (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)(
1126 _In_ PVOID Context,
1127 _In_ PHYSICAL_ADDRESS SourceAddress,
1128 _Out_ PPHYSICAL_ADDRESS DestinationAddress);
1129
1130 _Must_inspect_result_
1131 typedef NTSTATUS
1132 (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)(
1133 _In_ PVOID Context,
1134 _In_ BOOLEAN Enable);
1135
1136 #define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1
1137 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
1138 FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
1139
1140 #define PNP_REPLACE_MEMORY_SUPPORTED 0x0001
1141 #define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002
1142 #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004
1143 #define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008
1144 #define PNP_REPLACE_HARDWARE_QUIESCE 0x0010
1145
1146 typedef struct _PNP_REPLACE_DRIVER_INTERFACE {
1147 ULONG Size;
1148 ULONG Version;
1149 ULONG Flags;
1150 PREPLACE_UNLOAD Unload;
1151 PREPLACE_BEGIN BeginReplace;
1152 PREPLACE_END EndReplace;
1153 PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory;
1154 PREPLACE_SET_PROCESSOR_ID SetProcessorId;
1155 PREPLACE_SWAP Swap;
1156 PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror;
1157 PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory;
1158 PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination;
1159 PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce;
1160 } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE;
1161
1162 _Must_inspect_result_
1163 typedef NTSTATUS
1164 (NTAPI *PREPLACE_DRIVER_INIT)(
1165 _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface,
1166 _In_ PVOID Unused);
1167
1168 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
1169 DeviceUsageTypeUndefined,
1170 DeviceUsageTypePaging,
1171 DeviceUsageTypeHibernation,
1172 DeviceUsageTypeDumpFile,
1173 DeviceUsageTypeBoot,
1174 DeviceUsageTypePostDisplay,
1175 DeviceUsageTypeGuestAssigned,
1176 } DEVICE_USAGE_NOTIFICATION_TYPE;
1177
1178 typedef struct _POWER_SEQUENCE {
1179 ULONG SequenceD1;
1180 ULONG SequenceD2;
1181 ULONG SequenceD3;
1182 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
1183
1184 #ifdef _PREFAST_
1185 #define __string_type 0x1000
1186 #define __guid_type 0x2000
1187 #define __multiString_type 0x4000
1188 #else
1189 #define __string_type 0
1190 #define __guid_type 0
1191 #define __multiString_type 0
1192 #endif
1193
1194 typedef enum {
1195 DevicePropertyDeviceDescription = 0x0 | __string_type,
1196 DevicePropertyHardwareID = 0x1 | __multiString_type,
1197 DevicePropertyCompatibleIDs = 0x2 | __multiString_type,
1198 DevicePropertyBootConfiguration = 0x3,
1199 DevicePropertyBootConfigurationTranslated = 0x4,
1200 DevicePropertyClassName = 0x5 | __string_type,
1201 DevicePropertyClassGuid = 0x6 | __string_type,
1202 DevicePropertyDriverKeyName = 0x7 | __string_type,
1203 DevicePropertyManufacturer = 0x8 | __string_type,
1204 DevicePropertyFriendlyName = 0x9 | __string_type,
1205 DevicePropertyLocationInformation = 0xa | __string_type,
1206 DevicePropertyPhysicalDeviceObjectName = 0xb | __string_type,
1207 DevicePropertyBusTypeGuid = 0xc | __guid_type,
1208 DevicePropertyLegacyBusType = 0xd,
1209 DevicePropertyBusNumber = 0xe,
1210 DevicePropertyEnumeratorName = 0xf | __string_type,
1211 DevicePropertyAddress = 0x10,
1212 DevicePropertyUINumber = 0x11,
1213 DevicePropertyInstallState = 0x12,
1214 DevicePropertyRemovalPolicy = 0x13,
1215 DevicePropertyResourceRequirements = 0x14,
1216 DevicePropertyAllocatedResources = 0x15,
1217 DevicePropertyContainerID = 0x16 | __string_type
1218 } DEVICE_REGISTRY_PROPERTY;
1219 #undef __string_type
1220 #undef __guid_type
1221 #undef __multiString_type
1222
1223 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
1224 EventCategoryReserved,
1225 EventCategoryHardwareProfileChange,
1226 EventCategoryDeviceInterfaceChange,
1227 EventCategoryTargetDeviceChange
1228 } IO_NOTIFICATION_EVENT_CATEGORY;
1229
1230 typedef enum _IO_PRIORITY_HINT {
1231 IoPriorityVeryLow = 0,
1232 IoPriorityLow,
1233 IoPriorityNormal,
1234 IoPriorityHigh,
1235 IoPriorityCritical,
1236 MaxIoPriorityTypes
1237 } IO_PRIORITY_HINT;
1238
1239 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
1240
1241 _Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE)
1242 _IRQL_requires_max_(PASSIVE_LEVEL)
1243 typedef NTSTATUS
1244 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
1245 _In_ PVOID NotificationStructure,
1246 _Inout_opt_ PVOID Context);
1247 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE;
1248
1249 _Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK)
1250 _IRQL_requires_same_
1251 typedef VOID
1252 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)(
1253 _Inout_opt_ PVOID Context);
1254 typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK;
1255
1256 typedef enum _FILE_INFORMATION_CLASS {
1257 FileDirectoryInformation = 1,
1258 FileFullDirectoryInformation,
1259 FileBothDirectoryInformation,
1260 FileBasicInformation,
1261 FileStandardInformation,
1262 FileInternalInformation,
1263 FileEaInformation,
1264 FileAccessInformation,
1265 FileNameInformation,
1266 FileRenameInformation,
1267 FileLinkInformation,
1268 FileNamesInformation,
1269 FileDispositionInformation,
1270 FilePositionInformation,
1271 FileFullEaInformation,
1272 FileModeInformation,
1273 FileAlignmentInformation,
1274 FileAllInformation,
1275 FileAllocationInformation,
1276 FileEndOfFileInformation,
1277 FileAlternateNameInformation,
1278 FileStreamInformation,
1279 FilePipeInformation,
1280 FilePipeLocalInformation,
1281 FilePipeRemoteInformation,
1282 FileMailslotQueryInformation,
1283 FileMailslotSetInformation,
1284 FileCompressionInformation,
1285 FileObjectIdInformation,
1286 FileCompletionInformation,
1287 FileMoveClusterInformation,
1288 FileQuotaInformation,
1289 FileReparsePointInformation,
1290 FileNetworkOpenInformation,
1291 FileAttributeTagInformation,
1292 FileTrackingInformation,
1293 FileIdBothDirectoryInformation,
1294 FileIdFullDirectoryInformation,
1295 FileValidDataLengthInformation,
1296 FileShortNameInformation,
1297 #if (NTDDI_VERSION >= NTDDI_VISTA)
1298 FileIoCompletionNotificationInformation,
1299 FileIoStatusBlockRangeInformation,
1300 FileIoPriorityHintInformation,
1301 FileSfioReserveInformation,
1302 FileSfioVolumeInformation,
1303 FileHardLinkInformation,
1304 FileProcessIdsUsingFileInformation,
1305 FileNormalizedNameInformation,
1306 FileNetworkPhysicalNameInformation,
1307 #endif
1308 #if (NTDDI_VERSION >= NTDDI_WIN7)
1309 FileIdGlobalTxDirectoryInformation,
1310 FileIsRemoteDeviceInformation,
1311 FileAttributeCacheInformation,
1312 FileNumaNodeInformation,
1313 FileStandardLinkInformation,
1314 FileRemoteProtocolInformation,
1315 #endif
1316 FileMaximumInformation
1317 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
1318
1319 typedef enum _DIRECTORY_NOTIFY_INFORMATION_CLASS {
1320 DirectoryNotifyInformation = 1,
1321 DirectoryNotifyExtendedInformation
1322 } DIRECTORY_NOTIFY_INFORMATION_CLASS, *PDIRECTORY_NOTIFY_INFORMATION_CLASS;
1323
1324 typedef struct _FILE_POSITION_INFORMATION {
1325 LARGE_INTEGER CurrentByteOffset;
1326 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
1327
1328 typedef struct _FILE_BASIC_INFORMATION {
1329 LARGE_INTEGER CreationTime;
1330 LARGE_INTEGER LastAccessTime;
1331 LARGE_INTEGER LastWriteTime;
1332 LARGE_INTEGER ChangeTime;
1333 ULONG FileAttributes;
1334 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
1335
1336 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
1337 IO_PRIORITY_HINT PriorityHint;
1338 } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
1339
1340 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
1341 ULONG Flags;
1342 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
1343
1344 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
1345 PUCHAR IoStatusBlockRange;
1346 ULONG Length;
1347 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
1348
1349 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION {
1350 BOOLEAN IsRemote;
1351 } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
1352
1353 typedef struct _FILE_NUMA_NODE_INFORMATION {
1354 USHORT NodeNumber;
1355 } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
1356
1357 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
1358 ULONG NumberOfProcessIdsInList;
1359 ULONG_PTR ProcessIdList[1];
1360 } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
1361
1362 typedef struct _FILE_STANDARD_INFORMATION {
1363 LARGE_INTEGER AllocationSize;
1364 LARGE_INTEGER EndOfFile;
1365 ULONG NumberOfLinks;
1366 BOOLEAN DeletePending;
1367 BOOLEAN Directory;
1368 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
1369
1370 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
1371 LARGE_INTEGER CreationTime;
1372 LARGE_INTEGER LastAccessTime;
1373 LARGE_INTEGER LastWriteTime;
1374 LARGE_INTEGER ChangeTime;
1375 LARGE_INTEGER AllocationSize;
1376 LARGE_INTEGER EndOfFile;
1377 ULONG FileAttributes;
1378 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
1379
1380 typedef enum _FSINFOCLASS {
1381 FileFsVolumeInformation = 1,
1382 FileFsLabelInformation,
1383 FileFsSizeInformation,
1384 FileFsDeviceInformation,
1385 FileFsAttributeInformation,
1386 FileFsControlInformation,
1387 FileFsFullSizeInformation,
1388 FileFsObjectIdInformation,
1389 FileFsDriverPathInformation,
1390 FileFsVolumeFlagsInformation,
1391 FileFsMaximumInformation
1392 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
1393
1394 typedef struct _FILE_FS_DEVICE_INFORMATION {
1395 DEVICE_TYPE DeviceType;
1396 ULONG Characteristics;
1397 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
1398
1399 typedef struct _FILE_FULL_EA_INFORMATION {
1400 ULONG NextEntryOffset;
1401 UCHAR Flags;
1402 UCHAR EaNameLength;
1403 USHORT EaValueLength;
1404 CHAR EaName[1];
1405 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
1406
1407 typedef struct _FILE_SFIO_RESERVE_INFORMATION {
1408 ULONG RequestsPerPeriod;
1409 ULONG Period;
1410 BOOLEAN RetryFailures;
1411 BOOLEAN Discardable;
1412 ULONG RequestSize;
1413 ULONG NumOutstandingRequests;
1414 } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
1415
1416 typedef struct _FILE_SFIO_VOLUME_INFORMATION {
1417 ULONG MaximumRequestsPerPeriod;
1418 ULONG MinimumPeriod;
1419 ULONG MinimumTransferSize;
1420 } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
1421
1422 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1
1423 #define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2
1424 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4
1425
1426 #define FM_LOCK_BIT (0x1)
1427 #define FM_LOCK_BIT_V (0x0)
1428 #define FM_LOCK_WAITER_WOKEN (0x2)
1429 #define FM_LOCK_WAITER_INC (0x4)
1430
1431 _Function_class_(FAST_IO_CHECK_IF_POSSIBLE)
1432 _IRQL_requires_same_
1433 typedef BOOLEAN
1434 (NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
1435 _In_ struct _FILE_OBJECT *FileObject,
1436 _In_ PLARGE_INTEGER FileOffset,
1437 _In_ ULONG Length,
1438 _In_ BOOLEAN Wait,
1439 _In_ ULONG LockKey,
1440 _In_ BOOLEAN CheckForReadOperation,
1441 _Out_ PIO_STATUS_BLOCK IoStatus,
1442 _In_ struct _DEVICE_OBJECT *DeviceObject);
1443 typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
1444
1445 _Function_class_(FAST_IO_READ)
1446 _IRQL_requires_same_
1447 typedef BOOLEAN
1448 (NTAPI FAST_IO_READ)(
1449 _In_ struct _FILE_OBJECT *FileObject,
1450 _In_ PLARGE_INTEGER FileOffset,
1451 _In_ ULONG Length,
1452 _In_ BOOLEAN Wait,
1453 _In_ ULONG LockKey,
1454 _Out_ PVOID Buffer,
1455 _Out_ PIO_STATUS_BLOCK IoStatus,
1456 _In_ struct _DEVICE_OBJECT *DeviceObject);
1457 typedef FAST_IO_READ *PFAST_IO_READ;
1458
1459 _Function_class_(FAST_IO_WRITE)
1460 _IRQL_requires_same_
1461 typedef BOOLEAN
1462 (NTAPI FAST_IO_WRITE)(
1463 _In_ struct _FILE_OBJECT *FileObject,
1464 _In_ PLARGE_INTEGER FileOffset,
1465 _In_ ULONG Length,
1466 _In_ BOOLEAN Wait,
1467 _In_ ULONG LockKey,
1468 _In_ PVOID Buffer,
1469 _Out_ PIO_STATUS_BLOCK IoStatus,
1470 _In_ struct _DEVICE_OBJECT *DeviceObject);
1471 typedef FAST_IO_WRITE *PFAST_IO_WRITE;
1472
1473 _Function_class_(FAST_IO_QUERY_BASIC_INFO)
1474 _IRQL_requires_same_
1475 typedef BOOLEAN
1476 (NTAPI FAST_IO_QUERY_BASIC_INFO)(
1477 _In_ struct _FILE_OBJECT *FileObject,
1478 _In_ BOOLEAN Wait,
1479 _Out_ PFILE_BASIC_INFORMATION Buffer,
1480 _Out_ PIO_STATUS_BLOCK IoStatus,
1481 _In_ struct _DEVICE_OBJECT *DeviceObject);
1482 typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
1483
1484 _Function_class_(FAST_IO_QUERY_STANDARD_INFO)
1485 _IRQL_requires_same_
1486 typedef BOOLEAN
1487 (NTAPI FAST_IO_QUERY_STANDARD_INFO)(
1488 _In_ struct _FILE_OBJECT *FileObject,
1489 _In_ BOOLEAN Wait,
1490 _Out_ PFILE_STANDARD_INFORMATION Buffer,
1491 _Out_ PIO_STATUS_BLOCK IoStatus,
1492 _In_ struct _DEVICE_OBJECT *DeviceObject);
1493 typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
1494
1495 _Function_class_(FAST_IO_LOCK)
1496 _IRQL_requires_same_
1497 typedef BOOLEAN
1498 (NTAPI FAST_IO_LOCK)(
1499 _In_ struct _FILE_OBJECT *FileObject,
1500 _In_ PLARGE_INTEGER FileOffset,
1501 _In_ PLARGE_INTEGER Length,
1502 _In_ PEPROCESS ProcessId,
1503 _In_ ULONG Key,
1504 _In_ BOOLEAN FailImmediately,
1505 _In_ BOOLEAN ExclusiveLock,
1506 _Out_ PIO_STATUS_BLOCK IoStatus,
1507 _In_ struct _DEVICE_OBJECT *DeviceObject);
1508 typedef FAST_IO_LOCK *PFAST_IO_LOCK;
1509
1510 _Function_class_(FAST_IO_UNLOCK_SINGLE)
1511 _IRQL_requires_same_
1512 typedef BOOLEAN
1513 (NTAPI FAST_IO_UNLOCK_SINGLE)(
1514 _In_ struct _FILE_OBJECT *FileObject,
1515 _In_ PLARGE_INTEGER FileOffset,
1516 _In_ PLARGE_INTEGER Length,
1517 _In_ PEPROCESS ProcessId,
1518 _In_ ULONG Key,
1519 _Out_ PIO_STATUS_BLOCK IoStatus,
1520 _In_ struct _DEVICE_OBJECT *DeviceObject);
1521 typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
1522
1523 _Function_class_(FAST_IO_UNLOCK_ALL)
1524 _IRQL_requires_same_
1525 typedef BOOLEAN
1526 (NTAPI FAST_IO_UNLOCK_ALL)(
1527 _In_ struct _FILE_OBJECT *FileObject,
1528 _In_ PEPROCESS ProcessId,
1529 _Out_ PIO_STATUS_BLOCK IoStatus,
1530 _In_ struct _DEVICE_OBJECT *DeviceObject);
1531 typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
1532
1533 _Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY)
1534 _IRQL_requires_same_
1535 typedef BOOLEAN
1536 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
1537 _In_ struct _FILE_OBJECT *FileObject,
1538 _In_ PVOID ProcessId,
1539 _In_ ULONG Key,
1540 _Out_ PIO_STATUS_BLOCK IoStatus,
1541 _In_ struct _DEVICE_OBJECT *DeviceObject);
1542 typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
1543
1544 _Function_class_(FAST_IO_DEVICE_CONTROL)
1545 _IRQL_requires_same_
1546 typedef BOOLEAN
1547 (NTAPI FAST_IO_DEVICE_CONTROL)(
1548 _In_ struct _FILE_OBJECT *FileObject,
1549 _In_ BOOLEAN Wait,
1550 _In_opt_ PVOID InputBuffer,
1551 _In_ ULONG InputBufferLength,
1552 _Out_opt_ PVOID OutputBuffer,
1553 _In_ ULONG OutputBufferLength,
1554 _In_ ULONG IoControlCode,
1555 _Out_ PIO_STATUS_BLOCK IoStatus,
1556 _In_ struct _DEVICE_OBJECT *DeviceObject);
1557 typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
1558
1559 _Function_class_(FAST_IO_ACQUIRE_FILE)
1560 _IRQL_requires_same_
1561 typedef VOID
1562 (NTAPI FAST_IO_ACQUIRE_FILE)(
1563 _In_ struct _FILE_OBJECT *FileObject);
1564 typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
1565
1566 _Function_class_(FAST_IO_RELEASE_FILE)
1567 _IRQL_requires_same_
1568 typedef VOID
1569 (NTAPI FAST_IO_RELEASE_FILE)(
1570 _In_ struct _FILE_OBJECT *FileObject);
1571 typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
1572
1573 _Function_class_(FAST_IO_DETACH_DEVICE)
1574 _IRQL_requires_same_
1575 typedef VOID
1576 (NTAPI FAST_IO_DETACH_DEVICE)(
1577 _In_ struct _DEVICE_OBJECT *SourceDevice,
1578 _In_ struct _DEVICE_OBJECT *TargetDevice);
1579 typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
1580
1581 _Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO)
1582 _IRQL_requires_same_
1583 typedef BOOLEAN
1584 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
1585 _In_ struct _FILE_OBJECT *FileObject,
1586 _In_ BOOLEAN Wait,
1587 _Out_ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
1588 _Out_ struct _IO_STATUS_BLOCK *IoStatus,
1589 _In_ struct _DEVICE_OBJECT *DeviceObject);
1590 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
1591
1592 _Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE)
1593 _IRQL_requires_same_
1594 typedef NTSTATUS
1595 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
1596 _In_ struct _FILE_OBJECT *FileObject,
1597 _In_ PLARGE_INTEGER EndingOffset,
1598 _Out_ struct _ERESOURCE **ResourceToRelease,
1599 _In_ struct _DEVICE_OBJECT *DeviceObject);
1600 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
1601
1602 _Function_class_(FAST_IO_MDL_READ)
1603 _IRQL_requires_same_
1604 typedef BOOLEAN
1605 (NTAPI FAST_IO_MDL_READ)(
1606 _In_ struct _FILE_OBJECT *FileObject,
1607 _In_ PLARGE_INTEGER FileOffset,
1608 _In_ ULONG Length,
1609 _In_ ULONG LockKey,
1610 _Out_ PMDL *MdlChain,
1611 _Out_ PIO_STATUS_BLOCK IoStatus,
1612 _In_ struct _DEVICE_OBJECT *DeviceObject);
1613 typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
1614
1615 _Function_class_(FAST_IO_MDL_READ_COMPLETE)
1616 _IRQL_requires_same_
1617 typedef BOOLEAN
1618 (NTAPI FAST_IO_MDL_READ_COMPLETE)(
1619 _In_ struct _FILE_OBJECT *FileObject,
1620 _In_ PMDL MdlChain,
1621 _In_ struct _DEVICE_OBJECT *DeviceObject);
1622 typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
1623
1624 _Function_class_(FAST_IO_PREPARE_MDL_WRITE)
1625 _IRQL_requires_same_
1626 typedef BOOLEAN
1627 (NTAPI FAST_IO_PREPARE_MDL_WRITE)(
1628 _In_ struct _FILE_OBJECT *FileObject,
1629 _In_ PLARGE_INTEGER FileOffset,
1630 _In_ ULONG Length,
1631 _In_ ULONG LockKey,
1632 _Out_ PMDL *MdlChain,
1633 _Out_ PIO_STATUS_BLOCK IoStatus,
1634 _In_ struct _DEVICE_OBJECT *DeviceObject);
1635 typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
1636
1637 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE)
1638 _IRQL_requires_same_
1639 typedef BOOLEAN
1640 (NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
1641 _In_ struct _FILE_OBJECT *FileObject,
1642 _In_ PLARGE_INTEGER FileOffset,
1643 _In_ PMDL MdlChain,
1644 _In_ struct _DEVICE_OBJECT *DeviceObject);
1645 typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
1646
1647 _Function_class_(FAST_IO_READ_COMPRESSED)
1648 _IRQL_requires_same_
1649 typedef BOOLEAN
1650 (NTAPI FAST_IO_READ_COMPRESSED)(
1651 _In_ struct _FILE_OBJECT *FileObject,
1652 _In_ PLARGE_INTEGER FileOffset,
1653 _In_ ULONG Length,
1654 _In_ ULONG LockKey,
1655 _Out_ PVOID Buffer,
1656 _Out_ PMDL *MdlChain,
1657 _Out_ PIO_STATUS_BLOCK IoStatus,
1658 _Out_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
1659 _In_ ULONG CompressedDataInfoLength,
1660 _In_ struct _DEVICE_OBJECT *DeviceObject);
1661 typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
1662
1663 _Function_class_(FAST_IO_WRITE_COMPRESSED)
1664 _IRQL_requires_same_
1665 typedef BOOLEAN
1666 (NTAPI FAST_IO_WRITE_COMPRESSED)(
1667 _In_ struct _FILE_OBJECT *FileObject,
1668 _In_ PLARGE_INTEGER FileOffset,
1669 _In_ ULONG Length,
1670 _In_ ULONG LockKey,
1671 _In_ PVOID Buffer,
1672 _Out_ PMDL *MdlChain,
1673 _Out_ PIO_STATUS_BLOCK IoStatus,
1674 _In_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
1675 _In_ ULONG CompressedDataInfoLength,
1676 _In_ struct _DEVICE_OBJECT *DeviceObject);
1677 typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
1678
1679 _Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED)
1680 _IRQL_requires_same_
1681 typedef BOOLEAN
1682 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
1683 _In_ struct _FILE_OBJECT *FileObject,
1684 _In_ PMDL MdlChain,
1685 _In_ struct _DEVICE_OBJECT *DeviceObject);
1686 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
1687
1688 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)
1689 _IRQL_requires_same_
1690 typedef BOOLEAN
1691 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
1692 _In_ struct _FILE_OBJECT *FileObject,
1693 _In_ PLARGE_INTEGER FileOffset,
1694 _In_ PMDL MdlChain,
1695 _In_ struct _DEVICE_OBJECT *DeviceObject);
1696 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
1697
1698 _Function_class_(FAST_IO_QUERY_OPEN)
1699 _IRQL_requires_same_
1700 typedef BOOLEAN
1701 (NTAPI FAST_IO_QUERY_OPEN)(
1702 _Inout_ struct _IRP *Irp,
1703 _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
1704 _In_ struct _DEVICE_OBJECT *DeviceObject);
1705 typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
1706
1707 _Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE)
1708 _IRQL_requires_same_
1709 typedef NTSTATUS
1710 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
1711 _In_ struct _FILE_OBJECT *FileObject,
1712 _In_ struct _ERESOURCE *ResourceToRelease,
1713 _In_ struct _DEVICE_OBJECT *DeviceObject);
1714 typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
1715
1716 _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH)
1717 _IRQL_requires_same_
1718 typedef NTSTATUS
1719 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
1720 _In_ struct _FILE_OBJECT *FileObject,
1721 _In_ struct _DEVICE_OBJECT *DeviceObject);
1722 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
1723
1724 _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH)
1725 _IRQL_requires_same_
1726 typedef NTSTATUS
1727 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
1728 _In_ struct _FILE_OBJECT *FileObject,
1729 _In_ struct _DEVICE_OBJECT *DeviceObject);
1730 typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
1731
1732 typedef struct _FAST_IO_DISPATCH {
1733 ULONG SizeOfFastIoDispatch;
1734 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
1735 PFAST_IO_READ FastIoRead;
1736 PFAST_IO_WRITE FastIoWrite;
1737 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
1738 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
1739 PFAST_IO_LOCK FastIoLock;
1740 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
1741 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
1742 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
1743 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
1744 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
1745 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
1746 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
1747 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
1748 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
1749 PFAST_IO_MDL_READ MdlRead;
1750 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
1751 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
1752 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
1753 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
1754 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
1755 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
1756 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
1757 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
1758 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
1759 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
1760 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
1761 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
1762
1763 typedef struct _SECTION_OBJECT_POINTERS {
1764 PVOID DataSectionObject;
1765 PVOID SharedCacheMap;
1766 PVOID ImageSectionObject;
1767 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
1768
1769 typedef struct _IO_COMPLETION_CONTEXT {
1770 PVOID Port;
1771 PVOID Key;
1772 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
1773
1774 /* FILE_OBJECT.Flags */
1775 #define FO_FILE_OPEN 0x00000001
1776 #define FO_SYNCHRONOUS_IO 0x00000002
1777 #define FO_ALERTABLE_IO 0x00000004
1778 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
1779 #define FO_WRITE_THROUGH 0x00000010
1780 #define FO_SEQUENTIAL_ONLY 0x00000020
1781 #define FO_CACHE_SUPPORTED 0x00000040
1782 #define FO_NAMED_PIPE 0x00000080
1783 #define FO_STREAM_FILE 0x00000100
1784 #define FO_MAILSLOT 0x00000200
1785 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
1786 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
1787 #define FO_DIRECT_DEVICE_OPEN 0x00000800
1788 #define FO_FILE_MODIFIED 0x00001000
1789 #define FO_FILE_SIZE_CHANGED 0x00002000
1790 #define FO_CLEANUP_COMPLETE 0x00004000
1791 #define FO_TEMPORARY_FILE 0x00008000
1792 #define FO_DELETE_ON_CLOSE 0x00010000
1793 #define FO_OPENED_CASE_SENSITIVE 0x00020000
1794 #define FO_HANDLE_CREATED 0x00040000
1795 #define FO_FILE_FAST_IO_READ 0x00080000
1796 #define FO_RANDOM_ACCESS 0x00100000
1797 #define FO_FILE_OPEN_CANCELLED 0x00200000
1798 #define FO_VOLUME_OPEN 0x00400000
1799 #define FO_REMOTE_ORIGIN 0x01000000
1800 #define FO_DISALLOW_EXCLUSIVE 0x02000000
1801 #define FO_SKIP_COMPLETION_PORT 0x02000000
1802 #define FO_SKIP_SET_EVENT 0x04000000
1803 #define FO_SKIP_SET_FAST_IO 0x08000000
1804 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
1805
1806 /* VPB.Flags */
1807 #define VPB_MOUNTED 0x0001
1808 #define VPB_LOCKED 0x0002
1809 #define VPB_PERSISTENT 0x0004
1810 #define VPB_REMOVE_PENDING 0x0008
1811 #define VPB_RAW_MOUNT 0x0010
1812 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
1813
1814 /* IO_STACK_LOCATION.Flags */
1815
1816 #define SL_FORCE_ACCESS_CHECK 0x01
1817 #define SL_OPEN_PAGING_FILE 0x02
1818 #define SL_OPEN_TARGET_DIRECTORY 0x04
1819 #define SL_STOP_ON_SYMLINK 0x08
1820 #define SL_CASE_SENSITIVE 0x80
1821
1822 #define SL_KEY_SPECIFIED 0x01
1823 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
1824 #define SL_WRITE_THROUGH 0x04
1825 #define SL_FT_SEQUENTIAL_WRITE 0x08
1826 #define SL_FORCE_DIRECT_WRITE 0x10
1827 #define SL_REALTIME_STREAM 0x20
1828
1829 #define SL_READ_ACCESS_GRANTED 0x01
1830 #define SL_WRITE_ACCESS_GRANTED 0x04
1831
1832 #define SL_FAIL_IMMEDIATELY 0x01
1833 #define SL_EXCLUSIVE_LOCK 0x02
1834
1835 #define SL_RESTART_SCAN 0x01
1836 #define SL_RETURN_SINGLE_ENTRY 0x02
1837 #define SL_INDEX_SPECIFIED 0x04
1838
1839 #define SL_WATCH_TREE 0x01
1840
1841 #define SL_ALLOW_RAW_MOUNT 0x01
1842
1843 $endif (_WDMDDK_)
1844 $if (_WDMDDK_ || _DEVIOCTL_)
1845 #define CTL_CODE(DeviceType, Function, Method, Access) \
1846 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
1847
1848 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
1849
1850 #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
1851
1852 $endif (_WDMDDK_ || _DEVIOCTL_)
1853 $if (_WDMDDK_)
1854
1855 /* IRP.Flags */
1856 #define IRP_NOCACHE 0x00000001
1857 #define IRP_PAGING_IO 0x00000002
1858 #define IRP_MOUNT_COMPLETION 0x00000002
1859 #define IRP_SYNCHRONOUS_API 0x00000004
1860 #define IRP_ASSOCIATED_IRP 0x00000008
1861 #define IRP_BUFFERED_IO 0x00000010
1862 #define IRP_DEALLOCATE_BUFFER 0x00000020
1863 #define IRP_INPUT_OPERATION 0x00000040
1864 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
1865 #define IRP_CREATE_OPERATION 0x00000080
1866 #define IRP_READ_OPERATION 0x00000100
1867 #define IRP_WRITE_OPERATION 0x00000200
1868 #define IRP_CLOSE_OPERATION 0x00000400
1869 #define IRP_DEFER_IO_COMPLETION 0x00000800
1870 #define IRP_OB_QUERY_NAME 0x00001000
1871 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
1872 /* The following 2 are missing in latest WDK */
1873 #define IRP_RETRY_IO_COMPLETION 0x00004000
1874 #define IRP_CLASS_CACHE_OPERATION 0x00008000
1875
1876 /* IRP.AllocationFlags */
1877 #define IRP_QUOTA_CHARGED 0x01
1878 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
1879 #define IRP_ALLOCATED_FIXED_SIZE 0x04
1880 #define IRP_LOOKASIDE_ALLOCATION 0x08
1881
1882 /*
1883 ** IRP function codes
1884 */
1885
1886 #define IRP_MJ_CREATE 0x00
1887 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
1888 #define IRP_MJ_CLOSE 0x02
1889 #define IRP_MJ_READ 0x03
1890 #define IRP_MJ_WRITE 0x04
1891 #define IRP_MJ_QUERY_INFORMATION 0x05
1892 #define IRP_MJ_SET_INFORMATION 0x06
1893 #define IRP_MJ_QUERY_EA 0x07
1894 #define IRP_MJ_SET_EA 0x08
1895 #define IRP_MJ_FLUSH_BUFFERS 0x09
1896 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
1897 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
1898 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
1899 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
1900 #define IRP_MJ_DEVICE_CONTROL 0x0e
1901 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
1902 #define IRP_MJ_SCSI 0x0f
1903 #define IRP_MJ_SHUTDOWN 0x10
1904 #define IRP_MJ_LOCK_CONTROL 0x11
1905 #define IRP_MJ_CLEANUP 0x12
1906 #define IRP_MJ_CREATE_MAILSLOT 0x13
1907 #define IRP_MJ_QUERY_SECURITY 0x14
1908 #define IRP_MJ_SET_SECURITY 0x15
1909 #define IRP_MJ_POWER 0x16
1910 #define IRP_MJ_SYSTEM_CONTROL 0x17
1911 #define IRP_MJ_DEVICE_CHANGE 0x18
1912 #define IRP_MJ_QUERY_QUOTA 0x19
1913 #define IRP_MJ_SET_QUOTA 0x1a
1914 #define IRP_MJ_PNP 0x1b
1915 #define IRP_MJ_PNP_POWER 0x1b
1916 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
1917
1918 #define IRP_MN_SCSI_CLASS 0x01
1919
1920 #define IRP_MN_START_DEVICE 0x00
1921 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
1922 #define IRP_MN_REMOVE_DEVICE 0x02
1923 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
1924 #define IRP_MN_STOP_DEVICE 0x04
1925 #define IRP_MN_QUERY_STOP_DEVICE 0x05
1926 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
1927
1928 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
1929 #define IRP_MN_QUERY_INTERFACE 0x08
1930 #define IRP_MN_QUERY_CAPABILITIES 0x09
1931 #define IRP_MN_QUERY_RESOURCES 0x0A
1932 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
1933 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
1934 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
1935
1936 #define IRP_MN_READ_CONFIG 0x0F
1937 #define IRP_MN_WRITE_CONFIG 0x10
1938 #define IRP_MN_EJECT 0x11
1939 #define IRP_MN_SET_LOCK 0x12
1940 #define IRP_MN_QUERY_ID 0x13
1941 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
1942 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
1943 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
1944 #define IRP_MN_SURPRISE_REMOVAL 0x17
1945 #if (NTDDI_VERSION >= NTDDI_WIN7)
1946 #define IRP_MN_DEVICE_ENUMERATED 0x19
1947 #endif
1948
1949 #define IRP_MN_WAIT_WAKE 0x00
1950 #define IRP_MN_POWER_SEQUENCE 0x01
1951 #define IRP_MN_SET_POWER 0x02
1952 #define IRP_MN_QUERY_POWER 0x03
1953
1954 #define IRP_MN_QUERY_ALL_DATA 0x00
1955 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
1956 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
1957 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
1958 #define IRP_MN_ENABLE_EVENTS 0x04
1959 #define IRP_MN_DISABLE_EVENTS 0x05
1960 #define IRP_MN_ENABLE_COLLECTION 0x06
1961 #define IRP_MN_DISABLE_COLLECTION 0x07
1962 #define IRP_MN_REGINFO 0x08
1963 #define IRP_MN_EXECUTE_METHOD 0x09
1964
1965 #define IRP_MN_REGINFO_EX 0x0b
1966
1967 typedef struct _FILE_OBJECT {
1968 CSHORT Type;
1969 CSHORT Size;
1970 PDEVICE_OBJECT DeviceObject;
1971 PVPB Vpb;
1972 PVOID FsContext;
1973 PVOID FsContext2;
1974 PSECTION_OBJECT_POINTERS SectionObjectPointer;
1975 PVOID PrivateCacheMap;
1976 NTSTATUS FinalStatus;
1977 struct _FILE_OBJECT *RelatedFileObject;
1978 BOOLEAN LockOperation;
1979 BOOLEAN DeletePending;
1980 BOOLEAN ReadAccess;
1981 BOOLEAN WriteAccess;
1982 BOOLEAN DeleteAccess;
1983 BOOLEAN SharedRead;
1984 BOOLEAN SharedWrite;
1985 BOOLEAN SharedDelete;
1986 ULONG Flags;
1987 UNICODE_STRING FileName;
1988 LARGE_INTEGER CurrentByteOffset;
1989 volatile ULONG Waiters;
1990 volatile ULONG Busy;
1991 PVOID LastLock;
1992 KEVENT Lock;
1993 KEVENT Event;
1994 volatile PIO_COMPLETION_CONTEXT CompletionContext;
1995 KSPIN_LOCK IrpListLock;
1996 LIST_ENTRY IrpList;
1997 volatile PVOID FileObjectExtension;
1998 } FILE_OBJECT, *PFILE_OBJECT;
1999
2000 typedef struct _IO_ERROR_LOG_PACKET {
2001 UCHAR MajorFunctionCode;
2002 UCHAR RetryCount;
2003 USHORT DumpDataSize;
2004 USHORT NumberOfStrings;
2005 USHORT StringOffset;
2006 USHORT EventCategory;
2007 NTSTATUS ErrorCode;
2008 ULONG UniqueErrorValue;
2009 NTSTATUS FinalStatus;
2010 ULONG SequenceNumber;
2011 ULONG IoControlCode;
2012 LARGE_INTEGER DeviceOffset;
2013 ULONG DumpData[1];
2014 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
2015
2016 typedef struct _IO_ERROR_LOG_MESSAGE {
2017 USHORT Type;
2018 USHORT Size;
2019 USHORT DriverNameLength;
2020 LARGE_INTEGER TimeStamp;
2021 ULONG DriverNameOffset;
2022 IO_ERROR_LOG_PACKET EntryData;
2023 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
2024
2025 /* See ndk/lpctypes.h */
2026 #ifdef _WIN64
2027 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
2028 #else
2029 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
2030 #endif
2031
2032 #define ERROR_LOG_LIMIT_SIZE 240
2033 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
2034 sizeof(IO_ERROR_LOG_PACKET) + \
2035 (sizeof(WCHAR) * 40))
2036 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
2037 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
2038 #define IO_ERROR_LOG_MESSAGE_LENGTH \
2039 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
2040 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
2041 PORT_MAXIMUM_MESSAGE_LENGTH)
2042 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
2043 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
2044
2045 typedef enum _DMA_WIDTH {
2046 Width8Bits,
2047 Width16Bits,
2048 Width32Bits,
2049 MaximumDmaWidth
2050 } DMA_WIDTH, *PDMA_WIDTH;
2051
2052 typedef enum _DMA_SPEED {
2053 Compatible,
2054 TypeA,
2055 TypeB,
2056 TypeC,
2057 TypeF,
2058 MaximumDmaSpeed
2059 } DMA_SPEED, *PDMA_SPEED;
2060
2061 /* DEVICE_DESCRIPTION.Version */
2062
2063 #define DEVICE_DESCRIPTION_VERSION 0x0000
2064 #define DEVICE_DESCRIPTION_VERSION1 0x0001
2065 #define DEVICE_DESCRIPTION_VERSION2 0x0002
2066 #define DEVICE_DESCRIPTION_VERSION3 0x0003
2067
2068 typedef struct _DEVICE_DESCRIPTION {
2069 ULONG Version;
2070 BOOLEAN Master;
2071 BOOLEAN ScatterGather;
2072 BOOLEAN DemandMode;
2073 BOOLEAN AutoInitialize;
2074 BOOLEAN Dma32BitAddresses;
2075 BOOLEAN IgnoreCount;
2076 BOOLEAN Reserved1;
2077 BOOLEAN Dma64BitAddresses;
2078 ULONG BusNumber;
2079 ULONG DmaChannel;
2080 INTERFACE_TYPE InterfaceType;
2081 DMA_WIDTH DmaWidth;
2082 DMA_SPEED DmaSpeed;
2083 ULONG MaximumLength;
2084 ULONG DmaPort;
2085 #if (NTDDI_VERSION >= NTDDI_WIN8)
2086 ULONG DmaAddressWidth;
2087 ULONG DmaControllerInstance;
2088 ULONG DmaRequestLine;
2089 PHYSICAL_ADDRESS DeviceAddress;
2090 #endif // NTDDI_WIN8
2091 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
2092
2093 #define DMA_ADAPTER_INFO_VERSION1 1
2094
2095 #define ADAPTER_INFO_SYNCHRONOUS_CALLBACK 0x0001
2096 #define ADAPTER_INFO_API_BYPASS 0x0002
2097
2098 typedef struct _DMA_ADAPTER_INFO_V1
2099 {
2100 ULONG ReadDmaCounterAvailable;
2101 ULONG ScatterGatherLimit;
2102 ULONG DmaAddressWidth;
2103 ULONG Flags;
2104 ULONG MinimumTransferUnit;
2105 } DMA_ADAPTER_INFO_V1, *PDMA_ADAPTER_INFO_V1;
2106
2107 typedef struct _DMA_ADAPTER_INFO
2108 {
2109 ULONG Version;
2110 union
2111 {
2112 DMA_ADAPTER_INFO_V1 V1;
2113 };
2114 } DMA_ADAPTER_INFO, *PDMA_ADAPTER_INFO;
2115
2116 #define DMA_TRANSFER_INFO_VERSION1 1
2117 #define DMA_TRANSFER_INFO_VERSION2 2
2118
2119 typedef struct _DMA_TRANSFER_INFO_V1
2120 {
2121 ULONG MapRegisterCount;
2122 ULONG ScatterGatherElementCount;
2123 ULONG ScatterGatherListSize;
2124 } DMA_TRANSFER_INFO_V1, *PDMA_TRANSFER_INFO_V1;
2125
2126 typedef struct _DMA_TRANSFER_INFO_V2
2127 {
2128 ULONG MapRegisterCount;
2129 ULONG ScatterGatherElementCount;
2130 ULONG ScatterGatherListSize;
2131 ULONG LogicalPageCount;
2132 } DMA_TRANSFER_INFO_V2, *PDMA_TRANSFER_INFO_V2;
2133
2134 typedef struct _DMA_TRANSFER_INFO
2135 {
2136 ULONG Version;
2137 union {
2138 DMA_TRANSFER_INFO_V1 V1;
2139 DMA_TRANSFER_INFO_V2 V2;
2140 };
2141 } DMA_TRANSFER_INFO, *PDMA_TRANSFER_INFO;
2142
2143 #define DMA_TRANSFER_CONTEXT_VERSION1 1
2144
2145 #ifdef _WIN64
2146 #define DMA_TRANSFER_CONTEXT_SIZE_V1 128
2147 #else
2148 #define DMA_TRANSFER_CONTEXT_SIZE_V1 64
2149 #endif
2150
2151 typedef enum _DEVICE_RELATION_TYPE {
2152 BusRelations,
2153 EjectionRelations,
2154 PowerRelations,
2155 RemovalRelations,
2156 TargetDeviceRelation,
2157 SingleBusRelations,
2158 TransportRelations
2159 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
2160
2161 typedef struct _DEVICE_RELATIONS {
2162 ULONG Count;
2163 PDEVICE_OBJECT Objects[1];
2164 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
2165
2166 typedef struct _DEVOBJ_EXTENSION {
2167 CSHORT Type;
2168 USHORT Size;
2169 PDEVICE_OBJECT DeviceObject;
2170 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
2171
2172 typedef struct _SCATTER_GATHER_ELEMENT {
2173 PHYSICAL_ADDRESS Address;
2174 ULONG Length;
2175 ULONG_PTR Reserved;
2176 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
2177
2178 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
2179
2180 #if defined(_MSC_VER)
2181 #if _MSC_VER >= 1200
2182 #pragma warning(push)
2183 #endif
2184 #pragma warning(disable:4200)
2185 #endif /* _MSC_VER */
2186
2187 typedef struct _SCATTER_GATHER_LIST {
2188 ULONG NumberOfElements;
2189 ULONG_PTR Reserved;
2190 SCATTER_GATHER_ELEMENT Elements[1];
2191 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
2192
2193 #if defined(_MSC_VER)
2194 #if _MSC_VER >= 1200
2195 #pragma warning(pop)
2196 #else
2197 #pragma warning(default:4200)
2198 #endif
2199 #endif /* _MSC_VER */
2200
2201 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
2202
2203 struct _SCATTER_GATHER_LIST;
2204 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
2205
2206 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
2207
2208 _Function_class_(DRIVER_ADD_DEVICE)
2209 _IRQL_requires_(PASSIVE_LEVEL)
2210 _IRQL_requires_same_
2211 _When_(return>=0, _Kernel_clear_do_init_(__yes))
2212 typedef NTSTATUS
2213 (NTAPI DRIVER_ADD_DEVICE)(
2214 _In_ struct _DRIVER_OBJECT *DriverObject,
2215 _In_ struct _DEVICE_OBJECT *PhysicalDeviceObject);
2216 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
2217
2218 typedef struct _DRIVER_EXTENSION {
2219 struct _DRIVER_OBJECT *DriverObject;
2220 PDRIVER_ADD_DEVICE AddDevice;
2221 ULONG Count;
2222 UNICODE_STRING ServiceKeyName;
2223 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
2224
2225 #define DRVO_UNLOAD_INVOKED 0x00000001
2226 #define DRVO_LEGACY_DRIVER 0x00000002
2227 #define DRVO_BUILTIN_DRIVER 0x00000004
2228
2229 _Function_class_(DRIVER_INITIALIZE)
2230 _IRQL_requires_same_
2231 typedef NTSTATUS
2232 (NTAPI DRIVER_INITIALIZE)(
2233 _In_ struct _DRIVER_OBJECT *DriverObject,
2234 _In_ PUNICODE_STRING RegistryPath);
2235 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
2236
2237 _Function_class_(DRIVER_STARTIO)
2238 _IRQL_always_function_min_(DISPATCH_LEVEL)
2239 _IRQL_requires_(DISPATCH_LEVEL)
2240 _IRQL_requires_same_
2241 typedef VOID
2242 (NTAPI DRIVER_STARTIO)(
2243 _Inout_ struct _DEVICE_OBJECT *DeviceObject,
2244 _Inout_ struct _IRP *Irp);
2245 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
2246
2247 _Function_class_(DRIVER_UNLOAD)
2248 _IRQL_requires_(PASSIVE_LEVEL)
2249 _IRQL_requires_same_
2250 typedef VOID
2251 (NTAPI DRIVER_UNLOAD)(
2252 _In_ struct _DRIVER_OBJECT *DriverObject);
2253 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
2254
2255 _Function_class_(DRIVER_DISPATCH)
2256 _IRQL_requires_max_(DISPATCH_LEVEL)
2257 _IRQL_requires_same_
2258 typedef NTSTATUS
2259 (NTAPI DRIVER_DISPATCH)(
2260 _In_ struct _DEVICE_OBJECT *DeviceObject,
2261 _Inout_ struct _IRP *Irp);
2262 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
2263 typedef DRIVER_DISPATCH DRIVER_DISPATCH_RAISED;
2264
2265 _Function_class_(DRIVER_DISPATCH)
2266 _IRQL_requires_(PASSIVE_LEVEL)
2267 _IRQL_requires_same_
2268 typedef NTSTATUS
2269 (NTAPI DRIVER_DISPATCH_PAGED)(
2270 _In_ struct _DEVICE_OBJECT *DeviceObject,
2271 _Inout_ struct _IRP *Irp);
2272 typedef DRIVER_DISPATCH_PAGED *PDRIVER_DISPATCH_PAGED;
2273
2274 typedef struct _DRIVER_OBJECT {
2275 CSHORT Type;
2276 CSHORT Size;
2277 PDEVICE_OBJECT DeviceObject;
2278 ULONG Flags;
2279 PVOID DriverStart;
2280 ULONG DriverSize;
2281 PVOID DriverSection;
2282 PDRIVER_EXTENSION DriverExtension;
2283 UNICODE_STRING DriverName;
2284 PUNICODE_STRING HardwareDatabase;
2285 struct _FAST_IO_DISPATCH *FastIoDispatch;
2286 PDRIVER_INITIALIZE DriverInit;
2287 PDRIVER_STARTIO DriverStartIo;
2288 PDRIVER_UNLOAD DriverUnload;
2289 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
2290 } DRIVER_OBJECT, *PDRIVER_OBJECT;
2291
2292 typedef struct _DMA_ADAPTER {
2293 USHORT Version;
2294 USHORT Size;
2295 struct _DMA_OPERATIONS* DmaOperations;
2296 } DMA_ADAPTER, *PDMA_ADAPTER;
2297
2298 typedef enum
2299 {
2300 DmaComplete,
2301 DmaAborted,
2302 DmaError,
2303 DmaCancelled
2304 } DMA_COMPLETION_STATUS;
2305
2306 typedef VOID
2307 (NTAPI *PPUT_DMA_ADAPTER)(
2308 PDMA_ADAPTER DmaAdapter);
2309
2310 typedef PVOID
2311 (NTAPI *PALLOCATE_COMMON_BUFFER)(
2312 _In_ PDMA_ADAPTER DmaAdapter,
2313 _In_ ULONG Length,
2314 _Out_ PPHYSICAL_ADDRESS LogicalAddress,
2315 _In_ BOOLEAN CacheEnabled);
2316
2317 typedef VOID
2318 (NTAPI *PFREE_COMMON_BUFFER)(
2319 _In_ PDMA_ADAPTER DmaAdapter,
2320 _In_ ULONG Length,
2321 _In_ PHYSICAL_ADDRESS LogicalAddress,
2322 _In_ PVOID VirtualAddress,
2323 _In_ BOOLEAN CacheEnabled);
2324
2325 typedef NTSTATUS
2326 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
2327 _In_ PDMA_ADAPTER DmaAdapter,
2328 _In_ PDEVICE_OBJECT DeviceObject,
2329 _In_ ULONG NumberOfMapRegisters,
2330 _In_ PDRIVER_CONTROL ExecutionRoutine,
2331 _In_ PVOID Context);
2332
2333 typedef BOOLEAN
2334 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
2335 _In_ PDMA_ADAPTER DmaAdapter,
2336 _In_ PMDL Mdl,
2337 _In_ PVOID MapRegisterBase,
2338 _In_ PVOID CurrentVa,
2339 _In_ ULONG Length,
2340 _In_ BOOLEAN WriteToDevice);
2341
2342 typedef VOID
2343 (NTAPI *PFREE_ADAPTER_CHANNEL)(
2344 _In_ PDMA_ADAPTER DmaAdapter);
2345
2346 typedef VOID
2347 (NTAPI *PFREE_MAP_REGISTERS)(
2348 _In_ PDMA_ADAPTER DmaAdapter,
2349 PVOID MapRegisterBase,
2350 ULONG NumberOfMapRegisters);
2351
2352 typedef PHYSICAL_ADDRESS
2353 (NTAPI *PMAP_TRANSFER)(
2354 _In_ PDMA_ADAPTER DmaAdapter,
2355 _In_ PMDL Mdl,
2356 _In_ PVOID MapRegisterBase,
2357 _In_ PVOID CurrentVa,
2358 _Inout_ PULONG Length,
2359 _In_ BOOLEAN WriteToDevice);
2360
2361 typedef ULONG
2362 (NTAPI *PGET_DMA_ALIGNMENT)(
2363 _In_ PDMA_ADAPTER DmaAdapter);
2364
2365 typedef ULONG
2366 (NTAPI *PREAD_DMA_COUNTER)(
2367 _In_ PDMA_ADAPTER DmaAdapter);
2368
2369 _Function_class_(DRIVER_LIST_CONTROL)
2370 _IRQL_requires_same_
2371 typedef VOID
2372 (NTAPI DRIVER_LIST_CONTROL)(
2373 _In_ struct _DEVICE_OBJECT *DeviceObject,
2374 _In_ struct _IRP *Irp,
2375 _In_ struct _SCATTER_GATHER_LIST *ScatterGather,
2376 _In_ PVOID Context);
2377 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
2378
2379 typedef NTSTATUS
2380 (NTAPI *PGET_SCATTER_GATHER_LIST)(
2381 _In_ PDMA_ADAPTER DmaAdapter,
2382 _In_ PDEVICE_OBJECT DeviceObject,
2383 _In_ PMDL Mdl,
2384 _In_ PVOID CurrentVa,
2385 _In_ ULONG Length,
2386 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
2387 _In_ PVOID Context,
2388 _In_ BOOLEAN WriteToDevice);
2389
2390 typedef VOID
2391 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
2392 _In_ PDMA_ADAPTER DmaAdapter,
2393 _In_ PSCATTER_GATHER_LIST ScatterGather,
2394 _In_ BOOLEAN WriteToDevice);
2395
2396 typedef NTSTATUS
2397 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
2398 _In_ PDMA_ADAPTER DmaAdapter,
2399 _In_ PMDL Mdl OPTIONAL,
2400 _In_ PVOID CurrentVa,
2401 _In_ ULONG Length,
2402 _Out_ PULONG ScatterGatherListSize,
2403 _Out_ OPTIONAL PULONG pNumberOfMapRegisters);
2404
2405 typedef NTSTATUS
2406 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
2407 _In_ PDMA_ADAPTER DmaAdapter,
2408 _In_ PDEVICE_OBJECT DeviceObject,
2409 _In_ PMDL Mdl,
2410 _In_ PVOID CurrentVa,
2411 _In_ ULONG Length,
2412 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
2413 _In_ PVOID Context,
2414 _In_ BOOLEAN WriteToDevice,
2415 _In_ PVOID ScatterGatherBuffer,
2416 _In_ ULONG ScatterGatherLength);
2417
2418 typedef NTSTATUS
2419 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
2420 _In_ PDMA_ADAPTER DmaAdapter,
2421 _In_ PSCATTER_GATHER_LIST ScatterGather,
2422 _In_ PMDL OriginalMdl,
2423 _Out_ PMDL *TargetMdl);
2424
2425 typedef NTSTATUS
2426 (NTAPI *PGET_DMA_ADAPTER_INFO)(
2427 _In_ PDMA_ADAPTER DmaAdapter,
2428 _Inout_ PDMA_ADAPTER_INFO AdapterInfo);
2429
2430 typedef NTSTATUS
2431 (NTAPI *PGET_DMA_TRANSFER_INFO)(
2432 _In_ PDMA_ADAPTER DmaAdapter,
2433 _In_ PMDL Mdl,
2434 _In_ ULONGLONG Offset,
2435 _In_ ULONG Length,
2436 _In_ BOOLEAN WriteOnly,
2437 _Inout_ PDMA_TRANSFER_INFO TransferInfo);
2438
2439 typedef NTSTATUS
2440 (NTAPI *PINITIALIZE_DMA_TRANSFER_CONTEXT)(
2441 _In_ PDMA_ADAPTER DmaAdapter,
2442 _Out_ PVOID DmaTransferContext);
2443
2444 typedef PVOID
2445 (NTAPI *PALLOCATE_COMMON_BUFFER_EX)(
2446 _In_ PDMA_ADAPTER DmaAdapter,
2447 _In_opt_ PPHYSICAL_ADDRESS MaximumAddress,
2448 _In_ ULONG Length,
2449 _Out_ PPHYSICAL_ADDRESS LogicalAddress,
2450 _In_ BOOLEAN CacheEnabled,
2451 _In_ NODE_REQUIREMENT PreferredNode);
2452
2453 typedef NTSTATUS
2454 (NTAPI *PALLOCATE_ADAPTER_CHANNEL_EX)(
2455 _In_ PDMA_ADAPTER DmaAdapter,
2456 _In_ PDEVICE_OBJECT DeviceObject,
2457 _In_ PVOID DmaTransferContext,
2458 _In_ ULONG NumberOfMapRegisters,
2459 _In_ ULONG Flags,
2460 _In_opt_ PDRIVER_CONTROL ExecutionRoutine,
2461 _In_opt_ PVOID ExecutionContext,
2462 _Out_opt_ PVOID *MapRegisterBase);
2463
2464 typedef NTSTATUS
2465 (NTAPI *PCONFIGURE_ADAPTER_CHANNEL)(
2466 _In_ PDMA_ADAPTER DmaAdapter,
2467 _In_ ULONG FunctionNumber,
2468 _In_ PVOID Context);
2469
2470 typedef BOOLEAN
2471 (NTAPI *PCANCEL_ADAPTER_CHANNEL)(
2472 _In_ PDMA_ADAPTER DmaAdapter,
2473 _In_ PDEVICE_OBJECT DeviceObject,
2474 _In_ PVOID DmaTransferContext);
2475
2476 typedef
2477 _Function_class_(DMA_COMPLETION_ROUTINE)
2478 _IRQL_requires_max_(DISPATCH_LEVEL)
2479 _IRQL_requires_min_(DISPATCH_LEVEL)
2480 VOID
2481 NTAPI
2482 DMA_COMPLETION_ROUTINE(
2483 _In_ PDMA_ADAPTER DmaAdapter,
2484 _In_ PDEVICE_OBJECT DeviceObject,
2485 _In_ PVOID CompletionContext,
2486 _In_ DMA_COMPLETION_STATUS Status);
2487
2488 typedef DMA_COMPLETION_ROUTINE *PDMA_COMPLETION_ROUTINE;
2489
2490 typedef NTSTATUS
2491 (NTAPI *PMAP_TRANSFER_EX)(
2492 _In_ PDMA_ADAPTER DmaAdapter,
2493 _In_ PMDL Mdl,
2494 _In_ PVOID MapRegisterBase,
2495 _In_ ULONGLONG Offset,
2496 _In_ ULONG DeviceOffset,
2497 _Inout_ PULONG Length,
2498 _In_ BOOLEAN WriteToDevice,
2499 _Out_writes_bytes_opt_(ScatterGatherBufferLength) PSCATTER_GATHER_LIST ScatterGatherBuffer,
2500 _In_ ULONG ScatterGatherBufferLength,
2501 _In_opt_ PDMA_COMPLETION_ROUTINE DmaCompletionRoutine,
2502 _In_opt_ PVOID CompletionContext);
2503
2504 typedef NTSTATUS
2505 (NTAPI *PGET_SCATTER_GATHER_LIST_EX)(
2506 _In_ PDMA_ADAPTER DmaAdapter,
2507 _In_ PDEVICE_OBJECT DeviceObject,
2508 _In_ PVOID DmaTransferContext,
2509 _In_ PMDL Mdl,
2510 _In_ ULONGLONG Offset,
2511 _In_ ULONG Length,
2512 _In_ ULONG Flags,
2513 _In_opt_ PDRIVER_LIST_CONTROL ExecutionRoutine,
2514 _In_opt_ PVOID Context,
2515 _In_ BOOLEAN WriteToDevice,
2516 _In_opt_ PDMA_COMPLETION_ROUTINE DmaCompletionRoutine,
2517 _In_opt_ PVOID CompletionContext,
2518 _Out_opt_ PSCATTER_GATHER_LIST *ScatterGatherList);
2519
2520 typedef NTSTATUS
2521 (NTAPI *PBUILD_SCATTER_GATHER_LIST_EX)(
2522 _In_ PDMA_ADAPTER DmaAdapter,
2523 _In_ PDEVICE_OBJECT DeviceObject,
2524 _In_ PVOID DmaTransferContext,
2525 _In_ PMDL Mdl,
2526 _In_ ULONGLONG Offset,
2527 _In_ ULONG Length,
2528 _In_ ULONG Flags,
2529 _In_opt_ PDRIVER_LIST_CONTROL ExecutionRoutine,
2530 _In_opt_ PVOID Context,
2531 _In_ BOOLEAN WriteToDevice,
2532 _In_ PVOID ScatterGatherBuffer,
2533 _In_ ULONG ScatterGatherLength,
2534 _In_opt_ PDMA_COMPLETION_ROUTINE DmaCompletionRoutine,
2535 _In_opt_ PVOID CompletionContext,
2536 _Out_opt_ PVOID ScatterGatherList);
2537
2538 typedef NTSTATUS
2539 (NTAPI *PFLUSH_ADAPTER_BUFFERS_EX)(
2540 _In_ PDMA_ADAPTER DmaAdapter,
2541 _In_ PMDL Mdl,
2542 _In_ PVOID MapRegisterBase,
2543 _In_ ULONGLONG Offset,
2544 _In_ ULONG Length,
2545 _In_ BOOLEAN WriteToDevice);
2546
2547 typedef VOID
2548 (NTAPI *PFREE_ADAPTER_OBJECT)(
2549 _In_ PDMA_ADAPTER DmaAdapter,
2550 _In_ IO_ALLOCATION_ACTION AllocationAction);
2551
2552 typedef NTSTATUS
2553 (NTAPI *PCANCEL_MAPPED_TRANSFER)(
2554 _In_ PDMA_ADAPTER DmaAdapter,
2555 _In_ PVOID DmaTransferContext);
2556
2557 typedef NTSTATUS
2558 (NTAPI *PALLOCATE_DOMAIN_COMMON_BUFFER)(
2559 _In_ PDMA_ADAPTER DmaAdapter,
2560 _In_ HANDLE DomainHandle,
2561 _In_opt_ PPHYSICAL_ADDRESS MaximumAddress,
2562 _In_ ULONG Length,
2563 _In_ ULONG Flags,
2564 _In_opt_ MEMORY_CACHING_TYPE *CacheType,
2565 _In_ NODE_REQUIREMENT PreferredNode,
2566 _Out_ PPHYSICAL_ADDRESS LogicalAddress,
2567 _Out_ PVOID *VirtualAddress);
2568
2569 typedef NTSTATUS
2570 (NTAPI *PFLUSH_DMA_BUFFER)(
2571 _In_ PDMA_ADAPTER DmaAdapter,
2572 _In_ PMDL Mdl,
2573 _In_ BOOLEAN ReadOperation);
2574
2575 typedef NTSTATUS
2576 (NTAPI *PJOIN_DMA_DOMAIN)(
2577 _In_ PDMA_ADAPTER DmaAdapter,
2578 _In_ HANDLE DomainHandle);
2579
2580 typedef NTSTATUS
2581 (NTAPI *PLEAVE_DMA_DOMAIN)(
2582 _In_ PDMA_ADAPTER DmaAdapter);
2583
2584 typedef HANDLE
2585 (NTAPI *PGET_DMA_DOMAIN)(
2586 _In_ PDMA_ADAPTER DmaAdapter);
2587
2588 typedef PVOID
2589 (NTAPI *PALLOCATE_COMMON_BUFFER_WITH_BOUNDS)(
2590 _In_ PDMA_ADAPTER DmaAdapter,
2591 _In_opt_ PPHYSICAL_ADDRESS MinimumAddress,
2592 _In_opt_ PPHYSICAL_ADDRESS MaximumAddress,
2593 _In_ ULONG Length,
2594 _In_ ULONG Flags,
2595 _In_opt_ MEMORY_CACHING_TYPE *CacheType,
2596 _In_ NODE_REQUIREMENT PreferredNode,
2597 _Out_ PPHYSICAL_ADDRESS LogicalAddress);
2598
2599 typedef struct _DMA_COMMON_BUFFER_VECTOR DMA_COMMON_BUFFER_VECTOR, *PDMA_COMMON_BUFFER_VECTOR;
2600
2601 typedef NTSTATUS
2602 (NTAPI *PALLOCATE_COMMON_BUFFER_VECTOR)(
2603 _In_ PDMA_ADAPTER DmaAdapter,
2604 _In_ PHYSICAL_ADDRESS LowAddress,
2605 _In_ PHYSICAL_ADDRESS HighAddress,
2606 _In_ MEMORY_CACHING_TYPE CacheType,
2607 _In_ ULONG IdealNode,
2608 _In_ ULONG Flags,
2609 _In_ ULONG NumberOfElements,
2610 _In_ ULONGLONG SizeOfElements,
2611 _Out_ PDMA_COMMON_BUFFER_VECTOR *VectorOut);
2612
2613 typedef VOID
2614 (NTAPI *PGET_COMMON_BUFFER_FROM_VECTOR_BY_INDEX)(
2615 _In_ PDMA_ADAPTER DmaAdapter,
2616 _In_ PDMA_COMMON_BUFFER_VECTOR Vector,
2617 _In_ ULONG Index,
2618 _Out_ PVOID *VirtualAddressOut,
2619 _Out_ PPHYSICAL_ADDRESS LogicalAddressOut);
2620
2621 typedef VOID
2622 (NTAPI *PFREE_COMMON_BUFFER_FROM_VECTOR)(
2623 _In_ PDMA_ADAPTER DmaAdapter,
2624 _In_ PDMA_COMMON_BUFFER_VECTOR Vector,
2625 _In_ ULONG Index);
2626
2627 typedef VOID
2628 (NTAPI *PFREE_COMMON_BUFFER_VECTOR)(
2629 _In_ PDMA_ADAPTER DmaAdapter,
2630 _In_ PDMA_COMMON_BUFFER_VECTOR Vector);
2631
2632 typedef struct _DMA_OPERATIONS {
2633 ULONG Size;
2634 PPUT_DMA_ADAPTER PutDmaAdapter;
2635 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
2636 PFREE_COMMON_BUFFER FreeCommonBuffer;
2637 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
2638 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
2639 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
2640 PFREE_MAP_REGISTERS FreeMapRegisters;
2641 PMAP_TRANSFER MapTransfer;
2642 PGET_DMA_ALIGNMENT GetDmaAlignment;
2643 PREAD_DMA_COUNTER ReadDmaCounter;
2644 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
2645 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
2646 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
2647 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
2648 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
2649 PGET_DMA_ADAPTER_INFO GetDmaAdapterInfo;
2650 PGET_DMA_TRANSFER_INFO GetDmaTransferInfo;
2651 PINITIALIZE_DMA_TRANSFER_CONTEXT InitializeDmaTransferContext;
2652 PALLOCATE_COMMON_BUFFER_EX AllocateCommonBufferEx;
2653 PALLOCATE_ADAPTER_CHANNEL_EX AllocateAdapterChannelEx;
2654 PCONFIGURE_ADAPTER_CHANNEL ConfigureAdapterChannel;
2655 PCANCEL_ADAPTER_CHANNEL CancelAdapterChannel;
2656 PMAP_TRANSFER_EX MapTransferEx;
2657 PGET_SCATTER_GATHER_LIST_EX GetScatterGatherListEx;
2658 PBUILD_SCATTER_GATHER_LIST_EX BuildScatterGatherListEx;
2659 PFLUSH_ADAPTER_BUFFERS_EX FlushAdapterBuffersEx;
2660 PFREE_ADAPTER_OBJECT FreeAdapterObject;
2661 PCANCEL_MAPPED_TRANSFER CancelMappedTransfer;
2662 PALLOCATE_DOMAIN_COMMON_BUFFER AllocateDomainCommonBuffer;
2663 PFLUSH_DMA_BUFFER FlushDmaBuffer;
2664 PJOIN_DMA_DOMAIN JoinDmaDomain;
2665 PLEAVE_DMA_DOMAIN LeaveDmaDomain;
2666 PGET_DMA_DOMAIN GetDmaDomain;
2667 PALLOCATE_COMMON_BUFFER_WITH_BOUNDS AllocateCommonBufferWithBounds;
2668 PALLOCATE_COMMON_BUFFER_VECTOR AllocateCommonBufferVector;
2669 PGET_COMMON_BUFFER_FROM_VECTOR_BY_INDEX GetCommonBufferFromVectorByIndex;
2670 PFREE_COMMON_BUFFER_FROM_VECTOR FreeCommonBufferFromVector;
2671 PFREE_COMMON_BUFFER_VECTOR FreeCommonBufferVector;
2672 } DMA_OPERATIONS, *PDMA_OPERATIONS;
2673
2674 typedef struct _IO_RESOURCE_DESCRIPTOR {
2675 UCHAR Option;
2676 UCHAR Type;
2677 UCHAR ShareDisposition;
2678 UCHAR Spare1;
2679 USHORT Flags;
2680 USHORT Spare2;
2681 union {
2682 struct {
2683 ULONG Length;
2684 ULONG Alignment;
2685 PHYSICAL_ADDRESS MinimumAddress;
2686 PHYSICAL_ADDRESS MaximumAddress;
2687 } Port;
2688 struct {
2689 ULONG Length;
2690 ULONG Alignment;
2691 PHYSICAL_ADDRESS MinimumAddress;
2692 PHYSICAL_ADDRESS MaximumAddress;
2693 } Memory;
2694 struct {
2695 ULONG MinimumVector;
2696 ULONG MaximumVector;
2697 #if defined(NT_PROCESSOR_GROUPS)
2698 IRQ_DEVICE_POLICY AffinityPolicy;
2699 USHORT Group;
2700 #else
2701 IRQ_DEVICE_POLICY AffinityPolicy;
2702 #endif
2703 IRQ_PRIORITY PriorityPolicy;
2704 KAFFINITY TargetedProcessors;
2705 } Interrupt;
2706 struct {
2707 ULONG MinimumChannel;
2708 ULONG MaximumChannel;
2709 } Dma;
2710 struct {
2711 ULONG Length;
2712 ULONG Alignment;
2713 PHYSICAL_ADDRESS MinimumAddress;
2714 PHYSICAL_ADDRESS MaximumAddress;
2715 } Generic;
2716 struct {
2717 ULONG Data[3];
2718 } DevicePrivate;
2719 struct {
2720 ULONG Length;
2721 ULONG MinBusNumber;
2722 ULONG MaxBusNumber;
2723 ULONG Reserved;
2724 } BusNumber;
2725 struct {
2726 ULONG Priority;
2727 ULONG Reserved1;
2728 ULONG Reserved2;
2729 } ConfigData;
2730 } u;
2731 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
2732
2733 typedef struct _IO_RESOURCE_LIST {
2734 USHORT Version;
2735 USHORT Revision;
2736 ULONG Count;
2737 IO_RESOURCE_DESCRIPTOR Descriptors[1];
2738 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
2739
2740 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
2741 ULONG ListSize;
2742 INTERFACE_TYPE InterfaceType;
2743 ULONG BusNumber;
2744 ULONG SlotNumber;
2745 ULONG Reserved[3];
2746 ULONG AlternativeLists;
2747 IO_RESOURCE_LIST List[1];
2748 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
2749
2750 _Function_class_(DRIVER_CANCEL)
2751 _Requires_lock_held_(_Global_cancel_spin_lock_)
2752 _Releases_lock_(_Global_cancel_spin_lock_)
2753 _IRQL_requires_min_(DISPATCH_LEVEL)
2754 _IRQL_requires_(DISPATCH_LEVEL)
2755 typedef VOID
2756 (NTAPI DRIVER_CANCEL)(
2757 _Inout_ struct _DEVICE_OBJECT *DeviceObject,
2758 _Inout_ _IRQL_uses_cancel_ struct _IRP *Irp);
2759 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
2760
2761 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP {
2762 CSHORT Type;
2763 USHORT Size;
2764 struct _MDL *MdlAddress;
2765 ULONG Flags;
2766 union {
2767 struct _IRP *MasterIrp;
2768 volatile LONG IrpCount;
2769 PVOID SystemBuffer;
2770 } AssociatedIrp;
2771 LIST_ENTRY ThreadListEntry;
2772 IO_STATUS_BLOCK IoStatus;
2773 KPROCESSOR_MODE RequestorMode;
2774 BOOLEAN PendingReturned;
2775 CHAR StackCount;
2776 CHAR CurrentLocation;
2777 BOOLEAN Cancel;
2778 KIRQL CancelIrql;
2779 CCHAR ApcEnvironment;
2780 UCHAR AllocationFlags;
2781 PIO_STATUS_BLOCK UserIosb;
2782 PKEVENT UserEvent;
2783 union {
2784 struct {
2785 _ANONYMOUS_UNION union {
2786 PIO_APC_ROUTINE UserApcRoutine;
2787 PVOID IssuingProcess;
2788 } DUMMYUNIONNAME;
2789 PVOID UserApcContext;
2790 } AsynchronousParameters;
2791 LARGE_INTEGER AllocationSize;
2792 } Overlay;
2793 volatile PDRIVER_CANCEL CancelRoutine;
2794 PVOID UserBuffer;
2795 union {
2796 struct {
2797 _ANONYMOUS_UNION union {
2798 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
2799 _ANONYMOUS_STRUCT struct {
2800 PVOID DriverContext[4];
2801 } DUMMYSTRUCTNAME;
2802 } DUMMYUNIONNAME;
2803 PETHREAD Thread;
2804 PCHAR AuxiliaryBuffer;
2805 _ANONYMOUS_STRUCT struct {
2806 LIST_ENTRY ListEntry;
2807 _ANONYMOUS_UNION union {
2808 struct _IO_STACK_LOCATION *CurrentStackLocation;
2809 ULONG PacketType;
2810 } DUMMYUNIONNAME;
2811 } DUMMYSTRUCTNAME;
2812 struct _FILE_OBJECT *OriginalFileObject;
2813 } Overlay;
2814 KAPC Apc;
2815 PVOID CompletionKey;
2816 } Tail;
2817 } IRP, *PIRP;
2818
2819 typedef enum _IO_PAGING_PRIORITY {
2820 IoPagingPriorityInvalid,
2821 IoPagingPriorityNormal,
2822 IoPagingPriorityHigh,
2823 IoPagingPriorityReserved1,
2824 IoPagingPriorityReserved2
2825 } IO_PAGING_PRIORITY;
2826
2827 _Function_class_(IO_COMPLETION_ROUTINE)
2828 _IRQL_requires_same_
2829 _IRQL_requires_max_(DISPATCH_LEVEL)
2830 typedef NTSTATUS
2831 (NTAPI IO_COMPLETION_ROUTINE)(
2832 _In_ struct _DEVICE_OBJECT *DeviceObject,
2833 _In_ struct _IRP *Irp,
2834 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context);
2835 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
2836
2837 _Function_class_(IO_DPC_ROUTINE)
2838 _IRQL_always_function_min_(DISPATCH_LEVEL)
2839 _IRQL_requires_(DISPATCH_LEVEL)
2840 _IRQL_requires_same_
2841 typedef VOID
2842 (NTAPI IO_DPC_ROUTINE)(
2843 _In_ struct _KDPC *Dpc,
2844 _In_ struct _DEVICE_OBJECT *DeviceObject,
2845 _Inout_ struct _IRP *Irp,
2846 _In_opt_ PVOID Context);
2847 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
2848
2849 typedef NTSTATUS
2850 (NTAPI *PMM_DLL_INITIALIZE)(
2851 _In_ PUNICODE_STRING RegistryPath);
2852
2853 typedef NTSTATUS
2854 (NTAPI *PMM_DLL_UNLOAD)(
2855 VOID);
2856
2857 _Function_class_(IO_TIMER_ROUTINE)
2858 _IRQL_requires_same_
2859 typedef VOID
2860 (NTAPI IO_TIMER_ROUTINE)(
2861 _In_ struct _DEVICE_OBJECT *DeviceObject,
2862 _In_opt_ PVOID Context);
2863 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
2864
2865 typedef struct _IO_SECURITY_CONTEXT {
2866 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2867 PACCESS_STATE AccessState;
2868 ACCESS_MASK DesiredAccess;
2869 ULONG FullCreateOptions;
2870 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2871
2872 struct _IO_CSQ;
2873
2874 typedef struct _IO_CSQ_IRP_CONTEXT {
2875 ULONG Type;
2876 struct _IRP *Irp;
2877 struct _IO_CSQ *Csq;
2878 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2879
2880 typedef VOID
2881 (NTAPI IO_CSQ_INSERT_IRP)(
2882 _In_ struct _IO_CSQ *Csq,
2883 _In_ PIRP Irp);
2884 typedef IO_CSQ_INSERT_IRP *PIO_CSQ_INSERT_IRP;
2885
2886 typedef NTSTATUS
2887 (NTAPI IO_CSQ_INSERT_IRP_EX)(
2888 _In_ struct _IO_CSQ *Csq,
2889 _In_ PIRP Irp,
2890 _In_ PVOID InsertContext);
2891 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
2892
2893 typedef VOID
2894 (NTAPI IO_CSQ_REMOVE_IRP)(
2895 _In_ struct _IO_CSQ *Csq,
2896 _In_ PIRP Irp);
2897 typedef IO_CSQ_REMOVE_IRP *PIO_CSQ_REMOVE_IRP;
2898
2899 typedef PIRP
2900 (NTAPI IO_CSQ_PEEK_NEXT_IRP)(
2901 _In_ struct _IO_CSQ *Csq,
2902 _In_ PIRP Irp,
2903 _In_ PVOID PeekContext);
2904 typedef IO_CSQ_PEEK_NEXT_IRP *PIO_CSQ_PEEK_NEXT_IRP;
2905
2906 typedef VOID
2907 (NTAPI IO_CSQ_ACQUIRE_LOCK)(
2908 _In_ struct _IO_CSQ *Csq,
2909 _Out_ PKIRQL Irql);
2910 typedef IO_CSQ_ACQUIRE_LOCK *PIO_CSQ_ACQUIRE_LOCK;
2911
2912 typedef VOID
2913 (NTAPI IO_CSQ_RELEASE_LOCK)(
2914 _In_ struct _IO_CSQ *Csq,
2915 _In_ KIRQL Irql);
2916 typedef IO_CSQ_RELEASE_LOCK *PIO_CSQ_RELEASE_LOCK;
2917
2918 typedef VOID
2919 (NTAPI IO_CSQ_COMPLETE_CANCELED_IRP)(
2920 _In_ struct _IO_CSQ *Csq,
2921 _In_ PIRP Irp);
2922 typedef IO_CSQ_COMPLETE_CANCELED_IRP *PIO_CSQ_COMPLETE_CANCELED_IRP;
2923
2924 typedef struct _IO_CSQ {
2925 ULONG Type;
2926 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2927 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2928 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2929 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2930 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2931 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2932 PVOID ReservePointer;
2933 } IO_CSQ, *PIO_CSQ;
2934
2935 typedef enum _BUS_QUERY_ID_TYPE {
2936 BusQueryDeviceID,
2937 BusQueryHardwareIDs,
2938 BusQueryCompatibleIDs,
2939 BusQueryInstanceID,
2940 BusQueryDeviceSerialNumber,
2941 BusQueryContainerID
2942 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
2943
2944 typedef enum _DEVICE_TEXT_TYPE {
2945 DeviceTextDescription,
2946 DeviceTextLocationInformation
2947 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
2948
2949 typedef BOOLEAN
2950 (NTAPI *PGPE_SERVICE_ROUTINE)(
2951 PVOID,
2952 PVOID);
2953
2954 _IRQL_requires_max_(DISPATCH_LEVEL)
2955 _Must_inspect_result_
2956 typedef NTSTATUS
2957 (NTAPI *PGPE_CONNECT_VECTOR)(
2958 PDEVICE_OBJECT,
2959 ULONG,
2960 KINTERRUPT_MODE,
2961 BOOLEAN,
2962 PGPE_SERVICE_ROUTINE,
2963 PVOID,
2964 PVOID);
2965
2966 _IRQL_requires_max_(DISPATCH_LEVEL)
2967 _Must_inspect_result_
2968 typedef NTSTATUS
2969 (NTAPI *PGPE_DISCONNECT_VECTOR)(
2970 PVOID);
2971
2972 _IRQL_requires_max_(DISPATCH_LEVEL)
2973 _Must_inspect_result_
2974 typedef NTSTATUS
2975 (NTAPI *PGPE_ENABLE_EVENT)(
2976 PDEVICE_OBJECT,
2977 PVOID);
2978
2979 _IRQL_requires_max_(DISPATCH_LEVEL)
2980 _Must_inspect_result_
2981 typedef NTSTATUS
2982 (NTAPI *PGPE_DISABLE_EVENT)(
2983 PDEVICE_OBJECT,
2984 PVOID);
2985
2986 _IRQL_requires_max_(DISPATCH_LEVEL)
2987 _Must_inspect_result_
2988 typedef NTSTATUS
2989 (NTAPI *PGPE_CLEAR_STATUS)(
2990 PDEVICE_OBJECT,
2991 PVOID);
2992
2993 typedef VOID
2994 (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
2995 PVOID,
2996 ULONG);
2997
2998 _IRQL_requires_max_(DISPATCH_LEVEL)
2999 _Must_inspect_result_
3000 typedef NTSTATUS
3001 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
3002 PDEVICE_OBJECT,
3003 PDEVICE_NOTIFY_CALLBACK,
3004 PVOID);
3005
3006 _IRQL_requires_max_(DISPATCH_LEVEL)
3007 typedef VOID
3008 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
3009 PDEVICE_OBJECT,
3010 PDEVICE_NOTIFY_CALLBACK);
3011
3012 typedef struct _ACPI_INTERFACE_STANDARD {
3013 USHORT Size;
3014 USHORT Version;
3015 PVOID Context;
3016 PINTERFACE_REFERENCE InterfaceReference;
3017 PINTERFACE_DEREFERENCE InterfaceDereference;
3018 PGPE_CONNECT_VECTOR GpeConnectVector;
3019 PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
3020 PGPE_ENABLE_EVENT GpeEnableEvent;
3021 PGPE_DISABLE_EVENT GpeDisableEvent;
3022 PGPE_CLEAR_STATUS GpeClearStatus;
3023 PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
3024 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
3025 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
3026
3027 typedef BOOLEAN
3028 (NTAPI *PGPE_SERVICE_ROUTINE2)(
3029 PVOID ObjectContext,
3030 PVOID ServiceContext);
3031
3032 _IRQL_requires_max_(DISPATCH_LEVEL)
3033 _Must_inspect_result_
3034 typedef NTSTATUS
3035 (NTAPI *PGPE_CONNECT_VECTOR2)(
3036 PVOID Context,
3037 ULONG GpeNumber,
3038 KINTERRUPT_MODE Mode,
3039 BOOLEAN Shareable,
3040 PGPE_SERVICE_ROUTINE ServiceRoutine,
3041 PVOID ServiceContext,
3042 PVOID *ObjectContext);
3043
3044 _IRQL_requires_max_(DISPATCH_LEVEL)
3045 _Must_inspect_result_
3046 typedef NTSTATUS
3047 (NTAPI *PGPE_DISCONNECT_VECTOR2)(
3048 PVOID Context,
3049 PVOID ObjectContext);
3050
3051 _IRQL_requires_max_(DISPATCH_LEVEL)
3052 _Must_inspect_result_
3053 typedef NTSTATUS
3054 (NTAPI *PGPE_ENABLE_EVENT2)(
3055 PVOID Context,
3056 PVOID ObjectContext);
3057
3058 _IRQL_requires_max_(DISPATCH_LEVEL)
3059 _Must_inspect_result_
3060 typedef NTSTATUS
3061 (NTAPI *PGPE_DISABLE_EVENT2)(
3062 PVOID Context,
3063 PVOID ObjectContext);
3064
3065 _IRQL_requires_max_(DISPATCH_LEVEL)
3066 _Must_inspect_result_
3067 typedef NTSTATUS
3068 (NTAPI *PGPE_CLEAR_STATUS2)(
3069 PVOID Context,
3070 PVOID ObjectContext);
3071
3072 _IRQL_requires_max_(DISPATCH_LEVEL)
3073 typedef VOID
3074 (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
3075 PVOID NotificationContext,
3076 ULONG NotifyCode);
3077
3078 _IRQL_requires_max_(DISPATCH_LEVEL)
3079 _Must_inspect_result_
3080 typedef NTSTATUS
3081 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
3082 PVOID Context,
3083 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
3084 PVOID NotificationContext);
3085
3086 _IRQL_requires_max_(DISPATCH_LEVEL)
3087 typedef VOID
3088 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
3089 PVOID Context);
3090
3091 typedef struct _ACPI_INTERFACE_STANDARD2 {
3092 USHORT Size;
3093 USHORT Version;
3094 PVOID Context;
3095 PINTERFACE_REFERENCE InterfaceReference;
3096 PINTERFACE_DEREFERENCE InterfaceDereference;
3097 PGPE_CONNECT_VECTOR2 GpeConnectVector;
3098 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
3099 PGPE_ENABLE_EVENT2 GpeEnableEvent;
3100 PGPE_DISABLE_EVENT2 GpeDisableEvent;
3101 PGPE_CLEAR_STATUS2 GpeClearStatus;
3102 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
3103 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
3104 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
3105
3106 #if !defined(_AMD64_) && !defined(_ARM_)
3107 #include <pshpack4.h>
3108 #endif
3109
3110 typedef struct _IO_STACK_LOCATION {
3111 UCHAR MajorFunction;
3112 UCHAR MinorFunction;
3113 UCHAR Flags;
3114 UCHAR Control;
3115 union {
3116 struct {
3117 PIO_SECURITY_CONTEXT SecurityContext;
3118 ULONG Options;
3119 USHORT POINTER_ALIGNMENT FileAttributes;
3120 USHORT ShareAccess;
3121 ULONG POINTER_ALIGNMENT EaLength;
3122 } Create;
3123 struct {
3124 struct _IO_SECURITY_CONTEXT *SecurityContext;
3125 ULONG Options;
3126 USHORT POINTER_ALIGNMENT Reserved;
3127 USHORT ShareAccess;
3128 struct _NAMED_PIPE_CREATE_PARAMETERS *Parameters;
3129 } CreatePipe;
3130 struct {
3131 PIO_SECURITY_CONTEXT SecurityContext;
3132 ULONG Options;
3133 USHORT POINTER_ALIGNMENT Reserved;
3134 USHORT ShareAccess;
3135 struct _MAILSLOT_CREATE_PARAMETERS *Parameters;
3136 } CreateMailslot;
3137 struct {
3138 ULONG Length;
3139 ULONG POINTER_ALIGNMENT Key;
3140 LARGE_INTEGER ByteOffset;
3141 } Read;
3142 struct {
3143 ULONG Length;
3144 ULONG POINTER_ALIGNMENT Key;
3145 LARGE_INTEGER ByteOffset;
3146 } Write;
3147 struct {
3148 ULONG Length;
3149 PUNICODE_STRING FileName;
3150 FILE_INFORMATION_CLASS FileInformationClass;
3151 ULONG POINTER_ALIGNMENT FileIndex;
3152 } QueryDirectory;
3153 struct {
3154 ULONG Length;
3155 ULONG POINTER_ALIGNMENT CompletionFilter;
3156 } NotifyDirectory;
3157 struct {
3158 ULONG Length;
3159 ULONG POINTER_ALIGNMENT CompletionFilter;
3160 DIRECTORY_NOTIFY_INFORMATION_CLASS POINTER_ALIGNMENT DirectoryNotifyInformationClass;
3161 } NotifyDirectoryEx;
3162 struct {
3163 ULONG Length;
3164 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
3165 } QueryFile;
3166 struct {
3167 ULONG Length;
3168 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
3169 PFILE_OBJECT FileObject;
3170 _ANONYMOUS_UNION union {
3171 _ANONYMOUS_STRUCT struct {
3172 BOOLEAN ReplaceIfExists;
3173 BOOLEAN AdvanceOnly;
3174 } DUMMYSTRUCTNAME;
3175 ULONG ClusterCount;
3176 HANDLE DeleteHandle;
3177 } DUMMYUNIONNAME;
3178 } SetFile;
3179 struct {
3180 ULONG Length;
3181 PVOID EaList;
3182 ULONG EaListLength;
3183 ULONG POINTER_ALIGNMENT EaIndex;
3184 } QueryEa;
3185 struct {
3186 ULONG Length;
3187 } SetEa;
3188 struct {
3189 ULONG Length;
3190 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
3191 } QueryVolume;
3192 struct {
3193 ULONG Length;
3194 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
3195 } SetVolume;
3196 struct {
3197 ULONG OutputBufferLength;
3198 ULONG POINTER_ALIGNMENT InputBufferLength;
3199 ULONG POINTER_ALIGNMENT FsControlCode;
3200 PVOID Type3InputBuffer;
3201 } FileSystemControl;
3202 struct {
3203 PLARGE_INTEGER Length;
3204 ULONG POINTER_ALIGNMENT Key;
3205 LARGE_INTEGER ByteOffset;
3206 } LockControl;
3207 struct {
3208 ULONG OutputBufferLength;
3209 ULONG POINTER_ALIGNMENT InputBufferLength;
3210 ULONG POINTER_ALIGNMENT IoControlCode;
3211 PVOID Type3InputBuffer;
3212 } DeviceIoControl;
3213 struct {
3214 SECURITY_INFORMATION SecurityInformation;
3215 ULONG POINTER_ALIGNMENT Length;
3216 } QuerySecurity;
3217 struct {
3218 SECURITY_INFORMATION SecurityInformation;
3219 PSECURITY_DESCRIPTOR SecurityDescriptor;
3220 } SetSecurity;
3221 struct {
3222 PVPB Vpb;
3223 PDEVICE_OBJECT DeviceObject;
3224 } MountVolume;
3225 struct {
3226 PVPB Vpb;
3227 PDEVICE_OBJECT DeviceObject;
3228 } VerifyVolume;
3229 struct {
3230 struct _SCSI_REQUEST_BLOCK *Srb;
3231 } Scsi;
3232 struct {
3233 ULONG Length;
3234 PSID StartSid;
3235 struct _FILE_GET_QUOTA_INFORMATION *SidList;
3236 ULONG SidListLength;
3237 } QueryQuota;
3238 struct {
3239 ULONG Length;
3240 } SetQuota;
3241 struct {
3242 DEVICE_RELATION_TYPE Type;
3243 } QueryDeviceRelations;
3244 struct {
3245 CONST GUID *InterfaceType;
3246 USHORT Size;
3247 USHORT Version;
3248 PINTERFACE Interface;
3249 PVOID InterfaceSpecificData;
3250 } QueryInterface;
3251 struct {
3252 PDEVICE_CAPABILITIES Capabilities;
3253 } DeviceCapabilities;
3254 struct {
3255 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
3256 } FilterResourceRequirements;
3257 struct {
3258 ULONG WhichSpace;
3259 PVOID Buffer;
3260 ULONG Offset;
3261 ULONG POINTER_ALIGNMENT Length;
3262 } ReadWriteConfig;
3263 struct {
3264 BOOLEAN Lock;
3265 } SetLock;
3266 struct {
3267 BUS_QUERY_ID_TYPE IdType;
3268 } QueryId;
3269 struct {
3270 DEVICE_TEXT_TYPE DeviceTextType;
3271 LCID POINTER_ALIGNMENT LocaleId;
3272 } QueryDeviceText;
3273 struct {
3274 BOOLEAN InPath;
3275 BOOLEAN Reserved[3];
3276 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
3277 } UsageNotification;
3278 struct {
3279 SYSTEM_POWER_STATE PowerState;
3280 } WaitWake;
3281 struct {
3282 PPOWER_SEQUENCE PowerSequence;
3283 } PowerSequence;
3284 struct {
3285 union {
3286 ULONG SystemContext;
3287 #if (NTDDI_VERSION >= NTDDI_VISTA)
3288 SYSTEM_POWER_STATE_CONTEXT SystemPowerStateContext;
3289 #endif // (NTDDI_VERSION >= NTDDI_VISTA)
3290 };
3291 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
3292 POWER_STATE POINTER_ALIGNMENT State;
3293 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
3294 } Power;
3295 struct {
3296 PCM_RESOURCE_LIST AllocatedResources;
3297 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
3298 } StartDevice;
3299 struct {
3300 ULONG_PTR ProviderId;
3301 PVOID DataPath;
3302 ULONG BufferSize;
3303 PVOID Buffer;
3304 } WMI;
3305 struct {
3306 PVOID Argument1;
3307 PVOID Argument2;
3308 PVOID Argument3;
3309 PVOID Argument4;
3310 } Others;
3311 } Parameters;
3312 PDEVICE_OBJECT DeviceObject;
3313 PFILE_OBJECT FileObject;
3314 PIO_COMPLETION_ROUTINE CompletionRoutine;
3315 PVOID Context;
3316 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
3317
3318 #if !defined(_AMD64_) && !defined(_ARM_)
3319 #include "poppack.h"
3320 #endif
3321
3322
3323 /* IO_STACK_LOCATION.Control */
3324
3325 #define SL_PENDING_RETURNED 0x01
3326 #define SL_ERROR_RETURNED 0x02
3327 #define SL_INVOKE_ON_CANCEL 0x20
3328 #define SL_INVOKE_ON_SUCCESS 0x40
3329 #define SL_INVOKE_ON_ERROR 0x80
3330
3331 $endif (_WDMDDK_)
3332 $if (_WDMDDK_ || _DEVIOCTL_)
3333 #define METHOD_BUFFERED 0
3334 #define METHOD_IN_DIRECT 1
3335 #define METHOD_OUT_DIRECT 2
3336 #define METHOD_NEITHER 3
3337
3338 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
3339 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
3340
3341 $endif (_WDMDDK_ || _DEVIOCTL_)
3342 $if (_WDMDDK_)
3343 #define FILE_SUPERSEDED 0x00000000
3344 #define FILE_OPENED 0x00000001
3345 #define FILE_CREATED 0x00000002
3346 #define FILE_OVERWRITTEN 0x00000003
3347 #define FILE_EXISTS 0x00000004
3348 #define FILE_DOES_NOT_EXIST 0x00000005
3349
3350 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
3351 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
3352
3353 /* also in winnt.h */
3354 #define FILE_LIST_DIRECTORY 0x00000001
3355 #define FILE_READ_DATA 0x00000001
3356 #define FILE_ADD_FILE 0x00000002
3357 #define FILE_WRITE_DATA 0x00000002
3358 #define FILE_ADD_SUBDIRECTORY 0x00000004
3359 #define FILE_APPEND_DATA 0x00000004
3360 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
3361 #define FILE_READ_EA 0x00000008
3362 #define FILE_WRITE_EA 0x00000010
3363 #define FILE_EXECUTE 0x00000020
3364 #define FILE_TRAVERSE 0x00000020
3365 #define FILE_DELETE_CHILD 0x00000040
3366 #define FILE_READ_ATTRIBUTES 0x00000080
3367 #define FILE_WRITE_ATTRIBUTES 0x00000100
3368
3369 #define FILE_SHARE_READ 0x00000001
3370 #define FILE_SHARE_WRITE 0x00000002
3371 #define FILE_SHARE_DELETE 0x00000004
3372 #define FILE_SHARE_VALID_FLAGS 0x00000007
3373
3374 #define FILE_ATTRIBUTE_READONLY 0x00000001
3375 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
3376 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
3377 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
3378 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
3379 #define FILE_ATTRIBUTE_DEVICE 0x00000040
3380 #define FILE_ATTRIBUTE_NORMAL 0x00000080
3381 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
3382 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
3383 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
3384 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
3385 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
3386 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
3387 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
3388 #define FILE_ATTRIBUTE_INTEGRITY_STREAM 0x00008000
3389 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
3390
3391 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
3392 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
3393
3394 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
3395 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
3396 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
3397 #define FILE_VALID_SET_FLAGS 0x00000036
3398
3399 #define FILE_SUPERSEDE 0x00000000
3400 #define FILE_OPEN 0x00000001
3401 #define FILE_CREATE 0x00000002
3402 #define FILE_OPEN_IF 0x00000003
3403 #define FILE_OVERWRITE 0x00000004
3404 #define FILE_OVERWRITE_IF 0x00000005
3405 #define FILE_MAXIMUM_DISPOSITION 0x00000005
3406
3407 #define FILE_DIRECTORY_FILE 0x00000001
3408 #define FILE_WRITE_THROUGH 0x00000002
3409 #define FILE_SEQUENTIAL_ONLY 0x00000004
3410 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
3411 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
3412 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
3413 #define FILE_NON_DIRECTORY_FILE 0x00000040
3414 #define FILE_CREATE_TREE_CONNECTION 0x00000080
3415 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
3416 #define FILE_NO_EA_KNOWLEDGE 0x00000200
3417 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
3418 #define FILE_RANDOM_ACCESS 0x00000800
3419 #define FILE_DELETE_ON_CLOSE 0x00001000
3420 #define FILE_OPEN_BY_FILE_ID 0x00002000
3421 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
3422 #define FILE_NO_COMPRESSION 0x00008000
3423 #if (NTDDI_VERSION >= NTDDI_WIN7)
3424 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
3425 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
3426 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
3427 #define FILE_RESERVE_OPFILTER 0x00100000
3428 #define FILE_OPEN_REPARSE_POINT 0x00200000
3429 #define FILE_OPEN_NO_RECALL 0x00400000
3430 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
3431
3432 $endif (_WDMDDK_)
3433 $if (_WDMDDK_ || _DEVIOCTL_)
3434 #define FILE_ANY_ACCESS 0x00000000
3435 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
3436 #define FILE_READ_ACCESS 0x00000001
3437 #define FILE_WRITE_ACCESS 0x00000002
3438
3439 $endif (_WDMDDK_ || _DEVIOCTL_)
3440 $if (_WDMDDK_)
3441 #define FILE_ALL_ACCESS \
3442 (STANDARD_RIGHTS_REQUIRED | \
3443 SYNCHRONIZE | \
3444 0x1FF)
3445
3446 #define FILE_GENERIC_EXECUTE \
3447 (STANDARD_RIGHTS_EXECUTE | \
3448 FILE_READ_ATTRIBUTES | \
3449 FILE_EXECUTE | \
3450 SYNCHRONIZE)
3451
3452 #define FILE_GENERIC_READ \
3453 (STANDARD_RIGHTS_READ | \
3454 FILE_READ_DATA | \
3455 FILE_READ_ATTRIBUTES | \
3456 FILE_READ_EA | \
3457 SYNCHRONIZE)
3458
3459 #define FILE_GENERIC_WRITE \
3460 (STANDARD_RIGHTS_WRITE | \
3461 FILE_WRITE_DATA | \
3462 FILE_WRITE_ATTRIBUTES | \
3463 FILE_WRITE_EA | \
3464 FILE_APPEND_DATA | \
3465 SYNCHRONIZE)
3466
3467 /* end winnt.h */
3468
3469 #define WMIREG_ACTION_REGISTER 1
3470 #define WMIREG_ACTION_DEREGISTER 2
3471 #define WMIREG_ACTION_REREGISTER 3
3472 #define WMIREG_ACTION_UPDATE_GUIDS 4
3473 #define WMIREG_ACTION_BLOCK_IRPS 5
3474
3475 #define WMIREGISTER 0
3476 #define WMIUPDATE 1
3477
3478 _Function_class_(WMI_NOTIFICATION_CALLBACK)
3479 _IRQL_requires_same_
3480 typedef VOID
3481 (NTAPI FWMI_NOTIFICATION_CALLBACK)(
3482 PVOID Wnode,
3483 PVOID Context);
3484 typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
3485
3486 #ifndef _PCI_X_
3487 #define _PCI_X_
3488
3489 typedef struct _PCI_SLOT_NUMBER {
3490 union {
3491 struct {
3492 ULONG DeviceNumber:5;
3493 ULONG FunctionNumber:3;
3494 ULONG Reserved:24;
3495 } bits;
3496 ULONG AsULONG;
3497 } u;
3498 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
3499
3500 #define PCI_TYPE0_ADDRESSES 6
3501 #define PCI_TYPE1_ADDRESSES 2
3502 #define PCI_TYPE2_ADDRESSES 5
3503
3504 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
3505 inheritance, even from a struct renders the type non-POD. So we use
3506 this hack */
3507 #define PCI_COMMON_HEADER_LAYOUT \
3508 USHORT VendorID; \
3509 USHORT DeviceID; \
3510 USHORT Command; \
3511 USHORT Status; \
3512 UCHAR RevisionID; \
3513 UCHAR ProgIf; \
3514 UCHAR SubClass; \
3515 UCHAR BaseClass; \
3516 UCHAR CacheLineSize; \
3517 UCHAR LatencyTimer; \
3518 UCHAR HeaderType; \
3519 UCHAR BIST; \
3520 union { \
3521 struct _PCI_HEADER_TYPE_0 { \
3522 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
3523 ULONG CIS; \
3524 USHORT SubVendorID; \
3525 USHORT SubSystemID; \
3526 ULONG ROMBaseAddress; \
3527 UCHAR CapabilitiesPtr; \
3528 UCHAR Reserved1[3]; \
3529 ULONG Reserved2; \
3530 UCHAR InterruptLine; \
3531 UCHAR InterruptPin; \
3532 UCHAR MinimumGrant; \
3533 UCHAR MaximumLatency; \
3534 } type0; \
3535 struct _PCI_HEADER_TYPE_1 { \
3536 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
3537 UCHAR PrimaryBus; \
3538 UCHAR SecondaryBus; \
3539 UCHAR SubordinateBus; \
3540 UCHAR SecondaryLatency; \
3541 UCHAR IOBase; \
3542 UCHAR IOLimit; \
3543 USHORT SecondaryStatus; \
3544 USHORT MemoryBase; \
3545 USHORT MemoryLimit; \
3546 USHORT PrefetchBase; \
3547 USHORT PrefetchLimit; \
3548 ULONG PrefetchBaseUpper32; \
3549 ULONG PrefetchLimitUpper32; \
3550 USHORT IOBaseUpper16; \
3551 USHORT IOLimitUpper16; \
3552 UCHAR CapabilitiesPtr; \
3553 UCHAR Reserved1[3]; \
3554 ULONG ROMBaseAddress; \
3555 UCHAR InterruptLine; \
3556 UCHAR InterruptPin; \
3557 USHORT BridgeControl; \
3558 } type1; \
3559 struct _PCI_HEADER_TYPE_2 { \
3560 ULONG SocketRegistersBaseAddress; \
3561 UCHAR CapabilitiesPtr; \
3562 UCHAR Reserved; \
3563 USHORT SecondaryStatus; \
3564 UCHAR PrimaryBus; \
3565 UCHAR SecondaryBus; \
3566 UCHAR SubordinateBus; \
3567 UCHAR SecondaryLatency; \
3568 struct { \
3569 ULONG Base; \
3570 ULONG Limit; \
3571 } Range[PCI_TYPE2_ADDRESSES-1]; \
3572 UCHAR InterruptLine; \
3573 UCHAR InterruptPin; \
3574 USHORT BridgeControl; \
3575 } type2; \
3576 } u;
3577
3578 typedef struct _PCI_COMMON_HEADER {
3579 PCI_COMMON_HEADER_LAYOUT
3580 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
3581
3582 #ifdef __cplusplus
3583 typedef struct _PCI_COMMON_CONFIG {
3584 PCI_COMMON_HEADER_LAYOUT
3585 UCHAR DeviceSpecific[192];
3586 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
3587 #else
3588 typedef struct _PCI_COMMON_CONFIG {
3589 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
3590 UCHAR DeviceSpecific[192];
3591 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
3592 #endif
3593
3594 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
3595
3596 #define PCI_EXTENDED_CONFIG_LENGTH 0x1000
3597
3598 #define PCI_MAX_DEVICES 32
3599 #define PCI_MAX_FUNCTION 8
3600 #define PCI_MAX_BRIDGE_NUMBER 0xFF
3601 #define PCI_INVALID_VENDORID 0xFFFF
3602
3603 /* PCI_COMMON_CONFIG.HeaderType */
3604 #define PCI_MULTIFUNCTION 0x80
3605 #define PCI_DEVICE_TYPE 0x00
3606 #define PCI_BRIDGE_TYPE 0x01
3607 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
3608
3609 #define PCI_CONFIGURATION_TYPE(PciData) \
3610 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
3611
3612 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
3613 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
3614
3615 /* PCI_COMMON_CONFIG.Command */
3616 #define PCI_ENABLE_IO_SPACE 0x0001
3617 #define PCI_ENABLE_MEMORY_SPACE 0x0002
3618 #define PCI_ENABLE_BUS_MASTER 0x0004
3619 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
3620 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
3621 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
3622 #define PCI_ENABLE_PARITY 0x0040
3623 #define PCI_ENABLE_WAIT_CYCLE 0x0080
3624 #define PCI_ENABLE_SERR 0x0100
3625 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
3626 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
3627
3628 /* PCI_COMMON_CONFIG.Status */
3629 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
3630 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
3631 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
3632 #define PCI_STATUS_UDF_SUPPORTED 0x0040
3633 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
3634 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
3635 #define PCI_STATUS_DEVSEL 0x0600
3636 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
3637 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
3638 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
3639 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
3640 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
3641
3642 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
3643
3644 #define PCI_WHICHSPACE_CONFIG 0x0
3645 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
3646
3647 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
3648 #define PCI_CAPABILITY_ID_AGP 0x02
3649 #define PCI_CAPABILITY_ID_VPD 0x03
3650 #define PCI_CAPABILITY_ID_SLOT_ID 0x04
3651 #define PCI_CAPABILITY_ID_MSI 0x05
3652 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06
3653 #define PCI_CAPABILITY_ID_PCIX 0x07
3654 #define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08
3655 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09
3656 #define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A
3657 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B
3658 #define PCI_CAPABILITY_ID_SHPC 0x0C
3659 #define PCI_CAPABILITY_ID_P2P_SSID 0x0D
3660 #define PCI_CAPABILITY_ID_AGP_TARGET 0x0E
3661 #define PCI_CAPABILITY_ID_SECURE 0x0F
3662 #define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
3663 #define PCI_CAPABILITY_ID_MSIX 0x11
3664
3665 typedef struct _PCI_CAPABILITIES_HEADER {
3666 UCHAR CapabilityID;
3667 UCHAR Next;
3668 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
3669
3670 typedef struct _PCI_PMC {
3671 UCHAR Version:3;
3672 UCHAR PMEClock:1;
3673 UCHAR Rsvd1:1;
3674 UCHAR DeviceSpecificInitialization:1;
3675 UCHAR Rsvd2:2;
3676 struct _PM_SUPPORT {
3677 UCHAR Rsvd2:1;
3678 UCHAR D1:1;
3679 UCHAR D2:1;
3680 UCHAR PMED0:1;
3681 UCHAR PMED1:1;
3682 UCHAR PMED2:1;
3683 UCHAR PMED3Hot:1;
3684 UCHAR PMED3Cold:1;
3685 } Support;
3686 } PCI_PMC, *PPCI_PMC;
3687
3688 typedef struct _PCI_PMCSR {
3689 USHORT PowerState:2;
3690 USHORT Rsvd1:6;
3691 USHORT PMEEnable:1;
3692 USHORT DataSelect:4;
3693 USHORT DataScale:2;
3694 USHORT PMEStatus:1;
3695 } PCI_PMCSR, *PPCI_PMCSR;
3696
3697 typedef struct _PCI_PMCSR_BSE {
3698 UCHAR Rsvd1:6;
3699 UCHAR D3HotSupportsStopClock:1;
3700 UCHAR BusPowerClockControlEnabled:1;
3701 } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
3702
3703 typedef struct _PCI_PM_CAPABILITY {
3704 PCI_CAPABILITIES_HEADER Header;
3705 union {
3706 PCI_PMC Capabilities;
3707 USHORT AsUSHORT;
3708 } PMC;
3709 union {
3710 PCI_PMCSR ControlStatus;
3711 USHORT AsUSHORT;
3712 } PMCSR;
3713 union {
3714 PCI_PMCSR_BSE BridgeSupport;
3715 UCHAR AsUCHAR;
3716 } PMCSR_BSE;
3717 UCHAR Data;
3718 } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
3719
3720 typedef struct {
3721 PCI_CAPABILITIES_HEADER Header;
3722 union {
3723 struct {
3724 USHORT DataParityErrorRecoveryEnable:1;
3725 USHORT EnableRelaxedOrdering:1;
3726 USHORT MaxMemoryReadByteCount:2;
3727 USHORT MaxOutstandingSplitTransactions:3;
3728 USHORT Reserved:9;
3729 } bits;
3730 USHORT AsUSHORT;
3731 } Command;
3732 union {
3733 struct {
3734 ULONG FunctionNumber:3;
3735 ULONG DeviceNumber:5;
3736 ULONG BusNumber:8;
3737 ULONG Device64Bit:1;
3738 ULONG Capable133MHz:1;
3739 ULONG SplitCompletionDiscarded:1;
3740 ULONG UnexpectedSplitCompletion:1;
3741 ULONG DeviceComplexity:1;
3742 ULONG DesignedMaxMemoryReadByteCount:2;
3743 ULONG DesignedMaxOutstandingSplitTransactions:3;
3744 ULONG DesignedMaxCumulativeReadSize:3;
3745 ULONG ReceivedSplitCompletionErrorMessage:1;
3746 ULONG CapablePCIX266:1;
3747 ULONG CapablePCIX533:1;
3748 } bits;
3749 ULONG AsULONG;
3750 } Status;
3751 } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
3752
3753 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001
3754 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002
3755 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003
3756 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004
3757 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005
3758 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006
3759 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007
3760 #define PCI_EXPRESS_MFVC_CAP_ID 0x0008
3761 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009
3762 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A
3763 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010
3764
3765 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
3766 USHORT CapabilityID;
3767 USHORT Version:4;
3768 USHORT Next:12;
3769 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
3770
3771 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
3772 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
3773 ULONG LowSerialNumber;
3774 ULONG HighSerialNumber;
3775 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
3776
3777 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
3778 _ANONYMOUS_STRUCT struct {
3779 ULONG Undefined:1;
3780 ULONG Reserved1:3;
3781 ULONG DataLinkProtocolError:1;
3782 ULONG SurpriseDownError:1;
3783 ULONG Reserved2:6;
3784 ULONG PoisonedTLP:1;
3785 ULONG FlowControlProtocolError:1;
3786 ULONG CompletionTimeout:1;
3787 ULONG CompleterAbort:1;
3788 ULONG UnexpectedCompletion:1;
3789 ULONG ReceiverOverflow:1;
3790 ULONG MalformedTLP:1;
3791 ULONG ECRCError:1;
3792 ULONG UnsupportedRequestError:1;
3793 ULONG Reserved3:11;
3794 } DUMMYSTRUCTNAME;
3795 ULONG AsULONG;
3796 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
3797
3798 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
3799 _ANONYMOUS_STRUCT struct {
3800 ULONG Undefined:1;
3801 ULONG Reserved1:3;
3802 ULONG DataLinkProtocolError:1;
3803 ULONG SurpriseDownError:1;
3804 ULONG Reserved2:6;
3805 ULONG PoisonedTLP:1;
3806 ULONG FlowControlProtocolError:1;
3807 ULONG CompletionTimeout:1;
3808 ULONG CompleterAbort:1;
3809 ULONG UnexpectedCompletion:1;
3810 ULONG ReceiverOverflow:1;
3811 ULONG MalformedTLP:1;
3812 ULONG ECRCError:1;
3813 ULONG UnsupportedRequestError:1;
3814 ULONG Reserved3:11;
3815 } DUMMYSTRUCTNAME;
3816 ULONG AsULONG;
3817 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
3818
3819 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
3820 _ANONYMOUS_STRUCT struct {
3821 ULONG Undefined:1;
3822 ULONG Reserved1:3;
3823 ULONG DataLinkProtocolError:1;
3824 ULONG SurpriseDownError:1;
3825 ULONG Reserved2:6;
3826 ULONG PoisonedTLP:1;
3827 ULONG FlowControlProtocolError:1;
3828 ULONG CompletionTimeout:1;
3829 ULONG CompleterAbort:1;
3830 ULONG UnexpectedCompletion:1;
3831 ULONG ReceiverOverflow:1;
3832 ULONG MalformedTLP:1;
3833 ULONG ECRCError:1;
3834 ULONG UnsupportedRequestError:1;
3835 ULONG Reserved3:11;
3836 } DUMMYSTRUCTNAME;
3837 ULONG AsULONG;
3838 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
3839
3840 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
3841 _ANONYMOUS_STRUCT struct {
3842 ULONG ReceiverError:1;
3843 ULONG Reserved1:5;
3844 ULONG BadTLP:1;
3845 ULONG BadDLLP:1;
3846 ULONG ReplayNumRollover:1;
3847 ULONG Reserved2:3;
3848 ULONG ReplayTimerTimeout:1;
3849 ULONG AdvisoryNonFatalError:1;
3850 ULONG Reserved3:18;
3851 } DUMMYSTRUCTNAME;
3852 ULONG AsULONG;
3853 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
3854
3855 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
3856 _ANONYMOUS_STRUCT struct {
3857 ULONG ReceiverError:1;
3858 ULONG Reserved1:5;
3859 ULONG BadTLP:1;
3860 ULONG BadDLLP:1;
3861 ULONG ReplayNumRollover:1;
3862 ULONG Reserved2:3;
3863 ULONG ReplayTimerTimeout:1;
3864 ULONG AdvisoryNonFatalError:1;
3865 ULONG Reserved3:18;
3866 } DUMMYSTRUCTNAME;
3867 ULONG AsULONG;
3868 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
3869
3870 typedef union _PCI_EXPRESS_AER_CAPABILITIES {
3871 _ANONYMOUS_STRUCT struct {
3872 ULONG FirstErrorPointer:5;
3873 ULONG ECRCGenerationCapable:1;
3874 ULONG ECRCGenerationEnable:1;
3875 ULONG ECRCCheckCapable:1;
3876 ULONG ECRCCheckEnable:1;
3877 ULONG Reserved:23;
3878 } DUMMYSTRUCTNAME;
3879 ULONG AsULONG;
3880 } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
3881
3882 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
3883 _ANONYMOUS_STRUCT struct {
3884 ULONG CorrectableErrorReportingEnable:1;
3885 ULONG NonFatalErrorReportingEnable:1;
3886 ULONG FatalErrorReportingEnable:1;
3887 ULONG Reserved:29;
3888 } DUMMYSTRUCTNAME;
3889 ULONG AsULONG;
3890 } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
3891
3892 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
3893 _ANONYMOUS_STRUCT struct {
3894 ULONG CorrectableErrorReceived:1;
3895 ULONG MultipleCorrectableErrorsReceived:1;
3896 ULONG UncorrectableErrorReceived:1;
3897 ULONG MultipleUncorrectableErrorsReceived:1;
3898 ULONG FirstUncorrectableFatal:1;
3899 ULONG NonFatalErrorMessagesReceived:1;
3900 ULONG FatalErrorMessagesReceived:1;
3901 ULONG Reserved:20;
3902 ULONG AdvancedErrorInterruptMessageNumber:5;
3903 } DUMMYSTRUCTNAME;
3904 ULONG AsULONG;
3905 } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
3906
3907 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
3908 _ANONYMOUS_STRUCT struct {
3909 USHORT CorrectableSourceIdFun:3;
3910 USHORT CorrectableSourceIdDev:5;
3911 USHORT CorrectableSourceIdBus:8;
3912 USHORT UncorrectableSourceIdFun:3;
3913 USHORT UncorrectableSourceIdDev:5;
3914 USHORT UncorrectableSourceIdBus:8;
3915 } DUMMYSTRUCTNAME;
3916 ULONG AsULONG;
3917 } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
3918
3919 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
3920 _ANONYMOUS_STRUCT struct {
3921 ULONG TargetAbortOnSplitCompletion:1;
3922 ULONG MasterAbortOnSplitCompletion:1;
3923 ULONG ReceivedTargetAbort:1;
3924 ULONG ReceivedMasterAbort:1;
3925 ULONG RsvdZ:1;
3926 ULONG UnexpectedSplitCompletionError:1;
3927 ULONG UncorrectableSplitCompletion:1;
3928 ULONG UncorrectableDataError:1;
3929 ULONG UncorrectableAttributeError:1;
3930 ULONG UncorrectableAddressError:1;
3931 ULONG DelayedTransactionDiscardTimerExpired:1;
3932 ULONG PERRAsserted:1;
3933 ULONG SERRAsserted:1;
3934 ULONG InternalBridgeError:1;
3935 ULONG Reserved:18;
3936 } DUMMYSTRUCTNAME;
3937 ULONG AsULONG;
3938 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
3939
3940 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
3941 _ANONYMOUS_STRUCT struct {
3942 ULONG TargetAbortOnSplitCompletion:1;
3943 ULONG MasterAbortOnSplitCompletion:1;
3944 ULONG ReceivedTargetAbort:1;
3945 ULONG ReceivedMasterAbort:1;
3946 ULONG RsvdZ:1;
3947 ULONG UnexpectedSplitCompletionError:1;
3948 ULONG UncorrectableSplitCompletion:1;
3949 ULONG UncorrectableDataError:1;
3950 ULONG UncorrectableAttributeError:1;
3951 ULONG UncorrectableAddressError:1;
3952 ULONG DelayedTransactionDiscardTimerExpired:1;
3953 ULONG PERRAsserted:1;
3954 ULONG SERRAsserted:1;
3955 ULONG InternalBridgeError:1;
3956 ULONG Reserved:18;
3957 } DUMMYSTRUCTNAME;
3958 ULONG AsULONG;
3959 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
3960
3961 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
3962 _ANONYMOUS_STRUCT struct {
3963 ULONG TargetAbortOnSplitCompletion:1;
3964 ULONG MasterAbortOnSplitCompletion:1;
3965 ULONG ReceivedTargetAbort:1;
3966 ULONG ReceivedMasterAbort:1;
3967 ULONG RsvdZ:1;
3968 ULONG UnexpectedSplitCompletionError:1;
3969 ULONG UncorrectableSplitCompletion:1;
3970 ULONG UncorrectableDataError:1;
3971 ULONG UncorrectableAttributeError:1;
3972 ULONG UncorrectableAddressError:1;
3973 ULONG DelayedTransactionDiscardTimerExpired:1;
3974 ULONG PERRAsserted:1;
3975 ULONG SERRAsserted:1;
3976 ULONG InternalBridgeError:1;
3977 ULONG Reserved:18;
3978 } DUMMYSTRUCTNAME;
3979 ULONG AsULONG;
3980 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
3981
3982 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
3983 _ANONYMOUS_STRUCT struct {
3984 ULONG SecondaryUncorrectableFirstErrorPtr:5;
3985 ULONG Reserved:27;
3986 } DUMMYSTRUCTNAME;
3987 ULONG AsULONG;
3988 } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
3989
3990 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001
3991 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002
3992 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004
3993
3994 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
3995 (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
3996 ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
3997 ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
3998
3999 typedef struct _PCI_EXPRESS_AER_CAPABILITY {
4000 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
4001 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
4002 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
4003 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
4004 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
4005 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
4006 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
4007 ULONG HeaderLog[4];
4008 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
4009 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
4010 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
4011 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
4012 ULONG SecHeaderLog[4];
4013 } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
4014
4015 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
4016 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
4017 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
4018 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
4019 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
4020 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
4021 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
4022 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
4023 ULONG HeaderLog[4];
4024 PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
4025 PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
4026 PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
4027 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
4028
4029 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
4030 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
4031 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
4032 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
4033 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
4034 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
4035 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
4036 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
4037 ULONG HeaderLog[4];
4038 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
4039 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
4040 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
4041 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
4042 ULONG SecHeaderLog[4];
4043 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
4044
4045 typedef union _PCI_EXPRESS_SRIOV_CAPS {
4046 _ANONYMOUS_STRUCT struct {
4047 ULONG VFMigrationCapable:1;
4048 ULONG Reserved1:20;
4049 ULONG VFMigrationInterruptNumber:11;
4050 } DUMMYSTRUCTNAME;
4051 ULONG AsULONG;
4052 } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
4053
4054 typedef union _PCI_EXPRESS_SRIOV_CONTROL {
4055 _ANONYMOUS_STRUCT struct {
4056 USHORT VFEnable:1;
4057 USHORT VFMigrationEnable:1;
4058 USHORT VFMigrationInterruptEnable:1;
4059 USHORT VFMemorySpaceEnable:1;
4060 USHORT ARICapableHierarchy:1;
4061 USHORT Reserved1:11;
4062 } DUMMYSTRUCTNAME;
4063 USHORT AsUSHORT;
4064 } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
4065
4066 typedef union _PCI_EXPRESS_SRIOV_STATUS {
4067 _ANONYMOUS_STRUCT struct {
4068 USHORT VFMigrationStatus:1;
4069 USHORT Reserved1:15;
4070 } DUMMYSTRUCTNAME;
4071 USHORT AsUSHORT;
4072 } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
4073
4074 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
4075 _ANONYMOUS_STRUCT struct {
4076 ULONG VFMigrationStateBIR:3;
4077 ULONG VFMigrationStateOffset:29;
4078 } DUMMYSTRUCTNAME;
4079 ULONG AsULONG;
4080 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
4081
4082 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
4083 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
4084 PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
4085 PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
4086 PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
4087 USHORT InitialVFs;
4088 USHORT TotalVFs;
4089 USHORT NumVFs;
4090 UCHAR FunctionDependencyLink;
4091 UCHAR RsvdP1;
4092 USHORT FirstVFOffset;
4093 USHORT VFStride;
4094 USHORT RsvdP2;
4095 USHORT VFDeviceId;
4096 ULONG SupportedPageSizes;
4097 ULONG SystemPageSize;
4098 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
4099 PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
4100 } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
4101
4102 /* PCI device classes */
4103 #define PCI_CLASS_PRE_20 0x00
4104 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
4105 #define PCI_CLASS_NETWORK_CTLR 0x02
4106 #define PCI_CLASS_DISPLAY_CTLR 0x03
4107 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
4108 #define PCI_CLASS_MEMORY_CTLR 0x05
4109 #define PCI_CLASS_BRIDGE_DEV 0x06
4110 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
4111 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
4112 #define PCI_CLASS_INPUT_DEV 0x09
4113 #define PCI_CLASS_DOCKING_STATION 0x0a
4114 #define PCI_CLASS_PROCESSOR 0x0b
4115 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
4116 #define PCI_CLASS_WIRELESS_CTLR 0x0d
4117 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
4118 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
4119 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
4120 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
4121 #define PCI_CLASS_NOT_DEFINED 0xff
4122
4123 /* PCI device subclasses for class 0 */
4124 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
4125 #define PCI_SUBCLASS_PRE_20_VGA 0x01
4126
4127 /* PCI device subclasses for class 1 (mass storage controllers)*/
4128 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
4129 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
4130 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
4131 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
4132 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
4133 #define PCI_SUBCLASS_MSC_OTHER 0x80
4134
4135 /* PCI device subclasses for class 2 (network controllers)*/
4136 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
4137 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
4138 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
4139 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
4140 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
4141 #define PCI_SUBCLASS_NET_OTHER 0x80
4142
4143 /* PCI device subclasses for class 3 (display controllers)*/
4144 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
4145 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
4146 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
4147 #define PCI_SUBCLASS_VID_OTHER 0x80
4148
4149 /* PCI device subclasses for class 4 (multimedia device)*/
4150 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
4151 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
4152 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
4153 #define PCI_SUBCLASS_MM_OTHER 0x80
4154
4155 /* PCI device subclasses for class 5 (memory controller)*/
4156 #define PCI_SUBCLASS_MEM_RAM 0x00
4157 #define PCI_SUBCLASS_MEM_FLASH 0x01
4158 #define PCI_SUBCLASS_MEM_OTHER 0x80
4159
4160 /* PCI device subclasses for class 6 (bridge device)*/
4161 #define PCI_SUBCLASS_BR_HOST 0x00
4162 #define PCI_SUBCLASS_BR_ISA 0x01
4163 #define PCI_SUBCLASS_BR_EISA 0x02
4164 #define PCI_SUBCLASS_BR_MCA 0x03
4165 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
4166 #define PCI_SUBCLASS_BR_PCMCIA 0x05
4167 #define PCI_SUBCLASS_BR_NUBUS 0x06
4168 #define PCI_SUBCLASS_BR_CARDBUS 0x07
4169 #define PCI_SUBCLASS_BR_RACEWAY 0x08
4170 #define PCI_SUBCLASS_BR_OTHER 0x80
4171
4172 #define PCI_SUBCLASS_COM_SERIAL 0x00
4173 #define PCI_SUBCLASS_COM_PARALLEL 0x01
4174 #define PCI_SUBCLASS_COM_MULTIPORT 0x02
4175 #define PCI_SUBCLASS_COM_MODEM 0x03
4176 #define PCI_SUBCLASS_COM_OTHER 0x80
4177
4178 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00
4179 #define PCI_SUBCLASS_SYS_DMA_CTLR 0x01
4180 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02
4181 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03
4182 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04
4183 #define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05
4184 #define PCI_SUBCLASS_SYS_OTHER 0x80
4185
4186 #define PCI_SUBCLASS_INP_KEYBOARD 0x00
4187 #define PCI_SUBCLASS_INP_DIGITIZER 0x01
4188 #define PCI_SUBCLASS_INP_MOUSE 0x02
4189 #define PCI_SUBCLASS_INP_SCANNER 0x03
4190 #define PCI_SUBCLASS_INP_GAMEPORT 0x04
4191 #define PCI_SUBCLASS_INP_OTHER 0x80
4192
4193 #define PCI_SUBCLASS_DOC_GENERIC 0x00
4194 #define PCI_SUBCLASS_DOC_OTHER 0x80
4195
4196 #define PCI_SUBCLASS_PROC_386 0x00
4197 #define PCI_SUBCLASS_PROC_486 0x01
4198 #define PCI_SUBCLASS_PROC_PENTIUM 0x02
4199 #define PCI_SUBCLASS_PROC_ALPHA 0x10
4200 #define PCI_SUBCLASS_PROC_POWERPC 0x20
4201 #define PCI_SUBCLASS_PROC_COPROCESSOR 0x40
4202
4203 /* PCI device subclasses for class C (serial bus controller)*/
4204 #define PCI_SUBCLASS_SB_IEEE1394 0x00
4205 #define PCI_SUBCLASS_SB_ACCESS 0x01
4206 #define PCI_SUBCLASS_SB_SSA 0x02
4207 #define PCI_SUBCLASS_SB_USB 0x03
4208 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
4209 #define PCI_SUBCLASS_SB_SMBUS 0x05
4210
4211 #define PCI_SUBCLASS_WIRELESS_IRDA 0x00
4212 #define PCI_SUBCLASS_WIRELESS_CON_IR 0x01
4213 #define PCI_SUBCLASS_WIRELESS_RF 0x10
4214 #define PCI_SUBCLASS_WIRELESS_OTHER 0x80
4215
4216 #define PCI_SUBCLASS_INTIO_I2O 0x00
4217
4218 #define PCI_SUBCLASS_SAT_TV 0x01
4219 #define PCI_SUBCLASS_SAT_AUDIO 0x02
4220 #define PCI_SUBCLASS_SAT_VOICE 0x03
4221 #define PCI_SUBCLASS_SAT_DATA 0x04
4222
4223 #define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00
4224 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10
4225 #define PCI_SUBCLASS_CRYPTO_OTHER 0x80
4226
4227 #define PCI_SUBCLASS_DASP_DPIO 0x00
4228 #define PCI_SUBCLASS_DASP_OTHER 0x80
4229
4230 #define PCI_ADDRESS_IO_SPACE 0x00000001
4231 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
4232 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
4233 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
4234 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
4235 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
4236
4237 #define PCI_TYPE_32BIT 0
4238 #define PCI_TYPE_20BIT 2
4239 #define PCI_TYPE_64BIT 4
4240
4241 #define PCI_ROMADDRESS_ENABLED 0x00000001
4242
4243 #endif /* _PCI_X_ */
4244
4245 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1
4246
4247 _IRQL_requires_max_(PASSIVE_LEVEL)
4248 _Must_inspect_result_
4249 typedef NTSTATUS
4250 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
4251 _Inout_ PVOID Context);
4252 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
4253
4254 _IRQL_requires_max_(PASSIVE_LEVEL)
4255 _Must_inspect_result_
4256 typedef NTSTATUS
4257 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
4258 _Inout_ PVOID Context);
4259 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
4260
4261 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
4262 USHORT Size;
4263 USHORT Version;
4264 PVOID Context;
4265 PINTERFACE_REFERENCE InterfaceReference;
4266 PINTERFACE_DEREFERENCE InterfaceDereference;
4267 PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
4268 PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
4269 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
4270
4271 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1
4272
4273 typedef ULONG
4274 (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
4275 _In_ PVOID Context,
4276 _Out_writes_bytes_(Length) PVOID Buffer,
4277 _In_ ULONG Offset,
4278 _In_ ULONG Length);
4279
4280 typedef ULONG
4281 (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
4282 _In_ PVOID Context,
4283 _In_reads_bytes_(Length) PVOID Buffer,
4284 _In_ ULONG Offset,
4285 _In_ ULONG Length);
4286
4287 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
4288 USHORT Size;
4289 USHORT Version;
4290 PVOID Context;
4291 PINTERFACE_REFERENCE InterfaceReference;
4292 PINTERFACE_DEREFERENCE InterfaceDereference;
4293 PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
4294 PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
4295 } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
4296
4297 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1
4298
4299 _Must_inspect_result_
4300 typedef NTSTATUS
4301 (NTAPI PCI_MSIX_SET_ENTRY)(
4302 _In_ PVOID Context,
4303 _In_ ULONG TableEntry,
4304 _In_ ULONG MessageNumber);
4305 typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
4306
4307 _Must_inspect_result_
4308 typedef NTSTATUS
4309 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
4310 _In_ PVOID Context,
4311 _In_ ULONG TableEntry);
4312 typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
4313
4314 _Must_inspect_result_
4315 typedef NTSTATUS
4316 (NTAPI PCI_MSIX_GET_ENTRY)(
4317 _In_ PVOID Context,
4318 _In_ ULONG TableEntry,
4319 _Out_ PULONG MessageNumber,
4320 _Out_ PBOOLEAN Masked);
4321 typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
4322
4323 _Must_inspect_result_
4324 typedef NTSTATUS
4325 (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
4326 _In_ PVOID Context,
4327 _Out_ PULONG TableSize);
4328 typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
4329
4330 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
4331 USHORT Size;
4332 USHORT Version;
4333 PVOID Context;
4334 PINTERFACE_REFERENCE InterfaceReference;
4335 PINTERFACE_DEREFERENCE InterfaceDereference;
4336 PPCI_MSIX_SET_ENTRY SetTableEntry;
4337 PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
4338 PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
4339 PPCI_MSIX_GET_ENTRY GetTableEntry;
4340 PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
4341 } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
4342
4343 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
4344 RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
4345
4346 $endif (_WDMDDK_)
4347 $if (_NTDDK_)
4348 #ifndef _ARC_DDK_
4349 #define _ARC_DDK_
4350 typedef enum _CONFIGURATION_TYPE {
4351 ArcSystem,
4352 CentralProcessor,
4353 FloatingPointProcessor,
4354 PrimaryIcache,
4355 PrimaryDcache,
4356 SecondaryIcache,
4357 SecondaryDcache,
4358 SecondaryCache,
4359 EisaAdapter,
4360 TcAdapter,
4361 ScsiAdapter,
4362 DtiAdapter,
4363 MultiFunctionAdapter,
4364 DiskController,
4365 TapeController,
4366 CdromController,
4367 WormController,
4368 SerialController,
4369 NetworkController,
4370 DisplayController,
4371 ParallelController,
4372 PointerController,
4373 KeyboardController,
4374 AudioController,
4375 OtherController,
4376 DiskPeripheral,
4377 FloppyDiskPeripheral,
4378 TapePeripheral,
4379 ModemPeripheral,
4380 MonitorPeripheral,
4381 PrinterPeripheral,
4382 PointerPeripheral,
4383 KeyboardPeripheral,
4384 TerminalPeripheral,
4385 OtherPeripheral,
4386 LinePeripheral,
4387 NetworkPeripheral,
4388 SystemMemory,
4389 DockingInformation,
4390 RealModeIrqRoutingTable,
4391 RealModePCIEnumeration,
4392 MaximumType
4393 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
4394 #endif /* !_ARC_DDK_ */
4395
4396 /*
4397 ** IRP function codes
4398 */
4399
4400 #define IRP_MN_QUERY_DIRECTORY 0x01
4401 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
4402
4403 #define IRP_MN_USER_FS_REQUEST 0x00
4404 #define IRP_MN_MOUNT_VOLUME 0x01
4405 #define IRP_MN_VERIFY_VOLUME 0x02
4406 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
4407 #define IRP_MN_TRACK_LINK 0x04
4408 #define IRP_MN_KERNEL_CALL 0x04
4409
4410 #define IRP_MN_LOCK 0x01
4411 #define IRP_MN_UNLOCK_SINGLE 0x02
4412 #define IRP_MN_UNLOCK_ALL 0x03
4413 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
4414
4415 #define IRP_MN_FLUSH_AND_PURGE 0x01
4416
4417 #define IRP_MN_NORMAL 0x00
4418 #define IRP_MN_DPC 0x01
4419 #define IRP_MN_MDL 0x02
4420 #define IRP_MN_COMPLETE 0x04
4421 #define IRP_MN_COMPRESSED 0x08
4422
4423 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
4424 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
4425 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
4426
4427 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
4428
4429 #define IO_CHECK_CREATE_PARAMETERS 0x0200
4430 #define IO_ATTACH_DEVICE 0x0400
4431 #define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
4432
4433 typedef NTSTATUS
4434 (NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
4435 _In_ PVOID Context,
4436 _In_ PUNICODE_STRING PathName,
4437 _In_ INTERFACE_TYPE BusType,
4438 _In_ ULONG BusNumber,
4439 _In_ PKEY_VALUE_FULL_INFORMATION *BusInformation,
4440 _In_ CONFIGURATION_TYPE ControllerType,
4441 _In_ ULONG ControllerNumber,
4442 _In_ PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
4443 _In_ CONFIGURATION_TYPE PeripheralType,
4444 _In_ ULONG PeripheralNumber,
4445 _In_ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
4446
4447 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
4448 IoQueryDeviceIdentifier = 0,
4449 IoQueryDeviceConfigurationData,
4450 IoQueryDeviceComponentInformation,
4451 IoQueryDeviceMaxData
4452 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
4453
4454 typedef VOID
4455 (NTAPI *PDRIVER_REINITIALIZE)(
4456 _In_ struct _DRIVER_OBJECT *DriverObject,
4457 _In_opt_ PVOID Context,
4458 _In_ ULONG Count);
4459
4460 typedef struct _CONTROLLER_OBJECT {
4461 CSHORT Type;
4462 CSHORT Size;
4463 PVOID ControllerExtension;
4464 KDEVICE_QUEUE DeviceWaitQueue;
4465 ULONG Spare1;
4466 LARGE_INTEGER Spare2;
4467 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
4468
4469 #define DRVO_REINIT_REGISTERED 0x00000008
4470 #define DRVO_INITIALIZED 0x00000010
4471 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
4472 #define DRVO_LEGACY_RESOURCES 0x00000040
4473
4474 typedef struct _CONFIGURATION_INFORMATION {
4475 ULONG DiskCount;
4476 ULONG FloppyCount;
4477 ULONG CdRomCount;
4478 ULONG TapeCount;
4479 ULONG ScsiPortCount;
4480 ULONG SerialCount;
4481 ULONG ParallelCount;
4482 BOOLEAN AtDiskPrimaryAddressClaimed;
4483 BOOLEAN AtDiskSecondaryAddressClaimed;
4484 ULONG Version;
4485 ULONG MediumChangerCount;
4486 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
4487
4488 typedef struct _DISK_SIGNATURE {
4489 ULONG PartitionStyle;
4490 _ANONYMOUS_UNION union {
4491 struct {
4492 ULONG Signature;
4493 ULONG CheckSum;
4494 } Mbr;
4495 struct {
4496 GUID DiskId;
4497 } Gpt;
4498 } DUMMYUNIONNAME;
4499 } DISK_SIGNATURE, *PDISK_SIGNATURE;
4500
4501 typedef struct _TXN_PARAMETER_BLOCK {
4502 USHORT Length;
4503 USHORT TxFsContext;
4504 PVOID TransactionObject;
4505 } TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK;
4506
4507 #define TXF_MINIVERSION_DEFAULT_VIEW (0xFFFE)
4508
4509 typedef struct _IO_DRIVER_CREATE_CONTEXT {
4510 CSHORT Size;
4511 struct _ECP_LIST *ExtraCreateParameter;
4512 PVOID DeviceObjectHint;
4513 PTXN_PARAMETER_BLOCK TxnParameters;
4514 } IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT;
4515
4516 typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD {
4517 USHORT Size;
4518 USHORT Version;
4519 PVOID Context;
4520 PINTERFACE_REFERENCE InterfaceReference;
4521 PINTERFACE_DEREFERENCE InterfaceDereference;
4522 PGET_SET_DEVICE_DATA SetBusData;
4523 PGET_SET_DEVICE_DATA GetBusData;
4524 UCHAR CapabilityID;
4525 } AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD;
4526
4527 _IRQL_requires_max_(PASSIVE_LEVEL)
4528 _Must_inspect_result_
4529 typedef NTSTATUS
4530 (NTAPI *PGET_LOCATION_STRING)(
4531 _Inout_opt_ PVOID Context,
4532 _Outptr_
4533 _At_(*LocationStrings,
4534 _When_(return == 0, __drv_allocatesMem(Mem)))
4535 PZZWSTR *LocationStrings);
4536
4537 typedef struct _PNP_LOCATION_INTERFACE {
4538 USHORT Size;
4539 USHORT Version;
4540 PVOID Context;
4541 PINTERFACE_REFERENCE InterfaceReference;
4542 PINTERFACE_DEREFERENCE InterfaceDereference;
4543 PGET_LOCATION_STRING GetLocationString;
4544 } PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE;
4545
4546 typedef enum _ARBITER_ACTION {
4547 ArbiterActionTestAllocation,
4548 ArbiterActionRetestAllocation,
4549 ArbiterActionCommitAllocation,
4550 ArbiterActionRollbackAllocation,
4551 ArbiterActionQueryAllocatedResources,
4552 ArbiterActionWriteReservedResources,
4553 ArbiterActionQueryConflict,
4554 ArbiterActionQueryArbitrate,
4555 ArbiterActionAddReserved,
4556 ArbiterActionBootAllocation
4557 } ARBITER_ACTION, *PARBITER_ACTION;
4558
4559 typedef struct _ARBITER_CONFLICT_INFO {
4560 PDEVICE_OBJECT OwningObject;
4561 ULONGLONG Start;
4562 ULONGLONG End;
4563 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
4564
4565 typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS {
4566 _Inout_ PLIST_ENTRY ArbitrationList;
4567 _In_ ULONG AllocateFromCount;
4568 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
4569 } ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS;
4570
4571 typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS {
4572 _Inout_ PLIST_ENTRY ArbitrationList;
4573 _In_ ULONG AllocateFromCount;
4574 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
4575 } ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS;
4576
4577 typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS {
4578 _Inout_ PLIST_ENTRY ArbitrationList;
4579 } ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS;
4580
4581 typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS {
4582 _Out_ PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
4583 } ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS;
4584
4585 typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS {
4586 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
4587 _In_ PIO_RESOURCE_DESCRIPTOR ConflictingResource;
4588 _Out_ PULONG ConflictCount;
4589 _Out_ PARBITER_CONFLICT_INFO *Conflicts;
4590 } ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS;
4591
4592 typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS {
4593 _In_ PLIST_ENTRY ArbitrationList;
4594 } ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS;
4595
4596 typedef struct _ARBITER_ADD_RESERVED_PARAMETERS {
4597 _In_ PDEVICE_OBJECT ReserveDevice;
4598 } ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS;
4599
4600 typedef struct _ARBITER_PARAMETERS {
4601 union {
4602 ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation;
4603 ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation;
4604 ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation;
4605 ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources;
4606 ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict;
4607 ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate;
4608 ARBITER_ADD_RESERVED_PARAMETERS AddReserved;
4609 } Parameters;
4610 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
4611
4612 typedef enum _ARBITER_REQUEST_SOURCE {
4613 ArbiterRequestUndefined = -1,
4614 ArbiterRequestLegacyReported,
4615 ArbiterRequestHalReported,
4616 ArbiterRequestLegacyAssigned,
4617 ArbiterRequestPnpDetected,
4618 ArbiterRequestPnpEnumerated
4619 } ARBITER_REQUEST_SOURCE;
4620
4621 typedef enum _ARBITER_RESULT {
4622 ArbiterResultUndefined = -1,
4623 ArbiterResultSuccess,
4624 ArbiterResultExternalConflict,
4625 ArbiterResultNullRequest
4626 } ARBITER_RESULT;
4627
4628 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
4629
4630 typedef struct _ARBITER_LIST_ENTRY {
4631 LIST_ENTRY ListEntry;
4632 ULONG AlternativeCount;
4633 PIO_RESOURCE_DESCRIPTOR Alternatives;
4634 PDEVICE_OBJECT PhysicalDeviceObject;
4635 ARBITER_REQUEST_SOURCE RequestSource;
4636 ULONG Flags;
4637 LONG_PTR WorkSpace;
4638 INTERFACE_TYPE InterfaceType;
4639 ULONG SlotNumber;
4640 ULONG BusNumber;
4641 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
4642 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
4643 ARBITER_RESULT Result;
4644 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
4645
4646 typedef NTSTATUS
4647 (NTAPI *PARBITER_HANDLER)(
4648 _Inout_opt_ PVOID Context,
4649 _In_ ARBITER_ACTION Action,
4650 _Inout_ PARBITER_PARAMETERS Parameters);
4651
4652 #define ARBITER_PARTIAL 0x00000001
4653
4654 typedef struct _ARBITER_INTERFACE {
4655 USHORT Size;
4656 USHORT Version;
4657 PVOID Context;
4658 PINTERFACE_REFERENCE InterfaceReference;
4659 PINTERFACE_DEREFERENCE InterfaceDereference;
4660 PARBITER_HANDLER ArbiterHandler;
4661 ULONG Flags;
4662 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
4663
4664 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
4665 TranslateChildToParent,
4666 TranslateParentToChild
4667 } RESOURCE_TRANSLATION_DIRECTION;
4668
4669 typedef NTSTATUS
4670 (NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
4671 _Inout_opt_ PVOID Context,
4672 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
4673 _In_ RESOURCE_TRANSLATION_DIRECTION Direction,
4674 _In_opt_ ULONG AlternativesCount,
4675 _In_reads_opt_(AlternativesCount) IO_RESOURCE_DESCRIPTOR Alternatives[],
4676 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
4677 _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
4678
4679 typedef NTSTATUS
4680 (NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
4681 _Inout_opt_ PVOID Context,
4682 _In_ PIO_RESOURCE_DESCRIPTOR Source,
4683 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
4684 _Out_ PULONG TargetCount,
4685 _Out_writes_(*TargetCount) PIO_RESOURCE_DESCRIPTOR *Target);
4686
4687 typedef struct _TRANSLATOR_INTERFACE {
4688 USHORT Size;
4689 USHORT Version;
4690 PVOID Context;
4691 PINTERFACE_REFERENCE InterfaceReference;
4692 PINTERFACE_DEREFERENCE InterfaceDereference;
4693 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
4694 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
4695 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
4696
4697 typedef struct _PCI_AGP_CAPABILITY {
4698 PCI_CAPABILITIES_HEADER Header;
4699 USHORT Minor:4;
4700 USHORT Major:4;
4701 USHORT Rsvd1:8;
4702 struct _PCI_AGP_STATUS {
4703 ULONG Rate:3;
4704 ULONG Agp3Mode:1;
4705 ULONG FastWrite:1;
4706 ULONG FourGB:1;
4707 ULONG HostTransDisable:1;
4708 ULONG Gart64:1;
4709 ULONG ITA_Coherent:1;
4710 ULONG SideBandAddressing:1;
4711 ULONG CalibrationCycle:3;
4712 ULONG AsyncRequestSize:3;
4713 ULONG Rsvd1:1;
4714 ULONG Isoch:1;
4715 ULONG Rsvd2:6;
4716 ULONG RequestQueueDepthMaximum:8;
4717 } AGPStatus;
4718 struct _PCI_AGP_COMMAND {
4719 ULONG Rate:3;
4720 ULONG Rsvd1:1;
4721 ULONG FastWriteEnable:1;
4722 ULONG FourGBEnable:1;
4723 ULONG Rsvd2:1;
4724 ULONG Gart64:1;
4725 ULONG AGPEnable:1;
4726 ULONG SBAEnable:1;
4727 ULONG CalibrationCycle:3;
4728 ULONG AsyncReqSize:3;
4729 ULONG Rsvd3:8;
4730 ULONG RequestQueueDepth:8;
4731 } AGPCommand;
4732 } PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY;
4733
4734 typedef enum _EXTENDED_AGP_REGISTER {
4735 IsochStatus,
4736 AgpControl,
4737 ApertureSize,
4738 AperturePageSize,
4739 GartLow,
4740 GartHigh,
4741 IsochCommand
4742 } EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER;
4743
4744 typedef struct _PCI_AGP_ISOCH_STATUS {
4745 ULONG ErrorCode:2;
4746 ULONG Rsvd1:1;
4747 ULONG Isoch_L:3;
4748 ULONG Isoch_Y:2;
4749 ULONG Isoch_N:8;
4750 ULONG Rsvd2:16;
4751 } PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS;
4752
4753 typedef struct _PCI_AGP_CONTROL {
4754 ULONG Rsvd1:7;
4755 ULONG GTLB_Enable:1;
4756 ULONG AP_Enable:1;
4757 ULONG CAL_Disable:1;
4758 ULONG Rsvd2:22;
4759 } PCI_AGP_CONTROL, *PPCI_AGP_CONTROL;
4760
4761 typedef struct _PCI_AGP_APERTURE_PAGE_SIZE {
4762 USHORT PageSizeMask:11;
4763 USHORT Rsvd1:1;
4764 USHORT PageSizeSelect:4;
4765 } PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE;
4766
4767 typedef struct _PCI_AGP_ISOCH_COMMAND {
4768 USHORT Rsvd1:6;
4769 USHORT Isoch_Y:2;
4770 USHORT Isoch_N:8;
4771 } PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND;
4772
4773 typedef struct PCI_AGP_EXTENDED_CAPABILITY {
4774 PCI_AGP_ISOCH_STATUS IsochStatus;
4775 PCI_AGP_CONTROL AgpControl;
4776 USHORT ApertureSize;
4777 PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize;
4778 ULONG GartLow;
4779 ULONG GartHigh;
4780 PCI_AGP_ISOCH_COMMAND IsochCommand;
4781 } PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY;
4782
4783 #define PCI_AGP_RATE_1X 0x1
4784 #define PCI_AGP_RATE_2X 0x2
4785 #define PCI_AGP_RATE_4X 0x4
4786
4787 #define PCIX_MODE_CONVENTIONAL_PCI 0x0
4788 #define PCIX_MODE1_66MHZ 0x1
4789 #define PCIX_MODE1_100MHZ 0x2
4790 #define PCIX_MODE1_133MHZ 0x3
4791 #define PCIX_MODE2_266_66MHZ 0x9
4792 #define PCIX_MODE2_266_100MHZ 0xA
4793 #define PCIX_MODE2_266_133MHZ 0xB
4794 #define PCIX_MODE2_533_66MHZ 0xD
4795 #define PCIX_MODE2_533_100MHZ 0xE
4796 #define PCIX_MODE2_533_133MHZ 0xF
4797
4798 #define PCIX_VERSION_MODE1_ONLY 0x0
4799 #define PCIX_VERSION_MODE2_ECC 0x1
4800 #define PCIX_VERSION_DUAL_MODE_ECC 0x2
4801
4802 typedef struct _PCIX_BRIDGE_CAPABILITY {
4803 PCI_CAPABILITIES_HEADER Header;
4804 union {
4805 _ANONYMOUS_STRUCT struct {
4806 USHORT Bus64Bit:1;
4807 USHORT Bus133MHzCapable:1;
4808 USHORT SplitCompletionDiscarded:1;
4809 USHORT UnexpectedSplitCompletion:1;
4810 USHORT SplitCompletionOverrun:1;
4811 USHORT SplitRequestDelayed:1;
4812 USHORT BusModeFrequency:4;
4813 USHORT Rsvd:2;
4814 USHORT Version:2;
4815 USHORT Bus266MHzCapable:1;
4816 USHORT Bus533MHzCapable:1;
4817 } DUMMYSTRUCTNAME;
4818 USHORT AsUSHORT;
4819 } SecondaryStatus;
4820 union {
4821 _ANONYMOUS_STRUCT struct {
4822 ULONG FunctionNumber:3;
4823 ULONG DeviceNumber:5;
4824 ULONG BusNumber:8;
4825 ULONG Device64Bit:1;
4826 ULONG Device133MHzCapable:1;
4827 ULONG SplitCompletionDiscarded:1;
4828 ULONG UnexpectedSplitCompletion:1;
4829 ULONG SplitCompletionOverrun:1;
4830 ULONG SplitRequestDelayed:1;
4831 ULONG Rsvd:7;
4832 ULONG DIMCapable:1;
4833 ULONG Device266MHzCapable:1;
4834 ULONG Device533MHzCapable:1;
4835 } DUMMYSTRUCTNAME;
4836 ULONG AsULONG;
4837 } BridgeStatus;
4838 USHORT UpstreamSplitTransactionCapacity;
4839 USHORT UpstreamSplitTransactionLimit;
4840 USHORT DownstreamSplitTransactionCapacity;
4841 USHORT DownstreamSplitTransactionLimit;
4842 union {
4843 _ANONYMOUS_STRUCT struct {
4844 ULONG SelectSecondaryRegisters:1;
4845 ULONG ErrorPresentInOtherBank:1;
4846 ULONG AdditionalCorrectableError:1;
4847 ULONG AdditionalUncorrectableError:1;
4848 ULONG ErrorPhase:3;
4849 ULONG ErrorCorrected:1;
4850 ULONG Syndrome:8;
4851 ULONG ErrorFirstCommand:4;
4852 ULONG ErrorSecondCommand:4;
4853 ULONG ErrorUpperAttributes:4;
4854 ULONG ControlUpdateEnable:1;
4855 ULONG Rsvd:1;
4856 ULONG DisableSingleBitCorrection:1;
4857 ULONG EccMode:1;
4858 } DUMMYSTRUCTNAME;
4859 ULONG AsULONG;
4860 } EccControlStatus;
4861 ULONG EccFirstAddress;
4862 ULONG EccSecondAddress;
4863 ULONG EccAttribute;
4864 } PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY;
4865
4866 typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY {
4867 PCI_CAPABILITIES_HEADER Header;
4868 USHORT Reserved;
4869 USHORT SubVendorID;
4870 USHORT SubSystemID;
4871 } PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY;
4872
4873 #define OSC_FIRMWARE_FAILURE 0x02
4874 #define OSC_UNRECOGNIZED_UUID 0x04
4875 #define OSC_UNRECOGNIZED_REVISION 0x08
4876 #define OSC_CAPABILITIES_MASKED 0x10
4877
4878 #define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION 0x01
4879
4880 typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
4881 union {
4882 _ANONYMOUS_STRUCT struct {
4883 ULONG ExtendedConfigOpRegions:1;
4884 ULONG ActiveStatePowerManagement:1;
4885 ULONG ClockPowerManagement:1;
4886 ULONG SegmentGroups:1;
4887 ULONG MessageSignaledInterrupts:1;
4888 ULONG WindowsHardwareErrorArchitecture:1;
4889 ULONG Reserved:26;
4890 } DUMMYSTRUCTNAME;
4891 ULONG AsULONG;
4892 } u;
4893 } PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD;
4894
4895 typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD {
4896 union {
4897 _ANONYMOUS_STRUCT struct {
4898 ULONG ExpressNativeHotPlug:1;
4899 ULONG ShpcNativeHotPlug:1;
4900 ULONG ExpressNativePME:1;
4901 ULONG ExpressAdvancedErrorReporting:1;
4902 ULONG ExpressCapabilityStructure:1;
4903 ULONG Reserved:27;
4904 } DUMMYSTRUCTNAME;
4905 ULONG AsULONG;
4906 } u;
4907 } PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD;
4908
4909 typedef enum _PCI_HARDWARE_INTERFACE {
4910 PciConventional,
4911 PciXMode1,
4912 PciXMode2,
4913 PciExpress
4914 } PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE;
4915
4916 typedef enum {
4917 BusWidth32Bits,
4918 BusWidth64Bits
4919 } PCI_BUS_WIDTH;
4920
4921 typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
4922 PCI_HARDWARE_INTERFACE SecondaryInterface;
4923 _ANONYMOUS_STRUCT struct {
4924 BOOLEAN BusCapabilitiesFound;
4925 ULONG CurrentSpeedAndMode;
4926 ULONG SupportedSpeedsAndModes;
4927 BOOLEAN DeviceIDMessagingCapable;
4928 PCI_BUS_WIDTH SecondaryBusWidth;
4929 } DUMMYSTRUCTNAME;
4930 PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport;
4931 PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest;
4932 PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted;
4933 } PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY;
4934
4935 typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
4936 _ANONYMOUS_STRUCT struct {
4937 USHORT CapabilityVersion:4;
4938 USHORT DeviceType:4;
4939 USHORT SlotImplemented:1;
4940 USHORT InterruptMessageNumber:5;
4941 USHORT Rsvd:2;
4942 } DUMMYSTRUCTNAME;
4943 USHORT AsUSHORT;
4944 } PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER;
4945
4946 typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
4947 _ANONYMOUS_STRUCT struct {
4948 ULONG MaxPayloadSizeSupported:3;
4949 ULONG PhantomFunctionsSupported:2;
4950 ULONG ExtendedTagSupported:1;
4951 ULONG L0sAcceptableLatency:3;
4952 ULONG L1AcceptableLatency:3;
4953 ULONG Undefined:3;
4954 ULONG RoleBasedErrorReporting:1;
4955 ULONG Rsvd1:2;
4956 ULONG CapturedSlotPowerLimit:8;
4957 ULONG CapturedSlotPowerLimitScale:2;
4958 ULONG Rsvd2:4;
4959 } DUMMYSTRUCTNAME;
4960 ULONG AsULONG;
4961 } PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER;
4962
4963 #define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07;
4964
4965 typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
4966 _ANONYMOUS_STRUCT struct {
4967 USHORT CorrectableErrorEnable:1;
4968 USHORT NonFatalErrorEnable:1;
4969 USHORT FatalErrorEnable:1;
4970 USHORT UnsupportedRequestErrorEnable:1;
4971 USHORT EnableRelaxedOrder:1;
4972 USHORT MaxPayloadSize:3;
4973 USHORT ExtendedTagEnable:1;
4974 USHORT PhantomFunctionsEnable:1;
4975 USHORT AuxPowerEnable:1;
4976 USHORT NoSnoopEnable:1;
4977 USHORT MaxReadRequestSize:3;
4978 USHORT BridgeConfigRetryEnable:1;
4979 } DUMMYSTRUCTNAME;
4980 USHORT AsUSHORT;
4981 } PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER;
4982
4983 #define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F;
4984
4985 typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
4986 _ANONYMOUS_STRUCT struct {
4987 USHORT CorrectableErrorDetected:1;
4988 USHORT NonFatalErrorDetected:1;
4989 USHORT FatalErrorDetected:1;
4990 USHORT UnsupportedRequestDetected:1;
4991 USHORT AuxPowerDetected:1;
4992 USHORT TransactionsPending:1;
4993 USHORT Rsvd:10;
4994 } DUMMYSTRUCTNAME;
4995 USHORT AsUSHORT;
4996 } PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER;
4997
4998 typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
4999 _ANONYMOUS_STRUCT struct {
5000 ULONG MaximumLinkSpeed:4;
5001 ULONG MaximumLinkWidth:6;
5002 ULONG ActiveStatePMSupport:2;
5003 ULONG L0sExitLatency:3;
5004 ULONG L1ExitLatency:3;
5005 ULONG ClockPowerManagement:1;
5006 ULONG SurpriseDownErrorReportingCapable:1;
5007 ULONG DataLinkLayerActiveReportingCapable:1;
5008 ULONG Rsvd:3;
5009 ULONG PortNumber:8;
5010 } DUMMYSTRUCTNAME;
5011 ULONG AsULONG;
5012 } PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER;
5013
5014 typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
5015 _ANONYMOUS_STRUCT struct {
5016 USHORT ActiveStatePMControl:2;
5017 USHORT Rsvd1:1;
5018 USHORT ReadCompletionBoundary:1;
5019 USHORT LinkDisable:1;
5020 USHORT RetrainLink:1;
5021 USHORT CommonClockConfig:1;
5022 USHORT ExtendedSynch:1;
5023 USHORT EnableClockPowerManagement:1;
5024 USHORT Rsvd2:7;
5025 } DUMMYSTRUCTNAME;
5026 USHORT AsUSHORT;
5027 } PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER;
5028
5029 typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
5030 _ANONYMOUS_STRUCT struct {
5031 USHORT LinkSpeed:4;
5032 USHORT LinkWidth:6;
5033 USHORT Undefined:1;
5034 USHORT LinkTraining:1;
5035 USHORT SlotClockConfig:1;
5036 USHORT DataLinkLayerActive:1;
5037 USHORT Rsvd:2;
5038 } DUMMYSTRUCTNAME;
5039 USHORT AsUSHORT;
5040 } PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER;
5041
5042 typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
5043 _ANONYMOUS_STRUCT struct {
5044 ULONG AttentionButtonPresent:1;
5045 ULONG PowerControllerPresent:1;
5046 ULONG MRLSensorPresent:1;
5047 ULONG AttentionIndicatorPresent:1;
5048 ULONG PowerIndicatorPresent:1;
5049 ULONG HotPlugSurprise:1;
5050 ULONG HotPlugCapable:1;
5051 ULONG SlotPowerLimit:8;
5052 ULONG SlotPowerLimitScale:2;
5053 ULONG ElectromechanicalLockPresent:1;
5054 ULONG NoCommandCompletedSupport:1;
5055 ULONG PhysicalSlotNumber:13;
5056 } DUMMYSTRUCTNAME;
5057 ULONG AsULONG;
5058 } PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER;
5059
5060 typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
5061 _ANONYMOUS_STRUCT struct {
5062 USHORT AttentionButtonEnable:1;
5063 USHORT PowerFaultDetectEnable:1;
5064 USHORT MRLSensorEnable:1;
5065 USHORT PresenceDetectEnable:1;
5066 USHORT CommandCompletedEnable:1;
5067 USHORT HotPlugInterruptEnable:1;
5068 USHORT AttentionIndicatorControl:2;
5069 USHORT PowerIndicatorControl:2;
5070 USHORT PowerControllerControl:1;
5071 USHORT ElectromechanicalLockControl:1;
5072 USHORT DataLinkStateChangeEnable:1;
5073 USHORT Rsvd:3;
5074 } DUMMYSTRUCTNAME;
5075 USHORT AsUSHORT;
5076 } PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER;
5077
5078 typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER {
5079 _ANONYMOUS_STRUCT struct {
5080 USHORT AttentionButtonPressed:1;
5081 USHORT PowerFaultDetected:1;
5082 USHORT MRLSensorChanged:1;
5083 USHORT PresenceDetectChanged:1;
5084 USHORT CommandCompleted:1;
5085 USHORT MRLSensorState:1;
5086 USHORT PresenceDetectState:1;
5087 USHORT ElectromechanicalLockEngaged:1;
5088 USHORT DataLinkStateChanged:1;
5089 USHORT Rsvd:7;
5090 } DUMMYSTRUCTNAME;
5091 USHORT AsUSHORT;
5092 } PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER;
5093
5094 typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER {
5095 _ANONYMOUS_STRUCT struct {
5096 USHORT CorrectableSerrEnable:1;
5097 USHORT NonFatalSerrEnable:1;
5098 USHORT FatalSerrEnable:1;
5099 USHORT PMEInterruptEnable:1;
5100 USHORT CRSSoftwareVisibilityEnable:1;
5101 USHORT Rsvd:11;
5102 } DUMMYSTRUCTNAME;
5103 USHORT AsUSHORT;
5104 } PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER;
5105
5106 typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER {
5107 _ANONYMOUS_STRUCT struct {
5108 USHORT CRSSoftwareVisibility:1;
5109 USHORT Rsvd:15;
5110 } DUMMYSTRUCTNAME;
5111 USHORT AsUSHORT;
5112 } PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER;
5113
5114 typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER {
5115 _ANONYMOUS_STRUCT struct {
5116 ULONG PMERequestorId:16;
5117 ULONG PMEStatus:1;
5118 ULONG PMEPending:1;
5119 ULONG Rsvd:14;
5120 } DUMMYSTRUCTNAME;
5121 ULONG AsULONG;
5122 } PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER;
5123
5124 typedef struct _PCI_EXPRESS_CAPABILITY {
5125 PCI_CAPABILITIES_HEADER Header;
5126 PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities;
5127 PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities;
5128 PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl;
5129 PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus;
5130 PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities;
5131 PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl;
5132 PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus;
5133 PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities;
5134 PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl;
5135 PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus;
5136 PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl;
5137 PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities;
5138 PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus;
5139 } PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY;
5140
5141 typedef enum {
5142 MRLClosed = 0,
5143 MRLOpen
5144 } PCI_EXPRESS_MRL_STATE;
5145
5146 typedef enum {
5147 SlotEmpty = 0,
5148 CardPresent
5149 } PCI_EXPRESS_CARD_PRESENCE;
5150
5151 typedef enum {
5152 IndicatorOn = 1,
5153 IndicatorBlink,
5154 IndicatorOff
5155 } PCI_EXPRESS_INDICATOR_STATE;
5156
5157 typedef enum {
5158 PowerOn = 0,
5159 PowerOff
5160 } PCI_EXPRESS_POWER_STATE;
5161
5162 typedef enum {
5163 L0sEntrySupport = 1,
5164 L0sAndL1EntrySupport = 3
5165 } PCI_EXPRESS_ASPM_SUPPORT;
5166
5167 typedef enum {
5168 L0sAndL1EntryDisabled,
5169 L0sEntryEnabled,
5170 L1EntryEnabled,
5171 L0sAndL1EntryEnabled
5172 } PCI_EXPRESS_ASPM_CONTROL;
5173
5174 typedef enum {
5175 L0s_Below64ns = 0,
5176 L0s_64ns_128ns,
5177 L0s_128ns_256ns,
5178 L0s_256ns_512ns,
5179 L0s_512ns_1us,
5180 L0s_1us_2us,
5181 L0s_2us_4us,
5182 L0s_Above4us
5183 } PCI_EXPRESS_L0s_EXIT_LATENCY;
5184
5185 typedef enum {
5186 L1_Below1us = 0,
5187 L1_1us_2us,
5188 L1_2us_4us,
5189 L1_4us_8us,
5190 L1_8us_16us,
5191 L1_16us_32us,
5192 L1_32us_64us,
5193 L1_Above64us
5194 } PCI_EXPRESS_L1_EXIT_LATENCY;
5195
5196 typedef enum {
5197 PciExpressEndpoint = 0,
5198 PciExpressLegacyEndpoint,
5199 PciExpressRootPort = 4,
5200 PciExpressUpstreamSwitchPort,
5201 PciExpressDownstreamSwitchPort,
5202 PciExpressToPciXBridge,
5203 PciXToExpressBridge,
5204 PciExpressRootComplexIntegratedEndpoint,
5205 PciExpressRootComplexEventCollector
5206 } PCI_EXPRESS_DEVICE_TYPE;
5207
5208 typedef enum {
5209 MaxPayload128Bytes = 0,
5210 MaxPayload256Bytes,
5211 MaxPayload512Bytes,
5212 MaxPayload1024Bytes,
5213 MaxPayload2048Bytes,
5214 MaxPayload4096Bytes
5215 } PCI_EXPRESS_MAX_PAYLOAD_SIZE;
5216
5217 typedef union _PCI_EXPRESS_PME_REQUESTOR_ID {
5218 _ANONYMOUS_STRUCT struct {
5219 USHORT FunctionNumber:3;
5220 USHORT DeviceNumber:5;
5221 USHORT BusNumber:8;
5222 } DUMMYSTRUCTNAME;
5223 USHORT AsUSHORT;
5224 } PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID;
5225
5226 typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE {
5227 ResourceTypeSingle = 0,
5228 ResourceTypeRange,
5229 ResourceTypeExtendedCounterConfiguration,
5230 ResourceTypeOverflow,
5231 ResourceTypeMax
5232 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE;
5233
5234 typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR {
5235 PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type;
5236 ULONG Flags;
5237 union {
5238 ULONG CounterIndex;
5239 ULONG ExtendedRegisterAddress;
5240 struct {
5241 ULONG Begin;
5242 ULONG End;
5243 } Range;
5244 } u;
5245 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR;
5246
5247 typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST {
5248 ULONG Count;
5249 PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY];
5250 } PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST;
5251
5252 typedef VOID
5253 (NTAPI *PciPin2Line)(
5254 _In_ struct _BUS_HANDLER *BusHandler,
5255 _In_ struct _BUS_HANDLER *RootHandler,
5256 _In_ PCI_SLOT_NUMBER SlotNumber,
5257 _In_ PPCI_COMMON_CONFIG PciData);
5258
5259 typedef VOID
5260 (NTAPI *PciLine2Pin)(
5261 _In_ struct _BUS_HANDLER *BusHandler,
5262 _In_ struct _BUS_HANDLER *RootHandler,
5263 _In_ PCI_SLOT_NUMBER SlotNumber,
5264 _In_ PPCI_COMMON_CONFIG PciNewData,
5265 _In_ PPCI_COMMON_CONFIG PciOldData);
5266
5267 typedef VOID
5268 (NTAPI *PciReadWriteConfig)(
5269 _In_ struct _BUS_HANDLER *BusHandler,
5270 _In_ PCI_SLOT_NUMBER Slot,
5271 _In_reads_bytes_(Length) PVOID Buffer,
5272 _In_ ULONG Offset,
5273 _In_ ULONG Length);
5274
5275 #define PCI_DATA_TAG ' ICP'
5276 #define PCI_DATA_VERSION 1
5277
5278 typedef struct _PCIBUSDATA {
5279 ULONG Tag;
5280 ULONG Version;
5281 PciReadWriteConfig ReadConfig;
5282 PciReadWriteConfig WriteConfig;
5283 PciPin2Line Pin2Line;
5284 PciLine2Pin Line2Pin;
5285 PCI_SLOT_NUMBER ParentSlot;
5286 PVOID Reserved[4];
5287 } PCIBUSDATA, *PPCIBUSDATA;
5288
5289 #ifndef _PCIINTRF_X_
5290 #define _PCIINTRF_X_
5291
5292 typedef ULONG
5293 (NTAPI *PCI_READ_WRITE_CONFIG)(
5294 _In_ PVOID Context,
5295 _In_ ULONG BusOffset,
5296 _In_ ULONG Slot,
5297 _In_reads_bytes_(Length) PVOID Buffer,
5298 _In_ ULONG Offset,
5299 _In_ ULONG Length);
5300
5301 typedef VOID
5302 (NTAPI *PCI_PIN_TO_LINE)(
5303 _In_ PVOID Context,
5304 _In_ PPCI_COMMON_CONFIG PciData);
5305
5306 typedef VOID
5307 (NTAPI *PCI_LINE_TO_PIN)(
5308 _In_ PVOID Context,
5309 _In_ PPCI_COMMON_CONFIG PciNewData,
5310 _In_ PPCI_COMMON_CONFIG PciOldData);
5311
5312 typedef VOID
5313 (NTAPI *PCI_ROOT_BUS_CAPABILITY)(
5314 _In_ PVOID Context,
5315 _Out_ PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability);
5316
5317 typedef VOID
5318 (NTAPI *PCI_EXPRESS_WAKE_CONTROL)(
5319 _In_ PVOID Context,
5320 _In_ BOOLEAN EnableWake);
5321
5322 typedef struct _PCI_BUS_INTERFACE_STANDARD {
5323 USHORT Size;
5324 USHORT Version;
5325 PVOID Context;
5326 PINTERFACE_REFERENCE InterfaceReference;
5327 PINTERFACE_DEREFERENCE InterfaceDereference;
5328 PCI_READ_WRITE_CONFIG ReadConfig;
5329 PCI_READ_WRITE_CONFIG WriteConfig;
5330 PCI_PIN_TO_LINE PinToLine;
5331 PCI_LINE_TO_PIN LineToPin;
5332 PCI_ROOT_BUS_CAPABILITY RootBusCapability;
5333 PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl;
5334 } PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD;
5335
5336 #define PCI_BUS_INTERFACE_STANDARD_VERSION 1
5337
5338 #endif /* _PCIINTRF_X_ */
5339
5340 #if (NTDDI_VERSION >= NTDDI_WIN7)
5341
5342 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX 0x00004000
5343 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX 0x00008000
5344 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \
5345 (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \
5346 FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX)
5347
5348 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200
5349 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300
5350 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300
5351
5352 #else
5353
5354 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200
5355 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300
5356 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300
5357
5358 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL
5359 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL
5360 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK
5361
5362 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5363
5364 #define FILE_CHARACTERISTICS_PROPAGATED (FILE_REMOVABLE_MEDIA | \
5365 FILE_READ_ONLY_DEVICE | \
5366 FILE_FLOPPY_DISKETTE | \
5367 FILE_WRITE_ONCE_MEDIA | \
5368 FILE_DEVICE_SECURE_OPEN)
5369
5370 typedef struct _FILE_ALIGNMENT_INFORMATION {
5371 ULONG AlignmentRequirement;
5372 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
5373
5374 typedef struct _FILE_NAME_INFORMATION {
5375 ULONG FileNameLength;
5376 WCHAR FileName[1];
5377 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
5378
5379
5380 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
5381 ULONG FileAttributes;
5382 ULONG ReparseTag;
5383 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
5384
5385 typedef struct _FILE_DISPOSITION_INFORMATION {
5386 BOOLEAN DeleteFile;
5387 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
5388
5389 typedef struct _FILE_END_OF_FILE_INFORMATION {
5390 LARGE_INTEGER EndOfFile;
5391 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
5392
5393 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
5394 LARGE_INTEGER ValidDataLength;
5395 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
5396
5397 typedef struct _FILE_FS_LABEL_INFORMATION {
5398 ULONG VolumeLabelLength;
5399 WCHAR VolumeLabel[1];
5400 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
5401
5402 typedef struct _FILE_FS_VOLUME_INFORMATION {
5403 LARGE_INTEGER VolumeCreationTime;
5404 ULONG VolumeSerialNumber;
5405 ULONG VolumeLabelLength;
5406 BOOLEAN SupportsObjects;
5407 WCHAR VolumeLabel[1];
5408 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
5409
5410 typedef struct _FILE_FS_SIZE_INFORMATION {
5411 LARGE_INTEGER TotalAllocationUnits;
5412 LARGE_INTEGER AvailableAllocationUnits;
5413 ULONG SectorsPerAllocationUnit;
5414 ULONG BytesPerSector;
5415 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
5416
5417 typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
5418 LARGE_INTEGER TotalAllocationUnits;
5419 LARGE_INTEGER CallerAvailableAllocationUnits;
5420 LARGE_INTEGER ActualAvailableAllocationUnits;
5421 ULONG SectorsPerAllocationUnit;
5422 ULONG BytesPerSector;
5423 } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
5424
5425 typedef struct _FILE_FS_OBJECTID_INFORMATION {
5426 UCHAR ObjectId[16];
5427 UCHAR ExtendedInfo[48];
5428 } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
5429
5430 typedef union _FILE_SEGMENT_ELEMENT {
5431 PVOID64 Buffer;
5432 ULONGLONG Alignment;
5433 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
5434
5435 #define IOCTL_AVIO_ALLOCATE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5436 #define IOCTL_AVIO_FREE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5437 #define IOCTL_AVIO_MODIFY_STREAM CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5438
5439 typedef enum _BUS_DATA_TYPE {
5440 ConfigurationSpaceUndefined = -1,
5441 Cmos,
5442 EisaConfiguration,
5443 Pos,
5444 CbusConfiguration,
5445 PCIConfiguration,
5446 VMEConfiguration,
5447 NuBusConfiguration,
5448 PCMCIAConfiguration,
5449 MPIConfiguration,
5450 MPSAConfiguration,
5451 PNPISAConfiguration,
5452 SgiInternalConfiguration,
5453 MaximumBusDataType
5454 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
5455
5456 /* Some Server 2003 DDK definitions */
5457 #define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
5458
5459 typedef NTSTATUS
5460 (NTAPI *PLEGACY_DEVICE_DETECTION_HANDLER)(
5461 IN PVOID Context,
5462 IN INTERFACE_TYPE LegacyBusType,
5463 IN ULONG BusNumber,
5464 IN ULONG SlotNumber,
5465 OUT PDEVICE_OBJECT *PhysicalDeviceObject);
5466
5467 typedef struct _ROUTING_TOKEN {
5468 PVOID LinkNode;
5469 ULONG StaticVector;
5470 UCHAR Flags;
5471 } ROUTING_TOKEN, *PROUTING_TOKEN;
5472
5473 typedef NTSTATUS
5474 (NTAPI *PGET_INTERRUPT_ROUTING)(
5475 IN PDEVICE_OBJECT Pdo,
5476 OUT ULONG *Bus,
5477 OUT ULONG *PciSlot,
5478 OUT UCHAR *InterruptLine,
5479 OUT UCHAR *InterruptPin,
5480 OUT UCHAR *ClassCode,
5481 OUT UCHAR *SubClassCode,
5482 OUT PDEVICE_OBJECT *ParentPdo,
5483 OUT ROUTING_TOKEN *RoutingToken,
5484 OUT UCHAR *Flags);
5485
5486 typedef NTSTATUS
5487 (NTAPI *PSET_INTERRUPT_ROUTING_TOKEN)(
5488 IN PDEVICE_OBJECT Pdo,
5489 IN PROUTING_TOKEN RoutingToken);
5490
5491 typedef VOID
5492 (NTAPI *PUPDATE_INTERRUPT_LINE)(
5493 IN PDEVICE_OBJECT Pdo,
5494 IN UCHAR LineRegister);
5495
5496 typedef struct _INT_ROUTE_INTERFACE_STANDARD {
5497 USHORT Size;
5498 USHORT Version;
5499 PVOID Context;
5500 PINTERFACE_REFERENCE InterfaceReference;
5501 PINTERFACE_DEREFERENCE InterfaceDereference;
5502 PGET_INTERRUPT_ROUTING GetInterruptRouting;
5503 PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
5504 PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
5505 } INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
5506
5507 typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
5508 USHORT Size;
5509 USHORT Version;
5510 PVOID Context;
5511 PINTERFACE_REFERENCE InterfaceReference;
5512 PINTERFACE_DEREFERENCE InterfaceDereference;
5513 PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
5514 } LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
5515
5516 /* FIXME : These definitions don't exist in public headers */
5517
5518 #define PCI_CB_INTRF_VERSION 1
5519 #define PCI_PME_INTRF_STANDARD_VER 1
5520 #define PNP_LOCATION_INTERFACE_VERSION 1
5521
5522 DEFINE_GUID(GUID_PCI_CARDBUS_INTERFACE_PRIVATE, 0xcca82f31, 0x54d6, 0x11d1, 0x82, 0x24, 0x00, 0xa0, 0xc9, 0x32, 0x43, 0x85);
5523 DEFINE_GUID(GUID_PCI_PME_INTERFACE, 0xaac7e6ac, 0xbb0b, 0x11d2, 0xb4, 0x84, 0x00, 0xc0, 0x4f, 0x72, 0xde, 0x8b);
5524
5525 typedef NTSTATUS
5526 (NTAPI *PCARDBUSADD)(
5527 IN PDEVICE_OBJECT DeviceObject,
5528 IN OUT PVOID *DeviceContext);
5529
5530 typedef NTSTATUS
5531 (NTAPI *PCARDBUSDELETE)(
5532 IN PVOID DeviceContext);
5533
5534 typedef NTSTATUS
5535 (NTAPI *PCARDBUSPCIDISPATCH)(
5536 IN PVOID DeviceContext,
5537 IN PIRP Irp);
5538
5539 typedef VOID
5540 (NTAPI *PPME_SET_PME_ENABLE)(
5541 IN PDEVICE_OBJECT Pdo,
5542 IN BOOLEAN PmeEnable);
5543
5544 typedef VOID
5545 (NTAPI *PPME_CLEAR_PME_STATUS)(
5546 IN PDEVICE_OBJECT Pdo);
5547
5548 typedef VOID
5549 (NTAPI *PPME_GET_INFORMATION)(
5550 IN PDEVICE_OBJECT Pdo,
5551 OUT PBOOLEAN PmeCapable,
5552 OUT PBOOLEAN PmeStatus,
5553 OUT PBOOLEAN PmeEnable);
5554
5555 typedef struct _PCI_CARDBUS_INTERFACE_PRIVATE {
5556 USHORT Size;
5557 USHORT Version;
5558 PVOID Context;
5559 PINTERFACE_REFERENCE InterfaceReference;
5560 PINTERFACE_DEREFERENCE InterfaceDereference;
5561 PDRIVER_OBJECT DriverObject;
5562 PCARDBUSADD AddCardBus;
5563 PCARDBUSDELETE DeleteCardBus;
5564 PCARDBUSPCIDISPATCH DispatchPnp;
5565 } PCI_CARDBUS_INTERFACE_PRIVATE, *PPCI_CARDBUS_INTERFACE_PRIVATE;
5566
5567 typedef struct _PCI_PME_INTERFACE {
5568 USHORT Size;
5569 USHORT Version;
5570 PVOID Context;
5571 PINTERFACE_REFERENCE InterfaceReference;
5572 PINTERFACE_DEREFERENCE InterfaceDereference;
5573 PPME_GET_INFORMATION GetPmeInformation;
5574 PPME_CLEAR_PME_STATUS ClearPmeStatus;
5575 PPME_SET_PME_ENABLE UpdateEnable;
5576 } PCI_PME_INTERFACE, *PPCI_PME_INTERFACE;
5577
5578 $endif (_NTDDK_)
5579 $if (_NTIFS_)
5580
5581 #define FILE_OPLOCK_BROKEN_TO_LEVEL_2 0x00000007
5582 #define FILE_OPLOCK_BROKEN_TO_NONE 0x00000008
5583 #define FILE_OPBATCH_BREAK_UNDERWAY 0x00000009
5584
5585 /* also in winnt.h */
5586 #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
5587 #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
5588 #define FILE_NOTIFY_CHANGE_NAME 0x00000003
5589 #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
5590 #define FILE_NOTIFY_CHANGE_SIZE 0x00000008
5591 #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
5592 #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
5593 #define FILE_NOTIFY_CHANGE_CREATION 0x00000040
5594 #define FILE_NOTIFY_CHANGE_EA 0x00000080
5595 #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
5596 #define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
5597 #define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
5598 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
5599 #define FILE_NOTIFY_VALID_MASK 0x00000fff
5600
5601 #define FILE_ACTION_ADDED 0x00000001
5602 #define FILE_ACTION_REMOVED 0x00000002
5603 #define FILE_ACTION_MODIFIED 0x00000003
5604 #define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
5605 #define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
5606 #define FILE_ACTION_ADDED_STREAM 0x00000006
5607 #define FILE_ACTION_REMOVED_STREAM 0x00000007
5608 #define FILE_ACTION_MODIFIED_STREAM 0x00000008
5609 #define FILE_ACTION_REMOVED_BY_DELETE 0x00000009
5610 #define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A
5611 #define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B
5612 /* end winnt.h */
5613
5614 #define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
5615 #define FILE_PIPE_MESSAGE_TYPE 0x00000001
5616
5617 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
5618 #define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
5619
5620 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
5621 #define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
5622 #define FILE_PIPE_TYPE_VALID_MASK 0x00000003
5623
5624 #define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
5625 #define FILE_PIPE_MESSAGE_MODE 0x00000001
5626
5627 #define FILE_PIPE_QUEUE_OPERATION 0x00000000
5628 #define FILE_PIPE_COMPLETE_OPERATION 0x00000001
5629
5630 #define FILE_PIPE_INBOUND 0x00000000
5631 #define FILE_PIPE_OUTBOUND 0x00000001
5632 #define FILE_PIPE_FULL_DUPLEX 0x00000002
5633
5634 #define FILE_PIPE_DISCONNECTED_STATE 0x00000001
5635 #define FILE_PIPE_LISTENING_STATE 0x00000002
5636 #define FILE_PIPE_CONNECTED_STATE 0x00000003
5637 #define FILE_PIPE_CLOSING_STATE 0x00000004
5638
5639 #define FILE_PIPE_CLIENT_END 0x00000000
5640 #define FILE_PIPE_SERVER_END 0x00000001
5641
5642 #define FILE_CASE_SENSITIVE_SEARCH 0x00000001
5643 #define FILE_CASE_PRESERVED_NAMES 0x00000002
5644 #define FILE_UNICODE_ON_DISK 0x00000004
5645 #define FILE_PERSISTENT_ACLS 0x00000008
5646 #define FILE_FILE_COMPRESSION 0x00000010
5647 #define FILE_VOLUME_QUOTAS 0x00000020
5648 #define FILE_SUPPORTS_SPARSE_FILES 0x00000040
5649 #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
5650 #define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
5651 #define FILE_VOLUME_IS_COMPRESSED 0x00008000
5652 #define FILE_SUPPORTS_OBJECT_IDS 0x00010000
5653 #define FILE_SUPPORTS_ENCRYPTION 0x00020000
5654 #define FILE_NAMED_STREAMS 0x00040000
5655 #define FILE_READ_ONLY_VOLUME 0x00080000
5656 #define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
5657 #define FILE_SUPPORTS_TRANSACTIONS 0x00200000
5658 #define FILE_SUPPORTS_HARD_LINKS 0x00400000
5659 #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
5660 #define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
5661 #define FILE_SUPPORTS_USN_JOURNAL 0x02000000
5662 #define FILE_SUPPORTS_INTEGRITY_STREAMS 0x04000000
5663 #define FILE_SUPPORTS_BLOCK_REFCOUNTING 0x08000000
5664 #define FILE_SUPPORTS_SPARSE_VDL 0x10000000
5665 #define FILE_DAX_VOLUME 0x20000000
5666
5667 #define FILE_NEED_EA 0x00000080
5668
5669 #define FILE_EA_TYPE_BINARY 0xfffe
5670 #define FILE_EA_TYPE_ASCII 0xfffd
5671 #define FILE_EA_TYPE_BITMAP 0xfffb
5672 #define FILE_EA_TYPE_METAFILE 0xfffa
5673 #define FILE_EA_TYPE_ICON 0xfff9
5674 #define FILE_EA_TYPE_EA 0xffee
5675 #define FILE_EA_TYPE_MVMT 0xffdf
5676 #define FILE_EA_TYPE_MVST 0xffde
5677 #define FILE_EA_TYPE_ASN1 0xffdd
5678 #define FILE_EA_TYPE_FAMILY_IDS 0xff01
5679
5680 typedef struct _FILE_NOTIFY_INFORMATION {
5681 ULONG NextEntryOffset;
5682 ULONG Action;
5683 ULONG FileNameLength;
5684 WCHAR FileName[1];
5685 } FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
5686
5687 typedef struct _FILE_DIRECTORY_INFORMATION {
5688 ULONG NextEntryOffset;
5689 ULONG FileIndex;
5690 LARGE_INTEGER CreationTime;
5691 LARGE_INTEGER LastAccessTime;
5692 LARGE_INTEGER LastWriteTime;
5693 LARGE_INTEGER ChangeTime;
5694 LARGE_INTEGER EndOfFile;
5695 LARGE_INTEGER AllocationSize;
5696 ULONG FileAttributes;
5697 ULONG FileNameLength;
5698 WCHAR FileName[1];
5699 } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
5700
5701 typedef struct _FILE_FULL_DIR_INFORMATION {
5702 ULONG NextEntryOffset;
5703 ULONG FileIndex;
5704 LARGE_INTEGER CreationTime;
5705 LARGE_INTEGER LastAccessTime;
5706 LARGE_INTEGER LastWriteTime;
5707 LARGE_INTEGER ChangeTime;
5708 LARGE_INTEGER EndOfFile;
5709 LARGE_INTEGER AllocationSize;
5710 ULONG FileAttributes;
5711 ULONG FileNameLength;
5712 ULONG EaSize;
5713 WCHAR FileName[1];
5714 } FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
5715
5716 typedef struct _FILE_ID_FULL_DIR_INFORMATION {
5717 ULONG NextEntryOffset;
5718 ULONG FileIndex;
5719 LARGE_INTEGER CreationTime;
5720 LARGE_INTEGER LastAccessTime;
5721 LARGE_INTEGER LastWriteTime;
5722 LARGE_INTEGER ChangeTime;
5723 LARGE_INTEGER EndOfFile;
5724 LARGE_INTEGER AllocationSize;
5725 ULONG FileAttributes;
5726 ULONG FileNameLength;
5727 ULONG EaSize;
5728 LARGE_INTEGER FileId;
5729 WCHAR FileName[1];
5730 } FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
5731
5732 typedef struct _FILE_BOTH_DIR_INFORMATION {
5733 ULONG NextEntryOffset;
5734 ULONG FileIndex;
5735 LARGE_INTEGER CreationTime;
5736 LARGE_INTEGER LastAccessTime;
5737 LARGE_INTEGER LastWriteTime;
5738 LARGE_INTEGER ChangeTime;
5739 LARGE_INTEGER EndOfFile;
5740 LARGE_INTEGER AllocationSize;
5741 ULONG FileAttributes;
5742 ULONG FileNameLength;
5743 ULONG EaSize;
5744 CCHAR ShortNameLength;
5745 WCHAR ShortName[12];
5746 WCHAR FileName[1];
5747 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
5748
5749 typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
5750 ULONG NextEntryOffset;
5751 ULONG FileIndex;
5752 LARGE_INTEGER CreationTime;
5753 LARGE_INTEGER LastAccessTime;
5754 LARGE_INTEGER LastWriteTime;
5755 LARGE_INTEGER ChangeTime;
5756 LARGE_INTEGER EndOfFile;
5757 LARGE_INTEGER AllocationSize;
5758 ULONG FileAttributes;
5759 ULONG FileNameLength;
5760 ULONG EaSize;
5761 CCHAR ShortNameLength;
5762 WCHAR ShortName[12];
5763 LARGE_INTEGER FileId;
5764 WCHAR FileName[1];
5765 } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
5766
5767 typedef struct _FILE_NAMES_INFORMATION {
5768 ULONG NextEntryOffset;
5769 ULONG FileIndex;
5770 ULONG FileNameLength;
5771 WCHAR FileName[1];
5772 } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
5773
5774 typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION {
5775 ULONG NextEntryOffset;
5776 ULONG FileIndex;
5777 LARGE_INTEGER CreationTime;
5778 LARGE_INTEGER LastAccessTime;
5779 LARGE_INTEGER LastWriteTime;
5780 LARGE_INTEGER ChangeTime;
5781 LARGE_INTEGER EndOfFile;
5782 LARGE_INTEGER AllocationSize;
5783 ULONG FileAttributes;
5784 ULONG FileNameLength;
5785 LARGE_INTEGER FileId;
5786 GUID LockingTransactionId;
5787 ULONG TxInfoFlags;
5788 WCHAR FileName[1];
5789 } FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
5790
5791 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED 0x00000001
5792 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX 0x00000002
5793 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX 0x00000004
5794
5795 typedef struct _FILE_OBJECTID_INFORMATION {
5796 LONGLONG FileReference;
5797 UCHAR ObjectId[16];
5798 _ANONYMOUS_UNION union {
5799 _ANONYMOUS_STRUCT struct {
5800 UCHAR BirthVolumeId[16];
5801 UCHAR BirthObjectId[16];
5802 UCHAR DomainId[16];
5803 } DUMMYSTRUCTNAME;
5804 UCHAR ExtendedInfo[48];
5805 } DUMMYUNIONNAME;
5806 } FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
5807
5808 #define ANSI_DOS_STAR ('<')
5809 #define ANSI_DOS_QM ('>')
5810 #define ANSI_DOS_DOT ('"')
5811
5812 #define DOS_STAR (L'<')
5813 #define DOS_QM (L'>')
5814 #define DOS_DOT (L'"')
5815
5816 typedef struct _FILE_INTERNAL_INFORMATION {
5817 LARGE_INTEGER IndexNumber;
5818 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
5819
5820 typedef struct _FILE_EA_INFORMATION {
5821 ULONG EaSize;
5822 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
5823
5824 typedef struct _FILE_ACCESS_INFORMATION {
5825 ACCESS_MASK AccessFlags;
5826 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
5827
5828 typedef struct _FILE_MODE_INFORMATION {
5829 ULONG Mode;
5830 } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
5831
5832 typedef struct _FILE_ALL_INFORMATION {
5833 FILE_BASIC_INFORMATION BasicInformation;
5834 FILE_STANDARD_INFORMATION StandardInformation;
5835 FILE_INTERNAL_INFORMATION InternalInformation;
5836 FILE_EA_INFORMATION EaInformation;
5837 FILE_ACCESS_INFORMATION AccessInformation;
5838 FILE_POSITION_INFORMATION PositionInformation;
5839 FILE_MODE_INFORMATION ModeInformation;
5840 FILE_ALIGNMENT_INFORMATION AlignmentInformation;
5841 FILE_NAME_INFORMATION NameInformation;
5842 } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
5843
5844 typedef struct _FILE_ALLOCATION_INFORMATION {
5845 LARGE_INTEGER AllocationSize;
5846 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
5847
5848 typedef struct _FILE_COMPRESSION_INFORMATION {
5849 LARGE_INTEGER CompressedFileSize;
5850 USHORT CompressionFormat;
5851 UCHAR CompressionUnitShift;
5852 UCHAR ChunkShift;
5853 UCHAR ClusterShift;
5854 UCHAR Reserved[3];
5855 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
5856
5857 typedef struct _FILE_LINK_INFORMATION {
5858 BOOLEAN ReplaceIfExists;
5859 HANDLE RootDirectory;
5860 ULONG FileNameLength;
5861 WCHAR FileName[1];
5862 } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
5863
5864 typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
5865 ULONG ClusterCount;
5866 HANDLE RootDirectory;
5867 ULONG FileNameLength;
5868 WCHAR FileName[1];
5869 } FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
5870
5871 typedef struct _FILE_RENAME_INFORMATION {
5872 BOOLEAN ReplaceIfExists;
5873 HANDLE RootDirectory;
5874 ULONG FileNameLength;
5875 WCHAR FileName[1];
5876 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
5877
5878 typedef struct _FILE_STREAM_INFORMATION {
5879 ULONG NextEntryOffset;
5880 ULONG StreamNameLength;
5881 LARGE_INTEGER StreamSize;
5882 LARGE_INTEGER StreamAllocationSize;
5883 WCHAR StreamName[1];
5884 } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
5885
5886 typedef struct _FILE_TRACKING_INFORMATION {
5887 HANDLE DestinationFile;
5888 ULONG ObjectInformationLength;
5889 CHAR ObjectInformation[1];
5890 } FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
5891
5892 typedef struct _FILE_COMPLETION_INFORMATION {
5893 HANDLE Port;
5894 PVOID Key;
5895 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
5896
5897 typedef struct _FILE_PIPE_INFORMATION {
5898 ULONG ReadMode;
5899 ULONG CompletionMode;
5900 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
5901
5902 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
5903 ULONG NamedPipeType;
5904 ULONG NamedPipeConfiguration;
5905 ULONG MaximumInstances;
5906 ULONG CurrentInstances;
5907 ULONG InboundQuota;
5908 ULONG ReadDataAvailable;
5909 ULONG OutboundQuota;
5910 ULONG WriteQuotaAvailable;
5911 ULONG NamedPipeState;
5912 ULONG NamedPipeEnd;
5913 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
5914
5915 typedef struct _FILE_PIPE_REMOTE_INFORMATION {
5916 LARGE_INTEGER CollectDataTime;
5917 ULONG MaximumCollectionCount;
5918 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
5919
5920 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
5921 ULONG MaximumMessageSize;
5922 ULONG MailslotQuota;
5923 ULONG NextMessageSize;
5924 ULONG MessagesAvailable;
5925 LARGE_INTEGER ReadTimeout;
5926 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
5927
5928 typedef struct _FILE_MAILSLOT_SET_INFORMATION {
5929 PLARGE_INTEGER ReadTimeout;
5930 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
5931
5932 typedef struct _FILE_REPARSE_POINT_INFORMATION {
5933 LONGLONG FileReference;
5934 ULONG Tag;
5935 } FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
5936
5937 typedef struct _FILE_LINK_ENTRY_INFORMATION {
5938 ULONG NextEntryOffset;
5939 LONGLONG ParentFileId;
5940 ULONG FileNameLength;
5941 WCHAR FileName[1];
5942 } FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
5943
5944 typedef struct _FILE_LINKS_INFORMATION {
5945 ULONG BytesNeeded;
5946 ULONG EntriesReturned;
5947 FILE_LINK_ENTRY_INFORMATION Entry;
5948 } FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;
5949
5950 typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
5951 ULONG FileNameLength;
5952 WCHAR FileName[1];
5953 } FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
5954
5955 typedef struct _FILE_STANDARD_LINK_INFORMATION {
5956 ULONG NumberOfAccessibleLinks;
5957 ULONG TotalNumberOfLinks;
5958 BOOLEAN DeletePending;
5959 BOOLEAN Directory;
5960 } FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;
5961
5962 typedef struct _FILE_GET_EA_INFORMATION {
5963 ULONG NextEntryOffset;
5964 UCHAR EaNameLength;
5965 CHAR EaName[1];
5966 } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
5967
5968 #define REMOTE_PROTOCOL_FLAG_LOOPBACK 0x00000001
5969 #define REMOTE_PROTOCOL_FLAG_OFFLINE 0x00000002
5970
5971 typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION {
5972 USHORT StructureVersion;
5973 USHORT StructureSize;
5974 ULONG Protocol;
5975 USHORT ProtocolMajorVersion;
5976 USHORT ProtocolMinorVersion;
5977 USHORT ProtocolRevision;
5978 USHORT Reserved;
5979 ULONG Flags;
5980 struct {
5981 ULONG Reserved[8];
5982 } GenericReserved;
5983 struct {
5984 ULONG Reserved[16];
5985 } ProtocolSpecificReserved;
5986 } FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;
5987
5988 typedef struct _FILE_GET_QUOTA_INFORMATION {
5989 ULONG NextEntryOffset;
5990 ULONG SidLength;
5991 SID Sid;
5992 } FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
5993
5994 typedef struct _FILE_QUOTA_INFORMATION {
5995 ULONG NextEntryOffset;
5996 ULONG SidLength;
5997 LARGE_INTEGER ChangeTime;
5998 LARGE_INTEGER QuotaUsed;
5999 LARGE_INTEGER QuotaThreshold;
6000 LARGE_INTEGER QuotaLimit;
6001 SID Sid;
6002 } FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
6003
6004 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
6005 ULONG FileSystemAttributes;
6006 ULONG MaximumComponentNameLength;
6007 ULONG FileSystemNameLength;
6008 WCHAR FileSystemName[1];
6009 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
6010
6011 typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
6012 BOOLEAN DriverInPath;
6013 ULONG DriverNameLength;
6014 WCHAR DriverName[1];
6015 } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
6016
6017 typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
6018 ULONG Flags;
6019 } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
6020
6021 #define FILE_VC_QUOTA_NONE 0x00000000
6022 #define FILE_VC_QUOTA_TRACK 0x00000001
6023 #define FILE_VC_QUOTA_ENFORCE 0x00000002
6024 #define FILE_VC_QUOTA_MASK 0x00000003
6025 #define FILE_VC_CONTENT_INDEX_DISABLED 0x00000008
6026 #define FILE_VC_LOG_QUOTA_THRESHOLD 0x00000010
6027 #define FILE_VC_LOG_QUOTA_LIMIT 0x00000020
6028 #define FILE_VC_LOG_VOLUME_THRESHOLD 0x00000040
6029 #define FILE_VC_LOG_VOLUME_LIMIT 0x00000080
6030 #define FILE_VC_QUOTAS_INCOMPLETE 0x00000100
6031 #define FILE_VC_QUOTAS_REBUILDING 0x00000200
6032 #define FILE_VC_VALID_MASK 0x000003ff
6033
6034 typedef struct _FILE_FS_CONTROL_INFORMATION {
6035 LARGE_INTEGER FreeSpaceStartFiltering;
6036 LARGE_INTEGER FreeSpaceThreshold;
6037 LARGE_INTEGER FreeSpaceStopFiltering;
6038 LARGE_INTEGER DefaultQuotaThreshold;
6039 LARGE_INTEGER DefaultQuotaLimit;
6040 ULONG FileSystemControlFlags;
6041 } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
6042
6043 #ifndef _FILESYSTEMFSCTL_
6044 #define _FILESYSTEMFSCTL_
6045
6046 #define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
6047 #define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
6048 #define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
6049 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
6050 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
6051 #define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
6052 #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
6053 #define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
6054 #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
6055 #define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
6056 #define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
6057 #define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
6058 #define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER, FILE_ANY_ACCESS)
6059 #define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
6060 #define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
6061 #define FSCTL_SET_BOOTLOADER_ACCESSED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS)
6062
6063 #define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
6064 #define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
6065 #define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
6066 #define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
6067 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
6068
6069 #if (_WIN32_WINNT >= 0x0400)
6070
6071 #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
6072 #define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
6073 #define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS)
6074 #define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS)
6075 #define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6076 #define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
6077 #define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER, FILE_ANY_ACCESS)
6078
6079 #endif
6080
6081 #if (_WIN32_WINNT >= 0x0500)
6082
6083 #define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS)
6084 #define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6085 #define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
6086 #define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6087 #define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6088 #define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
6089 #define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6090 #define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER, FILE_ANY_ACCESS)
6091 #define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER, FILE_READ_DATA)
6092 #define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER, FILE_ANY_ACCESS)
6093 #define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6094 #define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
6095 #define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6096 #define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
6097 #define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA)
6098 #define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
6099 #define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_NEITHER, FILE_ANY_ACCESS)
6100 #define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER, FILE_ANY_ACCESS)
6101 #define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER, FILE_SPECIAL_ACCESS)
6102 #define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER, FILE_SPECIAL_ACCESS)
6103 #define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER, FILE_ANY_ACCESS)
6104 #define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER, FILE_ANY_ACCESS)
6105 #define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER, FILE_ANY_ACCESS)
6106 #define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
6107 #define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
6108 #define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
6109 #define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
6110 #define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
6111 #define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
6112 #define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
6113 #define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
6114 #define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6115
6116 #endif
6117
6118 #if (_WIN32_WINNT >= 0x0600)
6119
6120 #define FSCTL_MAKE_MEDIA_COMPATIBLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
6121 #define FSCTL_SET_DEFECT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
6122 #define FSCTL_QUERY_SPARING_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
6123 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
6124 #define FSCTL_SET_VOLUME_COMPRESSION_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6125 #define FSCTL_TXFS_MODIFY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA)
6126 #define FSCTL_TXFS_QUERY_RM_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA)
6127 #define FSCTL_TXFS_ROLLFORWARD_REDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA)
6128 #define FSCTL_TXFS_ROLLFORWARD_UNDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA)
6129 #define FSCTL_TXFS_START_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA)
6130 #define FSCTL_TXFS_SHUTDOWN_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
6131 #define FSCTL_TXFS_READ_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA)
6132 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA)
6133 #define FSCTL_TXFS_CREATE_SECONDARY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA)
6134 #define FSCTL_TXFS_GET_METADATA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA)
6135 #define FSCTL_TXFS_GET_TRANSACTED_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA)
6136 #define FSCTL_TXFS_SAVEPOINT_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA)
6137 #define FSCTL_TXFS_CREATE_MINIVERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
6138 #define FSCTL_TXFS_TRANSACTION_ACTIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA)
6139 #define FSCTL_SET_ZERO_ON_DEALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6140 #define FSCTL_SET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
6141 #define FSCTL_GET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
6142 #define FSCTL_WAIT_FOR_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
6143 #define FSCTL_INITIATE_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
6144 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
6145 #define FSCTL_SHRINK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
6146 #define FSCTL_SET_SHORT_NAME_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
6147 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
6148 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \
6149 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
6150 #define FSCTL_TXFS_LIST_TRANSACTIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
6151 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
6152 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
6153 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
6154
6155 #endif
6156
6157 #if (_WIN32_WINNT >= 0x0601)
6158
6159 #define FSCTL_QUERY_DEPENDENT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS)
6160 #define FSCTL_SD_GLOBAL_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS)
6161 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS)
6162 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS)
6163 #define FSCTL_FILE_TYPE_NOTIFICATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS)
6164 #define FSCTL_GET_BOOT_AREA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS)
6165 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS)
6166 #define FSCTL_SET_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
6167 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
6168 #define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)
6169 #define FSCTL_CSV_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
6170 #define FSCTL_IS_CSV_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
6171 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS)
6172 #define FSCTL_CSV_GET_VOLUME_PATH_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS)
6173 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
6174 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150, METHOD_BUFFERED, FILE_ANY_ACCESS)
6175 #define FSCTL_IS_FILE_ON_CSV_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151, METHOD_BUFFERED, FILE_ANY_ACCESS)
6176 #define FSCTL_CSV_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 155, METHOD_BUFFERED, FILE_ANY_ACCESS)
6177
6178 typedef struct _CSV_NAMESPACE_INFO {
6179 ULONG Version;
6180 ULONG DeviceNumber;
6181 LARGE_INTEGER StartingOffset;
6182 ULONG SectorSize;
6183 } CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
6184
6185 #define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
6186 #define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
6187
6188 #endif
6189
6190 #if (_WIN32_WINNT >= 0x0602)
6191
6192 #define FSCTL_FILE_LEVEL_TRIM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 130, METHOD_BUFFERED, FILE_WRITE_DATA)
6193 #define FSCTL_CORRUPTION_HANDLING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 152, METHOD_BUFFERED, FILE_ANY_ACCESS)
6194 #define FSCTL_OFFLOAD_READ CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 153, METHOD_BUFFERED, FILE_READ_ACCESS)
6195 #define FSCTL_OFFLOAD_WRITE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 154, METHOD_BUFFERED, FILE_WRITE_ACCESS)
6196 #define FSCTL_SET_PURGE_FAILURE_MODE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 156, METHOD_BUFFERED, FILE_ANY_ACCESS)
6197 #define FSCTL_QUERY_FILE_LAYOUT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 157, METHOD_NEITHER, FILE_ANY_ACCESS)
6198 #define FSCTL_IS_VOLUME_OWNED_BYCSVFS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 158, METHOD_BUFFERED, FILE_ANY_ACCESS)
6199 #define FSCTL_GET_INTEGRITY_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 159, METHOD_BUFFERED, FILE_ANY_ACCESS)
6200 #define FSCTL_SET_INTEGRITY_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 160, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
6201 #define FSCTL_QUERY_FILE_REGIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 161, METHOD_BUFFERED, FILE_ANY_ACCESS)
6202 #define FSCTL_DEDUP_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 165, METHOD_BUFFERED, FILE_ANY_ACCESS)
6203 #define FSCTL_DEDUP_QUERY_FILE_HASHES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 166, METHOD_NEITHER, FILE_READ_DATA)
6204 #define FSCTL_RKF_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 171, METHOD_NEITHER, FILE_ANY_ACCESS)
6205 #define FSCTL_SCRUB_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 172, METHOD_BUFFERED, FILE_ANY_ACCESS)
6206 #define FSCTL_REPAIR_COPIES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 173, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
6207 #define FSCTL_DISABLE_LOCAL_BUFFERING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 174, METHOD_BUFFERED, FILE_ANY_ACCESS)
6208 #define FSCTL_CSV_MGMT_LOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 175, METHOD_BUFFERED, FILE_ANY_ACCESS)
6209 #define FSCTL_CSV_QUERY_DOWN_LEVEL_FILE_SYSTEM_CHARACTERISTICS \
6210 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 176, METHOD_BUFFERED, FILE_ANY_ACCESS)
6211 #define FSCTL_ADVANCE_FILE_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 177, METHOD_BUFFERED, FILE_ANY_ACCESS)
6212 #define FSCTL_CSV_SYNC_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 178, METHOD_BUFFERED, FILE_ANY_ACCESS)
6213 #define FSCTL_CSV_QUERY_VETO_FILE_DIRECT_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 179, METHOD_BUFFERED, FILE_ANY_ACCESS)
6214 #define FSCTL_WRITE_USN_REASON CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 180, METHOD_BUFFERED, FILE_ANY_ACCESS)
6215 #define FSCTL_CSV_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 181, METHOD_BUFFERED, FILE_ANY_ACCESS)
6216 #define FSCTL_GET_REFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 182, METHOD_BUFFERED, FILE_ANY_ACCESS)
6217
6218 #endif
6219
6220 #if (_WIN32_WINNT >= 0x0603)
6221
6222 #define FSCTL_DUPLICATE_EXTENTS_TO_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 209, METHOD_BUFFERED, FILE_WRITE_DATA)
6223
6224 #endif
6225
6226 #define FSCTL_MARK_AS_SYSTEM_HIVE FSCTL_SET_BOOTLOADER_ACCESSED
6227
6228 typedef struct _PATHNAME_BUFFER {
6229 ULONG PathNameLength;
6230 WCHAR Name[1];
6231 } PATHNAME_BUFFER, *PPATHNAME_BUFFER;
6232
6233 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
6234 UCHAR First0x24BytesOfBootSector[0x24];
6235 } FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
6236
6237 #if (_WIN32_WINNT >= 0x0400)
6238
6239 typedef struct _NTFS_VOLUME_DATA_BUFFER {
6240 LARGE_INTEGER VolumeSerialNumber;
6241 LARGE_INTEGER NumberSectors;
6242 LARGE_INTEGER TotalClusters;
6243 LARGE_INTEGER FreeClusters;
6244 LARGE_INTEGER TotalReserved;
6245 ULONG BytesPerSector;
6246 ULONG BytesPerCluster;
6247 ULONG BytesPerFileRecordSegment;
6248 ULONG ClustersPerFileRecordSegment;
6249 LARGE_INTEGER MftValidDataLength;
6250 LARGE_INTEGER MftStartLcn;
6251 LARGE_INTEGER Mft2StartLcn;
6252 LARGE_INTEGER MftZoneStart;
6253 LARGE_INTEGER MftZoneEnd;
6254 } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
6255
6256 typedef struct _NTFS_EXTENDED_VOLUME_DATA {
6257 ULONG ByteCount;
6258 USHORT MajorVersion;
6259 USHORT MinorVersion;
6260 } NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
6261
6262 typedef struct _STARTING_LCN_INPUT_BUFFER {
6263 LARGE_INTEGER StartingLcn;
6264 } STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
6265
6266 typedef struct _VOLUME_BITMAP_BUFFER {
6267 LARGE_INTEGER StartingLcn;
6268 LARGE_INTEGER BitmapSize;
6269 UCHAR Buffer[1];
6270 } VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
6271
6272 typedef struct _STARTING_VCN_INPUT_BUFFER {
6273 LARGE_INTEGER StartingVcn;
6274 } STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
6275
6276 typedef struct _RETRIEVAL_POINTERS_BUFFER {
6277 ULONG ExtentCount;
6278 LARGE_INTEGER StartingVcn;
6279 struct {
6280 LARGE_INTEGER NextVcn;
6281 LARGE_INTEGER Lcn;
6282 } Extents[1];
6283 } RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
6284
6285 typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER {
6286 LARGE_INTEGER FileReferenceNumber;
6287 } NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
6288
6289 typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER {
6290 LARGE_INTEGER FileReferenceNumber;
6291 ULONG FileRecordLength;
6292 UCHAR FileRecordBuffer[1];
6293 } NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
6294
6295 typedef struct _MOVE_FILE_DATA {
6296 HANDLE FileHandle;
6297 LARGE_INTEGER StartingVcn;
6298 LARGE_INTEGER StartingLcn;
6299 ULONG ClusterCount;
6300 } MOVE_FILE_DATA, *PMOVE_FILE_DATA;
6301
6302 typedef struct _MOVE_FILE_RECORD_DATA {
6303 HANDLE FileHandle;
6304 LARGE_INTEGER SourceFileRecord;
6305 LARGE_INTEGER TargetFileRecord;
6306 } MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
6307
6308 #if defined(_WIN64)
6309 typedef struct _MOVE_FILE_DATA32 {
6310 UINT32 FileHandle;
6311 LARGE_INTEGER StartingVcn;
6312 LARGE_INTEGER StartingLcn;
6313 ULONG ClusterCount;
6314 } MOVE_FILE_DATA32, *PMOVE_FILE_DATA32;
6315 #endif
6316
6317 #endif /* (_WIN32_WINNT >= 0x0400) */
6318
6319 #if (_WIN32_WINNT >= 0x0500)
6320
6321 typedef struct _FIND_BY_SID_DATA {
6322 ULONG Restart;
6323 SID Sid;
6324 } FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
6325
6326 typedef struct _FIND_BY_SID_OUTPUT {
6327 ULONG NextEntryOffset;
6328 ULONG FileIndex;
6329 ULONG FileNameLength;
6330 WCHAR FileName[1];
6331 } FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
6332
6333 typedef struct _MFT_ENUM_DATA {
6334 ULONGLONG StartFileReferenceNumber;
6335 USN LowUsn;
6336 USN HighUsn;
6337 } MFT_ENUM_DATA, *PMFT_ENUM_DATA;
6338
6339 typedef struct _CREATE_USN_JOURNAL_DATA {
6340 ULONGLONG MaximumSize;
6341 ULONGLONG AllocationDelta;
6342 } CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
6343
6344 typedef struct _READ_USN_JOURNAL_DATA {
6345 USN StartUsn;
6346 ULONG ReasonMask;
6347 ULONG ReturnOnlyOnClose;
6348 ULONGLONG Timeout;
6349 ULONGLONG BytesToWaitFor;
6350 ULONGLONG UsnJournalID;
6351 } READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
6352
6353 typedef struct _USN_RECORD {
6354 ULONG RecordLength;
6355 USHORT MajorVersion;
6356 USHORT MinorVersion;
6357 ULONGLONG FileReferenceNumber;
6358 ULONGLONG ParentFileReferenceNumber;
6359 USN Usn;
6360 LARGE_INTEGER TimeStamp;
6361 ULONG Reason;
6362 ULONG SourceInfo;
6363 ULONG SecurityId;
6364 ULONG FileAttributes;
6365 USHORT FileNameLength;
6366 USHORT FileNameOffset;
6367 WCHAR FileName[1];
6368 } USN_RECORD, *PUSN_RECORD;
6369
6370 #define USN_PAGE_SIZE (0x1000)
6371
6372 #define USN_REASON_DATA_OVERWRITE (0x00000001)
6373 #define USN_REASON_DATA_EXTEND (0x00000002)
6374 #define USN_REASON_DATA_TRUNCATION (0x00000004)
6375 #define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010)
6376 #define USN_REASON_NAMED_DATA_EXTEND (0x00000020)
6377 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
6378 #define USN_REASON_FILE_CREATE (0x00000100)
6379 #define USN_REASON_FILE_DELETE (0x00000200)
6380 #define USN_REASON_EA_CHANGE (0x00000400)
6381 #define USN_REASON_SECURITY_CHANGE (0x00000800)
6382 #define USN_REASON_RENAME_OLD_NAME (0x00001000)
6383 #define USN_REASON_RENAME_NEW_NAME (0x00002000)
6384 #define USN_REASON_INDEXABLE_CHANGE (0x00004000)
6385 #define USN_REASON_BASIC_INFO_CHANGE (0x00008000)
6386 #define USN_REASON_HARD_LINK_CHANGE (0x00010000)
6387 #define USN_REASON_COMPRESSION_CHANGE (0x00020000)
6388 #define USN_REASON_ENCRYPTION_CHANGE (0x00040000)
6389 #define USN_REASON_OBJECT_ID_CHANGE (0x00080000)
6390 #define USN_REASON_REPARSE_POINT_CHANGE (0x00100000)
6391 #define USN_REASON_STREAM_CHANGE (0x00200000)
6392 #define USN_REASON_TRANSACTED_CHANGE (0x00400000)
6393 #define USN_REASON_CLOSE (0x80000000)
6394
6395 typedef struct _USN_JOURNAL_DATA {
6396 ULONGLONG UsnJournalID;
6397 USN FirstUsn;
6398 USN NextUsn;
6399 USN LowestValidUsn;
6400 USN MaxUsn;
6401 ULONGLONG MaximumSize;
6402 ULONGLONG AllocationDelta;
6403 } USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
6404
6405 typedef struct _DELETE_USN_JOURNAL_DATA {
6406 ULONGLONG UsnJournalID;
6407 ULONG DeleteFlags;
6408 } DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
6409
6410 #define USN_DELETE_FLAG_DELETE (0x00000001)
6411 #define USN_DELETE_FLAG_NOTIFY (0x00000002)
6412 #define USN_DELETE_VALID_FLAGS (0x00000003)
6413
6414 typedef struct _MARK_HANDLE_INFO {
6415 ULONG UsnSourceInfo;
6416 HANDLE VolumeHandle;
6417 ULONG HandleInfo;
6418 } MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
6419
6420 #if defined(_WIN64)
6421 typedef struct _MARK_HANDLE_INFO32 {
6422 ULONG UsnSourceInfo;
6423 UINT32 VolumeHandle;
6424 ULONG HandleInfo;
6425 } MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32;
6426 #endif
6427
6428 #define USN_SOURCE_DATA_MANAGEMENT (0x00000001)
6429 #define USN_SOURCE_AUXILIARY_DATA (0x00000002)
6430 #define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004)
6431
6432 #define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001)
6433 #define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004)
6434 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008)
6435
6436 typedef struct _BULK_SECURITY_TEST_DATA {
6437 ACCESS_MASK DesiredAccess;
6438 ULONG SecurityIds[1];
6439 } BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
6440
6441 #define VOLUME_IS_DIRTY (0x00000001)
6442 #define VOLUME_UPGRADE_SCHEDULED (0x00000002)
6443 #define VOLUME_SESSION_OPEN (0x00000004)
6444
6445 typedef struct _FILE_PREFETCH {
6446 ULONG Type;
6447 ULONG Count;
6448 ULONGLONG Prefetch[1];
6449 } FILE_PREFETCH, *PFILE_PREFETCH;
6450
6451 typedef struct _FILE_PREFETCH_EX {
6452 ULONG Type;
6453 ULONG Count;
6454 PVOID Context;
6455 ULONGLONG Prefetch[1];
6456 } FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
6457
6458 #define FILE_PREFETCH_TYPE_FOR_CREATE 0x1
6459 #define FILE_PREFETCH_TYPE_FOR_DIRENUM 0x2
6460 #define FILE_PREFETCH_TYPE_FOR_CREATE_EX 0x3
6461 #define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX 0x4
6462
6463 #define FILE_PREFETCH_TYPE_MAX 0x4
6464
6465 typedef struct _FILE_OBJECTID_BUFFER {
6466 UCHAR ObjectId[16];
6467 _ANONYMOUS_UNION union {
6468 _ANONYMOUS_STRUCT struct {
6469 UCHAR BirthVolumeId[16];
6470 UCHAR BirthObjectId[16];
6471 UCHAR DomainId[16];
6472 } DUMMYSTRUCTNAME;
6473 UCHAR ExtendedInfo[48];
6474 } DUMMYUNIONNAME;
6475 } FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
6476
6477 typedef struct _FILE_SET_SPARSE_BUFFER {
6478 BOOLEAN SetSparse;
6479 } FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
6480
6481 typedef struct _FILE_ZERO_DATA_INFORMATION {
6482 LARGE_INTEGER FileOffset;
6483 LARGE_INTEGER BeyondFinalZero;
6484 } FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
6485
6486 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
6487 LARGE_INTEGER FileOffset;
6488 LARGE_INTEGER Length;
6489 } FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
6490
6491 typedef struct _ENCRYPTION_BUFFER {
6492 ULONG EncryptionOperation;
6493 UCHAR Private[1];
6494 } ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
6495
6496 #define FILE_SET_ENCRYPTION 0x00000001
6497 #define FILE_CLEAR_ENCRYPTION 0x00000002
6498 #define STREAM_SET_ENCRYPTION 0x00000003
6499 #define STREAM_CLEAR_ENCRYPTION 0x00000004
6500
6501 #define MAXIMUM_ENCRYPTION_VALUE 0x00000004
6502
6503 typedef struct _DECRYPTION_STATUS_BUFFER {
6504 BOOLEAN NoEncryptedStreams;
6505 } DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
6506
6507 #define ENCRYPTION_FORMAT_DEFAULT (0x01)
6508
6509 #define COMPRESSION_FORMAT_SPARSE (0x4000)
6510
6511 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
6512 LONGLONG FileOffset;
6513 ULONG Length;
6514 } REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
6515
6516 typedef struct _ENCRYPTED_DATA_INFO {
6517 ULONGLONG StartingFileOffset;
6518 ULONG OutputBufferOffset;
6519 ULONG BytesWithinFileSize;
6520 ULONG BytesWithinValidDataLength;
6521 USHORT CompressionFormat;
6522 UCHAR DataUnitShift;
6523 UCHAR ChunkShift;
6524 UCHAR ClusterShift;
6525 UCHAR EncryptionFormat;
6526 USHORT NumberOfDataBlocks;
6527 ULONG DataBlockSize[ANYSIZE_ARRAY];
6528 } ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO;
6529
6530 typedef struct _PLEX_READ_DATA_REQUEST {
6531 LARGE_INTEGER ByteOffset;
6532 ULONG ByteLength;
6533 ULONG PlexNumber;
6534 } PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
6535
6536 typedef struct _SI_COPYFILE {
6537 ULONG SourceFileNameLength;
6538 ULONG DestinationFileNameLength;
6539 ULONG Flags;
6540 WCHAR FileNameBuffer[1];
6541 } SI_COPYFILE, *PSI_COPYFILE;
6542
6543 #define COPYFILE_SIS_LINK 0x0001
6544 #define COPYFILE_SIS_REPLACE 0x0002
6545 #define COPYFILE_SIS_FLAGS 0x0003
6546
6547 #endif /* (_WIN32_WINNT >= 0x0500) */
6548
6549 #if (_WIN32_WINNT >= 0x0600)
6550
6551 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
6552 BOOLEAN CloseDisc;
6553 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
6554
6555 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
6556 BOOLEAN Disable;
6557 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
6558
6559 typedef struct _FILE_QUERY_SPARING_BUFFER {
6560 ULONG SparingUnitBytes;
6561 BOOLEAN SoftwareSparing;
6562 ULONG TotalSpareBlocks;
6563 ULONG FreeSpareBlocks;
6564 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
6565
6566 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
6567 LARGE_INTEGER DirectoryCount;
6568 LARGE_INTEGER FileCount;
6569 USHORT FsFormatMajVersion;
6570 USHORT FsFormatMinVersion;
6571 WCHAR FsFormatName[12];
6572 LARGE_INTEGER FormatTime;
6573 LARGE_INTEGER LastUpdateTime;
6574 WCHAR CopyrightInfo[34];
6575 WCHAR AbstractInfo[34];
6576 WCHAR FormattingImplementationInfo[34];
6577 WCHAR LastModifyingImplementationInfo[34];
6578 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
6579
6580 #define SET_REPAIR_ENABLED (0x00000001)
6581 #define SET_REPAIR_VOLUME_BITMAP_SCAN (0x00000002)
6582 #define SET_REPAIR_DELETE_CROSSLINK (0x00000004)
6583 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS (0x00000008)
6584 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT (0x00000010)
6585 #define SET_REPAIR_VALID_MASK (0x0000001F)
6586
6587 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
6588 ShrinkPrepare = 1,
6589 ShrinkCommit,
6590 ShrinkAbort
6591 } SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES;
6592
6593 typedef struct _SHRINK_VOLUME_INFORMATION {
6594 SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
6595 ULONGLONG Flags;
6596 LONGLONG NewNumberOfSectors;
6597 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
6598
6599 #define TXFS_RM_FLAG_LOGGING_MODE 0x00000001
6600 #define TXFS_RM_FLAG_RENAME_RM 0x00000002
6601 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000004
6602 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000008
6603 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000010
6604 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000020
6605 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000040
6606 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000080
6607 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000100
6608 #define TXFS_RM_FLAG_GROW_LOG 0x00000400
6609 #define TXFS_RM_FLAG_SHRINK_LOG 0x00000800
6610 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE 0x00001000
6611 #define TXFS_RM_FLAG_PRESERVE_CHANGES 0x00002000
6612 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START 0x00004000
6613 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START 0x00008000
6614 #define TXFS_RM_FLAG_PREFER_CONSISTENCY 0x00010000
6615 #define TXFS_RM_FLAG_PREFER_AVAILABILITY 0x00020000
6616
6617 #define TXFS_LOGGING_MODE_SIMPLE (0x0001)
6618 #define TXFS_LOGGING_MODE_FULL (0x0002)
6619
6620 #define TXFS_TRANSACTION_STATE_NONE 0x00
6621 #define TXFS_TRANSACTION_STATE_ACTIVE 0x01
6622 #define TXFS_TRANSACTION_STATE_PREPARED 0x02
6623 #define TXFS_TRANSACTION_STATE_NOTACTIVE 0x03
6624
6625 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE | \
6626 TXFS_RM_FLAG_RENAME_RM | \
6627 TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
6628 TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
6629 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6630 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6631 TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
6632 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6633 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
6634 TXFS_RM_FLAG_SHRINK_LOG | \
6635 TXFS_RM_FLAG_GROW_LOG | \
6636 TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE | \
6637 TXFS_RM_FLAG_PRESERVE_CHANGES | \
6638 TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
6639 TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
6640 TXFS_RM_FLAG_PREFER_CONSISTENCY | \
6641 TXFS_RM_FLAG_PREFER_AVAILABILITY)
6642
6643 typedef struct _TXFS_MODIFY_RM {
6644 ULONG Flags;
6645 ULONG LogContainerCountMax;
6646 ULONG LogContainerCountMin;
6647 ULONG LogContainerCount;
6648 ULONG LogGrowthIncrement;
6649 ULONG LogAutoShrinkPercentage;
6650 ULONGLONG Reserved;
6651 USHORT LoggingMode;
6652 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
6653
6654 #define TXFS_RM_STATE_NOT_STARTED 0
6655 #define TXFS_RM_STATE_STARTING 1
6656 #define TXFS_RM_STATE_ACTIVE 2
6657 #define TXFS_RM_STATE_SHUTTING_DOWN 3
6658
6659 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS \
6660 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6661 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6662 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6663 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
6664 TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
6665 TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
6666 TXFS_RM_FLAG_PREFER_CONSISTENCY | \
6667 TXFS_RM_FLAG_PREFER_AVAILABILITY)
6668
6669 typedef struct _TXFS_QUERY_RM_INFORMATION {
6670 ULONG BytesRequired;
6671 ULONGLONG TailLsn;
6672 ULONGLONG CurrentLsn;
6673 ULONGLONG ArchiveTailLsn;
6674 ULONGLONG LogContainerSize;
6675 LARGE_INTEGER HighestVirtualClock;
6676 ULONG LogContainerCount;
6677 ULONG LogContainerCountMax;
6678 ULONG LogContainerCountMin;
6679 ULONG LogGrowthIncrement;
6680 ULONG LogAutoShrinkPercentage;
6681 ULONG Flags;
6682 USHORT LoggingMode;
6683 USHORT Reserved;
6684 ULONG RmState;
6685 ULONGLONG LogCapacity;
6686 ULONGLONG LogFree;
6687 ULONGLONG TopsSize;
6688 ULONGLONG TopsUsed;
6689 ULONGLONG TransactionCount;
6690 ULONGLONG OnePCCount;
6691 ULONGLONG TwoPCCount;
6692 ULONGLONG NumberLogFileFull;
6693 ULONGLONG OldestTransactionAge;
6694 GUID RMName;
6695 ULONG TmLogPathOffset;
6696 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
6697
6698 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN 0x01
6699 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK 0x02
6700
6701 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS \
6702 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN | \
6703 TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
6704
6705 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
6706 LARGE_INTEGER LastVirtualClock;
6707 ULONGLONG LastRedoLsn;
6708 ULONGLONG HighestRecoveryLsn;
6709 ULONG Flags;
6710 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
6711
6712 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000001
6713 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000002
6714 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE 0x00000004
6715 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000008
6716 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000010
6717 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000020
6718 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000040
6719 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000080
6720
6721 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT 0x00000200
6722 #define TXFS_START_RM_FLAG_LOGGING_MODE 0x00000400
6723 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES 0x00000800
6724
6725 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY 0x00001000
6726 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY 0x00002000
6727
6728 #define TXFS_START_RM_VALID_FLAGS \
6729 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
6730 TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
6731 TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE | \
6732 TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6733 TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6734 TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
6735 TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT | \
6736 TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6737 TXFS_START_RM_FLAG_LOGGING_MODE | \
6738 TXFS_START_RM_FLAG_PRESERVE_CHANGES | \
6739 TXFS_START_RM_FLAG_PREFER_CONSISTENCY | \
6740 TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
6741
6742 typedef struct _TXFS_START_RM_INFORMATION {
6743 ULONG Flags;
6744 ULONGLONG LogContainerSize;
6745 ULONG LogContainerCountMin;
6746 ULONG LogContainerCountMax;
6747 ULONG LogGrowthIncrement;
6748 ULONG LogAutoShrinkPercentage;
6749 ULONG TmLogPathOffset;
6750 USHORT TmLogPathLength;
6751 USHORT LoggingMode;
6752 USHORT LogPathLength;
6753 USHORT Reserved;
6754 WCHAR LogPath[1];
6755 } TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
6756
6757 typedef struct _TXFS_GET_METADATA_INFO_OUT {
6758 struct {
6759 LONGLONG LowPart;
6760 LONGLONG HighPart;
6761 } TxfFileId;
6762 GUID LockingTransaction;
6763 ULONGLONG LastLsn;
6764 ULONG TransactionState;
6765 } TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
6766
6767 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED 0x00000001
6768 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED 0x00000002
6769
6770 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
6771 ULONGLONG Offset;
6772 ULONG NameFlags;
6773 LONGLONG FileId;
6774 ULONG Reserved1;
6775 ULONG Reserved2;
6776 LONGLONG Reserved3;
6777 WCHAR FileName[1];
6778 } TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
6779
6780 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
6781 GUID KtmTransaction;
6782 ULONGLONG NumberOfFiles;
6783 ULONGLONG BufferSizeRequired;
6784 ULONGLONG Offset;
6785 } TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
6786
6787 typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
6788 GUID TransactionId;
6789 ULONG TransactionState;
6790 ULONG Reserved1;
6791 ULONG Reserved2;
6792 LONGLONG Reserved3;
6793 } TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
6794
6795 typedef struct _TXFS_LIST_TRANSACTIONS {
6796 ULONGLONG NumberOfTransactions;
6797 ULONGLONG BufferSizeRequired;
6798 } TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
6799
6800 typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
6801 _ANONYMOUS_UNION union {
6802 ULONG BufferLength;
6803 UCHAR Buffer[1];
6804 } DUMMYUNIONNAME;
6805 } TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
6806
6807 typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
6808 UCHAR Buffer[1];
6809 } TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
6810
6811 #define TXFS_TRANSACTED_VERSION_NONTRANSACTED 0xFFFFFFFE
6812 #define TXFS_TRANSACTED_VERSION_UNCOMMITTED 0xFFFFFFFF
6813
6814 typedef struct _TXFS_GET_TRANSACTED_VERSION {
6815 ULONG ThisBaseVersion;
6816 ULONG LatestVersion;
6817 USHORT ThisMiniVersion;
6818 USHORT FirstMiniVersion;
6819 USHORT LatestMiniVersion;
6820 } TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
6821
6822 #define TXFS_SAVEPOINT_SET 0x00000001
6823 #define TXFS_SAVEPOINT_ROLLBACK 0x00000002
6824 #define TXFS_SAVEPOINT_CLEAR 0x00000004
6825 #define TXFS_SAVEPOINT_CLEAR_ALL 0x00000010
6826
6827 typedef struct _TXFS_SAVEPOINT_INFORMATION {
6828 HANDLE KtmTransaction;
6829 ULONG ActionCode;
6830 ULONG SavepointId;
6831 } TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
6832
6833 typedef struct _TXFS_CREATE_MINIVERSION_INFO {
6834 USHORT StructureVersion;
6835 USHORT StructureLength;
6836 ULONG BaseVersion;
6837 USHORT MiniVersion;
6838 } TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
6839
6840 typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
6841 BOOLEAN TransactionsActiveAtSnapshot;
6842 } TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
6843
6844 #endif /* (_WIN32_WINNT >= 0x0600) */
6845
6846 #if (_WIN32_WINNT >= 0x0601)
6847
6848 #define MARK_HANDLE_REALTIME (0x00000020)
6849 #define MARK_HANDLE_NOT_REALTIME (0x00000040)
6850
6851 #define NO_8DOT3_NAME_PRESENT (0x00000001)
6852 #define REMOVED_8DOT3_NAME (0x00000002)
6853
6854 #define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED (0x00000001)
6855
6856 typedef struct _BOOT_AREA_INFO {
6857 ULONG BootSectorCount;
6858 struct {
6859 LARGE_INTEGER Offset;
6860 } BootSectors[2];
6861 } BOOT_AREA_INFO, *PBOOT_AREA_INFO;
6862
6863 typedef struct _RETRIEVAL_POINTER_BASE {
6864 LARGE_INTEGER FileAreaOffset;
6865 } RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
6866
6867 typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION {
6868 ULONG VolumeFlags;
6869 ULONG FlagMask;
6870 ULONG Version;
6871 ULONG Reserved;
6872 } FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION;
6873
6874 typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
6875 CHAR FileSystem[9];
6876 } FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
6877
6878 #define OPLOCK_LEVEL_CACHE_READ (0x00000001)
6879 #define OPLOCK_LEVEL_CACHE_HANDLE (0x00000002)
6880 #define OPLOCK_LEVEL_CACHE_WRITE (0x00000004)
6881
6882 #define REQUEST_OPLOCK_INPUT_FLAG_REQUEST (0x00000001)
6883 #define REQUEST_OPLOCK_INPUT_FLAG_ACK (0x00000002)
6884 #define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)
6885
6886 #define REQUEST_OPLOCK_CURRENT_VERSION 1
6887
6888 typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
6889 USHORT StructureVersion;
6890 USHORT StructureLength;
6891 ULONG RequestedOplockLevel;
6892 ULONG Flags;
6893 } REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
6894
6895 #define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED (0x00000001)
6896 #define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED (0x00000002)
6897
6898 typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
6899 USHORT StructureVersion;
6900 USHORT StructureLength;
6901 ULONG OriginalOplockLevel;
6902 ULONG NewOplockLevel;
6903 ULONG Flags;
6904 ACCESS_MASK AccessMode;
6905 USHORT ShareMode;
6906 } REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
6907
6908 #define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID 1
6909
6910 typedef struct _SD_CHANGE_MACHINE_SID_INPUT {
6911 USHORT CurrentMachineSIDOffset;
6912 USHORT CurrentMachineSIDLength;
6913 USHORT NewMachineSIDOffset;
6914 USHORT NewMachineSIDLength;
6915 } SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT;
6916
6917 typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
6918 ULONGLONG NumSDChangedSuccess;
6919 ULONGLONG NumSDChangedFail;
6920 ULONGLONG NumSDUnused;
6921 ULONGLONG NumSDTotal;
6922 ULONGLONG NumMftSDChangedSuccess;
6923 ULONGLONG NumMftSDChangedFail;
6924 ULONGLONG NumMftSDTotal;
6925 } SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT;
6926
6927 typedef struct _SD_GLOBAL_CHANGE_INPUT {
6928 ULONG Flags;
6929 ULONG ChangeType;
6930 _ANONYMOUS_UNION union {
6931 SD_CHANGE_MACHINE_SID_INPUT SdChange;
6932 } DUMMYUNIONNAME;
6933 } SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT;
6934
6935 typedef struct _SD_GLOBAL_CHANGE_OUTPUT {
6936 ULONG Flags;
6937 ULONG ChangeType;
6938 _ANONYMOUS_UNION union {
6939 SD_CHANGE_MACHINE_SID_OUTPUT SdChange;
6940 } DUMMYUNIONNAME;
6941 } SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT;
6942
6943 #define ENCRYPTED_DATA_INFO_SPARSE_FILE 1
6944
6945 typedef struct _EXTENDED_ENCRYPTED_DATA_INFO {
6946 ULONG ExtendedCode;
6947 ULONG Length;
6948 ULONG Flags;
6949 ULONG Reserved;
6950 } EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO;
6951
6952 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
6953 ULONG Flags;
6954 ULONG NumberOfClusters;
6955 LARGE_INTEGER Cluster[1];
6956 } LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
6957
6958 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
6959 ULONG Offset;
6960 ULONG NumberOfMatches;
6961 ULONG BufferSizeRequired;
6962 } LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
6963
6964 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE 0x00000001
6965 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET 0x00000002
6966 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE 0x00000004
6967 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE 0x00000008
6968
6969 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK 0xff000000
6970 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA 0x01000000
6971 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX 0x02000000
6972 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM 0x03000000
6973
6974 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
6975 ULONG OffsetToNext;
6976 ULONG Flags;
6977 LARGE_INTEGER Reserved;
6978 LARGE_INTEGER Cluster;
6979 WCHAR FileName[1];
6980 } LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
6981
6982 typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
6983 ULONG Flags;
6984 ULONG NumFileTypeIDs;
6985 GUID FileTypeID[1];
6986 } FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT;
6987
6988 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN 0x00000001
6989 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END 0x00000002
6990
6991 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE, 0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c);
6992 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE, 0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7);
6993 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE, 0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9);
6994
6995 #ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
6996 #define _VIRTUAL_STORAGE_TYPE_DEFINED
6997 typedef struct _VIRTUAL_STORAGE_TYPE {
6998 ULONG DeviceId;
6999 GUID VendorId;
7000 } VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
7001 #endif
7002
7003 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST {
7004 ULONG RequestLevel;
7005 ULONG RequestFlags;
7006 } STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST, *PSTORAGE_QUERY_DEPENDENT_VOLUME_REQUEST;
7007
7008 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_HOST_VOLUMES 0x1
7009 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_GUEST_VOLUMES 0x2
7010
7011 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY {
7012 ULONG EntryLength;
7013 ULONG DependencyTypeFlags;
7014 ULONG ProviderSpecificFlags;
7015 VIRTUAL_STORAGE_TYPE VirtualStorageType;
7016 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY;
7017
7018 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY {
7019 ULONG EntryLength;
7020 ULONG DependencyTypeFlags;
7021 ULONG ProviderSpecificFlags;
7022 VIRTUAL_STORAGE_TYPE VirtualStorageType;
7023 ULONG AncestorLevel;
7024 ULONG HostVolumeNameOffset;
7025 ULONG HostVolumeNameSize;
7026 ULONG DependentVolumeNameOffset;
7027 ULONG DependentVolumeNameSize;
7028 ULONG RelativePathOffset;
7029 ULONG RelativePathSize;
7030 ULONG DependentDeviceNameOffset;
7031 ULONG DependentDeviceNameSize;
7032 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY;
7033
7034 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE {
7035 ULONG ResponseLevel;
7036 ULONG NumberEntries;
7037 _ANONYMOUS_UNION union {
7038 STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[0];
7039 STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[0];
7040 } DUMMYUNIONNAME;
7041 } STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE;
7042
7043 #endif /* (_WIN32_WINNT >= 0x0601) */
7044
7045 typedef struct _FILESYSTEM_STATISTICS {
7046 USHORT FileSystemType;
7047 USHORT Version;
7048 ULONG SizeOfCompleteStructure;
7049 ULONG UserFileReads;
7050 ULONG UserFileReadBytes;
7051 ULONG UserDiskReads;
7052 ULONG UserFileWrites;
7053 ULONG UserFileWriteBytes;
7054 ULONG UserDiskWrites;
7055 ULONG MetaDataReads;
7056 ULONG MetaDataReadBytes;
7057 ULONG MetaDataDiskReads;
7058 ULONG MetaDataWrites;
7059 ULONG MetaDataWriteBytes;
7060 ULONG MetaDataDiskWrites;
7061 } FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
7062
7063 #define FILESYSTEM_STATISTICS_TYPE_NTFS 1
7064 #define FILESYSTEM_STATISTICS_TYPE_FAT 2
7065 #define FILESYSTEM_STATISTICS_TYPE_EXFAT 3
7066
7067 typedef struct _FAT_STATISTICS {
7068 ULONG CreateHits;
7069 ULONG SuccessfulCreates;
7070 ULONG FailedCreates;
7071 ULONG NonCachedReads;
7072 ULONG NonCachedReadBytes;
7073 ULONG NonCachedWrites;
7074 ULONG NonCachedWriteBytes;
7075 ULONG NonCachedDiskReads;
7076 ULONG NonCachedDiskWrites;
7077 } FAT_STATISTICS, *PFAT_STATISTICS;
7078
7079 typedef struct _EXFAT_STATISTICS {
7080 ULONG CreateHits;
7081 ULONG SuccessfulCreates;
7082 ULONG FailedCreates;
7083 ULONG NonCachedReads;
7084 ULONG NonCachedReadBytes;
7085 ULONG NonCachedWrites;
7086 ULONG NonCachedWriteBytes;
7087 ULONG NonCachedDiskReads;
7088 ULONG NonCachedDiskWrites;
7089 } EXFAT_STATISTICS, *PEXFAT_STATISTICS;
7090
7091 typedef struct _NTFS_STATISTICS {
7092 ULONG LogFileFullExceptions;
7093 ULONG OtherExceptions;
7094 ULONG MftReads;
7095 ULONG MftReadBytes;
7096 ULONG MftWrites;
7097 ULONG MftWriteBytes;
7098 struct {
7099 USHORT Write;
7100 USHORT Create;
7101 USHORT SetInfo;
7102 USHORT Flush;
7103 } MftWritesUserLevel;
7104 USHORT MftWritesFlushForLogFileFull;
7105 USHORT MftWritesLazyWriter;
7106 USHORT MftWritesUserRequest;
7107 ULONG Mft2Writes;
7108 ULONG Mft2WriteBytes;
7109 struct {
7110 USHORT Write;
7111 USHORT Create;
7112 USHORT SetInfo;
7113 USHORT Flush;
7114 } Mft2WritesUserLevel;
7115 USHORT Mft2WritesFlushForLogFileFull;
7116 USHORT Mft2WritesLazyWriter;
7117 USHORT Mft2WritesUserRequest;
7118 ULONG RootIndexReads;
7119 ULONG RootIndexReadBytes;
7120 ULONG RootIndexWrites;
7121 ULONG RootIndexWriteBytes;
7122 ULONG BitmapReads;
7123 ULONG BitmapReadBytes;
7124 ULONG BitmapWrites;
7125 ULONG BitmapWriteBytes;
7126 USHORT BitmapWritesFlushForLogFileFull;
7127 USHORT BitmapWritesLazyWriter;
7128 USHORT BitmapWritesUserRequest;
7129 struct {
7130 USHORT Write;
7131 USHORT Create;
7132 USHORT SetInfo;
7133 } BitmapWritesUserLevel;
7134 ULONG MftBitmapReads;
7135 ULONG MftBitmapReadBytes;
7136 ULONG MftBitmapWrites;
7137 ULONG MftBitmapWriteBytes;
7138 USHORT MftBitmapWritesFlushForLogFileFull;
7139 USHORT MftBitmapWritesLazyWriter;
7140 USHORT MftBitmapWritesUserRequest;
7141 struct {
7142 USHORT Write;
7143 USHORT Create;
7144 USHORT SetInfo;
7145 USHORT Flush;
7146 } MftBitmapWritesUserLevel;
7147 ULONG UserIndexReads;
7148 ULONG UserIndexReadBytes;
7149 ULONG UserIndexWrites;
7150 ULONG UserIndexWriteBytes;
7151 ULONG LogFileReads;
7152 ULONG LogFileReadBytes;
7153 ULONG LogFileWrites;
7154 ULONG LogFileWriteBytes;
7155 struct {
7156 ULONG Calls;
7157 ULONG Clusters;
7158 ULONG Hints;
7159 ULONG RunsReturned;
7160 ULONG HintsHonored;
7161 ULONG HintsClusters;
7162 ULONG Cache;
7163 ULONG CacheClusters;
7164 ULONG CacheMiss;
7165 ULONG CacheMissClusters;
7166 } Allocate;
7167 } NTFS_STATISTICS, *PNTFS_STATISTICS;
7168
7169 #endif /* _FILESYSTEMFSCTL_ */
7170
7171 #define SYMLINK_FLAG_RELATIVE 1
7172
7173 typedef struct _REPARSE_DATA_BUFFER {
7174 ULONG ReparseTag;
7175 USHORT ReparseDataLength;
7176 USHORT Reserved;
7177 _ANONYMOUS_UNION union {
7178 struct {
7179 USHORT SubstituteNameOffset;
7180 USHORT SubstituteNameLength;
7181 USHORT PrintNameOffset;
7182 USHORT PrintNameLength;
7183 ULONG Flags;
7184 WCHAR PathBuffer[1];
7185 } SymbolicLinkReparseBuffer;
7186 struct {
7187 USHORT SubstituteNameOffset;
7188 USHORT SubstituteNameLength;
7189 USHORT PrintNameOffset;
7190 USHORT PrintNameLength;
7191 WCHAR PathBuffer[1];
7192 } MountPointReparseBuffer;
7193 struct {
7194 UCHAR DataBuffer[1];
7195 } GenericReparseBuffer;
7196 } DUMMYUNIONNAME;
7197 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
7198
7199 #define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
7200
7201 typedef struct _REPARSE_GUID_DATA_BUFFER {
7202 ULONG ReparseTag;
7203 USHORT ReparseDataLength;
7204 USHORT Reserved;
7205 GUID ReparseGuid;
7206 struct {
7207 UCHAR DataBuffer[1];
7208 } GenericReparseBuffer;
7209 } REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
7210
7211 #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
7212
7213 #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 )
7214
7215 /* Reserved reparse tags */
7216 #define IO_REPARSE_TAG_RESERVED_ZERO (0)
7217 #define IO_REPARSE_TAG_RESERVED_ONE (1)
7218 #define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE
7219
7220 #define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000))
7221 #define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000))
7222
7223 #define IO_REPARSE_TAG_VALID_VALUES (0xF000FFFF)
7224
7225 #define IsReparseTagValid(tag) ( \
7226 !((tag) & ~IO_REPARSE_TAG_VALID_VALUES) && \
7227 ((tag) > IO_REPARSE_TAG_RESERVED_RANGE) \
7228 )
7229
7230 /* MicroSoft reparse point tags */
7231 #define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
7232 #define IO_REPARSE_TAG_HSM (0xC0000004L)
7233 #define IO_REPARSE_TAG_DRIVE_EXTENDER (0x80000005L)
7234 #define IO_REPARSE_TAG_HSM2 (0x80000006L)
7235 #define IO_REPARSE_TAG_SIS (0x80000007L)
7236 #define IO_REPARSE_TAG_WIM (0x80000008L)
7237 #define IO_REPARSE_TAG_CSV (0x80000009L)
7238 #define IO_REPARSE_TAG_DFS (0x8000000AL)
7239 #define IO_REPARSE_TAG_FILTER_MANAGER (0x8000000BL)
7240 #define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
7241 #define IO_REPARSE_TAG_IIS_CACHE (0xA0000010L)
7242 #define IO_REPARSE_TAG_DFSR (0x80000012L)
7243
7244 #pragma pack(4)
7245 typedef struct _REPARSE_INDEX_KEY {
7246 ULONG FileReparseTag;
7247 LARGE_INTEGER FileId;
7248 } REPARSE_INDEX_KEY, *PREPARSE_INDEX_KEY;
7249 #pragma pack()
7250
7251 #define FSCTL_LMR_GET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,58,METHOD_BUFFERED,FILE_ANY_ACCESS)
7252 #define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS)
7253 #define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
7254
7255 #define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
7256 #define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
7257 #define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
7258 #define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
7259 #define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
7260 #define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
7261 #define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
7262 #define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
7263 #define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
7264 #define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
7265 #define FSCTL_PIPE_GET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
7266 #define FSCTL_PIPE_SET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
7267 #define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
7268 #define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
7269 #define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
7270 #define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
7271 #define FSCTL_PIPE_FLUSH CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)
7272
7273 #define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
7274 #define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
7275 #define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
7276 #define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
7277
7278 #define FILE_PIPE_READ_DATA 0x00000000
7279 #define FILE_PIPE_WRITE_SPACE 0x00000001
7280
7281 typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
7282 HANDLE EventHandle;
7283 ULONG KeyValue;
7284 } FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;
7285
7286 typedef struct _FILE_PIPE_EVENT_BUFFER {
7287 ULONG NamedPipeState;
7288 ULONG EntryType;
7289 ULONG ByteCount;
7290 ULONG KeyValue;
7291 ULONG NumberRequests;
7292 } FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;
7293
7294 typedef struct _FILE_PIPE_PEEK_BUFFER {
7295 ULONG NamedPipeState;
7296 ULONG ReadDataAvailable;
7297 ULONG NumberOfMessages;
7298 ULONG MessageLength;
7299 CHAR Data[1];
7300 } FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
7301
7302 typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
7303 LARGE_INTEGER Timeout;
7304 ULONG NameLength;
7305 BOOLEAN TimeoutSpecified;
7306 WCHAR Name[1];
7307 } FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
7308
7309 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
7310 #if !defined(BUILD_WOW6432)
7311 PVOID ClientSession;
7312 PVOID ClientProcess;
7313 #else
7314 ULONGLONG ClientSession;
7315 ULONGLONG ClientProcess;
7316 #endif
7317 } FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;
7318
7319 #define FILE_PIPE_COMPUTER_NAME_LENGTH 15
7320
7321 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX {
7322 #if !defined(BUILD_WOW6432)
7323 PVOID ClientSession;
7324 PVOID ClientProcess;
7325 #else
7326 ULONGLONG ClientSession;
7327 ULONGLONG ClientProcess;
7328 #endif
7329 USHORT ClientComputerNameLength;
7330 WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH+1];
7331 } FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX;
7332
7333 #define FSCTL_MAILSLOT_PEEK CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
7334
7335 typedef enum _LINK_TRACKING_INFORMATION_TYPE {
7336 NtfsLinkTrackingInformation,
7337 DfsLinkTrackingInformation
7338 } LINK_TRACKING_INFORMATION_TYPE, *PLINK_TRACKING_INFORMATION_TYPE;
7339
7340 typedef struct _LINK_TRACKING_INFORMATION {
7341 LINK_TRACKING_INFORMATION_TYPE Type;
7342 UCHAR VolumeId[16];
7343 } LINK_TRACKING_INFORMATION, *PLINK_TRACKING_INFORMATION;
7344
7345 typedef struct _REMOTE_LINK_TRACKING_INFORMATION {
7346 PVOID TargetFileObject;
7347 ULONG TargetLinkTrackingInformationLength;
7348 UCHAR TargetLinkTrackingInformationBuffer[1];
7349 } REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION;
7350
7351 #define IO_OPEN_PAGING_FILE 0x0002
7352 #define IO_OPEN_TARGET_DIRECTORY 0x0004
7353 #define IO_STOP_ON_SYMLINK 0x0008
7354 #define IO_MM_PAGING_FILE 0x0010
7355
7356 _Function_class_(DRIVER_FS_NOTIFICATION)
7357 typedef VOID
7358 (NTAPI DRIVER_FS_NOTIFICATION)(
7359 _In_ PDEVICE_OBJECT DeviceObject,
7360 _In_ BOOLEAN FsActive);
7361 typedef DRIVER_FS_NOTIFICATION *PDRIVER_FS_NOTIFICATION;
7362
7363 typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
7364 SyncTypeOther = 0,
7365 SyncTypeCreateSection
7366 } FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
7367
7368 typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
7369 NotifyTypeCreate = 0,
7370 NotifyTypeRetired
7371 } FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
7372
7373 typedef union _FS_FILTER_PARAMETERS {
7374 struct {
7375 PLARGE_INTEGER EndingOffset;
7376 PERESOURCE *ResourceToRelease;
7377 } AcquireForModifiedPageWriter;
7378 struct {
7379 PERESOURCE ResourceToRelease;
7380 } ReleaseForModifiedPageWriter;
7381 struct {
7382 FS_FILTER_SECTION_SYNC_TYPE SyncType;
7383 ULONG PageProtection;
7384 } AcquireForSectionSynchronization;
7385 struct {
7386 FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
7387 BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
7388 } NotifyStreamFileObject;
7389 struct {
7390 PVOID Argument1;
7391 PVOID Argument2;
7392 PVOID Argument3;
7393 PVOID Argument4;
7394 PVOID Argument5;
7395 } Others;
7396 } FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
7397
7398 #define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-1
7399 #define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-2
7400 #define FS_FILTER_ACQUIRE_FOR_MOD_WRITE (UCHAR)-3
7401 #define FS_FILTER_RELEASE_FOR_MOD_WRITE (UCHAR)-4
7402 #define FS_FILTER_ACQUIRE_FOR_CC_FLUSH (UCHAR)-5
7403 #define FS_FILTER_RELEASE_FOR_CC_FLUSH (UCHAR)-6
7404
7405 typedef struct _FS_FILTER_CALLBACK_DATA {
7406 ULONG SizeOfFsFilterCallbackData;
7407 UCHAR Operation;
7408 UCHAR Reserved;
7409 struct _DEVICE_OBJECT *DeviceObject;
7410 struct _FILE_OBJECT *FileObject;
7411 FS_FILTER_PARAMETERS Parameters;
7412 } FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
7413
7414 typedef NTSTATUS
7415 (NTAPI *PFS_FILTER_CALLBACK) (
7416 _In_ PFS_FILTER_CALLBACK_DATA Data,
7417 _Out_ PVOID *CompletionContext);
7418
7419 typedef VOID
7420 (NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
7421 _In_ PFS_FILTER_CALLBACK_DATA Data,
7422 _In_ NTSTATUS OperationStatus,
7423 _In_ PVOID CompletionContext);
7424
7425 typedef struct _FS_FILTER_CALLBACKS {
7426 ULONG SizeOfFsFilterCallbacks;
7427 ULONG Reserved;
7428 PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
7429 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
7430 PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
7431 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
7432 PFS_FILTER_CALLBACK PreAcquireForCcFlush;
7433 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
7434 PFS_FILTER_CALLBACK PreReleaseForCcFlush;
7435 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
7436 PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
7437 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
7438 PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
7439 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
7440 } FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
7441
7442 extern NTKERNELAPI KSPIN_LOCK IoStatisticsLock;
7443 extern NTKERNELAPI ULONG IoReadOperationCount;
7444 extern NTKERNELAPI ULONG IoWriteOperationCount;
7445 extern NTKERNELAPI ULONG IoOtherOperationCount;
7446 extern NTKERNELAPI LARGE_INTEGER IoReadTransferCount;
7447 extern NTKERNELAPI LARGE_INTEGER IoWriteTransferCount;
7448 extern NTKERNELAPI LARGE_INTEGER IoOtherTransferCount;
7449
7450 #define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64
7451 #define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024
7452
7453 #if (NTDDI_VERSION >= NTDDI_VISTA)
7454 typedef struct _IO_PRIORITY_INFO {
7455 ULONG Size;
7456 ULONG ThreadPriority;
7457 ULONG PagePriority;
7458 IO_PRIORITY_HINT IoPriority;
7459 } IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
7460 #endif
7461 $endif (_NTIFS_)
7462
7463 $if (_WDMDDK_)
7464
7465 #define D3COLD_SUPPORT_INTERFACE_VERSION 1
7466
7467 typedef
7468 _Function_class_(SET_D3COLD_SUPPORT)
7469 _IRQL_requires_(PASSIVE_LEVEL)
7470 VOID
7471 SET_D3COLD_SUPPORT(
7472 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context,
7473 _In_ BOOLEAN D3ColdSupport);
7474
7475 typedef SET_D3COLD_SUPPORT *PSET_D3COLD_SUPPORT;
7476
7477 typedef enum _DEVICE_WAKE_DEPTH
7478 {
7479 DeviceWakeDepthNotWakeable = 0,
7480 DeviceWakeDepthD0,
7481 DeviceWakeDepthD1,
7482 DeviceWakeDepthD2,
7483 DeviceWakeDepthD3hot,
7484 DeviceWakeDepthD3cold,
7485 DeviceWakeDepthMaximum
7486 } DEVICE_WAKE_DEPTH, *PDEVICE_WAKE_DEPTH;
7487
7488 FORCEINLINE
7489 DEVICE_POWER_STATE
MapWakeDepthToDstate(_In_ DEVICE_WAKE_DEPTH WakeDepth)7490 MapWakeDepthToDstate(
7491 _In_ DEVICE_WAKE_DEPTH WakeDepth)
7492 {
7493 const DEVICE_POWER_STATE dstateMap[DeviceWakeDepthMaximum] =
7494 {
7495 PowerDeviceD0,
7496 PowerDeviceD0,
7497 PowerDeviceD1,
7498 PowerDeviceD2,
7499 PowerDeviceD3,
7500 PowerDeviceD3
7501 };
7502
7503 if (WakeDepth < 0 || WakeDepth >= DeviceWakeDepthMaximum)
7504 {
7505 return PowerDeviceUnspecified;
7506 }
7507 else
7508 {
7509 return dstateMap[WakeDepth];
7510 }
7511 }
7512
7513 typedef
7514 _Function_class_(GET_IDLE_WAKE_INFO)
7515 _IRQL_requires_(PASSIVE_LEVEL)
7516 NTSTATUS
7517 GET_IDLE_WAKE_INFO(
7518 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context,
7519 _In_ SYSTEM_POWER_STATE SystemPowerState,
7520 _Out_ PDEVICE_WAKE_DEPTH DeepestWakeableDstate);
7521
7522 typedef GET_IDLE_WAKE_INFO *PGET_IDLE_WAKE_INFO;
7523
7524 typedef
7525 _Function_class_(GET_D3COLD_CAPABILITY)
7526 _IRQL_requires_(PASSIVE_LEVEL)
7527 NTSTATUS
7528 GET_D3COLD_CAPABILITY(
7529 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context,
7530 _Out_ PBOOLEAN D3ColdSupported);
7531
7532 typedef GET_D3COLD_CAPABILITY *PGET_D3COLD_CAPABILITY;
7533
7534 typedef enum _D3COLD_LAST_TRANSITION_STATUS
7535 {
7536 LastDStateTransitionStatusUnknown = 0,
7537 LastDStateTransitionD3hot,
7538 LastDStateTransitionD3cold
7539 } D3COLD_LAST_TRANSITION_STATUS, *PD3COLD_LAST_TRANSITION_STATUS;
7540
7541 typedef
7542 _Function_class_(GET_D3COLD_LAST_TRANSITION_STATUS)
7543 _IRQL_requires_max_(DISPATCH_LEVEL)
7544 VOID
7545 GET_D3COLD_LAST_TRANSITION_STATUS(
7546 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context,
7547 _Out_ PD3COLD_LAST_TRANSITION_STATUS LastTransitionStatus);
7548
7549 typedef GET_D3COLD_LAST_TRANSITION_STATUS *PGET_D3COLD_LAST_TRANSITION_STATUS;
7550
7551 typedef struct _D3COLD_SUPPORT_INTERFACE
7552 {
7553 USHORT Size;
7554 USHORT Version;
7555 PVOID Context;
7556 PINTERFACE_REFERENCE InterfaceReference;
7557 PINTERFACE_DEREFERENCE InterfaceDereference;
7558 PSET_D3COLD_SUPPORT SetD3ColdSupport;
7559 PGET_IDLE_WAKE_INFO GetIdleWakeInfo;
7560 PGET_D3COLD_CAPABILITY GetD3ColdCapability;
7561 PGET_D3COLD_CAPABILITY GetBusDriverD3ColdSupport;
7562 PGET_D3COLD_LAST_TRANSITION_STATUS GetLastTransitionStatus;
7563 } D3COLD_SUPPORT_INTERFACE, *PD3COLD_SUPPORT_INTERFACE;
7564
7565 typedef
7566 _Function_class_(D3COLD_REQUEST_CORE_POWER_RAIL)
7567 _IRQL_requires_(PASSIVE_LEVEL)
7568 VOID
7569 D3COLD_REQUEST_CORE_POWER_RAIL(
7570 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context,
7571 _In_ BOOLEAN CorePowerRailNeeded);
7572
7573 typedef D3COLD_REQUEST_CORE_POWER_RAIL *PD3COLD_REQUEST_CORE_POWER_RAIL;
7574
7575 typedef
7576 _Function_class_(D3COLD_REQUEST_AUX_POWER)
7577 _IRQL_requires_(PASSIVE_LEVEL)
7578 NTSTATUS
7579 D3COLD_REQUEST_AUX_POWER(
7580 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context,
7581 _In_ ULONG AuxPowerInMilliWatts,
7582 _Out_ PULONG RetryInSeconds);
7583
7584 typedef D3COLD_REQUEST_AUX_POWER *PD3COLD_REQUEST_AUX_POWER;
7585
7586 typedef
7587 _Function_class_(D3COLD_REQUEST_PERST_DELAY)
7588 _IRQL_requires_(PASSIVE_LEVEL)
7589 NTSTATUS
7590 D3COLD_REQUEST_PERST_DELAY(
7591 _In_reads_opt_(_Inexpressible_("varies")) PVOID Context,
7592 _In_ ULONG DelayInMicroSeconds);
7593
7594 typedef D3COLD_REQUEST_PERST_DELAY *PD3COLD_REQUEST_PERST_DELAY;
7595
7596 typedef struct _D3COLD_AUX_POWER_AND_TIMING_INTERFACE
7597 {
7598 USHORT Size;
7599 USHORT Version;
7600 PVOID Context;
7601 PINTERFACE_REFERENCE InterfaceReference;
7602 PINTERFACE_DEREFERENCE InterfaceDereference;
7603 PD3COLD_REQUEST_CORE_POWER_RAIL RequestCorePowerRail;
7604 PD3COLD_REQUEST_AUX_POWER RequestAuxPower;
7605 PD3COLD_REQUEST_PERST_DELAY RequestPerstDelay;
7606 } D3COLD_AUX_POWER_AND_TIMING_INTERFACE, *PD3COLD_AUX_POWER_AND_TIMING_INTERFACE;
7607 $endif(_WDMDDK_)
7608