- Fix incompatible IO_STACK_LOCATION definition in W32api ddk/winddk.k
[reactos.git] / reactos / include / ndk / iotypes.h
index 42e4b76..ce8f96b 100644 (file)
 /* DEPENDENCIES **************************************************************/
 
 /* EXPORTED DATA *************************************************************/
+#ifndef NTOS_MODE_USER
 extern POBJECT_TYPE NTOSAPI IoAdapterObjectType;
 extern POBJECT_TYPE NTOSAPI IoDeviceHandlerObjectType;
 extern POBJECT_TYPE NTOSAPI IoDeviceObjectType;
 extern POBJECT_TYPE NTOSAPI IoDriverObjectType;
 extern POBJECT_TYPE NTOSAPI IoFileObjectType;
-extern ULONG NTOSAPI IoReadOperationCount;
-extern ULONGLONG NTOSAPI IoReadTransferCount;
-extern ULONG NTOSAPI IoWriteOperationCount;
-extern ULONGLONG NTOSAPI IoWriteTransferCount;
-extern KSPIN_LOCK NTOSAPI IoStatisticsLock;
+#endif
 
 /* CONSTANTS *****************************************************************/
 
-/* I/O Types */
-#define IO_TYPE_DRIVER 4L
-#define IO_TYPE_TIMER 9L
+#ifdef NTOS_MODE_USER
+/* Object Access Rights */
+#define SYMBOLIC_LINK_QUERY                 0x0001
+#define SYMBOLIC_LINK_ALL_ACCESS            STANDARD_RIGHTS_REQUIRED | 0x0001
+#endif
+
+/* File Result Flags */
+#define FILE_SUPERSEDED                     0x00000000
+#define FILE_OPENED                         0x00000001
+#define FILE_CREATED                        0x00000002
+#define FILE_OVERWRITTEN                    0x00000003
+#define FILE_EXISTS                         0x00000004
+#define FILE_DOES_NOT_EXIST                 0x00000005
+
+/* Pipe Flags */
+#define FILE_PIPE_BYTE_STREAM_MODE          0x00000000
+#define FILE_PIPE_MESSAGE_MODE              0x00000001
+#define FILE_PIPE_QUEUE_OPERATION           0x00000000
+#define FILE_PIPE_COMPLETE_OPERATION        0x00000001
+#define FILE_PIPE_INBOUND                   0x00000000
+#define FILE_PIPE_OUTBOUND                  0x00000001
+#define FILE_PIPE_FULL_DUPLEX               0x00000002
+#define FILE_PIPE_CLIENT_END                0x00000000
+#define FILE_PIPE_SERVER_END                0x00000001
+
+/* File Attributes */
+#define FILE_ATTRIBUTE_VALID_FLAGS          0x00007fb7
+#define FILE_ATTRIBUTE_VALID_SET_FLAGS      0x000031a7
+
+/* File Flags */
+#define FILE_SUPERSEDE                      0x00000000
+#define FILE_OPEN                           0x00000001
+#define FILE_CREATE                         0x00000002
+#define FILE_OPEN_IF                        0x00000003
+#define FILE_OVERWRITE                      0x00000004
+#define FILE_OVERWRITE_IF                   0x00000005
+#define FILE_MAXIMUM_DISPOSITION            0x00000005
+
+/* File Types */
+#define FILE_DIRECTORY_FILE                 0x00000001
+#define FILE_WRITE_THROUGH                  0x00000002
+#define FILE_SEQUENTIAL_ONLY                0x00000004
+#define FILE_NO_INTERMEDIATE_BUFFERING      0x00000008
+#define FILE_SYNCHRONOUS_IO_ALERT           0x00000010
+#define FILE_SYNCHRONOUS_IO_NONALERT        0x00000020
+#define FILE_NON_DIRECTORY_FILE             0x00000040
+#define FILE_CREATE_TREE_CONNECTION         0x00000080
+#define FILE_COMPLETE_IF_OPLOCKED           0x00000100
+#define FILE_NO_EA_KNOWLEDGE                0x00000200
+#define FILE_OPEN_FOR_RECOVERY              0x00000400
+#define FILE_RANDOM_ACCESS                  0x00000800
+#define FILE_DELETE_ON_CLOSE                0x00001000
+#define FILE_OPEN_BY_FILE_ID                0x00002000
+#define FILE_OPEN_FOR_BACKUP_INTENT         0x00004000
+#define FILE_NO_COMPRESSION                 0x00008000
+#define FILE_RESERVE_OPFILTER               0x00100000
+#define FILE_OPEN_REPARSE_POINT             0x00200000
+#define FILE_OPEN_NO_RECALL                 0x00400000
+#define FILE_OPEN_FOR_FREE_SPACE_QUERY      0x00800000
+
+/* Device Charactertics */
+#define FILE_REMOVABLE_MEDIA                0x00000001
+#define FILE_REMOTE_DEVICE                  0x00000010
+
+/* Device Object Extension Flags */
+#define DOE_UNLOAD_PENDING    0x1
+#define DOE_DELETE_PENDING    0x2
+#define DOE_REMOVE_PENDING    0x4
+#define DOE_REMOVE_PROCESSED  0x8
+#define DOE_START_PENDING     0x10
+
+/* Device Node Flags */
+#define DNF_PROCESSED                           0x00000001
+#define DNF_STARTED                             0x00000002
+#define DNF_START_FAILED                        0x00000004
+#define DNF_ENUMERATED                          0x00000008
+#define DNF_DELETED                             0x00000010
+#define DNF_MADEUP                              0x00000020
+#define DNF_START_REQUEST_PENDING               0x00000040
+#define DNF_NO_RESOURCE_REQUIRED                0x00000080
+#define DNF_INSUFFICIENT_RESOURCES              0x00000100
+#define DNF_RESOURCE_ASSIGNED                   0x00000200
+#define DNF_RESOURCE_REPORTED                   0x00000400
+#define DNF_HAL_NODE                            0x00000800 // ???
+#define DNF_ADDED                               0x00001000
+#define DNF_ADD_FAILED                          0x00002000
+#define DNF_LEGACY_DRIVER                       0x00004000
+#define DNF_STOPPED                             0x00008000
+#define DNF_WILL_BE_REMOVED                     0x00010000
+#define DNF_NEED_TO_ENUM                        0x00020000
+#define DNF_NOT_CONFIGURED                      0x00040000
+#define DNF_REINSTALL                           0x00080000
+#define DNF_RESOURCE_REQUIREMENTS_NEED_FILTERED 0x00100000 // ???
+#define DNF_DISABLED                            0x00200000
+#define DNF_RESTART_OK                          0x00400000
+#define DNF_NEED_RESTART                        0x00800000
+#define DNF_VISITED                             0x01000000
+#define DNF_ASSIGNING_RESOURCES                 0x02000000
+#define DNF_BEEING_ENUMERATED                   0x04000000
+#define DNF_NEED_ENUMERATION_ONLY               0x08000000
+#define DNF_LOCKED                              0x10000000
+#define DNF_HAS_BOOT_CONFIG                     0x20000000
+#define DNF_BOOT_CONFIG_RESERVED                0x40000000
+#define DNF_HAS_PROBLEM                         0x80000000 // ???
+/* For UserFlags field */
+#define DNUF_DONT_SHOW_IN_UI    0x0002
+#define DNUF_NOT_DISABLEABLE    0x0008
 
 /* ENUMERATIONS **************************************************************/
 
