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 ************************************************************/
65 typedef VOID STDCALL_FUNC
66 (*PDRIVER_REINITIALIZE)(struct _DRIVER_OBJECT* DriverObject,
70 typedef NTSTATUS STDCALL_FUNC
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_FUNC
84 (*PIO_COMPLETION_ROUTINE)(struct _DEVICE_OBJECT* DeviceObject,
88 typedef VOID STDCALL_FUNC
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;
198 /* MicroChannel bus data */
200 typedef struct _CM_MCA_POS_DATA
207 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
210 /* Int13 drive geometry data */
212 typedef struct _CM_INT13_DRIVE_PARAMETER
216 USHORT SectorsPerTrack;
219 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
222 /* Extended drive geometry data */
224 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
226 ULONG BytesPerSector;
227 ULONG NumberOfCylinders;
228 ULONG SectorsPerTrack;
230 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
236 UCHAR ShareDisposition;
242 PHYSICAL_ADDRESS Start;
244 } __attribute__((packed)) Port;
250 } __attribute__((packed))Interrupt;
253 PHYSICAL_ADDRESS Start;
255 } __attribute__((packed))Memory;
261 } __attribute__((packed))Dma;
267 } __attribute__((packed))DeviceSpecificData;
268 } __attribute__((packed)) u;
269 } __attribute__((packed)) CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
276 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
277 } __attribute__((packed))CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
281 INTERFACE_TYPE InterfaceType;
283 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
284 } __attribute__((packed)) CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
289 CM_FULL_RESOURCE_DESCRIPTOR List[1];
290 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
294 * PURPOSE: IRP stack location
296 typedef struct __attribute__((packed)) _IO_STACK_LOCATION
307 PIO_SECURITY_CONTEXT SecurityContext;
309 USHORT FileAttributes;
317 LARGE_INTEGER ByteOffset;
323 LARGE_INTEGER ByteOffset;
327 ULONG OutputBufferLength;
328 ULONG InputBufferLength;
330 PVOID Type3InputBuffer;
334 ULONG OutputBufferLength;
335 ULONG InputBufferLength;
337 PVOID Type3InputBuffer;
342 struct _DEVICE_OBJECT* DeviceObject;
347 struct _DEVICE_OBJECT* DeviceObject;
352 FILE_INFORMATION_CLASS FileInformationClass;
357 FS_INFORMATION_CLASS FsInformationClass;
362 FS_INFORMATION_CLASS FsInformationClass;
367 FILE_INFORMATION_CLASS FileInformationClass;
368 struct _FILE_OBJECT* FileObject;
373 BOOLEAN ReplaceIfExists;
383 PUNICODE_STRING FileName;
384 FILE_INFORMATION_CLASS FileInformationClass;
388 // Parameters for IRP_MN_QUERY_DEVICE_RELATIONS
391 DEVICE_RELATION_TYPE Type;
392 } QueryDeviceRelations;
394 // Parameters for IRP_MN_QUERY_INTERFACE
397 CONST GUID *InterfaceType;
400 PINTERFACE Interface;
401 PVOID InterfaceSpecificData;
404 // Parameters for IRP_MN_QUERY_CAPABILITIES
407 PDEVICE_CAPABILITIES Capabilities;
408 } DeviceCapabilities;
410 // Parameters for IRP_MN_FILTER_RESOURCE_REQUIREMENTS
413 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
414 } FilterResourceRequirements;
416 // Parameters for IRP_MN_QUERY_ID
419 BUS_QUERY_ID_TYPE IdType;
422 // Parameters for IRP_MN_QUERY_DEVICE_TEXT
425 DEVICE_TEXT_TYPE DeviceTextType;
429 // Parameters for IRP_MN_DEVICE_USAGE_NOTIFICATION
434 DEVICE_USAGE_NOTIFICATION_TYPE Type;
437 // Parameters for IRP_MN_WAIT_WAKE
440 SYSTEM_POWER_STATE PowerState;
443 // Parameter for IRP_MN_POWER_SEQUENCE
446 PPOWER_SEQUENCE PowerSequence;
449 // Parameters for IRP_MN_SET_POWER and IRP_MN_QUERY_POWER
453 POWER_STATE_TYPE Type;
455 POWER_ACTION ShutdownType;
458 // Parameters for IRP_MN_START_DEVICE
461 PCM_RESOURCE_LIST AllocatedResources;
462 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
465 /* Parameters for IRP_MN_SCSI_CLASS */
468 struct _SCSI_REQUEST_BLOCK *Srb;
471 //byte range file locking
474 PLARGE_INTEGER Length;
476 LARGE_INTEGER ByteOffset;
479 /* Paramters for other calls */
489 struct _DEVICE_OBJECT* DeviceObject;
490 struct _FILE_OBJECT* FileObject;
492 PIO_COMPLETION_ROUTINE CompletionRoutine;
493 PVOID CompletionContext;
495 } __attribute__((packed)) IO_STACK_LOCATION, *PIO_STACK_LOCATION;
498 typedef struct _IO_STATUS_BLOCK
502 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
504 typedef struct _IO_COMPLETION_PACKET{
507 IO_STATUS_BLOCK IoStatus;
508 LIST_ENTRY ListEntry;
509 } IO_COMPLETION_PACKET, *PIO_COMPLETION_PACKET;
511 typedef struct _IO_PIPE_CREATE_BUFFER
513 BOOLEAN WriteModeMessage;
514 BOOLEAN ReadModeMessage;
519 LARGE_INTEGER TimeOut;
520 } IO_PIPE_CREATE_BUFFER, *PIO_PIPE_CREATE_BUFFER;
523 typedef struct _IO_MAILSLOT_CREATE_BUFFER
525 ULONG Param; /* ?? */
526 ULONG MaxMessageSize;
527 LARGE_INTEGER TimeOut;
528 } IO_MAILSLOT_CREATE_BUFFER, *PIO_MAILSLOT_CREATE_BUFFER;
532 * Driver entry point declaration
534 typedef NTSTATUS STDCALL_FUNC
535 (*PDRIVER_INITIALIZE)(struct _DRIVER_OBJECT* DriverObject,
536 PUNICODE_STRING RegistryPath);
539 * Driver cancel declaration
541 typedef NTSTATUS STDCALL_FUNC
542 (*PDRIVER_CANCEL)(struct _DEVICE_OBJECT* DeviceObject,
543 struct _IRP* RegistryPath);
546 typedef struct _SECTION_OBJECT_POINTERS
548 PVOID DataSectionObject;
549 PVOID SharedCacheMap;
550 PVOID ImageSectionObject;
551 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
553 typedef struct _IO_COMPLETION_CONTEXT
557 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
559 #define FO_FILE_OPEN 0x00000001
560 #define FO_SYNCHRONOUS_IO 0x00000002
561 #define FO_ALERTABLE_IO 0x00000004
562 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
563 #define FO_WRITE_THROUGH 0x00000010
564 #define FO_SEQUENTIAL_ONLY 0x00000020
565 #define FO_CACHE_SUPPORTED 0x00000040
566 #define FO_NAMED_PIPE 0x00000080
567 #define FO_STREAM_FILE 0x00000100
568 #define FO_MAILSLOT 0x00000200
569 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
570 #define FO_DIRECT_DEVICE_OPEN 0x00000800
571 #define FO_FILE_MODIFIED 0x00001000
572 #define FO_FILE_SIZE_CHANGED 0x00002000
573 #define FO_CLEANUP_COMPLETE 0x00004000
574 #define FO_TEMPORARY_FILE 0x00008000
575 #define FO_DELETE_ON_CLOSE 0x00010000
576 #define FO_OPENED_CASE_SENSITIVE 0x00020000
577 #define FO_HANDLE_CREATED 0x00040000
578 #define FO_FILE_FAST_IO_READ 0x00080000
581 * ReactOS specific flags
583 #define FO_DIRECT_CACHE_READ 0x72000001
584 #define FO_DIRECT_CACHE_WRITE 0x72000002
585 #define FO_DIRECT_CACHE_PAGING_READ 0x72000004
586 #define FO_DIRECT_CACHE_PAGING_WRITE 0x72000008
587 #define FO_FCB_IS_VALID 0x72000010
589 typedef struct _FILE_OBJECT
593 struct _DEVICE_OBJECT* DeviceObject;
597 PSECTION_OBJECT_POINTERS SectionObjectPointers;
598 PVOID PrivateCacheMap;
599 NTSTATUS FinalStatus;
600 struct _FILE_OBJECT* RelatedFileObject;
601 BOOLEAN LockOperation;
602 BOOLEAN DeletePending;
605 BOOLEAN DeleteAccess;
608 BOOLEAN SharedDelete;
610 UNICODE_STRING FileName;
611 LARGE_INTEGER CurrentByteOffset;
617 PIO_COMPLETION_CONTEXT CompletionContext;
618 } FILE_OBJECT, *PFILE_OBJECT;
629 struct _IRP* MasterIrp;
633 LIST_ENTRY ThreadListEntry;
634 IO_STATUS_BLOCK IoStatus;
635 KPROCESSOR_MODE RequestorMode;
636 BOOLEAN PendingReturned;
638 CHAR CurrentLocation;
641 CCHAR ApcEnvironment;// CCHAR or PVOID?
642 UCHAR AllocationFlags;//UCHAR or ULONG?
643 PIO_STATUS_BLOCK UserIosb;
649 PIO_APC_ROUTINE UserApcRoutine;
650 PVOID UserApcContext;
651 } AsynchronousParameters;
652 LARGE_INTEGER AllocationSize;
654 PDRIVER_CANCEL CancelRoutine;
661 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
662 PVOID DriverContext[4];
664 struct _ETHREAD* Thread;
665 PCHAR AuxiliaryBuffer;
666 LIST_ENTRY ListEntry;
667 struct _IO_STACK_LOCATION* CurrentStackLocation;
668 PFILE_OBJECT OriginalFileObject;
673 IO_STACK_LOCATION Stack[1];
676 #define VPB_MOUNTED 0x00000001
677 #define VPB_LOCKED 0x00000002
678 #define VPB_PERSISTENT 0x00000004
679 #define VPB_REMOVE_PENDING 0x00000008
686 USHORT VolumeLabelLength;
687 struct _DEVICE_OBJECT* DeviceObject;
688 struct _DEVICE_OBJECT* RealDevice;
690 ULONG ReferenceCount;
691 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH];
695 typedef struct _DEVICE_OBJECT
700 struct _DRIVER_OBJECT* DriverObject;
701 struct _DEVICE_OBJECT* NextDevice;
702 struct _DEVICE_OBJECT* AttachedDevice;
703 struct _IRP* CurrentIrp;
706 ULONG Characteristics;
708 PVOID DeviceExtension;
709 DEVICE_TYPE DeviceType;
714 WAIT_CONTEXT_BLOCK Wcb;
716 ULONG AlignmentRequirement;
717 KDEVICE_QUEUE DeviceQueue;
719 ULONG ActiveThreadCount;
720 PSECURITY_DESCRIPTOR SecurityDescriptor;
724 struct _DEVOBJ_EXTENSION* DeviceObjectExtension;
726 } DEVICE_OBJECT, *PDEVICE_OBJECT;
730 * Fast i/o routine type declaration
732 //typedef NTSTATUS (*PFAST_IO_DISPATCH)(struct _DEVICE_OBJECT*, IRP*);
733 //FIXME : this type is ok for read and write, but not for all routines
734 typedef BOOLEAN STDCALL_FUNC
735 (*PFAST_IO_ROUTINE)(IN struct _FILE_OBJECT *FileObject,
736 IN PLARGE_INTEGER FileOffset,
741 OUT PIO_STATUS_BLOCK IoStatus,
742 IN struct _DEVICE_OBJECT *DeviceObject);
744 typedef struct _FAST_IO_DISPATCH {
745 ULONG SizeOfFastIoDispatch;
746 PFAST_IO_ROUTINE FastIoCheckIfPossible;
747 PFAST_IO_ROUTINE FastIoRead;
748 PFAST_IO_ROUTINE FastIoWrite;
749 PFAST_IO_ROUTINE FastIoQueryBasicInfo;
750 PFAST_IO_ROUTINE FastIoQueryStandardInfo;
751 PFAST_IO_ROUTINE FastIoLock;
752 PFAST_IO_ROUTINE FastIoUnlockSingle;
753 PFAST_IO_ROUTINE FastIoUnlockAll;
754 PFAST_IO_ROUTINE FastIoUnlockAllByKey;
755 PFAST_IO_ROUTINE FastIoDeviceControl;
756 PFAST_IO_ROUTINE AcquireFileForNtCreateSection;
757 PFAST_IO_ROUTINE ReleaseFileForNtCreateSection;
758 PFAST_IO_ROUTINE FastIoDetachDevice;
759 PFAST_IO_ROUTINE FastIoQueryNetworkOpenInfo;
760 PFAST_IO_ROUTINE AcquireForModWrite;
761 PFAST_IO_ROUTINE MdlRead;
762 PFAST_IO_ROUTINE MdlReadComplete;
763 PFAST_IO_ROUTINE PrepareMdlWrite;
764 PFAST_IO_ROUTINE MdlWriteComplete;
765 PFAST_IO_ROUTINE FastIoReadCompressed;
766 PFAST_IO_ROUTINE FastIoWriteCompressed;
767 PFAST_IO_ROUTINE MdlReadCompleteCompressed;
768 PFAST_IO_ROUTINE MdlWriteCompleteCompressed;
769 PFAST_IO_ROUTINE FastIoQueryOpen;
770 PFAST_IO_ROUTINE ReleaseForModWrite;
771 PFAST_IO_ROUTINE AcquireForCcFlush;
772 PFAST_IO_ROUTINE ReleaseForCcFlush;
773 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
776 * Dispatch routine type declaration
778 typedef NTSTATUS STDCALL_FUNC
779 (*PDRIVER_DISPATCH)(IN struct _DEVICE_OBJECT *DeviceObject,
780 IN struct _IRP *Irp);
783 * StartIo routine type declaration
785 typedef VOID STDCALL_FUNC
786 (*PDRIVER_STARTIO)(IN PDEVICE_OBJECT DeviceObject,
790 * Unload routine type declaration
792 typedef VOID STDCALL_FUNC
793 (*PDRIVER_UNLOAD)(IN struct _DRIVER_OBJECT *DriverObject);
796 * AddDevice routine type declaration
798 typedef NTSTATUS STDCALL_FUNC
799 (*PDRIVER_ADD_DEVICE)(IN struct _DRIVER_OBJECT *DriverObject,
800 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
803 typedef struct _DRIVER_EXTENSION
805 struct _DRIVER_OBJECT* DriverObject;
806 PDRIVER_ADD_DEVICE AddDevice;
808 UNICODE_STRING ServiceKeyName;
809 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
813 struct _FAST_IO_DISPATCH_TABLE
816 PFAST_IO_DISPATCH Dispatch;
818 } FAST_IO_DISPATCH_TABLE, * PFAST_IO_DISPATCH_TABLE;
821 typedef struct _DRIVER_OBJECT
825 PDEVICE_OBJECT DeviceObject;
830 PDRIVER_EXTENSION DriverExtension;
831 UNICODE_STRING DriverName;
832 PUNICODE_STRING HardwareDatabase;
834 PFAST_IO_DISPATCH_TABLE FastIoDispatch;
836 PFAST_IO_DISPATCH FastIoDispatch;
838 PDRIVER_INITIALIZE DriverInit;
839 PDRIVER_STARTIO DriverStartIo;
840 PDRIVER_UNLOAD DriverUnload;
841 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
842 } DRIVER_OBJECT, *PDRIVER_OBJECT;
845 typedef struct _CONFIGURATION_INFORMATION
854 BOOLEAN AtDiskPrimaryAddressClaimed;
855 BOOLEAN AtDiskSecondaryAddressClaimed;
856 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
858 typedef VOID STDCALL_FUNC
859 (*PIO_DPC_ROUTINE)(PKDPC Dpc,
860 PDEVICE_OBJECT DeviceObject,
864 typedef VOID STDCALL_FUNC
865 (*PIO_TIMER_ROUTINE)(PDEVICE_OBJECT DeviceObject,
868 typedef struct _IO_WORKITEM *PIO_WORKITEM;
869 typedef VOID (*PIO_WORKITEM_ROUTINE)(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context);
871 #if WINDOWS_STRUCTS_DOESNT_ALREADY_DEFINE_THIS
872 typedef struct _PARTITION_INFORMATION
874 LARGE_INTEGER StartingOffset;
875 LARGE_INTEGER PartitionLength;
877 ULONG PartitionNumber;
879 BOOLEAN BootIndicator;
880 BOOLEAN RecognizedPartition;
881 BOOLEAN RewritePartition;
882 } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
885 typedef struct _DRIVER_LAYOUT_INFORMATION
887 ULONG PartitionCount;
889 PARTITION_INFORMATION PartitionEntry[1];
890 } DRIVER_LAYOUT_INFORMATION, *PDRIVER_LAYOUT_INFORMATION;
893 typedef IO_ALLOCATION_ACTION STDCALL_FUNC
894 (*PDRIVER_CONTROL)(PDEVICE_OBJECT DeviceObject,
896 PVOID MapRegisterBase,
898 #if (_WIN32_WINNT >= 0x0400)
899 typedef VOID STDCALL_FUNC
900 (*PFSDNOTIFICATIONPROC)(IN PDEVICE_OBJECT PtrTargetFileSystemDeviceObject,
901 IN BOOLEAN DriverActive);
902 #endif // (_WIN32_WINNT >= 0x0400)
904 #endif /* __INCLUDE_DDK_IOTYPES_H */