5 #ifndef __INCLUDE_DDK_IOTYPES_H
6 #define __INCLUDE_DDK_IOTYPES_H
12 extern POBJECT_TYPE EXPORTED IoAdapterObjectType;
13 extern POBJECT_TYPE EXPORTED IoDeviceHandlerObjectType;
14 extern POBJECT_TYPE EXPORTED IoDeviceObjectType;
15 extern POBJECT_TYPE EXPORTED IoDriverObjectType;
16 extern POBJECT_TYPE EXPORTED IoFileObjectType;
18 extern POBJECT_TYPE IMPORTED IoAdapterObjectType;
19 extern POBJECT_TYPE IMPORTED IoDeviceHandlerObjectType;
20 extern POBJECT_TYPE IMPORTED IoDeviceObjectType;
21 extern POBJECT_TYPE IMPORTED IoDriverObjectType;
22 extern POBJECT_TYPE IMPORTED IoFileObjectType;
26 * These are referenced before they can be fully defined
28 struct _DRIVER_OBJECT;
30 struct _DEVICE_OBJECT;
32 struct _IO_STATUS_BLOCK;
33 struct _SCSI_REQUEST_BLOCK;
35 /* SIMPLE TYPES *************************************************************/
44 typedef enum _CREATE_FILE_TYPE
47 CreateFileTypeNamedPipe,
48 CreateFileTypeMailslot
52 typedef struct _SHARE_ACCESS
61 } SHARE_ACCESS, *PSHARE_ACCESS;
63 /* FUNCTION TYPES ************************************************************/
66 (*PDRIVER_REINITIALIZE)(struct _DRIVER_OBJECT* DriverObject,
70 typedef NTSTATUS STDCALL
71 (*PIO_QUERY_DEVICE_ROUTINE)(PVOID Context,
72 PUNICODE_STRING Pathname,
73 INTERFACE_TYPE BusType,
75 PKEY_VALUE_FULL_INFORMATION* BI,
76 CONFIGURATION_TYPE ControllerType,
77 ULONG ControllerNumber,
78 PKEY_VALUE_FULL_INFORMATION* CI,
79 CONFIGURATION_TYPE PeripheralType,
80 ULONG PeripheralNumber,
81 PKEY_VALUE_FULL_INFORMATION* PI);
83 typedef NTSTATUS STDCALL
84 (*PIO_COMPLETION_ROUTINE)(struct _DEVICE_OBJECT* DeviceObject,
89 (*PIO_APC_ROUTINE)(PVOID ApcContext,
90 struct _IO_STATUS_BLOCK* IoStatusBlock,
94 /* STRUCTURE TYPES ***********************************************************/
96 typedef struct _ADAPTER_OBJECT ADAPTER_OBJECT, *PADAPTER_OBJECT;
99 * PURPOSE: Special timer associated with each device
100 * NOTES: This is a guess
102 typedef struct _IO_TIMER
106 } IO_TIMER, *PIO_TIMER;
108 typedef struct _IO_SECURITY_CONTEXT
110 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
111 PACCESS_STATE AccessState;
112 ACCESS_MASK DesiredAccess;
113 ULONG FullCreateOptions;
114 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
117 typedef struct _IO_RESOURCE_DESCRIPTOR
121 UCHAR ShareDisposition;
124 * Reserved for system use
131 * Reserved for system use
141 PHYSICAL_ADDRESS MinimumAddress;
142 PHYSICAL_ADDRESS MaximumAddress;
148 PHYSICAL_ADDRESS MinimumAddress;
149 PHYSICAL_ADDRESS MaximumAddress;
158 ULONG MinimumChannel;
159 ULONG MaximumChannel;
162 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
164 // IO_RESOURCE_DESCRIPTOR Options
165 #define IO_RESOURCE_REQUIRED 0x00
166 #define IO_RESOURCE_PREFERRED 0x01
167 #define IO_RESOURCE_DEFAULT 0x02
168 #define IO_RESOURCE_ALTERNATIVE 0x08
170 typedef struct _IO_RESOURCE_LIST
175 IO_RESOURCE_DESCRIPTOR Descriptors[1];
176 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
178 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
186 * System defined enum for the bus
188 INTERFACE_TYPE InterfaceType;
193 ULONG AlternativeLists;
194 IO_RESOURCE_LIST List[1];
195 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
200 UCHAR ShareDisposition;
206 PHYSICAL_ADDRESS Start;
208 } __attribute__((packed)) Port;
214 } __attribute__((packed))Interrupt;
217 PHYSICAL_ADDRESS Start;
219 } __attribute__((packed))Memory;
225 } __attribute__((packed))Dma;
231 } __attribute__((packed))DeviceSpecificData;
232 } __attribute__((packed)) u;
233 } __attribute__((packed)) CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
240 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
241 } __attribute__((packed))CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
245 INTERFACE_TYPE InterfaceType;
247 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
248 } __attribute__((packed)) CM_FULL_RESOURCE_DESCRIPTOR;
253 CM_FULL_RESOURCE_DESCRIPTOR List[1];
254 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
258 * PURPOSE: IRP stack location
260 typedef struct __attribute__((packed)) _IO_STACK_LOCATION
271 PIO_SECURITY_CONTEXT SecurityContext;
273 USHORT FileAttributes;
281 LARGE_INTEGER ByteOffset;
287 LARGE_INTEGER ByteOffset;
291 ULONG OutputBufferLength;
292 ULONG InputBufferLength;
294 PVOID Type3InputBuffer;
298 ULONG OutputBufferLength;
299 ULONG InputBufferLength;
301 PVOID Type3InputBuffer;
306 struct _DEVICE_OBJECT* DeviceObject;
311 struct _DEVICE_OBJECT* DeviceObject;
316 FILE_INFORMATION_CLASS FileInformationClass;
321 FS_INFORMATION_CLASS FsInformationClass;
326 FS_INFORMATION_CLASS FsInformationClass;
331 FILE_INFORMATION_CLASS FileInformationClass;
332 struct _FILE_OBJECT* FileObject;
337 BOOLEAN ReplaceIfExists;
347 PUNICODE_STRING FileName;
348 FILE_INFORMATION_CLASS FileInformationClass;
352 // Parameters for IRP_MN_QUERY_DEVICE_RELATIONS
355 DEVICE_RELATION_TYPE Type;
356 } QueryDeviceRelations;
358 // Parameters for IRP_MN_QUERY_INTERFACE
361 CONST GUID *InterfaceType;
364 PINTERFACE Interface;
365 PVOID InterfaceSpecificData;
368 // Parameters for IRP_MN_QUERY_CAPABILITIES
371 PDEVICE_CAPABILITIES Capabilities;
372 } DeviceCapabilities;
374 // Parameters for IRP_MN_FILTER_RESOURCE_REQUIREMENTS
377 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
378 } FilterResourceRequirements;
380 // Parameters for IRP_MN_QUERY_ID
383 BUS_QUERY_ID_TYPE IdType;
386 // Parameters for IRP_MN_QUERY_DEVICE_TEXT
389 DEVICE_TEXT_TYPE DeviceTextType;
393 // Parameters for IRP_MN_DEVICE_USAGE_NOTIFICATION
398 DEVICE_USAGE_NOTIFICATION_TYPE Type;
401 // Parameters for IRP_MN_WAIT_WAKE
404 SYSTEM_POWER_STATE PowerState;
407 // Parameter for IRP_MN_POWER_SEQUENCE
410 PPOWER_SEQUENCE PowerSequence;
413 // Parameters for IRP_MN_SET_POWER and IRP_MN_QUERY_POWER
417 POWER_STATE_TYPE Type;
419 POWER_ACTION ShutdownType;
422 // Parameters for IRP_MN_START_DEVICE
425 PCM_RESOURCE_LIST AllocatedResources;
426 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
429 /* Parameters for IRP_MN_SCSI_CLASS */
432 struct _SCSI_REQUEST_BLOCK *Srb;
435 //byte range file locking
438 PLARGE_INTEGER Length;
440 LARGE_INTEGER ByteOffset;
443 /* Paramters for other calls */
453 struct _DEVICE_OBJECT* DeviceObject;
454 struct _FILE_OBJECT* FileObject;
456 PIO_COMPLETION_ROUTINE CompletionRoutine;
457 PVOID CompletionContext;
459 } __attribute__((packed)) IO_STACK_LOCATION, *PIO_STACK_LOCATION;
462 typedef struct _IO_STATUS_BLOCK
466 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
469 typedef struct _IO_PIPE_CREATE_BUFFER
471 BOOLEAN WriteModeMessage;
472 BOOLEAN ReadModeMessage;
477 LARGE_INTEGER TimeOut;
478 } IO_PIPE_CREATE_BUFFER, *PIO_PIPE_CREATE_BUFFER;
481 typedef struct _IO_MAILSLOT_CREATE_BUFFER
483 ULONG Param; /* ?? */
484 ULONG MaxMessageSize;
485 LARGE_INTEGER TimeOut;
486 } IO_MAILSLOT_CREATE_BUFFER, *PIO_MAILSLOT_CREATE_BUFFER;
490 * Driver entry point declaration
492 typedef NTSTATUS STDCALL
493 (*PDRIVER_INITIALIZE)(struct _DRIVER_OBJECT* DriverObject,
494 PUNICODE_STRING RegistryPath);
497 * Driver cancel declaration
499 typedef NTSTATUS STDCALL
500 (*PDRIVER_CANCEL)(struct _DEVICE_OBJECT* DeviceObject,
501 struct _IRP* RegistryPath);
504 typedef struct _SECTION_OBJECT_POINTERS
506 PVOID DataSectionObject;
507 PVOID SharedCacheMap;
508 PVOID ImageSectionObject;
509 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
511 typedef struct _IO_COMPLETION_CONTEXT
515 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
517 #define FO_FILE_OPEN 0x00000001
518 #define FO_SYNCHRONOUS_IO 0x00000002
519 #define FO_ALERTABLE_IO 0x00000004
520 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
521 #define FO_WRITE_THROUGH 0x00000010
522 #define FO_SEQUENTIAL_ONLY 0x00000020
523 #define FO_CACHE_SUPPORTED 0x00000040
524 #define FO_NAMED_PIPE 0x00000080
525 #define FO_STREAM_FILE 0x00000100
526 #define FO_MAILSLOT 0x00000200
527 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
528 #define FO_DIRECT_DEVICE_OPEN 0x00000800
529 #define FO_FILE_MODIFIED 0x00001000
530 #define FO_FILE_SIZE_CHANGED 0x00002000
531 #define FO_CLEANUP_COMPLETE 0x00004000
532 #define FO_TEMPORARY_FILE 0x00008000
533 #define FO_DELETE_ON_CLOSE 0x00010000
534 #define FO_OPENED_CASE_SENSITIVE 0x00020000
535 #define FO_HANDLE_CREATED 0x00040000
536 #define FO_FILE_FAST_IO_READ 0x00080000
539 * ReactOS specific flags
541 #define FO_DIRECT_CACHE_READ 0x72000001
542 #define FO_DIRECT_CACHE_WRITE 0x72000002
543 #define FO_DIRECT_CACHE_PAGING_READ 0x72000004
544 #define FO_DIRECT_CACHE_PAGING_WRITE 0x72000008
545 #define FO_FCB_IS_VALID 0x72000010
547 typedef struct _FILE_OBJECT
551 struct _DEVICE_OBJECT* DeviceObject;
555 PSECTION_OBJECT_POINTERS SectionObjectPointers;
556 PVOID PrivateCacheMap;
557 NTSTATUS FinalStatus;
558 struct _FILE_OBJECT* RelatedFileObject;
559 BOOLEAN LockOperation;
560 BOOLEAN DeletePending;
563 BOOLEAN DeleteAccess;
566 BOOLEAN SharedDelete;
568 UNICODE_STRING FileName;
569 LARGE_INTEGER CurrentByteOffset;
575 PIO_COMPLETION_CONTEXT CompletionContext;
576 } FILE_OBJECT, *PFILE_OBJECT;
587 struct _IRP* MasterIrp;
591 LIST_ENTRY ThreadListEntry;
592 IO_STATUS_BLOCK IoStatus;
593 KPROCESSOR_MODE RequestorMode;
594 BOOLEAN PendingReturned;
596 CHAR CurrentLocation;
599 CCHAR ApcEnvironment;// CCHAR or PVOID?
600 UCHAR AllocationFlags;//UCHAR or ULONG?
601 PIO_STATUS_BLOCK UserIosb;
607 PIO_APC_ROUTINE UserApcRoutine;
608 PVOID UserApcContext;
609 } AsynchronousParameters;
610 LARGE_INTEGER AllocationSize;
612 PDRIVER_CANCEL CancelRoutine;
619 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
620 PVOID DriverContext[4];
622 struct _ETHREAD* Thread;
623 PCHAR AuxiliaryBuffer;
624 LIST_ENTRY ListEntry;
625 struct _IO_STACK_LOCATION* CurrentStackLocation;
626 PFILE_OBJECT OriginalFileObject;
631 IO_STACK_LOCATION Stack[1];
634 #define VPB_MOUNTED 0x00000001
635 #define VPB_LOCKED 0x00000002
636 #define VPB_PERSISTENT 0x00000004
637 #define VPB_REMOVE_PENDING 0x00000008
644 USHORT VolumeLabelLength;
645 struct _DEVICE_OBJECT* DeviceObject;
646 struct _DEVICE_OBJECT* RealDevice;
648 ULONG ReferenceCount;
649 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH];
653 typedef struct _DEVICE_OBJECT
658 struct _DRIVER_OBJECT* DriverObject;
659 struct _DEVICE_OBJECT* NextDevice;
660 struct _DEVICE_OBJECT* AttachedDevice;
661 struct _IRP* CurrentIrp;
664 ULONG Characteristics;
666 PVOID DeviceExtension;
667 DEVICE_TYPE DeviceType;
672 WAIT_CONTEXT_BLOCK Wcb;
674 ULONG AlignmentRequirement;
675 KDEVICE_QUEUE DeviceQueue;
677 ULONG ActiveThreadCount;
678 PSECURITY_DESCRIPTOR SecurityDescriptor;
682 struct _DEVOBJ_EXTENSION* DeviceObjectExtension;
684 } DEVICE_OBJECT, *PDEVICE_OBJECT;
688 * Fast i/o routine type declaration
690 //typedef NTSTATUS (*PFAST_IO_DISPATCH)(struct _DEVICE_OBJECT*, IRP*);
691 //FIXME : this type is ok for read and write, but not for all routines
692 typedef BOOLEAN STDCALL
693 (*PFAST_IO_ROUTINE)(IN struct _FILE_OBJECT *FileObject,
694 IN PLARGE_INTEGER FileOffset,
699 OUT PIO_STATUS_BLOCK IoStatus,
700 IN struct _DEVICE_OBJECT *DeviceObject);
702 typedef struct _FAST_IO_DISPATCH {
703 ULONG SizeOfFastIoDispatch;
704 PFAST_IO_ROUTINE FastIoCheckIfPossible;
705 PFAST_IO_ROUTINE FastIoRead;
706 PFAST_IO_ROUTINE FastIoWrite;
707 PFAST_IO_ROUTINE FastIoQueryBasicInfo;
708 PFAST_IO_ROUTINE FastIoQueryStandardInfo;
709 PFAST_IO_ROUTINE FastIoLock;
710 PFAST_IO_ROUTINE FastIoUnlockSingle;
711 PFAST_IO_ROUTINE FastIoUnlockAll;
712 PFAST_IO_ROUTINE FastIoUnlockAllByKey;
713 PFAST_IO_ROUTINE FastIoDeviceControl;
714 PFAST_IO_ROUTINE AcquireFileForNtCreateSection;
715 PFAST_IO_ROUTINE ReleaseFileForNtCreateSection;
716 PFAST_IO_ROUTINE FastIoDetachDevice;
717 PFAST_IO_ROUTINE FastIoQueryNetworkOpenInfo;
718 PFAST_IO_ROUTINE AcquireForModWrite;
719 PFAST_IO_ROUTINE MdlRead;
720 PFAST_IO_ROUTINE MdlReadComplete;
721 PFAST_IO_ROUTINE PrepareMdlWrite;
722 PFAST_IO_ROUTINE MdlWriteComplete;
723 PFAST_IO_ROUTINE FastIoReadCompressed;
724 PFAST_IO_ROUTINE FastIoWriteCompressed;
725 PFAST_IO_ROUTINE MdlReadCompleteCompressed;
726 PFAST_IO_ROUTINE MdlWriteCompleteCompressed;
727 PFAST_IO_ROUTINE FastIoQueryOpen;
728 PFAST_IO_ROUTINE ReleaseForModWrite;
729 PFAST_IO_ROUTINE AcquireForCcFlush;
730 PFAST_IO_ROUTINE ReleaseForCcFlush;
731 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
734 * Dispatch routine type declaration
736 typedef NTSTATUS STDCALL
737 (*PDRIVER_DISPATCH)(IN struct _DEVICE_OBJECT *DeviceObject,
738 IN struct _IRP *Irp);
741 * StartIo routine type declaration
744 (*PDRIVER_STARTIO)(IN PDEVICE_OBJECT DeviceObject,
748 * Unload routine type declaration
751 (*PDRIVER_UNLOAD)(IN struct _DRIVER_OBJECT *DriverObject);
754 * AddDevice routine type declaration
756 typedef NTSTATUS STDCALL
757 (*PDRIVER_ADD_DEVICE)(IN struct _DRIVER_OBJECT *DriverObject,
758 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
761 typedef struct _DRIVER_EXTENSION
763 struct _DRIVER_OBJECT* DriverObject;
764 PDRIVER_ADD_DEVICE AddDevice;
766 UNICODE_STRING ServiceKeyName;
767 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
771 struct _FAST_IO_DISPATCH_TABLE
774 PFAST_IO_DISPATCH Dispatch;
776 } FAST_IO_DISPATCH_TABLE, * PFAST_IO_DISPATCH_TABLE;
779 typedef struct _DRIVER_OBJECT
783 PDEVICE_OBJECT DeviceObject;
788 PDRIVER_EXTENSION DriverExtension;
789 UNICODE_STRING DriverName;
790 PUNICODE_STRING HardwareDatabase;
792 PFAST_IO_DISPATCH_TABLE FastIoDispatch;
794 PFAST_IO_DISPATCH FastIoDispatch;
796 PDRIVER_INITIALIZE DriverInit;
797 PDRIVER_STARTIO DriverStartIo;
798 PDRIVER_UNLOAD DriverUnload;
799 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
800 } DRIVER_OBJECT, *PDRIVER_OBJECT;
803 typedef struct _CONFIGURATION_INFORMATION
812 BOOLEAN AtDiskPrimaryAddressClaimed;
813 BOOLEAN AtDiskSecondaryAddressClaimed;
814 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
817 (*PIO_DPC_ROUTINE)(PKDPC Dpc,
818 PDEVICE_OBJECT DeviceObject,
823 (*PIO_TIMER_ROUTINE)(PDEVICE_OBJECT DeviceObject,
826 typedef struct _IO_WORKITEM *PIO_WORKITEM;
827 typedef VOID (*PIO_WORKITEM_ROUTINE)(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context);
829 #if WINDOWS_STRUCTS_DOESNT_ALREADY_DEFINE_THIS
830 typedef struct _PARTITION_INFORMATION
832 LARGE_INTEGER StartingOffset;
833 LARGE_INTEGER PartitionLength;
835 ULONG PartitionNumber;
837 BOOLEAN BootIndicator;
838 BOOLEAN RecognizedPartition;
839 BOOLEAN RewritePartition;
840 } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
843 typedef struct _DRIVER_LAYOUT_INFORMATION
845 ULONG PartitionCount;
847 PARTITION_INFORMATION PartitionEntry[1];
848 } DRIVER_LAYOUT_INFORMATION, *PDRIVER_LAYOUT_INFORMATION;
851 typedef IO_ALLOCATION_ACTION STDCALL
852 (*PDRIVER_CONTROL)(PDEVICE_OBJECT DeviceObject,
854 PVOID MapRegisterBase,
856 #if (_WIN32_WINNT >= 0x0400)
858 (*PFSDNOTIFICATIONPROC)(IN PDEVICE_OBJECT PtrTargetFileSystemDeviceObject,
859 IN BOOLEAN DriverActive);
860 #endif // (_WIN32_WINNT >= 0x0400)
862 #endif /* __INCLUDE_DDK_IOTYPES_H */