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