+#ifdef NTOS_MODE_USER
+typedef enum _INTERFACE_TYPE
+{
+    InterfaceTypeUndefined = -1,
+    Internal,
+    Isa,
+    Eisa,
+    MicroChannel,
+    TurboChannel,
+    PCIBus,
+    VMEBus,
+    NuBus,
+    PCMCIABus,
+    CBus,
+    MPIBus,
+    MPSABus,
+    ProcessorInternal,
+    InternalPowerBus,
+    PNPISABus,
+    PNPBus,
+    MaximumInterfaceType
+}INTERFACE_TYPE, *PINTERFACE_TYPE;
+
+typedef enum _FILE_INFORMATION_CLASS
+{
+    FileDirectoryInformation = 1,
+    FileFullDirectoryInformation,
+    FileBothDirectoryInformation,
+    FileBasicInformation,
+    FileStandardInformation,
+    FileInternalInformation,
+    FileEaInformation,
+    FileAccessInformation,
+    FileNameInformation,
+    FileRenameInformation,
+    FileLinkInformation,
+    FileNamesInformation,
+    FileDispositionInformation,
+    FilePositionInformation,
+    FileFullEaInformation,
+    FileModeInformation,
+    FileAlignmentInformation,
+    FileAllInformation,
+    FileAllocationInformation,
+    FileEndOfFileInformation,
+    FileAlternateNameInformation,
+    FileStreamInformation,
+    FilePipeInformation,
+    FilePipeLocalInformation,
+    FilePipeRemoteInformation,
+    FileMailslotQueryInformation,
+    FileMailslotSetInformation,
+    FileCompressionInformation,
+    FileObjectIdInformation,
+    FileCompletionInformation,
+    FileMoveClusterInformation,
+    FileQuotaInformation,
+    FileReparsePointInformation,
+    FileNetworkOpenInformation,
+    FileAttributeTagInformation,
+    FileTrackingInformation,
+    FileIdBothDirectoryInformation,
+    FileIdFullDirectoryInformation,
+    FileValidDataLengthInformation,
+    FileShortNameInformation,
+    FileMaximumInformation
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef enum _FSINFOCLASS
+{
+    FileFsVolumeInformation = 1,
+    FileFsLabelInformation,
+    FileFsSizeInformation,
+    FileFsDeviceInformation,
+    FileFsAttributeInformation,
+    FileFsControlInformation,
+    FileFsFullSizeInformation,
+    FileFsObjectIdInformation,
+    FileFsDriverPathInformation,
+    FileFsMaximumInformation
+} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
+#endif
+
+typedef enum _PNP_DEVNODE_STATE
+{
+    DeviceNodeUnspecified = 0x300,
+    DeviceNodeUninitialized = 0x301,
+    DeviceNodeInitialized = 0x302,
+    DeviceNodeDriversAdded = 0x303,
+    DeviceNodeResourcesAssigned = 0x304,
+    DeviceNodeStartPending = 0x305,
+    DeviceNodeStartCompletion = 0x306,
+    DeviceNodeStartPostWork = 0x307,
+    DeviceNodeStarted = 0x308,
+    DeviceNodeQueryStopped = 0x309,
+    DeviceNodeStopped = 0x30a,
+    DeviceNodeRestartCompletion = 0x30b,
+    DeviceNodeEnumeratePending = 0x30c,
+    DeviceNodeEnumerateCompletion = 0x30d,
+    DeviceNodeAwaitingQueuedDeletion = 0x30e,
+    DeviceNodeAwaitingQueuedRemoval = 0x30f,
+    DeviceNodeQueryRemoved = 0x310,
+    DeviceNodeRemovePendingCloses = 0x311,
+    DeviceNodeRemoved = 0x312,
+    DeviceNodeDeletePendingCloses = 0x313,
+    DeviceNodeDeleted = 0x314,
+    MaxDeviceNodeState = 0x315,
+} PNP_DEVNODE_STATE;
+
 /* TYPES *********************************************************************/
 
-typedef struct _MAILSLOT_CREATE_PARAMETERS 
+#ifdef NTOS_MODE_USER
+typedef struct _FILE_BASIC_INFORMATION
+{
+    LARGE_INTEGER CreationTime;
+    LARGE_INTEGER LastAccessTime;
+    LARGE_INTEGER LastWriteTime;
+    LARGE_INTEGER ChangeTime;
+    ULONG FileAttributes;
+} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
+
+typedef struct _FILE_STANDARD_INFORMATION
+{
+    LARGE_INTEGER AllocationSize;
+    LARGE_INTEGER EndOfFile;
+    ULONG NumberOfLinks;
+    BOOLEAN DeletePending;
+    BOOLEAN Directory;
+} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
+
+typedef struct _FILE_NETWORK_OPEN_INFORMATION
+{
+    LARGE_INTEGER CreationTime;
+    LARGE_INTEGER LastAccessTime;
+    LARGE_INTEGER LastWriteTime;
+    LARGE_INTEGER ChangeTime;
+    LARGE_INTEGER AllocationSize;
+    LARGE_INTEGER EndOfFile;
+    ULONG FileAttributes;
+} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
+
+typedef struct _FILE_EA_INFORMATION
+{
+    ULONG EaSize;
+} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
+
+typedef struct _FILE_COMPRESSION_INFORMATION
+{
+    LARGE_INTEGER CompressedFileSize;
+    USHORT CompressionFormat;
+    UCHAR CompressionUnitShift;
+    UCHAR ChunkShift;
+    UCHAR ClusterShift;
+    UCHAR Reserved[3];
+} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
+
+typedef struct _FILE_POSITION_INFORMATION
+{
+  LARGE_INTEGER CurrentByteOffset;
+} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
+
+typedef struct _FILE_DISPOSITION_INFORMATION
+{
+    BOOLEAN DeleteFile;
+} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
+
+typedef struct _FILE_FULL_EA_INFORMATION
+{
+    ULONG NextEntryOffset;
+    UCHAR Flags;
+    UCHAR EaNameLength;
+    USHORT EaValueLength;
+    CHAR EaName[1];
+} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
+
+typedef struct _FILE_QUOTA_INFORMATION
+{
+    ULONG NextEntryOffset;
+    ULONG SidLength;
+    LARGE_INTEGER ChangeTime;
+    LARGE_INTEGER QuotaUsed;
+    LARGE_INTEGER QuotaThreshold;
+    LARGE_INTEGER QuotaLimit;
+    SID Sid;
+} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
+
+typedef struct _FILE_INTERNAL_INFORMATION
+{
+    LARGE_INTEGER IndexNumber;
+} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
+
+typedef struct _FILE_RENAME_INFORMATION
+{
+    BOOLEAN ReplaceIfExists;
+    HANDLE  RootDirectory;
+    ULONG FileNameLength;
+    WCHAR FileName[1];
+} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
+
+typedef struct _FILE_PIPE_INFORMATION
+{
+    ULONG ReadMode;
+    ULONG CompletionMode;
+} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
+
+typedef struct _FILE_PIPE_LOCAL_INFORMATION
+{
+    ULONG NamedPipeType;
+    ULONG NamedPipeConfiguration;
+    ULONG MaximumInstances;
+    ULONG CurrentInstances;
+    ULONG InboundQuota;
+    ULONG ReadDataAvailable;
+    ULONG OutboundQuota;
+    ULONG WriteQuotaAvailable;
+    ULONG NamedPipeState;
+    ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+
+typedef struct _FILE_PIPE_REMOTE_INFORMATION
+{
+    LARGE_INTEGER CollectDataTime;
+    ULONG MaximumCollectionCount;
+} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
+
+typedef struct _FILE_MAILSLOT_QUERY_INFORMATION
+{
+    ULONG MaximumMessageSize;
+    ULONG MailslotQuota;
+    ULONG NextMessageSize;
+    ULONG MessagesAvailable;
+    LARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
+
+typedef struct _FILE_MAILSLOT_SET_INFORMATION
+{
+    LARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
+
+typedef struct _FILE_BOTH_DIR_INFORMATION
+{
+    ULONG NextEntryOffset;
+    ULONG FileIndex;
+    LARGE_INTEGER CreationTime;
+    LARGE_INTEGER LastAccessTime;
+    LARGE_INTEGER LastWriteTime;
+    LARGE_INTEGER ChangeTime;
+    LARGE_INTEGER EndOfFile;
+    LARGE_INTEGER AllocationSize;
+    ULONG FileAttributes;
+    ULONG FileNameLength;
+    ULONG EaSize;
+    CCHAR ShortNameLength;
+    WCHAR ShortName[12];
+    WCHAR FileName[1];
+} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
+
+typedef struct _FILE_COMPLETION_INFORMATION
+{
+    HANDLE Port;
+    PVOID Key;
+} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
+
+typedef struct _FILE_LINK_INFORMATION
+{
+    BOOLEAN ReplaceIfExists;
+    HANDLE RootDirectory;
+    ULONG FileNameLength;
+    WCHAR FileName[1];
+} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
+
+typedef struct _FILE_NAME_INFORMATION
+{
+    ULONG FileNameLength;
+    WCHAR FileName[1];
+} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
+
+typedef struct _FILE_ALLOCATION_INFORMATION
+{
+    LARGE_INTEGER AllocationSize;
+} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
+
+typedef struct _FILE_END_OF_FILE_INFORMATION
+{
+    LARGE_INTEGER EndOfFile;
+} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
+
+typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
+{
+    LARGE_INTEGER ValidDataLength;
+} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
+
+typedef struct _FILE_FS_DEVICE_INFORMATION
+{
+    DEVICE_TYPE DeviceType;
+    ULONG Characteristics;
+} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
+
+typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
+{
+    ULONG FileSystemAttributes;
+    ULONG MaximumComponentNameLength;
+    ULONG FileSystemNameLength;
+    WCHAR FileSystemName[1];
+} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
+
+typedef struct _FILE_FS_SIZE_INFORMATION
+{
+    LARGE_INTEGER TotalAllocationUnits;
+    LARGE_INTEGER AvailableAllocationUnits;
+    ULONG SectorsPerAllocationUnit;
+    ULONG BytesPerSector;
+} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
+
+typedef struct _FILE_FS_LABEL_INFORMATION
+{
+    ULONG VolumeLabelLength;
+    WCHAR VolumeLabel[1];
+} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
+
+typedef struct _FILE_FS_VOLUME_INFORMATION
+{
+    LARGE_INTEGER VolumeCreationTime;
+    ULONG VolumeSerialNumber;
+    ULONG VolumeLabelLength;
+    BOOLEAN SupportsObjects;
+    WCHAR VolumeLabel[1];
+} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
+
+typedef struct _FILE_PIPE_WAIT_FOR_BUFFER
+{
+    LARGE_INTEGER Timeout;
+    ULONG NameLength;
+    BOOLEAN TimeoutSpecified;
+    WCHAR Name[1];
+} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
+
+typedef struct _FILE_PIPE_PEEK_BUFFER
+{
+    ULONG NamedPipeState;
+    ULONG ReadDataAvailable;
+    ULONG NumberOfMessages;
+    ULONG MessageLength;
+    CHAR Data[1];
+} FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
+
+typedef struct _IO_STATUS_BLOCK
+{
+    union
+    {
+        NTSTATUS  Status;
+        PVOID  Pointer;
+    };
+    ULONG_PTR  Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef struct _IO_ERROR_LOG_PACKET
+{
+    UCHAR MajorFunctionCode;
+    UCHAR RetryCount;
+    USHORT DumpDataSize;
+    USHORT NumberOfStrings;
+    USHORT StringOffset;
+    USHORT EventCategory;
+    NTSTATUS ErrorCode;
+    ULONG UniqueErrorValue;
+    NTSTATUS FinalStatus;
+    ULONG SequenceNumber;
+    ULONG IoControlCode;
+    LARGE_INTEGER DeviceOffset;
+    ULONG DumpData[1];
+}IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
+
+typedef struct _IO_ERROR_LOG_MESSAGE
+{
+    USHORT Type;
+    USHORT Size;
+    USHORT DriverNameLength;
+    LARGE_INTEGER TimeStamp;
+    ULONG DriverNameOffset;
+    IO_ERROR_LOG_PACKET EntryData;
+} IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
+#endif
+
+typedef struct _MAILSLOT_CREATE_PARAMETERS
 {
     ULONG           MailslotQuota;
     ULONG           MaximumMessageSize;
@@ -42,7 +525,7 @@ typedef struct _MAILSLOT_CREATE_PARAMETERS
     BOOLEAN         TimeoutSpecified;
 } MAILSLOT_CREATE_PARAMETERS, *PMAILSLOT_CREATE_PARAMETERS;
 
-typedef struct _NAMED_PIPE_CREATE_PARAMETERS 
+typedef struct _NAMED_PIPE_CREATE_PARAMETERS
 {
     ULONG           NamedPipeType;
     ULONG           ReadMode;
@@ -54,15 +537,433 @@ typedef struct _NAMED_PIPE_CREATE_PARAMETERS
     BOOLEAN         TimeoutSpecified;
 } NAMED_PIPE_CREATE_PARAMETERS, *PNAMED_PIPE_CREATE_PARAMETERS;
 
-typedef struct _IO_TIMER 
+#ifndef NTOS_MODE_USER
+typedef struct _IO_TIMER
 {
-   USHORT Type;
-   USHORT TimerEnabled;
-   LIST_ENTRY IoTimerList;
-   PIO_TIMER_ROUTINE TimerRoutine;
-   PVOID Context;
-   PDEVICE_OBJECT DeviceObject;
+    USHORT Type;
+    USHORT TimerEnabled;
+    LIST_ENTRY IoTimerList;
+    PIO_TIMER_ROUTINE TimerRoutine;
+    PVOID Context;
+    PDEVICE_OBJECT DeviceObject;
 } IO_TIMER, *PIO_TIMER;
 
+typedef struct _DEVICE_NODE
+{
+    struct _DEVICE_NODE *Parent;
+    struct _DEVICE_NODE *PrevSibling;
+    struct _DEVICE_NODE *NextSibling;
+    struct _DEVICE_NODE *Child;
+    UINT Level;
+    struct _PO_DEVICE_NOTIFY *Notify;
+    PNP_DEVNODE_STATE State;
+    PNP_DEVNODE_STATE PreviousState;
+    PNP_DEVNODE_STATE StateHistory[20];
+    UINT StateHistoryEntry;
+    INT CompletionStatus;
+    PIRP PendingIrp;
+    ULONG Flags;
+    ULONG UserFlags;
+    ULONG Problem;
+    PDEVICE_OBJECT PhysicalDeviceObject;
+    PCM_RESOURCE_LIST ResourceList;
+    PCM_RESOURCE_LIST ResourceListTranslated;
+    UNICODE_STRING InstancePath;
+    UNICODE_STRING ServiceName;
+    PDEVICE_OBJECT DuplicatePDO;
+    PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements;
+    INTERFACE_TYPE InterfaceType;
+    ULONG BusNumber;
+    INTERFACE_TYPE ChildInterfaceType;
+    ULONG ChildBusNumber;
+    USHORT ChildBusTypeIndex;
+    UCHAR RemovalPolicy;
+    UCHAR HardwareRemovalPolicy;
+    LIST_ENTRY TargetDeviceNotify;
+    LIST_ENTRY DeviceArbiterList;
+    LIST_ENTRY DeviceTranslatorList;
+    USHORT NoTranslatorMask;
+    USHORT QueryTranslatorMask;
+    USHORT NoArbiterMask;
+    USHORT QueryArbiterMask;
+    union
+    {
+        struct _DEVICE_NODE *LegacyDeviceNode;
+        PDEVICE_RELATIONS PendingDeviceRelations;
+    } OverUsed1;
+    union
+    {
+        struct _DEVICE_NODE *NextResourceDeviceNode;
+    } OverUsed2;
+    PCM_RESOURCE_LIST BootResources;
+    ULONG CapabilityFlags;
+    struct
+    {
+        ULONG DockStatus;
+        LIST_ENTRY ListEntry;
+        WCHAR *SerialNumber;
+    } DockInfo;
+    ULONG DisableableDepends;
+    LIST_ENTRY PendedSetInterfaceState;
+    LIST_ENTRY LegacyBusListEntry;
+    ULONG DriverUnloadRetryCount;
+    struct _DEVICE_NODE *PreviousParent;
+    ULONG DeletedChidren;
+} DEVICE_NODE, *PDEVICE_NODE;
+
+typedef struct _PI_RESOURCE_ARBITER_ENTRY
+{
+    LIST_ENTRY DeviceArbiterList;
+    UCHAR ResourceType;
+    PARBITER_INTERFACE ArbiterInterface;
+    ULONG Level;
+    LIST_ENTRY ResourceList;
+    LIST_ENTRY BestResourceList;
+    LIST_ENTRY BestConfig;
+    LIST_ENTRY ActiveArbiterList;
+    UCHAR State;
+    UCHAR ResourcesChanged;
+} PI_RESOURCE_ARBITER_ENTRY, *PPI_RESOURCE_ARBITER_ENTRY;
+  
+typedef struct _DEVOBJ_EXTENSION
+{
+    CSHORT Type;
+    USHORT Size;
+    PDEVICE_OBJECT DeviceObject;
+    ULONG PowerFlags;
+    struct DEVICE_OBJECT_POWER_EXTENSION *Dope;
+    ULONG ExtensionFlags;
+    struct _DEVICE_NODE *DeviceNode;
+    PDEVICE_OBJECT AttachedTo;
+    LONG StartIoCount;
+    LONG StartIoKey;
+    ULONG StartIoFlags;
+    struct _VPB *Vpb;
+} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
+
+typedef struct _PRIVATE_DRIVER_EXTENSIONS
+{
+    struct _PRIVATE_DRIVER_EXTENSIONS *Link;
+    PVOID ClientIdentificationAddress;
+    CHAR Extension[1];
+} PRIVATE_DRIVER_EXTENSIONS, *PPRIVATE_DRIVER_EXTENSIONS;
+
+#if !defined(_ALPHA_)
+#include <pshpack4.h>
+#endif
+typedef struct _EXTENDED_IO_STACK_LOCATION
+{
+    UCHAR MajorFunction;
+    UCHAR MinorFunction;
+    UCHAR Flags;
+    UCHAR Control;
+    union
+    {
+        struct
+        {
+            PIO_SECURITY_CONTEXT SecurityContext;
+            ULONG Options;
+            USHORT FileAttributes;
+            USHORT ShareAccess;
+            ULONG EaLength;
+        } Create;
+        struct
+        {
+            PIO_SECURITY_CONTEXT SecurityContext;
+            ULONG Options;
+            USHORT Reserved;
+            USHORT ShareAccess;
+            struct _NAMED_PIPE_CREATE_PARAMETERS *Parameters;
+        } CreatePipe;
+        struct
+        {
+            PIO_SECURITY_CONTEXT SecurityContext;
+            ULONG Options;
+            USHORT Reserved;
+            USHORT ShareAccess;
+            struct _MAILSLOT_CREATE_PARAMETERS *Parameters;
+        } CreateMailslot;
+        struct
+        {
+            ULONG Length;
+            ULONG Key;
+            LARGE_INTEGER ByteOffset;
+        } Read;
+        struct
+        {
+            ULONG Length;
+            ULONG Key;
+            LARGE_INTEGER ByteOffset;
+        } Write;
+        struct
+        {
+            ULONG Length;
+            PUNICODE_STRING FileName;
+            FILE_INFORMATION_CLASS FileInformationClass;
+            ULONG FileIndex;
+        } QueryDirectory;
+        struct
+        {
+            ULONG Length;
+            ULONG CompletionFilter;
+        } NotifyDirectory;
+        struct
+        {
+            ULONG Length;
+            FILE_INFORMATION_CLASS FileInformationClass;
+        } QueryFile;
+        struct
+        {
+            ULONG Length;
+            FILE_INFORMATION_CLASS FileInformationClass;
+            PFILE_OBJECT  FileObject;
+            union
+            {
+                struct
+                {
+                    BOOLEAN ReplaceIfExists;
+                    BOOLEAN AdvanceOnly;
+                };
+                ULONG ClusterCount;
+                HANDLE DeleteHandle;
+            };
+        } SetFile;
+        struct
+        {
+            ULONG Length;
+            PVOID EaList;
+            ULONG EaListLength;
+            ULONG EaIndex;
+        } QueryEa;
+        struct
+        {
+            ULONG Length;
+        } SetEa;
+        struct
+        {
+            ULONG Length;
+            FS_INFORMATION_CLASS FsInformationClass;
+        } QueryVolume;
+        struct
+        {
+            ULONG Length;
+            FS_INFORMATION_CLASS FsInformationClass;
+        } SetVolume;
+        struct
+        {
+            ULONG OutputBufferLength;
+            ULONG InputBufferLength;
+            ULONG FsControlCode;
+            PVOID Type3InputBuffer;
+        } FileSystemControl;
+        struct
+        {
+            PLARGE_INTEGER Length;
+            ULONG Key;
+            LARGE_INTEGER ByteOffset;
+        } LockControl;
+        struct
+        {
+            ULONG OutputBufferLength;
+            ULONG InputBufferLength;
+            ULONG IoControlCode;
+            PVOID Type3InputBuffer;
+        } DeviceIoControl;
+        struct
+        {
+            SECURITY_INFORMATION SecurityInformation;
+            ULONG POINTER_ALIGNMENT Length;
+        } QuerySecurity;
+        struct
+        {
+            SECURITY_INFORMATION SecurityInformation;
+            PSECURITY_DESCRIPTOR SecurityDescriptor;
+        } SetSecurity;
+        struct
+        {
+            PVPB Vpb;
+            PDEVICE_OBJECT DeviceObject;
+        } MountVolume;
+        struct
+        {
+            PVPB Vpb;
+            PDEVICE_OBJECT DeviceObject;
+        } VerifyVolume;
+        struct
+        {
+            struct _SCSI_REQUEST_BLOCK *Srb;
+        } Scsi;
+        struct
+        {
+            ULONG Length;
+            PSID StartSid;
+            struct _FILE_GET_QUOTA_INFORMATION *SidList;
+            ULONG SidListLength;
+        } QueryQuota;
+        struct
+        {
+            ULONG Length;
+        } SetQuota;
+        struct
+        {
+            DEVICE_RELATION_TYPE Type;
+        } QueryDeviceRelations;
+        struct
+        {
+            CONST GUID *InterfaceType;
+            USHORT Size;
+            USHORT Version;
+            PINTERFACE Interface;
+            PVOID InterfaceSpecificData;
+        } QueryInterface;
+        struct
+        {
+            PDEVICE_CAPABILITIES Capabilities;
+        } DeviceCapabilities;
+        struct
+        {
+            PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
+        } FilterResourceRequirements;
+        struct
+        {
+            ULONG WhichSpace;
+            PVOID Buffer;
+            ULONG Offset;
+            ULONG Length;
+        } ReadWriteConfig;
+        struct
+        {
+            BOOLEAN Lock;
+        } SetLock;
+        struct
+        {
+            BUS_QUERY_ID_TYPE IdType;
+        } QueryId;
+        struct
+        {
+            DEVICE_TEXT_TYPE DeviceTextType;
+            LCID LocaleId;
+        } QueryDeviceText;
+        struct
+        {
+            BOOLEAN InPath;
+            BOOLEAN Reserved[3];
+            DEVICE_USAGE_NOTIFICATION_TYPE Type;
+        } UsageNotification;
+        struct
+        {
+            SYSTEM_POWER_STATE  PowerState;
+        } WaitWake;
+        struct
+        {
+            PPOWER_SEQUENCE  PowerSequence;
+        } PowerSequence;
+        struct
+        {
+            ULONG SystemContext;
+            POWER_STATE_TYPE Type;
+            POWER_STATE State;
+            POWER_ACTION ShutdownType;
+        } Power;
+        struct
+        {
+            PCM_RESOURCE_LIST AllocatedResources;
+            PCM_RESOURCE_LIST AllocatedResourcesTranslated;
+        } StartDevice;
+        struct
+        {
+            ULONG_PTR ProviderId;
+            PVOID DataPath;
+            ULONG BufferSize;
+            PVOID Buffer;
+        } WMI;
+        struct
+        {
+            PVOID Argument1;
+            PVOID Argument2;
+            PVOID Argument3;
+            PVOID Argument4;
+        } Others;
+    } Parameters;
+    PDEVICE_OBJECT DeviceObject;
+    PFILE_OBJECT FileObject;
+    PIO_COMPLETION_ROUTINE CompletionRoutine;
+    PVOID Context;
+} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
+#if !defined(_ALPHA_)
+#include <poppack.h>
+#endif
+#endif
+
+/* FUNCTION TYPES ************************************************************/
+
+typedef VOID
+(NTAPI *PIO_APC_ROUTINE)(
+    IN PVOID ApcContext,
+    IN PIO_STATUS_BLOCK IoStatusBlock,
+    IN ULONG Reserved);
+
+/* I/O CONTROL CODES *********************************************************/
+
+#ifdef NTOS_MODE_USER
+/* Mailslots */
+#define FSCTL_MAILSLOT_PEEK             \
+    CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
+
+/* Pipes */
+#define FSCTL_PIPE_ASSIGN_EVENT         \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_DISCONNECT           \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_LISTEN               \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_PEEK                 \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_QUERY_EVENT          \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_TRANSCEIVE           \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER,  FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_PIPE_WAIT                 \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_IMPERSONATE          \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_CLIENT_PROCESS   \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_QUERY_CLIENT_PROCESS \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_INTERNAL_READ        \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_INTERNAL_WRITE       \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_PIPE_INTERNAL_TRANSCEIVE  \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_PIPE_INTERNAL_READ_OVFLOW \
+    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
+
+/* Tapes */
+#define IOCTL_TAPE_ERASE                \
+    CTL_CODE(FILE_DEVICE_TAPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_TAPE_PREPARE              \
+    CTL_CODE(FILE_DEVICE_TAPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_TAPE_WRITE_MARKS          \
+    CTL_CODE(FILE_DEVICE_TAPE, 2, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_TAPE_GET_POSITION         \
+    CTL_CODE(FILE_DEVICE_TAPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_TAPE_SET_POSITION         \
+    CTL_CODE(FILE_DEVICE_TAPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_TAPE_GET_DRIVE_PARAMS     \
+    CTL_CODE(FILE_DEVICE_TAPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_TAPE_SET_DRIVE_PARAMS     \
+    CTL_CODE(FILE_DEVICE_TAPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_TAPE_GET_MEDIA_PARAMS     \
+    CTL_CODE(FILE_DEVICE_TAPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_TAPE_SET_MEDIA_PARAMS     \
+    CTL_CODE(FILE_DEVICE_TAPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_TAPE_GET_STATUS           \
+    CTL_CODE(FILE_DEVICE_TAPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_TAPE_CREATE_PARTITION     \
+    CTL_CODE(FILE_DEVICE_TAPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#endif
 #endif