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