[NDK]
[reactos.git] / reactos / 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 /* The following 2 are missing in latest WDK */
1797 #define IRP_RETRY_IO_COMPLETION 0x00004000
1798 #define IRP_CLASS_CACHE_OPERATION 0x00008000
1799
1800 #define IRP_QUOTA_CHARGED 0x01
1801 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
1802 #define IRP_ALLOCATED_FIXED_SIZE 0x04
1803 #define IRP_LOOKASIDE_ALLOCATION 0x08
1804
1805 /*
1806 ** IRP function codes
1807 */
1808
1809 #define IRP_MJ_CREATE 0x00
1810 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
1811 #define IRP_MJ_CLOSE 0x02
1812 #define IRP_MJ_READ 0x03
1813 #define IRP_MJ_WRITE 0x04
1814 #define IRP_MJ_QUERY_INFORMATION 0x05
1815 #define IRP_MJ_SET_INFORMATION 0x06
1816 #define IRP_MJ_QUERY_EA 0x07
1817 #define IRP_MJ_SET_EA 0x08
1818 #define IRP_MJ_FLUSH_BUFFERS 0x09
1819 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
1820 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
1821 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
1822 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
1823 #define IRP_MJ_DEVICE_CONTROL 0x0e
1824 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
1825 #define IRP_MJ_SCSI 0x0f
1826 #define IRP_MJ_SHUTDOWN 0x10
1827 #define IRP_MJ_LOCK_CONTROL 0x11
1828 #define IRP_MJ_CLEANUP 0x12
1829 #define IRP_MJ_CREATE_MAILSLOT 0x13
1830 #define IRP_MJ_QUERY_SECURITY 0x14
1831 #define IRP_MJ_SET_SECURITY 0x15
1832 #define IRP_MJ_POWER 0x16
1833 #define IRP_MJ_SYSTEM_CONTROL 0x17
1834 #define IRP_MJ_DEVICE_CHANGE 0x18
1835 #define IRP_MJ_QUERY_QUOTA 0x19
1836 #define IRP_MJ_SET_QUOTA 0x1a
1837 #define IRP_MJ_PNP 0x1b
1838 #define IRP_MJ_PNP_POWER 0x1b
1839 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
1840
1841 #define IRP_MN_SCSI_CLASS 0x01
1842
1843 #define IRP_MN_START_DEVICE 0x00
1844 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
1845 #define IRP_MN_REMOVE_DEVICE 0x02
1846 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
1847 #define IRP_MN_STOP_DEVICE 0x04
1848 #define IRP_MN_QUERY_STOP_DEVICE 0x05
1849 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
1850
1851 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
1852 #define IRP_MN_QUERY_INTERFACE 0x08
1853 #define IRP_MN_QUERY_CAPABILITIES 0x09
1854 #define IRP_MN_QUERY_RESOURCES 0x0A
1855 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
1856 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
1857 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
1858
1859 #define IRP_MN_READ_CONFIG 0x0F
1860 #define IRP_MN_WRITE_CONFIG 0x10
1861 #define IRP_MN_EJECT 0x11
1862 #define IRP_MN_SET_LOCK 0x12
1863 #define IRP_MN_QUERY_ID 0x13
1864 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
1865 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
1866 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
1867 #define IRP_MN_SURPRISE_REMOVAL 0x17
1868 #if (NTDDI_VERSION >= NTDDI_WIN7)
1869 #define IRP_MN_DEVICE_ENUMERATED 0x19
1870 #endif
1871
1872 #define IRP_MN_WAIT_WAKE 0x00
1873 #define IRP_MN_POWER_SEQUENCE 0x01
1874 #define IRP_MN_SET_POWER 0x02
1875 #define IRP_MN_QUERY_POWER 0x03
1876
1877 #define IRP_MN_QUERY_ALL_DATA 0x00
1878 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
1879 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
1880 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
1881 #define IRP_MN_ENABLE_EVENTS 0x04
1882 #define IRP_MN_DISABLE_EVENTS 0x05
1883 #define IRP_MN_ENABLE_COLLECTION 0x06
1884 #define IRP_MN_DISABLE_COLLECTION 0x07
1885 #define IRP_MN_REGINFO 0x08
1886 #define IRP_MN_EXECUTE_METHOD 0x09
1887
1888 #define IRP_MN_REGINFO_EX 0x0b
1889
1890 typedef struct _FILE_OBJECT {
1891 CSHORT Type;
1892 CSHORT Size;
1893 PDEVICE_OBJECT DeviceObject;
1894 PVPB Vpb;
1895 PVOID FsContext;
1896 PVOID FsContext2;
1897 PSECTION_OBJECT_POINTERS SectionObjectPointer;
1898 PVOID PrivateCacheMap;
1899 NTSTATUS FinalStatus;
1900 struct _FILE_OBJECT *RelatedFileObject;
1901 BOOLEAN LockOperation;
1902 BOOLEAN DeletePending;
1903 BOOLEAN ReadAccess;
1904 BOOLEAN WriteAccess;
1905 BOOLEAN DeleteAccess;
1906 BOOLEAN SharedRead;
1907 BOOLEAN SharedWrite;
1908 BOOLEAN SharedDelete;
1909 ULONG Flags;
1910 UNICODE_STRING FileName;
1911 LARGE_INTEGER CurrentByteOffset;
1912 volatile ULONG Waiters;
1913 volatile ULONG Busy;
1914 PVOID LastLock;
1915 KEVENT Lock;
1916 KEVENT Event;
1917 volatile PIO_COMPLETION_CONTEXT CompletionContext;
1918 KSPIN_LOCK IrpListLock;
1919 LIST_ENTRY IrpList;
1920 volatile PVOID FileObjectExtension;
1921 } FILE_OBJECT, *PFILE_OBJECT;
1922
1923 typedef struct _IO_ERROR_LOG_PACKET {
1924 UCHAR MajorFunctionCode;
1925 UCHAR RetryCount;
1926 USHORT DumpDataSize;
1927 USHORT NumberOfStrings;
1928 USHORT StringOffset;
1929 USHORT EventCategory;
1930 NTSTATUS ErrorCode;
1931 ULONG UniqueErrorValue;
1932 NTSTATUS FinalStatus;
1933 ULONG SequenceNumber;
1934 ULONG IoControlCode;
1935 LARGE_INTEGER DeviceOffset;
1936 ULONG DumpData[1];
1937 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
1938
1939 typedef struct _IO_ERROR_LOG_MESSAGE {
1940 USHORT Type;
1941 USHORT Size;
1942 USHORT DriverNameLength;
1943 LARGE_INTEGER TimeStamp;
1944 ULONG DriverNameOffset;
1945 IO_ERROR_LOG_PACKET EntryData;
1946 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
1947
1948 #define ERROR_LOG_LIMIT_SIZE 240
1949 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
1950 sizeof(IO_ERROR_LOG_PACKET) + \
1951 (sizeof(WCHAR) * 40))
1952 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
1953 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
1954 #define IO_ERROR_LOG_MESSAGE_LENGTH \
1955 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
1956 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
1957 PORT_MAXIMUM_MESSAGE_LENGTH)
1958 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
1959 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
1960
1961 #ifdef _WIN64
1962 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
1963 #else
1964 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
1965 #endif
1966
1967 typedef enum _DMA_WIDTH {
1968 Width8Bits,
1969 Width16Bits,
1970 Width32Bits,
1971 MaximumDmaWidth
1972 } DMA_WIDTH, *PDMA_WIDTH;
1973
1974 typedef enum _DMA_SPEED {
1975 Compatible,
1976 TypeA,
1977 TypeB,
1978 TypeC,
1979 TypeF,
1980 MaximumDmaSpeed
1981 } DMA_SPEED, *PDMA_SPEED;
1982
1983 /* DEVICE_DESCRIPTION.Version */
1984
1985 #define DEVICE_DESCRIPTION_VERSION 0x0000
1986 #define DEVICE_DESCRIPTION_VERSION1 0x0001
1987 #define DEVICE_DESCRIPTION_VERSION2 0x0002
1988
1989 typedef struct _DEVICE_DESCRIPTION {
1990 ULONG Version;
1991 BOOLEAN Master;
1992 BOOLEAN ScatterGather;
1993 BOOLEAN DemandMode;
1994 BOOLEAN AutoInitialize;
1995 BOOLEAN Dma32BitAddresses;
1996 BOOLEAN IgnoreCount;
1997 BOOLEAN Reserved1;
1998 BOOLEAN Dma64BitAddresses;
1999 ULONG BusNumber;
2000 ULONG DmaChannel;
2001 INTERFACE_TYPE InterfaceType;
2002 DMA_WIDTH DmaWidth;
2003 DMA_SPEED DmaSpeed;
2004 ULONG MaximumLength;
2005 ULONG DmaPort;
2006 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
2007
2008 typedef enum _DEVICE_RELATION_TYPE {
2009 BusRelations,
2010 EjectionRelations,
2011 PowerRelations,
2012 RemovalRelations,
2013 TargetDeviceRelation,
2014 SingleBusRelations,
2015 TransportRelations
2016 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
2017
2018 typedef struct _DEVICE_RELATIONS {
2019 ULONG Count;
2020 PDEVICE_OBJECT Objects[1];
2021 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
2022
2023 typedef struct _DEVOBJ_EXTENSION {
2024 CSHORT Type;
2025 USHORT Size;
2026 PDEVICE_OBJECT DeviceObject;
2027 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
2028
2029 typedef struct _SCATTER_GATHER_ELEMENT {
2030 PHYSICAL_ADDRESS Address;
2031 ULONG Length;
2032 ULONG_PTR Reserved;
2033 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
2034
2035 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
2036
2037 #if defined(_MSC_VER)
2038 #if _MSC_VER >= 1200
2039 #pragma warning(push)
2040 #endif
2041 #pragma warning(disable:4200)
2042 #endif /* _MSC_VER */
2043
2044 typedef struct _SCATTER_GATHER_LIST {
2045 ULONG NumberOfElements;
2046 ULONG_PTR Reserved;
2047 SCATTER_GATHER_ELEMENT Elements[1];
2048 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
2049
2050 #if defined(_MSC_VER)
2051 #if _MSC_VER >= 1200
2052 #pragma warning(pop)
2053 #else
2054 #pragma warning(default:4200)
2055 #endif
2056 #endif /* _MSC_VER */
2057
2058 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
2059
2060 struct _SCATTER_GATHER_LIST;
2061 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
2062
2063 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
2064
2065 typedef NTSTATUS
2066 (NTAPI DRIVER_ADD_DEVICE)(
2067 IN struct _DRIVER_OBJECT *DriverObject,
2068 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
2069 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
2070
2071 typedef struct _DRIVER_EXTENSION {
2072 struct _DRIVER_OBJECT *DriverObject;
2073 PDRIVER_ADD_DEVICE AddDevice;
2074 ULONG Count;
2075 UNICODE_STRING ServiceKeyName;
2076 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
2077
2078 #define DRVO_UNLOAD_INVOKED 0x00000001
2079 #define DRVO_LEGACY_DRIVER 0x00000002
2080 #define DRVO_BUILTIN_DRIVER 0x00000004
2081
2082 typedef NTSTATUS
2083 (NTAPI DRIVER_INITIALIZE)(
2084 IN struct _DRIVER_OBJECT *DriverObject,
2085 IN PUNICODE_STRING RegistryPath);
2086 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
2087
2088 typedef VOID
2089 (NTAPI DRIVER_STARTIO)(
2090 IN struct _DEVICE_OBJECT *DeviceObject,
2091 IN struct _IRP *Irp);
2092 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
2093
2094 typedef VOID
2095 (NTAPI DRIVER_UNLOAD)(
2096 IN struct _DRIVER_OBJECT *DriverObject);
2097 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
2098
2099 typedef NTSTATUS
2100 (NTAPI DRIVER_DISPATCH)(
2101 IN struct _DEVICE_OBJECT *DeviceObject,
2102 IN struct _IRP *Irp);
2103 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
2104
2105 typedef struct _DRIVER_OBJECT {
2106 CSHORT Type;
2107 CSHORT Size;
2108 PDEVICE_OBJECT DeviceObject;
2109 ULONG Flags;
2110 PVOID DriverStart;
2111 ULONG DriverSize;
2112 PVOID DriverSection;
2113 PDRIVER_EXTENSION DriverExtension;
2114 UNICODE_STRING DriverName;
2115 PUNICODE_STRING HardwareDatabase;
2116 struct _FAST_IO_DISPATCH *FastIoDispatch;
2117 PDRIVER_INITIALIZE DriverInit;
2118 PDRIVER_STARTIO DriverStartIo;
2119 PDRIVER_UNLOAD DriverUnload;
2120 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
2121 } DRIVER_OBJECT, *PDRIVER_OBJECT;
2122
2123 typedef struct _DMA_ADAPTER {
2124 USHORT Version;
2125 USHORT Size;
2126 struct _DMA_OPERATIONS* DmaOperations;
2127 } DMA_ADAPTER, *PDMA_ADAPTER;
2128
2129 typedef VOID
2130 (NTAPI *PPUT_DMA_ADAPTER)(
2131 IN PDMA_ADAPTER DmaAdapter);
2132
2133 typedef PVOID
2134 (NTAPI *PALLOCATE_COMMON_BUFFER)(
2135 IN PDMA_ADAPTER DmaAdapter,
2136 IN ULONG Length,
2137 OUT PPHYSICAL_ADDRESS LogicalAddress,
2138 IN BOOLEAN CacheEnabled);
2139
2140 typedef VOID
2141 (NTAPI *PFREE_COMMON_BUFFER)(
2142 IN PDMA_ADAPTER DmaAdapter,
2143 IN ULONG Length,
2144 IN PHYSICAL_ADDRESS LogicalAddress,
2145 IN PVOID VirtualAddress,
2146 IN BOOLEAN CacheEnabled);
2147
2148 typedef NTSTATUS
2149 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
2150 IN PDMA_ADAPTER DmaAdapter,
2151 IN PDEVICE_OBJECT DeviceObject,
2152 IN ULONG NumberOfMapRegisters,
2153 IN PDRIVER_CONTROL ExecutionRoutine,
2154 IN PVOID Context);
2155
2156 typedef BOOLEAN
2157 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
2158 IN PDMA_ADAPTER DmaAdapter,
2159 IN PMDL Mdl,
2160 IN PVOID MapRegisterBase,
2161 IN PVOID CurrentVa,
2162 IN ULONG Length,
2163 IN BOOLEAN WriteToDevice);
2164
2165 typedef VOID
2166 (NTAPI *PFREE_ADAPTER_CHANNEL)(
2167 IN PDMA_ADAPTER DmaAdapter);
2168
2169 typedef VOID
2170 (NTAPI *PFREE_MAP_REGISTERS)(
2171 IN PDMA_ADAPTER DmaAdapter,
2172 PVOID MapRegisterBase,
2173 ULONG NumberOfMapRegisters);
2174
2175 typedef PHYSICAL_ADDRESS
2176 (NTAPI *PMAP_TRANSFER)(
2177 IN PDMA_ADAPTER DmaAdapter,
2178 IN PMDL Mdl,
2179 IN PVOID MapRegisterBase,
2180 IN PVOID CurrentVa,
2181 IN OUT PULONG Length,
2182 IN BOOLEAN WriteToDevice);
2183
2184 typedef ULONG
2185 (NTAPI *PGET_DMA_ALIGNMENT)(
2186 IN PDMA_ADAPTER DmaAdapter);
2187
2188 typedef ULONG
2189 (NTAPI *PREAD_DMA_COUNTER)(
2190 IN PDMA_ADAPTER DmaAdapter);
2191
2192 typedef VOID
2193 (NTAPI DRIVER_LIST_CONTROL)(
2194 IN struct _DEVICE_OBJECT *DeviceObject,
2195 IN struct _IRP *Irp,
2196 IN struct _SCATTER_GATHER_LIST *ScatterGather,
2197 IN PVOID Context);
2198 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
2199
2200 typedef NTSTATUS
2201 (NTAPI *PGET_SCATTER_GATHER_LIST)(
2202 IN PDMA_ADAPTER DmaAdapter,
2203 IN PDEVICE_OBJECT DeviceObject,
2204 IN PMDL Mdl,
2205 IN PVOID CurrentVa,
2206 IN ULONG Length,
2207 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
2208 IN PVOID Context,
2209 IN BOOLEAN WriteToDevice);
2210
2211 typedef VOID
2212 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
2213 IN PDMA_ADAPTER DmaAdapter,
2214 IN PSCATTER_GATHER_LIST ScatterGather,
2215 IN BOOLEAN WriteToDevice);
2216
2217 typedef NTSTATUS
2218 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
2219 IN PDMA_ADAPTER DmaAdapter,
2220 IN PMDL Mdl OPTIONAL,
2221 IN PVOID CurrentVa,
2222 IN ULONG Length,
2223 OUT PULONG ScatterGatherListSize,
2224 OUT PULONG pNumberOfMapRegisters OPTIONAL);
2225
2226 typedef NTSTATUS
2227 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
2228 IN PDMA_ADAPTER DmaAdapter,
2229 IN PDEVICE_OBJECT DeviceObject,
2230 IN PMDL Mdl,
2231 IN PVOID CurrentVa,
2232 IN ULONG Length,
2233 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
2234 IN PVOID Context,
2235 IN BOOLEAN WriteToDevice,
2236 IN PVOID ScatterGatherBuffer,
2237 IN ULONG ScatterGatherLength);
2238
2239 typedef NTSTATUS
2240 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
2241 IN PDMA_ADAPTER DmaAdapter,
2242 IN PSCATTER_GATHER_LIST ScatterGather,
2243 IN PMDL OriginalMdl,
2244 OUT PMDL *TargetMdl);
2245
2246 typedef struct _DMA_OPERATIONS {
2247 ULONG Size;
2248 PPUT_DMA_ADAPTER PutDmaAdapter;
2249 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
2250 PFREE_COMMON_BUFFER FreeCommonBuffer;
2251 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
2252 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
2253 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
2254 PFREE_MAP_REGISTERS FreeMapRegisters;
2255 PMAP_TRANSFER MapTransfer;
2256 PGET_DMA_ALIGNMENT GetDmaAlignment;
2257 PREAD_DMA_COUNTER ReadDmaCounter;
2258 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
2259 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
2260 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
2261 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
2262 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
2263 } DMA_OPERATIONS, *PDMA_OPERATIONS;
2264
2265 typedef struct _IO_RESOURCE_DESCRIPTOR {
2266 UCHAR Option;
2267 UCHAR Type;
2268 UCHAR ShareDisposition;
2269 UCHAR Spare1;
2270 USHORT Flags;
2271 USHORT Spare2;
2272 union {
2273 struct {
2274 ULONG Length;
2275 ULONG Alignment;
2276 PHYSICAL_ADDRESS MinimumAddress;
2277 PHYSICAL_ADDRESS MaximumAddress;
2278 } Port;
2279 struct {
2280 ULONG Length;
2281 ULONG Alignment;
2282 PHYSICAL_ADDRESS MinimumAddress;
2283 PHYSICAL_ADDRESS MaximumAddress;
2284 } Memory;
2285 struct {
2286 ULONG MinimumVector;
2287 ULONG MaximumVector;
2288 } Interrupt;
2289 struct {
2290 ULONG MinimumChannel;
2291 ULONG MaximumChannel;
2292 } Dma;
2293 struct {
2294 ULONG Length;
2295 ULONG Alignment;
2296 PHYSICAL_ADDRESS MinimumAddress;
2297 PHYSICAL_ADDRESS MaximumAddress;
2298 } Generic;
2299 struct {
2300 ULONG Data[3];
2301 } DevicePrivate;
2302 struct {
2303 ULONG Length;
2304 ULONG MinBusNumber;
2305 ULONG MaxBusNumber;
2306 ULONG Reserved;
2307 } BusNumber;
2308 struct {
2309 ULONG Priority;
2310 ULONG Reserved1;
2311 ULONG Reserved2;
2312 } ConfigData;
2313 } u;
2314 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
2315
2316 typedef struct _IO_RESOURCE_LIST {
2317 USHORT Version;
2318 USHORT Revision;
2319 ULONG Count;
2320 IO_RESOURCE_DESCRIPTOR Descriptors[1];
2321 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
2322
2323 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
2324 ULONG ListSize;
2325 INTERFACE_TYPE InterfaceType;
2326 ULONG BusNumber;
2327 ULONG SlotNumber;
2328 ULONG Reserved[3];
2329 ULONG AlternativeLists;
2330 IO_RESOURCE_LIST List[1];
2331 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
2332
2333 typedef VOID
2334 (NTAPI DRIVER_CANCEL)(
2335 IN struct _DEVICE_OBJECT *DeviceObject,
2336 IN struct _IRP *Irp);
2337 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
2338
2339 typedef struct _IRP {
2340 CSHORT Type;
2341 USHORT Size;
2342 struct _MDL *MdlAddress;
2343 ULONG Flags;
2344 union {
2345 struct _IRP *MasterIrp;
2346 volatile LONG IrpCount;
2347 PVOID SystemBuffer;
2348 } AssociatedIrp;
2349 LIST_ENTRY ThreadListEntry;
2350 IO_STATUS_BLOCK IoStatus;
2351 KPROCESSOR_MODE RequestorMode;
2352 BOOLEAN PendingReturned;
2353 CHAR StackCount;
2354 CHAR CurrentLocation;
2355 BOOLEAN Cancel;
2356 KIRQL CancelIrql;
2357 CCHAR ApcEnvironment;
2358 UCHAR AllocationFlags;
2359 PIO_STATUS_BLOCK UserIosb;
2360 PKEVENT UserEvent;
2361 union {
2362 struct {
2363 _ANONYMOUS_UNION union {
2364 PIO_APC_ROUTINE UserApcRoutine;
2365 PVOID IssuingProcess;
2366 } DUMMYUNIONNAME;
2367 PVOID UserApcContext;
2368 } AsynchronousParameters;
2369 LARGE_INTEGER AllocationSize;
2370 } Overlay;
2371 volatile PDRIVER_CANCEL CancelRoutine;
2372 PVOID UserBuffer;
2373 union {
2374 struct {
2375 _ANONYMOUS_UNION union {
2376 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
2377 _ANONYMOUS_STRUCT struct {
2378 PVOID DriverContext[4];
2379 } DUMMYSTRUCTNAME;
2380 } DUMMYUNIONNAME;
2381 PETHREAD Thread;
2382 PCHAR AuxiliaryBuffer;
2383 _ANONYMOUS_STRUCT struct {
2384 LIST_ENTRY ListEntry;
2385 _ANONYMOUS_UNION union {
2386 struct _IO_STACK_LOCATION *CurrentStackLocation;
2387 ULONG PacketType;
2388 } DUMMYUNIONNAME;
2389 } DUMMYSTRUCTNAME;
2390 struct _FILE_OBJECT *OriginalFileObject;
2391 } Overlay;
2392 KAPC Apc;
2393 PVOID CompletionKey;
2394 } Tail;
2395 } IRP, *PIRP;
2396
2397 typedef enum _IO_PAGING_PRIORITY {
2398 IoPagingPriorityInvalid,
2399 IoPagingPriorityNormal,
2400 IoPagingPriorityHigh,
2401 IoPagingPriorityReserved1,
2402 IoPagingPriorityReserved2
2403 } IO_PAGING_PRIORITY;
2404
2405 typedef NTSTATUS
2406 (NTAPI IO_COMPLETION_ROUTINE)(
2407 IN struct _DEVICE_OBJECT *DeviceObject,
2408 IN struct _IRP *Irp,
2409 IN PVOID Context);
2410 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
2411
2412 typedef VOID
2413 (NTAPI IO_DPC_ROUTINE)(
2414 IN struct _KDPC *Dpc,
2415 IN struct _DEVICE_OBJECT *DeviceObject,
2416 IN struct _IRP *Irp,
2417 IN PVOID Context);
2418 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
2419
2420 typedef NTSTATUS
2421 (NTAPI *PMM_DLL_INITIALIZE)(
2422 IN PUNICODE_STRING RegistryPath);
2423
2424 typedef NTSTATUS
2425 (NTAPI *PMM_DLL_UNLOAD)(
2426 VOID);
2427
2428 typedef VOID
2429 (NTAPI IO_TIMER_ROUTINE)(
2430 IN struct _DEVICE_OBJECT *DeviceObject,
2431 IN PVOID Context);
2432 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
2433
2434 typedef struct _IO_SECURITY_CONTEXT {
2435 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2436 PACCESS_STATE AccessState;
2437 ACCESS_MASK DesiredAccess;
2438 ULONG FullCreateOptions;
2439 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2440
2441 struct _IO_CSQ;
2442
2443 typedef struct _IO_CSQ_IRP_CONTEXT {
2444 ULONG Type;
2445 struct _IRP *Irp;
2446 struct _IO_CSQ *Csq;
2447 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2448
2449 typedef VOID
2450 (NTAPI *PIO_CSQ_INSERT_IRP)(
2451 IN struct _IO_CSQ *Csq,
2452 IN PIRP Irp);
2453
2454 typedef NTSTATUS
2455 (NTAPI IO_CSQ_INSERT_IRP_EX)(
2456 IN struct _IO_CSQ *Csq,
2457 IN PIRP Irp,
2458 IN PVOID InsertContext);
2459 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
2460
2461 typedef VOID
2462 (NTAPI *PIO_CSQ_REMOVE_IRP)(
2463 IN struct _IO_CSQ *Csq,
2464 IN PIRP Irp);
2465
2466 typedef PIRP
2467 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
2468 IN struct _IO_CSQ *Csq,
2469 IN PIRP Irp,
2470 IN PVOID PeekContext);
2471
2472 typedef VOID
2473 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
2474 IN struct _IO_CSQ *Csq,
2475 OUT PKIRQL Irql);
2476
2477 typedef VOID
2478 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
2479 IN struct _IO_CSQ *Csq,
2480 IN KIRQL Irql);
2481
2482 typedef VOID
2483 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
2484 IN struct _IO_CSQ *Csq,
2485 IN PIRP Irp);
2486
2487 typedef struct _IO_CSQ {
2488 ULONG Type;
2489 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2490 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2491 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2492 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2493 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2494 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2495 PVOID ReservePointer;
2496 } IO_CSQ, *PIO_CSQ;
2497
2498 typedef enum _BUS_QUERY_ID_TYPE {
2499 BusQueryDeviceID,
2500 BusQueryHardwareIDs,
2501 BusQueryCompatibleIDs,
2502 BusQueryInstanceID,
2503 BusQueryDeviceSerialNumber
2504 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
2505
2506 typedef enum _DEVICE_TEXT_TYPE {
2507 DeviceTextDescription,
2508 DeviceTextLocationInformation
2509 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
2510
2511 typedef BOOLEAN
2512 (NTAPI *PGPE_SERVICE_ROUTINE)(
2513 PVOID,
2514 PVOID);
2515
2516 typedef NTSTATUS
2517 (NTAPI *PGPE_CONNECT_VECTOR)(
2518 PDEVICE_OBJECT,
2519 ULONG,
2520 KINTERRUPT_MODE,
2521 BOOLEAN,
2522 PGPE_SERVICE_ROUTINE,
2523 PVOID,
2524 PVOID);
2525
2526 typedef NTSTATUS
2527 (NTAPI *PGPE_DISCONNECT_VECTOR)(
2528 PVOID);
2529
2530 typedef NTSTATUS
2531 (NTAPI *PGPE_ENABLE_EVENT)(
2532 PDEVICE_OBJECT,
2533 PVOID);
2534
2535 typedef NTSTATUS
2536 (NTAPI *PGPE_DISABLE_EVENT)(
2537 PDEVICE_OBJECT,
2538 PVOID);
2539
2540 typedef NTSTATUS
2541 (NTAPI *PGPE_CLEAR_STATUS)(
2542 PDEVICE_OBJECT,
2543 PVOID);
2544
2545 typedef VOID
2546 (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
2547 PVOID,
2548 ULONG);
2549
2550 typedef NTSTATUS
2551 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
2552 PDEVICE_OBJECT,
2553 PDEVICE_NOTIFY_CALLBACK,
2554 PVOID);
2555
2556 typedef VOID
2557 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
2558 PDEVICE_OBJECT,
2559 PDEVICE_NOTIFY_CALLBACK);
2560
2561 typedef struct _ACPI_INTERFACE_STANDARD {
2562 USHORT Size;
2563 USHORT Version;
2564 PVOID Context;
2565 PINTERFACE_REFERENCE InterfaceReference;
2566 PINTERFACE_DEREFERENCE InterfaceDereference;
2567 PGPE_CONNECT_VECTOR GpeConnectVector;
2568 PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
2569 PGPE_ENABLE_EVENT GpeEnableEvent;
2570 PGPE_DISABLE_EVENT GpeDisableEvent;
2571 PGPE_CLEAR_STATUS GpeClearStatus;
2572 PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
2573 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
2574 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
2575
2576 typedef BOOLEAN
2577 (NTAPI *PGPE_SERVICE_ROUTINE2)(
2578 PVOID ObjectContext,
2579 PVOID ServiceContext);
2580
2581 typedef NTSTATUS
2582 (NTAPI *PGPE_CONNECT_VECTOR2)(
2583 PVOID Context,
2584 ULONG GpeNumber,
2585 KINTERRUPT_MODE Mode,
2586 BOOLEAN Shareable,
2587 PGPE_SERVICE_ROUTINE ServiceRoutine,
2588 PVOID ServiceContext,
2589 PVOID *ObjectContext);
2590
2591 typedef NTSTATUS
2592 (NTAPI *PGPE_DISCONNECT_VECTOR2)(
2593 PVOID Context,
2594 PVOID ObjectContext);
2595
2596 typedef NTSTATUS
2597 (NTAPI *PGPE_ENABLE_EVENT2)(
2598 PVOID Context,
2599 PVOID ObjectContext);
2600
2601 typedef NTSTATUS
2602 (NTAPI *PGPE_DISABLE_EVENT2)(
2603 PVOID Context,
2604 PVOID ObjectContext);
2605
2606 typedef NTSTATUS
2607 (NTAPI *PGPE_CLEAR_STATUS2)(
2608 PVOID Context,
2609 PVOID ObjectContext);
2610
2611 typedef VOID
2612 (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
2613 PVOID NotificationContext,
2614 ULONG NotifyCode);
2615
2616 typedef NTSTATUS
2617 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
2618 PVOID Context,
2619 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
2620 PVOID NotificationContext);
2621
2622 typedef VOID
2623 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
2624 PVOID Context);
2625
2626 typedef struct _ACPI_INTERFACE_STANDARD2 {
2627 USHORT Size;
2628 USHORT Version;
2629 PVOID Context;
2630 PINTERFACE_REFERENCE InterfaceReference;
2631 PINTERFACE_DEREFERENCE InterfaceDereference;
2632 PGPE_CONNECT_VECTOR2 GpeConnectVector;
2633 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
2634 PGPE_ENABLE_EVENT2 GpeEnableEvent;
2635 PGPE_DISABLE_EVENT2 GpeDisableEvent;
2636 PGPE_CLEAR_STATUS2 GpeClearStatus;
2637 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
2638 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
2639 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
2640
2641 #if !defined(_AMD64_) && !defined(_IA64_)
2642 #include <pshpack4.h>
2643 #endif
2644 typedef struct _IO_STACK_LOCATION {
2645 UCHAR MajorFunction;
2646 UCHAR MinorFunction;
2647 UCHAR Flags;
2648 UCHAR Control;
2649 union {
2650 struct {
2651 PIO_SECURITY_CONTEXT SecurityContext;
2652 ULONG Options;
2653 USHORT POINTER_ALIGNMENT FileAttributes;
2654 USHORT ShareAccess;
2655 ULONG POINTER_ALIGNMENT EaLength;
2656 } Create;
2657 struct {
2658 ULONG Length;
2659 ULONG POINTER_ALIGNMENT Key;
2660 LARGE_INTEGER ByteOffset;
2661 } Read;
2662 struct {
2663 ULONG Length;
2664 ULONG POINTER_ALIGNMENT Key;
2665 LARGE_INTEGER ByteOffset;
2666 } Write;
2667 struct {
2668 ULONG Length;
2669 PUNICODE_STRING FileName;
2670 FILE_INFORMATION_CLASS FileInformationClass;
2671 ULONG FileIndex;
2672 } QueryDirectory;
2673 struct {
2674 ULONG Length;
2675 ULONG CompletionFilter;
2676 } NotifyDirectory;
2677 struct {
2678 ULONG Length;
2679 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2680 } QueryFile;
2681 struct {
2682 ULONG Length;
2683 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2684 PFILE_OBJECT FileObject;
2685 _ANONYMOUS_UNION union {
2686 _ANONYMOUS_STRUCT struct {
2687 BOOLEAN ReplaceIfExists;
2688 BOOLEAN AdvanceOnly;
2689 } DUMMYSTRUCTNAME;
2690 ULONG ClusterCount;
2691 HANDLE DeleteHandle;
2692 } DUMMYUNIONNAME;
2693 } SetFile;
2694 struct {
2695 ULONG Length;
2696 PVOID EaList;
2697 ULONG EaListLength;
2698 ULONG EaIndex;
2699 } QueryEa;
2700 struct {
2701 ULONG Length;
2702 } SetEa;
2703 struct {
2704 ULONG Length;
2705 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
2706 } QueryVolume;
2707 struct {
2708 ULONG Length;
2709 FS_INFORMATION_CLASS FsInformationClass;
2710 } SetVolume;
2711 struct {
2712 ULONG OutputBufferLength;
2713 ULONG InputBufferLength;
2714 ULONG FsControlCode;
2715 PVOID Type3InputBuffer;
2716 } FileSystemControl;
2717 struct {
2718 PLARGE_INTEGER Length;
2719 ULONG Key;
2720 LARGE_INTEGER ByteOffset;
2721 } LockControl;
2722 struct {
2723 ULONG OutputBufferLength;
2724 ULONG POINTER_ALIGNMENT InputBufferLength;
2725 ULONG POINTER_ALIGNMENT IoControlCode;
2726 PVOID Type3InputBuffer;
2727 } DeviceIoControl;
2728 struct {
2729 SECURITY_INFORMATION SecurityInformation;
2730 ULONG POINTER_ALIGNMENT Length;
2731 } QuerySecurity;
2732 struct {
2733 SECURITY_INFORMATION SecurityInformation;
2734 PSECURITY_DESCRIPTOR SecurityDescriptor;
2735 } SetSecurity;
2736 struct {
2737 PVPB Vpb;
2738 PDEVICE_OBJECT DeviceObject;
2739 } MountVolume;
2740 struct {
2741 PVPB Vpb;
2742 PDEVICE_OBJECT DeviceObject;
2743 } VerifyVolume;
2744 struct {
2745 struct _SCSI_REQUEST_BLOCK *Srb;
2746 } Scsi;
2747 struct {
2748 ULONG Length;
2749 PSID StartSid;
2750 struct _FILE_GET_QUOTA_INFORMATION *SidList;
2751 ULONG SidListLength;
2752 } QueryQuota;
2753 struct {
2754 ULONG Length;
2755 } SetQuota;
2756 struct {
2757 DEVICE_RELATION_TYPE Type;
2758 } QueryDeviceRelations;
2759 struct {
2760 CONST GUID *InterfaceType;
2761 USHORT Size;
2762 USHORT Version;
2763 PINTERFACE Interface;
2764 PVOID InterfaceSpecificData;
2765 } QueryInterface;
2766 struct {
2767 PDEVICE_CAPABILITIES Capabilities;
2768 } DeviceCapabilities;
2769 struct {
2770 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
2771 } FilterResourceRequirements;
2772 struct {
2773 ULONG WhichSpace;
2774 PVOID Buffer;
2775 ULONG Offset;
2776 ULONG POINTER_ALIGNMENT Length;
2777 } ReadWriteConfig;
2778 struct {
2779 BOOLEAN Lock;
2780 } SetLock;
2781 struct {
2782 BUS_QUERY_ID_TYPE IdType;
2783 } QueryId;
2784 struct {
2785 DEVICE_TEXT_TYPE DeviceTextType;
2786 LCID POINTER_ALIGNMENT LocaleId;
2787 } QueryDeviceText;
2788 struct {
2789 BOOLEAN InPath;
2790 BOOLEAN Reserved[3];
2791 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
2792 } UsageNotification;
2793 struct {
2794 SYSTEM_POWER_STATE PowerState;
2795 } WaitWake;
2796 struct {
2797 PPOWER_SEQUENCE PowerSequence;
2798 } PowerSequence;
2799 struct {
2800 ULONG SystemContext;
2801 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
2802 POWER_STATE POINTER_ALIGNMENT State;
2803 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
2804 } Power;
2805 struct {
2806 PCM_RESOURCE_LIST AllocatedResources;
2807 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
2808 } StartDevice;
2809 struct {
2810 ULONG_PTR ProviderId;
2811 PVOID DataPath;
2812 ULONG BufferSize;
2813 PVOID Buffer;
2814 } WMI;
2815 struct {
2816 PVOID Argument1;
2817 PVOID Argument2;
2818 PVOID Argument3;
2819 PVOID Argument4;
2820 } Others;
2821 } Parameters;
2822 PDEVICE_OBJECT DeviceObject;
2823 PFILE_OBJECT FileObject;
2824 PIO_COMPLETION_ROUTINE CompletionRoutine;
2825 PVOID Context;
2826 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
2827 #if !defined(_AMD64_) && !defined(_IA64_)
2828 #include <poppack.h>
2829 #endif
2830
2831 /* IO_STACK_LOCATION.Control */
2832
2833 #define SL_PENDING_RETURNED 0x01
2834 #define SL_ERROR_RETURNED 0x02
2835 #define SL_INVOKE_ON_CANCEL 0x20
2836 #define SL_INVOKE_ON_SUCCESS 0x40
2837 #define SL_INVOKE_ON_ERROR 0x80
2838
2839 $endif (_WDMDDK_)
2840 $if (_WDMDDK_ || _DEVIOCTL_)
2841 #define METHOD_BUFFERED 0
2842 #define METHOD_IN_DIRECT 1
2843 #define METHOD_OUT_DIRECT 2
2844 #define METHOD_NEITHER 3
2845
2846 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
2847 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
2848
2849 $endif (_WDMDDK_ || _DEVIOCTL_)
2850 $if (_WDMDDK_)
2851 #define FILE_SUPERSEDED 0x00000000
2852 #define FILE_OPENED 0x00000001
2853 #define FILE_CREATED 0x00000002
2854 #define FILE_OVERWRITTEN 0x00000003
2855 #define FILE_EXISTS 0x00000004
2856 #define FILE_DOES_NOT_EXIST 0x00000005
2857
2858 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
2859 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
2860
2861 /* also in winnt.h */
2862 #define FILE_LIST_DIRECTORY 0x00000001
2863 #define FILE_READ_DATA 0x00000001
2864 #define FILE_ADD_FILE 0x00000002
2865 #define FILE_WRITE_DATA 0x00000002
2866 #define FILE_ADD_SUBDIRECTORY 0x00000004
2867 #define FILE_APPEND_DATA 0x00000004
2868 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
2869 #define FILE_READ_EA 0x00000008
2870 #define FILE_WRITE_EA 0x00000010
2871 #define FILE_EXECUTE 0x00000020
2872 #define FILE_TRAVERSE 0x00000020
2873 #define FILE_DELETE_CHILD 0x00000040
2874 #define FILE_READ_ATTRIBUTES 0x00000080
2875 #define FILE_WRITE_ATTRIBUTES 0x00000100
2876
2877 #define FILE_SHARE_READ 0x00000001
2878 #define FILE_SHARE_WRITE 0x00000002
2879 #define FILE_SHARE_DELETE 0x00000004
2880 #define FILE_SHARE_VALID_FLAGS 0x00000007
2881
2882 #define FILE_ATTRIBUTE_READONLY 0x00000001
2883 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
2884 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
2885 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
2886 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
2887 #define FILE_ATTRIBUTE_DEVICE 0x00000040
2888 #define FILE_ATTRIBUTE_NORMAL 0x00000080
2889 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
2890 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
2891 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
2892 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
2893 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
2894 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
2895 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
2896 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
2897
2898 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
2899 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
2900
2901 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
2902 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
2903 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
2904 #define FILE_VALID_SET_FLAGS 0x00000036
2905
2906 #define FILE_SUPERSEDE 0x00000000
2907 #define FILE_OPEN 0x00000001
2908 #define FILE_CREATE 0x00000002
2909 #define FILE_OPEN_IF 0x00000003
2910 #define FILE_OVERWRITE 0x00000004
2911 #define FILE_OVERWRITE_IF 0x00000005
2912 #define FILE_MAXIMUM_DISPOSITION 0x00000005
2913
2914 #define FILE_DIRECTORY_FILE 0x00000001
2915 #define FILE_WRITE_THROUGH 0x00000002
2916 #define FILE_SEQUENTIAL_ONLY 0x00000004
2917 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
2918 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
2919 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
2920 #define FILE_NON_DIRECTORY_FILE 0x00000040
2921 #define FILE_CREATE_TREE_CONNECTION 0x00000080
2922 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
2923 #define FILE_NO_EA_KNOWLEDGE 0x00000200
2924 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
2925 #define FILE_RANDOM_ACCESS 0x00000800
2926 #define FILE_DELETE_ON_CLOSE 0x00001000
2927 #define FILE_OPEN_BY_FILE_ID 0x00002000
2928 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
2929 #define FILE_NO_COMPRESSION 0x00008000
2930 #if (NTDDI_VERSION >= NTDDI_WIN7)
2931 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
2932 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
2933 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2934 #define FILE_RESERVE_OPFILTER 0x00100000
2935 #define FILE_OPEN_REPARSE_POINT 0x00200000
2936 #define FILE_OPEN_NO_RECALL 0x00400000
2937 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
2938
2939 $endif (_WDMDDK_)
2940 $if (_WDMDDK_ || _DEVIOCTL_)
2941 #define FILE_ANY_ACCESS 0x00000000
2942 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
2943 #define FILE_READ_ACCESS 0x00000001
2944 #define FILE_WRITE_ACCESS 0x00000002
2945
2946 $endif (_WDMDDK_ || _DEVIOCTL_)
2947 $if (_WDMDDK_)
2948 #define FILE_ALL_ACCESS \
2949 (STANDARD_RIGHTS_REQUIRED | \
2950 SYNCHRONIZE | \
2951 0x1FF)
2952
2953 #define FILE_GENERIC_EXECUTE \
2954 (STANDARD_RIGHTS_EXECUTE | \
2955 FILE_READ_ATTRIBUTES | \
2956 FILE_EXECUTE | \
2957 SYNCHRONIZE)
2958
2959 #define FILE_GENERIC_READ \
2960 (STANDARD_RIGHTS_READ | \
2961 FILE_READ_DATA | \
2962 FILE_READ_ATTRIBUTES | \
2963 FILE_READ_EA | \
2964 SYNCHRONIZE)
2965
2966 #define FILE_GENERIC_WRITE \
2967 (STANDARD_RIGHTS_WRITE | \
2968 FILE_WRITE_DATA | \
2969 FILE_WRITE_ATTRIBUTES | \
2970 FILE_WRITE_EA | \
2971 FILE_APPEND_DATA | \
2972 SYNCHRONIZE)
2973
2974 /* end winnt.h */
2975
2976 #define WMIREG_ACTION_REGISTER 1
2977 #define WMIREG_ACTION_DEREGISTER 2
2978 #define WMIREG_ACTION_REREGISTER 3
2979 #define WMIREG_ACTION_UPDATE_GUIDS 4
2980 #define WMIREG_ACTION_BLOCK_IRPS 5
2981
2982 #define WMIREGISTER 0
2983 #define WMIUPDATE 1
2984
2985 typedef VOID
2986 (NTAPI FWMI_NOTIFICATION_CALLBACK)(
2987 PVOID Wnode,
2988 PVOID Context);
2989 typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
2990
2991 #ifndef _PCI_X_
2992 #define _PCI_X_
2993
2994 typedef struct _PCI_SLOT_NUMBER {
2995 union {
2996 struct {
2997 ULONG DeviceNumber:5;
2998 ULONG FunctionNumber:3;
2999 ULONG Reserved:24;
3000 } bits;
3001 ULONG AsULONG;
3002 } u;
3003 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
3004
3005 #define PCI_TYPE0_ADDRESSES 6
3006 #define PCI_TYPE1_ADDRESSES 2
3007 #define PCI_TYPE2_ADDRESSES 5
3008
3009 typedef struct _PCI_COMMON_HEADER {
3010 PCI_COMMON_HEADER_LAYOUT
3011 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
3012
3013 #ifdef __cplusplus
3014 typedef struct _PCI_COMMON_CONFIG {
3015 PCI_COMMON_HEADER_LAYOUT
3016 UCHAR DeviceSpecific[192];
3017 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
3018 #else
3019 typedef struct _PCI_COMMON_CONFIG {
3020 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
3021 UCHAR DeviceSpecific[192];
3022 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
3023 #endif
3024
3025 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
3026
3027 #define PCI_EXTENDED_CONFIG_LENGTH 0x1000
3028
3029 #define PCI_MAX_DEVICES 32
3030 #define PCI_MAX_FUNCTION 8
3031 #define PCI_MAX_BRIDGE_NUMBER 0xFF
3032 #define PCI_INVALID_VENDORID 0xFFFF
3033
3034 /* PCI_COMMON_CONFIG.HeaderType */
3035 #define PCI_MULTIFUNCTION 0x80
3036 #define PCI_DEVICE_TYPE 0x00
3037 #define PCI_BRIDGE_TYPE 0x01
3038 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
3039
3040 #define PCI_CONFIGURATION_TYPE(PciData) \
3041 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
3042
3043 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
3044 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
3045
3046 /* PCI_COMMON_CONFIG.Command */
3047 #define PCI_ENABLE_IO_SPACE 0x0001
3048 #define PCI_ENABLE_MEMORY_SPACE 0x0002
3049 #define PCI_ENABLE_BUS_MASTER 0x0004
3050 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
3051 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
3052 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
3053 #define PCI_ENABLE_PARITY 0x0040
3054 #define PCI_ENABLE_WAIT_CYCLE 0x0080
3055 #define PCI_ENABLE_SERR 0x0100
3056 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
3057 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
3058
3059 /* PCI_COMMON_CONFIG.Status */
3060 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
3061 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
3062 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
3063 #define PCI_STATUS_UDF_SUPPORTED 0x0040
3064 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
3065 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
3066 #define PCI_STATUS_DEVSEL 0x0600
3067 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
3068 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
3069 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
3070 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
3071 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
3072
3073 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
3074
3075 #define PCI_WHICHSPACE_CONFIG 0x0
3076 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
3077
3078 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
3079 #define PCI_CAPABILITY_ID_AGP 0x02
3080 #define PCI_CAPABILITY_ID_VPD 0x03
3081 #define PCI_CAPABILITY_ID_SLOT_ID 0x04
3082 #define PCI_CAPABILITY_ID_MSI 0x05
3083 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06
3084 #define PCI_CAPABILITY_ID_PCIX 0x07
3085 #define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08
3086 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09
3087 #define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A
3088 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B
3089 #define PCI_CAPABILITY_ID_SHPC 0x0C
3090 #define PCI_CAPABILITY_ID_P2P_SSID 0x0D
3091 #define PCI_CAPABILITY_ID_AGP_TARGET 0x0E
3092 #define PCI_CAPABILITY_ID_SECURE 0x0F
3093 #define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
3094 #define PCI_CAPABILITY_ID_MSIX 0x11
3095
3096 typedef struct _PCI_CAPABILITIES_HEADER {
3097 UCHAR CapabilityID;
3098 UCHAR Next;
3099 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
3100
3101 typedef struct _PCI_PMC {
3102 UCHAR Version:3;
3103 UCHAR PMEClock:1;
3104 UCHAR Rsvd1:1;
3105 UCHAR DeviceSpecificInitialization:1;
3106 UCHAR Rsvd2:2;
3107 struct _PM_SUPPORT {
3108 UCHAR Rsvd2:1;
3109 UCHAR D1:1;
3110 UCHAR D2:1;
3111 UCHAR PMED0:1;
3112 UCHAR PMED1:1;
3113 UCHAR PMED2:1;
3114 UCHAR PMED3Hot:1;
3115 UCHAR PMED3Cold:1;
3116 } Support;
3117 } PCI_PMC, *PPCI_PMC;
3118
3119 typedef struct _PCI_PMCSR {
3120 USHORT PowerState:2;
3121 USHORT Rsvd1:6;
3122 USHORT PMEEnable:1;
3123 USHORT DataSelect:4;
3124 USHORT DataScale:2;
3125 USHORT PMEStatus:1;
3126 } PCI_PMCSR, *PPCI_PMCSR;
3127
3128 typedef struct _PCI_PMCSR_BSE {
3129 UCHAR Rsvd1:6;
3130 UCHAR D3HotSupportsStopClock:1;
3131 UCHAR BusPowerClockControlEnabled:1;
3132 } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
3133
3134 typedef struct _PCI_PM_CAPABILITY {
3135 PCI_CAPABILITIES_HEADER Header;
3136 union {
3137 PCI_PMC Capabilities;
3138 USHORT AsUSHORT;
3139 } PMC;
3140 union {
3141 PCI_PMCSR ControlStatus;
3142 USHORT AsUSHORT;
3143 } PMCSR;
3144 union {
3145 PCI_PMCSR_BSE BridgeSupport;
3146 UCHAR AsUCHAR;
3147 } PMCSR_BSE;
3148 UCHAR Data;
3149 } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
3150
3151 typedef struct {
3152 PCI_CAPABILITIES_HEADER Header;
3153 union {
3154 struct {
3155 USHORT DataParityErrorRecoveryEnable:1;
3156 USHORT EnableRelaxedOrdering:1;
3157 USHORT MaxMemoryReadByteCount:2;
3158 USHORT MaxOutstandingSplitTransactions:3;
3159 USHORT Reserved:9;
3160 } bits;
3161 USHORT AsUSHORT;
3162 } Command;
3163 union {
3164 struct {
3165 ULONG FunctionNumber:3;
3166 ULONG DeviceNumber:5;
3167 ULONG BusNumber:8;
3168 ULONG Device64Bit:1;
3169 ULONG Capable133MHz:1;
3170 ULONG SplitCompletionDiscarded:1;
3171 ULONG UnexpectedSplitCompletion:1;
3172 ULONG DeviceComplexity:1;
3173 ULONG DesignedMaxMemoryReadByteCount:2;
3174 ULONG DesignedMaxOutstandingSplitTransactions:3;
3175 ULONG DesignedMaxCumulativeReadSize:3;
3176 ULONG ReceivedSplitCompletionErrorMessage:1;
3177 ULONG CapablePCIX266:1;
3178 ULONG CapablePCIX533:1;
3179 } bits;
3180 ULONG AsULONG;
3181 } Status;
3182 } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
3183
3184 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001
3185 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002
3186 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003
3187 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004
3188 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005
3189 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006
3190 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007
3191 #define PCI_EXPRESS_MFVC_CAP_ID 0x0008
3192 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009
3193 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A
3194 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010
3195
3196 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
3197 USHORT CapabilityID;
3198 USHORT Version:4;
3199 USHORT Next:12;
3200 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
3201
3202 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
3203 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
3204 ULONG LowSerialNumber;
3205 ULONG HighSerialNumber;
3206 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
3207
3208 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
3209 _ANONYMOUS_STRUCT struct {
3210 ULONG Undefined:1;
3211 ULONG Reserved1:3;
3212 ULONG DataLinkProtocolError:1;
3213 ULONG SurpriseDownError:1;
3214 ULONG Reserved2:6;
3215 ULONG PoisonedTLP:1;
3216 ULONG FlowControlProtocolError:1;
3217 ULONG CompletionTimeout:1;
3218 ULONG CompleterAbort:1;
3219 ULONG UnexpectedCompletion:1;
3220 ULONG ReceiverOverflow:1;
3221 ULONG MalformedTLP:1;
3222 ULONG ECRCError:1;
3223 ULONG UnsupportedRequestError:1;
3224 ULONG Reserved3:11;
3225 } DUMMYSTRUCTNAME;
3226 ULONG AsULONG;
3227 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
3228
3229 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
3230 _ANONYMOUS_STRUCT struct {
3231 ULONG Undefined:1;
3232 ULONG Reserved1:3;
3233 ULONG DataLinkProtocolError:1;
3234 ULONG SurpriseDownError:1;
3235 ULONG Reserved2:6;
3236 ULONG PoisonedTLP:1;
3237 ULONG FlowControlProtocolError:1;
3238 ULONG CompletionTimeout:1;
3239 ULONG CompleterAbort:1;
3240 ULONG UnexpectedCompletion:1;
3241 ULONG ReceiverOverflow:1;
3242 ULONG MalformedTLP:1;
3243 ULONG ECRCError:1;
3244 ULONG UnsupportedRequestError:1;
3245 ULONG Reserved3:11;
3246 } DUMMYSTRUCTNAME;
3247 ULONG AsULONG;
3248 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
3249
3250 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
3251 _ANONYMOUS_STRUCT struct {
3252 ULONG Undefined:1;
3253 ULONG Reserved1:3;
3254 ULONG DataLinkProtocolError:1;
3255 ULONG SurpriseDownError:1;
3256 ULONG Reserved2:6;
3257 ULONG PoisonedTLP:1;
3258 ULONG FlowControlProtocolError:1;
3259 ULONG CompletionTimeout:1;
3260 ULONG CompleterAbort:1;
3261 ULONG UnexpectedCompletion:1;
3262 ULONG ReceiverOverflow:1;
3263 ULONG MalformedTLP:1;
3264 ULONG ECRCError:1;
3265 ULONG UnsupportedRequestError:1;
3266 ULONG Reserved3:11;
3267 } DUMMYSTRUCTNAME;
3268 ULONG AsULONG;
3269 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
3270
3271 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
3272 _ANONYMOUS_STRUCT struct {
3273 ULONG ReceiverError:1;
3274 ULONG Reserved1:5;
3275 ULONG BadTLP:1;
3276 ULONG BadDLLP:1;
3277 ULONG ReplayNumRollover:1;
3278 ULONG Reserved2:3;
3279 ULONG ReplayTimerTimeout:1;
3280 ULONG AdvisoryNonFatalError:1;
3281 ULONG Reserved3:18;
3282 } DUMMYSTRUCTNAME;
3283 ULONG AsULONG;
3284 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
3285
3286 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
3287 _ANONYMOUS_STRUCT struct {
3288 ULONG ReceiverError:1;
3289 ULONG Reserved1:5;
3290 ULONG BadTLP:1;
3291 ULONG BadDLLP:1;
3292 ULONG ReplayNumRollover:1;
3293 ULONG Reserved2:3;
3294 ULONG ReplayTimerTimeout:1;
3295 ULONG AdvisoryNonFatalError:1;
3296 ULONG Reserved3:18;
3297 } DUMMYSTRUCTNAME;
3298 ULONG AsULONG;
3299 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
3300
3301 typedef union _PCI_EXPRESS_AER_CAPABILITIES {
3302 _ANONYMOUS_STRUCT struct {
3303 ULONG FirstErrorPointer:5;
3304 ULONG ECRCGenerationCapable:1;
3305 ULONG ECRCGenerationEnable:1;
3306 ULONG ECRCCheckCapable:1;
3307 ULONG ECRCCheckEnable:1;
3308 ULONG Reserved:23;
3309 } DUMMYSTRUCTNAME;
3310 ULONG AsULONG;
3311 } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
3312
3313 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
3314 _ANONYMOUS_STRUCT struct {
3315 ULONG CorrectableErrorReportingEnable:1;
3316 ULONG NonFatalErrorReportingEnable:1;
3317 ULONG FatalErrorReportingEnable:1;
3318 ULONG Reserved:29;
3319 } DUMMYSTRUCTNAME;
3320 ULONG AsULONG;
3321 } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
3322
3323 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
3324 _ANONYMOUS_STRUCT struct {
3325 ULONG CorrectableErrorReceived:1;
3326 ULONG MultipleCorrectableErrorsReceived:1;
3327 ULONG UncorrectableErrorReceived:1;
3328 ULONG MultipleUncorrectableErrorsReceived:1;
3329 ULONG FirstUncorrectableFatal:1;
3330 ULONG NonFatalErrorMessagesReceived:1;
3331 ULONG FatalErrorMessagesReceived:1;
3332 ULONG Reserved:20;
3333 ULONG AdvancedErrorInterruptMessageNumber:5;
3334 } DUMMYSTRUCTNAME;
3335 ULONG AsULONG;
3336 } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
3337
3338 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
3339 _ANONYMOUS_STRUCT struct {
3340 USHORT CorrectableSourceIdFun:3;
3341 USHORT CorrectableSourceIdDev:5;
3342 USHORT CorrectableSourceIdBus:8;
3343 USHORT UncorrectableSourceIdFun:3;
3344 USHORT UncorrectableSourceIdDev:5;
3345 USHORT UncorrectableSourceIdBus:8;
3346 } DUMMYSTRUCTNAME;
3347 ULONG AsULONG;
3348 } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
3349
3350 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
3351 _ANONYMOUS_STRUCT struct {
3352 ULONG TargetAbortOnSplitCompletion:1;
3353 ULONG MasterAbortOnSplitCompletion:1;
3354 ULONG ReceivedTargetAbort:1;
3355 ULONG ReceivedMasterAbort:1;
3356 ULONG RsvdZ:1;
3357 ULONG UnexpectedSplitCompletionError:1;
3358 ULONG UncorrectableSplitCompletion:1;
3359 ULONG UncorrectableDataError:1;
3360 ULONG UncorrectableAttributeError:1;
3361 ULONG UncorrectableAddressError:1;
3362 ULONG DelayedTransactionDiscardTimerExpired:1;
3363 ULONG PERRAsserted:1;
3364 ULONG SERRAsserted:1;
3365 ULONG InternalBridgeError:1;
3366 ULONG Reserved:18;
3367 } DUMMYSTRUCTNAME;
3368 ULONG AsULONG;
3369 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
3370
3371 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
3372 _ANONYMOUS_STRUCT struct {
3373 ULONG TargetAbortOnSplitCompletion:1;
3374 ULONG MasterAbortOnSplitCompletion:1;
3375 ULONG ReceivedTargetAbort:1;
3376 ULONG ReceivedMasterAbort:1;
3377 ULONG RsvdZ:1;
3378 ULONG UnexpectedSplitCompletionError:1;
3379 ULONG UncorrectableSplitCompletion:1;
3380 ULONG UncorrectableDataError:1;
3381 ULONG UncorrectableAttributeError:1;
3382 ULONG UncorrectableAddressError:1;
3383 ULONG DelayedTransactionDiscardTimerExpired:1;
3384 ULONG PERRAsserted:1;
3385 ULONG SERRAsserted:1;
3386 ULONG InternalBridgeError:1;
3387 ULONG Reserved:18;
3388 } DUMMYSTRUCTNAME;
3389 ULONG AsULONG;
3390 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
3391
3392 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
3393 _ANONYMOUS_STRUCT struct {
3394 ULONG TargetAbortOnSplitCompletion:1;
3395 ULONG MasterAbortOnSplitCompletion:1;
3396 ULONG ReceivedTargetAbort:1;
3397 ULONG ReceivedMasterAbort:1;
3398 ULONG RsvdZ:1;
3399 ULONG UnexpectedSplitCompletionError:1;
3400 ULONG UncorrectableSplitCompletion:1;
3401 ULONG UncorrectableDataError:1;
3402 ULONG UncorrectableAttributeError:1;
3403 ULONG UncorrectableAddressError:1;
3404 ULONG DelayedTransactionDiscardTimerExpired:1;
3405 ULONG PERRAsserted:1;
3406 ULONG SERRAsserted:1;
3407 ULONG InternalBridgeError:1;
3408 ULONG Reserved:18;
3409 } DUMMYSTRUCTNAME;
3410 ULONG AsULONG;
3411 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
3412
3413 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
3414 _ANONYMOUS_STRUCT struct {
3415 ULONG SecondaryUncorrectableFirstErrorPtr:5;
3416 ULONG Reserved:27;
3417 } DUMMYSTRUCTNAME;
3418 ULONG AsULONG;
3419 } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
3420
3421 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001
3422 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002
3423 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004
3424
3425 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
3426 (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
3427 ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
3428 ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
3429
3430 typedef struct _PCI_EXPRESS_AER_CAPABILITY {
3431 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
3432 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
3433 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
3434 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
3435 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
3436 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
3437 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
3438 ULONG HeaderLog[4];
3439 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
3440 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
3441 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
3442 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
3443 ULONG SecHeaderLog[4];
3444 } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
3445
3446 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
3447 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
3448 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
3449 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
3450 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
3451 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
3452 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
3453 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
3454 ULONG HeaderLog[4];
3455 PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
3456 PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
3457 PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
3458 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
3459
3460 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
3461 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
3462 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
3463 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
3464 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
3465 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
3466 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
3467 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
3468 ULONG HeaderLog[4];
3469 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
3470 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
3471 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
3472 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
3473 ULONG SecHeaderLog[4];
3474 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
3475
3476 typedef union _PCI_EXPRESS_SRIOV_CAPS {
3477 _ANONYMOUS_STRUCT struct {
3478 ULONG VFMigrationCapable:1;
3479 ULONG Reserved1:20;
3480 ULONG VFMigrationInterruptNumber:11;
3481 } DUMMYSTRUCTNAME;
3482 ULONG AsULONG;
3483 } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
3484
3485 typedef union _PCI_EXPRESS_SRIOV_CONTROL {
3486 _ANONYMOUS_STRUCT struct {
3487 USHORT VFEnable:1;
3488 USHORT VFMigrationEnable:1;
3489 USHORT VFMigrationInterruptEnable:1;
3490 USHORT VFMemorySpaceEnable:1;
3491 USHORT ARICapableHierarchy:1;
3492 USHORT Reserved1:11;
3493 } DUMMYSTRUCTNAME;
3494 USHORT AsUSHORT;
3495 } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
3496
3497 typedef union _PCI_EXPRESS_SRIOV_STATUS {
3498 _ANONYMOUS_STRUCT struct {
3499 USHORT VFMigrationStatus:1;
3500 USHORT Reserved1:15;
3501 } DUMMYSTRUCTNAME;
3502 USHORT AsUSHORT;
3503 } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
3504
3505 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
3506 _ANONYMOUS_STRUCT struct {
3507 ULONG VFMigrationStateBIR:3;
3508 ULONG VFMigrationStateOffset:29;
3509 } DUMMYSTRUCTNAME;
3510 ULONG AsULONG;
3511 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
3512
3513 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
3514 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
3515 PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
3516 PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
3517 PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
3518 USHORT InitialVFs;
3519 USHORT TotalVFs;
3520 USHORT NumVFs;
3521 UCHAR FunctionDependencyLink;
3522 UCHAR RsvdP1;
3523 USHORT FirstVFOffset;
3524 USHORT VFStride;
3525 USHORT RsvdP2;
3526 USHORT VFDeviceId;
3527 ULONG SupportedPageSizes;
3528 ULONG SystemPageSize;
3529 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
3530 PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
3531 } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
3532
3533 /* PCI device classes */
3534 #define PCI_CLASS_PRE_20 0x00
3535 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
3536 #define PCI_CLASS_NETWORK_CTLR 0x02
3537 #define PCI_CLASS_DISPLAY_CTLR 0x03
3538 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
3539 #define PCI_CLASS_MEMORY_CTLR 0x05
3540 #define PCI_CLASS_BRIDGE_DEV 0x06
3541 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
3542 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
3543 #define PCI_CLASS_INPUT_DEV 0x09
3544 #define PCI_CLASS_DOCKING_STATION 0x0a
3545 #define PCI_CLASS_PROCESSOR 0x0b
3546 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
3547 #define PCI_CLASS_WIRELESS_CTLR 0x0d
3548 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
3549 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
3550 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
3551 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
3552 #define PCI_CLASS_NOT_DEFINED 0xff
3553
3554 /* PCI device subclasses for class 0 */
3555 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
3556 #define PCI_SUBCLASS_PRE_20_VGA 0x01
3557
3558 /* PCI device subclasses for class 1 (mass storage controllers)*/
3559 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
3560 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
3561 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
3562 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
3563 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
3564 #define PCI_SUBCLASS_MSC_OTHER 0x80
3565
3566 /* PCI device subclasses for class 2 (network controllers)*/
3567 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
3568 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
3569 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
3570 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
3571 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
3572 #define PCI_SUBCLASS_NET_OTHER 0x80
3573
3574 /* PCI device subclasses for class 3 (display controllers)*/
3575 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
3576 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
3577 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
3578 #define PCI_SUBCLASS_VID_OTHER 0x80
3579
3580 /* PCI device subclasses for class 4 (multimedia device)*/
3581 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
3582 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
3583 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
3584 #define PCI_SUBCLASS_MM_OTHER 0x80
3585
3586 /* PCI device subclasses for class 5 (memory controller)*/
3587 #define PCI_SUBCLASS_MEM_RAM 0x00
3588 #define PCI_SUBCLASS_MEM_FLASH 0x01
3589 #define PCI_SUBCLASS_MEM_OTHER 0x80
3590
3591 /* PCI device subclasses for class 6 (bridge device)*/
3592 #define PCI_SUBCLASS_BR_HOST 0x00
3593 #define PCI_SUBCLASS_BR_ISA 0x01
3594 #define PCI_SUBCLASS_BR_EISA 0x02
3595 #define PCI_SUBCLASS_BR_MCA 0x03
3596 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
3597 #define PCI_SUBCLASS_BR_PCMCIA 0x05
3598 #define PCI_SUBCLASS_BR_NUBUS 0x06
3599 #define PCI_SUBCLASS_BR_CARDBUS 0x07
3600 #define PCI_SUBCLASS_BR_RACEWAY 0x08
3601 #define PCI_SUBCLASS_BR_OTHER 0x80
3602
3603 #define PCI_SUBCLASS_COM_SERIAL 0x00
3604 #define PCI_SUBCLASS_COM_PARALLEL 0x01
3605 #define PCI_SUBCLASS_COM_MULTIPORT 0x02
3606 #define PCI_SUBCLASS_COM_MODEM 0x03
3607 #define PCI_SUBCLASS_COM_OTHER 0x80
3608
3609 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00
3610 #define PCI_SUBCLASS_SYS_DMA_CTLR 0x01
3611 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02
3612 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03
3613 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04
3614 #define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05
3615 #define PCI_SUBCLASS_SYS_OTHER 0x80
3616
3617 #define PCI_SUBCLASS_INP_KEYBOARD 0x00
3618 #define PCI_SUBCLASS_INP_DIGITIZER 0x01
3619 #define PCI_SUBCLASS_INP_MOUSE 0x02
3620 #define PCI_SUBCLASS_INP_SCANNER 0x03
3621 #define PCI_SUBCLASS_INP_GAMEPORT 0x04
3622 #define PCI_SUBCLASS_INP_OTHER 0x80
3623
3624 #define PCI_SUBCLASS_DOC_GENERIC 0x00
3625 #define PCI_SUBCLASS_DOC_OTHER 0x80
3626
3627 #define PCI_SUBCLASS_PROC_386 0x00
3628 #define PCI_SUBCLASS_PROC_486 0x01
3629 #define PCI_SUBCLASS_PROC_PENTIUM 0x02
3630 #define PCI_SUBCLASS_PROC_ALPHA 0x10
3631 #define PCI_SUBCLASS_PROC_POWERPC 0x20
3632 #define PCI_SUBCLASS_PROC_COPROCESSOR 0x40
3633
3634 /* PCI device subclasses for class C (serial bus controller)*/
3635 #define PCI_SUBCLASS_SB_IEEE1394 0x00
3636 #define PCI_SUBCLASS_SB_ACCESS 0x01
3637 #define PCI_SUBCLASS_SB_SSA 0x02
3638 #define PCI_SUBCLASS_SB_USB 0x03
3639 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
3640 #define PCI_SUBCLASS_SB_SMBUS 0x05
3641
3642 #define PCI_SUBCLASS_WIRELESS_IRDA 0x00
3643 #define PCI_SUBCLASS_WIRELESS_CON_IR 0x01
3644 #define PCI_SUBCLASS_WIRELESS_RF 0x10
3645 #define PCI_SUBCLASS_WIRELESS_OTHER 0x80
3646
3647 #define PCI_SUBCLASS_INTIO_I2O 0x00
3648
3649 #define PCI_SUBCLASS_SAT_TV 0x01
3650 #define PCI_SUBCLASS_SAT_AUDIO 0x02
3651 #define PCI_SUBCLASS_SAT_VOICE 0x03
3652 #define PCI_SUBCLASS_SAT_DATA 0x04
3653
3654 #define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00
3655 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10
3656 #define PCI_SUBCLASS_CRYPTO_OTHER 0x80
3657
3658 #define PCI_SUBCLASS_DASP_DPIO 0x00
3659 #define PCI_SUBCLASS_DASP_OTHER 0x80
3660
3661 #define PCI_ADDRESS_IO_SPACE 0x00000001
3662 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
3663 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
3664 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
3665 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
3666 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
3667
3668 #define PCI_TYPE_32BIT 0
3669 #define PCI_TYPE_20BIT 2
3670 #define PCI_TYPE_64BIT 4
3671
3672 #define PCI_ROMADDRESS_ENABLED 0x00000001
3673
3674 #endif /* _PCI_X_ */
3675
3676 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1
3677
3678 typedef NTSTATUS
3679 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
3680 IN OUT PVOID Context);
3681 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
3682
3683 typedef NTSTATUS
3684 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
3685 IN OUT PVOID Context);
3686 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
3687
3688 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
3689 USHORT Size;
3690 USHORT Version;
3691 PVOID Context;
3692 PINTERFACE_REFERENCE InterfaceReference;
3693 PINTERFACE_DEREFERENCE InterfaceDereference;
3694 PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
3695 PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
3696 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
3697
3698 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1
3699
3700 typedef ULONG
3701 (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
3702 IN PVOID Context,
3703 OUT PVOID Buffer,
3704 IN ULONG Offset,
3705 IN ULONG Length);
3706
3707 typedef ULONG
3708 (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
3709 IN PVOID Context,
3710 IN PVOID Buffer,
3711 IN ULONG Offset,
3712 IN ULONG Length);
3713
3714 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
3715 USHORT Size;
3716 USHORT Version;
3717 PVOID Context;
3718 PINTERFACE_REFERENCE InterfaceReference;
3719 PINTERFACE_DEREFERENCE InterfaceDereference;
3720 PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
3721 PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
3722 } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
3723
3724 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1
3725
3726 typedef NTSTATUS
3727 (NTAPI PCI_MSIX_SET_ENTRY)(
3728 IN PVOID Context,
3729 IN ULONG TableEntry,
3730 IN ULONG MessageNumber);
3731 typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
3732
3733 typedef NTSTATUS
3734 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
3735 IN PVOID Context,
3736 IN ULONG TableEntry);
3737 typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
3738
3739 typedef NTSTATUS
3740 (NTAPI PCI_MSIX_GET_ENTRY)(
3741 IN PVOID Context,
3742 IN ULONG TableEntry,
3743 OUT PULONG MessageNumber,
3744 OUT PBOOLEAN Masked);
3745 typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
3746
3747 typedef NTSTATUS
3748 (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
3749 IN PVOID Context,
3750 OUT PULONG TableSize);
3751 typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
3752
3753 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
3754 USHORT Size;
3755 USHORT Version;
3756 PVOID Context;
3757 PINTERFACE_REFERENCE InterfaceReference;
3758 PINTERFACE_DEREFERENCE InterfaceDereference;
3759 PPCI_MSIX_SET_ENTRY SetTableEntry;
3760 PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
3761 PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
3762 PPCI_MSIX_GET_ENTRY GetTableEntry;
3763 PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
3764 } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
3765
3766 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
3767 RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
3768
3769 $endif (_WDMDDK_)
3770 $if (_NTDDK_)
3771 #ifndef _ARC_DDK_
3772 #define _ARC_DDK_
3773 typedef enum _CONFIGURATION_TYPE {
3774 ArcSystem,
3775 CentralProcessor,
3776 FloatingPointProcessor,
3777 PrimaryIcache,
3778 PrimaryDcache,
3779 SecondaryIcache,
3780 SecondaryDcache,
3781 SecondaryCache,
3782 EisaAdapter,
3783 TcAdapter,
3784 ScsiAdapter,
3785 DtiAdapter,
3786 MultiFunctionAdapter,
3787 DiskController,
3788 TapeController,
3789 CdromController,
3790 WormController,
3791 SerialController,
3792 NetworkController,
3793 DisplayController,
3794 ParallelController,
3795 PointerController,
3796 KeyboardController,
3797 AudioController,
3798 OtherController,
3799 DiskPeripheral,
3800 FloppyDiskPeripheral,
3801 TapePeripheral,
3802 ModemPeripheral,
3803 MonitorPeripheral,
3804 PrinterPeripheral,
3805 PointerPeripheral,
3806 KeyboardPeripheral,
3807 TerminalPeripheral,
3808 OtherPeripheral,
3809 LinePeripheral,
3810 NetworkPeripheral,
3811 SystemMemory,
3812 DockingInformation,
3813 RealModeIrqRoutingTable,
3814 RealModePCIEnumeration,
3815 MaximumType
3816 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
3817 #endif /* !_ARC_DDK_ */
3818
3819 /*
3820 ** IRP function codes
3821 */
3822
3823 #define IRP_MN_QUERY_DIRECTORY 0x01
3824 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
3825
3826 #define IRP_MN_USER_FS_REQUEST 0x00
3827 #define IRP_MN_MOUNT_VOLUME 0x01
3828 #define IRP_MN_VERIFY_VOLUME 0x02
3829 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
3830 #define IRP_MN_TRACK_LINK 0x04
3831 #define IRP_MN_KERNEL_CALL 0x04
3832
3833 #define IRP_MN_LOCK 0x01
3834 #define IRP_MN_UNLOCK_SINGLE 0x02
3835 #define IRP_MN_UNLOCK_ALL 0x03
3836 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
3837
3838 #define IRP_MN_FLUSH_AND_PURGE 0x01
3839
3840 #define IRP_MN_NORMAL 0x00
3841 #define IRP_MN_DPC 0x01
3842 #define IRP_MN_MDL 0x02
3843 #define IRP_MN_COMPLETE 0x04
3844 #define IRP_MN_COMPRESSED 0x08
3845
3846 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
3847 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
3848 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
3849
3850 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
3851
3852 #define IO_CHECK_CREATE_PARAMETERS 0x0200
3853 #define IO_ATTACH_DEVICE 0x0400
3854 #define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
3855
3856 typedef NTSTATUS
3857 (NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
3858 IN PVOID Context,
3859 IN PUNICODE_STRING PathName,
3860 IN INTERFACE_TYPE BusType,
3861 IN ULONG BusNumber,
3862 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
3863 IN CONFIGURATION_TYPE ControllerType,
3864 IN ULONG ControllerNumber,
3865 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
3866 IN CONFIGURATION_TYPE PeripheralType,
3867 IN ULONG PeripheralNumber,
3868 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3869
3870 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
3871 IoQueryDeviceIdentifier = 0,
3872 IoQueryDeviceConfigurationData,
3873 IoQueryDeviceComponentInformation,
3874 IoQueryDeviceMaxData
3875 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
3876
3877 typedef VOID
3878 (NTAPI *PDRIVER_REINITIALIZE)(
3879 IN struct _DRIVER_OBJECT *DriverObject,
3880 IN PVOID Context OPTIONAL,
3881 IN ULONG Count);
3882
3883 typedef struct _CONTROLLER_OBJECT {
3884 CSHORT Type;
3885 CSHORT Size;
3886 PVOID ControllerExtension;
3887 KDEVICE_QUEUE DeviceWaitQueue;
3888 ULONG Spare1;
3889 LARGE_INTEGER Spare2;
3890 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
3891
3892 #define DRVO_REINIT_REGISTERED 0x00000008
3893 #define DRVO_INITIALIZED 0x00000010
3894 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
3895 #define DRVO_LEGACY_RESOURCES 0x00000040
3896
3897 typedef struct _CONFIGURATION_INFORMATION {
3898 ULONG DiskCount;
3899 ULONG FloppyCount;
3900 ULONG CdRomCount;
3901 ULONG TapeCount;
3902 ULONG ScsiPortCount;
3903 ULONG SerialCount;
3904 ULONG ParallelCount;
3905 BOOLEAN AtDiskPrimaryAddressClaimed;
3906 BOOLEAN AtDiskSecondaryAddressClaimed;
3907 ULONG Version;
3908 ULONG MediumChangerCount;
3909 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
3910
3911 typedef struct _DISK_SIGNATURE {
3912 ULONG PartitionStyle;
3913 _ANONYMOUS_UNION union {
3914 struct {
3915 ULONG Signature;
3916 ULONG CheckSum;
3917 } Mbr;
3918 struct {
3919 GUID DiskId;
3920 } Gpt;
3921 } DUMMYUNIONNAME;
3922 } DISK_SIGNATURE, *PDISK_SIGNATURE;
3923
3924 typedef struct _TXN_PARAMETER_BLOCK {
3925 USHORT Length;
3926 USHORT TxFsContext;
3927 PVOID TransactionObject;
3928 } TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK;
3929
3930 #define TXF_MINIVERSION_DEFAULT_VIEW (0xFFFE)
3931
3932 typedef struct _IO_DRIVER_CREATE_CONTEXT {
3933 CSHORT Size;
3934 struct _ECP_LIST *ExtraCreateParameter;
3935 PVOID DeviceObjectHint;
3936 PTXN_PARAMETER_BLOCK TxnParameters;
3937 } IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT;
3938
3939 typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD {
3940 USHORT Size;
3941 USHORT Version;
3942 PVOID Context;
3943 PINTERFACE_REFERENCE InterfaceReference;
3944 PINTERFACE_DEREFERENCE InterfaceDereference;
3945 PGET_SET_DEVICE_DATA SetBusData;
3946 PGET_SET_DEVICE_DATA GetBusData;
3947 UCHAR CapabilityID;
3948 } AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD;
3949
3950 typedef NTSTATUS
3951 (NTAPI *PGET_LOCATION_STRING)(
3952 IN OUT PVOID Context OPTIONAL,
3953 OUT PWCHAR *LocationStrings);
3954
3955 typedef struct _PNP_LOCATION_INTERFACE {
3956 USHORT Size;
3957 USHORT Version;
3958 PVOID Context;
3959 PINTERFACE_REFERENCE InterfaceReference;
3960 PINTERFACE_DEREFERENCE InterfaceDereference;
3961 PGET_LOCATION_STRING GetLocationString;
3962 } PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE;
3963
3964 typedef enum _ARBITER_ACTION {
3965 ArbiterActionTestAllocation,
3966 ArbiterActionRetestAllocation,
3967 ArbiterActionCommitAllocation,
3968 ArbiterActionRollbackAllocation,
3969 ArbiterActionQueryAllocatedResources,
3970 ArbiterActionWriteReservedResources,
3971 ArbiterActionQueryConflict,
3972 ArbiterActionQueryArbitrate,
3973 ArbiterActionAddReserved,
3974 ArbiterActionBootAllocation
3975 } ARBITER_ACTION, *PARBITER_ACTION;
3976
3977 typedef struct _ARBITER_CONFLICT_INFO {
3978 PDEVICE_OBJECT OwningObject;
3979 ULONGLONG Start;
3980 ULONGLONG End;
3981 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
3982
3983 typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS {
3984 IN OUT PLIST_ENTRY ArbitrationList;
3985 IN ULONG AllocateFromCount;
3986 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
3987 } ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS;
3988
3989 typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS {
3990 IN OUT PLIST_ENTRY ArbitrationList;
3991 IN ULONG AllocateFromCount;
3992 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
3993 } ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS;
3994
3995 typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS {
3996 IN OUT PLIST_ENTRY ArbitrationList;
3997 } ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS;
3998
3999 typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS {
4000 OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
4001 } ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS;
4002
4003 typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS {
4004 IN PDEVICE_OBJECT PhysicalDeviceObject;
4005 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
4006 OUT PULONG ConflictCount;
4007 OUT PARBITER_CONFLICT_INFO *Conflicts;
4008 } ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS;
4009
4010 typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS {
4011 IN PLIST_ENTRY ArbitrationList;
4012 } ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS;
4013
4014 typedef struct _ARBITER_ADD_RESERVED_PARAMETERS {
4015 IN PDEVICE_OBJECT ReserveDevice;
4016 } ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS;
4017
4018 typedef struct _ARBITER_PARAMETERS {
4019 union {
4020 ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation;
4021 ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation;
4022 ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation;
4023 ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources;
4024 ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict;
4025 ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate;
4026 ARBITER_ADD_RESERVED_PARAMETERS AddReserved;
4027 } Parameters;
4028 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
4029
4030 typedef enum _ARBITER_REQUEST_SOURCE {
4031 ArbiterRequestUndefined = -1,
4032 ArbiterRequestLegacyReported,
4033 ArbiterRequestHalReported,
4034 ArbiterRequestLegacyAssigned,
4035 ArbiterRequestPnpDetected,
4036 ArbiterRequestPnpEnumerated
4037 } ARBITER_REQUEST_SOURCE;
4038
4039 typedef enum _ARBITER_RESULT {
4040 ArbiterResultUndefined = -1,
4041 ArbiterResultSuccess,
4042 ArbiterResultExternalConflict,
4043 ArbiterResultNullRequest
4044 } ARBITER_RESULT;
4045
4046 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
4047
4048 typedef struct _ARBITER_LIST_ENTRY {
4049 LIST_ENTRY ListEntry;
4050 ULONG AlternativeCount;
4051 PIO_RESOURCE_DESCRIPTOR Alternatives;
4052 PDEVICE_OBJECT PhysicalDeviceObject;
4053 ARBITER_REQUEST_SOURCE RequestSource;
4054 ULONG Flags;
4055 LONG_PTR WorkSpace;
4056 INTERFACE_TYPE InterfaceType;
4057 ULONG SlotNumber;
4058 ULONG BusNumber;
4059 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
4060 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
4061 ARBITER_RESULT Result;
4062 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
4063
4064 typedef NTSTATUS
4065 (NTAPI *PARBITER_HANDLER)(
4066 IN OUT PVOID Context,
4067 IN ARBITER_ACTION Action,
4068 IN OUT PARBITER_PARAMETERS Parameters);
4069
4070 #define ARBITER_PARTIAL 0x00000001
4071
4072 typedef struct _ARBITER_INTERFACE {
4073 USHORT Size;
4074 USHORT Version;
4075 PVOID Context;
4076 PINTERFACE_REFERENCE InterfaceReference;
4077 PINTERFACE_DEREFERENCE InterfaceDereference;
4078 PARBITER_HANDLER ArbiterHandler;
4079 ULONG Flags;
4080 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
4081
4082 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
4083 TranslateChildToParent,
4084 TranslateParentToChild
4085 } RESOURCE_TRANSLATION_DIRECTION;
4086
4087 typedef NTSTATUS
4088 (NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
4089 IN OUT PVOID Context OPTIONAL,
4090 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
4091 IN RESOURCE_TRANSLATION_DIRECTION Direction,
4092 IN ULONG AlternativesCount OPTIONAL,
4093 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
4094 IN PDEVICE_OBJECT PhysicalDeviceObject,
4095 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
4096
4097 typedef NTSTATUS
4098 (NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
4099 IN OUT PVOID Context OPTIONAL,
4100 IN PIO_RESOURCE_DESCRIPTOR Source,
4101 IN PDEVICE_OBJECT PhysicalDeviceObject,
4102 OUT PULONG TargetCount,
4103 OUT PIO_RESOURCE_DESCRIPTOR *Target);
4104
4105 typedef struct _TRANSLATOR_INTERFACE {
4106 USHORT Size;
4107 USHORT Version;
4108 PVOID Context;
4109 PINTERFACE_REFERENCE InterfaceReference;
4110 PINTERFACE_DEREFERENCE InterfaceDereference;
4111 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
4112 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
4113 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
4114
4115 typedef struct _PCI_AGP_CAPABILITY {
4116 PCI_CAPABILITIES_HEADER Header;
4117 USHORT Minor:4;
4118 USHORT Major:4;
4119 USHORT Rsvd1:8;
4120 struct _PCI_AGP_STATUS {
4121 ULONG Rate:3;
4122 ULONG Agp3Mode:1;
4123 ULONG FastWrite:1;
4124 ULONG FourGB:1;
4125 ULONG HostTransDisable:1;
4126 ULONG Gart64:1;
4127 ULONG ITA_Coherent:1;
4128 ULONG SideBandAddressing:1;
4129 ULONG CalibrationCycle:3;
4130 ULONG AsyncRequestSize:3;
4131 ULONG Rsvd1:1;
4132 ULONG Isoch:1;
4133 ULONG Rsvd2:6;
4134 ULONG RequestQueueDepthMaximum:8;
4135 } AGPStatus;
4136 struct _PCI_AGP_COMMAND {
4137 ULONG Rate:3;
4138 ULONG Rsvd1:1;
4139 ULONG FastWriteEnable:1;
4140 ULONG FourGBEnable:1;
4141 ULONG Rsvd2:1;
4142 ULONG Gart64:1;
4143 ULONG AGPEnable:1;
4144 ULONG SBAEnable:1;
4145 ULONG CalibrationCycle:3;
4146 ULONG AsyncReqSize:3;
4147 ULONG Rsvd3:8;
4148 ULONG RequestQueueDepth:8;
4149 } AGPCommand;
4150 } PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY;
4151
4152 typedef enum _EXTENDED_AGP_REGISTER {
4153 IsochStatus,
4154 AgpControl,
4155 ApertureSize,
4156 AperturePageSize,
4157 GartLow,
4158 GartHigh,
4159 IsochCommand
4160 } EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER;
4161
4162 typedef struct _PCI_AGP_ISOCH_STATUS {
4163 ULONG ErrorCode:2;
4164 ULONG Rsvd1:1;
4165 ULONG Isoch_L:3;
4166 ULONG Isoch_Y:2;
4167 ULONG Isoch_N:8;
4168 ULONG Rsvd2:16;
4169 } PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS;
4170
4171 typedef struct _PCI_AGP_CONTROL {
4172 ULONG Rsvd1:7;
4173 ULONG GTLB_Enable:1;
4174 ULONG AP_Enable:1;
4175 ULONG CAL_Disable:1;
4176 ULONG Rsvd2:22;
4177 } PCI_AGP_CONTROL, *PPCI_AGP_CONTROL;
4178
4179 typedef struct _PCI_AGP_APERTURE_PAGE_SIZE {
4180 USHORT PageSizeMask:11;
4181 USHORT Rsvd1:1;
4182 USHORT PageSizeSelect:4;
4183 } PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE;
4184
4185 typedef struct _PCI_AGP_ISOCH_COMMAND {
4186 USHORT Rsvd1:6;
4187 USHORT Isoch_Y:2;
4188 USHORT Isoch_N:8;
4189 } PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND;
4190
4191 typedef struct PCI_AGP_EXTENDED_CAPABILITY {
4192 PCI_AGP_ISOCH_STATUS IsochStatus;
4193 PCI_AGP_CONTROL AgpControl;
4194 USHORT ApertureSize;
4195 PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize;
4196 ULONG GartLow;
4197 ULONG GartHigh;
4198 PCI_AGP_ISOCH_COMMAND IsochCommand;
4199 } PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY;
4200
4201 #define PCI_AGP_RATE_1X 0x1
4202 #define PCI_AGP_RATE_2X 0x2
4203 #define PCI_AGP_RATE_4X 0x4
4204
4205 #define PCIX_MODE_CONVENTIONAL_PCI 0x0
4206 #define PCIX_MODE1_66MHZ 0x1
4207 #define PCIX_MODE1_100MHZ 0x2
4208 #define PCIX_MODE1_133MHZ 0x3
4209 #define PCIX_MODE2_266_66MHZ 0x9
4210 #define PCIX_MODE2_266_100MHZ 0xA
4211 #define PCIX_MODE2_266_133MHZ 0xB
4212 #define PCIX_MODE2_533_66MHZ 0xD
4213 #define PCIX_MODE2_533_100MHZ 0xE
4214 #define PCIX_MODE2_533_133MHZ 0xF
4215
4216 #define PCIX_VERSION_MODE1_ONLY 0x0
4217 #define PCIX_VERSION_MODE2_ECC 0x1
4218 #define PCIX_VERSION_DUAL_MODE_ECC 0x2
4219
4220 typedef struct _PCIX_BRIDGE_CAPABILITY {
4221 PCI_CAPABILITIES_HEADER Header;
4222 union {
4223 _ANONYMOUS_STRUCT struct {
4224 USHORT Bus64Bit:1;
4225 USHORT Bus133MHzCapable:1;
4226 USHORT SplitCompletionDiscarded:1;
4227 USHORT UnexpectedSplitCompletion:1;
4228 USHORT SplitCompletionOverrun:1;
4229 USHORT SplitRequestDelayed:1;
4230 USHORT BusModeFrequency:4;
4231 USHORT Rsvd:2;
4232 USHORT Version:2;
4233 USHORT Bus266MHzCapable:1;
4234 USHORT Bus533MHzCapable:1;
4235 } DUMMYSTRUCTNAME;
4236 USHORT AsUSHORT;
4237 } SecondaryStatus;
4238 union {
4239 _ANONYMOUS_STRUCT struct {
4240 ULONG FunctionNumber:3;
4241 ULONG DeviceNumber:5;
4242 ULONG BusNumber:8;
4243 ULONG Device64Bit:1;
4244 ULONG Device133MHzCapable:1;
4245 ULONG SplitCompletionDiscarded:1;
4246 ULONG UnexpectedSplitCompletion:1;
4247 ULONG SplitCompletionOverrun:1;
4248 ULONG SplitRequestDelayed:1;
4249 ULONG Rsvd:7;
4250 ULONG DIMCapable:1;
4251 ULONG Device266MHzCapable:1;
4252 ULONG Device533MHzCapable:1;
4253 } DUMMYSTRUCTNAME;
4254 ULONG AsULONG;
4255 } BridgeStatus;
4256 USHORT UpstreamSplitTransactionCapacity;
4257 USHORT UpstreamSplitTransactionLimit;
4258 USHORT DownstreamSplitTransactionCapacity;
4259 USHORT DownstreamSplitTransactionLimit;
4260 union {
4261 _ANONYMOUS_STRUCT struct {
4262 ULONG SelectSecondaryRegisters:1;
4263 ULONG ErrorPresentInOtherBank:1;
4264 ULONG AdditionalCorrectableError:1;
4265 ULONG AdditionalUncorrectableError:1;
4266 ULONG ErrorPhase:3;
4267 ULONG ErrorCorrected:1;
4268 ULONG Syndrome:8;
4269 ULONG ErrorFirstCommand:4;
4270 ULONG ErrorSecondCommand:4;
4271 ULONG ErrorUpperAttributes:4;
4272 ULONG ControlUpdateEnable:1;
4273 ULONG Rsvd:1;
4274 ULONG DisableSingleBitCorrection:1;
4275 ULONG EccMode:1;
4276 } DUMMYSTRUCTNAME;
4277 ULONG AsULONG;
4278 } EccControlStatus;
4279 ULONG EccFirstAddress;
4280 ULONG EccSecondAddress;
4281 ULONG EccAttribute;
4282 } PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY;
4283
4284 typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY {
4285 PCI_CAPABILITIES_HEADER Header;
4286 USHORT Reserved;
4287 USHORT SubVendorID;
4288 USHORT SubSystemID;
4289 } PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY;
4290
4291 #define OSC_FIRMWARE_FAILURE 0x02
4292 #define OSC_UNRECOGNIZED_UUID 0x04
4293 #define OSC_UNRECOGNIZED_REVISION 0x08
4294 #define OSC_CAPABILITIES_MASKED 0x10
4295
4296 #define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION 0x01
4297
4298 typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
4299 union {
4300 _ANONYMOUS_STRUCT struct {
4301 ULONG ExtendedConfigOpRegions:1;
4302 ULONG ActiveStatePowerManagement:1;
4303 ULONG ClockPowerManagement:1;
4304 ULONG SegmentGroups:1;
4305 ULONG MessageSignaledInterrupts:1;
4306 ULONG WindowsHardwareErrorArchitecture:1;
4307 ULONG Reserved:26;
4308 } DUMMYSTRUCTNAME;
4309 ULONG AsULONG;
4310 } u;
4311 } PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD;
4312
4313 typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD {
4314 union {
4315 _ANONYMOUS_STRUCT struct {
4316 ULONG ExpressNativeHotPlug:1;
4317 ULONG ShpcNativeHotPlug:1;
4318 ULONG ExpressNativePME:1;
4319 ULONG ExpressAdvancedErrorReporting:1;
4320 ULONG ExpressCapabilityStructure:1;
4321 ULONG Reserved:27;
4322 } DUMMYSTRUCTNAME;
4323 ULONG AsULONG;
4324 } u;
4325 } PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD;
4326
4327 typedef enum _PCI_HARDWARE_INTERFACE {
4328 PciConventional,
4329 PciXMode1,
4330 PciXMode2,
4331 PciExpress
4332 } PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE;
4333
4334 typedef enum {
4335 BusWidth32Bits,
4336 BusWidth64Bits
4337 } PCI_BUS_WIDTH;
4338
4339 typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
4340 PCI_HARDWARE_INTERFACE SecondaryInterface;
4341 _ANONYMOUS_STRUCT struct {
4342 BOOLEAN BusCapabilitiesFound;
4343 ULONG CurrentSpeedAndMode;
4344 ULONG SupportedSpeedsAndModes;
4345 BOOLEAN DeviceIDMessagingCapable;
4346 PCI_BUS_WIDTH SecondaryBusWidth;
4347 } DUMMYSTRUCTNAME;
4348 PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport;
4349 PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest;
4350 PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted;
4351 } PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY;
4352
4353 typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
4354 _ANONYMOUS_STRUCT struct {
4355 USHORT CapabilityVersion:4;
4356 USHORT DeviceType:4;
4357 USHORT SlotImplemented:1;
4358 USHORT InterruptMessageNumber:5;
4359 USHORT Rsvd:2;
4360 } DUMMYSTRUCTNAME;
4361 USHORT AsUSHORT;
4362 } PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER;
4363
4364 typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
4365 _ANONYMOUS_STRUCT struct {
4366 ULONG MaxPayloadSizeSupported:3;
4367 ULONG PhantomFunctionsSupported:2;
4368 ULONG ExtendedTagSupported:1;
4369 ULONG L0sAcceptableLatency:3;
4370 ULONG L1AcceptableLatency:3;
4371 ULONG Undefined:3;
4372 ULONG RoleBasedErrorReporting:1;
4373 ULONG Rsvd1:2;
4374 ULONG CapturedSlotPowerLimit:8;
4375 ULONG CapturedSlotPowerLimitScale:2;
4376 ULONG Rsvd2:4;
4377 } DUMMYSTRUCTNAME;
4378 ULONG AsULONG;
4379 } PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER;
4380
4381 #define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07;
4382
4383 typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
4384 _ANONYMOUS_STRUCT struct {
4385 USHORT CorrectableErrorEnable:1;
4386 USHORT NonFatalErrorEnable:1;
4387 USHORT FatalErrorEnable:1;
4388 USHORT UnsupportedRequestErrorEnable:1;
4389 USHORT EnableRelaxedOrder:1;
4390 USHORT MaxPayloadSize:3;
4391 USHORT ExtendedTagEnable:1;
4392 USHORT PhantomFunctionsEnable:1;
4393 USHORT AuxPowerEnable:1;
4394 USHORT NoSnoopEnable:1;
4395 USHORT MaxReadRequestSize:3;
4396 USHORT BridgeConfigRetryEnable:1;
4397 } DUMMYSTRUCTNAME;
4398 USHORT AsUSHORT;
4399 } PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER;
4400
4401 #define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F;
4402
4403 typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
4404 _ANONYMOUS_STRUCT struct {
4405 USHORT CorrectableErrorDetected:1;
4406 USHORT NonFatalErrorDetected:1;
4407 USHORT FatalErrorDetected:1;
4408 USHORT UnsupportedRequestDetected:1;
4409 USHORT AuxPowerDetected:1;
4410 USHORT TransactionsPending:1;
4411 USHORT Rsvd:10;
4412 } DUMMYSTRUCTNAME;
4413 USHORT AsUSHORT;
4414 } PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER;
4415
4416 typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
4417 _ANONYMOUS_STRUCT struct {
4418 ULONG MaximumLinkSpeed:4;
4419 ULONG MaximumLinkWidth:6;
4420 ULONG ActiveStatePMSupport:2;
4421 ULONG L0sExitLatency:3;
4422 ULONG L1ExitLatency:3;
4423 ULONG ClockPowerManagement:1;
4424 ULONG SurpriseDownErrorReportingCapable:1;
4425 ULONG DataLinkLayerActiveReportingCapable:1;
4426 ULONG Rsvd:3;
4427 ULONG PortNumber:8;
4428 } DUMMYSTRUCTNAME;
4429 ULONG AsULONG;
4430 } PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER;
4431
4432 typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
4433 _ANONYMOUS_STRUCT struct {
4434 USHORT ActiveStatePMControl:2;
4435 USHORT Rsvd1:1;
4436 USHORT ReadCompletionBoundary:1;
4437 USHORT LinkDisable:1;
4438 USHORT RetrainLink:1;
4439 USHORT CommonClockConfig:1;
4440 USHORT ExtendedSynch:1;
4441 USHORT EnableClockPowerManagement:1;
4442 USHORT Rsvd2:7;
4443 } DUMMYSTRUCTNAME;
4444 USHORT AsUSHORT;
4445 } PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER;
4446
4447 typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
4448 _ANONYMOUS_STRUCT struct {
4449 USHORT LinkSpeed:4;
4450 USHORT LinkWidth:6;
4451 USHORT Undefined:1;
4452 USHORT LinkTraining:1;
4453 USHORT SlotClockConfig:1;
4454 USHORT DataLinkLayerActive:1;
4455 USHORT Rsvd:2;
4456 } DUMMYSTRUCTNAME;
4457 USHORT AsUSHORT;
4458 } PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER;
4459
4460 typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
4461 _ANONYMOUS_STRUCT struct {
4462 ULONG AttentionButtonPresent:1;
4463 ULONG PowerControllerPresent:1;
4464 ULONG MRLSensorPresent:1;
4465 ULONG AttentionIndicatorPresent:1;
4466 ULONG PowerIndicatorPresent:1;
4467 ULONG HotPlugSurprise:1;
4468 ULONG HotPlugCapable:1;
4469 ULONG SlotPowerLimit:8;
4470 ULONG SlotPowerLimitScale:2;
4471 ULONG ElectromechanicalLockPresent:1;
4472 ULONG NoCommandCompletedSupport:1;
4473 ULONG PhysicalSlotNumber:13;
4474 } DUMMYSTRUCTNAME;
4475 ULONG AsULONG;
4476 } PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER;
4477
4478 typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
4479 _ANONYMOUS_STRUCT struct {
4480 USHORT AttentionButtonEnable:1;
4481 USHORT PowerFaultDetectEnable:1;
4482 USHORT MRLSensorEnable:1;
4483 USHORT PresenceDetectEnable:1;
4484 USHORT CommandCompletedEnable:1;
4485 USHORT HotPlugInterruptEnable:1;
4486 USHORT AttentionIndicatorControl:2;
4487 USHORT PowerIndicatorControl:2;
4488 USHORT PowerControllerControl:1;
4489 USHORT ElectromechanicalLockControl:1;
4490 USHORT DataLinkStateChangeEnable:1;
4491 USHORT Rsvd:3;
4492 } DUMMYSTRUCTNAME;
4493 USHORT AsUSHORT;
4494 } PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER;
4495
4496 typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER {
4497 _ANONYMOUS_STRUCT struct {
4498 USHORT AttentionButtonPressed:1;
4499 USHORT PowerFaultDetected:1;
4500 USHORT MRLSensorChanged:1;
4501 USHORT PresenceDetectChanged:1;
4502 USHORT CommandCompleted:1;
4503 USHORT MRLSensorState:1;
4504 USHORT PresenceDetectState:1;
4505 USHORT ElectromechanicalLockEngaged:1;
4506 USHORT DataLinkStateChanged:1;
4507 USHORT Rsvd:7;
4508 } DUMMYSTRUCTNAME;
4509 USHORT AsUSHORT;
4510 } PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER;
4511
4512 typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER {
4513 _ANONYMOUS_STRUCT struct {
4514 USHORT CorrectableSerrEnable:1;
4515 USHORT NonFatalSerrEnable:1;
4516 USHORT FatalSerrEnable:1;
4517 USHORT PMEInterruptEnable:1;
4518 USHORT CRSSoftwareVisibilityEnable:1;
4519 USHORT Rsvd:11;
4520 } DUMMYSTRUCTNAME;
4521 USHORT AsUSHORT;
4522 } PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER;
4523
4524 typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER {
4525 _ANONYMOUS_STRUCT struct {
4526 USHORT CRSSoftwareVisibility:1;
4527 USHORT Rsvd:15;
4528 } DUMMYSTRUCTNAME;
4529 USHORT AsUSHORT;
4530 } PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER;
4531
4532 typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER {
4533 _ANONYMOUS_STRUCT struct {
4534 ULONG PMERequestorId:16;
4535 ULONG PMEStatus:1;
4536 ULONG PMEPending:1;
4537 ULONG Rsvd:14;
4538 } DUMMYSTRUCTNAME;
4539 ULONG AsULONG;
4540 } PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER;
4541
4542 typedef struct _PCI_EXPRESS_CAPABILITY {
4543 PCI_CAPABILITIES_HEADER Header;
4544 PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities;
4545 PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities;
4546 PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl;
4547 PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus;
4548 PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities;
4549 PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl;
4550 PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus;
4551 PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities;
4552 PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl;
4553 PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus;
4554 PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl;
4555 PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities;
4556 PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus;
4557 } PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY;
4558
4559 typedef enum {
4560 MRLClosed = 0,
4561 MRLOpen
4562 } PCI_EXPRESS_MRL_STATE;
4563
4564 typedef enum {
4565 SlotEmpty = 0,
4566 CardPresent
4567 } PCI_EXPRESS_CARD_PRESENCE;
4568
4569 typedef enum {
4570 IndicatorOn = 1,
4571 IndicatorBlink,
4572 IndicatorOff
4573 } PCI_EXPRESS_INDICATOR_STATE;
4574
4575 typedef enum {
4576 PowerOn = 0,
4577 PowerOff
4578 } PCI_EXPRESS_POWER_STATE;
4579
4580 typedef enum {
4581 L0sEntrySupport = 1,
4582 L0sAndL1EntrySupport = 3
4583 } PCI_EXPRESS_ASPM_SUPPORT;
4584
4585 typedef enum {
4586 L0sAndL1EntryDisabled,
4587 L0sEntryEnabled,
4588 L1EntryEnabled,
4589 L0sAndL1EntryEnabled
4590 } PCI_EXPRESS_ASPM_CONTROL;
4591
4592 typedef enum {
4593 L0s_Below64ns = 0,
4594 L0s_64ns_128ns,
4595 L0s_128ns_256ns,
4596 L0s_256ns_512ns,
4597 L0s_512ns_1us,
4598 L0s_1us_2us,
4599 L0s_2us_4us,
4600 L0s_Above4us
4601 } PCI_EXPRESS_L0s_EXIT_LATENCY;
4602
4603 typedef enum {
4604 L1_Below1us = 0,
4605 L1_1us_2us,
4606 L1_2us_4us,
4607 L1_4us_8us,
4608 L1_8us_16us,
4609 L1_16us_32us,
4610 L1_32us_64us,
4611 L1_Above64us
4612 } PCI_EXPRESS_L1_EXIT_LATENCY;
4613
4614 typedef enum {
4615 PciExpressEndpoint = 0,
4616 PciExpressLegacyEndpoint,
4617 PciExpressRootPort = 4,
4618 PciExpressUpstreamSwitchPort,
4619 PciExpressDownstreamSwitchPort,
4620 PciExpressToPciXBridge,
4621 PciXToExpressBridge,
4622 PciExpressRootComplexIntegratedEndpoint,
4623 PciExpressRootComplexEventCollector
4624 } PCI_EXPRESS_DEVICE_TYPE;
4625
4626 typedef enum {
4627 MaxPayload128Bytes = 0,
4628 MaxPayload256Bytes,
4629 MaxPayload512Bytes,
4630 MaxPayload1024Bytes,
4631 MaxPayload2048Bytes,
4632 MaxPayload4096Bytes
4633 } PCI_EXPRESS_MAX_PAYLOAD_SIZE;
4634
4635 typedef union _PCI_EXPRESS_PME_REQUESTOR_ID {
4636 _ANONYMOUS_STRUCT struct {
4637 USHORT FunctionNumber:3;
4638 USHORT DeviceNumber:5;
4639 USHORT BusNumber:8;
4640 } DUMMYSTRUCTNAME;
4641 USHORT AsUSHORT;
4642 } PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID;
4643
4644 typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE {
4645 ResourceTypeSingle = 0,
4646 ResourceTypeRange,
4647 ResourceTypeExtendedCounterConfiguration,
4648 ResourceTypeOverflow,
4649 ResourceTypeMax
4650 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE;
4651
4652 typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR {
4653 PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type;
4654 ULONG Flags;
4655 union {
4656 ULONG CounterIndex;
4657 ULONG ExtendedRegisterAddress;
4658 struct {
4659 ULONG Begin;
4660 ULONG End;
4661 } Range;
4662 } u;
4663 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR;
4664
4665 typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST {
4666 ULONG Count;
4667 PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY];
4668 } PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST;
4669
4670 typedef VOID
4671 (NTAPI *PciPin2Line)(
4672 IN struct _BUS_HANDLER *BusHandler,
4673 IN struct _BUS_HANDLER *RootHandler,
4674 IN PCI_SLOT_NUMBER SlotNumber,
4675 IN PPCI_COMMON_CONFIG PciData);
4676
4677 typedef VOID
4678 (NTAPI *PciLine2Pin)(
4679 IN struct _BUS_HANDLER *BusHandler,
4680 IN struct _BUS_HANDLER *RootHandler,
4681 IN PCI_SLOT_NUMBER SlotNumber,
4682 IN PPCI_COMMON_CONFIG PciNewData,
4683 IN PPCI_COMMON_CONFIG PciOldData);
4684
4685 typedef VOID
4686 (NTAPI *PciReadWriteConfig)(
4687 IN struct _BUS_HANDLER *BusHandler,
4688 IN PCI_SLOT_NUMBER Slot,
4689 IN PVOID Buffer,
4690 IN ULONG Offset,
4691 IN ULONG Length);
4692
4693 #define PCI_DATA_TAG ' ICP'
4694 #define PCI_DATA_VERSION 1
4695
4696 typedef struct _PCIBUSDATA {
4697 ULONG Tag;
4698 ULONG Version;
4699 PciReadWriteConfig ReadConfig;
4700 PciReadWriteConfig WriteConfig;
4701 PciPin2Line Pin2Line;
4702 PciLine2Pin Line2Pin;
4703 PCI_SLOT_NUMBER ParentSlot;
4704 PVOID Reserved[4];
4705 } PCIBUSDATA, *PPCIBUSDATA;
4706
4707 #ifndef _PCIINTRF_X_
4708 #define _PCIINTRF_X_
4709
4710 typedef ULONG
4711 (NTAPI *PCI_READ_WRITE_CONFIG)(
4712 IN PVOID Context,
4713 IN ULONG BusOffset,
4714 IN ULONG Slot,
4715 IN PVOID Buffer,
4716 IN ULONG Offset,
4717 IN ULONG Length);
4718
4719 typedef VOID
4720 (NTAPI *PCI_PIN_TO_LINE)(
4721 IN PVOID Context,
4722 IN PPCI_COMMON_CONFIG PciData);
4723
4724 typedef VOID
4725 (NTAPI *PCI_LINE_TO_PIN)(
4726 IN PVOID Context,
4727 IN PPCI_COMMON_CONFIG PciNewData,
4728 IN PPCI_COMMON_CONFIG PciOldData);
4729
4730 typedef VOID
4731 (NTAPI *PCI_ROOT_BUS_CAPABILITY)(
4732 IN PVOID Context,
4733 OUT PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability);
4734
4735 typedef VOID
4736 (NTAPI *PCI_EXPRESS_WAKE_CONTROL)(
4737 IN PVOID Context,
4738 IN BOOLEAN EnableWake);
4739
4740 typedef struct _PCI_BUS_INTERFACE_STANDARD {
4741 USHORT Size;
4742 USHORT Version;
4743 PVOID Context;
4744 PINTERFACE_REFERENCE InterfaceReference;
4745 PINTERFACE_DEREFERENCE InterfaceDereference;
4746 PCI_READ_WRITE_CONFIG ReadConfig;
4747 PCI_READ_WRITE_CONFIG WriteConfig;
4748 PCI_PIN_TO_LINE PinToLine;
4749 PCI_LINE_TO_PIN LineToPin;
4750 PCI_ROOT_BUS_CAPABILITY RootBusCapability;
4751 PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl;
4752 } PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD;
4753
4754 #define PCI_BUS_INTERFACE_STANDARD_VERSION 1
4755
4756 #endif /* _PCIINTRF_X_ */
4757
4758 #if (NTDDI_VERSION >= NTDDI_WIN7)
4759
4760 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX 0x00004000
4761 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX 0x00008000
4762 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \
4763 (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \
4764 FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX)
4765
4766 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200
4767 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300
4768 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300
4769
4770 #else
4771
4772 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200
4773 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300
4774 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300
4775
4776 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL
4777 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL
4778 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK
4779
4780 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4781
4782 #define FILE_CHARACTERISTICS_PROPAGATED (FILE_REMOVABLE_MEDIA | \
4783 FILE_READ_ONLY_DEVICE | \
4784 FILE_FLOPPY_DISKETTE | \
4785 FILE_WRITE_ONCE_MEDIA | \
4786 FILE_DEVICE_SECURE_OPEN)
4787
4788 typedef struct _FILE_ALIGNMENT_INFORMATION {
4789 ULONG AlignmentRequirement;
4790 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
4791
4792 typedef struct _FILE_NAME_INFORMATION {
4793 ULONG FileNameLength;
4794 WCHAR FileName[1];
4795 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
4796
4797
4798 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
4799 ULONG FileAttributes;
4800 ULONG ReparseTag;
4801 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
4802
4803 typedef struct _FILE_DISPOSITION_INFORMATION {
4804 BOOLEAN DeleteFile;
4805 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
4806
4807 typedef struct _FILE_END_OF_FILE_INFORMATION {
4808 LARGE_INTEGER EndOfFile;
4809 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
4810
4811 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
4812 LARGE_INTEGER ValidDataLength;
4813 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
4814
4815 typedef struct _FILE_FS_LABEL_INFORMATION {
4816 ULONG VolumeLabelLength;
4817 WCHAR VolumeLabel[1];
4818 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
4819
4820 typedef struct _FILE_FS_VOLUME_INFORMATION {
4821 LARGE_INTEGER VolumeCreationTime;
4822 ULONG VolumeSerialNumber;
4823 ULONG VolumeLabelLength;
4824 BOOLEAN SupportsObjects;
4825 WCHAR VolumeLabel[1];
4826 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
4827
4828 typedef struct _FILE_FS_SIZE_INFORMATION {
4829 LARGE_INTEGER TotalAllocationUnits;
4830 LARGE_INTEGER AvailableAllocationUnits;
4831 ULONG SectorsPerAllocationUnit;
4832 ULONG BytesPerSector;
4833 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
4834
4835 typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
4836 LARGE_INTEGER TotalAllocationUnits;
4837 LARGE_INTEGER CallerAvailableAllocationUnits;
4838 LARGE_INTEGER ActualAvailableAllocationUnits;
4839 ULONG SectorsPerAllocationUnit;
4840 ULONG BytesPerSector;
4841 } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
4842
4843 typedef struct _FILE_FS_OBJECTID_INFORMATION {
4844 UCHAR ObjectId[16];
4845 UCHAR ExtendedInfo[48];
4846 } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
4847
4848 typedef union _FILE_SEGMENT_ELEMENT {
4849 PVOID64 Buffer;
4850 ULONGLONG Alignment;
4851 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
4852
4853 #define IOCTL_AVIO_ALLOCATE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
4854 #define IOCTL_AVIO_FREE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
4855 #define IOCTL_AVIO_MODIFY_STREAM CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
4856
4857 typedef enum _BUS_DATA_TYPE {
4858 ConfigurationSpaceUndefined = -1,
4859 Cmos,
4860 EisaConfiguration,
4861 Pos,
4862 CbusConfiguration,
4863 PCIConfiguration,
4864 VMEConfiguration,
4865 NuBusConfiguration,
4866 PCMCIAConfiguration,
4867 MPIConfiguration,
4868 MPSAConfiguration,
4869 PNPISAConfiguration,
4870 SgiInternalConfiguration,
4871 MaximumBusDataType
4872 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
4873
4874 /* Some Server 2003 DDK definitions */
4875 #define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
4876
4877 typedef NTSTATUS
4878 (NTAPI *PLEGACY_DEVICE_DETECTION_HANDLER)(
4879 IN PVOID Context,
4880 IN INTERFACE_TYPE LegacyBusType,
4881 IN ULONG BusNumber,
4882 IN ULONG SlotNumber,
4883 OUT PDEVICE_OBJECT *PhysicalDeviceObject);
4884
4885 typedef struct _ROUTING_TOKEN {
4886 PVOID LinkNode;
4887 ULONG StaticVector;
4888 UCHAR Flags;
4889 } ROUTING_TOKEN, *PROUTING_TOKEN;
4890
4891 typedef NTSTATUS
4892 (NTAPI *PGET_INTERRUPT_ROUTING)(
4893 IN PDEVICE_OBJECT Pdo,
4894 OUT ULONG *Bus,
4895 OUT ULONG *PciSlot,
4896 OUT UCHAR *InterruptLine,
4897 OUT UCHAR *InterruptPin,
4898 OUT UCHAR *ClassCode,
4899 OUT UCHAR *SubClassCode,
4900 OUT PDEVICE_OBJECT *ParentPdo,
4901 OUT ROUTING_TOKEN *RoutingToken,
4902 OUT UCHAR *Flags);
4903
4904 typedef NTSTATUS
4905 (NTAPI *PSET_INTERRUPT_ROUTING_TOKEN)(
4906 IN PDEVICE_OBJECT Pdo,
4907 IN PROUTING_TOKEN RoutingToken);
4908
4909 typedef VOID
4910 (NTAPI *PUPDATE_INTERRUPT_LINE)(
4911 IN PDEVICE_OBJECT Pdo,
4912 IN UCHAR LineRegister);
4913
4914 typedef struct _INT_ROUTE_INTERFACE_STANDARD {
4915 USHORT Size;
4916 USHORT Version;
4917 PVOID Context;
4918 PINTERFACE_REFERENCE InterfaceReference;
4919 PINTERFACE_DEREFERENCE InterfaceDereference;
4920 PGET_INTERRUPT_ROUTING GetInterruptRouting;
4921 PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
4922 PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
4923 } INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
4924
4925 typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
4926 USHORT Size;
4927 USHORT Version;
4928 PVOID Context;
4929 PINTERFACE_REFERENCE InterfaceReference;
4930 PINTERFACE_DEREFERENCE InterfaceDereference;
4931 PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
4932 } LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
4933
4934 /* FIXME : These definitions don't exist in public headers */
4935
4936 #define PCI_CB_INTRF_VERSION 1
4937 #define PCI_PME_INTRF_STANDARD_VER 1
4938 #define PNP_LOCATION_INTERFACE_VERSION 1
4939
4940 DEFINE_GUID(GUID_PCI_CARDBUS_INTERFACE_PRIVATE, 0xcca82f31, 0x54d6, 0x11d1, 0x82, 0x24, 0x00, 0xa0, 0xc9, 0x32, 0x43, 0x85);
4941 DEFINE_GUID(GUID_PCI_PME_INTERFACE, 0xaac7e6ac, 0xbb0b, 0x11d2, 0xb4, 0x84, 0x00, 0xc0, 0x4f, 0x72, 0xde, 0x8b);
4942
4943 typedef NTSTATUS
4944 (NTAPI *PCARDBUSADD)(
4945 IN PDEVICE_OBJECT DeviceObject,
4946 IN OUT PVOID *DeviceContext);
4947
4948 typedef NTSTATUS
4949 (NTAPI *PCARDBUSDELETE)(
4950 IN PVOID DeviceContext);
4951
4952 typedef NTSTATUS
4953 (NTAPI *PCARDBUSPCIDISPATCH)(
4954 IN PVOID DeviceContext,
4955 IN PIRP Irp);
4956
4957 typedef VOID
4958 (NTAPI *PPME_SET_PME_ENABLE)(
4959 IN PDEVICE_OBJECT Pdo,
4960 IN BOOLEAN PmeEnable);
4961
4962 typedef VOID
4963 (NTAPI *PPME_CLEAR_PME_STATUS)(
4964 IN PDEVICE_OBJECT Pdo);
4965
4966 typedef VOID
4967 (NTAPI *PPME_GET_INFORMATION)(
4968 IN PDEVICE_OBJECT Pdo,
4969 OUT PBOOLEAN PmeCapable,
4970 OUT PBOOLEAN PmeStatus,
4971 OUT PBOOLEAN PmeEnable);
4972
4973 typedef struct _PCI_CARDBUS_INTERFACE_PRIVATE {
4974 USHORT Size;
4975 USHORT Version;
4976 PVOID Context;
4977 PINTERFACE_REFERENCE InterfaceReference;
4978 PINTERFACE_DEREFERENCE InterfaceDereference;
4979 PDRIVER_OBJECT DriverObject;
4980 PCARDBUSADD AddCardBus;
4981 PCARDBUSDELETE DeleteCardBus;
4982 PCARDBUSPCIDISPATCH DispatchPnp;
4983 } PCI_CARDBUS_INTERFACE_PRIVATE, *PPCI_CARDBUS_INTERFACE_PRIVATE;
4984
4985 typedef struct _PCI_PME_INTERFACE {
4986 USHORT Size;
4987 USHORT Version;
4988 PVOID Context;
4989 PINTERFACE_REFERENCE InterfaceReference;
4990 PINTERFACE_DEREFERENCE InterfaceDereference;
4991 PPME_GET_INFORMATION GetPmeInformation;
4992 PPME_CLEAR_PME_STATUS ClearPmeStatus;
4993 PPME_SET_PME_ENABLE UpdateEnable;
4994 } PCI_PME_INTERFACE, *PPCI_PME_INTERFACE;
4995
4996 $endif (_NTDDK_)
4997 $if (_NTIFS_)
4998
4999 #define FILE_OPLOCK_BROKEN_TO_LEVEL_2 0x00000007
5000 #define FILE_OPLOCK_BROKEN_TO_NONE 0x00000008
5001 #define FILE_OPBATCH_BREAK_UNDERWAY 0x00000009
5002
5003 /* also in winnt.h */
5004 #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
5005 #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
5006 #define FILE_NOTIFY_CHANGE_NAME 0x00000003
5007 #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
5008 #define FILE_NOTIFY_CHANGE_SIZE 0x00000008
5009 #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
5010 #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
5011 #define FILE_NOTIFY_CHANGE_CREATION 0x00000040
5012 #define FILE_NOTIFY_CHANGE_EA 0x00000080
5013 #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
5014 #define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
5015 #define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
5016 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
5017 #define FILE_NOTIFY_VALID_MASK 0x00000fff
5018
5019 #define FILE_ACTION_ADDED 0x00000001
5020 #define FILE_ACTION_REMOVED 0x00000002
5021 #define FILE_ACTION_MODIFIED 0x00000003
5022 #define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
5023 #define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
5024 #define FILE_ACTION_ADDED_STREAM 0x00000006
5025 #define FILE_ACTION_REMOVED_STREAM 0x00000007
5026 #define FILE_ACTION_MODIFIED_STREAM 0x00000008
5027 #define FILE_ACTION_REMOVED_BY_DELETE 0x00000009
5028 #define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A
5029 #define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B
5030 /* end winnt.h */
5031
5032 #define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
5033 #define FILE_PIPE_MESSAGE_TYPE 0x00000001
5034
5035 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
5036 #define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
5037
5038 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
5039 #define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
5040 #define FILE_PIPE_TYPE_VALID_MASK 0x00000003
5041
5042 #define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
5043 #define FILE_PIPE_MESSAGE_MODE 0x00000001
5044
5045 #define FILE_PIPE_QUEUE_OPERATION 0x00000000
5046 #define FILE_PIPE_COMPLETE_OPERATION 0x00000001
5047
5048 #define FILE_PIPE_INBOUND 0x00000000
5049 #define FILE_PIPE_OUTBOUND 0x00000001
5050 #define FILE_PIPE_FULL_DUPLEX 0x00000002
5051
5052 #define FILE_PIPE_DISCONNECTED_STATE 0x00000001
5053 #define FILE_PIPE_LISTENING_STATE 0x00000002
5054 #define FILE_PIPE_CONNECTED_STATE 0x00000003
5055 #define FILE_PIPE_CLOSING_STATE 0x00000004
5056
5057 #define FILE_PIPE_CLIENT_END 0x00000000
5058 #define FILE_PIPE_SERVER_END 0x00000001
5059
5060 #define FILE_CASE_SENSITIVE_SEARCH 0x00000001
5061 #define FILE_CASE_PRESERVED_NAMES 0x00000002
5062 #define FILE_UNICODE_ON_DISK 0x00000004
5063 #define FILE_PERSISTENT_ACLS 0x00000008
5064 #define FILE_FILE_COMPRESSION 0x00000010
5065 #define FILE_VOLUME_QUOTAS 0x00000020
5066 #define FILE_SUPPORTS_SPARSE_FILES 0x00000040
5067 #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
5068 #define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
5069 #define FILE_VOLUME_IS_COMPRESSED 0x00008000
5070 #define FILE_SUPPORTS_OBJECT_IDS 0x00010000
5071 #define FILE_SUPPORTS_ENCRYPTION 0x00020000
5072 #define FILE_NAMED_STREAMS 0x00040000
5073 #define FILE_READ_ONLY_VOLUME 0x00080000
5074 #define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
5075 #define FILE_SUPPORTS_TRANSACTIONS 0x00200000
5076 #define FILE_SUPPORTS_HARD_LINKS 0x00400000
5077 #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
5078 #define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
5079 #define FILE_SUPPORTS_USN_JOURNAL 0x02000000
5080
5081 #define FILE_NEED_EA 0x00000080
5082
5083 #define FILE_EA_TYPE_BINARY 0xfffe
5084 #define FILE_EA_TYPE_ASCII 0xfffd
5085 #define FILE_EA_TYPE_BITMAP 0xfffb
5086 #define FILE_EA_TYPE_METAFILE 0xfffa
5087 #define FILE_EA_TYPE_ICON 0xfff9
5088 #define FILE_EA_TYPE_EA 0xffee
5089 #define FILE_EA_TYPE_MVMT 0xffdf
5090 #define FILE_EA_TYPE_MVST 0xffde
5091 #define FILE_EA_TYPE_ASN1 0xffdd
5092 #define FILE_EA_TYPE_FAMILY_IDS 0xff01
5093
5094 typedef struct _FILE_NOTIFY_INFORMATION {
5095 ULONG NextEntryOffset;
5096 ULONG Action;
5097 ULONG FileNameLength;
5098 WCHAR FileName[1];
5099 } FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
5100
5101 typedef struct _FILE_DIRECTORY_INFORMATION {
5102 ULONG NextEntryOffset;
5103 ULONG FileIndex;
5104 LARGE_INTEGER CreationTime;
5105 LARGE_INTEGER LastAccessTime;
5106 LARGE_INTEGER LastWriteTime;
5107 LARGE_INTEGER ChangeTime;
5108 LARGE_INTEGER EndOfFile;
5109 LARGE_INTEGER AllocationSize;
5110 ULONG FileAttributes;
5111 ULONG FileNameLength;
5112 WCHAR FileName[1];
5113 } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
5114
5115 typedef struct _FILE_FULL_DIR_INFORMATION {
5116 ULONG NextEntryOffset;
5117 ULONG FileIndex;
5118 LARGE_INTEGER CreationTime;
5119 LARGE_INTEGER LastAccessTime;
5120 LARGE_INTEGER LastWriteTime;
5121 LARGE_INTEGER ChangeTime;
5122 LARGE_INTEGER EndOfFile;
5123 LARGE_INTEGER AllocationSize;
5124 ULONG FileAttributes;
5125 ULONG FileNameLength;
5126 ULONG EaSize;
5127 WCHAR FileName[1];
5128 } FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
5129
5130 typedef struct _FILE_ID_FULL_DIR_INFORMATION {
5131 ULONG NextEntryOffset;
5132 ULONG FileIndex;
5133 LARGE_INTEGER CreationTime;
5134 LARGE_INTEGER LastAccessTime;
5135 LARGE_INTEGER LastWriteTime;
5136 LARGE_INTEGER ChangeTime;
5137 LARGE_INTEGER EndOfFile;
5138 LARGE_INTEGER AllocationSize;
5139 ULONG FileAttributes;
5140 ULONG FileNameLength;
5141 ULONG EaSize;
5142 LARGE_INTEGER FileId;
5143 WCHAR FileName[1];
5144 } FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
5145
5146 typedef struct _FILE_BOTH_DIR_INFORMATION {
5147 ULONG NextEntryOffset;
5148 ULONG FileIndex;
5149 LARGE_INTEGER CreationTime;
5150 LARGE_INTEGER LastAccessTime;
5151 LARGE_INTEGER LastWriteTime;
5152 LARGE_INTEGER ChangeTime;
5153 LARGE_INTEGER EndOfFile;
5154 LARGE_INTEGER AllocationSize;
5155 ULONG FileAttributes;
5156 ULONG FileNameLength;
5157 ULONG EaSize;
5158 CCHAR ShortNameLength;
5159 WCHAR ShortName[12];
5160 WCHAR FileName[1];
5161 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
5162
5163 typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
5164 ULONG NextEntryOffset;
5165 ULONG FileIndex;
5166 LARGE_INTEGER CreationTime;
5167 LARGE_INTEGER LastAccessTime;
5168 LARGE_INTEGER LastWriteTime;
5169 LARGE_INTEGER ChangeTime;
5170 LARGE_INTEGER EndOfFile;
5171 LARGE_INTEGER AllocationSize;
5172 ULONG FileAttributes;
5173 ULONG FileNameLength;
5174 ULONG EaSize;
5175 CCHAR ShortNameLength;
5176 WCHAR ShortName[12];
5177 LARGE_INTEGER FileId;
5178 WCHAR FileName[1];
5179 } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
5180
5181 typedef struct _FILE_NAMES_INFORMATION {
5182 ULONG NextEntryOffset;
5183 ULONG FileIndex;
5184 ULONG FileNameLength;
5185 WCHAR FileName[1];
5186 } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
5187
5188 typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION {
5189 ULONG NextEntryOffset;
5190 ULONG FileIndex;
5191 LARGE_INTEGER CreationTime;
5192 LARGE_INTEGER LastAccessTime;
5193 LARGE_INTEGER LastWriteTime;
5194 LARGE_INTEGER ChangeTime;
5195 LARGE_INTEGER EndOfFile;
5196 LARGE_INTEGER AllocationSize;
5197 ULONG FileAttributes;
5198 ULONG FileNameLength;
5199 LARGE_INTEGER FileId;
5200 GUID LockingTransactionId;
5201 ULONG TxInfoFlags;
5202 WCHAR FileName[1];
5203 } FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
5204
5205 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED 0x00000001
5206 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX 0x00000002
5207 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX 0x00000004
5208
5209 typedef struct _FILE_OBJECTID_INFORMATION {
5210 LONGLONG FileReference;
5211 UCHAR ObjectId[16];
5212 _ANONYMOUS_UNION union {
5213 _ANONYMOUS_STRUCT struct {
5214 UCHAR BirthVolumeId[16];
5215 UCHAR BirthObjectId[16];
5216 UCHAR DomainId[16];
5217 } DUMMYSTRUCTNAME;
5218 UCHAR ExtendedInfo[48];
5219 } DUMMYUNIONNAME;
5220 } FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
5221
5222 #define ANSI_DOS_STAR ('<')
5223 #define ANSI_DOS_QM ('>')
5224 #define ANSI_DOS_DOT ('"')
5225
5226 #define DOS_STAR (L'<')
5227 #define DOS_QM (L'>')
5228 #define DOS_DOT (L'"')
5229
5230 typedef struct _FILE_INTERNAL_INFORMATION {
5231 LARGE_INTEGER IndexNumber;
5232 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
5233
5234 typedef struct _FILE_EA_INFORMATION {
5235 ULONG EaSize;
5236 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
5237
5238 typedef struct _FILE_ACCESS_INFORMATION {
5239 ACCESS_MASK AccessFlags;
5240 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
5241
5242 typedef struct _FILE_MODE_INFORMATION {
5243 ULONG Mode;
5244 } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
5245
5246 typedef struct _FILE_ALL_INFORMATION {
5247 FILE_BASIC_INFORMATION BasicInformation;
5248 FILE_STANDARD_INFORMATION StandardInformation;
5249 FILE_INTERNAL_INFORMATION InternalInformation;
5250 FILE_EA_INFORMATION EaInformation;
5251 FILE_ACCESS_INFORMATION AccessInformation;
5252 FILE_POSITION_INFORMATION PositionInformation;
5253 FILE_MODE_INFORMATION ModeInformation;
5254 FILE_ALIGNMENT_INFORMATION AlignmentInformation;
5255 FILE_NAME_INFORMATION NameInformation;
5256 } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
5257
5258 typedef struct _FILE_ALLOCATION_INFORMATION {
5259 LARGE_INTEGER AllocationSize;
5260 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
5261
5262 typedef struct _FILE_COMPRESSION_INFORMATION {
5263 LARGE_INTEGER CompressedFileSize;
5264 USHORT CompressionFormat;
5265 UCHAR CompressionUnitShift;
5266 UCHAR ChunkShift;
5267 UCHAR ClusterShift;
5268 UCHAR Reserved[3];
5269 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
5270
5271 typedef struct _FILE_LINK_INFORMATION {
5272 BOOLEAN ReplaceIfExists;
5273 HANDLE RootDirectory;
5274 ULONG FileNameLength;
5275 WCHAR FileName[1];
5276 } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
5277
5278 typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
5279 ULONG ClusterCount;
5280 HANDLE RootDirectory;
5281 ULONG FileNameLength;
5282 WCHAR FileName[1];
5283 } FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
5284
5285 typedef struct _FILE_RENAME_INFORMATION {
5286 BOOLEAN ReplaceIfExists;
5287 HANDLE RootDirectory;
5288 ULONG FileNameLength;
5289 WCHAR FileName[1];
5290 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
5291
5292 typedef struct _FILE_STREAM_INFORMATION {
5293 ULONG NextEntryOffset;
5294 ULONG StreamNameLength;
5295 LARGE_INTEGER StreamSize;
5296 LARGE_INTEGER StreamAllocationSize;
5297 WCHAR StreamName[1];
5298 } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
5299
5300 typedef struct _FILE_TRACKING_INFORMATION {
5301 HANDLE DestinationFile;
5302 ULONG ObjectInformationLength;
5303 CHAR ObjectInformation[1];
5304 } FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
5305
5306 typedef struct _FILE_COMPLETION_INFORMATION {
5307 HANDLE Port;
5308 PVOID Key;
5309 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
5310
5311 typedef struct _FILE_PIPE_INFORMATION {
5312 ULONG ReadMode;
5313 ULONG CompletionMode;
5314 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
5315
5316 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
5317 ULONG NamedPipeType;
5318 ULONG NamedPipeConfiguration;
5319 ULONG MaximumInstances;
5320 ULONG CurrentInstances;
5321 ULONG InboundQuota;
5322 ULONG ReadDataAvailable;
5323 ULONG OutboundQuota;
5324 ULONG WriteQuotaAvailable;
5325 ULONG NamedPipeState;
5326 ULONG NamedPipeEnd;
5327 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
5328
5329 typedef struct _FILE_PIPE_REMOTE_INFORMATION {
5330 LARGE_INTEGER CollectDataTime;
5331 ULONG MaximumCollectionCount;
5332 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
5333
5334 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
5335 ULONG MaximumMessageSize;
5336 ULONG MailslotQuota;
5337 ULONG NextMessageSize;
5338 ULONG MessagesAvailable;
5339 LARGE_INTEGER ReadTimeout;
5340 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
5341
5342 typedef struct _FILE_MAILSLOT_SET_INFORMATION {
5343 PLARGE_INTEGER ReadTimeout;
5344 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
5345
5346 typedef struct _FILE_REPARSE_POINT_INFORMATION {
5347 LONGLONG FileReference;
5348 ULONG Tag;
5349 } FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
5350
5351 typedef struct _FILE_LINK_ENTRY_INFORMATION {
5352 ULONG NextEntryOffset;
5353 LONGLONG ParentFileId;
5354 ULONG FileNameLength;
5355 WCHAR FileName[1];
5356 } FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
5357
5358 typedef struct _FILE_LINKS_INFORMATION {
5359 ULONG BytesNeeded;
5360 ULONG EntriesReturned;
5361 FILE_LINK_ENTRY_INFORMATION Entry;
5362 } FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;
5363
5364 typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
5365 ULONG FileNameLength;
5366 WCHAR FileName[1];
5367 } FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
5368
5369 typedef struct _FILE_STANDARD_LINK_INFORMATION {
5370 ULONG NumberOfAccessibleLinks;
5371 ULONG TotalNumberOfLinks;
5372 BOOLEAN DeletePending;
5373 BOOLEAN Directory;
5374 } FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;
5375
5376 typedef struct _FILE_GET_EA_INFORMATION {
5377 ULONG NextEntryOffset;
5378 UCHAR EaNameLength;
5379 CHAR EaName[1];
5380 } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
5381
5382 #define REMOTE_PROTOCOL_FLAG_LOOPBACK 0x00000001
5383 #define REMOTE_PROTOCOL_FLAG_OFFLINE 0x00000002
5384
5385 typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION {
5386 USHORT StructureVersion;
5387 USHORT StructureSize;
5388 ULONG Protocol;
5389 USHORT ProtocolMajorVersion;
5390 USHORT ProtocolMinorVersion;
5391 USHORT ProtocolRevision;
5392 USHORT Reserved;
5393 ULONG Flags;
5394 struct {
5395 ULONG Reserved[8];
5396 } GenericReserved;
5397 struct {
5398 ULONG Reserved[16];
5399 } ProtocolSpecificReserved;
5400 } FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;
5401
5402 typedef struct _FILE_GET_QUOTA_INFORMATION {
5403 ULONG NextEntryOffset;
5404 ULONG SidLength;
5405 SID Sid;
5406 } FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
5407
5408 typedef struct _FILE_QUOTA_INFORMATION {
5409 ULONG NextEntryOffset;
5410 ULONG SidLength;
5411 LARGE_INTEGER ChangeTime;
5412 LARGE_INTEGER QuotaUsed;
5413 LARGE_INTEGER QuotaThreshold;
5414 LARGE_INTEGER QuotaLimit;
5415 SID Sid;
5416 } FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
5417
5418 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
5419 ULONG FileSystemAttributes;
5420 ULONG MaximumComponentNameLength;
5421 ULONG FileSystemNameLength;
5422 WCHAR FileSystemName[1];
5423 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
5424
5425 typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
5426 BOOLEAN DriverInPath;
5427 ULONG DriverNameLength;
5428 WCHAR DriverName[1];
5429 } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
5430
5431 typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
5432 ULONG Flags;
5433 } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
5434
5435 #define FILE_VC_QUOTA_NONE 0x00000000
5436 #define FILE_VC_QUOTA_TRACK 0x00000001
5437 #define FILE_VC_QUOTA_ENFORCE 0x00000002
5438 #define FILE_VC_QUOTA_MASK 0x00000003
5439 #define FILE_VC_CONTENT_INDEX_DISABLED 0x00000008
5440 #define FILE_VC_LOG_QUOTA_THRESHOLD 0x00000010
5441 #define FILE_VC_LOG_QUOTA_LIMIT 0x00000020
5442 #define FILE_VC_LOG_VOLUME_THRESHOLD 0x00000040
5443 #define FILE_VC_LOG_VOLUME_LIMIT 0x00000080
5444 #define FILE_VC_QUOTAS_INCOMPLETE 0x00000100
5445 #define FILE_VC_QUOTAS_REBUILDING 0x00000200
5446 #define FILE_VC_VALID_MASK 0x000003ff
5447
5448 typedef struct _FILE_FS_CONTROL_INFORMATION {
5449 LARGE_INTEGER FreeSpaceStartFiltering;
5450 LARGE_INTEGER FreeSpaceThreshold;
5451 LARGE_INTEGER FreeSpaceStopFiltering;
5452 LARGE_INTEGER DefaultQuotaThreshold;
5453 LARGE_INTEGER DefaultQuotaLimit;
5454 ULONG FileSystemControlFlags;
5455 } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
5456
5457 #ifndef _FILESYSTEMFSCTL_
5458 #define _FILESYSTEMFSCTL_
5459
5460 #define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
5461 #define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
5462 #define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
5463 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
5464 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
5465 #define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
5466 #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
5467 #define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
5468 #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
5469 #define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
5470 #define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
5471 #define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
5472 #define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER, FILE_ANY_ACCESS)
5473 #define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
5474 #define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
5475 #define FSCTL_SET_BOOTLOADER_ACCESSED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS)
5476
5477 #define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
5478 #define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
5479 #define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
5480 #define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
5481 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
5482
5483 #if (_WIN32_WINNT >= 0x0400)
5484
5485 #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
5486 #define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
5487 #define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS)
5488 #define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS)
5489 #define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
5490 #define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
5491 #define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER, FILE_ANY_ACCESS)
5492
5493 #endif
5494
5495 #if (_WIN32_WINNT >= 0x0500)
5496
5497 #define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS)
5498 #define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
5499 #define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
5500 #define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
5501 #define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
5502 #define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
5503 #define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
5504 #define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER, FILE_READ_DATA)
5505 #define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER, FILE_READ_DATA)
5506 #define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER, FILE_READ_DATA)
5507 #define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
5508 #define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
5509 #define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
5510 #define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
5511 #define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA)
5512 #define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
5513 #define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
5514 #define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER, FILE_ANY_ACCESS)
5515 #define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER, FILE_ANY_ACCESS)
5516 #define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER, FILE_ANY_ACCESS)
5517 #define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER, FILE_READ_DATA)
5518 #define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER, FILE_READ_DATA)
5519 #define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER, FILE_READ_DATA)
5520 #define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
5521 #define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
5522 #define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
5523 #define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
5524 #define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
5525 #define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
5526 #define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
5527 #define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
5528 #define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5529
5530 #endif
5531
5532 #if (_WIN32_WINNT >= 0x0600)
5533
5534 #define FSCTL_MAKE_MEDIA_COMPATIBLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
5535 #define FSCTL_SET_DEFECT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
5536 #define FSCTL_QUERY_SPARING_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
5537 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
5538 #define FSCTL_SET_VOLUME_COMPRESSION_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5539 #define FSCTL_TXFS_MODIFY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA)
5540 #define FSCTL_TXFS_QUERY_RM_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA)
5541 #define FSCTL_TXFS_ROLLFORWARD_REDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA)
5542 #define FSCTL_TXFS_ROLLFORWARD_UNDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA)
5543 #define FSCTL_TXFS_START_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA)
5544 #define FSCTL_TXFS_SHUTDOWN_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
5545 #define FSCTL_TXFS_READ_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA)
5546 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA)
5547 #define FSCTL_TXFS_CREATE_SECONDARY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA)
5548 #define FSCTL_TXFS_GET_METADATA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA)
5549 #define FSCTL_TXFS_GET_TRANSACTED_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA)
5550 #define FSCTL_TXFS_SAVEPOINT_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA)
5551 #define FSCTL_TXFS_CREATE_MINIVERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
5552 #define FSCTL_TXFS_TRANSACTION_ACTIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA)
5553 #define FSCTL_SET_ZERO_ON_DEALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5554 #define FSCTL_SET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
5555 #define FSCTL_GET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
5556 #define FSCTL_WAIT_FOR_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
5557 #define FSCTL_INITIATE_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
5558 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
5559 #define FSCTL_SHRINK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
5560 #define FSCTL_SET_SHORT_NAME_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
5561 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
5562
5563 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \
5564 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
5565 #define FSCTL_TXFS_LIST_TRANSACTIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
5566 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
5567 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
5568 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
5569
5570 #endif
5571
5572 #if (_WIN32_WINNT >= 0x0601)
5573
5574 #define FSCTL_QUERY_DEPENDENT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS)
5575 #define FSCTL_SD_GLOBAL_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS)
5576 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS)
5577 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS)
5578 #define FSCTL_FILE_TYPE_NOTIFICATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS)
5579 #define FSCTL_GET_BOOT_AREA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS)
5580 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS)
5581 #define FSCTL_SET_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
5582 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
5583
5584 #define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)
5585
5586 #define FSCTL_CSV_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
5587 #define FSCTL_IS_CSV_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
5588
5589 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS)
5590 #define FSCTL_CSV_GET_VOLUME_PATH_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS)
5591 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
5592 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150, METHOD_BUFFERED, FILE_ANY_ACCESS)
5593 #define FSCTL_IS_FILE_ON_CSV_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151, METHOD_BUFFERED, FILE_ANY_ACCESS)
5594
5595 typedef struct _CSV_NAMESPACE_INFO {
5596 ULONG Version;
5597 ULONG DeviceNumber;
5598 LARGE_INTEGER StartingOffset;
5599 ULONG SectorSize;
5600 } CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
5601
5602 #define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
5603 #define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
5604
5605 #endif
5606
5607 #define FSCTL_MARK_AS_SYSTEM_HIVE FSCTL_SET_BOOTLOADER_ACCESSED
5608
5609 typedef struct _PATHNAME_BUFFER {
5610 ULONG PathNameLength;
5611 WCHAR Name[1];
5612 } PATHNAME_BUFFER, *PPATHNAME_BUFFER;
5613
5614 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
5615 UCHAR First0x24BytesOfBootSector[0x24];
5616 } FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
5617
5618 #if (_WIN32_WINNT >= 0x0400)
5619
5620 typedef struct _NTFS_VOLUME_DATA_BUFFER {
5621 LARGE_INTEGER VolumeSerialNumber;
5622 LARGE_INTEGER NumberSectors;
5623 LARGE_INTEGER TotalClusters;
5624 LARGE_INTEGER FreeClusters;
5625 LARGE_INTEGER TotalReserved;
5626 ULONG BytesPerSector;
5627 ULONG BytesPerCluster;
5628 ULONG BytesPerFileRecordSegment;
5629 ULONG ClustersPerFileRecordSegment;
5630 LARGE_INTEGER MftValidDataLength;
5631 LARGE_INTEGER MftStartLcn;
5632 LARGE_INTEGER Mft2StartLcn;
5633 LARGE_INTEGER MftZoneStart;
5634 LARGE_INTEGER MftZoneEnd;
5635 } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
5636
5637 typedef struct _NTFS_EXTENDED_VOLUME_DATA {
5638 ULONG ByteCount;
5639 USHORT MajorVersion;
5640 USHORT MinorVersion;
5641 } NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
5642
5643 typedef struct _STARTING_LCN_INPUT_BUFFER {
5644 LARGE_INTEGER StartingLcn;
5645 } STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
5646
5647 typedef struct _VOLUME_BITMAP_BUFFER {
5648 LARGE_INTEGER StartingLcn;
5649 LARGE_INTEGER BitmapSize;
5650 UCHAR Buffer[1];
5651 } VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
5652
5653 typedef struct _STARTING_VCN_INPUT_BUFFER {
5654 LARGE_INTEGER StartingVcn;
5655 } STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
5656
5657 typedef struct _RETRIEVAL_POINTERS_BUFFER {
5658 ULONG ExtentCount;
5659 LARGE_INTEGER StartingVcn;
5660 struct {
5661 LARGE_INTEGER NextVcn;
5662 LARGE_INTEGER Lcn;
5663 } Extents[1];
5664 } RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
5665
5666 typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER {
5667 LARGE_INTEGER FileReferenceNumber;
5668 } NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
5669
5670 typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER {
5671 LARGE_INTEGER FileReferenceNumber;
5672 ULONG FileRecordLength;
5673 UCHAR FileRecordBuffer[1];
5674 } NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
5675
5676 typedef struct _MOVE_FILE_DATA {
5677 HANDLE FileHandle;
5678 LARGE_INTEGER StartingVcn;
5679 LARGE_INTEGER StartingLcn;
5680 ULONG ClusterCount;
5681 } MOVE_FILE_DATA, *PMOVE_FILE_DATA;
5682
5683 typedef struct _MOVE_FILE_RECORD_DATA {
5684 HANDLE FileHandle;
5685 LARGE_INTEGER SourceFileRecord;
5686 LARGE_INTEGER TargetFileRecord;
5687 } MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
5688
5689 #if defined(_WIN64)
5690 typedef struct _MOVE_FILE_DATA32 {
5691 UINT32 FileHandle;
5692 LARGE_INTEGER StartingVcn;
5693 LARGE_INTEGER StartingLcn;
5694 ULONG ClusterCount;
5695 } MOVE_FILE_DATA32, *PMOVE_FILE_DATA32;
5696 #endif
5697
5698 #endif /* (_WIN32_WINNT >= 0x0400) */
5699
5700 #if (_WIN32_WINNT >= 0x0500)
5701
5702 typedef struct _FIND_BY_SID_DATA {
5703 ULONG Restart;
5704 SID Sid;
5705 } FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
5706
5707 typedef struct _FIND_BY_SID_OUTPUT {
5708 ULONG NextEntryOffset;
5709 ULONG FileIndex;
5710 ULONG FileNameLength;
5711 WCHAR FileName[1];
5712 } FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
5713
5714 typedef struct _MFT_ENUM_DATA {
5715 ULONGLONG StartFileReferenceNumber;
5716 USN LowUsn;
5717 USN HighUsn;
5718 } MFT_ENUM_DATA, *PMFT_ENUM_DATA;
5719
5720 typedef struct _CREATE_USN_JOURNAL_DATA {
5721 ULONGLONG MaximumSize;
5722 ULONGLONG AllocationDelta;
5723 } CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
5724
5725 typedef struct _READ_USN_JOURNAL_DATA {
5726 USN StartUsn;
5727 ULONG ReasonMask;
5728 ULONG ReturnOnlyOnClose;
5729 ULONGLONG Timeout;
5730 ULONGLONG BytesToWaitFor;
5731 ULONGLONG UsnJournalID;
5732 } READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
5733
5734 typedef struct _USN_RECORD {
5735 ULONG RecordLength;
5736 USHORT MajorVersion;
5737 USHORT MinorVersion;
5738 ULONGLONG FileReferenceNumber;
5739 ULONGLONG ParentFileReferenceNumber;
5740 USN Usn;
5741 LARGE_INTEGER TimeStamp;
5742 ULONG Reason;
5743 ULONG SourceInfo;
5744 ULONG SecurityId;
5745 ULONG FileAttributes;
5746 USHORT FileNameLength;
5747 USHORT FileNameOffset;
5748 WCHAR FileName[1];
5749 } USN_RECORD, *PUSN_RECORD;
5750
5751 #define USN_PAGE_SIZE (0x1000)
5752
5753 #define USN_REASON_DATA_OVERWRITE (0x00000001)
5754 #define USN_REASON_DATA_EXTEND (0x00000002)
5755 #define USN_REASON_DATA_TRUNCATION (0x00000004)
5756 #define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010)
5757 #define USN_REASON_NAMED_DATA_EXTEND (0x00000020)
5758 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
5759 #define USN_REASON_FILE_CREATE (0x00000100)
5760 #define USN_REASON_FILE_DELETE (0x00000200)
5761 #define USN_REASON_EA_CHANGE (0x00000400)
5762 #define USN_REASON_SECURITY_CHANGE (0x00000800)
5763 #define USN_REASON_RENAME_OLD_NAME (0x00001000)
5764 #define USN_REASON_RENAME_NEW_NAME (0x00002000)
5765 #define USN_REASON_INDEXABLE_CHANGE (0x00004000)
5766 #define USN_REASON_BASIC_INFO_CHANGE (0x00008000)
5767 #define USN_REASON_HARD_LINK_CHANGE (0x00010000)
5768 #define USN_REASON_COMPRESSION_CHANGE (0x00020000)
5769 #define USN_REASON_ENCRYPTION_CHANGE (0x00040000)
5770 #define USN_REASON_OBJECT_ID_CHANGE (0x00080000)
5771 #define USN_REASON_REPARSE_POINT_CHANGE (0x00100000)
5772 #define USN_REASON_STREAM_CHANGE (0x00200000)
5773 #define USN_REASON_TRANSACTED_CHANGE (0x00400000)
5774 #define USN_REASON_CLOSE (0x80000000)
5775
5776 typedef struct _USN_JOURNAL_DATA {
5777 ULONGLONG UsnJournalID;
5778 USN FirstUsn;
5779 USN NextUsn;
5780 USN LowestValidUsn;
5781 USN MaxUsn;
5782 ULONGLONG MaximumSize;
5783 ULONGLONG AllocationDelta;
5784 } USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
5785
5786 typedef struct _DELETE_USN_JOURNAL_DATA {
5787 ULONGLONG UsnJournalID;
5788 ULONG DeleteFlags;
5789 } DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
5790
5791 #define USN_DELETE_FLAG_DELETE (0x00000001)
5792 #define USN_DELETE_FLAG_NOTIFY (0x00000002)
5793 #define USN_DELETE_VALID_FLAGS (0x00000003)
5794
5795 typedef struct _MARK_HANDLE_INFO {
5796 ULONG UsnSourceInfo;
5797 HANDLE VolumeHandle;
5798 ULONG HandleInfo;
5799 } MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
5800
5801 #if defined(_WIN64)
5802 typedef struct _MARK_HANDLE_INFO32 {
5803 ULONG UsnSourceInfo;
5804 UINT32 VolumeHandle;
5805 ULONG HandleInfo;
5806 } MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32;
5807 #endif
5808
5809 #define USN_SOURCE_DATA_MANAGEMENT (0x00000001)
5810 #define USN_SOURCE_AUXILIARY_DATA (0x00000002)
5811 #define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004)
5812
5813 #define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001)
5814 #define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004)
5815 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008)
5816
5817 typedef struct _BULK_SECURITY_TEST_DATA {
5818 ACCESS_MASK DesiredAccess;
5819 ULONG SecurityIds[1];
5820 } BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
5821
5822 #define VOLUME_IS_DIRTY (0x00000001)
5823 #define VOLUME_UPGRADE_SCHEDULED (0x00000002)
5824 #define VOLUME_SESSION_OPEN (0x00000004)
5825
5826 typedef struct _FILE_PREFETCH {
5827 ULONG Type;
5828 ULONG Count;
5829 ULONGLONG Prefetch[1];
5830 } FILE_PREFETCH, *PFILE_PREFETCH;
5831
5832 typedef struct _FILE_PREFETCH_EX {
5833 ULONG Type;
5834 ULONG Count;
5835 PVOID Context;
5836 ULONGLONG Prefetch[1];
5837 } FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
5838
5839 #define FILE_PREFETCH_TYPE_FOR_CREATE 0x1
5840 #define FILE_PREFETCH_TYPE_FOR_DIRENUM 0x2
5841 #define FILE_PREFETCH_TYPE_FOR_CREATE_EX 0x3
5842 #define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX 0x4
5843
5844 #define FILE_PREFETCH_TYPE_MAX 0x4
5845
5846 typedef struct _FILE_OBJECTID_BUFFER {
5847 UCHAR ObjectId[16];
5848 _ANONYMOUS_UNION union {
5849 _ANONYMOUS_STRUCT struct {
5850 UCHAR BirthVolumeId[16];
5851 UCHAR BirthObjectId[16];
5852 UCHAR DomainId[16];
5853 } DUMMYSTRUCTNAME;
5854 UCHAR ExtendedInfo[48];
5855 } DUMMYUNIONNAME;
5856 } FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
5857
5858 typedef struct _FILE_SET_SPARSE_BUFFER {
5859 BOOLEAN SetSparse;
5860 } FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
5861
5862 typedef struct _FILE_ZERO_DATA_INFORMATION {
5863 LARGE_INTEGER FileOffset;
5864 LARGE_INTEGER BeyondFinalZero;
5865 } FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
5866
5867 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
5868 LARGE_INTEGER FileOffset;
5869 LARGE_INTEGER Length;
5870 } FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
5871
5872 typedef struct _ENCRYPTION_BUFFER {
5873 ULONG EncryptionOperation;
5874 UCHAR Private[1];
5875 } ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
5876
5877 #define FILE_SET_ENCRYPTION 0x00000001
5878 #define FILE_CLEAR_ENCRYPTION 0x00000002
5879 #define STREAM_SET_ENCRYPTION 0x00000003
5880 #define STREAM_CLEAR_ENCRYPTION 0x00000004
5881
5882 #define MAXIMUM_ENCRYPTION_VALUE 0x00000004
5883
5884 typedef struct _DECRYPTION_STATUS_BUFFER {
5885 BOOLEAN NoEncryptedStreams;
5886 } DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
5887
5888 #define ENCRYPTION_FORMAT_DEFAULT (0x01)
5889
5890 #define COMPRESSION_FORMAT_SPARSE (0x4000)
5891
5892 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
5893 LONGLONG FileOffset;
5894 ULONG Length;
5895 } REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
5896
5897 typedef struct _ENCRYPTED_DATA_INFO {
5898 ULONGLONG StartingFileOffset;
5899 ULONG OutputBufferOffset;
5900 ULONG BytesWithinFileSize;
5901 ULONG BytesWithinValidDataLength;
5902 USHORT CompressionFormat;
5903 UCHAR DataUnitShift;
5904 UCHAR ChunkShift;
5905 UCHAR ClusterShift;
5906 UCHAR EncryptionFormat;
5907 USHORT NumberOfDataBlocks;
5908 ULONG DataBlockSize[ANYSIZE_ARRAY];
5909 } ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO;
5910
5911 typedef struct _PLEX_READ_DATA_REQUEST {
5912 LARGE_INTEGER ByteOffset;
5913 ULONG ByteLength;
5914 ULONG PlexNumber;
5915 } PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
5916
5917 typedef struct _SI_COPYFILE {
5918 ULONG SourceFileNameLength;
5919 ULONG DestinationFileNameLength;
5920 ULONG Flags;
5921 WCHAR FileNameBuffer[1];
5922 } SI_COPYFILE, *PSI_COPYFILE;
5923
5924 #define COPYFILE_SIS_LINK 0x0001
5925 #define COPYFILE_SIS_REPLACE 0x0002
5926 #define COPYFILE_SIS_FLAGS 0x0003
5927
5928 #endif /* (_WIN32_WINNT >= 0x0500) */
5929
5930 #if (_WIN32_WINNT >= 0x0600)
5931
5932 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
5933 BOOLEAN CloseDisc;
5934 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
5935
5936 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
5937 BOOLEAN Disable;
5938 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
5939
5940 typedef struct _FILE_QUERY_SPARING_BUFFER {
5941 ULONG SparingUnitBytes;
5942 BOOLEAN SoftwareSparing;
5943 ULONG TotalSpareBlocks;
5944 ULONG FreeSpareBlocks;
5945 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
5946
5947 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
5948 LARGE_INTEGER DirectoryCount;
5949 LARGE_INTEGER FileCount;
5950 USHORT FsFormatMajVersion;
5951 USHORT FsFormatMinVersion;
5952 WCHAR FsFormatName[12];
5953 LARGE_INTEGER FormatTime;
5954 LARGE_INTEGER LastUpdateTime;
5955 WCHAR CopyrightInfo[34];
5956 WCHAR AbstractInfo[34];
5957 WCHAR FormattingImplementationInfo[34];
5958 WCHAR LastModifyingImplementationInfo[34];
5959 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
5960
5961 #define SET_REPAIR_ENABLED (0x00000001)
5962 #define SET_REPAIR_VOLUME_BITMAP_SCAN (0x00000002)
5963 #define SET_REPAIR_DELETE_CROSSLINK (0x00000004)
5964 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS (0x00000008)
5965 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT (0x00000010)
5966 #define SET_REPAIR_VALID_MASK (0x0000001F)
5967
5968 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
5969 ShrinkPrepare = 1,
5970 ShrinkCommit,
5971 ShrinkAbort
5972 } SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES;
5973
5974 typedef struct _SHRINK_VOLUME_INFORMATION {
5975 SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
5976 ULONGLONG Flags;
5977 LONGLONG NewNumberOfSectors;
5978 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
5979
5980 #define TXFS_RM_FLAG_LOGGING_MODE 0x00000001
5981 #define TXFS_RM_FLAG_RENAME_RM 0x00000002
5982 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000004
5983 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000008
5984 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000010
5985 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000020
5986 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000040
5987 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000080
5988 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000100
5989 #define TXFS_RM_FLAG_GROW_LOG 0x00000400
5990 #define TXFS_RM_FLAG_SHRINK_LOG 0x00000800
5991 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE 0x00001000
5992 #define TXFS_RM_FLAG_PRESERVE_CHANGES 0x00002000
5993 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START 0x00004000
5994 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START 0x00008000
5995 #define TXFS_RM_FLAG_PREFER_CONSISTENCY 0x00010000
5996 #define TXFS_RM_FLAG_PREFER_AVAILABILITY 0x00020000
5997
5998 #define TXFS_LOGGING_MODE_SIMPLE (0x0001)
5999 #define TXFS_LOGGING_MODE_FULL (0x0002)
6000
6001 #define TXFS_TRANSACTION_STATE_NONE 0x00
6002 #define TXFS_TRANSACTION_STATE_ACTIVE 0x01
6003 #define TXFS_TRANSACTION_STATE_PREPARED 0x02
6004 #define TXFS_TRANSACTION_STATE_NOTACTIVE 0x03
6005
6006 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE | \
6007 TXFS_RM_FLAG_RENAME_RM | \
6008 TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
6009 TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
6010 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6011 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6012 TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
6013 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6014 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
6015 TXFS_RM_FLAG_SHRINK_LOG | \
6016 TXFS_RM_FLAG_GROW_LOG | \
6017 TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE | \
6018 TXFS_RM_FLAG_PRESERVE_CHANGES | \
6019 TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
6020 TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
6021 TXFS_RM_FLAG_PREFER_CONSISTENCY | \
6022 TXFS_RM_FLAG_PREFER_AVAILABILITY)
6023
6024 typedef struct _TXFS_MODIFY_RM {
6025 ULONG Flags;
6026 ULONG LogContainerCountMax;
6027 ULONG LogContainerCountMin;
6028 ULONG LogContainerCount;
6029 ULONG LogGrowthIncrement;
6030 ULONG LogAutoShrinkPercentage;
6031 ULONGLONG Reserved;
6032 USHORT LoggingMode;
6033 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
6034
6035 #define TXFS_RM_STATE_NOT_STARTED 0
6036 #define TXFS_RM_STATE_STARTING 1
6037 #define TXFS_RM_STATE_ACTIVE 2
6038 #define TXFS_RM_STATE_SHUTTING_DOWN 3
6039
6040 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS \
6041 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6042 TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6043 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6044 TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
6045 TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
6046 TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
6047 TXFS_RM_FLAG_PREFER_CONSISTENCY | \
6048 TXFS_RM_FLAG_PREFER_AVAILABILITY)
6049
6050 typedef struct _TXFS_QUERY_RM_INFORMATION {
6051 ULONG BytesRequired;
6052 ULONGLONG TailLsn;
6053 ULONGLONG CurrentLsn;
6054 ULONGLONG ArchiveTailLsn;
6055 ULONGLONG LogContainerSize;
6056 LARGE_INTEGER HighestVirtualClock;
6057 ULONG LogContainerCount;
6058 ULONG LogContainerCountMax;
6059 ULONG LogContainerCountMin;
6060 ULONG LogGrowthIncrement;
6061 ULONG LogAutoShrinkPercentage;
6062 ULONG Flags;
6063 USHORT LoggingMode;
6064 USHORT Reserved;
6065 ULONG RmState;
6066 ULONGLONG LogCapacity;
6067 ULONGLONG LogFree;
6068 ULONGLONG TopsSize;
6069 ULONGLONG TopsUsed;
6070 ULONGLONG TransactionCount;
6071 ULONGLONG OnePCCount;
6072 ULONGLONG TwoPCCount;
6073 ULONGLONG NumberLogFileFull;
6074 ULONGLONG OldestTransactionAge;
6075 GUID RMName;
6076 ULONG TmLogPathOffset;
6077 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
6078
6079 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN 0x01
6080 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK 0x02
6081
6082 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS \
6083 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN | \
6084 TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
6085
6086 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
6087 LARGE_INTEGER LastVirtualClock;
6088 ULONGLONG LastRedoLsn;
6089 ULONGLONG HighestRecoveryLsn;
6090 ULONG Flags;
6091 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
6092
6093 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000001
6094 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000002
6095 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE 0x00000004
6096 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000008
6097 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000010
6098 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000020
6099 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000040
6100 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000080
6101
6102 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT 0x00000200
6103 #define TXFS_START_RM_FLAG_LOGGING_MODE 0x00000400
6104 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES 0x00000800
6105
6106 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY 0x00001000
6107 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY 0x00002000
6108
6109 #define TXFS_START_RM_VALID_FLAGS \
6110 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
6111 TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
6112 TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE | \
6113 TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
6114 TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
6115 TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
6116 TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT | \
6117 TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
6118 TXFS_START_RM_FLAG_LOGGING_MODE | \
6119 TXFS_START_RM_FLAG_PRESERVE_CHANGES | \
6120 TXFS_START_RM_FLAG_PREFER_CONSISTENCY | \
6121 TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
6122
6123 typedef struct _TXFS_START_RM_INFORMATION {
6124 ULONG Flags;
6125 ULONGLONG LogContainerSize;
6126 ULONG LogContainerCountMin;
6127 ULONG LogContainerCountMax;
6128 ULONG LogGrowthIncrement;
6129 ULONG LogAutoShrinkPercentage;
6130 ULONG TmLogPathOffset;
6131 USHORT TmLogPathLength;
6132 USHORT LoggingMode;
6133 USHORT LogPathLength;
6134 USHORT Reserved;
6135 WCHAR LogPath[1];
6136 } TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
6137
6138 typedef struct _TXFS_GET_METADATA_INFO_OUT {
6139 struct {
6140 LONGLONG LowPart;
6141 LONGLONG HighPart;
6142 } TxfFileId;
6143 GUID LockingTransaction;
6144 ULONGLONG LastLsn;
6145 ULONG TransactionState;
6146 } TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
6147
6148 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED 0x00000001
6149 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED 0x00000002
6150
6151 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
6152 ULONGLONG Offset;
6153 ULONG NameFlags;
6154 LONGLONG FileId;
6155 ULONG Reserved1;
6156 ULONG Reserved2;
6157 LONGLONG Reserved3;
6158 WCHAR FileName[1];
6159 } TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
6160
6161 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
6162 GUID KtmTransaction;
6163 ULONGLONG NumberOfFiles;
6164 ULONGLONG BufferSizeRequired;
6165 ULONGLONG Offset;
6166 } TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
6167
6168 typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
6169 GUID TransactionId;
6170 ULONG TransactionState;
6171 ULONG Reserved1;
6172 ULONG Reserved2;
6173 LONGLONG Reserved3;
6174 } TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
6175
6176 typedef struct _TXFS_LIST_TRANSACTIONS {
6177 ULONGLONG NumberOfTransactions;
6178 ULONGLONG BufferSizeRequired;
6179 } TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
6180
6181 typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
6182 _ANONYMOUS_UNION union {
6183 ULONG BufferLength;
6184 UCHAR Buffer[1];
6185 } DUMMYUNIONNAME;
6186 } TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
6187
6188 typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
6189 UCHAR Buffer[1];
6190 } TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
6191
6192 #define TXFS_TRANSACTED_VERSION_NONTRANSACTED 0xFFFFFFFE
6193 #define TXFS_TRANSACTED_VERSION_UNCOMMITTED 0xFFFFFFFF
6194
6195 typedef struct _TXFS_GET_TRANSACTED_VERSION {
6196 ULONG ThisBaseVersion;
6197 ULONG LatestVersion;
6198 USHORT ThisMiniVersion;
6199 USHORT FirstMiniVersion;
6200 USHORT LatestMiniVersion;
6201 } TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
6202
6203 #define TXFS_SAVEPOINT_SET 0x00000001
6204 #define TXFS_SAVEPOINT_ROLLBACK 0x00000002
6205 #define TXFS_SAVEPOINT_CLEAR 0x00000004
6206 #define TXFS_SAVEPOINT_CLEAR_ALL 0x00000010
6207
6208 typedef struct _TXFS_SAVEPOINT_INFORMATION {
6209 HANDLE KtmTransaction;
6210 ULONG ActionCode;
6211 ULONG SavepointId;
6212 } TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
6213
6214 typedef struct _TXFS_CREATE_MINIVERSION_INFO {
6215 USHORT StructureVersion;
6216 USHORT StructureLength;
6217 ULONG BaseVersion;
6218 USHORT MiniVersion;
6219 } TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
6220
6221 typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
6222 BOOLEAN TransactionsActiveAtSnapshot;
6223 } TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
6224
6225 #endif /* (_WIN32_WINNT >= 0x0600) */
6226
6227 #if (_WIN32_WINNT >= 0x0601)
6228
6229 #define MARK_HANDLE_REALTIME (0x00000020)
6230 #define MARK_HANDLE_NOT_REALTIME (0x00000040)
6231
6232 #define NO_8DOT3_NAME_PRESENT (0x00000001)
6233 #define REMOVED_8DOT3_NAME (0x00000002)
6234
6235 #define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED (0x00000001)
6236
6237 typedef struct _BOOT_AREA_INFO {
6238 ULONG BootSectorCount;
6239 struct {
6240 LARGE_INTEGER Offset;
6241 } BootSectors[2];
6242 } BOOT_AREA_INFO, *PBOOT_AREA_INFO;
6243
6244 typedef struct _RETRIEVAL_POINTER_BASE {
6245 LARGE_INTEGER FileAreaOffset;
6246 } RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
6247
6248 typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION {
6249 ULONG VolumeFlags;
6250 ULONG FlagMask;
6251 ULONG Version;
6252 ULONG Reserved;
6253 } FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION;
6254
6255 typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
6256 CHAR FileSystem[9];
6257 } FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
6258
6259 #define OPLOCK_LEVEL_CACHE_READ (0x00000001)
6260 #define OPLOCK_LEVEL_CACHE_HANDLE (0x00000002)
6261 #define OPLOCK_LEVEL_CACHE_WRITE (0x00000004)
6262
6263 #define REQUEST_OPLOCK_INPUT_FLAG_REQUEST (0x00000001)
6264 #define REQUEST_OPLOCK_INPUT_FLAG_ACK (0x00000002)
6265 #define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)
6266
6267 #define REQUEST_OPLOCK_CURRENT_VERSION 1
6268
6269 typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
6270 USHORT StructureVersion;
6271 USHORT StructureLength;
6272 ULONG RequestedOplockLevel;
6273 ULONG Flags;
6274 } REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
6275
6276 #define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED (0x00000001)
6277 #define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED (0x00000002)
6278
6279 typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
6280 USHORT StructureVersion;
6281 USHORT StructureLength;
6282 ULONG OriginalOplockLevel;
6283 ULONG NewOplockLevel;
6284 ULONG Flags;
6285 ACCESS_MASK AccessMode;
6286 USHORT ShareMode;
6287 } REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
6288
6289 #define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID 1
6290
6291 typedef struct _SD_CHANGE_MACHINE_SID_INPUT {
6292 USHORT CurrentMachineSIDOffset;
6293 USHORT CurrentMachineSIDLength;
6294 USHORT NewMachineSIDOffset;
6295 USHORT NewMachineSIDLength;
6296 } SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT;
6297
6298 typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
6299 ULONGLONG NumSDChangedSuccess;
6300 ULONGLONG NumSDChangedFail;
6301 ULONGLONG NumSDUnused;
6302 ULONGLONG NumSDTotal;
6303 ULONGLONG NumMftSDChangedSuccess;
6304 ULONGLONG NumMftSDChangedFail;
6305 ULONGLONG NumMftSDTotal;
6306 } SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT;
6307
6308 typedef struct _SD_GLOBAL_CHANGE_INPUT {
6309 ULONG Flags;
6310 ULONG ChangeType;
6311 _ANONYMOUS_UNION union {
6312 SD_CHANGE_MACHINE_SID_INPUT SdChange;
6313 } DUMMYUNIONNAME;
6314 } SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT;
6315
6316 typedef struct _SD_GLOBAL_CHANGE_OUTPUT {
6317 ULONG Flags;
6318 ULONG ChangeType;
6319 _ANONYMOUS_UNION union {
6320 SD_CHANGE_MACHINE_SID_OUTPUT SdChange;
6321 } DUMMYUNIONNAME;
6322 } SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT;
6323
6324 #define ENCRYPTED_DATA_INFO_SPARSE_FILE 1
6325
6326 typedef struct _EXTENDED_ENCRYPTED_DATA_INFO {
6327 ULONG ExtendedCode;
6328 ULONG Length;
6329 ULONG Flags;
6330 ULONG Reserved;
6331 } EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO;
6332
6333 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
6334 ULONG Flags;
6335 ULONG NumberOfClusters;
6336 LARGE_INTEGER Cluster[1];
6337 } LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
6338
6339 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
6340 ULONG Offset;
6341 ULONG NumberOfMatches;
6342 ULONG BufferSizeRequired;
6343 } LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
6344
6345 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE 0x00000001
6346 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET 0x00000002
6347 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE 0x00000004
6348 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE 0x00000008
6349
6350 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK 0xff000000
6351 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA 0x01000000
6352 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX 0x02000000
6353 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM 0x03000000
6354
6355 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
6356 ULONG OffsetToNext;
6357 ULONG Flags;
6358 LARGE_INTEGER Reserved;
6359 LARGE_INTEGER Cluster;
6360 WCHAR FileName[1];
6361 } LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
6362
6363 typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
6364 ULONG Flags;
6365 ULONG NumFileTypeIDs;
6366 GUID FileTypeID[1];
6367 } FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT;
6368
6369 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN 0x00000001
6370 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END 0x00000002
6371
6372 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE, 0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c);
6373 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE, 0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7);
6374 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE, 0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9);
6375
6376 #ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
6377 #define _VIRTUAL_STORAGE_TYPE_DEFINED
6378 typedef struct _VIRTUAL_STORAGE_TYPE {
6379 ULONG DeviceId;
6380 GUID VendorId;
6381 } VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
6382 #endif
6383
6384 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST {
6385 ULONG RequestLevel;
6386 ULONG RequestFlags;
6387 } STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST, *PSTORAGE_QUERY_DEPENDENT_VOLUME_REQUEST;
6388
6389 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_HOST_VOLUMES 0x1
6390 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_GUEST_VOLUMES 0x2
6391
6392 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY {
6393 ULONG EntryLength;
6394 ULONG DependencyTypeFlags;
6395 ULONG ProviderSpecificFlags;
6396 VIRTUAL_STORAGE_TYPE VirtualStorageType;
6397 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY;
6398
6399 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY {
6400 ULONG EntryLength;
6401 ULONG DependencyTypeFlags;
6402 ULONG ProviderSpecificFlags;
6403 VIRTUAL_STORAGE_TYPE VirtualStorageType;
6404 ULONG AncestorLevel;
6405 ULONG HostVolumeNameOffset;
6406 ULONG HostVolumeNameSize;
6407 ULONG DependentVolumeNameOffset;
6408 ULONG DependentVolumeNameSize;
6409 ULONG RelativePathOffset;
6410 ULONG RelativePathSize;
6411 ULONG DependentDeviceNameOffset;
6412 ULONG DependentDeviceNameSize;
6413 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY;
6414
6415 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE {
6416 ULONG ResponseLevel;
6417 ULONG NumberEntries;
6418 _ANONYMOUS_UNION union {
6419 STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[];
6420 STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[];
6421 } DUMMYUNIONNAME;
6422 } STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE;
6423
6424 #endif /* (_WIN32_WINNT >= 0x0601) */
6425
6426 typedef struct _FILESYSTEM_STATISTICS {
6427 USHORT FileSystemType;
6428 USHORT Version;
6429 ULONG SizeOfCompleteStructure;
6430 ULONG UserFileReads;
6431 ULONG UserFileReadBytes;
6432 ULONG UserDiskReads;
6433 ULONG UserFileWrites;
6434 ULONG UserFileWriteBytes;
6435 ULONG UserDiskWrites;
6436 ULONG MetaDataReads;
6437 ULONG MetaDataReadBytes;
6438 ULONG MetaDataDiskReads;
6439 ULONG MetaDataWrites;
6440 ULONG MetaDataWriteBytes;
6441 ULONG MetaDataDiskWrites;
6442 } FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
6443
6444 #define FILESYSTEM_STATISTICS_TYPE_NTFS 1
6445 #define FILESYSTEM_STATISTICS_TYPE_FAT 2
6446 #define FILESYSTEM_STATISTICS_TYPE_EXFAT 3
6447
6448 typedef struct _FAT_STATISTICS {
6449 ULONG CreateHits;
6450 ULONG SuccessfulCreates;
6451 ULONG FailedCreates;
6452 ULONG NonCachedReads;
6453 ULONG NonCachedReadBytes;
6454 ULONG NonCachedWrites;
6455 ULONG NonCachedWriteBytes;
6456 ULONG NonCachedDiskReads;
6457 ULONG NonCachedDiskWrites;
6458 } FAT_STATISTICS, *PFAT_STATISTICS;
6459
6460 typedef struct _EXFAT_STATISTICS {
6461 ULONG CreateHits;
6462 ULONG SuccessfulCreates;
6463 ULONG FailedCreates;
6464 ULONG NonCachedReads;
6465 ULONG NonCachedReadBytes;
6466 ULONG NonCachedWrites;
6467 ULONG NonCachedWriteBytes;
6468 ULONG NonCachedDiskReads;
6469 ULONG NonCachedDiskWrites;
6470 } EXFAT_STATISTICS, *PEXFAT_STATISTICS;
6471
6472 typedef struct _NTFS_STATISTICS {
6473 ULONG LogFileFullExceptions;
6474 ULONG OtherExceptions;
6475 ULONG MftReads;
6476 ULONG MftReadBytes;
6477 ULONG MftWrites;
6478 ULONG MftWriteBytes;
6479 struct {
6480 USHORT Write;
6481 USHORT Create;
6482 USHORT SetInfo;
6483 USHORT Flush;
6484 } MftWritesUserLevel;
6485 USHORT MftWritesFlushForLogFileFull;
6486 USHORT MftWritesLazyWriter;
6487 USHORT MftWritesUserRequest;
6488 ULONG Mft2Writes;
6489 ULONG Mft2WriteBytes;
6490 struct {
6491 USHORT Write;
6492 USHORT Create;
6493 USHORT SetInfo;
6494 USHORT Flush;
6495 } Mft2WritesUserLevel;
6496 USHORT Mft2WritesFlushForLogFileFull;
6497 USHORT Mft2WritesLazyWriter;
6498 USHORT Mft2WritesUserRequest;
6499 ULONG RootIndexReads;
6500 ULONG RootIndexReadBytes;
6501 ULONG RootIndexWrites;
6502 ULONG RootIndexWriteBytes;
6503 ULONG BitmapReads;
6504 ULONG BitmapReadBytes;
6505 ULONG BitmapWrites;
6506 ULONG BitmapWriteBytes;
6507 USHORT BitmapWritesFlushForLogFileFull;
6508 USHORT BitmapWritesLazyWriter;
6509 USHORT BitmapWritesUserRequest;
6510 struct {
6511 USHORT Write;
6512 USHORT Create;
6513 USHORT SetInfo;
6514 } BitmapWritesUserLevel;
6515 ULONG MftBitmapReads;
6516 ULONG MftBitmapReadBytes;
6517 ULONG MftBitmapWrites;
6518 ULONG MftBitmapWriteBytes;
6519 USHORT MftBitmapWritesFlushForLogFileFull;
6520 USHORT MftBitmapWritesLazyWriter;
6521 USHORT MftBitmapWritesUserRequest;
6522 struct {
6523 USHORT Write;
6524 USHORT Create;
6525 USHORT SetInfo;
6526 USHORT Flush;
6527 } MftBitmapWritesUserLevel;
6528 ULONG UserIndexReads;
6529 ULONG UserIndexReadBytes;
6530 ULONG UserIndexWrites;
6531 ULONG UserIndexWriteBytes;
6532 ULONG LogFileReads;
6533 ULONG LogFileReadBytes;
6534 ULONG LogFileWrites;
6535 ULONG LogFileWriteBytes;
6536 struct {
6537 ULONG Calls;
6538 ULONG Clusters;
6539 ULONG Hints;
6540 ULONG RunsReturned;
6541 ULONG HintsHonored;
6542 ULONG HintsClusters;
6543 ULONG Cache;
6544 ULONG CacheClusters;
6545 ULONG CacheMiss;
6546 ULONG CacheMissClusters;
6547 } Allocate;
6548 } NTFS_STATISTICS, *PNTFS_STATISTICS;
6549
6550 #endif /* _FILESYSTEMFSCTL_ */
6551
6552 #define SYMLINK_FLAG_RELATIVE 1
6553
6554 typedef struct _REPARSE_DATA_BUFFER {
6555 ULONG ReparseTag;
6556 USHORT ReparseDataLength;
6557 USHORT Reserved;
6558 _ANONYMOUS_UNION union {
6559 struct {
6560 USHORT SubstituteNameOffset;
6561 USHORT SubstituteNameLength;
6562 USHORT PrintNameOffset;
6563 USHORT PrintNameLength;
6564 ULONG Flags;
6565 WCHAR PathBuffer[1];
6566 } SymbolicLinkReparseBuffer;
6567 struct {
6568 USHORT SubstituteNameOffset;
6569 USHORT SubstituteNameLength;
6570 USHORT PrintNameOffset;
6571 USHORT PrintNameLength;
6572 WCHAR PathBuffer[1];
6573 } MountPointReparseBuffer;
6574 struct {
6575 UCHAR DataBuffer[1];
6576 } GenericReparseBuffer;
6577 } DUMMYUNIONNAME;
6578 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
6579
6580 #define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
6581
6582 typedef struct _REPARSE_GUID_DATA_BUFFER {
6583 ULONG ReparseTag;
6584 USHORT ReparseDataLength;
6585 USHORT Reserved;
6586 GUID ReparseGuid;
6587 struct {
6588 UCHAR DataBuffer[1];
6589 } GenericReparseBuffer;
6590 } REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
6591
6592 #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
6593
6594 #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 )
6595
6596 /* Reserved reparse tags */
6597 #define IO_REPARSE_TAG_RESERVED_ZERO (0)
6598 #define IO_REPARSE_TAG_RESERVED_ONE (1)
6599 #define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE
6600
6601 #define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000))
6602 #define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000))
6603
6604 #define IO_REPARSE_TAG_VALID_VALUES (0xF000FFFF)
6605
6606 #define IsReparseTagValid(tag) ( \
6607 !((tag) & ~IO_REPARSE_TAG_VALID_VALUES) && \
6608 ((tag) > IO_REPARSE_TAG_RESERVED_RANGE) \
6609 )
6610
6611 /* MicroSoft reparse point tags */
6612 #define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
6613 #define IO_REPARSE_TAG_HSM (0xC0000004L)
6614 #define IO_REPARSE_TAG_DRIVE_EXTENDER (0x80000005L)
6615 #define IO_REPARSE_TAG_HSM2 (0x80000006L)
6616 #define IO_REPARSE_TAG_SIS (0x80000007L)
6617 #define IO_REPARSE_TAG_WIM (0x80000008L)
6618 #define IO_REPARSE_TAG_CSV (0x80000009L)
6619 #define IO_REPARSE_TAG_DFS (0x8000000AL)
6620 #define IO_REPARSE_TAG_FILTER_MANAGER (0x8000000BL)
6621 #define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
6622 #define IO_REPARSE_TAG_IIS_CACHE (0xA0000010L)
6623 #define IO_REPARSE_TAG_DFSR (0x80000012L)
6624
6625 #pragma pack(4)
6626 typedef struct _REPARSE_INDEX_KEY {
6627 ULONG FileReparseTag;
6628 LARGE_INTEGER FileId;
6629 } REPARSE_INDEX_KEY, *PREPARSE_INDEX_KEY;
6630 #pragma pack()
6631
6632 #define FSCTL_LMR_GET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,58,METHOD_BUFFERED,FILE_ANY_ACCESS)
6633 #define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS)
6634 #define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
6635
6636 #define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
6637 #define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
6638 #define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
6639 #define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
6640 #define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
6641 #define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
6642 #define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
6643 #define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
6644 #define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
6645 #define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
6646 #define FSCTL_PIPE_GET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
6647 #define FSCTL_PIPE_SET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
6648 #define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
6649 #define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
6650 #define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
6651 #define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
6652 #define FSCTL_PIPE_FLUSH CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)
6653
6654 #define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
6655 #define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
6656 #define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
6657 #define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
6658
6659 #define FILE_PIPE_READ_DATA 0x00000000
6660 #define FILE_PIPE_WRITE_SPACE 0x00000001
6661
6662 typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
6663 HANDLE EventHandle;
6664 ULONG KeyValue;
6665 } FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;
6666
6667 typedef struct _FILE_PIPE_EVENT_BUFFER {
6668 ULONG NamedPipeState;
6669 ULONG EntryType;
6670 ULONG ByteCount;
6671 ULONG KeyValue;
6672 ULONG NumberRequests;
6673 } FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;
6674
6675 typedef struct _FILE_PIPE_PEEK_BUFFER {
6676 ULONG NamedPipeState;
6677 ULONG ReadDataAvailable;
6678 ULONG NumberOfMessages;
6679 ULONG MessageLength;
6680 CHAR Data[1];
6681 } FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
6682
6683 typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
6684 LARGE_INTEGER Timeout;
6685 ULONG NameLength;
6686 BOOLEAN TimeoutSpecified;
6687 WCHAR Name[1];
6688 } FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
6689
6690 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
6691 #if !defined(BUILD_WOW6432)
6692 PVOID ClientSession;
6693 PVOID ClientProcess;
6694 #else
6695 ULONGLONG ClientSession;
6696 ULONGLONG ClientProcess;
6697 #endif
6698 } FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;
6699
6700 #define FILE_PIPE_COMPUTER_NAME_LENGTH 15
6701
6702 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX {
6703 #if !defined(BUILD_WOW6432)
6704 PVOID ClientSession;
6705 PVOID ClientProcess;
6706 #else
6707 ULONGLONG ClientSession;
6708 ULONGLONG ClientProcess;
6709 #endif
6710 USHORT ClientComputerNameLength;
6711 WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH+1];
6712 } FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX;
6713
6714 #define FSCTL_MAILSLOT_PEEK CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
6715
6716 typedef enum _LINK_TRACKING_INFORMATION_TYPE {
6717 NtfsLinkTrackingInformation,
6718 DfsLinkTrackingInformation
6719 } LINK_TRACKING_INFORMATION_TYPE, *PLINK_TRACKING_INFORMATION_TYPE;
6720
6721 typedef struct _LINK_TRACKING_INFORMATION {
6722 LINK_TRACKING_INFORMATION_TYPE Type;
6723 UCHAR VolumeId[16];
6724 } LINK_TRACKING_INFORMATION, *PLINK_TRACKING_INFORMATION;
6725
6726 typedef struct _REMOTE_LINK_TRACKING_INFORMATION {
6727 PVOID TargetFileObject;
6728 ULONG TargetLinkTrackingInformationLength;
6729 UCHAR TargetLinkTrackingInformationBuffer[1];
6730 } REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION;
6731
6732 #define IO_OPEN_PAGING_FILE 0x0002
6733 #define IO_OPEN_TARGET_DIRECTORY 0x0004
6734 #define IO_STOP_ON_SYMLINK 0x0008
6735 #define IO_MM_PAGING_FILE 0x0010
6736
6737 typedef VOID
6738 (NTAPI *PDRIVER_FS_NOTIFICATION) (
6739 IN PDEVICE_OBJECT DeviceObject,
6740 IN BOOLEAN FsActive);
6741
6742 typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
6743 SyncTypeOther = 0,
6744 SyncTypeCreateSection
6745 } FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
6746
6747 typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
6748 NotifyTypeCreate = 0,
6749 NotifyTypeRetired
6750 } FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
6751
6752 typedef union _FS_FILTER_PARAMETERS {
6753 struct {
6754 PLARGE_INTEGER EndingOffset;
6755 PERESOURCE *ResourceToRelease;
6756 } AcquireForModifiedPageWriter;
6757 struct {
6758 PERESOURCE ResourceToRelease;
6759 } ReleaseForModifiedPageWriter;
6760 struct {
6761 FS_FILTER_SECTION_SYNC_TYPE SyncType;
6762 ULONG PageProtection;
6763 } AcquireForSectionSynchronization;
6764 struct {
6765 FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
6766 BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
6767 } NotifyStreamFileObject;
6768 struct {
6769 PVOID Argument1;
6770 PVOID Argument2;
6771 PVOID Argument3;
6772 PVOID Argument4;
6773 PVOID Argument5;
6774 } Others;
6775 } FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
6776
6777 #define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-1
6778 #define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-2
6779 #define FS_FILTER_ACQUIRE_FOR_MOD_WRITE (UCHAR)-3
6780 #define FS_FILTER_RELEASE_FOR_MOD_WRITE (UCHAR)-4
6781 #define FS_FILTER_ACQUIRE_FOR_CC_FLUSH (UCHAR)-5
6782 #define FS_FILTER_RELEASE_FOR_CC_FLUSH (UCHAR)-6
6783
6784 typedef struct _FS_FILTER_CALLBACK_DATA {
6785 ULONG SizeOfFsFilterCallbackData;
6786 UCHAR Operation;
6787 UCHAR Reserved;
6788 struct _DEVICE_OBJECT *DeviceObject;
6789 struct _FILE_OBJECT *FileObject;
6790 FS_FILTER_PARAMETERS Parameters;
6791 } FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
6792
6793 typedef NTSTATUS
6794 (NTAPI *PFS_FILTER_CALLBACK) (
6795 IN PFS_FILTER_CALLBACK_DATA Data,
6796 OUT PVOID *CompletionContext);
6797
6798 typedef VOID
6799 (NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
6800 IN PFS_FILTER_CALLBACK_DATA Data,
6801 IN NTSTATUS OperationStatus,
6802 IN PVOID CompletionContext);
6803
6804 typedef struct _FS_FILTER_CALLBACKS {
6805 ULONG SizeOfFsFilterCallbacks;
6806 ULONG Reserved;
6807 PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
6808 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
6809 PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
6810 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
6811 PFS_FILTER_CALLBACK PreAcquireForCcFlush;
6812 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
6813 PFS_FILTER_CALLBACK PreReleaseForCcFlush;
6814 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
6815 PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
6816 PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
6817 PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
6818 PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
6819 } FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
6820
6821 #if (NTDDI_VERSION >= NTDDI_WINXP)
6822 NTKERNELAPI
6823 NTSTATUS
6824 NTAPI
6825 FsRtlRegisterFileSystemFilterCallbacks(
6826 IN struct _DRIVER_OBJECT *FilterDriverObject,
6827 IN PFS_FILTER_CALLBACKS Callbacks);
6828 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
6829
6830 #if (NTDDI_VERSION >= NTDDI_VISTA)
6831 NTKERNELAPI
6832 NTSTATUS
6833 NTAPI
6834 FsRtlNotifyStreamFileObject(
6835 IN struct _FILE_OBJECT * StreamFileObject,
6836 IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL,
6837 IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
6838 IN BOOLEAN SafeToRecurse);
6839 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
6840
6841 #define DO_VERIFY_VOLUME 0x00000002
6842 #define DO_BUFFERED_IO 0x00000004
6843 #define DO_EXCLUSIVE 0x00000008
6844 #define DO_DIRECT_IO 0x00000010
6845 #define DO_MAP_IO_BUFFER 0x00000020
6846 #define DO_DEVICE_HAS_NAME 0x00000040
6847 #define DO_DEVICE_INITIALIZING 0x00000080
6848 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
6849 #define DO_LONG_TERM_REQUESTS 0x00000200
6850 #define DO_NEVER_LAST_DEVICE 0x00000400
6851 #define DO_SHUTDOWN_REGISTERED 0x00000800
6852 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
6853 #define DO_POWER_PAGABLE 0x00002000
6854 #define DO_POWER_INRUSH 0x00004000
6855 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
6856 #define DO_SUPPORTS_TRANSACTIONS 0x00040000
6857 #define DO_FORCE_NEITHER_IO 0x00080000
6858 #define DO_VOLUME_DEVICE_OBJECT 0x00100000
6859 #define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
6860 #define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
6861 #define DO_DISALLOW_EXECUTE 0x00800000
6862
6863 extern KSPIN_LOCK IoStatisticsLock;
6864 extern ULONG IoReadOperationCount;
6865 extern ULONG IoWriteOperationCount;
6866 extern ULONG IoOtherOperationCount;
6867 extern LARGE_INTEGER IoReadTransferCount;
6868 extern LARGE_INTEGER IoWriteTransferCount;
6869 extern LARGE_INTEGER IoOtherTransferCount;
6870
6871 #define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64
6872 #define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024
6873
6874 #if (NTDDI_VERSION >= NTDDI_VISTA)
6875 typedef struct _IO_PRIORITY_INFO {
6876 ULONG Size;
6877 ULONG ThreadPriority;
6878 ULONG PagePriority;
6879 IO_PRIORITY_HINT IoPriority;
6880 } IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
6881 #endif
6882 $endif (_NTIFS_)