[CMAKE]: Add a makefile to build the IDL files. Not perfect, but gets the job done.
[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 /* Some Server 2003 DDK definitions */
4867 #define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
4868
4869 typedef NTSTATUS
4870 (NTAPI *PLEGACY_DEVICE_DETECTION_HANDLER)(
4871 IN PVOID Context,
4872 IN INTERFACE_TYPE LegacyBusType,
4873 IN ULONG BusNumber,
4874 IN ULONG SlotNumber,
4875 OUT PDEVICE_OBJECT *PhysicalDeviceObject);
4876
4877 typedef struct _ROUTING_TOKEN {
4878 PVOID LinkNode;
4879 ULONG StaticVector;
4880 UCHAR Flags;
4881 } ROUTING_TOKEN, *PROUTING_TOKEN;
4882
4883 typedef NTSTATUS
4884 (NTAPI *PGET_INTERRUPT_ROUTING)(
4885 IN PDEVICE_OBJECT Pdo,
4886 OUT ULONG *Bus,
4887 OUT ULONG *PciSlot,
4888 OUT UCHAR *InterruptLine,
4889 OUT UCHAR *InterruptPin,
4890 OUT UCHAR *ClassCode,
4891 OUT UCHAR *SubClassCode,
4892 OUT PDEVICE_OBJECT *ParentPdo,
4893 OUT ROUTING_TOKEN *RoutingToken,
4894 OUT UCHAR *Flags);
4895
4896 typedef NTSTATUS
4897 (NTAPI *PSET_INTERRUPT_ROUTING_TOKEN)(
4898 IN PDEVICE_OBJECT Pdo,
4899 IN PROUTING_TOKEN RoutingToken);
4900
4901 typedef VOID
4902 (NTAPI *PUPDATE_INTERRUPT_LINE)(
4903 IN PDEVICE_OBJECT Pdo,
4904 IN UCHAR LineRegister);
4905
4906 typedef struct _INT_ROUTE_INTERFACE_STANDARD {
4907 USHORT Size;
4908 USHORT Version;
4909 PVOID Context;
4910 PINTERFACE_REFERENCE InterfaceReference;
4911 PINTERFACE_DEREFERENCE InterfaceDereference;
4912 PGET_INTERRUPT_ROUTING GetInterruptRouting;
4913 PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
4914 PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
4915 } INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
4916
4917 typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
4918 USHORT Size;
4919 USHORT Version;
4920 PVOID Context;
4921 PINTERFACE_REFERENCE InterfaceReference;
4922 PINTERFACE_DEREFERENCE InterfaceDereference;
4923 PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
4924 } LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
4925
4926 /* FIXME : These definitions don't exist in public headers */
4927
4928 #define PCI_CB_INTRF_VERSION 1
4929 #define PCI_PME_INTRF_STANDARD_VER 1
4930 #define PNP_LOCATION_INTERFACE_VERSION 1
4931
4932 DEFINE_GUID(GUID_PCI_CARDBUS_INTERFACE_PRIVATE, 0xcca82f31, 0x54d6, 0x11d1, 0x82, 0x24, 0x00, 0xa0, 0xc9, 0x32, 0x43, 0x85);
4933 DEFINE_GUID(GUID_PCI_PME_INTERFACE, 0xaac7e6ac, 0xbb0b, 0x11d2, 0xb4, 0x84, 0x00, 0xc0, 0x4f, 0x72, 0xde, 0x8b);
4934
4935 typedef NTSTATUS
4936 (NTAPI *PCARDBUSADD)(
4937 IN PDEVICE_OBJECT DeviceObject,
4938 IN OUT PVOID *DeviceContext);
4939
4940 typedef NTSTATUS
4941 (NTAPI *PCARDBUSDELETE)(
4942 IN PVOID DeviceContext);
4943
4944 typedef NTSTATUS
4945 (NTAPI *PCARDBUSPCIDISPATCH)(
4946 IN PVOID DeviceContext,
4947 IN PIRP Irp);
4948
4949 typedef VOID
4950 (NTAPI *PPME_SET_PME_ENABLE)(
4951 IN PDEVICE_OBJECT Pdo,
4952 IN BOOLEAN PmeEnable);
4953
4954 typedef VOID
4955 (NTAPI *PPME_CLEAR_PME_STATUS)(
4956 IN PDEVICE_OBJECT Pdo);
4957
4958 typedef VOID
4959 (NTAPI *PPME_GET_INFORMATION)(
4960 IN PDEVICE_OBJECT Pdo,
4961 OUT PBOOLEAN PmeCapable,
4962 OUT PBOOLEAN PmeStatus,
4963 OUT PBOOLEAN PmeEnable);
4964
4965 typedef struct _PCI_CARDBUS_INTERFACE_PRIVATE {
4966 USHORT Size;
4967 USHORT Version;
4968 PVOID Context;
4969 PINTERFACE_REFERENCE InterfaceReference;
4970 PINTERFACE_DEREFERENCE InterfaceDereference;
4971 PDRIVER_OBJECT DriverObject;
4972 PCARDBUSADD AddCardBus;
4973 PCARDBUSDELETE DeleteCardBus;
4974 PCARDBUSPCIDISPATCH DispatchPnp;
4975 } PCI_CARDBUS_INTERFACE_PRIVATE, *PPCI_CARDBUS_INTERFACE_PRIVATE;
4976
4977 typedef struct _PCI_PME_INTERFACE {
4978 USHORT Size;
4979 USHORT Version;
4980 PVOID Context;
4981 PINTERFACE_REFERENCE InterfaceReference;
4982 PINTERFACE_DEREFERENCE InterfaceDereference;
4983 PPME_GET_INFORMATION GetPmeInformation;
4984 PPME_CLEAR_PME_STATUS ClearPmeStatus;
4985 PPME_SET_PME_ENABLE UpdateEnable;
4986 } PCI_PME_INTERFACE, *PPCI_PME_INTERFACE;
4987
4988 $endif (_NTDDK_)
4989 $if (_NTIFS_)
4990
4991 #define FILE_OPLOCK_BROKEN_TO_LEVEL_2 0x00000007
4992 #define FILE_OPLOCK_BROKEN_TO_NONE 0x00000008
4993 #define FILE_OPBATCH_BREAK_UNDERWAY 0x00000009
4994
4995 /* also in winnt.h */
4996 #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
4997 #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
4998 #define FILE_NOTIFY_CHANGE_NAME 0x00000003
4999 #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
5000 #define FILE_NOTIFY_CHANGE_SIZE 0x00000008
5001 #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
5002 #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
5003 #define FILE_NOTIFY_CHANGE_CREATION 0x00000040
5004 #define FILE_NOTIFY_CHANGE_EA 0x00000080
5005 #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
5006 #define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
5007 #define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
5008 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
5009 #define FILE_NOTIFY_VALID_MASK 0x00000fff
5010
5011 #define FILE_ACTION_ADDED 0x00000001
5012 #define FILE_ACTION_REMOVED 0x00000002
5013 #define FILE_ACTION_MODIFIED 0x00000003
5014 #define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
5015 #define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
5016 #define FILE_ACTION_ADDED_STREAM 0x00000006
5017 #define FILE_ACTION_REMOVED_STREAM 0x00000007
5018 #define FILE_ACTION_MODIFIED_STREAM 0x00000008
5019 #define FILE_ACTION_REMOVED_BY_DELETE 0x00000009
5020 #define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A
5021 #define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B
5022 /* end winnt.h */
5023
5024 #define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
5025 #define FILE_PIPE_MESSAGE_TYPE 0x00000001
5026
5027 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
5028 #define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
5029
5030 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
5031 #define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
5032 #define FILE_PIPE_TYPE_VALID_MASK 0x00000003
5033
5034 #define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
5035 #define FILE_PIPE_MESSAGE_MODE 0x00000001
5036
5037 #define FILE_PIPE_QUEUE_OPERATION 0x00000000
5038 #define FILE_PIPE_COMPLETE_OPERATION 0x00000001
5039
5040 #define FILE_PIPE_INBOUND 0x00000000
5041 #define FILE_PIPE_OUTBOUND 0x00000001
5042 #define FILE_PIPE_FULL_DUPLEX 0x00000002
5043
5044 #define FILE_PIPE_DISCONNECTED_STATE 0x00000001
5045 #define FILE_PIPE_LISTENING_STATE 0x00000002
5046 #define FILE_PIPE_CONNECTED_STATE 0x00000003
5047 #define FILE_PIPE_CLOSING_STATE 0x00000004
5048
5049 #define FILE_PIPE_CLIENT_END 0x00000000
5050 #define FILE_PIPE_SERVER_END 0x00000001
5051
5052 #define FILE_CASE_SENSITIVE_SEARCH 0x00000001
5053 #define FILE_CASE_PRESERVED_NAMES 0x00000002
5054 #define FILE_UNICODE_ON_DISK 0x00000004
5055 #define FILE_PERSISTENT_ACLS 0x00000008
5056 #define FILE_FILE_COMPRESSION 0x00000010
5057 #define FILE_VOLUME_QUOTAS 0x00000020
5058 #define FILE_SUPPORTS_SPARSE_FILES 0x00000040
5059 #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
5060 #define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
5061 #define FILE_VOLUME_IS_COMPRESSED 0x00008000
5062 #define FILE_SUPPORTS_OBJECT_IDS 0x00010000
5063 #define FILE_SUPPORTS_ENCRYPTION 0x00020000
5064 #define FILE_NAMED_STREAMS 0x00040000
5065 #define FILE_READ_ONLY_VOLUME 0x00080000
5066 #define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
5067 #define FILE_SUPPORTS_TRANSACTIONS 0x00200000
5068 #define FILE_SUPPORTS_HARD_LINKS 0x00400000
5069 #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
5070 #define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
5071 #define FILE_SUPPORTS_USN_JOURNAL 0x02000000
5072
5073 #define FILE_NEED_EA 0x00000080
5074
5075 #define FILE_EA_TYPE_BINARY 0xfffe
5076 #define FILE_EA_TYPE_ASCII 0xfffd
5077 #define FILE_EA_TYPE_BITMAP 0xfffb
5078 #define FILE_EA_TYPE_METAFILE 0xfffa
5079 #define FILE_EA_TYPE_ICON 0xfff9
5080 #define FILE_EA_TYPE_EA 0xffee
5081 #define FILE_EA_TYPE_MVMT 0xffdf
5082 #define FILE_EA_TYPE_MVST 0xffde
5083 #define FILE_EA_TYPE_ASN1 0xffdd
5084 #define FILE_EA_TYPE_FAMILY_IDS 0xff01
5085
5086 typedef struct _FILE_NOTIFY_INFORMATION {
5087 ULONG NextEntryOffset;
5088 ULONG Action;
5089 ULONG FileNameLength;
5090 WCHAR FileName[1];
5091 } FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
5092
5093 typedef struct _FILE_DIRECTORY_INFORMATION {
5094 ULONG NextEntryOffset;
5095 ULONG FileIndex;
5096 LARGE_INTEGER CreationTime;
5097 LARGE_INTEGER LastAccessTime;
5098 LARGE_INTEGER LastWriteTime;
5099 LARGE_INTEGER ChangeTime;
5100 LARGE_INTEGER EndOfFile;
5101 LARGE_INTEGER AllocationSize;
5102 ULONG FileAttributes;
5103 ULONG FileNameLength;
5104 WCHAR FileName[1];
5105 } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
5106
5107 typedef struct _FILE_FULL_DIR_INFORMATION {
5108 ULONG NextEntryOffset;
5109 ULONG FileIndex;
5110 LARGE_INTEGER CreationTime;
5111 LARGE_INTEGER LastAccessTime;
5112 LARGE_INTEGER LastWriteTime;
5113 LARGE_INTEGER ChangeTime;
5114 LARGE_INTEGER EndOfFile;
5115 LARGE_INTEGER AllocationSize;
5116 ULONG FileAttributes;
5117 ULONG FileNameLength;
5118 ULONG EaSize;
5119 WCHAR FileName[1];
5120 } FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
5121
5122 typedef struct _FILE_ID_FULL_DIR_INFORMATION {
5123 ULONG NextEntryOffset;
5124 ULONG FileIndex;
5125 LARGE_INTEGER CreationTime;
5126 LARGE_INTEGER LastAccessTime;
5127 LARGE_INTEGER LastWriteTime;
5128 LARGE_INTEGER ChangeTime;
5129 LARGE_INTEGER EndOfFile;
5130 LARGE_INTEGER AllocationSize;
5131 ULONG FileAttributes;
5132 ULONG FileNameLength;
5133 ULONG EaSize;
5134 LARGE_INTEGER FileId;
5135 WCHAR FileName[1];
5136 } FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
5137
5138 typedef struct _FILE_BOTH_DIR_INFORMATION {
5139 ULONG NextEntryOffset;
5140 ULONG FileIndex;
5141 LARGE_INTEGER CreationTime;
5142 LARGE_INTEGER LastAccessTime;
5143 LARGE_INTEGER LastWriteTime;
5144 LARGE_INTEGER ChangeTime;
5145 LARGE_INTEGER EndOfFile;
5146 LARGE_INTEGER AllocationSize;
5147 ULONG FileAttributes;
5148 ULONG FileNameLength;
5149 ULONG EaSize;
5150 CCHAR ShortNameLength;
5151 WCHAR ShortName[12];
5152 WCHAR FileName[1];
5153 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
5154
5155 typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
5156 ULONG NextEntryOffset;
5157 ULONG FileIndex;
5158 LARGE_INTEGER CreationTime;
5159 LARGE_INTEGER LastAccessTime;
5160 LARGE_INTEGER LastWriteTime;
5161 LARGE_INTEGER ChangeTime;
5162 LARGE_INTEGER EndOfFile;
5163 LARGE_INTEGER AllocationSize;
5164 ULONG FileAttributes;
5165 ULONG FileNameLength;
5166 ULONG EaSize;
5167 CCHAR ShortNameLength;
5168 WCHAR ShortName[12];
5169 LARGE_INTEGER FileId;
5170 WCHAR FileName[1];
5171 } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
5172
5173 typedef struct _FILE_NAMES_INFORMATION {
5174 ULONG NextEntryOffset;
5175 ULONG FileIndex;
5176 ULONG FileNameLength;
5177 WCHAR FileName[1];
5178 } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
5179
5180 typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION {
5181 ULONG NextEntryOffset;
5182 ULONG FileIndex;
5183 LARGE_INTEGER CreationTime;
5184 LARGE_INTEGER LastAccessTime;
5185 LARGE_INTEGER LastWriteTime;
5186 LARGE_INTEGER ChangeTime;
5187 LARGE_INTEGER EndOfFile;
5188 LARGE_INTEGER AllocationSize;
5189 ULONG FileAttributes;
5190 ULONG FileNameLength;
5191 LARGE_INTEGER FileId;
5192 GUID LockingTransactionId;
5193 ULONG TxInfoFlags;
5194 WCHAR FileName[1];
5195 } FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
5196
5197 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED 0x00000001
5198 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX 0x00000002
5199 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX 0x00000004
5200
5201 typedef struct _FILE_OBJECTID_INFORMATION {
5202 LONGLONG FileReference;
5203 UCHAR ObjectId[16];
5204 _ANONYMOUS_UNION union {
5205 _ANONYMOUS_STRUCT struct {
5206 UCHAR BirthVolumeId[16];
5207 UCHAR BirthObjectId[16];
5208 UCHAR DomainId[16];
5209 } DUMMYSTRUCTNAME;
5210 UCHAR ExtendedInfo[48];
5211 } DUMMYUNIONNAME;
5212 } FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
5213
5214 #define ANSI_DOS_STAR ('<')
5215 #define ANSI_DOS_QM ('>')
5216 #define ANSI_DOS_DOT ('"')
5217
5218 #define DOS_STAR (L'<')
5219 #define DOS_QM (L'>')
5220 #define DOS_DOT (L'"')
5221
5222 typedef struct _FILE_INTERNAL_INFORMATION {
5223 LARGE_INTEGER IndexNumber;
5224 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
5225
5226 typedef struct _FILE_EA_INFORMATION {
5227 ULONG EaSize;
5228 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
5229
5230 typedef struct _FILE_ACCESS_INFORMATION {
5231 ACCESS_MASK AccessFlags;
5232 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
5233
5234 typedef struct _FILE_MODE_INFORMATION {
5235 ULONG Mode;
5236 } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
5237
5238 typedef struct _FILE_ALL_INFORMATION {
5239 FILE_BASIC_INFORMATION BasicInformation;
5240 FILE_STANDARD_INFORMATION StandardInformation;
5241 FILE_INTERNAL_INFORMATION InternalInformation;
5242 FILE_EA_INFORMATION EaInformation;
5243 FILE_ACCESS_INFORMATION AccessInformation;
5244 FILE_POSITION_INFORMATION PositionInformation;
5245 FILE_MODE_INFORMATION ModeInformation;
5246 FILE_ALIGNMENT_INFORMATION AlignmentInformation;
5247 FILE_NAME_INFORMATION NameInformation;
5248 } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
5249
5250 typedef struct _FILE_ALLOCATION_INFORMATION {
5251 LARGE_INTEGER AllocationSize;
5252 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
5253
5254 typedef struct _FILE_COMPRESSION_INFORMATION {
5255 LARGE_INTEGER CompressedFileSize;
5256 USHORT CompressionFormat;
5257 UCHAR CompressionUnitShift;
5258 UCHAR ChunkShift;
5259 UCHAR ClusterShift;
5260 UCHAR Reserved[3];
5261 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
5262
5263 typedef struct _FILE_LINK_INFORMATION {
5264 BOOLEAN ReplaceIfExists;
5265 HANDLE RootDirectory;
5266 ULONG FileNameLength;
5267 WCHAR FileName[1];
5268 } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
5269
5270 typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
5271 ULONG ClusterCount;
5272 HANDLE RootDirectory;
5273 ULONG FileNameLength;
5274 WCHAR FileName[1];
5275 } FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
5276
5277 typedef struct _FILE_RENAME_INFORMATION {
5278 BOOLEAN ReplaceIfExists;
5279 HANDLE RootDirectory;
5280 ULONG FileNameLength;
5281 WCHAR FileName[1];
5282 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
5283
5284 typedef struct _FILE_STREAM_INFORMATION {
5285 ULONG NextEntryOffset;
5286 ULONG StreamNameLength;
5287 LARGE_INTEGER StreamSize;
5288 LARGE_INTEGER StreamAllocationSize;
5289 WCHAR StreamName[1];
5290 } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
5291
5292 typedef struct _FILE_TRACKING_INFORMATION {
5293 HANDLE DestinationFile;
5294 ULONG ObjectInformationLength;
5295 CHAR ObjectInformation[1];
5296 } FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
5297
5298 typedef struct _FILE_COMPLETION_INFORMATION {
5299 HANDLE Port;
5300 PVOID Key;
5301 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
5302
5303 typedef struct _FILE_PIPE_INFORMATION {
5304 ULONG ReadMode;
5305 ULONG CompletionMode;
5306 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
5307
5308 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
5309 ULONG NamedPipeType;
5310 ULONG NamedPipeConfiguration;
5311 ULONG MaximumInstances;
5312 ULONG CurrentInstances;
5313 ULONG InboundQuota;
5314 ULONG ReadDataAvailable;
5315 ULONG OutboundQuota;
5316 ULONG WriteQuotaAvailable;
5317 ULONG NamedPipeState;
5318 ULONG NamedPipeEnd;
5319 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
5320
5321 typedef struct _FILE_PIPE_REMOTE_INFORMATION {
5322 LARGE_INTEGER CollectDataTime;
5323 ULONG MaximumCollectionCount;
5324 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
5325
5326 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
5327 ULONG MaximumMessageSize;
5328 ULONG MailslotQuota;
5329 ULONG NextMessageSize;
5330 ULONG MessagesAvailable;
5331 LARGE_INTEGER ReadTimeout;
5332 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
5333
5334 typedef struct _FILE_MAILSLOT_SET_INFORMATION {
5335 PLARGE_INTEGER ReadTimeout;
5336 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
5337
5338 typedef struct _FILE_REPARSE_POINT_INFORMATION {
5339 LONGLONG FileReference;
5340 ULONG Tag;
5341 } FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
5342
5343 typedef struct _FILE_LINK_ENTRY_INFORMATION {
5344 ULONG NextEntryOffset;
5345 LONGLONG ParentFileId;
5346 ULONG FileNameLength;
5347 WCHAR FileName[1];
5348 } FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
5349
5350 typedef struct _FILE_LINKS_INFORMATION {
5351 ULONG BytesNeeded;
5352 ULONG EntriesReturned;
5353 FILE_LINK_ENTRY_INFORMATION Entry;
5354 } FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;
5355
5356 typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
5357 ULONG FileNameLength;
5358 WCHAR FileName[1];
5359 } FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
5360
5361 typedef struct _FILE_STANDARD_LINK_INFORMATION {
5362 ULONG NumberOfAccessibleLinks;
5363 ULONG TotalNumberOfLinks;
5364 BOOLEAN DeletePending;
5365 BOOLEAN Directory;
5366 } FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;
5367
5368 typedef struct _FILE_GET_EA_INFORMATION {
5369 ULONG NextEntryOffset;
5370 UCHAR EaNameLength;
5371 CHAR EaName[1];
5372 } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
5373
5374 #define REMOTE_PROTOCOL_FLAG_LOOPBACK 0x00000001
5375 #define REMOTE_PROTOCOL_FLAG_OFFLINE 0x00000002
5376
5377 typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION {
5378 USHORT StructureVersion;
5379 USHORT StructureSize;
5380 ULONG Protocol;
5381 USHORT ProtocolMajorVersion;
5382 USHORT ProtocolMinorVersion;
5383 USHORT ProtocolRevision;
5384 USHORT Reserved;
5385 ULONG Flags;
5386 struct {
5387 ULONG Reserved[8];
5388 } GenericReserved;
5389 struct {
5390 ULONG Reserved[16];
5391 } ProtocolSpecificReserved;
5392 } FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;
5393
5394 typedef struct _FILE_GET_QUOTA_INFORMATION {
5395 ULONG NextEntryOffset;
5396 ULONG SidLength;
5397 SID Sid;
5398 } FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
5399
5400 typedef struct _FILE_QUOTA_INFORMATION {
5401 ULONG NextEntryOffset;
5402 ULONG SidLength;
5403 LARGE_INTEGER ChangeTime;
5404 LARGE_INTEGER QuotaUsed;
5405 LARGE_INTEGER QuotaThreshold;
5406 LARGE_INTEGER QuotaLimit;
5407 SID Sid;
5408 } FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
5409
5410 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
5411 ULONG FileSystemAttributes;
5412 ULONG MaximumComponentNameLength;
5413 ULONG FileSystemNameLength;
5414 WCHAR FileSystemName[1];
5415 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
5416
5417 typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
5418 BOOLEAN DriverInPath;
5419 ULONG DriverNameLength;
5420 WCHAR DriverName[1];
5421 } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
5422
5423 typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
5424 ULONG Flags;
5425 } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
5426
5427 #define FILE_VC_QUOTA_NONE 0x00000000
5428 #define FILE_VC_QUOTA_TRACK 0x00000001
5429 #define FILE_VC_QUOTA_ENFORCE 0x00000002
5430 #define FILE_VC_QUOTA_MASK 0x00000003
5431 #define FILE_VC_CONTENT_INDEX_DISABLED 0x00000008
5432 #define FILE_VC_LOG_QUOTA_THRESHOLD 0x00000010
5433 #define FILE_VC_LOG_QUOTA_LIMIT 0x00000020
5434 #define FILE_VC_LOG_VOLUME_THRESHOLD 0x00000040
5435 #define FILE_VC_LOG_VOLUME_LIMIT 0x00000080
5436 #define FILE_VC_QUOTAS_INCOMPLETE 0x00000100
5437 #define FILE_VC_QUOTAS_REBUILDING 0x00000200
5438 #define FILE_VC_VALID_MASK 0x000003ff
5439
5440 typedef struct _FILE_FS_CONTROL_INFORMATION {
5441 LARGE_INTEGER FreeSpaceStartFiltering;
5442 LARGE_INTEGER FreeSpaceThreshold;
5443 LARGE_INTEGER FreeSpaceStopFiltering;
5444 LARGE_INTEGER DefaultQuotaThreshold;
5445 LARGE_INTEGER DefaultQuotaLimit;
5446 ULONG FileSystemControlFlags;
5447 } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
5448
5449 #ifndef _FILESYSTEMFSCTL_
5450 #define _FILESYSTEMFSCTL_
5451
5452 #define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
5453 #define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
5454 #define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
5455 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
5456 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
5457 #define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
5458 #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
5459 #define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
5460 #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
5461 #define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
5462 #define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
5463 #define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
5464 #define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER, FILE_ANY_ACCESS)
5465 #define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
5466 #define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
5467 #define FSCTL_SET_BOOTLOADER_ACCESSED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS)
5468
5469 #define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
5470 #define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
5471 #define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
5472 #define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
5473 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
5474
5475 #if (_WIN32_WINNT >= 0x0400)
5476
5477 #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
5478 #define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
5479 #define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS)
5480 #define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS)
5481 #define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
5482 #define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
5483 #define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER, FILE_ANY_ACCESS)
5484
5485 #endif
5486
5487 #if (_WIN32_WINNT >= 0x0500)
5488
5489 #define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS)
5490 #define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
5491 #define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
5492 #define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
5493 #define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
5494 #define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
5495 #define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
5496 #define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER, FILE_READ_DATA)
5497 #define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER, FILE_READ_DATA)
5498 #define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER, FILE_READ_DATA)
5499 #define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
5500 #define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
5501 #define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
5502 #define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
5503 #define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA)
5504 #define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
5505 #define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
5506 #define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER, FILE_ANY_ACCESS)
5507 #define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER, FILE_ANY_ACCESS)
5508 #define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER, FILE_ANY_ACCESS)
5509 #define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER, FILE_READ_DATA)
5510 #define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER, FILE_READ_DATA)
5511 #define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER, FILE_READ_DATA)
5512 #define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
5513 #define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
5514 #define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
5515 #define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
5516 #define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
5517 #define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
5518 #define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
5519 #define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
5520 #define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5521
5522 #endif
5523
5524 #if (_WIN32_WINNT >= 0x0600)
5525
5526 #define FSCTL_MAKE_MEDIA_COMPATIBLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
5527 #define FSCTL_SET_DEFECT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
5528 #define FSCTL_QUERY_SPARING_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
5529 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
5530 #define FSCTL_SET_VOLUME_COMPRESSION_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5531 #define FSCTL_TXFS_MODIFY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA)
5532 #define FSCTL_TXFS_QUERY_RM_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA)
5533 #define FSCTL_TXFS_ROLLFORWARD_REDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA)
5534 #define FSCTL_TXFS_ROLLFORWARD_UNDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA)
5535 #define FSCTL_TXFS_START_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA)
5536 #define FSCTL_TXFS_SHUTDOWN_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
5537 #define FSCTL_TXFS_READ_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA)
5538 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA)
5539 #define FSCTL_TXFS_CREATE_SECONDARY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA)
5540 #define FSCTL_TXFS_GET_METADATA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA)
5541 #define FSCTL_TXFS_GET_TRANSACTED_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA)
5542 #define FSCTL_TXFS_SAVEPOINT_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA)
5543 #define FSCTL_TXFS_CREATE_MINIVERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
5544 #define FSCTL_TXFS_TRANSACTION_ACTIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA)
5545 #define FSCTL_SET_ZERO_ON_DEALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5546 #define FSCTL_SET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
5547 #define FSCTL_GET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
5548 #define FSCTL_WAIT_FOR_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
5549 #define FSCTL_INITIATE_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
5550 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
5551 #define FSCTL_SHRINK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5552 #define FSCTL_SET_SHORT_NAME_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
5553 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
5554
5555 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \
5556 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
5557 #define FSCTL_TXFS_LIST_TRANSACTIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
5558 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
5559 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
5560 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
5561
5562 #endif
5563
5564 #if (_WIN32_WINNT >= 0x0601)
5565
5566 #define FSCTL_QUERY_DEPENDENT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS)
5567 #define FSCTL_SD_GLOBAL_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS)
5568 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS)
5569 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS)
5570 #define FSCTL_FILE_TYPE_NOTIFICATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS)
5571 #define FSCTL_GET_BOOT_AREA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS)
5572 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS)
5573 #define FSCTL_SET_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
5574 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
5575
5576 #define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)
5577
5578 #define FSCTL_CSV_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
5579 #define FSCTL_IS_CSV_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
5580
5581 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS)
5582 #define FSCTL_CSV_GET_VOLUME_PATH_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS)
5583 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
5584 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150, METHOD_BUFFERED, FILE_ANY_ACCESS)
5585 #define FSCTL_IS_FILE_ON_CSV_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151, METHOD_BUFFERED, FILE_ANY_ACCESS)
5586
5587 typedef struct _CSV_NAMESPACE_INFO {
5588 ULONG Version;
5589 ULONG DeviceNumber;
5590 LARGE_INTEGER StartingOffset;
5591 ULONG SectorSize;
5592 } CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
5593
5594 #define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
5595 #define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
5596
5597 #endif
5598
5599 #define FSCTL_MARK_AS_SYSTEM_HIVE FSCTL_SET_BOOTLOADER_ACCESSED
5600
5601 typedef struct _PATHNAME_BUFFER {
5602 ULONG PathNameLength;
5603 WCHAR Name[1];
5604 } PATHNAME_BUFFER, *PPATHNAME_BUFFER;
5605
5606 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
5607 UCHAR First0x24BytesOfBootSector[0x24];
5608 } FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
5609
5610 #if (_WIN32_WINNT >= 0x0400)
5611
5612 typedef struct _NTFS_VOLUME_DATA_BUFFER {
5613 LARGE_INTEGER VolumeSerialNumber;
5614 LARGE_INTEGER NumberSectors;
5615 LARGE_INTEGER TotalClusters;
5616 LARGE_INTEGER FreeClusters;
5617 LARGE_INTEGER TotalReserved;
5618 ULONG BytesPerSector;
5619 ULONG BytesPerCluster;
5620 ULONG BytesPerFileRecordSegment;
5621 ULONG ClustersPerFileRecordSegment;
5622 LARGE_INTEGER MftValidDataLength;
5623 LARGE_INTEGER MftStartLcn;
5624 LARGE_INTEGER Mft2StartLcn;
5625 LARGE_INTEGER MftZoneStart;
5626 LARGE_INTEGER MftZoneEnd;
5627 } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
5628
5629 typedef struct _NTFS_EXTENDED_VOLUME_DATA {
5630 ULONG ByteCount;
5631 USHORT MajorVersion;
5632 USHORT MinorVersion;
5633 } NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
5634
5635 typedef struct _STARTING_LCN_INPUT_BUFFER {
5636 LARGE_INTEGER StartingLcn;
5637 } STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
5638
5639 typedef struct _VOLUME_BITMAP_BUFFER {
5640 LARGE_INTEGER StartingLcn;
5641 LARGE_INTEGER BitmapSize;
5642 UCHAR Buffer[1];
5643 } VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
5644
5645 typedef struct _STARTING_VCN_INPUT_BUFFER {
5646 LARGE_INTEGER StartingVcn;
5647 } STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
5648
5649 typedef struct _RETRIEVAL_POINTERS_BUFFER {
5650 ULONG ExtentCount;
5651 LARGE_INTEGER StartingVcn;
5652 struct {
5653 LARGE_INTEGER NextVcn;
5654 LARGE_INTEGER Lcn;
5655 } Extents[1];
5656 } RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
5657
5658 typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER {
5659 LARGE_INTEGER FileReferenceNumber;
5660 } NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
5661
5662 typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER {
5663 LARGE_INTEGER FileReferenceNumber;
5664 ULONG FileRecordLength;
5665 UCHAR FileRecordBuffer[1];
5666 } NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
5667
5668 typedef struct _MOVE_FILE_DATA {
5669 HANDLE FileHandle;
5670 LARGE_INTEGER StartingVcn;
5671 LARGE_INTEGER StartingLcn;
5672 ULONG ClusterCount;
5673 } MOVE_FILE_DATA, *PMOVE_FILE_DATA;
5674
5675 typedef struct _MOVE_FILE_RECORD_DATA {
5676 HANDLE FileHandle;
5677 LARGE_INTEGER SourceFileRecord;
5678 LARGE_INTEGER TargetFileRecord;
5679 } MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
5680
5681 #if defined(_WIN64)
5682 typedef struct _MOVE_FILE_DATA32 {
5683 UINT32 FileHandle;
5684 LARGE_INTEGER StartingVcn;
5685 LARGE_INTEGER StartingLcn;
5686 ULONG ClusterCount;
5687 } MOVE_FILE_DATA32, *PMOVE_FILE_DATA32;
5688 #endif
5689
5690 #endif /* (_WIN32_WINNT >= 0x0400) */
5691
5692 #if (_WIN32_WINNT >= 0x0500)
5693
5694 typedef struct _FIND_BY_SID_DATA {
5695 ULONG Restart;
5696 SID Sid;
5697 } FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
5698
5699 typedef struct _FIND_BY_SID_OUTPUT {
5700 ULONG NextEntryOffset;
5701 ULONG FileIndex;
5702 ULONG FileNameLength;
5703 WCHAR FileName[1];
5704 } FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
5705
5706 typedef struct _MFT_ENUM_DATA {
5707 ULONGLONG StartFileReferenceNumber;
5708 USN LowUsn;
5709 USN HighUsn;
5710 } MFT_ENUM_DATA, *PMFT_ENUM_DATA;
5711
5712 typedef struct _CREATE_USN_JOURNAL_DATA {
5713 ULONGLONG MaximumSize;
5714 ULONGLONG AllocationDelta;
5715 } CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
5716
5717 typedef struct _READ_USN_JOURNAL_DATA {
5718 USN StartUsn;
5719 ULONG ReasonMask;
5720 ULONG ReturnOnlyOnClose;
5721 ULONGLONG Timeout;
5722 ULONGLONG BytesToWaitFor;
5723 ULONGLONG UsnJournalID;
5724 } READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
5725
5726 typedef struct _USN_RECORD {
5727 ULONG RecordLength;
5728 USHORT MajorVersion;
5729 USHORT MinorVersion;
5730 ULONGLONG FileReferenceNumber;
5731 ULONGLONG ParentFileReferenceNumber;
5732 USN Usn;
5733 LARGE_INTEGER TimeStamp;
5734 ULONG Reason;
5735 ULONG SourceInfo;
5736 ULONG SecurityId;
5737 ULONG FileAttributes;
5738 USHORT FileNameLength;
5739 USHORT FileNameOffset;
5740 WCHAR FileName[1];
5741 } USN_RECORD, *PUSN_RECORD;
5742
5743 #define USN_PAGE_SIZE (0x1000)
5744
5745 #define USN_REASON_DATA_OVERWRITE (0x00000001)
5746 #define USN_REASON_DATA_EXTEND (0x00000002)
5747 #define USN_REASON_DATA_TRUNCATION (0x00000004)
5748 #define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010)
5749 #define USN_REASON_NAMED_DATA_EXTEND (0x00000020)
5750 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
5751 #define USN_REASON_FILE_CREATE (0x00000100)
5752 #define USN_REASON_FILE_DELETE (0x00000200)
5753 #define USN_REASON_EA_CHANGE (0x00000400)
5754 #define USN_REASON_SECURITY_CHANGE (0x00000800)
5755 #define USN_REASON_RENAME_OLD_NAME (0x00001000)
5756 #define USN_REASON_RENAME_NEW_NAME (0x00002000)
5757 #define USN_REASON_INDEXABLE_CHANGE (0x00004000)
5758 #define USN_REASON_BASIC_INFO_CHANGE (0x00008000)
5759 #define USN_REASON_HARD_LINK_CHANGE (0x00010000)
5760 #define USN_REASON_COMPRESSION_CHANGE (0x00020000)
5761 #define USN_REASON_ENCRYPTION_CHANGE (0x00040000)
5762 #define USN_REASON_OBJECT_ID_CHANGE (0x00080000)
5763 #define USN_REASON_REPARSE_POINT_CHANGE (0x00100000)
5764 #define USN_REASON_STREAM_CHANGE (0x00200000)
5765 #define USN_REASON_TRANSACTED_CHANGE (0x00400000)
5766 #define USN_REASON_CLOSE (0x80000000)
5767
5768 typedef struct _USN_JOURNAL_DATA {
5769 ULONGLONG UsnJournalID;
5770 USN FirstUsn;
5771 USN NextUsn;
5772 USN LowestValidUsn;
5773 USN MaxUsn;
5774 ULONGLONG MaximumSize;
5775 ULONGLONG AllocationDelta;
5776 } USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
5777
5778 typedef struct _DELETE_USN_JOURNAL_DATA {
5779 ULONGLONG UsnJournalID;
5780 ULONG DeleteFlags;
5781 } DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
5782
5783 #define USN_DELETE_FLAG_DELETE (0x00000001)
5784 #define USN_DELETE_FLAG_NOTIFY (0x00000002)
5785 #define USN_DELETE_VALID_FLAGS (0x00000003)
5786
5787 typedef struct _MARK_HANDLE_INFO {
5788 ULONG UsnSourceInfo;
5789 HANDLE VolumeHandle;
5790 ULONG HandleInfo;
5791 } MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
5792
5793 #if defined(_WIN64)
5794 typedef struct _MARK_HANDLE_INFO32 {
5795 ULONG UsnSourceInfo;
5796 UINT32 VolumeHandle;
5797 ULONG HandleInfo;
5798 } MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32;
5799 #endif
5800
5801 #define USN_SOURCE_DATA_MANAGEMENT (0x00000001)
5802 #define USN_SOURCE_AUXILIARY_DATA (0x00000002)
5803 #define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004)
5804
5805 #define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001)
5806 #define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004)
5807 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008)
5808
5809 typedef struct _BULK_SECURITY_TEST_DATA {
5810 ACCESS_MASK DesiredAccess;
5811 ULONG SecurityIds[1];
5812 } BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
5813
5814 #define VOLUME_IS_DIRTY (0x00000001)
5815 #define VOLUME_UPGRADE_SCHEDULED (0x00000002)
5816 #define VOLUME_SESSION_OPEN (0x00000004)
5817
5818 typedef struct _FILE_PREFETCH {
5819 ULONG Type;
5820 ULONG Count;
5821 ULONGLONG Prefetch[1];
5822 } FILE_PREFETCH, *PFILE_PREFETCH;
5823
5824 typedef struct _FILE_PREFETCH_EX {
5825 ULONG Type;
5826 ULONG Count;
5827 PVOID Context;
5828 ULONGLONG Prefetch[1];
5829 } FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
5830
5831 #define FILE_PREFETCH_TYPE_FOR_CREATE 0x1
5832 #define FILE_PREFETCH_TYPE_FOR_DIRENUM 0x2
5833 #define FILE_PREFETCH_TYPE_FOR_CREATE_EX 0x3
5834 #define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX 0x4
5835
5836 #define FILE_PREFETCH_TYPE_MAX 0x4
5837
5838 typedef struct _FILE_OBJECTID_BUFFER {
5839 UCHAR ObjectId[16];
5840 _ANONYMOUS_UNION union {
5841 _ANONYMOUS_STRUCT struct {
5842 UCHAR BirthVolumeId[16];
5843 UCHAR BirthObjectId[16];
5844 UCHAR DomainId[16];
5845 } DUMMYSTRUCTNAME;
5846 UCHAR ExtendedInfo[48];
5847 } DUMMYUNIONNAME;
5848 } FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
5849
5850 typedef struct _FILE_SET_SPARSE_BUFFER {
5851 BOOLEAN SetSparse;
5852 } FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
5853
5854 typedef struct _FILE_ZERO_DATA_INFORMATION {
5855 LARGE_INTEGER FileOffset;
5856 LARGE_INTEGER BeyondFinalZero;
5857 } FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
5858
5859 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
5860 LARGE_INTEGER FileOffset;
5861 LARGE_INTEGER Length;
5862 } FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
5863
5864 typedef struct _ENCRYPTION_BUFFER {
5865 ULONG EncryptionOperation;
5866 UCHAR Private[1];
5867 } ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
5868
5869 #define FILE_SET_ENCRYPTION 0x00000001
5870 #define FILE_CLEAR_ENCRYPTION 0x00000002
5871 #define STREAM_SET_ENCRYPTION 0x00000003
5872 #define STREAM_CLEAR_ENCRYPTION 0x00000004
5873
5874 #define MAXIMUM_ENCRYPTION_VALUE 0x00000004
5875
5876 typedef struct _DECRYPTION_STATUS_BUFFER {
5877 BOOLEAN NoEncryptedStreams;
5878 } DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
5879
5880 #define ENCRYPTION_FORMAT_DEFAULT (0x01)
5881
5882 #define COMPRESSION_FORMAT_SPARSE (0x4000)
5883
5884 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
5885 LONGLONG FileOffset;
5886 ULONG Length;
5887 } REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
5888
5889 typedef struct _ENCRYPTED_DATA_INFO {
5890 ULONGLONG StartingFileOffset;
5891 ULONG OutputBufferOffset;
5892 ULONG BytesWithinFileSize;
5893 ULONG BytesWithinValidDataLength;
5894 USHORT CompressionFormat;
5895 UCHAR DataUnitShift;
5896 UCHAR ChunkShift;
5897 UCHAR ClusterShift;
5898 UCHAR EncryptionFormat;
5899 USHORT NumberOfDataBlocks;
5900 ULONG DataBlockSize[ANYSIZE_ARRAY];
5901 } ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO;
5902
5903 typedef struct _PLEX_READ_DATA_REQUEST {
5904 LARGE_INTEGER ByteOffset;
5905 ULONG ByteLength;
5906 ULONG PlexNumber;
5907 } PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
5908
5909 typedef struct _SI_COPYFILE {
5910 ULONG SourceFileNameLength;
5911 ULONG DestinationFileNameLength;
5912 ULONG Flags;
5913 WCHAR FileNameBuffer[1];
5914 } SI_COPYFILE, *PSI_COPYFILE;
5915
5916 #define COPYFILE_SIS_LINK 0x0001
5917 #define COPYFILE_SIS_REPLACE 0x0002
5918 #define COPYFILE_SIS_FLAGS 0x0003
5919
5920 #endif /* (_WIN32_WINNT >= 0x0500) */
5921
5922 #if (_WIN32_WINNT >= 0x0600)
5923
5924 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
5925 BOOLEAN CloseDisc;
5926 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
5927
5928 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
5929 BOOLEAN Disable;
5930 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
5931
5932 typedef struct _FILE_QUERY_SPARING_BUFFER {
5933 ULONG SparingUnitBytes;
5934 BOOLEAN SoftwareSparing;
5935 ULONG TotalSpareBlocks;
5936 ULONG FreeSpareBlocks;
5937 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
5938
5939 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
5940 LARGE_INTEGER DirectoryCount;
5941 LARGE_INTEGER FileCount;
5942 USHORT FsFormatMajVersion;
5943 USHORT FsFormatMinVersion;
5944 WCHAR FsFormatName[12];
5945 LARGE_INTEGER FormatTime;
5946 LARGE_INTEGER LastUpdateTime;
5947 WCHAR CopyrightInfo[34];
5948 WCHAR AbstractInfo[34];
5949 WCHAR FormattingImplementationInfo[34];
5950 WCHAR LastModifyingImplementationInfo[34];
5951 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
5952
5953 #define SET_REPAIR_ENABLED (0x00000001)
5954 #define SET_REPAIR_VOLUME_BITMAP_SCAN (0x00000002)
5955 #define SET_REPAIR_DELETE_CROSSLINK (0x00000004)
5956 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS (0x00000008)
5957 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT (0x00000010)
5958 #define SET_REPAIR_VALID_MASK (0x0000001F)
5959
5960 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
5961 ShrinkPrepare = 1,
5962 ShrinkCommit,
5963 ShrinkAbort
5964 } SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES;
5965
5966 typedef struct _SHRINK_VOLUME_INFORMATION {
5967 SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
5968 ULONGLONG Flags;
5969 LONGLONG NewNumberOfSectors;
5970 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
5971
5972 #define TXFS_RM_FLAG_LOGGING_MODE 0x00000001
5973 #define TXFS_RM_FLAG_RENAME_RM 0x00000002
5974 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000004
5975 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000008
5976 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000010
5977 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000020
5978 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000040
5979 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000080
5980 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000100
5981 #define TXFS_RM_FLAG_GROW_LOG 0x00000400
5982 #define TXFS_RM_FLAG_SHRINK_LOG 0x00000800
5983 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE 0x00001000
5984 #define TXFS_RM_FLAG_PRESERVE_CHANGES 0x00002000
5985 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START 0x00004000
5986 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START 0x00008000
5987 #define TXFS_RM_FLAG_PREFER_CONSISTENCY 0x00010000
5988 #define TXFS_RM_FLAG_PREFER_AVAILABILITY 0x00020000
5989
5990 #define TXFS_LOGGING_MODE_SIMPLE (0x0001)
5991 #define TXFS_LOGGING_MODE_FULL (0x0002)
5992
5993 #define TXFS_TRANSACTION_STATE_NONE 0x00
5994 #define TXFS_TRANSACTION_STATE_ACTIVE 0x01
5995 #define TXFS_TRANSACTION_STATE_PREPARED 0x02
5996 #define TXFS_TRANSACTION_STATE_NOTACTIVE 0x03
5997
5998 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE | \
5999 TXFS_RM_FLAG_RENAME_RM | \
6000 TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
6001 TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
6002 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6003 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6004 TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
6005 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6006 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
6007 TXFS_RM_FLAG_SHRINK_LOG | \
6008 TXFS_RM_FLAG_GROW_LOG | \
6009 TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE | \
6010 TXFS_RM_FLAG_PRESERVE_CHANGES | \
6011 TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
6012 TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
6013 TXFS_RM_FLAG_PREFER_CONSISTENCY | \
6014 TXFS_RM_FLAG_PREFER_AVAILABILITY)
6015
6016 typedef struct _TXFS_MODIFY_RM {
6017 ULONG Flags;
6018 ULONG LogContainerCountMax;
6019 ULONG LogContainerCountMin;
6020 ULONG LogContainerCount;
6021 ULONG LogGrowthIncrement;
6022 ULONG LogAutoShrinkPercentage;
6023 ULONGLONG Reserved;
6024 USHORT LoggingMode;
6025 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
6026
6027 #define TXFS_RM_STATE_NOT_STARTED 0
6028 #define TXFS_RM_STATE_STARTING 1
6029 #define TXFS_RM_STATE_ACTIVE 2
6030 #define TXFS_RM_STATE_SHUTTING_DOWN 3
6031
6032 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS \
6033 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6034 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6035 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6036 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
6037 TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
6038 TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
6039 TXFS_RM_FLAG_PREFER_CONSISTENCY | \
6040 TXFS_RM_FLAG_PREFER_AVAILABILITY)
6041
6042 typedef struct _TXFS_QUERY_RM_INFORMATION {
6043 ULONG BytesRequired;
6044 ULONGLONG TailLsn;
6045 ULONGLONG CurrentLsn;
6046 ULONGLONG ArchiveTailLsn;
6047 ULONGLONG LogContainerSize;
6048 LARGE_INTEGER HighestVirtualClock;
6049 ULONG LogContainerCount;
6050 ULONG LogContainerCountMax;
6051 ULONG LogContainerCountMin;
6052 ULONG LogGrowthIncrement;
6053 ULONG LogAutoShrinkPercentage;
6054 ULONG Flags;
6055 USHORT LoggingMode;
6056 USHORT Reserved;
6057 ULONG RmState;
6058 ULONGLONG LogCapacity;
6059 ULONGLONG LogFree;
6060 ULONGLONG TopsSize;
6061 ULONGLONG TopsUsed;
6062 ULONGLONG TransactionCount;
6063 ULONGLONG OnePCCount;
6064 ULONGLONG TwoPCCount;
6065 ULONGLONG NumberLogFileFull;
6066 ULONGLONG OldestTransactionAge;
6067 GUID RMName;
6068 ULONG TmLogPathOffset;
6069 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
6070
6071 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN 0x01
6072 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK 0x02
6073
6074 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS \
6075 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN | \
6076 TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
6077
6078 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
6079 LARGE_INTEGER LastVirtualClock;
6080 ULONGLONG LastRedoLsn;
6081 ULONGLONG HighestRecoveryLsn;
6082 ULONG Flags;
6083 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
6084
6085 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000001
6086 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000002
6087 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE 0x00000004
6088 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000008
6089 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000010
6090 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000020
6091 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000040
6092 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000080
6093
6094 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT 0x00000200
6095 #define TXFS_START_RM_FLAG_LOGGING_MODE 0x00000400
6096 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES 0x00000800
6097
6098 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY 0x00001000
6099 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY 0x00002000
6100
6101 #define TXFS_START_RM_VALID_FLAGS \
6102 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
6103 TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
6104 TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE | \
6105 TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6106 TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6107 TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
6108 TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT | \
6109 TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6110 TXFS_START_RM_FLAG_LOGGING_MODE | \
6111 TXFS_START_RM_FLAG_PRESERVE_CHANGES | \
6112 TXFS_START_RM_FLAG_PREFER_CONSISTENCY | \
6113 TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
6114
6115 typedef struct _TXFS_START_RM_INFORMATION {
6116 ULONG Flags;
6117 ULONGLONG LogContainerSize;
6118 ULONG LogContainerCountMin;
6119 ULONG LogContainerCountMax;
6120 ULONG LogGrowthIncrement;
6121 ULONG LogAutoShrinkPercentage;
6122 ULONG TmLogPathOffset;
6123 USHORT TmLogPathLength;
6124 USHORT LoggingMode;
6125 USHORT LogPathLength;
6126 USHORT Reserved;
6127 WCHAR LogPath[1];
6128 } TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
6129
6130 typedef struct _TXFS_GET_METADATA_INFO_OUT {
6131 struct {
6132 LONGLONG LowPart;
6133 LONGLONG HighPart;
6134 } TxfFileId;
6135 GUID LockingTransaction;
6136 ULONGLONG LastLsn;
6137 ULONG TransactionState;
6138 } TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
6139
6140 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED 0x00000001
6141 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED 0x00000002
6142
6143 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
6144 ULONGLONG Offset;
6145 ULONG NameFlags;
6146 LONGLONG FileId;
6147 ULONG Reserved1;
6148 ULONG Reserved2;
6149 LONGLONG Reserved3;
6150 WCHAR FileName[1];
6151 } TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
6152
6153 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
6154 GUID KtmTransaction;
6155 ULONGLONG NumberOfFiles;
6156 ULONGLONG BufferSizeRequired;
6157 ULONGLONG Offset;
6158 } TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
6159
6160 typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
6161 GUID TransactionId;
6162 ULONG TransactionState;
6163 ULONG Reserved1;
6164 ULONG Reserved2;
6165 LONGLONG Reserved3;
6166 } TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
6167
6168 typedef struct _TXFS_LIST_TRANSACTIONS {
6169 ULONGLONG NumberOfTransactions;
6170 ULONGLONG BufferSizeRequired;
6171 } TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
6172
6173 typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
6174 _ANONYMOUS_UNION union {
6175 ULONG BufferLength;
6176 UCHAR Buffer[1];
6177 } DUMMYUNIONNAME;
6178 } TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
6179
6180 typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
6181 UCHAR Buffer[1];
6182 } TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
6183
6184 #define TXFS_TRANSACTED_VERSION_NONTRANSACTED 0xFFFFFFFE
6185 #define TXFS_TRANSACTED_VERSION_UNCOMMITTED 0xFFFFFFFF
6186
6187 typedef struct _TXFS_GET_TRANSACTED_VERSION {
6188 ULONG ThisBaseVersion;
6189 ULONG LatestVersion;
6190 USHORT ThisMiniVersion;
6191 USHORT FirstMiniVersion;
6192 USHORT LatestMiniVersion;
6193 } TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
6194
6195 #define TXFS_SAVEPOINT_SET 0x00000001
6196 #define TXFS_SAVEPOINT_ROLLBACK 0x00000002
6197 #define TXFS_SAVEPOINT_CLEAR 0x00000004
6198 #define TXFS_SAVEPOINT_CLEAR_ALL 0x00000010
6199
6200 typedef struct _TXFS_SAVEPOINT_INFORMATION {
6201 HANDLE KtmTransaction;
6202 ULONG ActionCode;
6203 ULONG SavepointId;
6204 } TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
6205
6206 typedef struct _TXFS_CREATE_MINIVERSION_INFO {
6207 USHORT StructureVersion;
6208 USHORT StructureLength;
6209 ULONG BaseVersion;
6210 USHORT MiniVersion;
6211 } TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
6212
6213 typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
6214 BOOLEAN TransactionsActiveAtSnapshot;
6215 } TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
6216
6217 #endif /* (_WIN32_WINNT >= 0x0600) */
6218
6219 #if (_WIN32_WINNT >= 0x0601)
6220
6221 #define MARK_HANDLE_REALTIME (0x00000020)
6222 #define MARK_HANDLE_NOT_REALTIME (0x00000040)
6223
6224 #define NO_8DOT3_NAME_PRESENT (0x00000001)
6225 #define REMOVED_8DOT3_NAME (0x00000002)
6226
6227 #define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED (0x00000001)
6228
6229 typedef struct _BOOT_AREA_INFO {
6230 ULONG BootSectorCount;
6231 struct {
6232 LARGE_INTEGER Offset;
6233 } BootSectors[2];
6234 } BOOT_AREA_INFO, *PBOOT_AREA_INFO;
6235
6236 typedef struct _RETRIEVAL_POINTER_BASE {
6237 LARGE_INTEGER FileAreaOffset;
6238 } RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
6239
6240 typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION {
6241 ULONG VolumeFlags;
6242 ULONG FlagMask;
6243 ULONG Version;
6244 ULONG Reserved;
6245 } FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION;
6246
6247 typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
6248 CHAR FileSystem[9];
6249 } FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
6250
6251 #define OPLOCK_LEVEL_CACHE_READ (0x00000001)
6252 #define OPLOCK_LEVEL_CACHE_HANDLE (0x00000002)
6253 #define OPLOCK_LEVEL_CACHE_WRITE (0x00000004)
6254
6255 #define REQUEST_OPLOCK_INPUT_FLAG_REQUEST (0x00000001)
6256 #define REQUEST_OPLOCK_INPUT_FLAG_ACK (0x00000002)
6257 #define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)
6258
6259 #define REQUEST_OPLOCK_CURRENT_VERSION 1
6260
6261 typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
6262 USHORT StructureVersion;
6263 USHORT StructureLength;
6264 ULONG RequestedOplockLevel;
6265 ULONG Flags;
6266 } REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
6267
6268 #define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED (0x00000001)
6269 #define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED (0x00000002)
6270
6271 typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
6272 USHORT StructureVersion;
6273 USHORT StructureLength;
6274 ULONG OriginalOplockLevel;
6275 ULONG NewOplockLevel;
6276 ULONG Flags;
6277 ACCESS_MASK AccessMode;
6278 USHORT ShareMode;
6279 } REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
6280
6281 #define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID 1
6282
6283 typedef struct _SD_CHANGE_MACHINE_SID_INPUT {
6284 USHORT CurrentMachineSIDOffset;
6285 USHORT CurrentMachineSIDLength;
6286 USHORT NewMachineSIDOffset;
6287 USHORT NewMachineSIDLength;
6288 } SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT;
6289
6290 typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
6291 ULONGLONG NumSDChangedSuccess;
6292 ULONGLONG NumSDChangedFail;
6293 ULONGLONG NumSDUnused;
6294 ULONGLONG NumSDTotal;
6295 ULONGLONG NumMftSDChangedSuccess;
6296 ULONGLONG NumMftSDChangedFail;
6297 ULONGLONG NumMftSDTotal;
6298 } SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT;
6299
6300 typedef struct _SD_GLOBAL_CHANGE_INPUT {
6301 ULONG Flags;
6302 ULONG ChangeType;
6303 _ANONYMOUS_UNION union {
6304 SD_CHANGE_MACHINE_SID_INPUT SdChange;
6305 } DUMMYUNIONNAME;
6306 } SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT;
6307
6308 typedef struct _SD_GLOBAL_CHANGE_OUTPUT {
6309 ULONG Flags;
6310 ULONG ChangeType;
6311 _ANONYMOUS_UNION union {
6312 SD_CHANGE_MACHINE_SID_OUTPUT SdChange;
6313 } DUMMYUNIONNAME;
6314 } SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT;
6315
6316 #define ENCRYPTED_DATA_INFO_SPARSE_FILE 1
6317
6318 typedef struct _EXTENDED_ENCRYPTED_DATA_INFO {
6319 ULONG ExtendedCode;
6320 ULONG Length;
6321 ULONG Flags;
6322 ULONG Reserved;
6323 } EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO;
6324
6325 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
6326 ULONG Flags;
6327 ULONG NumberOfClusters;
6328 LARGE_INTEGER Cluster[1];
6329 } LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
6330
6331 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
6332 ULONG Offset;
6333 ULONG NumberOfMatches;
6334 ULONG BufferSizeRequired;
6335 } LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
6336
6337 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE 0x00000001
6338 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET 0x00000002
6339 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE 0x00000004
6340 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE 0x00000008
6341
6342 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK 0xff000000
6343 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA 0x01000000
6344 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX 0x02000000
6345 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM 0x03000000
6346
6347 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
6348 ULONG OffsetToNext;
6349 ULONG Flags;
6350 LARGE_INTEGER Reserved;
6351 LARGE_INTEGER Cluster;
6352 WCHAR FileName[1];
6353 } LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
6354
6355 typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
6356 ULONG Flags;
6357 ULONG NumFileTypeIDs;
6358 GUID FileTypeID[1];
6359 } FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT;
6360
6361 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN 0x00000001
6362 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END 0x00000002
6363
6364 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE, 0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c);
6365 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE, 0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7);
6366 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE, 0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9);
6367
6368 #ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
6369 #define _VIRTUAL_STORAGE_TYPE_DEFINED
6370 typedef struct _VIRTUAL_STORAGE_TYPE {
6371 ULONG DeviceId;
6372 GUID VendorId;
6373 } VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
6374 #endif
6375
6376 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST {
6377 ULONG RequestLevel;
6378 ULONG RequestFlags;
6379 } STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST, *PSTORAGE_QUERY_DEPENDENT_VOLUME_REQUEST;
6380
6381 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_HOST_VOLUMES 0x1
6382 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_GUEST_VOLUMES 0x2
6383
6384 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY {
6385 ULONG EntryLength;
6386 ULONG DependencyTypeFlags;
6387 ULONG ProviderSpecificFlags;
6388 VIRTUAL_STORAGE_TYPE VirtualStorageType;
6389 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY;
6390
6391 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY {
6392 ULONG EntryLength;
6393 ULONG DependencyTypeFlags;
6394 ULONG ProviderSpecificFlags;
6395 VIRTUAL_STORAGE_TYPE VirtualStorageType;
6396 ULONG AncestorLevel;
6397 ULONG HostVolumeNameOffset;
6398 ULONG HostVolumeNameSize;
6399 ULONG DependentVolumeNameOffset;
6400 ULONG DependentVolumeNameSize;
6401 ULONG RelativePathOffset;
6402 ULONG RelativePathSize;
6403 ULONG DependentDeviceNameOffset;
6404 ULONG DependentDeviceNameSize;
6405 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY;
6406
6407 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE {
6408 ULONG ResponseLevel;
6409 ULONG NumberEntries;
6410 _ANONYMOUS_UNION union {
6411 STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[];
6412 STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[];
6413 } DUMMYUNIONNAME;
6414 } STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE;
6415
6416 #endif /* (_WIN32_WINNT >= 0x0601) */
6417
6418 typedef struct _FILESYSTEM_STATISTICS {
6419 USHORT FileSystemType;
6420 USHORT Version;
6421 ULONG SizeOfCompleteStructure;
6422 ULONG UserFileReads;
6423 ULONG UserFileReadBytes;
6424 ULONG UserDiskReads;
6425 ULONG UserFileWrites;
6426 ULONG UserFileWriteBytes;
6427 ULONG UserDiskWrites;
6428 ULONG MetaDataReads;
6429 ULONG MetaDataReadBytes;
6430 ULONG MetaDataDiskReads;
6431 ULONG MetaDataWrites;
6432 ULONG MetaDataWriteBytes;
6433 ULONG MetaDataDiskWrites;
6434 } FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
6435
6436 #define FILESYSTEM_STATISTICS_TYPE_NTFS 1
6437 #define FILESYSTEM_STATISTICS_TYPE_FAT 2
6438 #define FILESYSTEM_STATISTICS_TYPE_EXFAT 3
6439
6440 typedef struct _FAT_STATISTICS {
6441 ULONG CreateHits;
6442 ULONG SuccessfulCreates;
6443 ULONG FailedCreates;
6444 ULONG NonCachedReads;
6445 ULONG NonCachedReadBytes;
6446 ULONG NonCachedWrites;
6447 ULONG NonCachedWriteBytes;
6448 ULONG NonCachedDiskReads;
6449 ULONG NonCachedDiskWrites;
6450 } FAT_STATISTICS, *PFAT_STATISTICS;
6451
6452 typedef struct _EXFAT_STATISTICS {
6453 ULONG CreateHits;
6454 ULONG SuccessfulCreates;
6455 ULONG FailedCreates;
6456 ULONG NonCachedReads;
6457 ULONG NonCachedReadBytes;
6458 ULONG NonCachedWrites;
6459 ULONG NonCachedWriteBytes;
6460 ULONG NonCachedDiskReads;
6461 ULONG NonCachedDiskWrites;
6462 } EXFAT_STATISTICS, *PEXFAT_STATISTICS;
6463
6464 typedef struct _NTFS_STATISTICS {
6465 ULONG LogFileFullExceptions;
6466 ULONG OtherExceptions;
6467 ULONG MftReads;
6468 ULONG MftReadBytes;
6469 ULONG MftWrites;
6470 ULONG MftWriteBytes;
6471 struct {
6472 USHORT Write;
6473 USHORT Create;
6474 USHORT SetInfo;
6475 USHORT Flush;
6476 } MftWritesUserLevel;
6477 USHORT MftWritesFlushForLogFileFull;
6478 USHORT MftWritesLazyWriter;
6479 USHORT MftWritesUserRequest;
6480 ULONG Mft2Writes;
6481 ULONG Mft2WriteBytes;
6482 struct {
6483 USHORT Write;
6484 USHORT Create;
6485 USHORT SetInfo;
6486 USHORT Flush;
6487 } Mft2WritesUserLevel;
6488 USHORT Mft2WritesFlushForLogFileFull;
6489 USHORT Mft2WritesLazyWriter;
6490 USHORT Mft2WritesUserRequest;
6491 ULONG RootIndexReads;
6492 ULONG RootIndexReadBytes;
6493 ULONG RootIndexWrites;
6494 ULONG RootIndexWriteBytes;
6495 ULONG BitmapReads;
6496 ULONG BitmapReadBytes;
6497 ULONG BitmapWrites;
6498 ULONG BitmapWriteBytes;
6499 USHORT BitmapWritesFlushForLogFileFull;
6500 USHORT BitmapWritesLazyWriter;
6501 USHORT BitmapWritesUserRequest;
6502 struct {
6503 USHORT Write;
6504 USHORT Create;
6505 USHORT SetInfo;
6506 } BitmapWritesUserLevel;
6507 ULONG MftBitmapReads;
6508 ULONG MftBitmapReadBytes;
6509 ULONG MftBitmapWrites;
6510 ULONG MftBitmapWriteBytes;
6511 USHORT MftBitmapWritesFlushForLogFileFull;
6512 USHORT MftBitmapWritesLazyWriter;
6513 USHORT MftBitmapWritesUserRequest;
6514 struct {
6515 USHORT Write;
6516 USHORT Create;
6517 USHORT SetInfo;
6518 USHORT Flush;
6519 } MftBitmapWritesUserLevel;
6520 ULONG UserIndexReads;
6521 ULONG UserIndexReadBytes;
6522 ULONG UserIndexWrites;
6523 ULONG UserIndexWriteBytes;
6524 ULONG LogFileReads;
6525 ULONG LogFileReadBytes;
6526 ULONG LogFileWrites;
6527 ULONG LogFileWriteBytes;
6528 struct {
6529 ULONG Calls;
6530 ULONG Clusters;
6531 ULONG Hints;
6532 ULONG RunsReturned;
6533 ULONG HintsHonored;
6534 ULONG HintsClusters;
6535 ULONG Cache;
6536 ULONG CacheClusters;
6537 ULONG CacheMiss;
6538 ULONG CacheMissClusters;
6539 } Allocate;
6540 } NTFS_STATISTICS, *PNTFS_STATISTICS;
6541
6542 #endif /* _FILESYSTEMFSCTL_ */
6543
6544 #define SYMLINK_FLAG_RELATIVE 1
6545
6546 typedef struct _REPARSE_DATA_BUFFER {
6547 ULONG ReparseTag;
6548 USHORT ReparseDataLength;
6549 USHORT Reserved;
6550 _ANONYMOUS_UNION union {
6551 struct {
6552 USHORT SubstituteNameOffset;
6553 USHORT SubstituteNameLength;
6554 USHORT PrintNameOffset;
6555 USHORT PrintNameLength;
6556 ULONG Flags;
6557 WCHAR PathBuffer[1];
6558 } SymbolicLinkReparseBuffer;
6559 struct {
6560 USHORT SubstituteNameOffset;
6561 USHORT SubstituteNameLength;
6562 USHORT PrintNameOffset;
6563 USHORT PrintNameLength;
6564 WCHAR PathBuffer[1];
6565 } MountPointReparseBuffer;
6566 struct {
6567 UCHAR DataBuffer[1];
6568 } GenericReparseBuffer;
6569 } DUMMYUNIONNAME;
6570 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
6571
6572 #define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
6573
6574 typedef struct _REPARSE_GUID_DATA_BUFFER {
6575 ULONG ReparseTag;
6576 USHORT ReparseDataLength;
6577 USHORT Reserved;
6578 GUID ReparseGuid;
6579 struct {
6580 UCHAR DataBuffer[1];
6581 } GenericReparseBuffer;
6582 } REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
6583
6584 #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
6585
6586 #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 )
6587
6588 /* Reserved reparse tags */
6589 #define IO_REPARSE_TAG_RESERVED_ZERO (0)
6590 #define IO_REPARSE_TAG_RESERVED_ONE (1)
6591 #define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE
6592
6593 #define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000))
6594 #define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000))
6595
6596 #define IO_REPARSE_TAG_VALID_VALUES (0xF000FFFF)
6597
6598 #define IsReparseTagValid(tag) ( \
6599 !((tag) & ~IO_REPARSE_TAG_VALID_VALUES) && \
6600 ((tag) > IO_REPARSE_TAG_RESERVED_RANGE) \
6601 )
6602
6603 /* MicroSoft reparse point tags */
6604 #define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
6605 #define IO_REPARSE_TAG_HSM (0xC0000004L)
6606 #define IO_REPARSE_TAG_DRIVE_EXTENDER (0x80000005L)
6607 #define IO_REPARSE_TAG_HSM2 (0x80000006L)
6608 #define IO_REPARSE_TAG_SIS (0x80000007L)
6609 #define IO_REPARSE_TAG_WIM (0x80000008L)
6610 #define IO_REPARSE_TAG_CSV (0x80000009L)
6611 #define IO_REPARSE_TAG_DFS (0x8000000AL)
6612 #define IO_REPARSE_TAG_FILTER_MANAGER (0x8000000BL)
6613 #define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
6614 #define IO_REPARSE_TAG_IIS_CACHE (0xA0000010L)
6615 #define IO_REPARSE_TAG_DFSR (0x80000012L)
6616
6617 #pragma pack(4)
6618 typedef struct _REPARSE_INDEX_KEY {
6619 ULONG FileReparseTag;
6620 LARGE_INTEGER FileId;
6621 } REPARSE_INDEX_KEY, *PREPARSE_INDEX_KEY;
6622 #pragma pack()
6623
6624 #define FSCTL_LMR_GET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,58,METHOD_BUFFERED,FILE_ANY_ACCESS)
6625 #define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS)
6626 #define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
6627
6628 #define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
6629 #define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
6630 #define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
6631 #define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
6632 #define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
6633 #define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
6634 #define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
6635 #define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
6636 #define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
6637 #define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
6638 #define FSCTL_PIPE_GET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
6639 #define FSCTL_PIPE_SET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
6640 #define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
6641 #define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
6642 #define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
6643 #define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
6644 #define FSCTL_PIPE_FLUSH CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)
6645
6646 #define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
6647 #define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
6648 #define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
6649 #define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
6650
6651 #define FILE_PIPE_READ_DATA 0x00000000
6652 #define FILE_PIPE_WRITE_SPACE 0x00000001
6653
6654 typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
6655 HANDLE EventHandle;
6656 ULONG KeyValue;
6657 } FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;
6658
6659 typedef struct _FILE_PIPE_EVENT_BUFFER {
6660 ULONG NamedPipeState;
6661 ULONG EntryType;
6662 ULONG ByteCount;
6663 ULONG KeyValue;
6664 ULONG NumberRequests;
6665 } FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;
6666
6667 typedef struct _FILE_PIPE_PEEK_BUFFER {
6668 ULONG NamedPipeState;
6669 ULONG ReadDataAvailable;
6670 ULONG NumberOfMessages;
6671 ULONG MessageLength;
6672 CHAR Data[1];
6673 } FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
6674
6675 typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
6676 LARGE_INTEGER Timeout;
6677 ULONG NameLength;
6678 BOOLEAN TimeoutSpecified;
6679 WCHAR Name[1];
6680 } FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
6681
6682 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
6683 #if !defined(BUILD_WOW6432)
6684 PVOID ClientSession;
6685 PVOID ClientProcess;
6686 #else
6687 ULONGLONG ClientSession;
6688 ULONGLONG ClientProcess;
6689 #endif
6690 } FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;
6691
6692 #define FILE_PIPE_COMPUTER_NAME_LENGTH 15
6693
6694 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX {
6695 #if !defined(BUILD_WOW6432)
6696 PVOID ClientSession;
6697 PVOID ClientProcess;
6698 #else
6699 ULONGLONG ClientSession;
6700 ULONGLONG ClientProcess;
6701 #endif
6702 USHORT ClientComputerNameLength;
6703 WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH+1];
6704 } FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX;
6705
6706 #define FSCTL_MAILSLOT_PEEK CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
6707
6708 typedef enum _LINK_TRACKING_INFORMATION_TYPE {
6709 NtfsLinkTrackingInformation,
6710 DfsLinkTrackingInformation
6711 } LINK_TRACKING_INFORMATION_TYPE, *PLINK_TRACKING_INFORMATION_TYPE;
6712
6713 typedef struct _LINK_TRACKING_INFORMATION {
6714 LINK_TRACKING_INFORMATION_TYPE Type;
6715 UCHAR VolumeId[16];
6716 } LINK_TRACKING_INFORMATION, *PLINK_TRACKING_INFORMATION;
6717
6718 typedef struct _REMOTE_LINK_TRACKING_INFORMATION {
6719 PVOID TargetFileObject;
6720 ULONG TargetLinkTrackingInformationLength;
6721 UCHAR TargetLinkTrackingInformationBuffer[1];
6722 } REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION;
6723
6724 #define IO_OPEN_PAGING_FILE 0x0002
6725 #define IO_OPEN_TARGET_DIRECTORY 0x0004
6726 #define IO_STOP_ON_SYMLINK 0x0008
6727 #define IO_MM_PAGING_FILE 0x0010
6728
6729 typedef VOID
6730 (NTAPI *PDRIVER_FS_NOTIFICATION) (
6731 IN PDEVICE_OBJECT DeviceObject,
6732 IN BOOLEAN FsActive);
6733
6734 typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
6735 SyncTypeOther = 0,
6736 SyncTypeCreateSection
6737 } FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
6738
6739 typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
6740 NotifyTypeCreate = 0,
6741 NotifyTypeRetired
6742 } FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
6743
6744 typedef union _FS_FILTER_PARAMETERS {
6745 struct {
6746 PLARGE_INTEGER EndingOffset;
6747 PERESOURCE *ResourceToRelease;
6748 } AcquireForModifiedPageWriter;
6749 struct {
6750 PERESOURCE ResourceToRelease;
6751 } ReleaseForModifiedPageWriter;
6752 struct {
6753 FS_FILTER_SECTION_SYNC_TYPE SyncType;
6754 ULONG PageProtection;
6755 } AcquireForSectionSynchronization;
6756 struct {
6757 FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
6758 BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
6759 } NotifyStreamFileObject;
6760 struct {
6761 PVOID Argument1;
6762 PVOID Argument2;
6763 PVOID Argument3;
6764 PVOID Argument4;
6765 PVOID Argument5;
6766 } Others;
6767 } FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
6768
6769 #define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-1
6770 #define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-2
6771 #define FS_FILTER_ACQUIRE_FOR_MOD_WRITE (UCHAR)-3
6772 #define FS_FILTER_RELEASE_FOR_MOD_WRITE (UCHAR)-4
6773 #define FS_FILTER_ACQUIRE_FOR_CC_FLUSH (UCHAR)-5
6774 #define FS_FILTER_RELEASE_FOR_CC_FLUSH (UCHAR)-6
6775
6776 typedef struct _FS_FILTER_CALLBACK_DATA {
6777 ULONG SizeOfFsFilterCallbackData;
6778 UCHAR Operation;
6779 UCHAR Reserved;
6780 struct _DEVICE_OBJECT *DeviceObject;
6781 struct _FILE_OBJECT *FileObject;
6782 FS_FILTER_PARAMETERS Parameters;
6783 } FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
6784
6785 typedef NTSTATUS
6786 (NTAPI *PFS_FILTER_CALLBACK) (
6787 IN PFS_FILTER_CALLBACK_DATA Data,
6788 OUT PVOID *CompletionContext);
6789
6790 typedef VOID
6791 (NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
6792 IN PFS_FILTER_CALLBACK_DATA Data,
6793 IN NTSTATUS OperationStatus,
6794 IN PVOID CompletionContext);
6795
6796 typedef struct _FS_FILTER_CALLBACKS {
6797 ULONG SizeOfFsFilterCallbacks;
6798 ULONG Reserved;
6799 PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
6800 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
6801 PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
6802 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
6803 PFS_FILTER_CALLBACK PreAcquireForCcFlush;
6804 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
6805 PFS_FILTER_CALLBACK PreReleaseForCcFlush;
6806 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
6807 PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
6808 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
6809 PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
6810 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
6811 } FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
6812
6813 #if (NTDDI_VERSION >= NTDDI_WINXP)
6814 NTKERNELAPI
6815 NTSTATUS
6816 NTAPI
6817 FsRtlRegisterFileSystemFilterCallbacks(
6818 IN struct _DRIVER_OBJECT *FilterDriverObject,
6819 IN PFS_FILTER_CALLBACKS Callbacks);
6820 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
6821
6822 #if (NTDDI_VERSION >= NTDDI_VISTA)
6823 NTKERNELAPI
6824 NTSTATUS
6825 NTAPI
6826 FsRtlNotifyStreamFileObject(
6827 IN struct _FILE_OBJECT * StreamFileObject,
6828 IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL,
6829 IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
6830 IN BOOLEAN SafeToRecurse);
6831 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
6832
6833 #define DO_VERIFY_VOLUME 0x00000002
6834 #define DO_BUFFERED_IO 0x00000004
6835 #define DO_EXCLUSIVE 0x00000008
6836 #define DO_DIRECT_IO 0x00000010
6837 #define DO_MAP_IO_BUFFER 0x00000020
6838 #define DO_DEVICE_HAS_NAME 0x00000040
6839 #define DO_DEVICE_INITIALIZING 0x00000080
6840 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
6841 #define DO_LONG_TERM_REQUESTS 0x00000200
6842 #define DO_NEVER_LAST_DEVICE 0x00000400
6843 #define DO_SHUTDOWN_REGISTERED 0x00000800
6844 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
6845 #define DO_POWER_PAGABLE 0x00002000
6846 #define DO_POWER_INRUSH 0x00004000
6847 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
6848 #define DO_SUPPORTS_TRANSACTIONS 0x00040000
6849 #define DO_FORCE_NEITHER_IO 0x00080000
6850 #define DO_VOLUME_DEVICE_OBJECT 0x00100000
6851 #define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
6852 #define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
6853 #define DO_DISALLOW_EXECUTE 0x00800000
6854
6855 extern KSPIN_LOCK IoStatisticsLock;
6856 extern ULONG IoReadOperationCount;
6857 extern ULONG IoWriteOperationCount;
6858 extern ULONG IoOtherOperationCount;
6859 extern LARGE_INTEGER IoReadTransferCount;
6860 extern LARGE_INTEGER IoWriteTransferCount;
6861 extern LARGE_INTEGER IoOtherTransferCount;
6862
6863 #define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64
6864 #define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024
6865
6866 #if (NTDDI_VERSION >= NTDDI_VISTA)
6867 typedef struct _IO_PRIORITY_INFO {
6868 ULONG Size;
6869 ULONG ThreadPriority;
6870 ULONG PagePriority;
6871 IO_PRIORITY_HINT IoPriority;
6872 } IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
6873 #endif
6874 $endif (_NTIFS_)