[EXT2FSD]
[reactos.git] / include / xdk / iotypes.h
1 /******************************************************************************
2 * I/O Manager Types *
3 ******************************************************************************/
4
5 /* PCI_COMMON_CONFIG.Command */
6 #define PCI_ENABLE_IO_SPACE 0x0001
7 #define PCI_ENABLE_MEMORY_SPACE 0x0002
8 #define PCI_ENABLE_BUS_MASTER 0x0004
9 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
10 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
11 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
12 #define PCI_ENABLE_PARITY 0x0040
13 #define PCI_ENABLE_WAIT_CYCLE 0x0080
14 #define PCI_ENABLE_SERR 0x0100
15 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
16 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
17
18 /* PCI_COMMON_CONFIG.Status */
19 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
20 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
21 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
22 #define PCI_STATUS_UDF_SUPPORTED 0x0040
23 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
24 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
25 #define PCI_STATUS_DEVSEL 0x0600
26 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
27 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
28 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
29 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
30 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
31
32 /* PCI_COMMON_CONFIG.HeaderType */
33 #define PCI_MULTIFUNCTION 0x80
34 #define PCI_DEVICE_TYPE 0x00
35 #define PCI_BRIDGE_TYPE 0x01
36 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
37
38 #define PCI_CONFIGURATION_TYPE(PciData) \
39 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
40
41 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
42 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
43
44 /* PCI device classes */
45 #define PCI_CLASS_PRE_20 0x00
46 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
47 #define PCI_CLASS_NETWORK_CTLR 0x02
48 #define PCI_CLASS_DISPLAY_CTLR 0x03
49 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
50 #define PCI_CLASS_MEMORY_CTLR 0x05
51 #define PCI_CLASS_BRIDGE_DEV 0x06
52 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
53 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
54 #define PCI_CLASS_INPUT_DEV 0x09
55 #define PCI_CLASS_DOCKING_STATION 0x0a
56 #define PCI_CLASS_PROCESSOR 0x0b
57 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
58 #define PCI_CLASS_WIRELESS_CTLR 0x0d
59 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
60 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
61 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
62 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
63
64 /* PCI device subclasses for class 0 */
65 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
66 #define PCI_SUBCLASS_PRE_20_VGA 0x01
67
68 /* PCI device subclasses for class 1 (mass storage controllers)*/
69 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
70 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
71 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
72 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
73 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
74 #define PCI_SUBCLASS_MSC_OTHER 0x80
75
76 /* PCI device subclasses for class 2 (network controllers)*/
77 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
78 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
79 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
80 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
81 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
82 #define PCI_SUBCLASS_NET_OTHER 0x80
83
84 /* PCI device subclasses for class 3 (display controllers)*/
85 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
86 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
87 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
88 #define PCI_SUBCLASS_VID_OTHER 0x80
89
90 /* PCI device subclasses for class 4 (multimedia device)*/
91 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
92 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
93 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
94 #define PCI_SUBCLASS_MM_OTHER 0x80
95
96 /* PCI device subclasses for class 5 (memory controller)*/
97 #define PCI_SUBCLASS_MEM_RAM 0x00
98 #define PCI_SUBCLASS_MEM_FLASH 0x01
99 #define PCI_SUBCLASS_MEM_OTHER 0x80
100
101 /* PCI device subclasses for class 6 (bridge device)*/
102 #define PCI_SUBCLASS_BR_HOST 0x00
103 #define PCI_SUBCLASS_BR_ISA 0x01
104 #define PCI_SUBCLASS_BR_EISA 0x02
105 #define PCI_SUBCLASS_BR_MCA 0x03
106 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
107 #define PCI_SUBCLASS_BR_PCMCIA 0x05
108 #define PCI_SUBCLASS_BR_NUBUS 0x06
109 #define PCI_SUBCLASS_BR_CARDBUS 0x07
110 #define PCI_SUBCLASS_BR_RACEWAY 0x08
111 #define PCI_SUBCLASS_BR_OTHER 0x80
112
113 /* PCI device subclasses for class C (serial bus controller)*/
114 #define PCI_SUBCLASS_SB_IEEE1394 0x00
115 #define PCI_SUBCLASS_SB_ACCESS 0x01
116 #define PCI_SUBCLASS_SB_SSA 0x02
117 #define PCI_SUBCLASS_SB_USB 0x03
118 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
119 #define PCI_SUBCLASS_SB_SMBUS 0x05
120
121 #define PCI_MAX_DEVICES 32
122 #define PCI_MAX_FUNCTION 8
123 #define PCI_MAX_BRIDGE_NUMBER 0xFF
124 #define PCI_INVALID_VENDORID 0xFFFF
125 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
126
127 #define PCI_ADDRESS_IO_SPACE 0x00000001
128 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
129 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
130 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
131 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
132 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
133
134 #define PCI_TYPE_32BIT 0
135 #define PCI_TYPE_20BIT 2
136 #define PCI_TYPE_64BIT 4
137
138 #define POOL_COLD_ALLOCATION 256
139 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
140 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
141
142 #define PCI_TYPE0_ADDRESSES 6
143 #define PCI_TYPE1_ADDRESSES 2
144 #define PCI_TYPE2_ADDRESSES 5
145
146 #define IO_TYPE_ADAPTER 1
147 #define IO_TYPE_CONTROLLER 2
148 #define IO_TYPE_DEVICE 3
149 #define IO_TYPE_DRIVER 4
150 #define IO_TYPE_FILE 5
151 #define IO_TYPE_IRP 6
152 #define IO_TYPE_MASTER_ADAPTER 7
153 #define IO_TYPE_OPEN_PACKET 8
154 #define IO_TYPE_TIMER 9
155 #define IO_TYPE_VPB 10
156 #define IO_TYPE_ERROR_LOG 11
157 #define IO_TYPE_ERROR_MESSAGE 12
158 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
159
160 #define IO_TYPE_CSQ_IRP_CONTEXT 1
161 #define IO_TYPE_CSQ 2
162 #define IO_TYPE_CSQ_EX 3
163
164 /* IO_RESOURCE_DESCRIPTOR.Option */
165 #define IO_RESOURCE_PREFERRED 0x01
166 #define IO_RESOURCE_DEFAULT 0x02
167 #define IO_RESOURCE_ALTERNATIVE 0x08
168
169 /* DEVICE_OBJECT.Flags */
170 #define DO_VERIFY_VOLUME 0x00000002
171 #define DO_BUFFERED_IO 0x00000004
172 #define DO_EXCLUSIVE 0x00000008
173 #define DO_DIRECT_IO 0x00000010
174 #define DO_MAP_IO_BUFFER 0x00000020
175 #define DO_DEVICE_INITIALIZING 0x00000080
176 #define DO_SHUTDOWN_REGISTERED 0x00000800
177 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
178 #define DO_POWER_PAGABLE 0x00002000
179 #define DO_POWER_INRUSH 0x00004000
180
181 /* DEVICE_OBJECT.Characteristics */
182 #define FILE_REMOVABLE_MEDIA 0x00000001
183 #define FILE_READ_ONLY_DEVICE 0x00000002
184 #define FILE_FLOPPY_DISKETTE 0x00000004
185 #define FILE_WRITE_ONCE_MEDIA 0x00000008
186 #define FILE_REMOTE_DEVICE 0x00000010
187 #define FILE_DEVICE_IS_MOUNTED 0x00000020
188 #define FILE_VIRTUAL_VOLUME 0x00000040
189 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
190 #define FILE_DEVICE_SECURE_OPEN 0x00000100
191 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
192 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
193 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
194
195 /* DEVICE_OBJECT.AlignmentRequirement */
196 #define FILE_BYTE_ALIGNMENT 0x00000000
197 #define FILE_WORD_ALIGNMENT 0x00000001
198 #define FILE_LONG_ALIGNMENT 0x00000003
199 #define FILE_QUAD_ALIGNMENT 0x00000007
200 #define FILE_OCTA_ALIGNMENT 0x0000000f
201 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
202 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
203 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
204 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
205 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
206
207 /* DEVICE_OBJECT.DeviceType */
208 #define DEVICE_TYPE ULONG
209
210 #define FILE_DEVICE_BEEP 0x00000001
211 #define FILE_DEVICE_CD_ROM 0x00000002
212 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
213 #define FILE_DEVICE_CONTROLLER 0x00000004
214 #define FILE_DEVICE_DATALINK 0x00000005
215 #define FILE_DEVICE_DFS 0x00000006
216 #define FILE_DEVICE_DISK 0x00000007
217 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
218 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
219 #define FILE_DEVICE_INPORT_PORT 0x0000000a
220 #define FILE_DEVICE_KEYBOARD 0x0000000b
221 #define FILE_DEVICE_MAILSLOT 0x0000000c
222 #define FILE_DEVICE_MIDI_IN 0x0000000d
223 #define FILE_DEVICE_MIDI_OUT 0x0000000e
224 #define FILE_DEVICE_MOUSE 0x0000000f
225 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
226 #define FILE_DEVICE_NAMED_PIPE 0x00000011
227 #define FILE_DEVICE_NETWORK 0x00000012
228 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
229 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
230 #define FILE_DEVICE_NULL 0x00000015
231 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
232 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
233 #define FILE_DEVICE_PRINTER 0x00000018
234 #define FILE_DEVICE_SCANNER 0x00000019
235 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
236 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
237 #define FILE_DEVICE_SCREEN 0x0000001c
238 #define FILE_DEVICE_SOUND 0x0000001d
239 #define FILE_DEVICE_STREAMS 0x0000001e
240 #define FILE_DEVICE_TAPE 0x0000001f
241 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
242 #define FILE_DEVICE_TRANSPORT 0x00000021
243 #define FILE_DEVICE_UNKNOWN 0x00000022
244 #define FILE_DEVICE_VIDEO 0x00000023
245 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
246 #define FILE_DEVICE_WAVE_IN 0x00000025
247 #define FILE_DEVICE_WAVE_OUT 0x00000026
248 #define FILE_DEVICE_8042_PORT 0x00000027
249 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
250 #define FILE_DEVICE_BATTERY 0x00000029
251 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
252 #define FILE_DEVICE_MODEM 0x0000002b
253 #define FILE_DEVICE_VDM 0x0000002c
254 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
255 #define FILE_DEVICE_SMB 0x0000002e
256 #define FILE_DEVICE_KS 0x0000002f
257 #define FILE_DEVICE_CHANGER 0x00000030
258 #define FILE_DEVICE_SMARTCARD 0x00000031
259 #define FILE_DEVICE_ACPI 0x00000032
260 #define FILE_DEVICE_DVD 0x00000033
261 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
262 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
263 #define FILE_DEVICE_DFS_VOLUME 0x00000036
264 #define FILE_DEVICE_SERENUM 0x00000037
265 #define FILE_DEVICE_TERMSRV 0x00000038
266 #define FILE_DEVICE_KSEC 0x00000039
267 #define FILE_DEVICE_FIPS 0x0000003A
268 #define FILE_DEVICE_INFINIBAND 0x0000003B
269 #define FILE_DEVICE_VMBUS 0x0000003E
270 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
271 #define FILE_DEVICE_WPD 0x00000040
272 #define FILE_DEVICE_BLUETOOTH 0x00000041
273 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
274 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
275 #define FILE_DEVICE_BIOMETRIC 0x00000044
276 #define FILE_DEVICE_PMI 0x00000045
277
278 #if defined(NT_PROCESSOR_GROUPS)
279
280 typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
281
282 typedef enum _IRQ_DEVICE_POLICY_USHORT {
283 IrqPolicyMachineDefault = 0,
284 IrqPolicyAllCloseProcessors = 1,
285 IrqPolicyOneCloseProcessor = 2,
286 IrqPolicyAllProcessorsInMachine = 3,
287 IrqPolicyAllProcessorsInGroup = 3,
288 IrqPolicySpecifiedProcessors = 4,
289 IrqPolicySpreadMessagesAcrossAllProcessors = 5};
290
291 #else /* defined(NT_PROCESSOR_GROUPS) */
292
293 typedef enum _IRQ_DEVICE_POLICY {
294 IrqPolicyMachineDefault = 0,
295 IrqPolicyAllCloseProcessors,
296 IrqPolicyOneCloseProcessor,
297 IrqPolicyAllProcessorsInMachine,
298 IrqPolicySpecifiedProcessors,
299 IrqPolicySpreadMessagesAcrossAllProcessors
300 } IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
301
302 #endif
303
304 typedef enum _IRQ_PRIORITY {
305 IrqPriorityUndefined = 0,
306 IrqPriorityLow,
307 IrqPriorityNormal,
308 IrqPriorityHigh
309 } IRQ_PRIORITY, *PIRQ_PRIORITY;
310
311 typedef enum _IRQ_GROUP_POLICY {
312 GroupAffinityAllGroupZero = 0,
313 GroupAffinityDontCare
314 } IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY;
315
316 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
317
318 typedef struct _OBJECT_HANDLE_INFORMATION {
319 ULONG HandleAttributes;
320 ACCESS_MASK GrantedAccess;
321 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
322
323 typedef struct _CLIENT_ID {
324 HANDLE UniqueProcess;
325 HANDLE UniqueThread;
326 } CLIENT_ID, *PCLIENT_ID;
327
328 typedef VOID
329 (NTAPI *PKSTART_ROUTINE)(
330 IN PVOID StartContext);
331
332 typedef struct _VPB {
333 CSHORT Type;
334 CSHORT Size;
335 USHORT Flags;
336 USHORT VolumeLabelLength;
337 struct _DEVICE_OBJECT *DeviceObject;
338 struct _DEVICE_OBJECT *RealDevice;
339 ULONG SerialNumber;
340 ULONG ReferenceCount;
341 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
342 } VPB, *PVPB;
343
344 typedef enum _IO_ALLOCATION_ACTION {
345 KeepObject = 1,
346 DeallocateObject,
347 DeallocateObjectKeepRegisters
348 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
349
350 typedef IO_ALLOCATION_ACTION
351 (NTAPI *PDRIVER_CONTROL)(
352 IN struct _DEVICE_OBJECT *DeviceObject,
353 IN struct _IRP *Irp,
354 IN PVOID MapRegisterBase,
355 IN PVOID Context);
356
357 typedef struct _WAIT_CONTEXT_BLOCK {
358 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
359 PDRIVER_CONTROL DeviceRoutine;
360 PVOID DeviceContext;
361 ULONG NumberOfMapRegisters;
362 PVOID DeviceObject;
363 PVOID CurrentIrp;
364 PKDPC BufferChainingDpc;
365 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
366
367 typedef struct _DEVICE_OBJECT {
368 CSHORT Type;
369 USHORT Size;
370 LONG ReferenceCount;
371 struct _DRIVER_OBJECT *DriverObject;
372 struct _DEVICE_OBJECT *NextDevice;
373 struct _DEVICE_OBJECT *AttachedDevice;
374 struct _IRP *CurrentIrp;
375 PIO_TIMER Timer;
376 ULONG Flags;
377 ULONG Characteristics;
378 volatile PVPB Vpb;
379 PVOID DeviceExtension;
380 DEVICE_TYPE DeviceType;
381 CCHAR StackSize;
382 union {
383 LIST_ENTRY ListEntry;
384 WAIT_CONTEXT_BLOCK Wcb;
385 } Queue;
386 ULONG AlignmentRequirement;
387 KDEVICE_QUEUE DeviceQueue;
388 KDPC Dpc;
389 ULONG ActiveThreadCount;
390 PSECURITY_DESCRIPTOR SecurityDescriptor;
391 KEVENT DeviceLock;
392 USHORT SectorSize;
393 USHORT Spare1;
394 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
395 PVOID Reserved;
396 } DEVICE_OBJECT, *PDEVICE_OBJECT;
397
398 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
399
400 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
401 BOOLEAN Removed;
402 BOOLEAN Reserved[3];
403 volatile LONG IoCount;
404 KEVENT RemoveEvent;
405 } IO_REMOVE_LOCK_COMMON_BLOCK;
406
407 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
408 LONG Signature;
409 LONG HighWatermark;
410 LONGLONG MaxLockedTicks;
411 LONG AllocateTag;
412 LIST_ENTRY LockList;
413 KSPIN_LOCK Spin;
414 volatile LONG LowMemoryCount;
415 ULONG Reserved1[4];
416 PVOID Reserved2;
417 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
418 } IO_REMOVE_LOCK_DBG_BLOCK;
419
420 typedef struct _IO_REMOVE_LOCK {
421 IO_REMOVE_LOCK_COMMON_BLOCK Common;
422 #if DBG
423 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
424 #endif
425 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
426
427 typedef struct _IO_WORKITEM *PIO_WORKITEM;
428
429 typedef VOID
430 (NTAPI IO_WORKITEM_ROUTINE)(
431 IN PDEVICE_OBJECT DeviceObject,
432 IN PVOID Context);
433 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
434
435 typedef struct _SHARE_ACCESS {
436 ULONG OpenCount;
437 ULONG Readers;
438 ULONG Writers;
439 ULONG Deleters;
440 ULONG SharedRead;
441 ULONG SharedWrite;
442 ULONG SharedDelete;
443 } SHARE_ACCESS, *PSHARE_ACCESS;
444
445 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
446 inheritance, even from a struct renders the type non-POD. So we use
447 this hack */
448 #define PCI_COMMON_HEADER_LAYOUT \
449 USHORT VendorID; \
450 USHORT DeviceID; \
451 USHORT Command; \
452 USHORT Status; \
453 UCHAR RevisionID; \
454 UCHAR ProgIf; \
455 UCHAR SubClass; \
456 UCHAR BaseClass; \
457 UCHAR CacheLineSize; \
458 UCHAR LatencyTimer; \
459 UCHAR HeaderType; \
460 UCHAR BIST; \
461 union { \
462 struct _PCI_HEADER_TYPE_0 { \
463 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
464 ULONG CIS; \
465 USHORT SubVendorID; \
466 USHORT SubSystemID; \
467 ULONG ROMBaseAddress; \
468 UCHAR CapabilitiesPtr; \
469 UCHAR Reserved1[3]; \
470 ULONG Reserved2; \
471 UCHAR InterruptLine; \
472 UCHAR InterruptPin; \
473 UCHAR MinimumGrant; \
474 UCHAR MaximumLatency; \
475 } type0; \
476 struct _PCI_HEADER_TYPE_1 { \
477 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
478 UCHAR PrimaryBus; \
479 UCHAR SecondaryBus; \
480 UCHAR SubordinateBus; \
481 UCHAR SecondaryLatency; \
482 UCHAR IOBase; \
483 UCHAR IOLimit; \
484 USHORT SecondaryStatus; \
485 USHORT MemoryBase; \
486 USHORT MemoryLimit; \
487 USHORT PrefetchBase; \
488 USHORT PrefetchLimit; \
489 ULONG PrefetchBaseUpper32; \
490 ULONG PrefetchLimitUpper32; \
491 USHORT IOBaseUpper16; \
492 USHORT IOLimitUpper16; \
493 UCHAR CapabilitiesPtr; \
494 UCHAR Reserved1[3]; \
495 ULONG ROMBaseAddress; \
496 UCHAR InterruptLine; \
497 UCHAR InterruptPin; \
498 USHORT BridgeControl; \
499 } type1; \
500 struct _PCI_HEADER_TYPE_2 { \
501 ULONG SocketRegistersBaseAddress; \
502 UCHAR CapabilitiesPtr; \
503 UCHAR Reserved; \
504 USHORT SecondaryStatus; \
505 UCHAR PrimaryBus; \
506 UCHAR SecondaryBus; \
507 UCHAR SubordinateBus; \
508 UCHAR SecondaryLatency; \
509 struct { \
510 ULONG Base; \
511 ULONG Limit; \
512 } Range[PCI_TYPE2_ADDRESSES-1]; \
513 UCHAR InterruptLine; \
514 UCHAR InterruptPin; \
515 USHORT BridgeControl; \
516 } type2; \
517 } u;
518
519 typedef struct _PCI_CAPABILITIES_HEADER {
520 UCHAR CapabilityID;
521 UCHAR Next;
522 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
523
524 typedef struct _PCI_COMMON_HEADER {
525 PCI_COMMON_HEADER_LAYOUT
526 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
527
528 #ifdef __cplusplus
529 typedef struct _PCI_COMMON_CONFIG {
530 PCI_COMMON_HEADER_LAYOUT
531 UCHAR DeviceSpecific[192];
532 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
533 #else
534 typedef struct _PCI_COMMON_CONFIG {
535 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
536 UCHAR DeviceSpecific[192];
537 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
538 #endif
539
540 typedef enum _CREATE_FILE_TYPE {
541 CreateFileTypeNone,
542 CreateFileTypeNamedPipe,
543 CreateFileTypeMailslot
544 } CREATE_FILE_TYPE;
545
546 #define IO_FORCE_ACCESS_CHECK 0x001
547 #define IO_NO_PARAMETER_CHECKING 0x100
548
549 #define IO_REPARSE 0x0
550 #define IO_REMOUNT 0x1
551
552 typedef struct _IO_STATUS_BLOCK {
553 _ANONYMOUS_UNION union {
554 NTSTATUS Status;
555 PVOID Pointer;
556 } DUMMYUNIONNAME;
557 ULONG_PTR Information;
558 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
559
560 #if defined(_WIN64)
561 typedef struct _IO_STATUS_BLOCK32 {
562 NTSTATUS Status;
563 ULONG Information;
564 } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
565 #endif
566
567 typedef struct _PCI_SLOT_NUMBER {
568 union {
569 struct {
570 ULONG DeviceNumber:5;
571 ULONG FunctionNumber:3;
572 ULONG Reserved:24;
573 } bits;
574 ULONG AsULONG;
575 } u;
576 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
577
578 typedef VOID
579 (NTAPI *PIO_APC_ROUTINE)(
580 IN PVOID ApcContext,
581 IN PIO_STATUS_BLOCK IoStatusBlock,
582 IN ULONG Reserved);
583
584 #define PIO_APC_ROUTINE_DEFINED
585
586 typedef enum _IO_SESSION_EVENT {
587 IoSessionEventIgnore = 0,
588 IoSessionEventCreated,
589 IoSessionEventTerminated,
590 IoSessionEventConnected,
591 IoSessionEventDisconnected,
592 IoSessionEventLogon,
593 IoSessionEventLogoff,
594 IoSessionEventMax
595 } IO_SESSION_EVENT, *PIO_SESSION_EVENT;
596
597 typedef enum _IO_SESSION_STATE {
598 IoSessionStateCreated = 1,
599 IoSessionStateInitialized,
600 IoSessionStateConnected,
601 IoSessionStateDisconnected,
602 IoSessionStateDisconnectedLoggedOn,
603 IoSessionStateLoggedOn,
604 IoSessionStateLoggedOff,
605 IoSessionStateTerminated,
606 IoSessionStateMax
607 } IO_SESSION_STATE, *PIO_SESSION_STATE;
608
609 #define IO_SESSION_STATE_ALL_EVENTS 0xffffffff
610 #define IO_SESSION_STATE_CREATION_EVENT 0x00000001
611 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
612 #define IO_SESSION_STATE_CONNECT_EVENT 0x00000004
613 #define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008
614 #define IO_SESSION_STATE_LOGON_EVENT 0x00000010
615 #define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020
616
617 #define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f
618
619 #define IO_SESSION_MAX_PAYLOAD_SIZE 256L
620
621 typedef struct _IO_SESSION_CONNECT_INFO {
622 ULONG SessionId;
623 BOOLEAN LocalSession;
624 } IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO;
625
626 typedef VOID
627 (NTAPI *WMI_NOTIFICATION_CALLBACK)(
628 PVOID Wnode,
629 PVOID Context);
630
631 #define EVENT_INCREMENT 1
632 #define IO_NO_INCREMENT 0
633 #define IO_CD_ROM_INCREMENT 1
634 #define IO_DISK_INCREMENT 1
635 #define IO_KEYBOARD_INCREMENT 6
636 #define IO_MAILSLOT_INCREMENT 2
637 #define IO_MOUSE_INCREMENT 6
638 #define IO_NAMED_PIPE_INCREMENT 2
639 #define IO_NETWORK_INCREMENT 2
640 #define IO_PARALLEL_INCREMENT 1
641 #define IO_SERIAL_INCREMENT 2
642 #define IO_SOUND_INCREMENT 8
643 #define IO_VIDEO_INCREMENT 1
644 #define SEMAPHORE_INCREMENT 1
645
646 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
647
648 typedef struct _BOOTDISK_INFORMATION {
649 LONGLONG BootPartitionOffset;
650 LONGLONG SystemPartitionOffset;
651 ULONG BootDeviceSignature;
652 ULONG SystemDeviceSignature;
653 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
654
655 typedef struct _BOOTDISK_INFORMATION_EX {
656 LONGLONG BootPartitionOffset;
657 LONGLONG SystemPartitionOffset;
658 ULONG BootDeviceSignature;
659 ULONG SystemDeviceSignature;
660 GUID BootDeviceGuid;
661 GUID SystemDeviceGuid;
662 BOOLEAN BootDeviceIsGpt;
663 BOOLEAN SystemDeviceIsGpt;
664 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
665
666 #include <pshpack1.h>
667
668 typedef struct _EISA_MEMORY_TYPE {
669 UCHAR ReadWrite:1;
670 UCHAR Cached:1;
671 UCHAR Reserved0:1;
672 UCHAR Type:2;
673 UCHAR Shared:1;
674 UCHAR Reserved1:1;
675 UCHAR MoreEntries:1;
676 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
677
678 typedef struct _EISA_MEMORY_CONFIGURATION {
679 EISA_MEMORY_TYPE ConfigurationByte;
680 UCHAR DataSize;
681 USHORT AddressLowWord;
682 UCHAR AddressHighByte;
683 USHORT MemorySize;
684 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
685
686 typedef struct _EISA_IRQ_DESCRIPTOR {
687 UCHAR Interrupt:4;
688 UCHAR Reserved:1;
689 UCHAR LevelTriggered:1;
690 UCHAR Shared:1;
691 UCHAR MoreEntries:1;
692 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
693
694 typedef struct _EISA_IRQ_CONFIGURATION {
695 EISA_IRQ_DESCRIPTOR ConfigurationByte;
696 UCHAR Reserved;
697 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
698
699 typedef struct _DMA_CONFIGURATION_BYTE0 {
700 UCHAR Channel:3;
701 UCHAR Reserved:3;
702 UCHAR Shared:1;
703 UCHAR MoreEntries:1;
704 } DMA_CONFIGURATION_BYTE0;
705
706 typedef struct _DMA_CONFIGURATION_BYTE1 {
707 UCHAR Reserved0:2;
708 UCHAR TransferSize:2;
709 UCHAR Timing:2;
710 UCHAR Reserved1:2;
711 } DMA_CONFIGURATION_BYTE1;
712
713 typedef struct _EISA_DMA_CONFIGURATION {
714 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
715 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
716 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
717
718 typedef struct _EISA_PORT_DESCRIPTOR {
719 UCHAR NumberPorts:5;
720 UCHAR Reserved:1;
721 UCHAR Shared:1;
722 UCHAR MoreEntries:1;
723 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
724
725 typedef struct _EISA_PORT_CONFIGURATION {
726 EISA_PORT_DESCRIPTOR Configuration;
727 USHORT PortAddress;
728 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
729
730 typedef struct _CM_EISA_SLOT_INFORMATION {
731 UCHAR ReturnCode;
732 UCHAR ReturnFlags;
733 UCHAR MajorRevision;
734 UCHAR MinorRevision;
735 USHORT Checksum;
736 UCHAR NumberFunctions;
737 UCHAR FunctionInformation;
738 ULONG CompressedId;
739 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
740
741 typedef struct _CM_EISA_FUNCTION_INFORMATION {
742 ULONG CompressedId;
743 UCHAR IdSlotFlags1;
744 UCHAR IdSlotFlags2;
745 UCHAR MinorRevision;
746 UCHAR MajorRevision;
747 UCHAR Selections[26];
748 UCHAR FunctionFlags;
749 UCHAR TypeString[80];
750 EISA_MEMORY_CONFIGURATION EisaMemory[9];
751 EISA_IRQ_CONFIGURATION EisaIrq[7];
752 EISA_DMA_CONFIGURATION EisaDma[4];
753 EISA_PORT_CONFIGURATION EisaPort[20];
754 UCHAR InitializationData[60];
755 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
756
757 #include <poppack.h>
758
759 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
760
761 #define EISA_FUNCTION_ENABLED 0x80
762 #define EISA_FREE_FORM_DATA 0x40
763 #define EISA_HAS_PORT_INIT_ENTRY 0x20
764 #define EISA_HAS_PORT_RANGE 0x10
765 #define EISA_HAS_DMA_ENTRY 0x08
766 #define EISA_HAS_IRQ_ENTRY 0x04
767 #define EISA_HAS_MEMORY_ENTRY 0x02
768 #define EISA_HAS_TYPE_ENTRY 0x01
769 #define EISA_HAS_INFORMATION \
770 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
771 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
772
773 #define EISA_MORE_ENTRIES 0x80
774 #define EISA_SYSTEM_MEMORY 0x00
775 #define EISA_MEMORY_TYPE_RAM 0x01
776
777 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
778
779 #define EISA_INVALID_SLOT 0x80
780 #define EISA_INVALID_FUNCTION 0x81
781 #define EISA_INVALID_CONFIGURATION 0x82
782 #define EISA_EMPTY_SLOT 0x83
783 #define EISA_INVALID_BIOS_CALL 0x86
784
785 /*
786 ** Plug and Play structures
787 */
788
789 typedef VOID
790 (NTAPI *PINTERFACE_REFERENCE)(
791 PVOID Context);
792
793 typedef VOID
794 (NTAPI *PINTERFACE_DEREFERENCE)(
795 PVOID Context);
796
797 typedef BOOLEAN
798 (NTAPI *PTRANSLATE_BUS_ADDRESS)(
799 IN PVOID Context,
800 IN PHYSICAL_ADDRESS BusAddress,
801 IN ULONG Length,
802 IN OUT PULONG AddressSpace,
803 OUT PPHYSICAL_ADDRESS TranslatedAddress);
804
805 typedef struct _DMA_ADAPTER*
806 (NTAPI *PGET_DMA_ADAPTER)(
807 IN PVOID Context,
808 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
809 OUT PULONG NumberOfMapRegisters);
810
811 typedef ULONG
812 (NTAPI *PGET_SET_DEVICE_DATA)(
813 IN PVOID Context,
814 IN ULONG DataType,
815 IN PVOID Buffer,
816 IN ULONG Offset,
817 IN ULONG Length);
818
819 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
820 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
821 #define PCI_USE_REVISION 0x00000002
822 #define PCI_USE_VENDEV_IDS 0x00000004
823 #define PCI_USE_CLASS_SUBCLASS 0x00000008
824 #define PCI_USE_PROGIF 0x00000010
825 #define PCI_USE_LOCAL_BUS 0x00000020
826 #define PCI_USE_LOCAL_DEVICE 0x00000040
827
828 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
829 ULONG Size;
830 ULONG Flags;
831 USHORT VendorID;
832 USHORT DeviceID;
833 UCHAR RevisionID;
834 USHORT SubVendorID;
835 USHORT SubSystemID;
836 UCHAR BaseClass;
837 UCHAR SubClass;
838 UCHAR ProgIf;
839 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
840
841 typedef BOOLEAN
842 (NTAPI *PPCI_IS_DEVICE_PRESENT)(
843 IN USHORT VendorID,
844 IN USHORT DeviceID,
845 IN UCHAR RevisionID,
846 IN USHORT SubVendorID,
847 IN USHORT SubSystemID,
848 IN ULONG Flags);
849
850 typedef BOOLEAN
851 (NTAPI *PPCI_IS_DEVICE_PRESENT_EX)(
852 IN PVOID Context,
853 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
854
855 typedef struct _BUS_INTERFACE_STANDARD {
856 USHORT Size;
857 USHORT Version;
858 PVOID Context;
859 PINTERFACE_REFERENCE InterfaceReference;
860 PINTERFACE_DEREFERENCE InterfaceDereference;
861 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
862 PGET_DMA_ADAPTER GetDmaAdapter;
863 PGET_SET_DEVICE_DATA SetBusData;
864 PGET_SET_DEVICE_DATA GetBusData;
865 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
866
867 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
868 USHORT Size;
869 USHORT Version;
870 PVOID Context;
871 PINTERFACE_REFERENCE InterfaceReference;
872 PINTERFACE_DEREFERENCE InterfaceDereference;
873 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
874 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
875 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
876
877 typedef struct _DEVICE_CAPABILITIES {
878 USHORT Size;
879 USHORT Version;
880 ULONG DeviceD1:1;
881 ULONG DeviceD2:1;
882 ULONG LockSupported:1;
883 ULONG EjectSupported:1;
884 ULONG Removable:1;
885 ULONG DockDevice:1;
886 ULONG UniqueID:1;
887 ULONG SilentInstall:1;
888 ULONG RawDeviceOK:1;
889 ULONG SurpriseRemovalOK:1;
890 ULONG WakeFromD0:1;
891 ULONG WakeFromD1:1;
892 ULONG WakeFromD2:1;
893 ULONG WakeFromD3:1;
894 ULONG HardwareDisabled:1;
895 ULONG NonDynamic:1;
896 ULONG WarmEjectSupported:1;
897 ULONG NoDisplayInUI:1;
898 ULONG Reserved:14;
899 ULONG Address;
900 ULONG UINumber;
901 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
902 SYSTEM_POWER_STATE SystemWake;
903 DEVICE_POWER_STATE DeviceWake;
904 ULONG D1Latency;
905 ULONG D2Latency;
906 ULONG D3Latency;
907 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
908
909 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
910 USHORT Version;
911 USHORT Size;
912 GUID Event;
913 GUID InterfaceClassGuid;
914 PUNICODE_STRING SymbolicLinkName;
915 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
916
917 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
918 USHORT Version;
919 USHORT Size;
920 GUID Event;
921 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
922
923 #undef INTERFACE
924
925 typedef struct _INTERFACE {
926 USHORT Size;
927 USHORT Version;
928 PVOID Context;
929 PINTERFACE_REFERENCE InterfaceReference;
930 PINTERFACE_DEREFERENCE InterfaceDereference;
931 } INTERFACE, *PINTERFACE;
932
933 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
934 USHORT Version;
935 USHORT Size;
936 GUID Event;
937 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
938
939 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
940
941 /* PNP_DEVICE_STATE */
942
943 #define PNP_DEVICE_DISABLED 0x00000001
944 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
945 #define PNP_DEVICE_FAILED 0x00000004
946 #define PNP_DEVICE_REMOVED 0x00000008
947 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
948 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
949
950 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
951 USHORT Version;
952 USHORT Size;
953 GUID Event;
954 struct _FILE_OBJECT *FileObject;
955 LONG NameBufferOffset;
956 UCHAR CustomDataBuffer[1];
957 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
958
959 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
960 USHORT Version;
961 USHORT Size;
962 GUID Event;
963 struct _FILE_OBJECT *FileObject;
964 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
965
966 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
967 DeviceUsageTypeUndefined,
968 DeviceUsageTypePaging,
969 DeviceUsageTypeHibernation,
970 DeviceUsageTypeDumpFile
971 } DEVICE_USAGE_NOTIFICATION_TYPE;
972
973 typedef struct _POWER_SEQUENCE {
974 ULONG SequenceD1;
975 ULONG SequenceD2;
976 ULONG SequenceD3;
977 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
978
979 typedef enum {
980 DevicePropertyDeviceDescription = 0x0,
981 DevicePropertyHardwareID = 0x1,
982 DevicePropertyCompatibleIDs = 0x2,
983 DevicePropertyBootConfiguration = 0x3,
984 DevicePropertyBootConfigurationTranslated = 0x4,
985 DevicePropertyClassName = 0x5,
986 DevicePropertyClassGuid = 0x6,
987 DevicePropertyDriverKeyName = 0x7,
988 DevicePropertyManufacturer = 0x8,
989 DevicePropertyFriendlyName = 0x9,
990 DevicePropertyLocationInformation = 0xa,
991 DevicePropertyPhysicalDeviceObjectName = 0xb,
992 DevicePropertyBusTypeGuid = 0xc,
993 DevicePropertyLegacyBusType = 0xd,
994 DevicePropertyBusNumber = 0xe,
995 DevicePropertyEnumeratorName = 0xf,
996 DevicePropertyAddress = 0x10,
997 DevicePropertyUINumber = 0x11,
998 DevicePropertyInstallState = 0x12,
999 DevicePropertyRemovalPolicy = 0x13,
1000 DevicePropertyResourceRequirements = 0x14,
1001 DevicePropertyAllocatedResources = 0x15,
1002 DevicePropertyContainerID = 0x16
1003 } DEVICE_REGISTRY_PROPERTY;
1004
1005 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
1006 EventCategoryReserved,
1007 EventCategoryHardwareProfileChange,
1008 EventCategoryDeviceInterfaceChange,
1009 EventCategoryTargetDeviceChange
1010 } IO_NOTIFICATION_EVENT_CATEGORY;
1011
1012 typedef enum _IO_PRIORITY_HINT {
1013 IoPriorityVeryLow = 0,
1014 IoPriorityLow,
1015 IoPriorityNormal,
1016 IoPriorityHigh,
1017 IoPriorityCritical,
1018 MaxIoPriorityTypes
1019 } IO_PRIORITY_HINT;
1020
1021 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
1022
1023 typedef NTSTATUS
1024 (NTAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
1025 IN PVOID NotificationStructure,
1026 IN PVOID Context);
1027
1028 typedef VOID
1029 (NTAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
1030 IN PVOID Context);
1031
1032 typedef enum _FILE_INFORMATION_CLASS {
1033 FileDirectoryInformation = 1,
1034 FileFullDirectoryInformation,
1035 FileBothDirectoryInformation,
1036 FileBasicInformation,
1037 FileStandardInformation,
1038 FileInternalInformation,
1039 FileEaInformation,
1040 FileAccessInformation,
1041 FileNameInformation,
1042 FileRenameInformation,
1043 FileLinkInformation,
1044 FileNamesInformation,
1045 FileDispositionInformation,
1046 FilePositionInformation,
1047 FileFullEaInformation,
1048 FileModeInformation,
1049 FileAlignmentInformation,
1050 FileAllInformation,
1051 FileAllocationInformation,
1052 FileEndOfFileInformation,
1053 FileAlternateNameInformation,
1054 FileStreamInformation,
1055 FilePipeInformation,
1056 FilePipeLocalInformation,
1057 FilePipeRemoteInformation,
1058 FileMailslotQueryInformation,
1059 FileMailslotSetInformation,
1060 FileCompressionInformation,
1061 FileObjectIdInformation,
1062 FileCompletionInformation,
1063 FileMoveClusterInformation,
1064 FileQuotaInformation,
1065 FileReparsePointInformation,
1066 FileNetworkOpenInformation,
1067 FileAttributeTagInformation,
1068 FileTrackingInformation,
1069 FileIdBothDirectoryInformation,
1070 FileIdFullDirectoryInformation,
1071 FileValidDataLengthInformation,
1072 FileShortNameInformation,
1073 FileIoCompletionNotificationInformation,
1074 FileIoStatusBlockRangeInformation,
1075 FileIoPriorityHintInformation,
1076 FileSfioReserveInformation,
1077 FileSfioVolumeInformation,
1078 FileHardLinkInformation,
1079 FileProcessIdsUsingFileInformation,
1080 FileNormalizedNameInformation,
1081 FileNetworkPhysicalNameInformation,
1082 FileIdGlobalTxDirectoryInformation,
1083 FileIsRemoteDeviceInformation,
1084 FileAttributeCacheInformation,
1085 FileNumaNodeInformation,
1086 FileStandardLinkInformation,
1087 FileRemoteProtocolInformation,
1088 FileMaximumInformation
1089 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
1090
1091 typedef struct _FILE_POSITION_INFORMATION {
1092 LARGE_INTEGER CurrentByteOffset;
1093 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
1094
1095 typedef struct _FILE_BASIC_INFORMATION {
1096 LARGE_INTEGER CreationTime;
1097 LARGE_INTEGER LastAccessTime;
1098 LARGE_INTEGER LastWriteTime;
1099 LARGE_INTEGER ChangeTime;
1100 ULONG FileAttributes;
1101 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
1102
1103 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
1104 IO_PRIORITY_HINT PriorityHint;
1105 } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
1106
1107 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
1108 ULONG Flags;
1109 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
1110
1111 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
1112 PUCHAR IoStatusBlockRange;
1113 ULONG Length;
1114 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
1115
1116 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION {
1117 BOOLEAN IsRemote;
1118 } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
1119
1120 typedef struct _FILE_NUMA_NODE_INFORMATION {
1121 USHORT NodeNumber;
1122 } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
1123
1124 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
1125 ULONG NumberOfProcessIdsInList;
1126 ULONG_PTR ProcessIdList[1];
1127 } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
1128
1129 typedef struct _FILE_STANDARD_INFORMATION {
1130 LARGE_INTEGER AllocationSize;
1131 LARGE_INTEGER EndOfFile;
1132 ULONG NumberOfLinks;
1133 BOOLEAN DeletePending;
1134 BOOLEAN Directory;
1135 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
1136
1137 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
1138 LARGE_INTEGER CreationTime;
1139 LARGE_INTEGER LastAccessTime;
1140 LARGE_INTEGER LastWriteTime;
1141 LARGE_INTEGER ChangeTime;
1142 LARGE_INTEGER AllocationSize;
1143 LARGE_INTEGER EndOfFile;
1144 ULONG FileAttributes;
1145 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
1146
1147 typedef enum _FSINFOCLASS {
1148 FileFsVolumeInformation = 1,
1149 FileFsLabelInformation,
1150 FileFsSizeInformation,
1151 FileFsDeviceInformation,
1152 FileFsAttributeInformation,
1153 FileFsControlInformation,
1154 FileFsFullSizeInformation,
1155 FileFsObjectIdInformation,
1156 FileFsDriverPathInformation,
1157 FileFsVolumeFlagsInformation,
1158 FileFsMaximumInformation
1159 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
1160
1161 typedef struct _FILE_FS_DEVICE_INFORMATION {
1162 DEVICE_TYPE DeviceType;
1163 ULONG Characteristics;
1164 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
1165
1166 typedef struct _FILE_FULL_EA_INFORMATION {
1167 ULONG NextEntryOffset;
1168 UCHAR Flags;
1169 UCHAR EaNameLength;
1170 USHORT EaValueLength;
1171 CHAR EaName[1];
1172 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
1173
1174 typedef struct _FILE_SFIO_RESERVE_INFORMATION {
1175 ULONG RequestsPerPeriod;
1176 ULONG Period;
1177 BOOLEAN RetryFailures;
1178 BOOLEAN Discardable;
1179 ULONG RequestSize;
1180 ULONG NumOutstandingRequests;
1181 } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
1182
1183 typedef struct _FILE_SFIO_VOLUME_INFORMATION {
1184 ULONG MaximumRequestsPerPeriod;
1185 ULONG MinimumPeriod;
1186 ULONG MinimumTransferSize;
1187 } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
1188
1189 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1
1190 #define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2
1191 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4
1192
1193 #define FM_LOCK_BIT (0x1)
1194 #define FM_LOCK_BIT_V (0x0)
1195 #define FM_LOCK_WAITER_WOKEN (0x2)
1196 #define FM_LOCK_WAITER_INC (0x4)
1197
1198 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
1199
1200 typedef struct _OWNER_ENTRY {
1201 ERESOURCE_THREAD OwnerThread;
1202 _ANONYMOUS_UNION union {
1203 LONG OwnerCount;
1204 ULONG TableSize;
1205 } DUMMYUNIONNAME;
1206 } OWNER_ENTRY, *POWNER_ENTRY;
1207
1208 typedef struct _ERESOURCE {
1209 LIST_ENTRY SystemResourcesList;
1210 POWNER_ENTRY OwnerTable;
1211 SHORT ActiveCount;
1212 USHORT Flag;
1213 volatile PKSEMAPHORE SharedWaiters;
1214 volatile PKEVENT ExclusiveWaiters;
1215 OWNER_ENTRY OwnerEntry;
1216 ULONG ActiveEntries;
1217 ULONG ContentionCount;
1218 ULONG NumberOfSharedWaiters;
1219 ULONG NumberOfExclusiveWaiters;
1220 __GNU_EXTENSION union {
1221 PVOID Address;
1222 ULONG_PTR CreatorBackTraceIndex;
1223 };
1224 KSPIN_LOCK SpinLock;
1225 } ERESOURCE, *PERESOURCE;
1226
1227 /* ERESOURCE.Flag */
1228 #define ResourceNeverExclusive 0x0010
1229 #define ResourceReleaseByOtherThread 0x0020
1230 #define ResourceOwnedExclusive 0x0080
1231
1232 #define RESOURCE_HASH_TABLE_SIZE 64
1233
1234 typedef BOOLEAN
1235 (NTAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
1236 IN struct _FILE_OBJECT *FileObject,
1237 IN PLARGE_INTEGER FileOffset,
1238 IN ULONG Length,
1239 IN BOOLEAN Wait,
1240 IN ULONG LockKey,
1241 IN BOOLEAN CheckForReadOperation,
1242 OUT PIO_STATUS_BLOCK IoStatus,
1243 IN struct _DEVICE_OBJECT *DeviceObject);
1244
1245 typedef BOOLEAN
1246 (NTAPI *PFAST_IO_READ)(
1247 IN struct _FILE_OBJECT *FileObject,
1248 IN PLARGE_INTEGER FileOffset,
1249 IN ULONG Length,
1250 IN BOOLEAN Wait,
1251 IN ULONG LockKey,
1252 OUT PVOID Buffer,
1253 OUT PIO_STATUS_BLOCK IoStatus,
1254 IN struct _DEVICE_OBJECT *DeviceObject);
1255
1256 typedef BOOLEAN
1257 (NTAPI *PFAST_IO_WRITE)(
1258 IN struct _FILE_OBJECT *FileObject,
1259 IN PLARGE_INTEGER FileOffset,
1260 IN ULONG Length,
1261 IN BOOLEAN Wait,
1262 IN ULONG LockKey,
1263 IN PVOID Buffer,
1264 OUT PIO_STATUS_BLOCK IoStatus,
1265 IN struct _DEVICE_OBJECT *DeviceObject);
1266
1267 typedef BOOLEAN
1268 (NTAPI *PFAST_IO_QUERY_BASIC_INFO)(
1269 IN struct _FILE_OBJECT *FileObject,
1270 IN BOOLEAN Wait,
1271 OUT PFILE_BASIC_INFORMATION Buffer,
1272 OUT PIO_STATUS_BLOCK IoStatus,
1273 IN struct _DEVICE_OBJECT *DeviceObject);
1274
1275 typedef BOOLEAN
1276 (NTAPI *PFAST_IO_QUERY_STANDARD_INFO)(
1277 IN struct _FILE_OBJECT *FileObject,
1278 IN BOOLEAN Wait,
1279 OUT PFILE_STANDARD_INFORMATION Buffer,
1280 OUT PIO_STATUS_BLOCK IoStatus,
1281 IN struct _DEVICE_OBJECT *DeviceObject);
1282
1283 typedef BOOLEAN
1284 (NTAPI *PFAST_IO_LOCK)(
1285 IN struct _FILE_OBJECT *FileObject,
1286 IN PLARGE_INTEGER FileOffset,
1287 IN PLARGE_INTEGER Length,
1288 PEPROCESS ProcessId,
1289 ULONG Key,
1290 BOOLEAN FailImmediately,
1291 BOOLEAN ExclusiveLock,
1292 OUT PIO_STATUS_BLOCK IoStatus,
1293 IN struct _DEVICE_OBJECT *DeviceObject);
1294
1295 typedef BOOLEAN
1296 (NTAPI *PFAST_IO_UNLOCK_SINGLE)(
1297 IN struct _FILE_OBJECT *FileObject,
1298 IN PLARGE_INTEGER FileOffset,
1299 IN PLARGE_INTEGER Length,
1300 PEPROCESS ProcessId,
1301 ULONG Key,
1302 OUT PIO_STATUS_BLOCK IoStatus,
1303 IN struct _DEVICE_OBJECT *DeviceObject);
1304
1305 typedef BOOLEAN
1306 (NTAPI *PFAST_IO_UNLOCK_ALL)(
1307 IN struct _FILE_OBJECT *FileObject,
1308 PEPROCESS ProcessId,
1309 OUT PIO_STATUS_BLOCK IoStatus,
1310 IN struct _DEVICE_OBJECT *DeviceObject);
1311
1312 typedef BOOLEAN
1313 (NTAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
1314 IN struct _FILE_OBJECT *FileObject,
1315 PVOID ProcessId,
1316 ULONG Key,
1317 OUT PIO_STATUS_BLOCK IoStatus,
1318 IN struct _DEVICE_OBJECT *DeviceObject);
1319
1320 typedef BOOLEAN
1321 (NTAPI *PFAST_IO_DEVICE_CONTROL)(
1322 IN struct _FILE_OBJECT *FileObject,
1323 IN BOOLEAN Wait,
1324 IN PVOID InputBuffer OPTIONAL,
1325 IN ULONG InputBufferLength,
1326 OUT PVOID OutputBuffer OPTIONAL,
1327 IN ULONG OutputBufferLength,
1328 IN ULONG IoControlCode,
1329 OUT PIO_STATUS_BLOCK IoStatus,
1330 IN struct _DEVICE_OBJECT *DeviceObject);
1331
1332 typedef VOID
1333 (NTAPI *PFAST_IO_ACQUIRE_FILE)(
1334 IN struct _FILE_OBJECT *FileObject);
1335
1336 typedef VOID
1337 (NTAPI *PFAST_IO_RELEASE_FILE)(
1338 IN struct _FILE_OBJECT *FileObject);
1339
1340 typedef VOID
1341 (NTAPI *PFAST_IO_DETACH_DEVICE)(
1342 IN struct _DEVICE_OBJECT *SourceDevice,
1343 IN struct _DEVICE_OBJECT *TargetDevice);
1344
1345 typedef BOOLEAN
1346 (NTAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
1347 IN struct _FILE_OBJECT *FileObject,
1348 IN BOOLEAN Wait,
1349 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
1350 OUT struct _IO_STATUS_BLOCK *IoStatus,
1351 IN struct _DEVICE_OBJECT *DeviceObject);
1352
1353 typedef NTSTATUS
1354 (NTAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
1355 IN struct _FILE_OBJECT *FileObject,
1356 IN PLARGE_INTEGER EndingOffset,
1357 OUT struct _ERESOURCE **ResourceToRelease,
1358 IN struct _DEVICE_OBJECT *DeviceObject);
1359
1360 typedef BOOLEAN
1361 (NTAPI *PFAST_IO_MDL_READ)(
1362 IN struct _FILE_OBJECT *FileObject,
1363 IN PLARGE_INTEGER FileOffset,
1364 IN ULONG Length,
1365 IN ULONG LockKey,
1366 OUT PMDL *MdlChain,
1367 OUT PIO_STATUS_BLOCK IoStatus,
1368 IN struct _DEVICE_OBJECT *DeviceObject);
1369
1370 typedef BOOLEAN
1371 (NTAPI *PFAST_IO_MDL_READ_COMPLETE)(
1372 IN struct _FILE_OBJECT *FileObject,
1373 IN PMDL MdlChain,
1374 IN struct _DEVICE_OBJECT *DeviceObject);
1375
1376 typedef BOOLEAN
1377 (NTAPI *PFAST_IO_PREPARE_MDL_WRITE)(
1378 IN struct _FILE_OBJECT *FileObject,
1379 IN PLARGE_INTEGER FileOffset,
1380 IN ULONG Length,
1381 IN ULONG LockKey,
1382 OUT PMDL *MdlChain,
1383 OUT PIO_STATUS_BLOCK IoStatus,
1384 IN struct _DEVICE_OBJECT *DeviceObject);
1385
1386 typedef BOOLEAN
1387 (NTAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
1388 IN struct _FILE_OBJECT *FileObject,
1389 IN PLARGE_INTEGER FileOffset,
1390 IN PMDL MdlChain,
1391 IN struct _DEVICE_OBJECT *DeviceObject);
1392
1393 typedef BOOLEAN
1394 (NTAPI *PFAST_IO_READ_COMPRESSED)(
1395 IN struct _FILE_OBJECT *FileObject,
1396 IN PLARGE_INTEGER FileOffset,
1397 IN ULONG Length,
1398 IN ULONG LockKey,
1399 OUT PVOID Buffer,
1400 OUT PMDL *MdlChain,
1401 OUT PIO_STATUS_BLOCK IoStatus,
1402 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
1403 IN ULONG CompressedDataInfoLength,
1404 IN struct _DEVICE_OBJECT *DeviceObject);
1405
1406 typedef BOOLEAN
1407 (NTAPI *PFAST_IO_WRITE_COMPRESSED)(
1408 IN struct _FILE_OBJECT *FileObject,
1409 IN PLARGE_INTEGER FileOffset,
1410 IN ULONG Length,
1411 IN ULONG LockKey,
1412 IN PVOID Buffer,
1413 OUT PMDL *MdlChain,
1414 OUT PIO_STATUS_BLOCK IoStatus,
1415 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
1416 IN ULONG CompressedDataInfoLength,
1417 IN struct _DEVICE_OBJECT *DeviceObject);
1418
1419 typedef BOOLEAN
1420 (NTAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
1421 IN struct _FILE_OBJECT *FileObject,
1422 IN PMDL MdlChain,
1423 IN struct _DEVICE_OBJECT *DeviceObject);
1424
1425 typedef BOOLEAN
1426 (NTAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
1427 IN struct _FILE_OBJECT *FileObject,
1428 IN PLARGE_INTEGER FileOffset,
1429 IN PMDL MdlChain,
1430 IN struct _DEVICE_OBJECT *DeviceObject);
1431
1432 typedef BOOLEAN
1433 (NTAPI *PFAST_IO_QUERY_OPEN)(
1434 IN struct _IRP *Irp,
1435 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
1436 IN struct _DEVICE_OBJECT *DeviceObject);
1437
1438 typedef NTSTATUS
1439 (NTAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
1440 IN struct _FILE_OBJECT *FileObject,
1441 IN struct _ERESOURCE *ResourceToRelease,
1442 IN struct _DEVICE_OBJECT *DeviceObject);
1443
1444 typedef NTSTATUS
1445 (NTAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
1446 IN struct _FILE_OBJECT *FileObject,
1447 IN struct _DEVICE_OBJECT *DeviceObject);
1448
1449 typedef NTSTATUS
1450 (NTAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
1451 IN struct _FILE_OBJECT *FileObject,
1452 IN struct _DEVICE_OBJECT *DeviceObject);
1453
1454 typedef struct _FAST_IO_DISPATCH {
1455 ULONG SizeOfFastIoDispatch;
1456 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
1457 PFAST_IO_READ FastIoRead;
1458 PFAST_IO_WRITE FastIoWrite;
1459 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
1460 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
1461 PFAST_IO_LOCK FastIoLock;
1462 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
1463 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
1464 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
1465 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
1466 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
1467 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
1468 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
1469 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
1470 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
1471 PFAST_IO_MDL_READ MdlRead;
1472 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
1473 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
1474 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
1475 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
1476 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
1477 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
1478 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
1479 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
1480 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
1481 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
1482 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
1483 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
1484
1485 typedef struct _SECTION_OBJECT_POINTERS {
1486 PVOID DataSectionObject;
1487 PVOID SharedCacheMap;
1488 PVOID ImageSectionObject;
1489 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
1490
1491 typedef struct _IO_COMPLETION_CONTEXT {
1492 PVOID Port;
1493 PVOID Key;
1494 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
1495
1496 /* FILE_OBJECT.Flags */
1497 #define FO_FILE_OPEN 0x00000001
1498 #define FO_SYNCHRONOUS_IO 0x00000002
1499 #define FO_ALERTABLE_IO 0x00000004
1500 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
1501 #define FO_WRITE_THROUGH 0x00000010
1502 #define FO_SEQUENTIAL_ONLY 0x00000020
1503 #define FO_CACHE_SUPPORTED 0x00000040
1504 #define FO_NAMED_PIPE 0x00000080
1505 #define FO_STREAM_FILE 0x00000100
1506 #define FO_MAILSLOT 0x00000200
1507 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
1508 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
1509 #define FO_DIRECT_DEVICE_OPEN 0x00000800
1510 #define FO_FILE_MODIFIED 0x00001000
1511 #define FO_FILE_SIZE_CHANGED 0x00002000
1512 #define FO_CLEANUP_COMPLETE 0x00004000
1513 #define FO_TEMPORARY_FILE 0x00008000
1514 #define FO_DELETE_ON_CLOSE 0x00010000
1515 #define FO_OPENED_CASE_SENSITIVE 0x00020000
1516 #define FO_HANDLE_CREATED 0x00040000
1517 #define FO_FILE_FAST_IO_READ 0x00080000
1518 #define FO_RANDOM_ACCESS 0x00100000
1519 #define FO_FILE_OPEN_CANCELLED 0x00200000
1520 #define FO_VOLUME_OPEN 0x00400000
1521 #define FO_REMOTE_ORIGIN 0x01000000
1522 #define FO_DISALLOW_EXCLUSIVE 0x02000000
1523 #define FO_SKIP_COMPLETION_PORT 0x02000000
1524 #define FO_SKIP_SET_EVENT 0x04000000
1525 #define FO_SKIP_SET_FAST_IO 0x08000000
1526
1527 /* VPB.Flags */
1528 #define VPB_MOUNTED 0x0001
1529 #define VPB_LOCKED 0x0002
1530 #define VPB_PERSISTENT 0x0004
1531 #define VPB_REMOVE_PENDING 0x0008
1532 #define VPB_RAW_MOUNT 0x0010
1533 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
1534
1535 /* IRP.Flags */
1536
1537 #define SL_FORCE_ACCESS_CHECK 0x01
1538 #define SL_OPEN_PAGING_FILE 0x02
1539 #define SL_OPEN_TARGET_DIRECTORY 0x04
1540 #define SL_CASE_SENSITIVE 0x80
1541
1542 #define SL_KEY_SPECIFIED 0x01
1543 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
1544 #define SL_WRITE_THROUGH 0x04
1545 #define SL_FT_SEQUENTIAL_WRITE 0x08
1546
1547 #define SL_FAIL_IMMEDIATELY 0x01
1548 #define SL_EXCLUSIVE_LOCK 0x02
1549
1550 #define SL_RESTART_SCAN 0x01
1551 #define SL_RETURN_SINGLE_ENTRY 0x02
1552 #define SL_INDEX_SPECIFIED 0x04
1553
1554 #define SL_WATCH_TREE 0x01
1555
1556 #define SL_ALLOW_RAW_MOUNT 0x01
1557
1558 #define CTL_CODE(DeviceType, Function, Method, Access) \
1559 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
1560
1561 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
1562
1563 #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
1564
1565 #define IRP_NOCACHE 0x00000001
1566 #define IRP_PAGING_IO 0x00000002
1567 #define IRP_MOUNT_COMPLETION 0x00000002
1568 #define IRP_SYNCHRONOUS_API 0x00000004
1569 #define IRP_ASSOCIATED_IRP 0x00000008
1570 #define IRP_BUFFERED_IO 0x00000010
1571 #define IRP_DEALLOCATE_BUFFER 0x00000020
1572 #define IRP_INPUT_OPERATION 0x00000040
1573 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
1574 #define IRP_CREATE_OPERATION 0x00000080
1575 #define IRP_READ_OPERATION 0x00000100
1576 #define IRP_WRITE_OPERATION 0x00000200
1577 #define IRP_CLOSE_OPERATION 0x00000400
1578 #define IRP_DEFER_IO_COMPLETION 0x00000800
1579 #define IRP_OB_QUERY_NAME 0x00001000
1580 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
1581
1582 #define IRP_QUOTA_CHARGED 0x01
1583 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
1584 #define IRP_ALLOCATED_FIXED_SIZE 0x04
1585 #define IRP_LOOKASIDE_ALLOCATION 0x08
1586
1587 /*
1588 ** IRP function codes
1589 */
1590
1591 #define IRP_MJ_CREATE 0x00
1592 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
1593 #define IRP_MJ_CLOSE 0x02
1594 #define IRP_MJ_READ 0x03
1595 #define IRP_MJ_WRITE 0x04
1596 #define IRP_MJ_QUERY_INFORMATION 0x05
1597 #define IRP_MJ_SET_INFORMATION 0x06
1598 #define IRP_MJ_QUERY_EA 0x07
1599 #define IRP_MJ_SET_EA 0x08
1600 #define IRP_MJ_FLUSH_BUFFERS 0x09
1601 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
1602 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
1603 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
1604 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
1605 #define IRP_MJ_DEVICE_CONTROL 0x0e
1606 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
1607 #define IRP_MJ_SCSI 0x0f
1608 #define IRP_MJ_SHUTDOWN 0x10
1609 #define IRP_MJ_LOCK_CONTROL 0x11
1610 #define IRP_MJ_CLEANUP 0x12
1611 #define IRP_MJ_CREATE_MAILSLOT 0x13
1612 #define IRP_MJ_QUERY_SECURITY 0x14
1613 #define IRP_MJ_SET_SECURITY 0x15
1614 #define IRP_MJ_POWER 0x16
1615 #define IRP_MJ_SYSTEM_CONTROL 0x17
1616 #define IRP_MJ_DEVICE_CHANGE 0x18
1617 #define IRP_MJ_QUERY_QUOTA 0x19
1618 #define IRP_MJ_SET_QUOTA 0x1a
1619 #define IRP_MJ_PNP 0x1b
1620 #define IRP_MJ_PNP_POWER 0x1b
1621 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
1622
1623 #define IRP_MN_SCSI_CLASS 0x01
1624
1625 #define IRP_MN_START_DEVICE 0x00
1626 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
1627 #define IRP_MN_REMOVE_DEVICE 0x02
1628 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
1629 #define IRP_MN_STOP_DEVICE 0x04
1630 #define IRP_MN_QUERY_STOP_DEVICE 0x05
1631 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
1632
1633 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
1634 #define IRP_MN_QUERY_INTERFACE 0x08
1635 #define IRP_MN_QUERY_CAPABILITIES 0x09
1636 #define IRP_MN_QUERY_RESOURCES 0x0A
1637 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
1638 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
1639 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
1640
1641 #define IRP_MN_READ_CONFIG 0x0F
1642 #define IRP_MN_WRITE_CONFIG 0x10
1643 #define IRP_MN_EJECT 0x11
1644 #define IRP_MN_SET_LOCK 0x12
1645 #define IRP_MN_QUERY_ID 0x13
1646 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
1647 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
1648 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
1649 #define IRP_MN_SURPRISE_REMOVAL 0x17
1650
1651 #define IRP_MN_WAIT_WAKE 0x00
1652 #define IRP_MN_POWER_SEQUENCE 0x01
1653 #define IRP_MN_SET_POWER 0x02
1654 #define IRP_MN_QUERY_POWER 0x03
1655
1656 #define IRP_MN_QUERY_ALL_DATA 0x00
1657 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
1658 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
1659 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
1660 #define IRP_MN_ENABLE_EVENTS 0x04
1661 #define IRP_MN_DISABLE_EVENTS 0x05
1662 #define IRP_MN_ENABLE_COLLECTION 0x06
1663 #define IRP_MN_DISABLE_COLLECTION 0x07
1664 #define IRP_MN_REGINFO 0x08
1665 #define IRP_MN_EXECUTE_METHOD 0x09
1666
1667 #define IRP_MN_REGINFO_EX 0x0b
1668
1669 typedef struct _FILE_OBJECT {
1670 CSHORT Type;
1671 CSHORT Size;
1672 PDEVICE_OBJECT DeviceObject;
1673 PVPB Vpb;
1674 PVOID FsContext;
1675 PVOID FsContext2;
1676 PSECTION_OBJECT_POINTERS SectionObjectPointer;
1677 PVOID PrivateCacheMap;
1678 NTSTATUS FinalStatus;
1679 struct _FILE_OBJECT *RelatedFileObject;
1680 BOOLEAN LockOperation;
1681 BOOLEAN DeletePending;
1682 BOOLEAN ReadAccess;
1683 BOOLEAN WriteAccess;
1684 BOOLEAN DeleteAccess;
1685 BOOLEAN SharedRead;
1686 BOOLEAN SharedWrite;
1687 BOOLEAN SharedDelete;
1688 ULONG Flags;
1689 UNICODE_STRING FileName;
1690 LARGE_INTEGER CurrentByteOffset;
1691 volatile ULONG Waiters;
1692 volatile ULONG Busy;
1693 PVOID LastLock;
1694 KEVENT Lock;
1695 KEVENT Event;
1696 volatile PIO_COMPLETION_CONTEXT CompletionContext;
1697 KSPIN_LOCK IrpListLock;
1698 LIST_ENTRY IrpList;
1699 volatile PVOID FileObjectExtension;
1700 } FILE_OBJECT, *PFILE_OBJECT;
1701
1702 typedef struct _IO_ERROR_LOG_PACKET {
1703 UCHAR MajorFunctionCode;
1704 UCHAR RetryCount;
1705 USHORT DumpDataSize;
1706 USHORT NumberOfStrings;
1707 USHORT StringOffset;
1708 USHORT EventCategory;
1709 NTSTATUS ErrorCode;
1710 ULONG UniqueErrorValue;
1711 NTSTATUS FinalStatus;
1712 ULONG SequenceNumber;
1713 ULONG IoControlCode;
1714 LARGE_INTEGER DeviceOffset;
1715 ULONG DumpData[1];
1716 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
1717
1718 typedef struct _IO_ERROR_LOG_MESSAGE {
1719 USHORT Type;
1720 USHORT Size;
1721 USHORT DriverNameLength;
1722 LARGE_INTEGER TimeStamp;
1723 ULONG DriverNameOffset;
1724 IO_ERROR_LOG_PACKET EntryData;
1725 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
1726
1727 #define ERROR_LOG_LIMIT_SIZE 240
1728 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
1729 sizeof(IO_ERROR_LOG_PACKET) + \
1730 (sizeof(WCHAR) * 40))
1731 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
1732 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
1733 #define IO_ERROR_LOG_MESSAGE_LENGTH \
1734 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
1735 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
1736 PORT_MAXIMUM_MESSAGE_LENGTH)
1737 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
1738 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
1739
1740 #ifdef _WIN64
1741 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
1742 #else
1743 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
1744 #endif
1745
1746 typedef enum _DMA_WIDTH {
1747 Width8Bits,
1748 Width16Bits,
1749 Width32Bits,
1750 MaximumDmaWidth
1751 } DMA_WIDTH, *PDMA_WIDTH;
1752
1753 typedef enum _DMA_SPEED {
1754 Compatible,
1755 TypeA,
1756 TypeB,
1757 TypeC,
1758 TypeF,
1759 MaximumDmaSpeed
1760 } DMA_SPEED, *PDMA_SPEED;
1761
1762 /* DEVICE_DESCRIPTION.Version */
1763
1764 #define DEVICE_DESCRIPTION_VERSION 0x0000
1765 #define DEVICE_DESCRIPTION_VERSION1 0x0001
1766 #define DEVICE_DESCRIPTION_VERSION2 0x0002
1767
1768 typedef struct _DEVICE_DESCRIPTION {
1769 ULONG Version;
1770 BOOLEAN Master;
1771 BOOLEAN ScatterGather;
1772 BOOLEAN DemandMode;
1773 BOOLEAN AutoInitialize;
1774 BOOLEAN Dma32BitAddresses;
1775 BOOLEAN IgnoreCount;
1776 BOOLEAN Reserved1;
1777 BOOLEAN Dma64BitAddresses;
1778 ULONG BusNumber;
1779 ULONG DmaChannel;
1780 INTERFACE_TYPE InterfaceType;
1781 DMA_WIDTH DmaWidth;
1782 DMA_SPEED DmaSpeed;
1783 ULONG MaximumLength;
1784 ULONG DmaPort;
1785 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
1786
1787 typedef enum _DEVICE_RELATION_TYPE {
1788 BusRelations,
1789 EjectionRelations,
1790 PowerRelations,
1791 RemovalRelations,
1792 TargetDeviceRelation,
1793 SingleBusRelations,
1794 TransportRelations
1795 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
1796
1797 typedef struct _DEVICE_RELATIONS {
1798 ULONG Count;
1799 PDEVICE_OBJECT Objects[1];
1800 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
1801
1802 typedef struct _DEVOBJ_EXTENSION {
1803 CSHORT Type;
1804 USHORT Size;
1805 PDEVICE_OBJECT DeviceObject;
1806 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
1807
1808 typedef struct _SCATTER_GATHER_ELEMENT {
1809 PHYSICAL_ADDRESS Address;
1810 ULONG Length;
1811 ULONG_PTR Reserved;
1812 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
1813
1814 #if defined(_MSC_EXTENSIONS)
1815
1816 #if _MSC_VER >= 1200
1817 #pragma warning(push)
1818 #endif
1819 #pragma warning(disable:4200)
1820 typedef struct _SCATTER_GATHER_LIST {
1821 ULONG NumberOfElements;
1822 ULONG_PTR Reserved;
1823 SCATTER_GATHER_ELEMENT Elements[1];
1824 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
1825
1826 #if _MSC_VER >= 1200
1827 #pragma warning(pop)
1828 #else
1829 #pragma warning(default:4200)
1830 #endif
1831
1832 #else
1833
1834 struct _SCATTER_GATHER_LIST;
1835 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
1836
1837 #endif
1838
1839 typedef NTSTATUS
1840 (NTAPI DRIVER_ADD_DEVICE)(
1841 IN struct _DRIVER_OBJECT *DriverObject,
1842 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
1843 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
1844
1845 typedef struct _DRIVER_EXTENSION {
1846 struct _DRIVER_OBJECT *DriverObject;
1847 PDRIVER_ADD_DEVICE AddDevice;
1848 ULONG Count;
1849 UNICODE_STRING ServiceKeyName;
1850 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
1851
1852 #define DRVO_UNLOAD_INVOKED 0x00000001
1853 #define DRVO_LEGACY_DRIVER 0x00000002
1854 #define DRVO_BUILTIN_DRIVER 0x00000004
1855
1856 typedef NTSTATUS
1857 (NTAPI DRIVER_INITIALIZE)(
1858 IN struct _DRIVER_OBJECT *DriverObject,
1859 IN PUNICODE_STRING RegistryPath);
1860 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
1861
1862 typedef VOID
1863 (NTAPI DRIVER_STARTIO)(
1864 IN struct _DEVICE_OBJECT *DeviceObject,
1865 IN struct _IRP *Irp);
1866 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
1867
1868 typedef VOID
1869 (NTAPI DRIVER_UNLOAD)(
1870 IN struct _DRIVER_OBJECT *DriverObject);
1871 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
1872
1873 typedef NTSTATUS
1874 (NTAPI DRIVER_DISPATCH)(
1875 IN struct _DEVICE_OBJECT *DeviceObject,
1876 IN struct _IRP *Irp);
1877 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
1878
1879 typedef struct _DRIVER_OBJECT {
1880 CSHORT Type;
1881 CSHORT Size;
1882 PDEVICE_OBJECT DeviceObject;
1883 ULONG Flags;
1884 PVOID DriverStart;
1885 ULONG DriverSize;
1886 PVOID DriverSection;
1887 PDRIVER_EXTENSION DriverExtension;
1888 UNICODE_STRING DriverName;
1889 PUNICODE_STRING HardwareDatabase;
1890 struct _FAST_IO_DISPATCH *FastIoDispatch;
1891 PDRIVER_INITIALIZE DriverInit;
1892 PDRIVER_STARTIO DriverStartIo;
1893 PDRIVER_UNLOAD DriverUnload;
1894 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
1895 } DRIVER_OBJECT, *PDRIVER_OBJECT;
1896
1897 typedef struct _DMA_ADAPTER {
1898 USHORT Version;
1899 USHORT Size;
1900 struct _DMA_OPERATIONS* DmaOperations;
1901 } DMA_ADAPTER, *PDMA_ADAPTER;
1902
1903 typedef VOID
1904 (NTAPI *PPUT_DMA_ADAPTER)(
1905 IN PDMA_ADAPTER DmaAdapter);
1906
1907 typedef PVOID
1908 (NTAPI *PALLOCATE_COMMON_BUFFER)(
1909 IN PDMA_ADAPTER DmaAdapter,
1910 IN ULONG Length,
1911 OUT PPHYSICAL_ADDRESS LogicalAddress,
1912 IN BOOLEAN CacheEnabled);
1913
1914 typedef VOID
1915 (NTAPI *PFREE_COMMON_BUFFER)(
1916 IN PDMA_ADAPTER DmaAdapter,
1917 IN ULONG Length,
1918 IN PHYSICAL_ADDRESS LogicalAddress,
1919 IN PVOID VirtualAddress,
1920 IN BOOLEAN CacheEnabled);
1921
1922 typedef NTSTATUS
1923 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
1924 IN PDMA_ADAPTER DmaAdapter,
1925 IN PDEVICE_OBJECT DeviceObject,
1926 IN ULONG NumberOfMapRegisters,
1927 IN PDRIVER_CONTROL ExecutionRoutine,
1928 IN PVOID Context);
1929
1930 typedef BOOLEAN
1931 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
1932 IN PDMA_ADAPTER DmaAdapter,
1933 IN PMDL Mdl,
1934 IN PVOID MapRegisterBase,
1935 IN PVOID CurrentVa,
1936 IN ULONG Length,
1937 IN BOOLEAN WriteToDevice);
1938
1939 typedef VOID
1940 (NTAPI *PFREE_ADAPTER_CHANNEL)(
1941 IN PDMA_ADAPTER DmaAdapter);
1942
1943 typedef VOID
1944 (NTAPI *PFREE_MAP_REGISTERS)(
1945 IN PDMA_ADAPTER DmaAdapter,
1946 PVOID MapRegisterBase,
1947 ULONG NumberOfMapRegisters);
1948
1949 typedef PHYSICAL_ADDRESS
1950 (NTAPI *PMAP_TRANSFER)(
1951 IN PDMA_ADAPTER DmaAdapter,
1952 IN PMDL Mdl,
1953 IN PVOID MapRegisterBase,
1954 IN PVOID CurrentVa,
1955 IN OUT PULONG Length,
1956 IN BOOLEAN WriteToDevice);
1957
1958 typedef ULONG
1959 (NTAPI *PGET_DMA_ALIGNMENT)(
1960 IN PDMA_ADAPTER DmaAdapter);
1961
1962 typedef ULONG
1963 (NTAPI *PREAD_DMA_COUNTER)(
1964 IN PDMA_ADAPTER DmaAdapter);
1965
1966 typedef VOID
1967 (NTAPI *PDRIVER_LIST_CONTROL)(
1968 IN struct _DEVICE_OBJECT *DeviceObject,
1969 IN struct _IRP *Irp,
1970 IN struct _SCATTER_GATHER_LIST *ScatterGather,
1971 IN PVOID Context);
1972
1973 typedef NTSTATUS
1974 (NTAPI *PGET_SCATTER_GATHER_LIST)(
1975 IN PDMA_ADAPTER DmaAdapter,
1976 IN PDEVICE_OBJECT DeviceObject,
1977 IN PMDL Mdl,
1978 IN PVOID CurrentVa,
1979 IN ULONG Length,
1980 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
1981 IN PVOID Context,
1982 IN BOOLEAN WriteToDevice);
1983
1984 typedef VOID
1985 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
1986 IN PDMA_ADAPTER DmaAdapter,
1987 IN PSCATTER_GATHER_LIST ScatterGather,
1988 IN BOOLEAN WriteToDevice);
1989
1990 typedef NTSTATUS
1991 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
1992 IN PDMA_ADAPTER DmaAdapter,
1993 IN PMDL Mdl OPTIONAL,
1994 IN PVOID CurrentVa,
1995 IN ULONG Length,
1996 OUT PULONG ScatterGatherListSize,
1997 OUT PULONG pNumberOfMapRegisters OPTIONAL);
1998
1999 typedef NTSTATUS
2000 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
2001 IN PDMA_ADAPTER DmaAdapter,
2002 IN PDEVICE_OBJECT DeviceObject,
2003 IN PMDL Mdl,
2004 IN PVOID CurrentVa,
2005 IN ULONG Length,
2006 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
2007 IN PVOID Context,
2008 IN BOOLEAN WriteToDevice,
2009 IN PVOID ScatterGatherBuffer,
2010 IN ULONG ScatterGatherLength);
2011
2012 typedef NTSTATUS
2013 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
2014 IN PDMA_ADAPTER DmaAdapter,
2015 IN PSCATTER_GATHER_LIST ScatterGather,
2016 IN PMDL OriginalMdl,
2017 OUT PMDL *TargetMdl);
2018
2019 typedef struct _DMA_OPERATIONS {
2020 ULONG Size;
2021 PPUT_DMA_ADAPTER PutDmaAdapter;
2022 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
2023 PFREE_COMMON_BUFFER FreeCommonBuffer;
2024 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
2025 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
2026 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
2027 PFREE_MAP_REGISTERS FreeMapRegisters;
2028 PMAP_TRANSFER MapTransfer;
2029 PGET_DMA_ALIGNMENT GetDmaAlignment;
2030 PREAD_DMA_COUNTER ReadDmaCounter;
2031 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
2032 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
2033 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
2034 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
2035 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
2036 } DMA_OPERATIONS, *PDMA_OPERATIONS;
2037
2038 typedef struct _IO_RESOURCE_DESCRIPTOR {
2039 UCHAR Option;
2040 UCHAR Type;
2041 UCHAR ShareDisposition;
2042 UCHAR Spare1;
2043 USHORT Flags;
2044 USHORT Spare2;
2045 union {
2046 struct {
2047 ULONG Length;
2048 ULONG Alignment;
2049 PHYSICAL_ADDRESS MinimumAddress;
2050 PHYSICAL_ADDRESS MaximumAddress;
2051 } Port;
2052 struct {
2053 ULONG Length;
2054 ULONG Alignment;
2055 PHYSICAL_ADDRESS MinimumAddress;
2056 PHYSICAL_ADDRESS MaximumAddress;
2057 } Memory;
2058 struct {
2059 ULONG MinimumVector;
2060 ULONG MaximumVector;
2061 } Interrupt;
2062 struct {
2063 ULONG MinimumChannel;
2064 ULONG MaximumChannel;
2065 } Dma;
2066 struct {
2067 ULONG Length;
2068 ULONG Alignment;
2069 PHYSICAL_ADDRESS MinimumAddress;
2070 PHYSICAL_ADDRESS MaximumAddress;
2071 } Generic;
2072 struct {
2073 ULONG Data[3];
2074 } DevicePrivate;
2075 struct {
2076 ULONG Length;
2077 ULONG MinBusNumber;
2078 ULONG MaxBusNumber;
2079 ULONG Reserved;
2080 } BusNumber;
2081 struct {
2082 ULONG Priority;
2083 ULONG Reserved1;
2084 ULONG Reserved2;
2085 } ConfigData;
2086 } u;
2087 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
2088
2089 typedef struct _IO_RESOURCE_LIST {
2090 USHORT Version;
2091 USHORT Revision;
2092 ULONG Count;
2093 IO_RESOURCE_DESCRIPTOR Descriptors[1];
2094 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
2095
2096 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
2097 ULONG ListSize;
2098 INTERFACE_TYPE InterfaceType;
2099 ULONG BusNumber;
2100 ULONG SlotNumber;
2101 ULONG Reserved[3];
2102 ULONG AlternativeLists;
2103 IO_RESOURCE_LIST List[1];
2104 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
2105
2106 typedef VOID
2107 (NTAPI DRIVER_CANCEL)(
2108 IN struct _DEVICE_OBJECT *DeviceObject,
2109 IN struct _IRP *Irp);
2110 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
2111
2112 typedef struct _IRP {
2113 CSHORT Type;
2114 USHORT Size;
2115 struct _MDL *MdlAddress;
2116 ULONG Flags;
2117 union {
2118 struct _IRP *MasterIrp;
2119 volatile LONG IrpCount;
2120 PVOID SystemBuffer;
2121 } AssociatedIrp;
2122 LIST_ENTRY ThreadListEntry;
2123 IO_STATUS_BLOCK IoStatus;
2124 KPROCESSOR_MODE RequestorMode;
2125 BOOLEAN PendingReturned;
2126 CHAR StackCount;
2127 CHAR CurrentLocation;
2128 BOOLEAN Cancel;
2129 KIRQL CancelIrql;
2130 CCHAR ApcEnvironment;
2131 UCHAR AllocationFlags;
2132 PIO_STATUS_BLOCK UserIosb;
2133 PKEVENT UserEvent;
2134 union {
2135 struct {
2136 _ANONYMOUS_UNION union {
2137 PIO_APC_ROUTINE UserApcRoutine;
2138 PVOID IssuingProcess;
2139 } DUMMYUNIONNAME;
2140 PVOID UserApcContext;
2141 } AsynchronousParameters;
2142 LARGE_INTEGER AllocationSize;
2143 } Overlay;
2144 volatile PDRIVER_CANCEL CancelRoutine;
2145 PVOID UserBuffer;
2146 union {
2147 struct {
2148 _ANONYMOUS_UNION union {
2149 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
2150 _ANONYMOUS_STRUCT struct {
2151 PVOID DriverContext[4];
2152 } DUMMYSTRUCTNAME;
2153 } DUMMYUNIONNAME;
2154 PETHREAD Thread;
2155 PCHAR AuxiliaryBuffer;
2156 _ANONYMOUS_STRUCT struct {
2157 LIST_ENTRY ListEntry;
2158 _ANONYMOUS_UNION union {
2159 struct _IO_STACK_LOCATION *CurrentStackLocation;
2160 ULONG PacketType;
2161 } DUMMYUNIONNAME;
2162 } DUMMYSTRUCTNAME;
2163 struct _FILE_OBJECT *OriginalFileObject;
2164 } Overlay;
2165 KAPC Apc;
2166 PVOID CompletionKey;
2167 } Tail;
2168 } IRP, *PIRP;
2169
2170 typedef enum _IO_PAGING_PRIORITY {
2171 IoPagingPriorityInvalid,
2172 IoPagingPriorityNormal,
2173 IoPagingPriorityHigh,
2174 IoPagingPriorityReserved1,
2175 IoPagingPriorityReserved2
2176 } IO_PAGING_PRIORITY;
2177
2178 typedef NTSTATUS
2179 (NTAPI IO_COMPLETION_ROUTINE)(
2180 IN struct _DEVICE_OBJECT *DeviceObject,
2181 IN struct _IRP *Irp,
2182 IN PVOID Context);
2183 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
2184
2185 typedef VOID
2186 (NTAPI *PIO_DPC_ROUTINE)(
2187 IN struct _KDPC *Dpc,
2188 IN struct _DEVICE_OBJECT *DeviceObject,
2189 IN struct _IRP *Irp,
2190 IN PVOID Context);
2191
2192 typedef NTSTATUS
2193 (NTAPI *PMM_DLL_INITIALIZE)(
2194 IN PUNICODE_STRING RegistryPath);
2195
2196 typedef NTSTATUS
2197 (NTAPI *PMM_DLL_UNLOAD)(
2198 VOID);
2199
2200 typedef BOOLEAN
2201 (NTAPI KSERVICE_ROUTINE)(
2202 IN struct _KINTERRUPT *Interrupt,
2203 IN PVOID ServiceContext);
2204 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
2205
2206 typedef VOID
2207 (NTAPI *PIO_TIMER_ROUTINE)(
2208 IN struct _DEVICE_OBJECT *DeviceObject,
2209 IN PVOID Context);
2210
2211 typedef struct _IO_SECURITY_CONTEXT {
2212 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2213 PACCESS_STATE AccessState;
2214 ACCESS_MASK DesiredAccess;
2215 ULONG FullCreateOptions;
2216 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2217
2218 struct _IO_CSQ;
2219
2220 typedef struct _IO_CSQ_IRP_CONTEXT {
2221 ULONG Type;
2222 struct _IRP *Irp;
2223 struct _IO_CSQ *Csq;
2224 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2225
2226 typedef VOID
2227 (NTAPI *PIO_CSQ_INSERT_IRP)(
2228 IN struct _IO_CSQ *Csq,
2229 IN PIRP Irp);
2230
2231 typedef VOID
2232 (NTAPI *PIO_CSQ_REMOVE_IRP)(
2233 IN struct _IO_CSQ *Csq,
2234 IN PIRP Irp);
2235
2236 typedef PIRP
2237 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
2238 IN struct _IO_CSQ *Csq,
2239 IN PIRP Irp,
2240 IN PVOID PeekContext);
2241
2242 typedef VOID
2243 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
2244 IN struct _IO_CSQ *Csq,
2245 OUT PKIRQL Irql);
2246
2247 typedef VOID
2248 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
2249 IN struct _IO_CSQ *Csq,
2250 IN KIRQL Irql);
2251
2252 typedef VOID
2253 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
2254 IN struct _IO_CSQ *Csq,
2255 IN PIRP Irp);
2256
2257 typedef struct _IO_CSQ {
2258 ULONG Type;
2259 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2260 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2261 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2262 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2263 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2264 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2265 PVOID ReservePointer;
2266 } IO_CSQ, *PIO_CSQ;
2267
2268 typedef enum _BUS_QUERY_ID_TYPE {
2269 BusQueryDeviceID,
2270 BusQueryHardwareIDs,
2271 BusQueryCompatibleIDs,
2272 BusQueryInstanceID,
2273 BusQueryDeviceSerialNumber
2274 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
2275
2276 typedef enum _DEVICE_TEXT_TYPE {
2277 DeviceTextDescription,
2278 DeviceTextLocationInformation
2279 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
2280
2281 typedef enum _WORK_QUEUE_TYPE {
2282 CriticalWorkQueue,
2283 DelayedWorkQueue,
2284 HyperCriticalWorkQueue,
2285 MaximumWorkQueue
2286 } WORK_QUEUE_TYPE;
2287
2288 typedef BOOLEAN
2289 (*PGPE_SERVICE_ROUTINE2)(
2290 PVOID ObjectContext,
2291 PVOID ServiceContext);
2292
2293 typedef NTSTATUS
2294 (*PGPE_CONNECT_VECTOR2)(
2295 PVOID Context,
2296 ULONG GpeNumber,
2297 KINTERRUPT_MODE Mode,
2298 BOOLEAN Shareable,
2299 PGPE_SERVICE_ROUTINE2 ServiceRoutine,
2300 PVOID ServiceContext,
2301 PVOID *ObjectContext);
2302
2303 typedef NTSTATUS
2304 (*PGPE_DISCONNECT_VECTOR2)(
2305 PVOID Context,
2306 PVOID ObjectContext);
2307
2308 typedef NTSTATUS
2309 (*PGPE_ENABLE_EVENT2)(
2310 PVOID Context,
2311 PVOID ObjectContext);
2312
2313 typedef NTSTATUS
2314 (*PGPE_DISABLE_EVENT2)(
2315 PVOID Context,
2316 PVOID ObjectContext);
2317
2318 typedef NTSTATUS
2319 (*PGPE_CLEAR_STATUS2)(
2320 PVOID Context,
2321 PVOID ObjectContext);
2322
2323 typedef VOID
2324 (*PDEVICE_NOTIFY_CALLBACK2)(
2325 PVOID NotificationContext,
2326 ULONG NotifyCode);
2327
2328 typedef NTSTATUS
2329 (*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
2330 PVOID Context,
2331 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
2332 PVOID NotificationContext);
2333
2334 typedef VOID
2335 (*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
2336 PVOID Context);
2337
2338 typedef struct _ACPI_INTERFACE_STANDARD2 {
2339 USHORT Size;
2340 USHORT Version;
2341 PVOID Context;
2342 PINTERFACE_REFERENCE InterfaceReference;
2343 PINTERFACE_DEREFERENCE InterfaceDereference;
2344 PGPE_CONNECT_VECTOR2 GpeConnectVector;
2345 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
2346 PGPE_ENABLE_EVENT2 GpeEnableEvent;
2347 PGPE_DISABLE_EVENT2 GpeDisableEvent;
2348 PGPE_CLEAR_STATUS2 GpeClearStatus;
2349 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
2350 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
2351 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
2352
2353 #if !defined(_AMD64_) && !defined(_IA64_)
2354 #include <pshpack4.h>
2355 #endif
2356 typedef struct _IO_STACK_LOCATION {
2357 UCHAR MajorFunction;
2358 UCHAR MinorFunction;
2359 UCHAR Flags;
2360 UCHAR Control;
2361 union {
2362 struct {
2363 PIO_SECURITY_CONTEXT SecurityContext;
2364 ULONG Options;
2365 USHORT POINTER_ALIGNMENT FileAttributes;
2366 USHORT ShareAccess;
2367 ULONG POINTER_ALIGNMENT EaLength;
2368 } Create;
2369 struct {
2370 ULONG Length;
2371 ULONG POINTER_ALIGNMENT Key;
2372 LARGE_INTEGER ByteOffset;
2373 } Read;
2374 struct {
2375 ULONG Length;
2376 ULONG POINTER_ALIGNMENT Key;
2377 LARGE_INTEGER ByteOffset;
2378 } Write;
2379 struct {
2380 ULONG Length;
2381 PUNICODE_STRING FileName;
2382 FILE_INFORMATION_CLASS FileInformationClass;
2383 ULONG FileIndex;
2384 } QueryDirectory;
2385 struct {
2386 ULONG Length;
2387 ULONG CompletionFilter;
2388 } NotifyDirectory;
2389 struct {
2390 ULONG Length;
2391 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2392 } QueryFile;
2393 struct {
2394 ULONG Length;
2395 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2396 PFILE_OBJECT FileObject;
2397 _ANONYMOUS_UNION union {
2398 _ANONYMOUS_STRUCT struct {
2399 BOOLEAN ReplaceIfExists;
2400 BOOLEAN AdvanceOnly;
2401 } DUMMYSTRUCTNAME;
2402 ULONG ClusterCount;
2403 HANDLE DeleteHandle;
2404 } DUMMYUNIONNAME;
2405 } SetFile;
2406 struct {
2407 ULONG Length;
2408 PVOID EaList;
2409 ULONG EaListLength;
2410 ULONG EaIndex;
2411 } QueryEa;
2412 struct {
2413 ULONG Length;
2414 } SetEa;
2415 struct {
2416 ULONG Length;
2417 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
2418 } QueryVolume;
2419 struct {
2420 ULONG Length;
2421 FS_INFORMATION_CLASS FsInformationClass;
2422 } SetVolume;
2423 struct {
2424 ULONG OutputBufferLength;
2425 ULONG InputBufferLength;
2426 ULONG FsControlCode;
2427 PVOID Type3InputBuffer;
2428 } FileSystemControl;
2429 struct {
2430 PLARGE_INTEGER Length;
2431 ULONG Key;
2432 LARGE_INTEGER ByteOffset;
2433 } LockControl;
2434 struct {
2435 ULONG OutputBufferLength;
2436 ULONG POINTER_ALIGNMENT InputBufferLength;
2437 ULONG POINTER_ALIGNMENT IoControlCode;
2438 PVOID Type3InputBuffer;
2439 } DeviceIoControl;
2440 struct {
2441 SECURITY_INFORMATION SecurityInformation;
2442 ULONG POINTER_ALIGNMENT Length;
2443 } QuerySecurity;
2444 struct {
2445 SECURITY_INFORMATION SecurityInformation;
2446 PSECURITY_DESCRIPTOR SecurityDescriptor;
2447 } SetSecurity;
2448 struct {
2449 PVPB Vpb;
2450 PDEVICE_OBJECT DeviceObject;
2451 } MountVolume;
2452 struct {
2453 PVPB Vpb;
2454 PDEVICE_OBJECT DeviceObject;
2455 } VerifyVolume;
2456 struct {
2457 struct _SCSI_REQUEST_BLOCK *Srb;
2458 } Scsi;
2459 struct {
2460 ULONG Length;
2461 PSID StartSid;
2462 struct _FILE_GET_QUOTA_INFORMATION *SidList;
2463 ULONG SidListLength;
2464 } QueryQuota;
2465 struct {
2466 ULONG Length;
2467 } SetQuota;
2468 struct {
2469 DEVICE_RELATION_TYPE Type;
2470 } QueryDeviceRelations;
2471 struct {
2472 CONST GUID *InterfaceType;
2473 USHORT Size;
2474 USHORT Version;
2475 PINTERFACE Interface;
2476 PVOID InterfaceSpecificData;
2477 } QueryInterface;
2478 struct {
2479 PDEVICE_CAPABILITIES Capabilities;
2480 } DeviceCapabilities;
2481 struct {
2482 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
2483 } FilterResourceRequirements;
2484 struct {
2485 ULONG WhichSpace;
2486 PVOID Buffer;
2487 ULONG Offset;
2488 ULONG POINTER_ALIGNMENT Length;
2489 } ReadWriteConfig;
2490 struct {
2491 BOOLEAN Lock;
2492 } SetLock;
2493 struct {
2494 BUS_QUERY_ID_TYPE IdType;
2495 } QueryId;
2496 struct {
2497 DEVICE_TEXT_TYPE DeviceTextType;
2498 LCID POINTER_ALIGNMENT LocaleId;
2499 } QueryDeviceText;
2500 struct {
2501 BOOLEAN InPath;
2502 BOOLEAN Reserved[3];
2503 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
2504 } UsageNotification;
2505 struct {
2506 SYSTEM_POWER_STATE PowerState;
2507 } WaitWake;
2508 struct {
2509 PPOWER_SEQUENCE PowerSequence;
2510 } PowerSequence;
2511 struct {
2512 ULONG SystemContext;
2513 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
2514 POWER_STATE POINTER_ALIGNMENT State;
2515 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
2516 } Power;
2517 struct {
2518 PCM_RESOURCE_LIST AllocatedResources;
2519 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
2520 } StartDevice;
2521 struct {
2522 ULONG_PTR ProviderId;
2523 PVOID DataPath;
2524 ULONG BufferSize;
2525 PVOID Buffer;
2526 } WMI;
2527 struct {
2528 PVOID Argument1;
2529 PVOID Argument2;
2530 PVOID Argument3;
2531 PVOID Argument4;
2532 } Others;
2533 } Parameters;
2534 PDEVICE_OBJECT DeviceObject;
2535 PFILE_OBJECT FileObject;
2536 PIO_COMPLETION_ROUTINE CompletionRoutine;
2537 PVOID Context;
2538 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
2539 #if !defined(_AMD64_) && !defined(_IA64_)
2540 #include <poppack.h>
2541 #endif
2542
2543 /* IO_STACK_LOCATION.Control */
2544
2545 #define SL_PENDING_RETURNED 0x01
2546 #define SL_ERROR_RETURNED 0x02
2547 #define SL_INVOKE_ON_CANCEL 0x20
2548 #define SL_INVOKE_ON_SUCCESS 0x40
2549 #define SL_INVOKE_ON_ERROR 0x80
2550
2551 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
2552
2553 #define PCI_WHICHSPACE_CONFIG 0x0
2554 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
2555
2556 #define METHOD_BUFFERED 0
2557 #define METHOD_IN_DIRECT 1
2558 #define METHOD_OUT_DIRECT 2
2559 #define METHOD_NEITHER 3
2560
2561 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
2562 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
2563
2564 #define FILE_SUPERSEDED 0x00000000
2565 #define FILE_OPENED 0x00000001
2566 #define FILE_CREATED 0x00000002
2567 #define FILE_OVERWRITTEN 0x00000003
2568 #define FILE_EXISTS 0x00000004
2569 #define FILE_DOES_NOT_EXIST 0x00000005
2570
2571 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
2572 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
2573
2574 /* also in winnt.h */
2575 #define FILE_LIST_DIRECTORY 0x00000001
2576 #define FILE_READ_DATA 0x00000001
2577 #define FILE_ADD_FILE 0x00000002
2578 #define FILE_WRITE_DATA 0x00000002
2579 #define FILE_ADD_SUBDIRECTORY 0x00000004
2580 #define FILE_APPEND_DATA 0x00000004
2581 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
2582 #define FILE_READ_EA 0x00000008
2583 #define FILE_WRITE_EA 0x00000010
2584 #define FILE_EXECUTE 0x00000020
2585 #define FILE_TRAVERSE 0x00000020
2586 #define FILE_DELETE_CHILD 0x00000040
2587 #define FILE_READ_ATTRIBUTES 0x00000080
2588 #define FILE_WRITE_ATTRIBUTES 0x00000100
2589
2590 #define FILE_SHARE_READ 0x00000001
2591 #define FILE_SHARE_WRITE 0x00000002
2592 #define FILE_SHARE_DELETE 0x00000004
2593 #define FILE_SHARE_VALID_FLAGS 0x00000007
2594
2595 #define FILE_ATTRIBUTE_READONLY 0x00000001
2596 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
2597 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
2598 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
2599 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
2600 #define FILE_ATTRIBUTE_DEVICE 0x00000040
2601 #define FILE_ATTRIBUTE_NORMAL 0x00000080
2602 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
2603 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
2604 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
2605 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
2606 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
2607 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
2608 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
2609 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
2610
2611 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
2612 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
2613
2614 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
2615 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
2616 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
2617 #define FILE_VALID_SET_FLAGS 0x00000036
2618
2619 #define FILE_SUPERSEDE 0x00000000
2620 #define FILE_OPEN 0x00000001
2621 #define FILE_CREATE 0x00000002
2622 #define FILE_OPEN_IF 0x00000003
2623 #define FILE_OVERWRITE 0x00000004
2624 #define FILE_OVERWRITE_IF 0x00000005
2625 #define FILE_MAXIMUM_DISPOSITION 0x00000005
2626
2627 #define FILE_DIRECTORY_FILE 0x00000001
2628 #define FILE_WRITE_THROUGH 0x00000002
2629 #define FILE_SEQUENTIAL_ONLY 0x00000004
2630 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
2631 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
2632 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
2633 #define FILE_NON_DIRECTORY_FILE 0x00000040
2634 #define FILE_CREATE_TREE_CONNECTION 0x00000080
2635 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
2636 #define FILE_NO_EA_KNOWLEDGE 0x00000200
2637 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
2638 #define FILE_RANDOM_ACCESS 0x00000800
2639 #define FILE_DELETE_ON_CLOSE 0x00001000
2640 #define FILE_OPEN_BY_FILE_ID 0x00002000
2641 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
2642 #define FILE_NO_COMPRESSION 0x00008000
2643 #if (NTDDI_VERSION >= NTDDI_WIN7)
2644 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
2645 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
2646 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2647 #define FILE_RESERVE_OPFILTER 0x00100000
2648 #define FILE_OPEN_REPARSE_POINT 0x00200000
2649 #define FILE_OPEN_NO_RECALL 0x00400000
2650 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
2651
2652 #define FILE_ANY_ACCESS 0x00000000
2653 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
2654 #define FILE_READ_ACCESS 0x00000001
2655 #define FILE_WRITE_ACCESS 0x00000002
2656
2657 #define FILE_ALL_ACCESS \
2658 (STANDARD_RIGHTS_REQUIRED | \
2659 SYNCHRONIZE | \
2660 0x1FF)
2661
2662 #define FILE_GENERIC_EXECUTE \
2663 (STANDARD_RIGHTS_EXECUTE | \
2664 FILE_READ_ATTRIBUTES | \
2665 FILE_EXECUTE | \
2666 SYNCHRONIZE)
2667
2668 #define FILE_GENERIC_READ \
2669 (STANDARD_RIGHTS_READ | \
2670 FILE_READ_DATA | \
2671 FILE_READ_ATTRIBUTES | \
2672 FILE_READ_EA | \
2673 SYNCHRONIZE)
2674
2675 #define FILE_GENERIC_WRITE \
2676 (STANDARD_RIGHTS_WRITE | \
2677 FILE_WRITE_DATA | \
2678 FILE_WRITE_ATTRIBUTES | \
2679 FILE_WRITE_EA | \
2680 FILE_APPEND_DATA | \
2681 SYNCHRONIZE)
2682
2683 /* end winnt.h */
2684