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