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