[NTDDK]
[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 IRP_NOCACHE 0x00000001
1427 #define IRP_PAGING_IO 0x00000002
1428 #define IRP_MOUNT_COMPLETION 0x00000002
1429 #define IRP_SYNCHRONOUS_API 0x00000004
1430 #define IRP_ASSOCIATED_IRP 0x00000008
1431 #define IRP_BUFFERED_IO 0x00000010
1432 #define IRP_DEALLOCATE_BUFFER 0x00000020
1433 #define IRP_INPUT_OPERATION 0x00000040
1434 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
1435 #define IRP_CREATE_OPERATION 0x00000080
1436 #define IRP_READ_OPERATION 0x00000100
1437 #define IRP_WRITE_OPERATION 0x00000200
1438 #define IRP_CLOSE_OPERATION 0x00000400
1439 #define IRP_DEFER_IO_COMPLETION 0x00000800
1440 #define IRP_OB_QUERY_NAME 0x00001000
1441 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
1442
1443 #define IRP_QUOTA_CHARGED 0x01
1444 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
1445 #define IRP_ALLOCATED_FIXED_SIZE 0x04
1446 #define IRP_LOOKASIDE_ALLOCATION 0x08
1447
1448 /*
1449 ** IRP function codes
1450 */
1451
1452 #define IRP_MJ_CREATE 0x00
1453 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
1454 #define IRP_MJ_CLOSE 0x02
1455 #define IRP_MJ_READ 0x03
1456 #define IRP_MJ_WRITE 0x04
1457 #define IRP_MJ_QUERY_INFORMATION 0x05
1458 #define IRP_MJ_SET_INFORMATION 0x06
1459 #define IRP_MJ_QUERY_EA 0x07
1460 #define IRP_MJ_SET_EA 0x08
1461 #define IRP_MJ_FLUSH_BUFFERS 0x09
1462 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
1463 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
1464 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
1465 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
1466 #define IRP_MJ_DEVICE_CONTROL 0x0e
1467 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
1468 #define IRP_MJ_SCSI 0x0f
1469 #define IRP_MJ_SHUTDOWN 0x10
1470 #define IRP_MJ_LOCK_CONTROL 0x11
1471 #define IRP_MJ_CLEANUP 0x12
1472 #define IRP_MJ_CREATE_MAILSLOT 0x13
1473 #define IRP_MJ_QUERY_SECURITY 0x14
1474 #define IRP_MJ_SET_SECURITY 0x15
1475 #define IRP_MJ_POWER 0x16
1476 #define IRP_MJ_SYSTEM_CONTROL 0x17
1477 #define IRP_MJ_DEVICE_CHANGE 0x18
1478 #define IRP_MJ_QUERY_QUOTA 0x19
1479 #define IRP_MJ_SET_QUOTA 0x1a
1480 #define IRP_MJ_PNP 0x1b
1481 #define IRP_MJ_PNP_POWER 0x1b
1482 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
1483
1484 #define IRP_MN_SCSI_CLASS 0x01
1485
1486 #define IRP_MN_START_DEVICE 0x00
1487 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
1488 #define IRP_MN_REMOVE_DEVICE 0x02
1489 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
1490 #define IRP_MN_STOP_DEVICE 0x04
1491 #define IRP_MN_QUERY_STOP_DEVICE 0x05
1492 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
1493
1494 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
1495 #define IRP_MN_QUERY_INTERFACE 0x08
1496 #define IRP_MN_QUERY_CAPABILITIES 0x09
1497 #define IRP_MN_QUERY_RESOURCES 0x0A
1498 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
1499 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
1500 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
1501
1502 #define IRP_MN_READ_CONFIG 0x0F
1503 #define IRP_MN_WRITE_CONFIG 0x10
1504 #define IRP_MN_EJECT 0x11
1505 #define IRP_MN_SET_LOCK 0x12
1506 #define IRP_MN_QUERY_ID 0x13
1507 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
1508 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
1509 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
1510 #define IRP_MN_SURPRISE_REMOVAL 0x17
1511
1512 #define IRP_MN_WAIT_WAKE 0x00
1513 #define IRP_MN_POWER_SEQUENCE 0x01
1514 #define IRP_MN_SET_POWER 0x02
1515 #define IRP_MN_QUERY_POWER 0x03
1516
1517 #define IRP_MN_QUERY_ALL_DATA 0x00
1518 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
1519 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
1520 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
1521 #define IRP_MN_ENABLE_EVENTS 0x04
1522 #define IRP_MN_DISABLE_EVENTS 0x05
1523 #define IRP_MN_ENABLE_COLLECTION 0x06
1524 #define IRP_MN_DISABLE_COLLECTION 0x07
1525 #define IRP_MN_REGINFO 0x08
1526 #define IRP_MN_EXECUTE_METHOD 0x09
1527
1528 #define IRP_MN_REGINFO_EX 0x0b
1529
1530 typedef struct _FILE_OBJECT
1531 {
1532 CSHORT Type;
1533 CSHORT Size;
1534 PDEVICE_OBJECT DeviceObject;
1535 PVPB Vpb;
1536 PVOID FsContext;
1537 PVOID FsContext2;
1538 PSECTION_OBJECT_POINTERS SectionObjectPointer;
1539 PVOID PrivateCacheMap;
1540 NTSTATUS FinalStatus;
1541 struct _FILE_OBJECT *RelatedFileObject;
1542 BOOLEAN LockOperation;
1543 BOOLEAN DeletePending;
1544 BOOLEAN ReadAccess;
1545 BOOLEAN WriteAccess;
1546 BOOLEAN DeleteAccess;
1547 BOOLEAN SharedRead;
1548 BOOLEAN SharedWrite;
1549 BOOLEAN SharedDelete;
1550 ULONG Flags;
1551 UNICODE_STRING FileName;
1552 LARGE_INTEGER CurrentByteOffset;
1553 volatile ULONG Waiters;
1554 volatile ULONG Busy;
1555 PVOID LastLock;
1556 KEVENT Lock;
1557 KEVENT Event;
1558 volatile PIO_COMPLETION_CONTEXT CompletionContext;
1559 KSPIN_LOCK IrpListLock;
1560 LIST_ENTRY IrpList;
1561 volatile PVOID FileObjectExtension;
1562 } FILE_OBJECT, *PFILE_OBJECT;
1563
1564 typedef struct _IO_ERROR_LOG_PACKET {
1565 UCHAR MajorFunctionCode;
1566 UCHAR RetryCount;
1567 USHORT DumpDataSize;
1568 USHORT NumberOfStrings;
1569 USHORT StringOffset;
1570 USHORT EventCategory;
1571 NTSTATUS ErrorCode;
1572 ULONG UniqueErrorValue;
1573 NTSTATUS FinalStatus;
1574 ULONG SequenceNumber;
1575 ULONG IoControlCode;
1576 LARGE_INTEGER DeviceOffset;
1577 ULONG DumpData[1];
1578 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
1579
1580 typedef struct _IO_ERROR_LOG_MESSAGE {
1581 USHORT Type;
1582 USHORT Size;
1583 USHORT DriverNameLength;
1584 LARGE_INTEGER TimeStamp;
1585 ULONG DriverNameOffset;
1586 IO_ERROR_LOG_PACKET EntryData;
1587 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
1588
1589 #define ERROR_LOG_LIMIT_SIZE 240
1590 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
1591 sizeof(IO_ERROR_LOG_PACKET) + \
1592 (sizeof(WCHAR) * 40))
1593 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
1594 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
1595 #define IO_ERROR_LOG_MESSAGE_LENGTH \
1596 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
1597 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
1598 PORT_MAXIMUM_MESSAGE_LENGTH)
1599 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
1600 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
1601
1602 typedef enum _DMA_WIDTH {
1603 Width8Bits,
1604 Width16Bits,
1605 Width32Bits,
1606 MaximumDmaWidth
1607 } DMA_WIDTH, *PDMA_WIDTH;
1608
1609 typedef enum _DMA_SPEED {
1610 Compatible,
1611 TypeA,
1612 TypeB,
1613 TypeC,
1614 TypeF,
1615 MaximumDmaSpeed
1616 } DMA_SPEED, *PDMA_SPEED;
1617
1618 /* DEVICE_DESCRIPTION.Version */
1619
1620 #define DEVICE_DESCRIPTION_VERSION 0x0000
1621 #define DEVICE_DESCRIPTION_VERSION1 0x0001
1622 #define DEVICE_DESCRIPTION_VERSION2 0x0002
1623
1624 typedef struct _DEVICE_DESCRIPTION {
1625 ULONG Version;
1626 BOOLEAN Master;
1627 BOOLEAN ScatterGather;
1628 BOOLEAN DemandMode;
1629 BOOLEAN AutoInitialize;
1630 BOOLEAN Dma32BitAddresses;
1631 BOOLEAN IgnoreCount;
1632 BOOLEAN Reserved1;
1633 BOOLEAN Dma64BitAddresses;
1634 ULONG BusNumber;
1635 ULONG DmaChannel;
1636 INTERFACE_TYPE InterfaceType;
1637 DMA_WIDTH DmaWidth;
1638 DMA_SPEED DmaSpeed;
1639 ULONG MaximumLength;
1640 ULONG DmaPort;
1641 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
1642
1643 typedef enum _DEVICE_RELATION_TYPE {
1644 BusRelations,
1645 EjectionRelations,
1646 PowerRelations,
1647 RemovalRelations,
1648 TargetDeviceRelation,
1649 SingleBusRelations,
1650 TransportRelations
1651 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
1652
1653 typedef struct _DEVICE_RELATIONS {
1654 ULONG Count;
1655 PDEVICE_OBJECT Objects[1];
1656 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
1657
1658 typedef struct _DEVOBJ_EXTENSION
1659 {
1660 CSHORT Type;
1661 USHORT Size;
1662 PDEVICE_OBJECT DeviceObject;
1663 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
1664
1665 typedef struct _SCATTER_GATHER_ELEMENT {
1666 PHYSICAL_ADDRESS Address;
1667 ULONG Length;
1668 ULONG_PTR Reserved;
1669 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
1670
1671 #if defined(_MSC_EXTENSIONS)
1672
1673 #if _MSC_VER >= 1200
1674 #pragma warning(push)
1675 #endif
1676 #pragma warning(disable:4200)
1677 typedef struct _SCATTER_GATHER_LIST {
1678 ULONG NumberOfElements;
1679 ULONG_PTR Reserved;
1680 SCATTER_GATHER_ELEMENT Elements[1];
1681 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
1682
1683 #if _MSC_VER >= 1200
1684 #pragma warning(pop)
1685 #else
1686 #pragma warning(default:4200)
1687 #endif
1688
1689 #else
1690
1691 struct _SCATTER_GATHER_LIST;
1692 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
1693
1694 #endif
1695
1696 typedef NTSTATUS
1697 (DDKAPI DRIVER_ADD_DEVICE)(
1698 IN struct _DRIVER_OBJECT *DriverObject,
1699 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
1700 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
1701
1702 typedef struct _DRIVER_EXTENSION {
1703 struct _DRIVER_OBJECT *DriverObject;
1704 PDRIVER_ADD_DEVICE AddDevice;
1705 ULONG Count;
1706 UNICODE_STRING ServiceKeyName;
1707 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
1708
1709 #define DRVO_UNLOAD_INVOKED 0x00000001
1710 #define DRVO_LEGACY_DRIVER 0x00000002
1711 #define DRVO_BUILTIN_DRIVER 0x00000004
1712
1713 typedef NTSTATUS
1714 (DDKAPI DRIVER_INITIALIZE)(
1715 IN struct _DRIVER_OBJECT *DriverObject,
1716 IN PUNICODE_STRING RegistryPath);
1717 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
1718
1719 typedef VOID
1720 (DDKAPI DRIVER_STARTIO)(
1721 IN struct _DEVICE_OBJECT *DeviceObject,
1722 IN struct _IRP *Irp);
1723 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
1724
1725 typedef VOID
1726 (DDKAPI DRIVER_UNLOAD)(
1727 IN struct _DRIVER_OBJECT *DriverObject);
1728 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
1729
1730 typedef NTSTATUS
1731 (DDKAPI DRIVER_DISPATCH)(
1732 IN struct _DEVICE_OBJECT *DeviceObject,
1733 IN struct _IRP *Irp);
1734 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
1735
1736 typedef struct _DRIVER_OBJECT {
1737 CSHORT Type;
1738 CSHORT Size;
1739 PDEVICE_OBJECT DeviceObject;
1740 ULONG Flags;
1741 PVOID DriverStart;
1742 ULONG DriverSize;
1743 PVOID DriverSection;
1744 PDRIVER_EXTENSION DriverExtension;
1745 UNICODE_STRING DriverName;
1746 PUNICODE_STRING HardwareDatabase;
1747 struct _FAST_IO_DISPATCH *FastIoDispatch;
1748 PDRIVER_INITIALIZE DriverInit;
1749 PDRIVER_STARTIO DriverStartIo;
1750 PDRIVER_UNLOAD DriverUnload;
1751 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
1752 } DRIVER_OBJECT;
1753 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
1754
1755 typedef struct _DMA_ADAPTER {
1756 USHORT Version;
1757 USHORT Size;
1758 struct _DMA_OPERATIONS* DmaOperations;
1759 } DMA_ADAPTER, *PDMA_ADAPTER;
1760
1761 typedef VOID
1762 (DDKAPI *PPUT_DMA_ADAPTER)(
1763 IN PDMA_ADAPTER DmaAdapter);
1764
1765 typedef PVOID
1766 (DDKAPI *PALLOCATE_COMMON_BUFFER)(
1767 IN PDMA_ADAPTER DmaAdapter,
1768 IN ULONG Length,
1769 OUT PPHYSICAL_ADDRESS LogicalAddress,
1770 IN BOOLEAN CacheEnabled);
1771
1772 typedef VOID
1773 (DDKAPI *PFREE_COMMON_BUFFER)(
1774 IN PDMA_ADAPTER DmaAdapter,
1775 IN ULONG Length,
1776 IN PHYSICAL_ADDRESS LogicalAddress,
1777 IN PVOID VirtualAddress,
1778 IN BOOLEAN CacheEnabled);
1779
1780 typedef NTSTATUS
1781 (DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
1782 IN PDMA_ADAPTER DmaAdapter,
1783 IN PDEVICE_OBJECT DeviceObject,
1784 IN ULONG NumberOfMapRegisters,
1785 IN PDRIVER_CONTROL ExecutionRoutine,
1786 IN PVOID Context);
1787
1788 typedef BOOLEAN
1789 (DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
1790 IN PDMA_ADAPTER DmaAdapter,
1791 IN PMDL Mdl,
1792 IN PVOID MapRegisterBase,
1793 IN PVOID CurrentVa,
1794 IN ULONG Length,
1795 IN BOOLEAN WriteToDevice);
1796
1797 typedef VOID
1798 (DDKAPI *PFREE_ADAPTER_CHANNEL)(
1799 IN PDMA_ADAPTER DmaAdapter);
1800
1801 typedef VOID
1802 (DDKAPI *PFREE_MAP_REGISTERS)(
1803 IN PDMA_ADAPTER DmaAdapter,
1804 PVOID MapRegisterBase,
1805 ULONG NumberOfMapRegisters);
1806
1807 typedef PHYSICAL_ADDRESS
1808 (DDKAPI *PMAP_TRANSFER)(
1809 IN PDMA_ADAPTER DmaAdapter,
1810 IN PMDL Mdl,
1811 IN PVOID MapRegisterBase,
1812 IN PVOID CurrentVa,
1813 IN OUT PULONG Length,
1814 IN BOOLEAN WriteToDevice);
1815
1816 typedef ULONG
1817 (DDKAPI *PGET_DMA_ALIGNMENT)(
1818 IN PDMA_ADAPTER DmaAdapter);
1819
1820 typedef ULONG
1821 (DDKAPI *PREAD_DMA_COUNTER)(
1822 IN PDMA_ADAPTER DmaAdapter);
1823
1824 typedef VOID
1825 (DDKAPI *PDRIVER_LIST_CONTROL)(
1826 IN struct _DEVICE_OBJECT *DeviceObject,
1827 IN struct _IRP *Irp,
1828 IN struct _SCATTER_GATHER_LIST *ScatterGather,
1829 IN PVOID Context);
1830
1831 typedef NTSTATUS
1832 (DDKAPI *PGET_SCATTER_GATHER_LIST)(
1833 IN PDMA_ADAPTER DmaAdapter,
1834 IN PDEVICE_OBJECT DeviceObject,
1835 IN PMDL Mdl,
1836 IN PVOID CurrentVa,
1837 IN ULONG Length,
1838 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
1839 IN PVOID Context,
1840 IN BOOLEAN WriteToDevice);
1841
1842 typedef VOID
1843 (DDKAPI *PPUT_SCATTER_GATHER_LIST)(
1844 IN PDMA_ADAPTER DmaAdapter,
1845 IN PSCATTER_GATHER_LIST ScatterGather,
1846 IN BOOLEAN WriteToDevice);
1847
1848 typedef NTSTATUS
1849 (DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
1850 IN PDMA_ADAPTER DmaAdapter,
1851 IN PMDL Mdl OPTIONAL,
1852 IN PVOID CurrentVa,
1853 IN ULONG Length,
1854 OUT PULONG ScatterGatherListSize,
1855 OUT PULONG pNumberOfMapRegisters OPTIONAL);
1856
1857 typedef NTSTATUS
1858 (DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
1859 IN PDMA_ADAPTER DmaAdapter,
1860 IN PDEVICE_OBJECT DeviceObject,
1861 IN PMDL Mdl,
1862 IN PVOID CurrentVa,
1863 IN ULONG Length,
1864 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
1865 IN PVOID Context,
1866 IN BOOLEAN WriteToDevice,
1867 IN PVOID ScatterGatherBuffer,
1868 IN ULONG ScatterGatherLength);
1869
1870 typedef NTSTATUS
1871 (DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
1872 IN PDMA_ADAPTER DmaAdapter,
1873 IN PSCATTER_GATHER_LIST ScatterGather,
1874 IN PMDL OriginalMdl,
1875 OUT PMDL *TargetMdl);
1876
1877 typedef struct _DMA_OPERATIONS {
1878 ULONG Size;
1879 PPUT_DMA_ADAPTER PutDmaAdapter;
1880 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
1881 PFREE_COMMON_BUFFER FreeCommonBuffer;
1882 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
1883 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
1884 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
1885 PFREE_MAP_REGISTERS FreeMapRegisters;
1886 PMAP_TRANSFER MapTransfer;
1887 PGET_DMA_ALIGNMENT GetDmaAlignment;
1888 PREAD_DMA_COUNTER ReadDmaCounter;
1889 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
1890 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
1891 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
1892 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
1893 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
1894 } DMA_OPERATIONS, *PDMA_OPERATIONS;
1895
1896 typedef struct _IO_RESOURCE_DESCRIPTOR {
1897 UCHAR Option;
1898 UCHAR Type;
1899 UCHAR ShareDisposition;
1900 UCHAR Spare1;
1901 USHORT Flags;
1902 USHORT Spare2;
1903 union {
1904 struct {
1905 ULONG Length;
1906 ULONG Alignment;
1907 PHYSICAL_ADDRESS MinimumAddress;
1908 PHYSICAL_ADDRESS MaximumAddress;
1909 } Port;
1910 struct {
1911 ULONG Length;
1912 ULONG Alignment;
1913 PHYSICAL_ADDRESS MinimumAddress;
1914 PHYSICAL_ADDRESS MaximumAddress;
1915 } Memory;
1916 struct {
1917 ULONG MinimumVector;
1918 ULONG MaximumVector;
1919 } Interrupt;
1920 struct {
1921 ULONG MinimumChannel;
1922 ULONG MaximumChannel;
1923 } Dma;
1924 struct {
1925 ULONG Length;
1926 ULONG Alignment;
1927 PHYSICAL_ADDRESS MinimumAddress;
1928 PHYSICAL_ADDRESS MaximumAddress;
1929 } Generic;
1930 struct {
1931 ULONG Data[3];
1932 } DevicePrivate;
1933 struct {
1934 ULONG Length;
1935 ULONG MinBusNumber;
1936 ULONG MaxBusNumber;
1937 ULONG Reserved;
1938 } BusNumber;
1939 struct {
1940 ULONG Priority;
1941 ULONG Reserved1;
1942 ULONG Reserved2;
1943 } ConfigData;
1944 } u;
1945 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
1946
1947 typedef struct _IO_RESOURCE_LIST {
1948 USHORT Version;
1949 USHORT Revision;
1950 ULONG Count;
1951 IO_RESOURCE_DESCRIPTOR Descriptors[1];
1952 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
1953
1954 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
1955 ULONG ListSize;
1956 INTERFACE_TYPE InterfaceType;
1957 ULONG BusNumber;
1958 ULONG SlotNumber;
1959 ULONG Reserved[3];
1960 ULONG AlternativeLists;
1961 IO_RESOURCE_LIST List[1];
1962 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
1963
1964 typedef VOID
1965 (DDKAPI DRIVER_CANCEL)(
1966 IN struct _DEVICE_OBJECT *DeviceObject,
1967 IN struct _IRP *Irp);
1968 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
1969
1970 typedef struct _IRP {
1971 CSHORT Type;
1972 USHORT Size;
1973 struct _MDL *MdlAddress;
1974 ULONG Flags;
1975 union {
1976 struct _IRP *MasterIrp;
1977 volatile LONG IrpCount;
1978 PVOID SystemBuffer;
1979 } AssociatedIrp;
1980 LIST_ENTRY ThreadListEntry;
1981 IO_STATUS_BLOCK IoStatus;
1982 KPROCESSOR_MODE RequestorMode;
1983 BOOLEAN PendingReturned;
1984 CHAR StackCount;
1985 CHAR CurrentLocation;
1986 BOOLEAN Cancel;
1987 KIRQL CancelIrql;
1988 CCHAR ApcEnvironment;
1989 UCHAR AllocationFlags;
1990 PIO_STATUS_BLOCK UserIosb;
1991 PKEVENT UserEvent;
1992 union {
1993 struct {
1994 _ANONYMOUS_UNION union {
1995 PIO_APC_ROUTINE UserApcRoutine;
1996 PVOID IssuingProcess;
1997 } DUMMYUNIONNAME;
1998 PVOID UserApcContext;
1999 } AsynchronousParameters;
2000 LARGE_INTEGER AllocationSize;
2001 } Overlay;
2002 volatile PDRIVER_CANCEL CancelRoutine;
2003 PVOID UserBuffer;
2004 union {
2005 struct {
2006 _ANONYMOUS_UNION union {
2007 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
2008 _ANONYMOUS_STRUCT struct {
2009 PVOID DriverContext[4];
2010 } DUMMYSTRUCTNAME;
2011 } DUMMYUNIONNAME;
2012 PETHREAD Thread;
2013 PCHAR AuxiliaryBuffer;
2014 _ANONYMOUS_STRUCT struct {
2015 LIST_ENTRY ListEntry;
2016 _ANONYMOUS_UNION union {
2017 struct _IO_STACK_LOCATION *CurrentStackLocation;
2018 ULONG PacketType;
2019 } DUMMYUNIONNAME;
2020 } DUMMYSTRUCTNAME;
2021 struct _FILE_OBJECT *OriginalFileObject;
2022 } Overlay;
2023 KAPC Apc;
2024 PVOID CompletionKey;
2025 } Tail;
2026 } IRP;
2027 typedef struct _IRP *PIRP;
2028
2029 typedef enum _IO_PAGING_PRIORITY {
2030 IoPagingPriorityInvalid,
2031 IoPagingPriorityNormal,
2032 IoPagingPriorityHigh,
2033 IoPagingPriorityReserved1,
2034 IoPagingPriorityReserved2
2035 } IO_PAGING_PRIORITY;
2036
2037 typedef NTSTATUS
2038 (DDKAPI IO_COMPLETION_ROUTINE)(
2039 IN struct _DEVICE_OBJECT *DeviceObject,
2040 IN struct _IRP *Irp,
2041 IN PVOID Context);
2042 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
2043
2044 typedef VOID
2045 (DDKAPI *PIO_DPC_ROUTINE)(
2046 IN struct _KDPC *Dpc,
2047 IN struct _DEVICE_OBJECT *DeviceObject,
2048 IN struct _IRP *Irp,
2049 IN PVOID Context);
2050
2051 typedef NTSTATUS
2052 (DDKAPI *PMM_DLL_INITIALIZE)(
2053 IN PUNICODE_STRING RegistryPath);
2054
2055 typedef NTSTATUS
2056 (DDKAPI *PMM_DLL_UNLOAD)(
2057 VOID);
2058
2059 typedef BOOLEAN
2060 (DDKAPI KSERVICE_ROUTINE)(
2061 IN struct _KINTERRUPT *Interrupt,
2062 IN PVOID ServiceContext);
2063 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
2064
2065 typedef VOID
2066 (DDKAPI *PIO_TIMER_ROUTINE)(
2067 IN struct _DEVICE_OBJECT *DeviceObject,
2068 IN PVOID Context);
2069
2070 typedef struct _IO_SECURITY_CONTEXT {
2071 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
2072 PACCESS_STATE AccessState;
2073 ACCESS_MASK DesiredAccess;
2074 ULONG FullCreateOptions;
2075 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
2076
2077 struct _IO_CSQ;
2078
2079 typedef struct _IO_CSQ_IRP_CONTEXT {
2080 ULONG Type;
2081 struct _IRP *Irp;
2082 struct _IO_CSQ *Csq;
2083 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
2084
2085 typedef VOID
2086 (DDKAPI *PIO_CSQ_INSERT_IRP)(
2087 IN struct _IO_CSQ *Csq,
2088 IN PIRP Irp);
2089
2090 typedef VOID
2091 (DDKAPI *PIO_CSQ_REMOVE_IRP)(
2092 IN struct _IO_CSQ *Csq,
2093 IN PIRP Irp);
2094
2095 typedef PIRP
2096 (DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
2097 IN struct _IO_CSQ *Csq,
2098 IN PIRP Irp,
2099 IN PVOID PeekContext);
2100
2101 typedef VOID
2102 (DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
2103 IN struct _IO_CSQ *Csq,
2104 OUT PKIRQL Irql);
2105
2106 typedef VOID
2107 (DDKAPI *PIO_CSQ_RELEASE_LOCK)(
2108 IN struct _IO_CSQ *Csq,
2109 IN KIRQL Irql);
2110
2111 typedef VOID
2112 (DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
2113 IN struct _IO_CSQ *Csq,
2114 IN PIRP Irp);
2115
2116 typedef struct _IO_CSQ {
2117 ULONG Type;
2118 PIO_CSQ_INSERT_IRP CsqInsertIrp;
2119 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
2120 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
2121 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
2122 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
2123 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
2124 PVOID ReservePointer;
2125 } IO_CSQ, *PIO_CSQ;
2126
2127 typedef enum _BUS_QUERY_ID_TYPE {
2128 BusQueryDeviceID,
2129 BusQueryHardwareIDs,
2130 BusQueryCompatibleIDs,
2131 BusQueryInstanceID,
2132 BusQueryDeviceSerialNumber
2133 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
2134
2135 typedef enum _DEVICE_TEXT_TYPE {
2136 DeviceTextDescription,
2137 DeviceTextLocationInformation
2138 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
2139
2140 typedef enum _WORK_QUEUE_TYPE {
2141 CriticalWorkQueue,
2142 DelayedWorkQueue,
2143 HyperCriticalWorkQueue,
2144 MaximumWorkQueue
2145 } WORK_QUEUE_TYPE;
2146
2147 #if !defined(_AMD64_) && !defined(_IA64_)
2148 #include <pshpack4.h>
2149 #endif
2150 typedef struct _IO_STACK_LOCATION {
2151 UCHAR MajorFunction;
2152 UCHAR MinorFunction;
2153 UCHAR Flags;
2154 UCHAR Control;
2155 union {
2156 struct {
2157 PIO_SECURITY_CONTEXT SecurityContext;
2158 ULONG Options;
2159 USHORT POINTER_ALIGNMENT FileAttributes;
2160 USHORT ShareAccess;
2161 ULONG POINTER_ALIGNMENT EaLength;
2162 } Create;
2163 struct {
2164 ULONG Length;
2165 ULONG POINTER_ALIGNMENT Key;
2166 LARGE_INTEGER ByteOffset;
2167 } Read;
2168 struct {
2169 ULONG Length;
2170 ULONG POINTER_ALIGNMENT Key;
2171 LARGE_INTEGER ByteOffset;
2172 } Write;
2173 struct {
2174 ULONG Length;
2175 PUNICODE_STRING FileName;
2176 FILE_INFORMATION_CLASS FileInformationClass;
2177 ULONG FileIndex;
2178 } QueryDirectory;
2179 struct {
2180 ULONG Length;
2181 ULONG CompletionFilter;
2182 } NotifyDirectory;
2183 struct {
2184 ULONG Length;
2185 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2186 } QueryFile;
2187 struct {
2188 ULONG Length;
2189 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
2190 PFILE_OBJECT FileObject;
2191 _ANONYMOUS_UNION union {
2192 _ANONYMOUS_STRUCT struct {
2193 BOOLEAN ReplaceIfExists;
2194 BOOLEAN AdvanceOnly;
2195 } DUMMYSTRUCTNAME;
2196 ULONG ClusterCount;
2197 HANDLE DeleteHandle;
2198 } DUMMYUNIONNAME;
2199 } SetFile;
2200 struct {
2201 ULONG Length;
2202 PVOID EaList;
2203 ULONG EaListLength;
2204 ULONG EaIndex;
2205 } QueryEa;
2206 struct {
2207 ULONG Length;
2208 } SetEa;
2209 struct {
2210 ULONG Length;
2211 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
2212 } QueryVolume;
2213 struct {
2214 ULONG Length;
2215 FS_INFORMATION_CLASS FsInformationClass;
2216 } SetVolume;
2217 struct {
2218 ULONG OutputBufferLength;
2219 ULONG InputBufferLength;
2220 ULONG FsControlCode;
2221 PVOID Type3InputBuffer;
2222 } FileSystemControl;
2223 struct {
2224 PLARGE_INTEGER Length;
2225 ULONG Key;
2226 LARGE_INTEGER ByteOffset;
2227 } LockControl;
2228 struct {
2229 ULONG OutputBufferLength;
2230 ULONG POINTER_ALIGNMENT InputBufferLength;
2231 ULONG POINTER_ALIGNMENT IoControlCode;
2232 PVOID Type3InputBuffer;
2233 } DeviceIoControl;
2234 struct {
2235 SECURITY_INFORMATION SecurityInformation;
2236 ULONG POINTER_ALIGNMENT Length;
2237 } QuerySecurity;
2238 struct {
2239 SECURITY_INFORMATION SecurityInformation;
2240 PSECURITY_DESCRIPTOR SecurityDescriptor;
2241 } SetSecurity;
2242 struct {
2243 PVPB Vpb;
2244 PDEVICE_OBJECT DeviceObject;
2245 } MountVolume;
2246 struct {
2247 PVPB Vpb;
2248 PDEVICE_OBJECT DeviceObject;
2249 } VerifyVolume;
2250 struct {
2251 struct _SCSI_REQUEST_BLOCK *Srb;
2252 } Scsi;
2253 struct {
2254 ULONG Length;
2255 PSID StartSid;
2256 struct _FILE_GET_QUOTA_INFORMATION *SidList;
2257 ULONG SidListLength;
2258 } QueryQuota;
2259 struct {
2260 ULONG Length;
2261 } SetQuota;
2262 struct {
2263 DEVICE_RELATION_TYPE Type;
2264 } QueryDeviceRelations;
2265 struct {
2266 CONST GUID *InterfaceType;
2267 USHORT Size;
2268 USHORT Version;
2269 PINTERFACE Interface;
2270 PVOID InterfaceSpecificData;
2271 } QueryInterface;
2272 struct {
2273 PDEVICE_CAPABILITIES Capabilities;
2274 } DeviceCapabilities;
2275 struct {
2276 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
2277 } FilterResourceRequirements;
2278 struct {
2279 ULONG WhichSpace;
2280 PVOID Buffer;
2281 ULONG Offset;
2282 ULONG POINTER_ALIGNMENT Length;
2283 } ReadWriteConfig;
2284 struct {
2285 BOOLEAN Lock;
2286 } SetLock;
2287 struct {
2288 BUS_QUERY_ID_TYPE IdType;
2289 } QueryId;
2290 struct {
2291 DEVICE_TEXT_TYPE DeviceTextType;
2292 LCID POINTER_ALIGNMENT LocaleId;
2293 } QueryDeviceText;
2294 struct {
2295 BOOLEAN InPath;
2296 BOOLEAN Reserved[3];
2297 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
2298 } UsageNotification;
2299 struct {
2300 SYSTEM_POWER_STATE PowerState;
2301 } WaitWake;
2302 struct {
2303 PPOWER_SEQUENCE PowerSequence;
2304 } PowerSequence;
2305 struct {
2306 ULONG SystemContext;
2307 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
2308 POWER_STATE POINTER_ALIGNMENT State;
2309 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
2310 } Power;
2311 struct {
2312 PCM_RESOURCE_LIST AllocatedResources;
2313 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
2314 } StartDevice;
2315 struct {
2316 ULONG_PTR ProviderId;
2317 PVOID DataPath;
2318 ULONG BufferSize;
2319 PVOID Buffer;
2320 } WMI;
2321 struct {
2322 PVOID Argument1;
2323 PVOID Argument2;
2324 PVOID Argument3;
2325 PVOID Argument4;
2326 } Others;
2327 } Parameters;
2328 PDEVICE_OBJECT DeviceObject;
2329 PFILE_OBJECT FileObject;
2330 PIO_COMPLETION_ROUTINE CompletionRoutine;
2331 PVOID Context;
2332 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
2333 #if !defined(_AMD64_) && !defined(_IA64_)
2334 #include <poppack.h>
2335 #endif
2336
2337 /* IO_STACK_LOCATION.Control */
2338
2339 #define SL_PENDING_RETURNED 0x01
2340 #define SL_ERROR_RETURNED 0x02
2341 #define SL_INVOKE_ON_CANCEL 0x20
2342 #define SL_INVOKE_ON_SUCCESS 0x40
2343 #define SL_INVOKE_ON_ERROR 0x80
2344
2345 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
2346
2347 #define PCI_WHICHSPACE_CONFIG 0x0
2348 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
2349
2350 #define METHOD_BUFFERED 0
2351 #define METHOD_IN_DIRECT 1
2352 #define METHOD_OUT_DIRECT 2
2353 #define METHOD_NEITHER 3
2354
2355
2356 #define FILE_SUPERSEDED 0x00000000
2357 #define FILE_OPENED 0x00000001
2358 #define FILE_CREATED 0x00000002
2359 #define FILE_OVERWRITTEN 0x00000003
2360 #define FILE_EXISTS 0x00000004
2361 #define FILE_DOES_NOT_EXIST 0x00000005
2362
2363 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
2364 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
2365
2366 /* also in winnt.h */
2367 #define FILE_LIST_DIRECTORY 0x00000001
2368 #define FILE_READ_DATA 0x00000001
2369 #define FILE_ADD_FILE 0x00000002
2370 #define FILE_WRITE_DATA 0x00000002
2371 #define FILE_ADD_SUBDIRECTORY 0x00000004
2372 #define FILE_APPEND_DATA 0x00000004
2373 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
2374 #define FILE_READ_EA 0x00000008
2375 #define FILE_WRITE_EA 0x00000010
2376 #define FILE_EXECUTE 0x00000020
2377 #define FILE_TRAVERSE 0x00000020
2378 #define FILE_DELETE_CHILD 0x00000040
2379 #define FILE_READ_ATTRIBUTES 0x00000080
2380 #define FILE_WRITE_ATTRIBUTES 0x00000100
2381
2382 #define FILE_SHARE_READ 0x00000001
2383 #define FILE_SHARE_WRITE 0x00000002
2384 #define FILE_SHARE_DELETE 0x00000004
2385 #define FILE_SHARE_VALID_FLAGS 0x00000007
2386
2387 #define FILE_ATTRIBUTE_READONLY 0x00000001
2388 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
2389 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
2390 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
2391 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
2392 #define FILE_ATTRIBUTE_DEVICE 0x00000040
2393 #define FILE_ATTRIBUTE_NORMAL 0x00000080
2394 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
2395 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
2396 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
2397 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
2398 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
2399 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
2400 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
2401
2402 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
2403 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
2404
2405 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
2406 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
2407 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
2408 #define FILE_VALID_SET_FLAGS 0x00000036
2409
2410 #define FILE_SUPERSEDE 0x00000000
2411 #define FILE_OPEN 0x00000001
2412 #define FILE_CREATE 0x00000002
2413 #define FILE_OPEN_IF 0x00000003
2414 #define FILE_OVERWRITE 0x00000004
2415 #define FILE_OVERWRITE_IF 0x00000005
2416 #define FILE_MAXIMUM_DISPOSITION 0x00000005
2417
2418 #define FILE_DIRECTORY_FILE 0x00000001
2419 #define FILE_WRITE_THROUGH 0x00000002
2420 #define FILE_SEQUENTIAL_ONLY 0x00000004
2421 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
2422 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
2423 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
2424 #define FILE_NON_DIRECTORY_FILE 0x00000040
2425 #define FILE_CREATE_TREE_CONNECTION 0x00000080
2426 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
2427 #define FILE_NO_EA_KNOWLEDGE 0x00000200
2428 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
2429 #define FILE_RANDOM_ACCESS 0x00000800
2430 #define FILE_DELETE_ON_CLOSE 0x00001000
2431 #define FILE_OPEN_BY_FILE_ID 0x00002000
2432 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
2433 #define FILE_NO_COMPRESSION 0x00008000
2434 #define FILE_RESERVE_OPFILTER 0x00100000
2435 #define FILE_OPEN_REPARSE_POINT 0x00200000
2436 #define FILE_OPEN_NO_RECALL 0x00400000
2437 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
2438
2439 #define FILE_ANY_ACCESS 0x00000000
2440 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
2441 #define FILE_READ_ACCESS 0x00000001
2442 #define FILE_WRITE_ACCESS 0x00000002
2443
2444 #define FILE_ALL_ACCESS \
2445 (STANDARD_RIGHTS_REQUIRED | \
2446 SYNCHRONIZE | \
2447 0x1FF)
2448
2449 #define FILE_GENERIC_EXECUTE \
2450 (STANDARD_RIGHTS_EXECUTE | \
2451 FILE_READ_ATTRIBUTES | \
2452 FILE_EXECUTE | \
2453 SYNCHRONIZE)
2454
2455 #define FILE_GENERIC_READ \
2456 (STANDARD_RIGHTS_READ | \
2457 FILE_READ_DATA | \
2458 FILE_READ_ATTRIBUTES | \
2459 FILE_READ_EA | \
2460 SYNCHRONIZE)
2461
2462 #define FILE_GENERIC_WRITE \
2463 (STANDARD_RIGHTS_WRITE | \
2464 FILE_WRITE_DATA | \
2465 FILE_WRITE_ATTRIBUTES | \
2466 FILE_WRITE_EA | \
2467 FILE_APPEND_DATA | \
2468 SYNCHRONIZE)
2469
2470 /* end winnt.h */
2471