d04fd7f5a5b79fd96ed78180b106ccc95a132117
[reactos.git] / include / ddk / iotypes.h
1 /* $Id$
2  *
3  */
4
5 #ifndef __INCLUDE_DDK_IOTYPES_H
6 #define __INCLUDE_DDK_IOTYPES_H
7
8 #include <ntos/disk.h>
9 #include <ntos/file.h>
10
11 #ifdef __NTOSKRNL__
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;
17 #else
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;
23 #endif
24
25 /*
26  * These are referenced before they can be fully defined
27  */
28 struct _DRIVER_OBJECT;
29 struct _FILE_OBJECT;
30 struct _DEVICE_OBJECT;
31 struct _IRP;
32 struct _IO_STATUS_BLOCK;
33 struct _SCSI_REQUEST_BLOCK;
34
35 /* SIMPLE TYPES *************************************************************/
36
37 enum
38 {
39    DeallocateObject,
40    KeepObject,
41 };
42
43
44 typedef enum _CREATE_FILE_TYPE
45 {
46    CreateFileTypeNone,
47    CreateFileTypeNamedPipe,
48    CreateFileTypeMailslot
49 } CREATE_FILE_TYPE;
50
51
52 typedef struct _SHARE_ACCESS
53 {
54    ULONG OpenCount;
55    ULONG Readers;
56    ULONG Writers;
57    ULONG Deleters;
58    ULONG SharedRead;
59    ULONG SharedWrite;
60    ULONG SharedDelete;
61 } SHARE_ACCESS, *PSHARE_ACCESS;
62
63 /* FUNCTION TYPES ************************************************************/
64
65 typedef VOID STDCALL
66 (*PDRIVER_REINITIALIZE)(struct _DRIVER_OBJECT* DriverObject,
67                         PVOID Context,
68                         ULONG Count);
69
70 typedef NTSTATUS STDCALL
71 (*PIO_QUERY_DEVICE_ROUTINE)(PVOID Context,
72                             PUNICODE_STRING Pathname,
73                             INTERFACE_TYPE BusType,
74                             ULONG BusNumber,
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);
82
83 typedef NTSTATUS STDCALL
84 (*PIO_COMPLETION_ROUTINE)(struct _DEVICE_OBJECT* DeviceObject,
85                           struct _IRP* Irp,
86                           PVOID Context);
87
88 typedef VOID STDCALL
89 (*PIO_APC_ROUTINE)(PVOID ApcContext,
90                    struct _IO_STATUS_BLOCK* IoStatusBlock,
91                    ULONG Reserved);
92
93
94 /* STRUCTURE TYPES ***********************************************************/
95
96 typedef struct _ADAPTER_OBJECT ADAPTER_OBJECT, *PADAPTER_OBJECT;
97
98 /*
99  * PURPOSE: Special timer associated with each device
100  * NOTES: This is a guess
101  */
102 typedef struct _IO_TIMER
103 {
104    KTIMER timer;
105    KDPC dpc;
106 } IO_TIMER, *PIO_TIMER;
107
108 typedef struct _IO_SECURITY_CONTEXT
109 {
110    PSECURITY_QUALITY_OF_SERVICE SecurityQos;
111    PACCESS_STATE AccessState;
112    ACCESS_MASK DesiredAccess;
113    ULONG FullCreateOptions;
114 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
115
116
117 typedef struct _IO_RESOURCE_DESCRIPTOR
118 {
119    UCHAR Option;
120    UCHAR Type;
121    UCHAR ShareDisposition;
122    
123    /*
124     * Reserved for system use
125     */
126    UCHAR Spare1;
127    
128    USHORT Flags;
129    
130    /*
131     * Reserved for system use
132     */
133    UCHAR Spare2;
134    
135    union
136      {
137         struct
138           {
139              ULONG Length;
140              ULONG Alignment;
141              PHYSICAL_ADDRESS MinimumAddress;
142              PHYSICAL_ADDRESS MaximumAddress;
143           } Port;
144         struct
145           {
146              ULONG Length;
147              ULONG Alignment;
148              PHYSICAL_ADDRESS MinimumAddress;
149              PHYSICAL_ADDRESS MaximumAddress;
150           } Memory;
151         struct
152           { 
153              ULONG MinimumVector;
154              ULONG MaximumVector;
155           } Interrupt;
156         struct
157           {
158              ULONG MinimumChannel;
159              ULONG MaximumChannel;
160           } Dma;
161      } u;
162 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
163
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
169
170 typedef struct _IO_RESOURCE_LIST
171 {
172    USHORT Version;
173    USHORT Revision;
174    ULONG Count;
175    IO_RESOURCE_DESCRIPTOR Descriptors[1];
176 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
177
178 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST
179 {
180    /*
181     * List size in bytes
182     */
183    ULONG ListSize;
184    
185    /*
186     * System defined enum for the bus
187     */
188    INTERFACE_TYPE InterfaceType;
189    
190    ULONG BusNumber;
191    ULONG SlotNumber;
192    ULONG Reserved[3];
193    ULONG AlternativeLists;
194    IO_RESOURCE_LIST List[1];
195 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
196
197 typedef struct
198 {
199    UCHAR Type;
200    UCHAR ShareDisposition;
201    USHORT Flags;
202    union
203      {
204         struct
205           {
206              PHYSICAL_ADDRESS Start;
207              ULONG Length;
208           } __attribute__((packed)) Port;
209         struct
210           {
211              ULONG Level;
212              ULONG Vector;
213              ULONG Affinity;
214           } __attribute__((packed))Interrupt;
215         struct
216           {
217              PHYSICAL_ADDRESS Start;
218              ULONG Length;
219           } __attribute__((packed))Memory;
220         struct
221           {
222              ULONG Channel;
223              ULONG Port;
224              ULONG Reserved1;
225           } __attribute__((packed))Dma;
226         struct
227           {
228              ULONG DataSize;
229              ULONG Reserved1;
230              ULONG Reserved2;
231           } __attribute__((packed))DeviceSpecificData;
232      } __attribute__((packed)) u;
233 } __attribute__((packed)) CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
234
235 typedef struct
236 {
237    USHORT Version;
238    USHORT Revision;
239    ULONG Count;
240    CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
241 } __attribute__((packed))CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
242
243 typedef struct
244 {
245    INTERFACE_TYPE InterfaceType;
246    ULONG BusNumber;
247    CM_PARTIAL_RESOURCE_LIST PartialResourceList;
248 } __attribute__((packed)) CM_FULL_RESOURCE_DESCRIPTOR;
249
250 typedef struct
251 {
252    ULONG Count;
253    CM_FULL_RESOURCE_DESCRIPTOR List[1];
254 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
255
256
257 /*
258  * PURPOSE: IRP stack location
259  */
260 typedef struct __attribute__((packed)) _IO_STACK_LOCATION
261 {
262   UCHAR MajorFunction;
263   UCHAR MinorFunction;
264   UCHAR Flags;
265   UCHAR Control;
266   
267   union
268     {
269       struct
270         {
271           PIO_SECURITY_CONTEXT SecurityContext;
272           ULONG Options;
273           USHORT FileAttributes;
274           USHORT ShareAccess;
275           ULONG EaLength;
276         } Create;
277       struct
278         {
279           ULONG Length;
280           ULONG Key;
281           LARGE_INTEGER ByteOffset;
282         } Read;
283       struct
284         {
285           ULONG Length;
286           ULONG Key;
287           LARGE_INTEGER ByteOffset;
288         } Write;
289       struct
290         {
291           ULONG OutputBufferLength;
292           ULONG InputBufferLength;
293           ULONG IoControlCode;
294           PVOID Type3InputBuffer;
295         } DeviceIoControl;
296       struct
297         {
298           ULONG OutputBufferLength;
299           ULONG InputBufferLength;
300           ULONG IoControlCode;
301           PVOID Type3InputBuffer;
302         } FileSystemControl;
303       struct
304         {
305           struct _VPB* Vpb;
306           struct _DEVICE_OBJECT* DeviceObject;
307         } MountVolume;
308       struct
309         {
310           struct _VPB* Vpb;
311           struct _DEVICE_OBJECT* DeviceObject;
312         } VerifyVolume;
313       struct
314         {
315           ULONG Length;
316           FILE_INFORMATION_CLASS FileInformationClass;
317         } QueryFile;
318       struct
319         {
320           ULONG Length;
321           FS_INFORMATION_CLASS FsInformationClass;
322         } QueryVolume;
323       struct
324         {
325           ULONG Length;
326           FS_INFORMATION_CLASS FsInformationClass;
327         } SetVolume;
328       struct
329         {
330           ULONG Length;
331           FILE_INFORMATION_CLASS FileInformationClass;
332           struct _FILE_OBJECT* FileObject;
333           union
334             {
335               struct
336                 {
337                   BOOLEAN ReplaceIfExists;
338                   BOOLEAN AdvanceOnly;
339                 } d;
340               ULONG ClusterCount;
341               HANDLE DeleteHandle;
342             } u;
343         } SetFile;
344       struct
345         {
346           ULONG Length;
347           PUNICODE_STRING FileName;
348           FILE_INFORMATION_CLASS FileInformationClass;
349           ULONG FileIndex;
350         } QueryDirectory;
351
352       // Parameters for IRP_MN_QUERY_DEVICE_RELATIONS
353       struct
354         {
355           DEVICE_RELATION_TYPE Type;
356         } QueryDeviceRelations;
357
358       // Parameters for IRP_MN_QUERY_INTERFACE
359       struct
360         {
361           CONST GUID *InterfaceType;
362           USHORT Size;
363           USHORT Version;
364           PINTERFACE Interface;
365           PVOID InterfaceSpecificData;
366         } QueryInterface;
367
368       // Parameters for IRP_MN_QUERY_CAPABILITIES
369       struct
370         {
371           PDEVICE_CAPABILITIES Capabilities;
372         } DeviceCapabilities;
373
374       // Parameters for IRP_MN_FILTER_RESOURCE_REQUIREMENTS
375       struct
376         {
377       PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
378     } FilterResourceRequirements;
379
380       // Parameters for IRP_MN_QUERY_ID
381       struct
382         {
383           BUS_QUERY_ID_TYPE IdType;
384         } QueryId;
385
386       // Parameters for IRP_MN_QUERY_DEVICE_TEXT
387       struct
388         {
389           DEVICE_TEXT_TYPE DeviceTextType;
390           LCID LocaleId;
391         } QueryDeviceText;
392
393       // Parameters for IRP_MN_DEVICE_USAGE_NOTIFICATION
394       struct
395         {
396           BOOLEAN InPath;
397           BOOLEAN Reserved[3];
398           DEVICE_USAGE_NOTIFICATION_TYPE Type;
399         } UsageNotification;
400
401       // Parameters for IRP_MN_WAIT_WAKE
402       struct
403         {
404           SYSTEM_POWER_STATE PowerState;
405         } WaitWake;
406
407       // Parameter for IRP_MN_POWER_SEQUENCE
408       struct
409         {
410           PPOWER_SEQUENCE PowerSequence;
411         } PowerSequence;
412
413       // Parameters for IRP_MN_SET_POWER and IRP_MN_QUERY_POWER
414       struct
415         {
416           ULONG SystemContext;
417           POWER_STATE_TYPE Type;
418           POWER_STATE State;
419           POWER_ACTION ShutdownType;
420         } Power;
421
422       // Parameters for IRP_MN_START_DEVICE
423       struct
424         {
425           PCM_RESOURCE_LIST AllocatedResources;
426           PCM_RESOURCE_LIST AllocatedResourcesTranslated;
427         } StartDevice;
428
429       /* Parameters for IRP_MN_SCSI_CLASS */
430       struct
431         {
432           struct _SCSI_REQUEST_BLOCK *Srb;
433         } Scsi;
434
435       /* Paramters for other calls */
436       struct
437         {
438           PVOID Argument1;
439           PVOID Argument2;
440           PVOID Argument3;
441           PVOID Argument4;
442         } Others;
443     } Parameters;
444   
445   struct _DEVICE_OBJECT* DeviceObject;
446   struct _FILE_OBJECT* FileObject;
447
448   PIO_COMPLETION_ROUTINE CompletionRoutine;
449   PVOID CompletionContext;
450
451 } __attribute__((packed)) IO_STACK_LOCATION, *PIO_STACK_LOCATION;
452
453
454 typedef struct _IO_STATUS_BLOCK
455 {
456   NTSTATUS Status;
457   ULONG Information;
458 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
459
460
461 typedef struct _IO_PIPE_CREATE_BUFFER
462 {
463    BOOLEAN WriteModeMessage;
464    BOOLEAN ReadModeMessage;
465    BOOLEAN NonBlocking;
466    ULONG MaxInstances;
467    ULONG InBufferSize;
468    ULONG OutBufferSize;
469    LARGE_INTEGER TimeOut;
470 } IO_PIPE_CREATE_BUFFER, *PIO_PIPE_CREATE_BUFFER;
471
472
473 typedef struct _IO_MAILSLOT_CREATE_BUFFER
474 {
475    ULONG Param; /* ?? */
476    ULONG MaxMessageSize;
477    LARGE_INTEGER TimeOut;
478 } IO_MAILSLOT_CREATE_BUFFER, *PIO_MAILSLOT_CREATE_BUFFER;
479
480
481 /*
482  * Driver entry point declaration
483  */
484 typedef NTSTATUS STDCALL
485 (*PDRIVER_INITIALIZE)(struct _DRIVER_OBJECT* DriverObject,
486                       PUNICODE_STRING RegistryPath);
487
488 /*
489  * Driver cancel declaration
490  */
491 typedef NTSTATUS STDCALL
492 (*PDRIVER_CANCEL)(struct _DEVICE_OBJECT* DeviceObject,
493                   struct _IRP* RegistryPath);
494
495
496 typedef struct _SECTION_OBJECT_POINTERS
497 {
498    PVOID DataSectionObject;
499    PVOID SharedCacheMap;
500    PVOID ImageSectionObject;
501 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
502
503 typedef struct _IO_COMPLETION_CONTEXT
504 {
505    PVOID Port;
506    ULONG Key;
507 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
508
509 #define FO_FILE_OPEN                    0x00000001
510 #define FO_SYNCHRONOUS_IO               0x00000002
511 #define FO_ALERTABLE_IO                 0x00000004
512 #define FO_NO_INTERMEDIATE_BUFFERING    0x00000008
513 #define FO_WRITE_THROUGH                0x00000010
514 #define FO_SEQUENTIAL_ONLY              0x00000020
515 #define FO_CACHE_SUPPORTED              0x00000040
516 #define FO_NAMED_PIPE                   0x00000080
517 #define FO_STREAM_FILE                  0x00000100
518 #define FO_MAILSLOT                     0x00000200
519 #define FO_GENERATE_AUDIT_ON_CLOSE      0x00000400
520 #define FO_DIRECT_DEVICE_OPEN           0x00000800
521 #define FO_FILE_MODIFIED                0x00001000
522 #define FO_FILE_SIZE_CHANGED            0x00002000
523 #define FO_CLEANUP_COMPLETE             0x00004000
524 #define FO_TEMPORARY_FILE               0x00008000
525 #define FO_DELETE_ON_CLOSE              0x00010000
526 #define FO_OPENED_CASE_SENSITIVE        0x00020000
527 #define FO_HANDLE_CREATED               0x00040000
528 #define FO_FILE_FAST_IO_READ            0x00080000
529
530 /*
531  * ReactOS specific flags
532  */
533 #define FO_DIRECT_CACHE_READ            0x72000001
534 #define FO_DIRECT_CACHE_WRITE           0x72000002
535 #define FO_DIRECT_CACHE_PAGING_READ     0x72000004
536 #define FO_DIRECT_CACHE_PAGING_WRITE    0x72000008
537 #define FO_FCB_IS_VALID                 0x72000010
538
539 typedef struct _FILE_OBJECT
540 {
541    CSHORT Type;
542    CSHORT Size;
543    struct _DEVICE_OBJECT* DeviceObject;
544    struct _VPB* Vpb;
545    PVOID FsContext;
546    PVOID FsContext2;
547    PSECTION_OBJECT_POINTERS SectionObjectPointers;
548    PVOID PrivateCacheMap;
549    NTSTATUS FinalStatus;
550    struct _FILE_OBJECT* RelatedFileObject;
551    BOOLEAN LockOperation;
552    BOOLEAN DeletePending;
553    BOOLEAN ReadAccess;
554    BOOLEAN WriteAccess;
555    BOOLEAN DeleteAccess;
556    BOOLEAN SharedRead;
557    BOOLEAN SharedWrite;
558    BOOLEAN SharedDelete;
559    ULONG Flags;
560    UNICODE_STRING FileName;
561    LARGE_INTEGER CurrentByteOffset;
562    ULONG Waiters;
563    ULONG Busy;
564    PVOID LastLock;
565    KEVENT Lock;
566    KEVENT Event;
567    PIO_COMPLETION_CONTEXT CompletionContext;
568 } FILE_OBJECT, *PFILE_OBJECT;
569
570
571 typedef struct _IRP
572 {
573    CSHORT Type;
574    USHORT Size;
575    PMDL MdlAddress;
576    ULONG Flags;
577    union
578      {
579         struct _IRP* MasterIrp;
580         LONG IrpCount;
581         PVOID SystemBuffer;     
582      } AssociatedIrp;
583    LIST_ENTRY ThreadListEntry;
584    IO_STATUS_BLOCK IoStatus;
585    KPROCESSOR_MODE RequestorMode;
586    BOOLEAN PendingReturned;
587    CHAR StackCount;
588    CHAR CurrentLocation;
589    BOOLEAN Cancel;
590    KIRQL CancelIrql;
591    CCHAR ApcEnvironment;// CCHAR or PVOID?
592    UCHAR AllocationFlags;//UCHAR or ULONG?
593    PIO_STATUS_BLOCK UserIosb;
594    PKEVENT UserEvent;
595    union
596      {
597         struct
598           {
599              PIO_APC_ROUTINE UserApcRoutine;
600              PVOID UserApcContext;
601           } AsynchronousParameters;
602         LARGE_INTEGER AllocationSize;
603      } Overlay;
604    PDRIVER_CANCEL CancelRoutine;
605    PVOID UserBuffer;
606    union
607      {
608         struct
609           {
610              union {
611                KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
612                PVOID DriverContext[4];
613              };
614              struct _ETHREAD* Thread;
615              PCHAR AuxiliaryBuffer;
616              LIST_ENTRY ListEntry;
617              struct _IO_STACK_LOCATION* CurrentStackLocation;
618              PFILE_OBJECT OriginalFileObject;
619           } Overlay;
620         KAPC Apc;
621         ULONG CompletionKey;
622      } Tail;
623    IO_STACK_LOCATION Stack[1];
624 } IRP, *PIRP;
625
626 #define VPB_MOUNTED                     0x00000001
627 #define VPB_LOCKED                      0x00000002
628 #define VPB_PERSISTENT                  0x00000004
629 #define VPB_REMOVE_PENDING              0x00000008
630
631 typedef struct _VPB
632 {
633    CSHORT Type;
634    CSHORT Size;
635    USHORT Flags;
636    USHORT VolumeLabelLength;
637    struct _DEVICE_OBJECT* DeviceObject;
638    struct _DEVICE_OBJECT* RealDevice;
639    ULONG SerialNumber;
640    ULONG ReferenceCount;
641    WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH];
642 } VPB, *PVPB;
643
644
645 typedef struct _DEVICE_OBJECT
646 {
647    CSHORT Type;
648    CSHORT Size;
649    LONG ReferenceCount;
650    struct _DRIVER_OBJECT* DriverObject;
651    struct _DEVICE_OBJECT* NextDevice;
652    struct _DEVICE_OBJECT* AttachedDevice;
653    struct _IRP* CurrentIrp;
654    PIO_TIMER Timer;
655    ULONG Flags;
656    ULONG Characteristics;
657    PVPB Vpb;
658    PVOID DeviceExtension;
659    DEVICE_TYPE DeviceType;
660    CCHAR StackSize;
661    union
662      {
663         LIST_ENTRY ListHead;
664         WAIT_CONTEXT_BLOCK Wcb;
665      } Queue;
666    ULONG AlignmentRequirement;
667    KDEVICE_QUEUE DeviceQueue;
668    KDPC Dpc;
669    ULONG ActiveThreadCount;
670    PSECURITY_DESCRIPTOR SecurityDescriptor;
671    KEVENT DeviceLock;
672    USHORT SectorSize;
673    USHORT Spare1;
674    struct _DEVOBJ_EXTENSION* DeviceObjectExtension;
675    PVOID Reserved;
676 } DEVICE_OBJECT, *PDEVICE_OBJECT;
677
678
679 /*
680  * Fast i/o routine type declaration
681  */
682 //typedef NTSTATUS (*PFAST_IO_DISPATCH)(struct _DEVICE_OBJECT*, IRP*);
683 //FIXME : this type is ok for read and write, but not for all routines
684 typedef BOOLEAN STDCALL
685 (*PFAST_IO_ROUTINE)(IN struct _FILE_OBJECT *FileObject,
686                     IN PLARGE_INTEGER FileOffset,
687                     IN ULONG Length,
688                     IN BOOLEAN Wait,
689                     IN ULONG LockKey,
690                     OUT PVOID Buffer,
691                     OUT PIO_STATUS_BLOCK IoStatus,
692                     IN struct _DEVICE_OBJECT *DeviceObject);
693
694 typedef struct _FAST_IO_DISPATCH {
695    ULONG SizeOfFastIoDispatch;
696    PFAST_IO_ROUTINE FastIoCheckIfPossible;
697    PFAST_IO_ROUTINE FastIoRead;
698    PFAST_IO_ROUTINE FastIoWrite;
699    PFAST_IO_ROUTINE FastIoQueryBasicInfo;
700    PFAST_IO_ROUTINE FastIoQueryStandardInfo;
701    PFAST_IO_ROUTINE FastIoLock;
702    PFAST_IO_ROUTINE FastIoUnlockSingle;
703    PFAST_IO_ROUTINE FastIoUnlockAll;
704    PFAST_IO_ROUTINE FastIoUnlockAllByKey;
705    PFAST_IO_ROUTINE FastIoDeviceControl;
706    PFAST_IO_ROUTINE AcquireFileForNtCreateSection;
707    PFAST_IO_ROUTINE ReleaseFileForNtCreateSection;
708    PFAST_IO_ROUTINE FastIoDetachDevice;
709    PFAST_IO_ROUTINE FastIoQueryNetworkOpenInfo;
710    PFAST_IO_ROUTINE AcquireForModWrite;
711    PFAST_IO_ROUTINE MdlRead;
712    PFAST_IO_ROUTINE MdlReadComplete;
713    PFAST_IO_ROUTINE PrepareMdlWrite;
714    PFAST_IO_ROUTINE MdlWriteComplete;
715    PFAST_IO_ROUTINE FastIoReadCompressed;
716    PFAST_IO_ROUTINE FastIoWriteCompressed;
717    PFAST_IO_ROUTINE MdlReadCompleteCompressed;
718    PFAST_IO_ROUTINE MdlWriteCompleteCompressed;
719    PFAST_IO_ROUTINE FastIoQueryOpen;
720    PFAST_IO_ROUTINE ReleaseForModWrite;
721    PFAST_IO_ROUTINE AcquireForCcFlush;
722    PFAST_IO_ROUTINE ReleaseForCcFlush;
723 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
724
725 /*
726  * Dispatch routine type declaration
727  */
728 typedef NTSTATUS STDCALL
729 (*PDRIVER_DISPATCH)(IN struct _DEVICE_OBJECT *DeviceObject,
730                    IN struct _IRP *Irp);
731
732 /*
733  * StartIo routine type declaration
734  */
735 typedef VOID STDCALL
736 (*PDRIVER_STARTIO)(IN PDEVICE_OBJECT DeviceObject,
737                    IN PIRP Irp);
738
739 /*
740  * Unload routine type declaration
741  */
742 typedef VOID STDCALL
743 (*PDRIVER_UNLOAD)(IN struct _DRIVER_OBJECT *DriverObject);
744
745 /*
746  * AddDevice routine type declaration
747  */
748 typedef NTSTATUS STDCALL
749 (*PDRIVER_ADD_DEVICE)(IN struct _DRIVER_OBJECT *DriverObject,
750                       IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
751
752
753 typedef struct _DRIVER_EXTENSION
754 {
755    struct _DRIVER_OBJECT* DriverObject;
756    PDRIVER_ADD_DEVICE AddDevice;
757    ULONG Count;
758    UNICODE_STRING ServiceKeyName;
759 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
760
761 #if 0
762 typedef
763 struct _FAST_IO_DISPATCH_TABLE
764 {
765         ULONG                   Count;
766         PFAST_IO_DISPATCH       Dispatch;
767
768 } FAST_IO_DISPATCH_TABLE, * PFAST_IO_DISPATCH_TABLE;
769 #endif
770
771 typedef struct _DRIVER_OBJECT
772 {
773    CSHORT Type;
774    CSHORT Size;
775    PDEVICE_OBJECT DeviceObject;
776    ULONG Flags;
777    PVOID DriverStart;
778    ULONG DriverSize;
779    PVOID DriverSection;
780    PDRIVER_EXTENSION DriverExtension;
781    UNICODE_STRING DriverName;
782    PUNICODE_STRING HardwareDatabase;
783 #if 0
784    PFAST_IO_DISPATCH_TABLE FastIoDispatch;
785 #else
786    PFAST_IO_DISPATCH FastIoDispatch;
787 #endif
788    PDRIVER_INITIALIZE DriverInit;
789    PDRIVER_STARTIO DriverStartIo;
790    PDRIVER_UNLOAD DriverUnload;
791    PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
792 } DRIVER_OBJECT, *PDRIVER_OBJECT;
793
794
795 typedef struct _CONFIGURATION_INFORMATION
796 {
797    ULONG DiskCount;
798    ULONG FloppyCount;
799    ULONG CDRomCount;
800    ULONG TapeCount;
801    ULONG ScsiPortCount;
802    ULONG SerialCount;
803    ULONG ParallelCount;
804    BOOLEAN AtDiskPrimaryAddressClaimed;
805    BOOLEAN AtDiskSecondaryAddressClaimed;
806 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
807
808 typedef VOID STDCALL
809 (*PIO_DPC_ROUTINE)(PKDPC Dpc,
810                    PDEVICE_OBJECT DeviceObject,
811                    PIRP Irp,
812                    PVOID Context);
813
814 typedef VOID STDCALL
815 (*PIO_TIMER_ROUTINE)(PDEVICE_OBJECT DeviceObject,
816                      PVOID Context);
817
818 typedef struct _IO_WORKITEM *PIO_WORKITEM;
819 typedef VOID (*PIO_WORKITEM_ROUTINE)(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context);
820
821 #if WINDOWS_STRUCTS_DOESNT_ALREADY_DEFINE_THIS
822 typedef struct _PARTITION_INFORMATION
823 {
824    LARGE_INTEGER StartingOffset;
825    LARGE_INTEGER PartitionLength;
826    ULONG HiddenSectors;
827    ULONG PartitionNumber;
828    UCHAR PartitionType;
829    BOOLEAN BootIndicator;
830    BOOLEAN RecognizedPartition;
831    BOOLEAN RewritePartition;
832 } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
833 #endif
834
835 typedef struct _DRIVER_LAYOUT_INFORMATION
836 {
837    ULONG PartitionCount;
838    ULONG Signature;
839    PARTITION_INFORMATION PartitionEntry[1];
840 } DRIVER_LAYOUT_INFORMATION, *PDRIVER_LAYOUT_INFORMATION;
841
842
843 typedef IO_ALLOCATION_ACTION STDCALL
844 (*PDRIVER_CONTROL)(PDEVICE_OBJECT DeviceObject,
845                    PIRP Irp,
846                    PVOID MapRegisterBase,
847                    PVOID Context);
848 #if (_WIN32_WINNT >= 0x0400)
849 typedef VOID STDCALL
850 (*PFSDNOTIFICATIONPROC)(IN PDEVICE_OBJECT PtrTargetFileSystemDeviceObject,
851                         IN BOOLEAN DriverActive);
852 #endif // (_WIN32_WINNT >= 0x0400)
853
854 #endif /* __INCLUDE_DDK_IOTYPES_H */