ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

iotypes.h
Go to the documentation of this file.
00001 $if (_WDMDDK_ || _NTDDK_)
00002 /******************************************************************************
00003  *                         I/O Manager Types                                  *
00004  ******************************************************************************/
00005 $endif (_WDMDDK_ || _NTDDK_)
00006 
00007 $if (_WDMDDK_)
00008 
00009 #define STATUS_CONTINUE_COMPLETION      STATUS_SUCCESS
00010 
00011 #define CONNECT_FULLY_SPECIFIED         0x1
00012 #define CONNECT_LINE_BASED              0x2
00013 #define CONNECT_MESSAGE_BASED           0x3
00014 #define CONNECT_FULLY_SPECIFIED_GROUP   0x4
00015 #define CONNECT_CURRENT_VERSION         0x4
00016 
00017 #define POOL_COLD_ALLOCATION                256
00018 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE    8
00019 #define POOL_RAISE_IF_ALLOCATION_FAILURE    16
00020 
00021 #define IO_TYPE_ADAPTER                 1
00022 #define IO_TYPE_CONTROLLER              2
00023 #define IO_TYPE_DEVICE                  3
00024 #define IO_TYPE_DRIVER                  4
00025 #define IO_TYPE_FILE                    5
00026 #define IO_TYPE_IRP                     6
00027 #define IO_TYPE_MASTER_ADAPTER          7
00028 #define IO_TYPE_OPEN_PACKET             8
00029 #define IO_TYPE_TIMER                   9
00030 #define IO_TYPE_VPB                     10
00031 #define IO_TYPE_ERROR_LOG               11
00032 #define IO_TYPE_ERROR_MESSAGE           12
00033 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
00034 
00035 #define IO_TYPE_CSQ_IRP_CONTEXT 1
00036 #define IO_TYPE_CSQ 2
00037 #define IO_TYPE_CSQ_EX 3
00038 
00039 /* IO_RESOURCE_DESCRIPTOR.Option */
00040 #define IO_RESOURCE_PREFERRED             0x01
00041 #define IO_RESOURCE_DEFAULT               0x02
00042 #define IO_RESOURCE_ALTERNATIVE           0x08
00043 
00044 $endif (_WDMDDK_)
00045 $if (_WDMDDK_ || _DEVIOCTL_)
00046 #define FILE_DEVICE_BEEP                  0x00000001
00047 #define FILE_DEVICE_CD_ROM                0x00000002
00048 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM    0x00000003
00049 #define FILE_DEVICE_CONTROLLER            0x00000004
00050 #define FILE_DEVICE_DATALINK              0x00000005
00051 #define FILE_DEVICE_DFS                   0x00000006
00052 #define FILE_DEVICE_DISK                  0x00000007
00053 #define FILE_DEVICE_DISK_FILE_SYSTEM      0x00000008
00054 #define FILE_DEVICE_FILE_SYSTEM           0x00000009
00055 #define FILE_DEVICE_INPORT_PORT           0x0000000a
00056 #define FILE_DEVICE_KEYBOARD              0x0000000b
00057 #define FILE_DEVICE_MAILSLOT              0x0000000c
00058 #define FILE_DEVICE_MIDI_IN               0x0000000d
00059 #define FILE_DEVICE_MIDI_OUT              0x0000000e
00060 #define FILE_DEVICE_MOUSE                 0x0000000f
00061 #define FILE_DEVICE_MULTI_UNC_PROVIDER    0x00000010
00062 #define FILE_DEVICE_NAMED_PIPE            0x00000011
00063 #define FILE_DEVICE_NETWORK               0x00000012
00064 #define FILE_DEVICE_NETWORK_BROWSER       0x00000013
00065 #define FILE_DEVICE_NETWORK_FILE_SYSTEM   0x00000014
00066 #define FILE_DEVICE_NULL                  0x00000015
00067 #define FILE_DEVICE_PARALLEL_PORT         0x00000016
00068 #define FILE_DEVICE_PHYSICAL_NETCARD      0x00000017
00069 #define FILE_DEVICE_PRINTER               0x00000018
00070 #define FILE_DEVICE_SCANNER               0x00000019
00071 #define FILE_DEVICE_SERIAL_MOUSE_PORT     0x0000001a
00072 #define FILE_DEVICE_SERIAL_PORT           0x0000001b
00073 #define FILE_DEVICE_SCREEN                0x0000001c
00074 #define FILE_DEVICE_SOUND                 0x0000001d
00075 #define FILE_DEVICE_STREAMS               0x0000001e
00076 #define FILE_DEVICE_TAPE                  0x0000001f
00077 #define FILE_DEVICE_TAPE_FILE_SYSTEM      0x00000020
00078 #define FILE_DEVICE_TRANSPORT             0x00000021
00079 #define FILE_DEVICE_UNKNOWN               0x00000022
00080 #define FILE_DEVICE_VIDEO                 0x00000023
00081 #define FILE_DEVICE_VIRTUAL_DISK          0x00000024
00082 #define FILE_DEVICE_WAVE_IN               0x00000025
00083 #define FILE_DEVICE_WAVE_OUT              0x00000026
00084 #define FILE_DEVICE_8042_PORT             0x00000027
00085 #define FILE_DEVICE_NETWORK_REDIRECTOR    0x00000028
00086 #define FILE_DEVICE_BATTERY               0x00000029
00087 #define FILE_DEVICE_BUS_EXTENDER          0x0000002a
00088 #define FILE_DEVICE_MODEM                 0x0000002b
00089 #define FILE_DEVICE_VDM                   0x0000002c
00090 #define FILE_DEVICE_MASS_STORAGE          0x0000002d
00091 #define FILE_DEVICE_SMB                   0x0000002e
00092 #define FILE_DEVICE_KS                    0x0000002f
00093 #define FILE_DEVICE_CHANGER               0x00000030
00094 #define FILE_DEVICE_SMARTCARD             0x00000031
00095 #define FILE_DEVICE_ACPI                  0x00000032
00096 #define FILE_DEVICE_DVD                   0x00000033
00097 #define FILE_DEVICE_FULLSCREEN_VIDEO      0x00000034
00098 #define FILE_DEVICE_DFS_FILE_SYSTEM       0x00000035
00099 #define FILE_DEVICE_DFS_VOLUME            0x00000036
00100 #define FILE_DEVICE_SERENUM               0x00000037
00101 #define FILE_DEVICE_TERMSRV               0x00000038
00102 #define FILE_DEVICE_KSEC                  0x00000039
00103 #define FILE_DEVICE_FIPS                  0x0000003A
00104 #define FILE_DEVICE_INFINIBAND            0x0000003B
00105 #define FILE_DEVICE_VMBUS                 0x0000003E
00106 #define FILE_DEVICE_CRYPT_PROVIDER        0x0000003F
00107 #define FILE_DEVICE_WPD                   0x00000040
00108 #define FILE_DEVICE_BLUETOOTH             0x00000041
00109 #define FILE_DEVICE_MT_COMPOSITE          0x00000042
00110 #define FILE_DEVICE_MT_TRANSPORT          0x00000043
00111 #define FILE_DEVICE_BIOMETRIC             0x00000044
00112 #define FILE_DEVICE_PMI                   0x00000045
00113 
00114 $endif (_WDMDDK_ || _DEVIOCTL_)
00115 $if (_WDMDDK_)
00116 #if defined(NT_PROCESSOR_GROUPS)
00117 
00118 typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
00119 
00120 typedef enum _IRQ_DEVICE_POLICY_USHORT {
00121   IrqPolicyMachineDefault = 0,
00122   IrqPolicyAllCloseProcessors = 1,
00123   IrqPolicyOneCloseProcessor = 2,
00124   IrqPolicyAllProcessorsInMachine = 3,
00125   IrqPolicyAllProcessorsInGroup = 3,
00126   IrqPolicySpecifiedProcessors = 4,
00127   IrqPolicySpreadMessagesAcrossAllProcessors = 5};
00128 
00129 #else /* defined(NT_PROCESSOR_GROUPS) */
00130 
00131 typedef enum _IRQ_DEVICE_POLICY {
00132   IrqPolicyMachineDefault = 0,
00133   IrqPolicyAllCloseProcessors,
00134   IrqPolicyOneCloseProcessor,
00135   IrqPolicyAllProcessorsInMachine,
00136   IrqPolicySpecifiedProcessors,
00137   IrqPolicySpreadMessagesAcrossAllProcessors
00138 } IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
00139 
00140 #endif
00141 
00142 typedef enum _IRQ_PRIORITY {
00143   IrqPriorityUndefined = 0,
00144   IrqPriorityLow,
00145   IrqPriorityNormal,
00146   IrqPriorityHigh
00147 } IRQ_PRIORITY, *PIRQ_PRIORITY;
00148 
00149 typedef enum _IRQ_GROUP_POLICY {
00150   GroupAffinityAllGroupZero = 0,
00151   GroupAffinityDontCare
00152 } IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY;
00153 
00154 #define MAXIMUM_VOLUME_LABEL_LENGTH       (32 * sizeof(WCHAR))
00155 
00156 typedef struct _OBJECT_HANDLE_INFORMATION {
00157   ULONG HandleAttributes;
00158   ACCESS_MASK GrantedAccess;
00159 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
00160 
00161 typedef struct _CLIENT_ID {
00162   HANDLE UniqueProcess;
00163   HANDLE UniqueThread;
00164 } CLIENT_ID, *PCLIENT_ID;
00165 
00166 typedef struct _VPB {
00167   CSHORT Type;
00168   CSHORT Size;
00169   USHORT Flags;
00170   USHORT VolumeLabelLength;
00171   struct _DEVICE_OBJECT *DeviceObject;
00172   struct _DEVICE_OBJECT *RealDevice;
00173   ULONG SerialNumber;
00174   ULONG ReferenceCount;
00175   WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
00176 } VPB, *PVPB;
00177 
00178 typedef enum _IO_ALLOCATION_ACTION {
00179   KeepObject = 1,
00180   DeallocateObject,
00181   DeallocateObjectKeepRegisters
00182 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
00183 
00184 _Function_class_(DRIVER_CONTROL)
00185 _IRQL_requires_same_
00186 typedef IO_ALLOCATION_ACTION
00187 (NTAPI DRIVER_CONTROL)(
00188   _In_ struct _DEVICE_OBJECT *DeviceObject,
00189   _Inout_ struct _IRP *Irp,
00190   _In_ PVOID MapRegisterBase,
00191   _In_ PVOID Context);
00192 typedef DRIVER_CONTROL *PDRIVER_CONTROL;
00193 
00194 typedef struct _WAIT_CONTEXT_BLOCK {
00195   KDEVICE_QUEUE_ENTRY WaitQueueEntry;
00196   PDRIVER_CONTROL DeviceRoutine;
00197   PVOID DeviceContext;
00198   ULONG NumberOfMapRegisters;
00199   PVOID DeviceObject;
00200   PVOID CurrentIrp;
00201   PKDPC BufferChainingDpc;
00202 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
00203 
00204 $endif (_WDMDDK_)
00205 $if (_NTDDK_)
00206 /* DEVICE_OBJECT.Flags */
00207 #define DO_DEVICE_HAS_NAME                0x00000040
00208 #define DO_SYSTEM_BOOT_PARTITION          0x00000100
00209 #define DO_LONG_TERM_REQUESTS             0x00000200
00210 #define DO_NEVER_LAST_DEVICE              0x00000400
00211 #define DO_LOW_PRIORITY_FILESYSTEM        0x00010000
00212 #define DO_SUPPORTS_TRANSACTIONS          0x00040000
00213 #define DO_FORCE_NEITHER_IO               0x00080000
00214 #define DO_VOLUME_DEVICE_OBJECT           0x00100000
00215 #define DO_SYSTEM_SYSTEM_PARTITION        0x00200000
00216 #define DO_SYSTEM_CRITICAL_PARTITION      0x00400000
00217 #define DO_DISALLOW_EXECUTE               0x00800000
00218 
00219 $endif (_NTDDK_)
00220 $if (_WDMDDK_)
00221 /* DEVICE_OBJECT.Flags */
00222 #define DO_VERIFY_VOLUME                  0x00000002
00223 #define DO_BUFFERED_IO                    0x00000004
00224 #define DO_EXCLUSIVE                      0x00000008
00225 #define DO_DIRECT_IO                      0x00000010
00226 #define DO_MAP_IO_BUFFER                  0x00000020
00227 #define DO_DEVICE_INITIALIZING            0x00000080
00228 #define DO_SHUTDOWN_REGISTERED            0x00000800
00229 #define DO_BUS_ENUMERATED_DEVICE          0x00001000
00230 #define DO_POWER_PAGABLE                  0x00002000
00231 #define DO_POWER_INRUSH                   0x00004000
00232 
00233 /* DEVICE_OBJECT.Characteristics */
00234 #define FILE_REMOVABLE_MEDIA              0x00000001
00235 #define FILE_READ_ONLY_DEVICE             0x00000002
00236 #define FILE_FLOPPY_DISKETTE              0x00000004
00237 #define FILE_WRITE_ONCE_MEDIA             0x00000008
00238 #define FILE_REMOTE_DEVICE                0x00000010
00239 #define FILE_DEVICE_IS_MOUNTED            0x00000020
00240 #define FILE_VIRTUAL_VOLUME               0x00000040
00241 #define FILE_AUTOGENERATED_DEVICE_NAME    0x00000080
00242 #define FILE_DEVICE_SECURE_OPEN           0x00000100
00243 #define FILE_CHARACTERISTIC_PNP_DEVICE    0x00000800
00244 #define FILE_CHARACTERISTIC_TS_DEVICE     0x00001000
00245 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
00246 
00247 /* DEVICE_OBJECT.AlignmentRequirement */
00248 #define FILE_BYTE_ALIGNMENT             0x00000000
00249 #define FILE_WORD_ALIGNMENT             0x00000001
00250 #define FILE_LONG_ALIGNMENT             0x00000003
00251 #define FILE_QUAD_ALIGNMENT             0x00000007
00252 #define FILE_OCTA_ALIGNMENT             0x0000000f
00253 #define FILE_32_BYTE_ALIGNMENT          0x0000001f
00254 #define FILE_64_BYTE_ALIGNMENT          0x0000003f
00255 #define FILE_128_BYTE_ALIGNMENT         0x0000007f
00256 #define FILE_256_BYTE_ALIGNMENT         0x000000ff
00257 #define FILE_512_BYTE_ALIGNMENT         0x000001ff
00258 
00259 $endif (_NTDDK_)
00260 $if (_WDMDDK_ || _DEVIOCTL_)
00261 /* DEVICE_OBJECT.DeviceType */
00262 #define DEVICE_TYPE ULONG
00263 
00264 $endif (_WDMDDK_ || _DEVIOCTL_)
00265 $if (_WDMDDK_)
00266 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
00267   CSHORT Type;
00268   USHORT Size;
00269   LONG ReferenceCount;
00270   struct _DRIVER_OBJECT *DriverObject;
00271   struct _DEVICE_OBJECT *NextDevice;
00272   struct _DEVICE_OBJECT *AttachedDevice;
00273   struct _IRP *CurrentIrp;
00274   PIO_TIMER Timer;
00275   ULONG Flags;
00276   ULONG Characteristics;
00277   volatile PVPB Vpb;
00278   PVOID DeviceExtension;
00279   DEVICE_TYPE DeviceType;
00280   CCHAR StackSize;
00281   union {
00282     LIST_ENTRY ListEntry;
00283     WAIT_CONTEXT_BLOCK Wcb;
00284   } Queue;
00285   ULONG AlignmentRequirement;
00286   KDEVICE_QUEUE DeviceQueue;
00287   KDPC Dpc;
00288   ULONG ActiveThreadCount;
00289   PSECURITY_DESCRIPTOR SecurityDescriptor;
00290   KEVENT DeviceLock;
00291   USHORT SectorSize;
00292   USHORT Spare1;
00293   struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
00294   PVOID Reserved;
00295 } DEVICE_OBJECT, *PDEVICE_OBJECT;
00296 
00297 typedef enum _IO_SESSION_STATE {
00298   IoSessionStateCreated = 1,
00299   IoSessionStateInitialized,
00300   IoSessionStateConnected,
00301   IoSessionStateDisconnected,
00302   IoSessionStateDisconnectedLoggedOn,
00303   IoSessionStateLoggedOn,
00304   IoSessionStateLoggedOff,
00305   IoSessionStateTerminated,
00306   IoSessionStateMax
00307 } IO_SESSION_STATE, *PIO_SESSION_STATE;
00308 
00309 typedef enum _IO_COMPLETION_ROUTINE_RESULT {
00310   ContinueCompletion = STATUS_CONTINUE_COMPLETION,
00311   StopCompletion = STATUS_MORE_PROCESSING_REQUIRED
00312 } IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT;
00313 
00314 typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY {
00315   PHYSICAL_ADDRESS MessageAddress;
00316   KAFFINITY TargetProcessorSet;
00317   PKINTERRUPT InterruptObject;
00318   ULONG MessageData;
00319   ULONG Vector;
00320   KIRQL Irql;
00321   KINTERRUPT_MODE Mode;
00322   KINTERRUPT_POLARITY Polarity;
00323 } IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY;
00324 
00325 typedef struct _IO_INTERRUPT_MESSAGE_INFO {
00326   KIRQL UnifiedIrql;
00327   ULONG MessageCount;
00328   IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1];
00329 } IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO;
00330 
00331 typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS {
00332   _In_ PDEVICE_OBJECT PhysicalDeviceObject;
00333   _Out_ PKINTERRUPT *InterruptObject;
00334   _In_ PKSERVICE_ROUTINE ServiceRoutine;
00335   _In_ PVOID ServiceContext;
00336   _In_opt_ PKSPIN_LOCK SpinLock;
00337   _In_ KIRQL SynchronizeIrql;
00338   _In_ BOOLEAN FloatingSave;
00339   _In_ BOOLEAN ShareVector;
00340   _In_ ULONG Vector;
00341   _In_ KIRQL Irql;
00342   _In_ KINTERRUPT_MODE InterruptMode;
00343   _In_ KAFFINITY ProcessorEnableMask;
00344   _In_ USHORT Group;
00345 } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS;
00346 
00347 typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS {
00348   _In_ PDEVICE_OBJECT PhysicalDeviceObject;
00349   _Out_ PKINTERRUPT *InterruptObject;
00350   _In_ PKSERVICE_ROUTINE ServiceRoutine;
00351   _In_ PVOID ServiceContext;
00352   _In_opt_ PKSPIN_LOCK SpinLock;
00353   _In_opt_ KIRQL SynchronizeIrql;
00354   _In_ BOOLEAN FloatingSave;
00355 } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS;
00356 
00357 typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
00358   _In_ PDEVICE_OBJECT PhysicalDeviceObject;
00359   union {
00360     _Out_ PVOID *Generic;
00361     _Out_ PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable;
00362     _Out_ PKINTERRUPT *InterruptObject;
00363   } ConnectionContext;
00364   _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine;
00365   _In_ PVOID ServiceContext;
00366   _In_opt_ PKSPIN_LOCK SpinLock;
00367   _In_opt_ KIRQL SynchronizeIrql;
00368   _In_ BOOLEAN FloatingSave;
00369   _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine;
00370 } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS;
00371 
00372 typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
00373   _Inout_ ULONG Version;
00374   _ANONYMOUS_UNION union {
00375     IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
00376     IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
00377     IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
00378   } DUMMYUNIONNAME;
00379 } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
00380 
00381 typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
00382   _In_ ULONG Version;
00383   union {
00384     _In_ PVOID Generic;
00385     _In_ PKINTERRUPT InterruptObject;
00386     _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable;
00387   } ConnectionContext;
00388 } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS;
00389 
00390 typedef enum _IO_ACCESS_TYPE {
00391   ReadAccess,
00392   WriteAccess,
00393   ModifyAccess
00394 } IO_ACCESS_TYPE;
00395 
00396 typedef enum _IO_ACCESS_MODE {
00397   SequentialAccess,
00398   RandomAccess
00399 } IO_ACCESS_MODE;
00400 
00401 typedef enum _IO_CONTAINER_NOTIFICATION_CLASS {
00402   IoSessionStateNotification,
00403   IoMaxContainerNotificationClass
00404 } IO_CONTAINER_NOTIFICATION_CLASS;
00405 
00406 typedef struct _IO_SESSION_STATE_NOTIFICATION {
00407   ULONG Size;
00408   ULONG Flags;
00409   PVOID IoObject;
00410   ULONG EventMask;
00411   PVOID Context;
00412 } IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION;
00413 
00414 typedef enum _IO_CONTAINER_INFORMATION_CLASS {
00415   IoSessionStateInformation,
00416   IoMaxContainerInformationClass
00417 } IO_CONTAINER_INFORMATION_CLASS;
00418 
00419 typedef struct _IO_SESSION_STATE_INFORMATION {
00420   ULONG SessionId;
00421   IO_SESSION_STATE SessionState;
00422   BOOLEAN LocalSession;
00423 } IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION;
00424 
00425 #if (NTDDI_VERSION >= NTDDI_WIN7)
00426 
00427 typedef NTSTATUS
00428 (NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)(
00429   VOID);
00430 
00431 typedef NTSTATUS
00432 (NTAPI IO_SESSION_NOTIFICATION_FUNCTION)(
00433   _In_ PVOID SessionObject,
00434   _In_ PVOID IoObject,
00435   _In_ ULONG Event,
00436   _In_ PVOID Context,
00437   _In_reads_bytes_opt_(PayloadLength) PVOID NotificationPayload,
00438   _In_ ULONG PayloadLength);
00439 
00440 typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION;
00441 
00442 #endif
00443 
00444 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
00445 
00446 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
00447   BOOLEAN Removed;
00448   BOOLEAN Reserved[3];
00449   volatile LONG IoCount;
00450   KEVENT RemoveEvent;
00451 } IO_REMOVE_LOCK_COMMON_BLOCK;
00452 
00453 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
00454   LONG Signature;
00455   LONG HighWatermark;
00456   LONGLONG MaxLockedTicks;
00457   LONG AllocateTag;
00458   LIST_ENTRY LockList;
00459   KSPIN_LOCK Spin;
00460   volatile LONG LowMemoryCount;
00461   ULONG Reserved1[4];
00462   PVOID Reserved2;
00463   PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
00464 } IO_REMOVE_LOCK_DBG_BLOCK;
00465 
00466 typedef struct _IO_REMOVE_LOCK {
00467   IO_REMOVE_LOCK_COMMON_BLOCK Common;
00468 #if DBG
00469   IO_REMOVE_LOCK_DBG_BLOCK Dbg;
00470 #endif
00471 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
00472 
00473 typedef struct _IO_WORKITEM *PIO_WORKITEM;
00474 
00475 _Function_class_(IO_WORKITEM_ROUTINE)
00476 _IRQL_requires_(PASSIVE_LEVEL)
00477 _IRQL_requires_same_
00478 typedef VOID
00479 (NTAPI IO_WORKITEM_ROUTINE)(
00480   _In_ PDEVICE_OBJECT DeviceObject,
00481   _In_opt_ PVOID Context);
00482 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
00483 
00484 typedef VOID
00485 (NTAPI IO_WORKITEM_ROUTINE_EX)(
00486   _In_ PVOID IoObject,
00487   _In_opt_ PVOID Context,
00488   _In_ PIO_WORKITEM IoWorkItem);
00489 typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
00490 
00491 typedef struct _SHARE_ACCESS {
00492   ULONG OpenCount;
00493   ULONG Readers;
00494   ULONG Writers;
00495   ULONG Deleters;
00496   ULONG SharedRead;
00497   ULONG SharedWrite;
00498   ULONG SharedDelete;
00499 } SHARE_ACCESS, *PSHARE_ACCESS;
00500 
00501 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
00502    inheritance, even from a struct renders the type non-POD. So we use
00503    this hack */
00504 #define PCI_COMMON_HEADER_LAYOUT                \
00505   USHORT VendorID;                              \
00506   USHORT DeviceID;                              \
00507   USHORT Command;                               \
00508   USHORT Status;                                \
00509   UCHAR RevisionID;                             \
00510   UCHAR ProgIf;                                 \
00511   UCHAR SubClass;                               \
00512   UCHAR BaseClass;                              \
00513   UCHAR CacheLineSize;                          \
00514   UCHAR LatencyTimer;                           \
00515   UCHAR HeaderType;                             \
00516   UCHAR BIST;                                   \
00517   union {                                       \
00518     struct _PCI_HEADER_TYPE_0 {                 \
00519       ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
00520       ULONG CIS;                                \
00521       USHORT SubVendorID;                       \
00522       USHORT SubSystemID;                       \
00523       ULONG ROMBaseAddress;                     \
00524       UCHAR CapabilitiesPtr;                    \
00525       UCHAR Reserved1[3];                       \
00526       ULONG Reserved2;                          \
00527       UCHAR InterruptLine;                      \
00528       UCHAR InterruptPin;                       \
00529       UCHAR MinimumGrant;                       \
00530       UCHAR MaximumLatency;                     \
00531     } type0;                                    \
00532     struct _PCI_HEADER_TYPE_1 {                 \
00533       ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
00534       UCHAR PrimaryBus;                         \
00535       UCHAR SecondaryBus;                       \
00536       UCHAR SubordinateBus;                     \
00537       UCHAR SecondaryLatency;                   \
00538       UCHAR IOBase;                             \
00539       UCHAR IOLimit;                            \
00540       USHORT SecondaryStatus;                   \
00541       USHORT MemoryBase;                        \
00542       USHORT MemoryLimit;                       \
00543       USHORT PrefetchBase;                      \
00544       USHORT PrefetchLimit;                     \
00545       ULONG PrefetchBaseUpper32;                \
00546       ULONG PrefetchLimitUpper32;               \
00547       USHORT IOBaseUpper16;                     \
00548       USHORT IOLimitUpper16;                    \
00549       UCHAR CapabilitiesPtr;                    \
00550       UCHAR Reserved1[3];                       \
00551       ULONG ROMBaseAddress;                     \
00552       UCHAR InterruptLine;                      \
00553       UCHAR InterruptPin;                       \
00554       USHORT BridgeControl;                     \
00555     } type1;                                    \
00556     struct _PCI_HEADER_TYPE_2 {                 \
00557       ULONG SocketRegistersBaseAddress;         \
00558       UCHAR CapabilitiesPtr;                    \
00559       UCHAR Reserved;                           \
00560       USHORT SecondaryStatus;                   \
00561       UCHAR PrimaryBus;                         \
00562       UCHAR SecondaryBus;                       \
00563       UCHAR SubordinateBus;                     \
00564       UCHAR SecondaryLatency;                   \
00565       struct {                                  \
00566         ULONG Base;                             \
00567         ULONG Limit;                            \
00568       } Range[PCI_TYPE2_ADDRESSES-1];           \
00569       UCHAR InterruptLine;                      \
00570       UCHAR InterruptPin;                       \
00571       USHORT BridgeControl;                     \
00572     } type2;                                    \
00573   } u;
00574 
00575 typedef enum _CREATE_FILE_TYPE {
00576   CreateFileTypeNone,
00577   CreateFileTypeNamedPipe,
00578   CreateFileTypeMailslot
00579 } CREATE_FILE_TYPE;
00580 
00581 #define IO_FORCE_ACCESS_CHECK               0x001
00582 #define IO_NO_PARAMETER_CHECKING            0x100
00583 
00584 #define IO_REPARSE                      0x0
00585 #define IO_REMOUNT                      0x1
00586 
00587 typedef struct _IO_STATUS_BLOCK {
00588   _ANONYMOUS_UNION union {
00589     NTSTATUS Status;
00590     PVOID Pointer;
00591   } DUMMYUNIONNAME;
00592   ULONG_PTR Information;
00593 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
00594 
00595 #if defined(_WIN64)
00596 typedef struct _IO_STATUS_BLOCK32 {
00597   NTSTATUS Status;
00598   ULONG Information;
00599 } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
00600 #endif
00601 
00602 typedef VOID
00603 (NTAPI *PIO_APC_ROUTINE)(
00604   _In_ PVOID ApcContext,
00605   _In_ PIO_STATUS_BLOCK IoStatusBlock,
00606   _In_ ULONG Reserved);
00607 
00608 #define PIO_APC_ROUTINE_DEFINED
00609 
00610 typedef enum _IO_SESSION_EVENT {
00611   IoSessionEventIgnore = 0,
00612   IoSessionEventCreated,
00613   IoSessionEventTerminated,
00614   IoSessionEventConnected,
00615   IoSessionEventDisconnected,
00616   IoSessionEventLogon,
00617   IoSessionEventLogoff,
00618   IoSessionEventMax
00619 } IO_SESSION_EVENT, *PIO_SESSION_EVENT;
00620 
00621 #define IO_SESSION_STATE_ALL_EVENTS        0xffffffff
00622 #define IO_SESSION_STATE_CREATION_EVENT    0x00000001
00623 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
00624 #define IO_SESSION_STATE_CONNECT_EVENT     0x00000004
00625 #define IO_SESSION_STATE_DISCONNECT_EVENT  0x00000008
00626 #define IO_SESSION_STATE_LOGON_EVENT       0x00000010
00627 #define IO_SESSION_STATE_LOGOFF_EVENT      0x00000020
00628 
00629 #define IO_SESSION_STATE_VALID_EVENT_MASK  0x0000003f
00630 
00631 #define IO_SESSION_MAX_PAYLOAD_SIZE        256L
00632 
00633 typedef struct _IO_SESSION_CONNECT_INFO {
00634   ULONG SessionId;
00635   BOOLEAN LocalSession;
00636 } IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO;
00637 
00638 #define EVENT_INCREMENT                   1
00639 #define IO_NO_INCREMENT                   0
00640 #define IO_CD_ROM_INCREMENT               1
00641 #define IO_DISK_INCREMENT                 1
00642 #define IO_KEYBOARD_INCREMENT             6
00643 #define IO_MAILSLOT_INCREMENT             2
00644 #define IO_MOUSE_INCREMENT                6
00645 #define IO_NAMED_PIPE_INCREMENT           2
00646 #define IO_NETWORK_INCREMENT              2
00647 #define IO_PARALLEL_INCREMENT             1
00648 #define IO_SERIAL_INCREMENT               2
00649 #define IO_SOUND_INCREMENT                8
00650 #define IO_VIDEO_INCREMENT                1
00651 #define SEMAPHORE_INCREMENT               1
00652 
00653 #define MM_MAXIMUM_DISK_IO_SIZE          (0x10000)
00654 
00655 typedef struct _BOOTDISK_INFORMATION {
00656   LONGLONG BootPartitionOffset;
00657   LONGLONG SystemPartitionOffset;
00658   ULONG BootDeviceSignature;
00659   ULONG SystemDeviceSignature;
00660 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
00661 
00662 typedef struct _BOOTDISK_INFORMATION_EX {
00663   LONGLONG BootPartitionOffset;
00664   LONGLONG SystemPartitionOffset;
00665   ULONG BootDeviceSignature;
00666   ULONG SystemDeviceSignature;
00667   GUID BootDeviceGuid;
00668   GUID SystemDeviceGuid;
00669   BOOLEAN BootDeviceIsGpt;
00670   BOOLEAN SystemDeviceIsGpt;
00671 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
00672 
00673 #if (NTDDI_VERSION >= NTDDI_WIN7)
00674 
00675 typedef struct _LOADER_PARTITION_INFORMATION_EX {
00676   ULONG PartitionStyle;
00677   ULONG PartitionNumber;
00678   _ANONYMOUS_UNION union {
00679     ULONG Signature;
00680     GUID DeviceId;
00681   } DUMMYUNIONNAME;
00682   ULONG Flags;
00683 } LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
00684 
00685 typedef struct _BOOTDISK_INFORMATION_LITE {
00686   ULONG NumberEntries;
00687   LOADER_PARTITION_INFORMATION_EX Entries[1];
00688 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
00689 
00690 #else
00691 
00692 #if (NTDDI_VERSION >= NTDDI_VISTA)
00693 typedef struct _BOOTDISK_INFORMATION_LITE {
00694   ULONG BootDeviceSignature;
00695   ULONG SystemDeviceSignature;
00696   GUID BootDeviceGuid;
00697   GUID SystemDeviceGuid;
00698   BOOLEAN BootDeviceIsGpt;
00699   BOOLEAN SystemDeviceIsGpt;
00700 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
00701 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
00702 
00703 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
00704 
00705 #include <pshpack1.h>
00706 
00707 typedef struct _EISA_MEMORY_TYPE {
00708   UCHAR ReadWrite:1;
00709   UCHAR Cached:1;
00710   UCHAR Reserved0:1;
00711   UCHAR Type:2;
00712   UCHAR Shared:1;
00713   UCHAR Reserved1:1;
00714   UCHAR MoreEntries:1;
00715 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
00716 
00717 typedef struct _EISA_MEMORY_CONFIGURATION {
00718   EISA_MEMORY_TYPE ConfigurationByte;
00719   UCHAR DataSize;
00720   USHORT AddressLowWord;
00721   UCHAR AddressHighByte;
00722   USHORT MemorySize;
00723 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
00724 
00725 typedef struct _EISA_IRQ_DESCRIPTOR {
00726   UCHAR Interrupt:4;
00727   UCHAR Reserved:1;
00728   UCHAR LevelTriggered:1;
00729   UCHAR Shared:1;
00730   UCHAR MoreEntries:1;
00731 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
00732 
00733 typedef struct _EISA_IRQ_CONFIGURATION {
00734   EISA_IRQ_DESCRIPTOR ConfigurationByte;
00735   UCHAR Reserved;
00736 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
00737 
00738 typedef struct _DMA_CONFIGURATION_BYTE0 {
00739   UCHAR Channel:3;
00740   UCHAR Reserved:3;
00741   UCHAR Shared:1;
00742   UCHAR MoreEntries:1;
00743 } DMA_CONFIGURATION_BYTE0;
00744 
00745 typedef struct _DMA_CONFIGURATION_BYTE1 {
00746   UCHAR Reserved0:2;
00747   UCHAR TransferSize:2;
00748   UCHAR Timing:2;
00749   UCHAR Reserved1:2;
00750 } DMA_CONFIGURATION_BYTE1;
00751 
00752 typedef struct _EISA_DMA_CONFIGURATION {
00753   DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
00754   DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
00755 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
00756 
00757 typedef struct _EISA_PORT_DESCRIPTOR {
00758   UCHAR NumberPorts:5;
00759   UCHAR Reserved:1;
00760   UCHAR Shared:1;
00761   UCHAR MoreEntries:1;
00762 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
00763 
00764 typedef struct _EISA_PORT_CONFIGURATION {
00765   EISA_PORT_DESCRIPTOR Configuration;
00766   USHORT PortAddress;
00767 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
00768 
00769 typedef struct _CM_EISA_SLOT_INFORMATION {
00770   UCHAR ReturnCode;
00771   UCHAR ReturnFlags;
00772   UCHAR MajorRevision;
00773   UCHAR MinorRevision;
00774   USHORT Checksum;
00775   UCHAR NumberFunctions;
00776   UCHAR FunctionInformation;
00777   ULONG CompressedId;
00778 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
00779 
00780 typedef struct _CM_EISA_FUNCTION_INFORMATION {
00781   ULONG CompressedId;
00782   UCHAR IdSlotFlags1;
00783   UCHAR IdSlotFlags2;
00784   UCHAR MinorRevision;
00785   UCHAR MajorRevision;
00786   UCHAR Selections[26];
00787   UCHAR FunctionFlags;
00788   UCHAR TypeString[80];
00789   EISA_MEMORY_CONFIGURATION EisaMemory[9];
00790   EISA_IRQ_CONFIGURATION EisaIrq[7];
00791   EISA_DMA_CONFIGURATION EisaDma[4];
00792   EISA_PORT_CONFIGURATION EisaPort[20];
00793   UCHAR InitializationData[60];
00794 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
00795 
00796 #include <poppack.h>
00797 
00798 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
00799 
00800 #define EISA_FUNCTION_ENABLED           0x80
00801 #define EISA_FREE_FORM_DATA             0x40
00802 #define EISA_HAS_PORT_INIT_ENTRY        0x20
00803 #define EISA_HAS_PORT_RANGE             0x10
00804 #define EISA_HAS_DMA_ENTRY              0x08
00805 #define EISA_HAS_IRQ_ENTRY              0x04
00806 #define EISA_HAS_MEMORY_ENTRY           0x02
00807 #define EISA_HAS_TYPE_ENTRY             0x01
00808 #define EISA_HAS_INFORMATION \
00809   (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
00810   + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
00811 
00812 #define EISA_MORE_ENTRIES               0x80
00813 #define EISA_SYSTEM_MEMORY              0x00
00814 #define EISA_MEMORY_TYPE_RAM            0x01
00815 
00816 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
00817 
00818 #define EISA_INVALID_SLOT               0x80
00819 #define EISA_INVALID_FUNCTION           0x81
00820 #define EISA_INVALID_CONFIGURATION      0x82
00821 #define EISA_EMPTY_SLOT                 0x83
00822 #define EISA_INVALID_BIOS_CALL          0x86
00823 
00824 /*
00825 ** Plug and Play structures
00826 */
00827 
00828 typedef VOID
00829 (NTAPI *PINTERFACE_REFERENCE)(
00830   PVOID Context);
00831 
00832 typedef VOID
00833 (NTAPI *PINTERFACE_DEREFERENCE)(
00834   PVOID Context);
00835 
00836 _Function_class_(TRANSLATE_BUS_ADDRESS)
00837 _IRQL_requires_same_
00838 typedef BOOLEAN
00839 (NTAPI TRANSLATE_BUS_ADDRESS)(
00840   _Inout_opt_ PVOID Context,
00841   _In_ PHYSICAL_ADDRESS BusAddress,
00842   _In_ ULONG Length,
00843   _Out_ PULONG AddressSpace,
00844   _Out_ PPHYSICAL_ADDRESS TranslatedAddress);
00845 typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
00846 
00847 _Function_class_(GET_DMA_ADAPTER)
00848 _IRQL_requires_same_
00849 typedef struct _DMA_ADAPTER*
00850 (NTAPI GET_DMA_ADAPTER)(
00851   _Inout_opt_ PVOID Context,
00852   _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor,
00853   _Out_ PULONG NumberOfMapRegisters);
00854 typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
00855 
00856 _Function_class_(GET_SET_DEVICE_DATA)
00857 _IRQL_requires_same_
00858 typedef ULONG
00859 (NTAPI GET_SET_DEVICE_DATA)(
00860   _Inout_opt_ PVOID Context,
00861   _In_ ULONG DataType,
00862   _Inout_updates_bytes_(Length) PVOID Buffer,
00863   _In_ ULONG Offset,
00864   _In_ ULONG Length);
00865 typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
00866 
00867 typedef enum _DEVICE_INSTALL_STATE {
00868   InstallStateInstalled,
00869   InstallStateNeedsReinstall,
00870   InstallStateFailedInstall,
00871   InstallStateFinishInstall
00872 } DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE;
00873 
00874 typedef struct _LEGACY_BUS_INFORMATION {
00875   GUID BusTypeGuid;
00876   INTERFACE_TYPE LegacyBusType;
00877   ULONG BusNumber;
00878 } LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
00879 
00880 typedef enum _DEVICE_REMOVAL_POLICY {
00881   RemovalPolicyExpectNoRemoval = 1,
00882   RemovalPolicyExpectOrderlyRemoval = 2,
00883   RemovalPolicyExpectSurpriseRemoval = 3
00884 } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY;
00885 
00886 typedef VOID
00887 (NTAPI *PREENUMERATE_SELF)(
00888   _In_ PVOID Context);
00889 
00890 typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD {
00891   USHORT Size;
00892   USHORT Version;
00893   PVOID Context;
00894   PINTERFACE_REFERENCE InterfaceReference;
00895   PINTERFACE_DEREFERENCE InterfaceDereference;
00896   PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf;
00897 } REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD;
00898 
00899 typedef VOID
00900 (NTAPI *PIO_DEVICE_EJECT_CALLBACK)(
00901   _In_ NTSTATUS Status,
00902   _Inout_opt_ PVOID Context);
00903 
00904 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION     1
00905 
00906 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
00907 #define PCI_USE_SUBSYSTEM_IDS   0x00000001
00908 #define PCI_USE_REVISION        0x00000002
00909 #define PCI_USE_VENDEV_IDS      0x00000004
00910 #define PCI_USE_CLASS_SUBCLASS  0x00000008
00911 #define PCI_USE_PROGIF          0x00000010
00912 #define PCI_USE_LOCAL_BUS       0x00000020
00913 #define PCI_USE_LOCAL_DEVICE    0x00000040
00914 
00915 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
00916   ULONG Size;
00917   ULONG Flags;
00918   USHORT VendorID;
00919   USHORT DeviceID;
00920   UCHAR RevisionID;
00921   USHORT SubVendorID;
00922   USHORT SubSystemID;
00923   UCHAR BaseClass;
00924   UCHAR SubClass;
00925   UCHAR ProgIf;
00926 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
00927 
00928 _IRQL_requires_max_(PASSIVE_LEVEL)
00929 _Must_inspect_result_
00930 typedef BOOLEAN
00931 (NTAPI PCI_IS_DEVICE_PRESENT)(
00932   _In_ USHORT VendorID,
00933   _In_ USHORT DeviceID,
00934   _In_ UCHAR RevisionID,
00935   _In_ USHORT SubVendorID,
00936   _In_ USHORT SubSystemID,
00937   _In_ ULONG Flags);
00938 typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
00939 
00940 _IRQL_requires_max_(PASSIVE_LEVEL)
00941 _Must_inspect_result_
00942 typedef BOOLEAN
00943 (NTAPI PCI_IS_DEVICE_PRESENT_EX)(
00944   _In_ PVOID Context,
00945   _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
00946 typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
00947 
00948 typedef struct _BUS_INTERFACE_STANDARD {
00949   USHORT Size;
00950   USHORT Version;
00951   PVOID Context;
00952   PINTERFACE_REFERENCE InterfaceReference;
00953   PINTERFACE_DEREFERENCE InterfaceDereference;
00954   PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
00955   PGET_DMA_ADAPTER GetDmaAdapter;
00956   PGET_SET_DEVICE_DATA SetBusData;
00957   PGET_SET_DEVICE_DATA GetBusData;
00958 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
00959 
00960 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
00961   USHORT Size;
00962   USHORT Version;
00963   PVOID Context;
00964   PINTERFACE_REFERENCE InterfaceReference;
00965   PINTERFACE_DEREFERENCE InterfaceDereference;
00966   PPCI_IS_DEVICE_PRESENT IsDevicePresent;
00967   PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
00968 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
00969 
00970 _Struct_size_bytes_(Size)
00971 typedef struct _DEVICE_CAPABILITIES {
00972   _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES)) USHORT Size;
00973   USHORT Version;
00974   ULONG DeviceD1:1;
00975   ULONG DeviceD2:1;
00976   ULONG LockSupported:1;
00977   ULONG EjectSupported:1;
00978   ULONG Removable:1;
00979   ULONG DockDevice:1;
00980   ULONG UniqueID:1;
00981   ULONG SilentInstall:1;
00982   ULONG RawDeviceOK:1;
00983   ULONG SurpriseRemovalOK:1;
00984   ULONG WakeFromD0:1;
00985   ULONG WakeFromD1:1;
00986   ULONG WakeFromD2:1;
00987   ULONG WakeFromD3:1;
00988   ULONG HardwareDisabled:1;
00989   ULONG NonDynamic:1;
00990   ULONG WarmEjectSupported:1;
00991   ULONG NoDisplayInUI:1;
00992   ULONG Reserved:14;
00993   ULONG Address;
00994   ULONG UINumber;
00995   DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
00996   SYSTEM_POWER_STATE SystemWake;
00997   DEVICE_POWER_STATE DeviceWake;
00998   ULONG D1Latency;
00999   ULONG D2Latency;
01000   ULONG D3Latency;
01001 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
01002 
01003 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
01004   USHORT Version;
01005   USHORT Size;
01006   GUID Event;
01007   GUID InterfaceClassGuid;
01008   PUNICODE_STRING SymbolicLinkName;
01009 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
01010 
01011 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
01012   USHORT Version;
01013   USHORT Size;
01014   GUID Event;
01015 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
01016 
01017 #undef INTERFACE
01018 
01019 typedef struct _INTERFACE {
01020   USHORT Size;
01021   USHORT Version;
01022   PVOID Context;
01023   PINTERFACE_REFERENCE InterfaceReference;
01024   PINTERFACE_DEREFERENCE InterfaceDereference;
01025 } INTERFACE, *PINTERFACE;
01026 
01027 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
01028   USHORT Version;
01029   USHORT Size;
01030   GUID Event;
01031 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
01032 
01033 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
01034 
01035 /* PNP_DEVICE_STATE */
01036 
01037 #define PNP_DEVICE_DISABLED                      0x00000001
01038 #define PNP_DEVICE_DONT_DISPLAY_IN_UI            0x00000002
01039 #define PNP_DEVICE_FAILED                        0x00000004
01040 #define PNP_DEVICE_REMOVED                       0x00000008
01041 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
01042 #define PNP_DEVICE_NOT_DISABLEABLE               0x00000020
01043 
01044 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
01045   USHORT Version;
01046   USHORT Size;
01047   GUID Event;
01048   struct _FILE_OBJECT *FileObject;
01049   LONG NameBufferOffset;
01050   UCHAR CustomDataBuffer[1];
01051 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
01052 
01053 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
01054   USHORT Version;
01055   USHORT Size;
01056   GUID Event;
01057   struct _FILE_OBJECT *FileObject;
01058 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
01059 
01060 #if (NTDDI_VERSION >= NTDDI_VISTA)
01061 #include <devpropdef.h>
01062 #define PLUGPLAY_PROPERTY_PERSISTENT   0x00000001
01063 #endif
01064 
01065 #define PNP_REPLACE_NO_MAP             MAXLONGLONG
01066 
01067 _Must_inspect_result_
01068 typedef NTSTATUS
01069 (NTAPI *PREPLACE_MAP_MEMORY)(
01070   _In_ PHYSICAL_ADDRESS TargetPhysicalAddress,
01071   _In_ PHYSICAL_ADDRESS SparePhysicalAddress,
01072   _Inout_ PLARGE_INTEGER NumberOfBytes,
01073   _Outptr_ PVOID *TargetAddress,
01074   _Outptr_ PVOID *SpareAddress);
01075 
01076 typedef struct _PNP_REPLACE_MEMORY_LIST {
01077   ULONG AllocatedCount;
01078   ULONG Count;
01079   ULONGLONG TotalLength;
01080   struct {
01081     PHYSICAL_ADDRESS Address;
01082     ULONGLONG Length;
01083   } Ranges[ANYSIZE_ARRAY];
01084 } PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST;
01085 
01086 typedef struct _PNP_REPLACE_PROCESSOR_LIST {
01087   PKAFFINITY Affinity;
01088   _Field_range_(<=, MAXIMUM_GROUPS) ULONG GroupCount;
01089   ULONG AllocatedCount;
01090   ULONG Count;
01091   ULONG ApicIds[ANYSIZE_ARRAY];
01092 } PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST;
01093 
01094 typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 {
01095   KAFFINITY AffinityMask;
01096   ULONG AllocatedCount;
01097   ULONG Count;
01098   ULONG ApicIds[ANYSIZE_ARRAY];
01099 } PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1;
01100 
01101 #define PNP_REPLACE_PARAMETERS_VERSION           2
01102 
01103 typedef struct _PNP_REPLACE_PARAMETERS {
01104   ULONG Size;
01105   ULONG Version;
01106   ULONG64 Target;
01107   ULONG64 Spare;
01108   PPNP_REPLACE_PROCESSOR_LIST TargetProcessors;
01109   PPNP_REPLACE_PROCESSOR_LIST SpareProcessors;
01110   PPNP_REPLACE_MEMORY_LIST TargetMemory;
01111   PPNP_REPLACE_MEMORY_LIST SpareMemory;
01112   PREPLACE_MAP_MEMORY MapMemory;
01113 } PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS;
01114 
01115 typedef VOID
01116 (NTAPI *PREPLACE_UNLOAD)(
01117   VOID);
01118 
01119 _Must_inspect_result_
01120 typedef NTSTATUS
01121 (NTAPI *PREPLACE_BEGIN)(
01122   _In_ PPNP_REPLACE_PARAMETERS Parameters,
01123   _Outptr_ PVOID *Context);
01124 
01125 _Must_inspect_result_
01126 typedef NTSTATUS
01127 (NTAPI *PREPLACE_END)(
01128   _In_ PVOID Context);
01129 
01130 _Must_inspect_result_
01131 typedef NTSTATUS
01132 (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)(
01133   _In_ PVOID Context,
01134   _In_ PHYSICAL_ADDRESS PhysicalAddress,
01135   _In_ LARGE_INTEGER ByteCount);
01136 
01137 _Must_inspect_result_
01138 typedef NTSTATUS
01139 (NTAPI *PREPLACE_SET_PROCESSOR_ID)(
01140   _In_ PVOID Context,
01141   _In_ ULONG ApicId,
01142   _In_ BOOLEAN Target);
01143 
01144 _Must_inspect_result_
01145 typedef NTSTATUS
01146 (NTAPI *PREPLACE_SWAP)(
01147   _In_ PVOID Context);
01148 
01149 _Must_inspect_result_
01150 typedef NTSTATUS
01151 (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)(
01152   _In_ PVOID Context);
01153 
01154 _Must_inspect_result_
01155 typedef NTSTATUS
01156 (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)(
01157   _In_ PVOID Context);
01158 
01159 _Must_inspect_result_
01160 typedef NTSTATUS
01161 (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)(
01162   _In_ PVOID Context,
01163   _In_ PHYSICAL_ADDRESS SourceAddress,
01164   _Out_ PPHYSICAL_ADDRESS DestinationAddress);
01165 
01166 _Must_inspect_result_
01167 typedef NTSTATUS
01168 (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)(
01169   _In_ PVOID Context,
01170   _In_ BOOLEAN Enable);
01171 
01172 #define PNP_REPLACE_DRIVER_INTERFACE_VERSION      1
01173 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
01174              FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
01175 
01176 #define PNP_REPLACE_MEMORY_SUPPORTED             0x0001
01177 #define PNP_REPLACE_PROCESSOR_SUPPORTED          0x0002
01178 #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING    0x0004
01179 #define PNP_REPLACE_HARDWARE_PAGE_COPY           0x0008
01180 #define PNP_REPLACE_HARDWARE_QUIESCE             0x0010
01181 
01182 typedef struct _PNP_REPLACE_DRIVER_INTERFACE {
01183   ULONG Size;
01184   ULONG Version;
01185   ULONG Flags;
01186   PREPLACE_UNLOAD Unload;
01187   PREPLACE_BEGIN BeginReplace;
01188   PREPLACE_END EndReplace;
01189   PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory;
01190   PREPLACE_SET_PROCESSOR_ID SetProcessorId;
01191   PREPLACE_SWAP Swap;
01192   PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror;
01193   PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory;
01194   PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination;
01195   PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce;
01196 } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE;
01197 
01198 _Must_inspect_result_
01199 typedef NTSTATUS
01200 (NTAPI *PREPLACE_DRIVER_INIT)(
01201   _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface,
01202   _In_ PVOID Unused);
01203 
01204 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
01205   DeviceUsageTypeUndefined,
01206   DeviceUsageTypePaging,
01207   DeviceUsageTypeHibernation,
01208   DeviceUsageTypeDumpFile
01209 } DEVICE_USAGE_NOTIFICATION_TYPE;
01210 
01211 typedef struct _POWER_SEQUENCE {
01212   ULONG SequenceD1;
01213   ULONG SequenceD2;
01214   ULONG SequenceD3;
01215 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
01216 
01217 #ifdef _PREFAST_
01218 #define __string_type      0x1000
01219 #define __guid_type        0x2000
01220 #define __multiString_type 0x4000
01221 #else
01222 #define __string_type      0
01223 #define __guid_type        0
01224 #define __multiString_type 0
01225 #endif
01226 
01227 typedef enum {
01228   DevicePropertyDeviceDescription = 0x0 | __string_type,
01229   DevicePropertyHardwareID = 0x1 | __multiString_type,
01230   DevicePropertyCompatibleIDs = 0x2 | __multiString_type,
01231   DevicePropertyBootConfiguration = 0x3,
01232   DevicePropertyBootConfigurationTranslated = 0x4,
01233   DevicePropertyClassName = 0x5 | __string_type,
01234   DevicePropertyClassGuid = 0x6 | __string_type,
01235   DevicePropertyDriverKeyName = 0x7 | __string_type,
01236   DevicePropertyManufacturer = 0x8 | __string_type,
01237   DevicePropertyFriendlyName = 0x9 | __string_type,
01238   DevicePropertyLocationInformation = 0xa | __string_type,
01239   DevicePropertyPhysicalDeviceObjectName = 0xb | __string_type,
01240   DevicePropertyBusTypeGuid = 0xc | __guid_type,
01241   DevicePropertyLegacyBusType = 0xd,
01242   DevicePropertyBusNumber = 0xe,
01243   DevicePropertyEnumeratorName = 0xf | __string_type,
01244   DevicePropertyAddress = 0x10,
01245   DevicePropertyUINumber = 0x11,
01246   DevicePropertyInstallState = 0x12,
01247   DevicePropertyRemovalPolicy = 0x13,
01248   DevicePropertyResourceRequirements = 0x14,
01249   DevicePropertyAllocatedResources = 0x15,
01250   DevicePropertyContainerID = 0x16 | __string_type
01251 } DEVICE_REGISTRY_PROPERTY;
01252 
01253 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
01254   EventCategoryReserved,
01255   EventCategoryHardwareProfileChange,
01256   EventCategoryDeviceInterfaceChange,
01257   EventCategoryTargetDeviceChange
01258 } IO_NOTIFICATION_EVENT_CATEGORY;
01259 
01260 typedef enum _IO_PRIORITY_HINT {
01261   IoPriorityVeryLow = 0,
01262   IoPriorityLow,
01263   IoPriorityNormal,
01264   IoPriorityHigh,
01265   IoPriorityCritical,
01266   MaxIoPriorityTypes
01267 } IO_PRIORITY_HINT;
01268 
01269 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES    0x00000001
01270 
01271 _Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE)
01272 _IRQL_requires_max_(PASSIVE_LEVEL)
01273 typedef NTSTATUS
01274 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
01275   _In_ PVOID NotificationStructure,
01276   _Inout_opt_ PVOID Context);
01277 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE;
01278 
01279 _Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK)
01280 _IRQL_requires_same_
01281 typedef VOID
01282 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)(
01283   _Inout_opt_ PVOID Context);
01284 typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK;
01285 
01286 typedef enum _FILE_INFORMATION_CLASS {
01287   FileDirectoryInformation = 1,
01288   FileFullDirectoryInformation,
01289   FileBothDirectoryInformation,
01290   FileBasicInformation,
01291   FileStandardInformation,
01292   FileInternalInformation,
01293   FileEaInformation,
01294   FileAccessInformation,
01295   FileNameInformation,
01296   FileRenameInformation,
01297   FileLinkInformation,
01298   FileNamesInformation,
01299   FileDispositionInformation,
01300   FilePositionInformation,
01301   FileFullEaInformation,
01302   FileModeInformation,
01303   FileAlignmentInformation,
01304   FileAllInformation,
01305   FileAllocationInformation,
01306   FileEndOfFileInformation,
01307   FileAlternateNameInformation,
01308   FileStreamInformation,
01309   FilePipeInformation,
01310   FilePipeLocalInformation,
01311   FilePipeRemoteInformation,
01312   FileMailslotQueryInformation,
01313   FileMailslotSetInformation,
01314   FileCompressionInformation,
01315   FileObjectIdInformation,
01316   FileCompletionInformation,
01317   FileMoveClusterInformation,
01318   FileQuotaInformation,
01319   FileReparsePointInformation,
01320   FileNetworkOpenInformation,
01321   FileAttributeTagInformation,
01322   FileTrackingInformation,
01323   FileIdBothDirectoryInformation,
01324   FileIdFullDirectoryInformation,
01325   FileValidDataLengthInformation,
01326   FileShortNameInformation,
01327 #if (NTDDI_VERSION >= NTDDI_VISTA)
01328   FileIoCompletionNotificationInformation,
01329   FileIoStatusBlockRangeInformation,
01330   FileIoPriorityHintInformation,
01331   FileSfioReserveInformation,
01332   FileSfioVolumeInformation,
01333   FileHardLinkInformation,
01334   FileProcessIdsUsingFileInformation,
01335   FileNormalizedNameInformation,
01336   FileNetworkPhysicalNameInformation,
01337 #endif
01338 #if (NTDDI_VERSION >= NTDDI_WIN7)
01339   FileIdGlobalTxDirectoryInformation,
01340   FileIsRemoteDeviceInformation,
01341   FileAttributeCacheInformation,
01342   FileNumaNodeInformation,
01343   FileStandardLinkInformation,
01344   FileRemoteProtocolInformation,
01345 #endif
01346   FileMaximumInformation
01347 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
01348 
01349 typedef struct _FILE_POSITION_INFORMATION {
01350   LARGE_INTEGER CurrentByteOffset;
01351 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
01352 
01353 typedef struct _FILE_BASIC_INFORMATION {
01354   LARGE_INTEGER CreationTime;
01355   LARGE_INTEGER LastAccessTime;
01356   LARGE_INTEGER LastWriteTime;
01357   LARGE_INTEGER ChangeTime;
01358   ULONG FileAttributes;
01359 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
01360 
01361 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
01362   IO_PRIORITY_HINT PriorityHint;
01363 } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
01364 
01365 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
01366   ULONG Flags;
01367 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
01368 
01369 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
01370   PUCHAR IoStatusBlockRange;
01371   ULONG Length;
01372 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
01373 
01374 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION {
01375   BOOLEAN IsRemote;
01376 } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
01377 
01378 typedef struct _FILE_NUMA_NODE_INFORMATION {
01379   USHORT NodeNumber;
01380 } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
01381 
01382 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
01383   ULONG NumberOfProcessIdsInList;
01384   ULONG_PTR ProcessIdList[1];
01385 } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
01386 
01387 typedef struct _FILE_STANDARD_INFORMATION {
01388   LARGE_INTEGER AllocationSize;
01389   LARGE_INTEGER EndOfFile;
01390   ULONG NumberOfLinks;
01391   BOOLEAN DeletePending;
01392   BOOLEAN Directory;
01393 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
01394 
01395 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
01396   LARGE_INTEGER CreationTime;
01397   LARGE_INTEGER LastAccessTime;
01398   LARGE_INTEGER LastWriteTime;
01399   LARGE_INTEGER ChangeTime;
01400   LARGE_INTEGER AllocationSize;
01401   LARGE_INTEGER EndOfFile;
01402   ULONG FileAttributes;
01403 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
01404 
01405 typedef enum _FSINFOCLASS {
01406   FileFsVolumeInformation = 1,
01407   FileFsLabelInformation,
01408   FileFsSizeInformation,
01409   FileFsDeviceInformation,
01410   FileFsAttributeInformation,
01411   FileFsControlInformation,
01412   FileFsFullSizeInformation,
01413   FileFsObjectIdInformation,
01414   FileFsDriverPathInformation,
01415   FileFsVolumeFlagsInformation,
01416   FileFsMaximumInformation
01417 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
01418 
01419 typedef struct _FILE_FS_DEVICE_INFORMATION {
01420   DEVICE_TYPE DeviceType;
01421   ULONG Characteristics;
01422 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
01423 
01424 typedef struct _FILE_FULL_EA_INFORMATION {
01425   ULONG NextEntryOffset;
01426   UCHAR Flags;
01427   UCHAR EaNameLength;
01428   USHORT EaValueLength;
01429   CHAR EaName[1];
01430 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
01431 
01432 typedef struct _FILE_SFIO_RESERVE_INFORMATION {
01433   ULONG RequestsPerPeriod;
01434   ULONG Period;
01435   BOOLEAN RetryFailures;
01436   BOOLEAN Discardable;
01437   ULONG RequestSize;
01438   ULONG NumOutstandingRequests;
01439 } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
01440 
01441 typedef struct _FILE_SFIO_VOLUME_INFORMATION {
01442   ULONG MaximumRequestsPerPeriod;
01443   ULONG MinimumPeriod;
01444   ULONG MinimumTransferSize;
01445 } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
01446 
01447 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS     0x1
01448 #define FILE_SKIP_SET_EVENT_ON_HANDLE            0x2
01449 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO      0x4
01450 
01451 #define FM_LOCK_BIT             (0x1)
01452 #define FM_LOCK_BIT_V           (0x0)
01453 #define FM_LOCK_WAITER_WOKEN    (0x2)
01454 #define FM_LOCK_WAITER_INC      (0x4)
01455 
01456 _Function_class_(FAST_IO_CHECK_IF_POSSIBLE)
01457 _IRQL_requires_same_
01458 typedef BOOLEAN
01459 (NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
01460   _In_ struct _FILE_OBJECT *FileObject,
01461   _In_ PLARGE_INTEGER FileOffset,
01462   _In_ ULONG Length,
01463   _In_ BOOLEAN Wait,
01464   _In_ ULONG LockKey,
01465   _In_ BOOLEAN CheckForReadOperation,
01466   _Out_ PIO_STATUS_BLOCK IoStatus,
01467   _In_ struct _DEVICE_OBJECT *DeviceObject);
01468 typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
01469 
01470 _Function_class_(FAST_IO_READ)
01471 _IRQL_requires_same_
01472 typedef BOOLEAN
01473 (NTAPI FAST_IO_READ)(
01474   _In_ struct _FILE_OBJECT *FileObject,
01475   _In_ PLARGE_INTEGER FileOffset,
01476   _In_ ULONG Length,
01477   _In_ BOOLEAN Wait,
01478   _In_ ULONG LockKey,
01479   _Out_ PVOID Buffer,
01480   _Out_ PIO_STATUS_BLOCK IoStatus,
01481   _In_ struct _DEVICE_OBJECT *DeviceObject);
01482 typedef FAST_IO_READ *PFAST_IO_READ;
01483 
01484 _Function_class_(FAST_IO_WRITE)
01485 _IRQL_requires_same_
01486 typedef BOOLEAN
01487 (NTAPI FAST_IO_WRITE)(
01488   _In_ struct _FILE_OBJECT *FileObject,
01489   _In_ PLARGE_INTEGER FileOffset,
01490   _In_ ULONG Length,
01491   _In_ BOOLEAN Wait,
01492   _In_ ULONG LockKey,
01493   _In_ PVOID Buffer,
01494   _Out_ PIO_STATUS_BLOCK IoStatus,
01495   _In_ struct _DEVICE_OBJECT *DeviceObject);
01496 typedef FAST_IO_WRITE *PFAST_IO_WRITE;
01497 
01498 _Function_class_(FAST_IO_QUERY_BASIC_INFO)
01499 _IRQL_requires_same_
01500 typedef BOOLEAN
01501 (NTAPI FAST_IO_QUERY_BASIC_INFO)(
01502   _In_ struct _FILE_OBJECT *FileObject,
01503   _In_ BOOLEAN Wait,
01504   _Out_ PFILE_BASIC_INFORMATION Buffer,
01505   _Out_ PIO_STATUS_BLOCK IoStatus,
01506   _In_ struct _DEVICE_OBJECT *DeviceObject);
01507 typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
01508 
01509 _Function_class_(FAST_IO_QUERY_STANDARD_INFO)
01510 _IRQL_requires_same_
01511 typedef BOOLEAN
01512 (NTAPI FAST_IO_QUERY_STANDARD_INFO)(
01513   _In_ struct _FILE_OBJECT *FileObject,
01514   _In_ BOOLEAN Wait,
01515   _Out_ PFILE_STANDARD_INFORMATION Buffer,
01516   _Out_ PIO_STATUS_BLOCK IoStatus,
01517   _In_ struct _DEVICE_OBJECT *DeviceObject);
01518 typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
01519 
01520 _Function_class_(FAST_IO_LOCK)
01521 _IRQL_requires_same_
01522 typedef BOOLEAN
01523 (NTAPI FAST_IO_LOCK)(
01524   _In_ struct _FILE_OBJECT *FileObject,
01525   _In_ PLARGE_INTEGER FileOffset,
01526   _In_ PLARGE_INTEGER Length,
01527   _In_ PEPROCESS ProcessId,
01528   _In_ ULONG Key,
01529   _In_ BOOLEAN FailImmediately,
01530   _In_ BOOLEAN ExclusiveLock,
01531   _Out_ PIO_STATUS_BLOCK IoStatus,
01532   _In_ struct _DEVICE_OBJECT *DeviceObject);
01533 typedef FAST_IO_LOCK *PFAST_IO_LOCK;
01534 
01535 _Function_class_(FAST_IO_UNLOCK_SINGLE)
01536 _IRQL_requires_same_
01537 typedef BOOLEAN
01538 (NTAPI FAST_IO_UNLOCK_SINGLE)(
01539   _In_ struct _FILE_OBJECT *FileObject,
01540   _In_ PLARGE_INTEGER FileOffset,
01541   _In_ PLARGE_INTEGER Length,
01542   _In_ PEPROCESS ProcessId,
01543   _In_ ULONG Key,
01544   _Out_ PIO_STATUS_BLOCK IoStatus,
01545   _In_ struct _DEVICE_OBJECT *DeviceObject);
01546 typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
01547 
01548 _Function_class_(FAST_IO_UNLOCK_ALL)
01549 _IRQL_requires_same_
01550 typedef BOOLEAN
01551 (NTAPI FAST_IO_UNLOCK_ALL)(
01552   _In_ struct _FILE_OBJECT *FileObject,
01553   _In_ PEPROCESS ProcessId,
01554   _Out_ PIO_STATUS_BLOCK IoStatus,
01555   _In_ struct _DEVICE_OBJECT *DeviceObject);
01556 typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
01557 
01558 _Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY)
01559 _IRQL_requires_same_
01560 typedef BOOLEAN
01561 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
01562   _In_ struct _FILE_OBJECT *FileObject,
01563   _In_ PVOID ProcessId,
01564   _In_ ULONG Key,
01565   _Out_ PIO_STATUS_BLOCK IoStatus,
01566   _In_ struct _DEVICE_OBJECT *DeviceObject);
01567 typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
01568 
01569 _Function_class_(FAST_IO_DEVICE_CONTROL)
01570 _IRQL_requires_same_
01571 typedef BOOLEAN
01572 (NTAPI FAST_IO_DEVICE_CONTROL)(
01573   _In_ struct _FILE_OBJECT *FileObject,
01574   _In_ BOOLEAN Wait,
01575   _In_opt_ PVOID InputBuffer,
01576   _In_ ULONG InputBufferLength,
01577   _Out_opt_ PVOID OutputBuffer,
01578   _In_ ULONG OutputBufferLength,
01579   _In_ ULONG IoControlCode,
01580   _Out_ PIO_STATUS_BLOCK IoStatus,
01581   _In_ struct _DEVICE_OBJECT *DeviceObject);
01582 typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
01583 
01584 _Function_class_(FAST_IO_ACQUIRE_FILE)
01585 _IRQL_requires_same_
01586 typedef VOID
01587 (NTAPI FAST_IO_ACQUIRE_FILE)(
01588   _In_ struct _FILE_OBJECT *FileObject);
01589 typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
01590 
01591 _Function_class_(FAST_IO_RELEASE_FILE)
01592 _IRQL_requires_same_
01593 typedef VOID
01594 (NTAPI FAST_IO_RELEASE_FILE)(
01595   _In_ struct _FILE_OBJECT *FileObject);
01596 typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
01597 
01598 _Function_class_(FAST_IO_DETACH_DEVICE)
01599 _IRQL_requires_same_
01600 typedef VOID
01601 (NTAPI FAST_IO_DETACH_DEVICE)(
01602   _In_ struct _DEVICE_OBJECT *SourceDevice,
01603   _In_ struct _DEVICE_OBJECT *TargetDevice);
01604 typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
01605 
01606 _Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO)
01607 _IRQL_requires_same_
01608 typedef BOOLEAN
01609 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
01610   _In_ struct _FILE_OBJECT *FileObject,
01611   _In_ BOOLEAN Wait,
01612   _Out_ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
01613   _Out_ struct _IO_STATUS_BLOCK *IoStatus,
01614   _In_ struct _DEVICE_OBJECT *DeviceObject);
01615 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
01616 
01617 _Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE)
01618 _IRQL_requires_same_
01619 typedef NTSTATUS
01620 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
01621   _In_ struct _FILE_OBJECT *FileObject,
01622   _In_ PLARGE_INTEGER EndingOffset,
01623   _Out_ struct _ERESOURCE **ResourceToRelease,
01624   _In_ struct _DEVICE_OBJECT *DeviceObject);
01625 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
01626 
01627 _Function_class_(FAST_IO_MDL_READ)
01628 _IRQL_requires_same_
01629 typedef BOOLEAN
01630 (NTAPI FAST_IO_MDL_READ)(
01631   _In_ struct _FILE_OBJECT *FileObject,
01632   _In_ PLARGE_INTEGER FileOffset,
01633   _In_ ULONG Length,
01634   _In_ ULONG LockKey,
01635   _Out_ PMDL *MdlChain,
01636   _Out_ PIO_STATUS_BLOCK IoStatus,
01637   _In_ struct _DEVICE_OBJECT *DeviceObject);
01638 typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
01639 
01640 _Function_class_(FAST_IO_MDL_READ_COMPLETE)
01641 _IRQL_requires_same_
01642 typedef BOOLEAN
01643 (NTAPI FAST_IO_MDL_READ_COMPLETE)(
01644   _In_ struct _FILE_OBJECT *FileObject,
01645   _In_ PMDL MdlChain,
01646   _In_ struct _DEVICE_OBJECT *DeviceObject);
01647 typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
01648 
01649 _Function_class_(FAST_IO_PREPARE_MDL_WRITE)
01650 _IRQL_requires_same_
01651 typedef BOOLEAN
01652 (NTAPI FAST_IO_PREPARE_MDL_WRITE)(
01653   _In_ struct _FILE_OBJECT *FileObject,
01654   _In_ PLARGE_INTEGER FileOffset,
01655   _In_ ULONG Length,
01656   _In_ ULONG LockKey,
01657   _Out_ PMDL *MdlChain,
01658   _Out_ PIO_STATUS_BLOCK IoStatus,
01659   _In_ struct _DEVICE_OBJECT *DeviceObject);
01660 typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
01661 
01662 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE)
01663 _IRQL_requires_same_
01664 typedef BOOLEAN
01665 (NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
01666   _In_ struct _FILE_OBJECT *FileObject,
01667   _In_ PLARGE_INTEGER FileOffset,
01668   _In_ PMDL MdlChain,
01669   _In_ struct _DEVICE_OBJECT *DeviceObject);
01670 typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
01671 
01672 _Function_class_(FAST_IO_READ_COMPRESSED)
01673 _IRQL_requires_same_
01674 typedef BOOLEAN
01675 (NTAPI FAST_IO_READ_COMPRESSED)(
01676   _In_ struct _FILE_OBJECT *FileObject,
01677   _In_ PLARGE_INTEGER FileOffset,
01678   _In_ ULONG Length,
01679   _In_ ULONG LockKey,
01680   _Out_ PVOID Buffer,
01681   _Out_ PMDL *MdlChain,
01682   _Out_ PIO_STATUS_BLOCK IoStatus,
01683   _Out_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
01684   _In_ ULONG CompressedDataInfoLength,
01685   _In_ struct _DEVICE_OBJECT *DeviceObject);
01686 typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
01687 
01688 _Function_class_(FAST_IO_WRITE_COMPRESSED)
01689 _IRQL_requires_same_
01690 typedef BOOLEAN
01691 (NTAPI FAST_IO_WRITE_COMPRESSED)(
01692   _In_ struct _FILE_OBJECT *FileObject,
01693   _In_ PLARGE_INTEGER FileOffset,
01694   _In_ ULONG Length,
01695   _In_ ULONG LockKey,
01696   _In_ PVOID Buffer,
01697   _Out_ PMDL *MdlChain,
01698   _Out_ PIO_STATUS_BLOCK IoStatus,
01699   _In_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
01700   _In_ ULONG CompressedDataInfoLength,
01701   _In_ struct _DEVICE_OBJECT *DeviceObject);
01702 typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
01703 
01704 _Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED)
01705 _IRQL_requires_same_
01706 typedef BOOLEAN
01707 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
01708   _In_ struct _FILE_OBJECT *FileObject,
01709   _In_ PMDL MdlChain,
01710   _In_ struct _DEVICE_OBJECT *DeviceObject);
01711 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
01712 
01713 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)
01714 _IRQL_requires_same_
01715 typedef BOOLEAN
01716 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
01717   _In_ struct _FILE_OBJECT *FileObject,
01718   _In_ PLARGE_INTEGER FileOffset,
01719   _In_ PMDL MdlChain,
01720   _In_ struct _DEVICE_OBJECT *DeviceObject);
01721 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
01722 
01723 _Function_class_(FAST_IO_QUERY_OPEN)
01724 _IRQL_requires_same_
01725 typedef BOOLEAN
01726 (NTAPI FAST_IO_QUERY_OPEN)(
01727   _Inout_ struct _IRP *Irp,
01728   _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
01729   _In_ struct _DEVICE_OBJECT *DeviceObject);
01730 typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
01731 
01732 _Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE)
01733 _IRQL_requires_same_
01734 typedef NTSTATUS
01735 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
01736   _In_ struct _FILE_OBJECT *FileObject,
01737   _In_ struct _ERESOURCE *ResourceToRelease,
01738   _In_ struct _DEVICE_OBJECT *DeviceObject);
01739 typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
01740 
01741 _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH)
01742 _IRQL_requires_same_
01743 typedef NTSTATUS
01744 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
01745   _In_ struct _FILE_OBJECT *FileObject,
01746   _In_ struct _DEVICE_OBJECT *DeviceObject);
01747 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
01748 
01749 _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH)
01750 _IRQL_requires_same_
01751 typedef NTSTATUS
01752 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
01753   _In_ struct _FILE_OBJECT *FileObject,
01754   _In_ struct _DEVICE_OBJECT *DeviceObject);
01755 typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
01756 
01757 typedef struct _FAST_IO_DISPATCH {
01758   ULONG SizeOfFastIoDispatch;
01759   PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
01760   PFAST_IO_READ FastIoRead;
01761   PFAST_IO_WRITE FastIoWrite;
01762   PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
01763   PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
01764   PFAST_IO_LOCK FastIoLock;
01765   PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
01766   PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
01767   PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
01768   PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
01769   PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
01770   PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
01771   PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
01772   PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
01773   PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
01774   PFAST_IO_MDL_READ MdlRead;
01775   PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
01776   PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
01777   PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
01778   PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
01779   PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
01780   PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
01781   PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
01782   PFAST_IO_QUERY_OPEN FastIoQueryOpen;
01783   PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
01784   PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
01785   PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
01786 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
01787 
01788 typedef struct _SECTION_OBJECT_POINTERS {
01789   PVOID DataSectionObject;
01790   PVOID SharedCacheMap;
01791   PVOID ImageSectionObject;
01792 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
01793 
01794 typedef struct _IO_COMPLETION_CONTEXT {
01795   PVOID Port;
01796   PVOID Key;
01797 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
01798 
01799 /* FILE_OBJECT.Flags */
01800 #define FO_FILE_OPEN                 0x00000001
01801 #define FO_SYNCHRONOUS_IO            0x00000002
01802 #define FO_ALERTABLE_IO              0x00000004
01803 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
01804 #define FO_WRITE_THROUGH             0x00000010
01805 #define FO_SEQUENTIAL_ONLY           0x00000020
01806 #define FO_CACHE_SUPPORTED           0x00000040
01807 #define FO_NAMED_PIPE                0x00000080
01808 #define FO_STREAM_FILE               0x00000100
01809 #define FO_MAILSLOT                  0x00000200
01810 #define FO_GENERATE_AUDIT_ON_CLOSE   0x00000400
01811 #define FO_QUEUE_IRP_TO_THREAD       0x00000400
01812 #define FO_DIRECT_DEVICE_OPEN        0x00000800
01813 #define FO_FILE_MODIFIED             0x00001000
01814 #define FO_FILE_SIZE_CHANGED         0x00002000
01815 #define FO_CLEANUP_COMPLETE          0x00004000
01816 #define FO_TEMPORARY_FILE            0x00008000
01817 #define FO_DELETE_ON_CLOSE           0x00010000
01818 #define FO_OPENED_CASE_SENSITIVE     0x00020000
01819 #define FO_HANDLE_CREATED            0x00040000
01820 #define FO_FILE_FAST_IO_READ         0x00080000
01821 #define FO_RANDOM_ACCESS             0x00100000
01822 #define FO_FILE_OPEN_CANCELLED       0x00200000
01823 #define FO_VOLUME_OPEN               0x00400000
01824 #define FO_REMOTE_ORIGIN             0x01000000
01825 #define FO_DISALLOW_EXCLUSIVE        0x02000000
01826 #define FO_SKIP_COMPLETION_PORT      0x02000000
01827 #define FO_SKIP_SET_EVENT            0x04000000
01828 #define FO_SKIP_SET_FAST_IO          0x08000000
01829 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
01830 
01831 /* VPB.Flags */
01832 #define VPB_MOUNTED                       0x0001
01833 #define VPB_LOCKED                        0x0002
01834 #define VPB_PERSISTENT                    0x0004
01835 #define VPB_REMOVE_PENDING                0x0008
01836 #define VPB_RAW_MOUNT                     0x0010
01837 #define VPB_DIRECT_WRITES_ALLOWED         0x0020
01838 
01839 /* IRP.Flags */
01840 
01841 #define SL_FORCE_ACCESS_CHECK             0x01
01842 #define SL_OPEN_PAGING_FILE               0x02
01843 #define SL_OPEN_TARGET_DIRECTORY          0x04
01844 #define SL_STOP_ON_SYMLINK                0x08
01845 #define SL_CASE_SENSITIVE                 0x80
01846 
01847 #define SL_KEY_SPECIFIED                  0x01
01848 #define SL_OVERRIDE_VERIFY_VOLUME         0x02
01849 #define SL_WRITE_THROUGH                  0x04
01850 #define SL_FT_SEQUENTIAL_WRITE            0x08
01851 #define SL_FORCE_DIRECT_WRITE             0x10
01852 #define SL_REALTIME_STREAM                0x20
01853 
01854 #define SL_READ_ACCESS_GRANTED            0x01
01855 #define SL_WRITE_ACCESS_GRANTED           0x04
01856 
01857 #define SL_FAIL_IMMEDIATELY               0x01
01858 #define SL_EXCLUSIVE_LOCK                 0x02
01859 
01860 #define SL_RESTART_SCAN                   0x01
01861 #define SL_RETURN_SINGLE_ENTRY            0x02
01862 #define SL_INDEX_SPECIFIED                0x04
01863 
01864 #define SL_WATCH_TREE                     0x01
01865 
01866 #define SL_ALLOW_RAW_MOUNT                0x01
01867 
01868 $endif (_WDMDDK_)
01869 $if (_WDMDDK_ || _DEVIOCTL_)
01870 #define CTL_CODE(DeviceType, Function, Method, Access) \
01871   (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
01872 
01873 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
01874 
01875 #define METHOD_FROM_CTL_CODE(ctrlCode)          ((ULONG)(ctrlCode & 3))
01876 
01877 $endif (_WDMDDK_ || _DEVIOCTL_)
01878 $if (_WDMDDK_)
01879 #define IRP_NOCACHE                     0x00000001
01880 #define IRP_PAGING_IO                   0x00000002
01881 #define IRP_MOUNT_COMPLETION            0x00000002
01882 #define IRP_SYNCHRONOUS_API             0x00000004
01883 #define IRP_ASSOCIATED_IRP              0x00000008
01884 #define IRP_BUFFERED_IO                 0x00000010
01885 #define IRP_DEALLOCATE_BUFFER           0x00000020
01886 #define IRP_INPUT_OPERATION             0x00000040
01887 #define IRP_SYNCHRONOUS_PAGING_IO       0x00000040
01888 #define IRP_CREATE_OPERATION            0x00000080
01889 #define IRP_READ_OPERATION              0x00000100
01890 #define IRP_WRITE_OPERATION             0x00000200
01891 #define IRP_CLOSE_OPERATION             0x00000400
01892 #define IRP_DEFER_IO_COMPLETION         0x00000800
01893 #define IRP_OB_QUERY_NAME               0x00001000
01894 #define IRP_HOLD_DEVICE_QUEUE           0x00002000
01895 /* The following 2 are missing in latest WDK */
01896 #define IRP_RETRY_IO_COMPLETION         0x00004000
01897 #define IRP_CLASS_CACHE_OPERATION       0x00008000
01898 
01899 #define IRP_QUOTA_CHARGED                 0x01
01900 #define IRP_ALLOCATED_MUST_SUCCEED        0x02
01901 #define IRP_ALLOCATED_FIXED_SIZE          0x04
01902 #define IRP_LOOKASIDE_ALLOCATION          0x08
01903 
01904 /*
01905 ** IRP function codes
01906 */
01907 
01908 #define IRP_MJ_CREATE                     0x00
01909 #define IRP_MJ_CREATE_NAMED_PIPE          0x01
01910 #define IRP_MJ_CLOSE                      0x02
01911 #define IRP_MJ_READ                       0x03
01912 #define IRP_MJ_WRITE                      0x04
01913 #define IRP_MJ_QUERY_INFORMATION          0x05
01914 #define IRP_MJ_SET_INFORMATION            0x06
01915 #define IRP_MJ_QUERY_EA                   0x07
01916 #define IRP_MJ_SET_EA                     0x08
01917 #define IRP_MJ_FLUSH_BUFFERS              0x09
01918 #define IRP_MJ_QUERY_VOLUME_INFORMATION   0x0a
01919 #define IRP_MJ_SET_VOLUME_INFORMATION     0x0b
01920 #define IRP_MJ_DIRECTORY_CONTROL          0x0c
01921 #define IRP_MJ_FILE_SYSTEM_CONTROL        0x0d
01922 #define IRP_MJ_DEVICE_CONTROL             0x0e
01923 #define IRP_MJ_INTERNAL_DEVICE_CONTROL    0x0f
01924 #define IRP_MJ_SCSI                       0x0f
01925 #define IRP_MJ_SHUTDOWN                   0x10
01926 #define IRP_MJ_LOCK_CONTROL               0x11
01927 #define IRP_MJ_CLEANUP                    0x12
01928 #define IRP_MJ_CREATE_MAILSLOT            0x13
01929 #define IRP_MJ_QUERY_SECURITY             0x14
01930 #define IRP_MJ_SET_SECURITY               0x15
01931 #define IRP_MJ_POWER                      0x16
01932 #define IRP_MJ_SYSTEM_CONTROL             0x17
01933 #define IRP_MJ_DEVICE_CHANGE              0x18
01934 #define IRP_MJ_QUERY_QUOTA                0x19
01935 #define IRP_MJ_SET_QUOTA                  0x1a
01936 #define IRP_MJ_PNP                        0x1b
01937 #define IRP_MJ_PNP_POWER                  0x1b
01938 #define IRP_MJ_MAXIMUM_FUNCTION           0x1b
01939 
01940 #define IRP_MN_SCSI_CLASS                 0x01
01941 
01942 #define IRP_MN_START_DEVICE               0x00
01943 #define IRP_MN_QUERY_REMOVE_DEVICE        0x01
01944 #define IRP_MN_REMOVE_DEVICE              0x02
01945 #define IRP_MN_CANCEL_REMOVE_DEVICE       0x03
01946 #define IRP_MN_STOP_DEVICE                0x04
01947 #define IRP_MN_QUERY_STOP_DEVICE          0x05
01948 #define IRP_MN_CANCEL_STOP_DEVICE         0x06
01949 
01950 #define IRP_MN_QUERY_DEVICE_RELATIONS       0x07
01951 #define IRP_MN_QUERY_INTERFACE              0x08
01952 #define IRP_MN_QUERY_CAPABILITIES           0x09
01953 #define IRP_MN_QUERY_RESOURCES              0x0A
01954 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS  0x0B
01955 #define IRP_MN_QUERY_DEVICE_TEXT            0x0C
01956 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
01957 
01958 #define IRP_MN_READ_CONFIG                  0x0F
01959 #define IRP_MN_WRITE_CONFIG                 0x10
01960 #define IRP_MN_EJECT                        0x11
01961 #define IRP_MN_SET_LOCK                     0x12
01962 #define IRP_MN_QUERY_ID                     0x13
01963 #define IRP_MN_QUERY_PNP_DEVICE_STATE       0x14
01964 #define IRP_MN_QUERY_BUS_INFORMATION        0x15
01965 #define IRP_MN_DEVICE_USAGE_NOTIFICATION    0x16
01966 #define IRP_MN_SURPRISE_REMOVAL             0x17
01967 #if (NTDDI_VERSION >= NTDDI_WIN7)
01968 #define IRP_MN_DEVICE_ENUMERATED            0x19
01969 #endif
01970 
01971 #define IRP_MN_WAIT_WAKE                  0x00
01972 #define IRP_MN_POWER_SEQUENCE             0x01
01973 #define IRP_MN_SET_POWER                  0x02
01974 #define IRP_MN_QUERY_POWER                0x03
01975 
01976 #define IRP_MN_QUERY_ALL_DATA             0x00
01977 #define IRP_MN_QUERY_SINGLE_INSTANCE      0x01
01978 #define IRP_MN_CHANGE_SINGLE_INSTANCE     0x02
01979 #define IRP_MN_CHANGE_SINGLE_ITEM         0x03
01980 #define IRP_MN_ENABLE_EVENTS              0x04
01981 #define IRP_MN_DISABLE_EVENTS             0x05
01982 #define IRP_MN_ENABLE_COLLECTION          0x06
01983 #define IRP_MN_DISABLE_COLLECTION         0x07
01984 #define IRP_MN_REGINFO                    0x08
01985 #define IRP_MN_EXECUTE_METHOD             0x09
01986 
01987 #define IRP_MN_REGINFO_EX                 0x0b
01988 
01989 typedef struct _FILE_OBJECT {
01990   CSHORT Type;
01991   CSHORT Size;
01992   PDEVICE_OBJECT DeviceObject;
01993   PVPB Vpb;
01994   PVOID FsContext;
01995   PVOID FsContext2;
01996   PSECTION_OBJECT_POINTERS SectionObjectPointer;
01997   PVOID PrivateCacheMap;
01998   NTSTATUS FinalStatus;
01999   struct _FILE_OBJECT *RelatedFileObject;
02000   BOOLEAN LockOperation;
02001   BOOLEAN DeletePending;
02002   BOOLEAN ReadAccess;
02003   BOOLEAN WriteAccess;
02004   BOOLEAN DeleteAccess;
02005   BOOLEAN SharedRead;
02006   BOOLEAN SharedWrite;
02007   BOOLEAN SharedDelete;
02008   ULONG Flags;
02009   UNICODE_STRING FileName;
02010   LARGE_INTEGER CurrentByteOffset;
02011   volatile ULONG Waiters;
02012   volatile ULONG Busy;
02013   PVOID LastLock;
02014   KEVENT Lock;
02015   KEVENT Event;
02016   volatile PIO_COMPLETION_CONTEXT CompletionContext;
02017   KSPIN_LOCK IrpListLock;
02018   LIST_ENTRY IrpList;
02019   volatile PVOID FileObjectExtension;
02020 } FILE_OBJECT, *PFILE_OBJECT;
02021 
02022 typedef struct _IO_ERROR_LOG_PACKET {
02023   UCHAR MajorFunctionCode;
02024   UCHAR RetryCount;
02025   USHORT DumpDataSize;
02026   USHORT NumberOfStrings;
02027   USHORT StringOffset;
02028   USHORT EventCategory;
02029   NTSTATUS ErrorCode;
02030   ULONG UniqueErrorValue;
02031   NTSTATUS FinalStatus;
02032   ULONG SequenceNumber;
02033   ULONG IoControlCode;
02034   LARGE_INTEGER DeviceOffset;
02035   ULONG DumpData[1];
02036 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
02037 
02038 typedef struct _IO_ERROR_LOG_MESSAGE {
02039   USHORT Type;
02040   USHORT Size;
02041   USHORT DriverNameLength;
02042   LARGE_INTEGER TimeStamp;
02043   ULONG DriverNameOffset;
02044   IO_ERROR_LOG_PACKET EntryData;
02045 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
02046 
02047 #define ERROR_LOG_LIMIT_SIZE               240
02048 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
02049                                             sizeof(IO_ERROR_LOG_PACKET) + \
02050                                             (sizeof(WCHAR) * 40))
02051 #define ERROR_LOG_MESSAGE_LIMIT_SIZE                                          \
02052     (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
02053 #define IO_ERROR_LOG_MESSAGE_LENGTH                                           \
02054     ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ?           \
02055         ERROR_LOG_MESSAGE_LIMIT_SIZE :                                        \
02056         PORT_MAXIMUM_MESSAGE_LENGTH)
02057 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH -                 \
02058                                 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
02059 
02060 #ifdef _WIN64
02061 #define PORT_MAXIMUM_MESSAGE_LENGTH    512
02062 #else
02063 #define PORT_MAXIMUM_MESSAGE_LENGTH    256
02064 #endif
02065 
02066 typedef enum _DMA_WIDTH {
02067   Width8Bits,
02068   Width16Bits,
02069   Width32Bits,
02070   MaximumDmaWidth
02071 } DMA_WIDTH, *PDMA_WIDTH;
02072 
02073 typedef enum _DMA_SPEED {
02074   Compatible,
02075   TypeA,
02076   TypeB,
02077   TypeC,
02078   TypeF,
02079   MaximumDmaSpeed
02080 } DMA_SPEED, *PDMA_SPEED;
02081 
02082 /* DEVICE_DESCRIPTION.Version */
02083 
02084 #define DEVICE_DESCRIPTION_VERSION        0x0000
02085 #define DEVICE_DESCRIPTION_VERSION1       0x0001
02086 #define DEVICE_DESCRIPTION_VERSION2       0x0002
02087 
02088 typedef struct _DEVICE_DESCRIPTION {
02089   ULONG Version;
02090   BOOLEAN Master;
02091   BOOLEAN ScatterGather;
02092   BOOLEAN DemandMode;
02093   BOOLEAN AutoInitialize;
02094   BOOLEAN Dma32BitAddresses;
02095   BOOLEAN IgnoreCount;
02096   BOOLEAN Reserved1;
02097   BOOLEAN Dma64BitAddresses;
02098   ULONG BusNumber;
02099   ULONG DmaChannel;
02100   INTERFACE_TYPE InterfaceType;
02101   DMA_WIDTH DmaWidth;
02102   DMA_SPEED DmaSpeed;
02103   ULONG MaximumLength;
02104   ULONG DmaPort;
02105 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
02106 
02107 typedef enum _DEVICE_RELATION_TYPE {
02108   BusRelations,
02109   EjectionRelations,
02110   PowerRelations,
02111   RemovalRelations,
02112   TargetDeviceRelation,
02113   SingleBusRelations,
02114   TransportRelations
02115 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
02116 
02117 typedef struct _DEVICE_RELATIONS {
02118   ULONG Count;
02119   PDEVICE_OBJECT Objects[1];
02120 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
02121 
02122 typedef struct _DEVOBJ_EXTENSION {
02123   CSHORT Type;
02124   USHORT Size;
02125   PDEVICE_OBJECT DeviceObject;
02126 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
02127 
02128 typedef struct _SCATTER_GATHER_ELEMENT {
02129   PHYSICAL_ADDRESS Address;
02130   ULONG Length;
02131   ULONG_PTR Reserved;
02132 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
02133 
02134 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
02135 
02136 #if defined(_MSC_VER)
02137 #if _MSC_VER >= 1200
02138 #pragma warning(push)
02139 #endif
02140 #pragma warning(disable:4200)
02141 #endif /* _MSC_VER */
02142 
02143 typedef struct _SCATTER_GATHER_LIST {
02144   ULONG NumberOfElements;
02145   ULONG_PTR Reserved;
02146   SCATTER_GATHER_ELEMENT Elements[1];
02147 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
02148 
02149 #if defined(_MSC_VER)
02150 #if _MSC_VER >= 1200
02151 #pragma warning(pop)
02152 #else
02153 #pragma warning(default:4200)
02154 #endif
02155 #endif /* _MSC_VER */
02156 
02157 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
02158 
02159 struct _SCATTER_GATHER_LIST;
02160 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
02161 
02162 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
02163 
02164 _Function_class_(DRIVER_ADD_DEVICE)
02165 _IRQL_requires_(PASSIVE_LEVEL)
02166 _IRQL_requires_same_
02167 _When_(return>=0, _Kernel_clear_do_init_(__yes))
02168 typedef NTSTATUS
02169 (NTAPI DRIVER_ADD_DEVICE)(
02170   _In_ struct _DRIVER_OBJECT *DriverObject,
02171   _In_ struct _DEVICE_OBJECT *PhysicalDeviceObject);
02172 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
02173 
02174 typedef struct _DRIVER_EXTENSION {
02175   struct _DRIVER_OBJECT *DriverObject;
02176   PDRIVER_ADD_DEVICE AddDevice;
02177   ULONG Count;
02178   UNICODE_STRING ServiceKeyName;
02179 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
02180 
02181 #define DRVO_UNLOAD_INVOKED               0x00000001
02182 #define DRVO_LEGACY_DRIVER                0x00000002
02183 #define DRVO_BUILTIN_DRIVER               0x00000004
02184 
02185 _Function_class_(DRIVER_INITIALIZE)
02186 _IRQL_requires_same_
02187 typedef NTSTATUS
02188 (NTAPI DRIVER_INITIALIZE)(
02189   _In_ struct _DRIVER_OBJECT *DriverObject,
02190   _In_ PUNICODE_STRING RegistryPath);
02191 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
02192 
02193 _Function_class_(DRIVER_STARTIO)
02194 _IRQL_always_function_min_(DISPATCH_LEVEL)
02195 _IRQL_requires_(DISPATCH_LEVEL)
02196 _IRQL_requires_same_
02197 typedef VOID
02198 (NTAPI DRIVER_STARTIO)(
02199   _Inout_ struct _DEVICE_OBJECT *DeviceObject,
02200   _Inout_ struct _IRP *Irp);
02201 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
02202 
02203 _Function_class_(DRIVER_UNLOAD)
02204 _IRQL_requires_(PASSIVE_LEVEL)
02205 _IRQL_requires_same_
02206 typedef VOID
02207 (NTAPI DRIVER_UNLOAD)(
02208   _In_ struct _DRIVER_OBJECT *DriverObject);
02209 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
02210 
02211 _Function_class_(DRIVER_DISPATCH)
02212 _IRQL_requires_(PASSIVE_LEVEL)
02213 _IRQL_requires_same_
02214 typedef NTSTATUS
02215 (NTAPI DRIVER_DISPATCH)(
02216   _In_ struct _DEVICE_OBJECT *DeviceObject,
02217   _Inout_ struct _IRP *Irp);
02218 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
02219 
02220 typedef struct _DRIVER_OBJECT {
02221   CSHORT Type;
02222   CSHORT Size;
02223   PDEVICE_OBJECT DeviceObject;
02224   ULONG Flags;
02225   PVOID DriverStart;
02226   ULONG DriverSize;
02227   PVOID DriverSection;
02228   PDRIVER_EXTENSION DriverExtension;
02229   UNICODE_STRING DriverName;
02230   PUNICODE_STRING HardwareDatabase;
02231   struct _FAST_IO_DISPATCH *FastIoDispatch;
02232   PDRIVER_INITIALIZE DriverInit;
02233   PDRIVER_STARTIO DriverStartIo;
02234   PDRIVER_UNLOAD DriverUnload;
02235   PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
02236 } DRIVER_OBJECT, *PDRIVER_OBJECT;
02237 
02238 typedef struct _DMA_ADAPTER {
02239   USHORT Version;
02240   USHORT Size;
02241   struct _DMA_OPERATIONS* DmaOperations;
02242 } DMA_ADAPTER, *PDMA_ADAPTER;
02243 
02244 typedef VOID
02245 (NTAPI *PPUT_DMA_ADAPTER)(
02246   PDMA_ADAPTER DmaAdapter);
02247 
02248 typedef PVOID
02249 (NTAPI *PALLOCATE_COMMON_BUFFER)(
02250   _In_ PDMA_ADAPTER DmaAdapter,
02251   _In_ ULONG Length,
02252   _Out_ PPHYSICAL_ADDRESS LogicalAddress,
02253   _In_ BOOLEAN CacheEnabled);
02254 
02255 typedef VOID
02256 (NTAPI *PFREE_COMMON_BUFFER)(
02257   _In_ PDMA_ADAPTER DmaAdapter,
02258   _In_ ULONG Length,
02259   _In_ PHYSICAL_ADDRESS LogicalAddress,
02260   _In_ PVOID VirtualAddress,
02261   _In_ BOOLEAN CacheEnabled);
02262 
02263 typedef NTSTATUS
02264 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
02265   _In_ PDMA_ADAPTER DmaAdapter,
02266   _In_ PDEVICE_OBJECT DeviceObject,
02267   _In_ ULONG NumberOfMapRegisters,
02268   _In_ PDRIVER_CONTROL ExecutionRoutine,
02269   _In_ PVOID Context);
02270 
02271 typedef BOOLEAN
02272 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
02273   _In_ PDMA_ADAPTER DmaAdapter,
02274   _In_ PMDL Mdl,
02275   _In_ PVOID MapRegisterBase,
02276   _In_ PVOID CurrentVa,
02277   _In_ ULONG Length,
02278   _In_ BOOLEAN WriteToDevice);
02279 
02280 typedef VOID
02281 (NTAPI *PFREE_ADAPTER_CHANNEL)(
02282   _In_ PDMA_ADAPTER DmaAdapter);
02283 
02284 typedef VOID
02285 (NTAPI *PFREE_MAP_REGISTERS)(
02286   _In_ PDMA_ADAPTER DmaAdapter,
02287   PVOID MapRegisterBase,
02288   ULONG NumberOfMapRegisters);
02289 
02290 typedef PHYSICAL_ADDRESS
02291 (NTAPI *PMAP_TRANSFER)(
02292   _In_ PDMA_ADAPTER DmaAdapter,
02293   _In_ PMDL Mdl,
02294   _In_ PVOID MapRegisterBase,
02295   _In_ PVOID CurrentVa,
02296   _Inout_ PULONG Length,
02297   _In_ BOOLEAN WriteToDevice);
02298 
02299 typedef ULONG
02300 (NTAPI *PGET_DMA_ALIGNMENT)(
02301   _In_ PDMA_ADAPTER DmaAdapter);
02302 
02303 typedef ULONG
02304 (NTAPI *PREAD_DMA_COUNTER)(
02305   _In_ PDMA_ADAPTER DmaAdapter);
02306 
02307 _Function_class_(DRIVER_LIST_CONTROL)
02308 _IRQL_requires_same_
02309 typedef VOID
02310 (NTAPI DRIVER_LIST_CONTROL)(
02311   _In_ struct _DEVICE_OBJECT *DeviceObject,
02312   _In_ struct _IRP *Irp,
02313   _In_ struct _SCATTER_GATHER_LIST *ScatterGather,
02314   _In_ PVOID Context);
02315 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
02316 
02317 typedef NTSTATUS
02318 (NTAPI *PGET_SCATTER_GATHER_LIST)(
02319   _In_ PDMA_ADAPTER DmaAdapter,
02320   _In_ PDEVICE_OBJECT DeviceObject,
02321   _In_ PMDL Mdl,
02322   _In_ PVOID CurrentVa,
02323   _In_ ULONG Length,
02324   _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
02325   _In_ PVOID Context,
02326   _In_ BOOLEAN WriteToDevice);
02327 
02328 typedef VOID
02329 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
02330   _In_ PDMA_ADAPTER DmaAdapter,
02331   _In_ PSCATTER_GATHER_LIST ScatterGather,
02332   _In_ BOOLEAN WriteToDevice);
02333 
02334 typedef NTSTATUS
02335 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
02336   _In_ PDMA_ADAPTER DmaAdapter,
02337   _In_ PMDL Mdl OPTIONAL,
02338   _In_ PVOID CurrentVa,
02339   _In_ ULONG Length,
02340   _Out_ PULONG ScatterGatherListSize,
02341   _Out_ OPTIONAL PULONG pNumberOfMapRegisters);
02342 
02343 typedef NTSTATUS
02344 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
02345   _In_ PDMA_ADAPTER DmaAdapter,
02346   _In_ PDEVICE_OBJECT DeviceObject,
02347   _In_ PMDL Mdl,
02348   _In_ PVOID CurrentVa,
02349   _In_ ULONG Length,
02350   _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
02351   _In_ PVOID Context,
02352   _In_ BOOLEAN WriteToDevice,
02353   _In_ PVOID ScatterGatherBuffer,
02354   _In_ ULONG ScatterGatherLength);
02355 
02356 typedef NTSTATUS
02357 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
02358   _In_ PDMA_ADAPTER DmaAdapter,
02359   _In_ PSCATTER_GATHER_LIST ScatterGather,
02360   _In_ PMDL OriginalMdl,
02361   _Out_ PMDL *TargetMdl);
02362 
02363 typedef struct _DMA_OPERATIONS {
02364   ULONG Size;
02365   PPUT_DMA_ADAPTER PutDmaAdapter;
02366   PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
02367   PFREE_COMMON_BUFFER FreeCommonBuffer;
02368   PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
02369   PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
02370   PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
02371   PFREE_MAP_REGISTERS FreeMapRegisters;
02372   PMAP_TRANSFER MapTransfer;
02373   PGET_DMA_ALIGNMENT GetDmaAlignment;
02374   PREAD_DMA_COUNTER ReadDmaCounter;
02375   PGET_SCATTER_GATHER_LIST GetScatterGatherList;
02376   PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
02377   PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
02378   PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
02379   PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
02380 } DMA_OPERATIONS, *PDMA_OPERATIONS;
02381 
02382 typedef struct _IO_RESOURCE_DESCRIPTOR {
02383   UCHAR Option;
02384   UCHAR Type;
02385   UCHAR ShareDisposition;
02386   UCHAR Spare1;
02387   USHORT Flags;
02388   USHORT Spare2;
02389   union {
02390     struct {
02391       ULONG Length;
02392       ULONG Alignment;
02393       PHYSICAL_ADDRESS MinimumAddress;
02394       PHYSICAL_ADDRESS MaximumAddress;
02395     } Port;
02396     struct {
02397       ULONG Length;
02398       ULONG Alignment;
02399       PHYSICAL_ADDRESS MinimumAddress;
02400       PHYSICAL_ADDRESS MaximumAddress;
02401     } Memory;
02402     struct {
02403       ULONG MinimumVector;
02404       ULONG MaximumVector;
02405     } Interrupt;
02406     struct {
02407       ULONG MinimumChannel;
02408       ULONG MaximumChannel;
02409     } Dma;
02410     struct {
02411       ULONG Length;
02412       ULONG Alignment;
02413       PHYSICAL_ADDRESS MinimumAddress;
02414       PHYSICAL_ADDRESS MaximumAddress;
02415     } Generic;
02416     struct {
02417       ULONG Data[3];
02418     } DevicePrivate;
02419     struct {
02420       ULONG Length;
02421       ULONG MinBusNumber;
02422       ULONG MaxBusNumber;
02423       ULONG Reserved;
02424     } BusNumber;
02425     struct {
02426       ULONG Priority;
02427       ULONG Reserved1;
02428       ULONG Reserved2;
02429     } ConfigData;
02430   } u;
02431 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
02432 
02433 typedef struct _IO_RESOURCE_LIST {
02434   USHORT Version;
02435   USHORT Revision;
02436   ULONG Count;
02437   IO_RESOURCE_DESCRIPTOR Descriptors[1];
02438 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
02439 
02440 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
02441   ULONG ListSize;
02442   INTERFACE_TYPE InterfaceType;
02443   ULONG BusNumber;
02444   ULONG SlotNumber;
02445   ULONG Reserved[3];
02446   ULONG AlternativeLists;
02447   IO_RESOURCE_LIST List[1];
02448 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
02449 
02450 _Function_class_(DRIVER_CANCEL)
02451 _Requires_lock_held_(_Global_cancel_spin_lock_)
02452 _Releases_lock_(_Global_cancel_spin_lock_)
02453 _IRQL_requires_min_(DISPATCH_LEVEL)
02454 _IRQL_requires_(DISPATCH_LEVEL)
02455 typedef VOID
02456 (NTAPI DRIVER_CANCEL)(
02457   _Inout_ struct _DEVICE_OBJECT *DeviceObject,
02458   _Inout_ _IRQL_uses_cancel_ struct _IRP *Irp);
02459 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
02460 
02461 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP {
02462   CSHORT Type;
02463   USHORT Size;
02464   struct _MDL *MdlAddress;
02465   ULONG Flags;
02466   union {
02467     struct _IRP *MasterIrp;
02468     volatile LONG IrpCount;
02469     PVOID SystemBuffer;
02470   } AssociatedIrp;
02471   LIST_ENTRY ThreadListEntry;
02472   IO_STATUS_BLOCK IoStatus;
02473   KPROCESSOR_MODE RequestorMode;
02474   BOOLEAN PendingReturned;
02475   CHAR StackCount;
02476   CHAR CurrentLocation;
02477   BOOLEAN Cancel;
02478   KIRQL CancelIrql;
02479   CCHAR ApcEnvironment;
02480   UCHAR AllocationFlags;
02481   PIO_STATUS_BLOCK UserIosb;
02482   PKEVENT UserEvent;
02483   union {
02484     struct {
02485       _ANONYMOUS_UNION union {
02486         PIO_APC_ROUTINE UserApcRoutine;
02487         PVOID IssuingProcess;
02488       } DUMMYUNIONNAME;
02489       PVOID UserApcContext;
02490     } AsynchronousParameters;
02491     LARGE_INTEGER AllocationSize;
02492   } Overlay;
02493   volatile PDRIVER_CANCEL CancelRoutine;
02494   PVOID UserBuffer;
02495   union {
02496     struct {
02497       _ANONYMOUS_UNION union {
02498         KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
02499         _ANONYMOUS_STRUCT struct {
02500           PVOID DriverContext[4];
02501         } DUMMYSTRUCTNAME;
02502       } DUMMYUNIONNAME;
02503       PETHREAD Thread;
02504       PCHAR AuxiliaryBuffer;
02505       _ANONYMOUS_STRUCT struct {
02506         LIST_ENTRY ListEntry;
02507         _ANONYMOUS_UNION union {
02508           struct _IO_STACK_LOCATION *CurrentStackLocation;
02509           ULONG PacketType;
02510         } DUMMYUNIONNAME;
02511       } DUMMYSTRUCTNAME;
02512       struct _FILE_OBJECT *OriginalFileObject;
02513     } Overlay;
02514     KAPC Apc;
02515     PVOID CompletionKey;
02516   } Tail;
02517 } IRP, *PIRP;
02518 
02519 typedef enum _IO_PAGING_PRIORITY {
02520   IoPagingPriorityInvalid,
02521   IoPagingPriorityNormal,
02522   IoPagingPriorityHigh,
02523   IoPagingPriorityReserved1,
02524   IoPagingPriorityReserved2
02525 } IO_PAGING_PRIORITY;
02526 
02527 _Function_class_(IO_COMPLETION_ROUTINE)
02528 _IRQL_requires_same_
02529 typedef NTSTATUS
02530 (NTAPI IO_COMPLETION_ROUTINE)(
02531   _In_ struct _DEVICE_OBJECT *DeviceObject,
02532   _In_ struct _IRP *Irp,
02533   _In_opt_ PVOID Context);
02534 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
02535 
02536 _Function_class_(IO_DPC_ROUTINE)
02537 _IRQL_always_function_min_(DISPATCH_LEVEL)
02538 _IRQL_requires_(DISPATCH_LEVEL)
02539 _IRQL_requires_same_
02540 typedef VOID
02541 (NTAPI IO_DPC_ROUTINE)(
02542   _In_ struct _KDPC *Dpc,
02543   _In_ struct _DEVICE_OBJECT *DeviceObject,
02544   _Inout_ struct _IRP *Irp,
02545   _In_opt_ PVOID Context);
02546 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
02547 
02548 typedef NTSTATUS
02549 (NTAPI *PMM_DLL_INITIALIZE)(
02550   _In_ PUNICODE_STRING RegistryPath);
02551 
02552 typedef NTSTATUS
02553 (NTAPI *PMM_DLL_UNLOAD)(
02554   VOID);
02555 
02556 _Function_class_(IO_TIMER_ROUTINE)
02557 _IRQL_requires_same_
02558 typedef VOID
02559 (NTAPI IO_TIMER_ROUTINE)(
02560   _In_ struct _DEVICE_OBJECT *DeviceObject,
02561   _In_opt_ PVOID Context);
02562 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
02563 
02564 typedef struct _IO_SECURITY_CONTEXT {
02565   PSECURITY_QUALITY_OF_SERVICE SecurityQos;
02566   PACCESS_STATE AccessState;
02567   ACCESS_MASK DesiredAccess;
02568   ULONG FullCreateOptions;
02569 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
02570 
02571 struct _IO_CSQ;
02572 
02573 typedef struct _IO_CSQ_IRP_CONTEXT {
02574   ULONG Type;
02575   struct _IRP *Irp;
02576   struct _IO_CSQ *Csq;
02577 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
02578 
02579 typedef VOID
02580 (NTAPI *PIO_CSQ_INSERT_IRP)(
02581   _In_ struct _IO_CSQ *Csq,
02582   _In_ PIRP Irp);
02583 
02584 typedef NTSTATUS
02585 (NTAPI IO_CSQ_INSERT_IRP_EX)(
02586   _In_ struct _IO_CSQ *Csq,
02587   _In_ PIRP Irp,
02588   _In_ PVOID InsertContext);
02589 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
02590 
02591 typedef VOID
02592 (NTAPI *PIO_CSQ_REMOVE_IRP)(
02593   _In_ struct _IO_CSQ *Csq,
02594   _In_ PIRP Irp);
02595 
02596 typedef PIRP
02597 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
02598   _In_ struct _IO_CSQ *Csq,
02599   _In_ PIRP Irp,
02600   _In_ PVOID PeekContext);
02601 
02602 typedef VOID
02603 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
02604   _In_ struct _IO_CSQ *Csq,
02605   _Out_ PKIRQL Irql);
02606 
02607 typedef VOID
02608 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
02609   _In_ struct _IO_CSQ *Csq,
02610   _In_ KIRQL Irql);
02611 
02612 typedef VOID
02613 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
02614   _In_ struct _IO_CSQ *Csq,
02615   _In_ PIRP Irp);
02616 
02617 typedef struct _IO_CSQ {
02618   ULONG Type;
02619   PIO_CSQ_INSERT_IRP CsqInsertIrp;
02620   PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
02621   PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
02622   PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
02623   PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
02624   PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
02625   PVOID ReservePointer;
02626 } IO_CSQ, *PIO_CSQ;
02627 
02628 typedef enum _BUS_QUERY_ID_TYPE {
02629   BusQueryDeviceID,
02630   BusQueryHardwareIDs,
02631   BusQueryCompatibleIDs,
02632   BusQueryInstanceID,
02633   BusQueryDeviceSerialNumber
02634 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
02635 
02636 typedef enum _DEVICE_TEXT_TYPE {
02637   DeviceTextDescription,
02638   DeviceTextLocationInformation
02639 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
02640 
02641 typedef BOOLEAN
02642 (NTAPI *PGPE_SERVICE_ROUTINE)(
02643   PVOID,
02644   PVOID);
02645 
02646 _IRQL_requires_max_(DISPATCH_LEVEL)
02647 _Must_inspect_result_
02648 typedef NTSTATUS
02649 (NTAPI *PGPE_CONNECT_VECTOR)(
02650   PDEVICE_OBJECT,
02651   ULONG,
02652   KINTERRUPT_MODE,
02653   BOOLEAN,
02654   PGPE_SERVICE_ROUTINE,
02655   PVOID,
02656   PVOID);
02657 
02658 _IRQL_requires_max_(DISPATCH_LEVEL)
02659 _Must_inspect_result_
02660 typedef NTSTATUS
02661 (NTAPI *PGPE_DISCONNECT_VECTOR)(
02662   PVOID);
02663 
02664 _IRQL_requires_max_(DISPATCH_LEVEL)
02665 _Must_inspect_result_
02666 typedef NTSTATUS
02667 (NTAPI *PGPE_ENABLE_EVENT)(
02668   PDEVICE_OBJECT,
02669   PVOID);
02670 
02671 _IRQL_requires_max_(DISPATCH_LEVEL)
02672 _Must_inspect_result_
02673 typedef NTSTATUS
02674 (NTAPI *PGPE_DISABLE_EVENT)(
02675   PDEVICE_OBJECT,
02676   PVOID);
02677 
02678 _IRQL_requires_max_(DISPATCH_LEVEL)
02679 _Must_inspect_result_
02680 typedef NTSTATUS
02681 (NTAPI *PGPE_CLEAR_STATUS)(
02682   PDEVICE_OBJECT,
02683   PVOID);
02684 
02685 typedef VOID
02686 (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
02687   PVOID,
02688   ULONG);
02689 
02690 _IRQL_requires_max_(DISPATCH_LEVEL)
02691 _Must_inspect_result_
02692 typedef NTSTATUS
02693 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
02694   PDEVICE_OBJECT,
02695   PDEVICE_NOTIFY_CALLBACK,
02696   PVOID);
02697 
02698 _IRQL_requires_max_(DISPATCH_LEVEL)
02699 typedef VOID
02700 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
02701   PDEVICE_OBJECT,
02702   PDEVICE_NOTIFY_CALLBACK);
02703 
02704 typedef struct _ACPI_INTERFACE_STANDARD {
02705   USHORT Size;
02706   USHORT Version;
02707   PVOID Context;
02708   PINTERFACE_REFERENCE InterfaceReference;
02709   PINTERFACE_DEREFERENCE InterfaceDereference;
02710   PGPE_CONNECT_VECTOR GpeConnectVector;
02711   PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
02712   PGPE_ENABLE_EVENT GpeEnableEvent;
02713   PGPE_DISABLE_EVENT GpeDisableEvent;
02714   PGPE_CLEAR_STATUS GpeClearStatus;
02715   PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
02716   PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
02717 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
02718 
02719 typedef BOOLEAN
02720 (NTAPI *PGPE_SERVICE_ROUTINE2)(
02721   PVOID ObjectContext,
02722   PVOID ServiceContext);
02723 
02724 _IRQL_requires_max_(DISPATCH_LEVEL)
02725 _Must_inspect_result_
02726 typedef NTSTATUS
02727 (NTAPI *PGPE_CONNECT_VECTOR2)(
02728   PVOID Context,
02729   ULONG GpeNumber,
02730   KINTERRUPT_MODE Mode,
02731   BOOLEAN Shareable,
02732   PGPE_SERVICE_ROUTINE ServiceRoutine,
02733   PVOID ServiceContext,
02734   PVOID *ObjectContext);
02735 
02736 _IRQL_requires_max_(DISPATCH_LEVEL)
02737 _Must_inspect_result_
02738 typedef NTSTATUS
02739 (NTAPI *PGPE_DISCONNECT_VECTOR2)(
02740   PVOID Context,
02741   PVOID ObjectContext);
02742 
02743 _IRQL_requires_max_(DISPATCH_LEVEL)
02744 _Must_inspect_result_
02745 typedef NTSTATUS
02746 (NTAPI *PGPE_ENABLE_EVENT2)(
02747   PVOID Context,
02748   PVOID ObjectContext);
02749 
02750 _IRQL_requires_max_(DISPATCH_LEVEL)
02751 _Must_inspect_result_
02752 typedef NTSTATUS
02753 (NTAPI *PGPE_DISABLE_EVENT2)(
02754   PVOID Context,
02755   PVOID ObjectContext);
02756 
02757 _IRQL_requires_max_(DISPATCH_LEVEL)
02758 _Must_inspect_result_
02759 typedef NTSTATUS
02760 (NTAPI *PGPE_CLEAR_STATUS2)(
02761   PVOID Context,
02762   PVOID ObjectContext);
02763 
02764 _IRQL_requires_max_(DISPATCH_LEVEL)
02765 typedef VOID
02766 (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
02767   PVOID NotificationContext,
02768   ULONG NotifyCode);
02769 
02770 _IRQL_requires_max_(DISPATCH_LEVEL)
02771 _Must_inspect_result_
02772 typedef NTSTATUS
02773 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
02774   PVOID Context,
02775   PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
02776   PVOID NotificationContext);
02777 
02778 _IRQL_requires_max_(DISPATCH_LEVEL)
02779 typedef VOID
02780 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
02781   PVOID Context);
02782 
02783 typedef struct _ACPI_INTERFACE_STANDARD2 {
02784   USHORT Size;
02785   USHORT Version;
02786   PVOID Context;
02787   PINTERFACE_REFERENCE InterfaceReference;
02788   PINTERFACE_DEREFERENCE InterfaceDereference;
02789   PGPE_CONNECT_VECTOR2 GpeConnectVector;
02790   PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
02791   PGPE_ENABLE_EVENT2 GpeEnableEvent;
02792   PGPE_DISABLE_EVENT2 GpeDisableEvent;
02793   PGPE_CLEAR_STATUS2 GpeClearStatus;
02794   PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
02795   PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
02796 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
02797 
02798 #if !defined(_AMD64_) && !defined(_IA64_)
02799 #include <pshpack4.h>
02800 #endif
02801 typedef struct _IO_STACK_LOCATION {
02802   UCHAR MajorFunction;
02803   UCHAR MinorFunction;
02804   UCHAR Flags;
02805   UCHAR Control;
02806   union {
02807     struct {
02808       PIO_SECURITY_CONTEXT SecurityContext;
02809       ULONG Options;
02810       USHORT POINTER_ALIGNMENT FileAttributes;
02811       USHORT ShareAccess;
02812       ULONG POINTER_ALIGNMENT EaLength;
02813     } Create;
02814     struct {
02815       ULONG Length;
02816       ULONG POINTER_ALIGNMENT Key;
02817       LARGE_INTEGER ByteOffset;
02818     } Read;
02819     struct {
02820       ULONG Length;
02821       ULONG POINTER_ALIGNMENT Key;
02822       LARGE_INTEGER ByteOffset;
02823     } Write;
02824     struct {
02825       ULONG Length;
02826       PUNICODE_STRING FileName;
02827       FILE_INFORMATION_CLASS FileInformationClass;
02828       ULONG FileIndex;
02829     } QueryDirectory;
02830     struct {
02831       ULONG Length;
02832       ULONG CompletionFilter;
02833     } NotifyDirectory;
02834     struct {
02835       ULONG Length;
02836       FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
02837     } QueryFile;
02838     struct {
02839       ULONG Length;
02840       FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
02841       PFILE_OBJECT FileObject;
02842       _ANONYMOUS_UNION union {
02843         _ANONYMOUS_STRUCT struct {
02844           BOOLEAN ReplaceIfExists;
02845           BOOLEAN AdvanceOnly;
02846         } DUMMYSTRUCTNAME;
02847         ULONG ClusterCount;
02848         HANDLE DeleteHandle;
02849       } DUMMYUNIONNAME;
02850     } SetFile;
02851     struct {
02852       ULONG Length;
02853       PVOID EaList;
02854       ULONG EaListLength;
02855       ULONG EaIndex;
02856     } QueryEa;
02857     struct {
02858       ULONG Length;
02859     } SetEa;
02860     struct {
02861       ULONG Length;
02862       FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
02863     } QueryVolume;
02864     struct {
02865       ULONG Length;
02866       FS_INFORMATION_CLASS FsInformationClass;
02867     } SetVolume;
02868     struct {
02869       ULONG OutputBufferLength;
02870       ULONG InputBufferLength;
02871       ULONG FsControlCode;
02872       PVOID Type3InputBuffer;
02873     } FileSystemControl;
02874     struct {
02875       PLARGE_INTEGER Length;
02876       ULONG Key;
02877       LARGE_INTEGER ByteOffset;
02878     } LockControl;
02879     struct {
02880       ULONG OutputBufferLength;
02881       ULONG POINTER_ALIGNMENT InputBufferLength;
02882       ULONG POINTER_ALIGNMENT IoControlCode;
02883       PVOID Type3InputBuffer;
02884     } DeviceIoControl;
02885     struct {
02886       SECURITY_INFORMATION SecurityInformation;
02887       ULONG POINTER_ALIGNMENT Length;
02888     } QuerySecurity;
02889     struct {
02890       SECURITY_INFORMATION SecurityInformation;
02891       PSECURITY_DESCRIPTOR SecurityDescriptor;
02892     } SetSecurity;
02893     struct {
02894       PVPB Vpb;
02895       PDEVICE_OBJECT DeviceObject;
02896     } MountVolume;
02897     struct {
02898       PVPB Vpb;
02899       PDEVICE_OBJECT DeviceObject;
02900     } VerifyVolume;
02901     struct {
02902       struct _SCSI_REQUEST_BLOCK *Srb;
02903     } Scsi;
02904     struct {
02905       ULONG Length;
02906       PSID StartSid;
02907       struct _FILE_GET_QUOTA_INFORMATION *SidList;
02908       ULONG SidListLength;
02909     } QueryQuota;
02910     struct {
02911       ULONG Length;
02912     } SetQuota;
02913     struct {
02914       DEVICE_RELATION_TYPE Type;
02915     } QueryDeviceRelations;
02916     struct {
02917       CONST GUID *InterfaceType;
02918       USHORT Size;
02919       USHORT Version;
02920       PINTERFACE Interface;
02921       PVOID InterfaceSpecificData;
02922     } QueryInterface;
02923     struct {
02924       PDEVICE_CAPABILITIES Capabilities;
02925     } DeviceCapabilities;
02926     struct {
02927       PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
02928     } FilterResourceRequirements;
02929     struct {
02930       ULONG WhichSpace;
02931       PVOID Buffer;
02932       ULONG Offset;
02933       ULONG POINTER_ALIGNMENT Length;
02934     } ReadWriteConfig;
02935     struct {
02936       BOOLEAN Lock;
02937     } SetLock;
02938     struct {
02939       BUS_QUERY_ID_TYPE IdType;
02940     } QueryId;
02941     struct {
02942       DEVICE_TEXT_TYPE DeviceTextType;
02943       LCID POINTER_ALIGNMENT LocaleId;
02944     } QueryDeviceText;
02945     struct {
02946       BOOLEAN InPath;
02947       BOOLEAN Reserved[3];
02948       DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
02949     } UsageNotification;
02950     struct {
02951       SYSTEM_POWER_STATE PowerState;
02952     } WaitWake;
02953     struct {
02954       PPOWER_SEQUENCE PowerSequence;
02955     } PowerSequence;
02956     struct {
02957       ULONG SystemContext;
02958       POWER_STATE_TYPE POINTER_ALIGNMENT Type;
02959       POWER_STATE POINTER_ALIGNMENT State;
02960       POWER_ACTION POINTER_ALIGNMENT ShutdownType;
02961     } Power;
02962     struct {
02963       PCM_RESOURCE_LIST AllocatedResources;
02964       PCM_RESOURCE_LIST AllocatedResourcesTranslated;
02965     } StartDevice;
02966     struct {
02967       ULONG_PTR ProviderId;
02968       PVOID DataPath;
02969       ULONG BufferSize;
02970       PVOID Buffer;
02971     } WMI;
02972     struct {
02973       PVOID Argument1;
02974       PVOID Argument2;
02975       PVOID Argument3;
02976       PVOID Argument4;
02977     } Others;
02978   } Parameters;
02979   PDEVICE_OBJECT DeviceObject;
02980   PFILE_OBJECT FileObject;
02981   PIO_COMPLETION_ROUTINE CompletionRoutine;
02982   PVOID Context;
02983 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
02984 #if !defined(_AMD64_) && !defined(_IA64_)
02985 #include <poppack.h>
02986 #endif
02987 
02988 /* IO_STACK_LOCATION.Control */
02989 
02990 #define SL_PENDING_RETURNED               0x01
02991 #define SL_ERROR_RETURNED                 0x02
02992 #define SL_INVOKE_ON_CANCEL               0x20
02993 #define SL_INVOKE_ON_SUCCESS              0x40
02994 #define SL_INVOKE_ON_ERROR                0x80
02995 
02996 $endif (_WDMDDK_)
02997 $if (_WDMDDK_ || _DEVIOCTL_)
02998 #define METHOD_BUFFERED                   0
02999 #define METHOD_IN_DIRECT                  1
03000 #define METHOD_OUT_DIRECT                 2
03001 #define METHOD_NEITHER                    3
03002 
03003 #define METHOD_DIRECT_TO_HARDWARE       METHOD_IN_DIRECT
03004 #define METHOD_DIRECT_FROM_HARDWARE     METHOD_OUT_DIRECT
03005 
03006 $endif (_WDMDDK_ || _DEVIOCTL_)
03007 $if (_WDMDDK_)
03008 #define FILE_SUPERSEDED                   0x00000000
03009 #define FILE_OPENED                       0x00000001
03010 #define FILE_CREATED                      0x00000002
03011 #define FILE_OVERWRITTEN                  0x00000003
03012 #define FILE_EXISTS                       0x00000004
03013 #define FILE_DOES_NOT_EXIST               0x00000005
03014 
03015 #define FILE_USE_FILE_POINTER_POSITION    0xfffffffe
03016 #define FILE_WRITE_TO_END_OF_FILE         0xffffffff
03017 
03018 /* also in winnt.h */
03019 #define FILE_LIST_DIRECTORY               0x00000001
03020 #define FILE_READ_DATA                    0x00000001
03021 #define FILE_ADD_FILE                     0x00000002
03022 #define FILE_WRITE_DATA                   0x00000002
03023 #define FILE_ADD_SUBDIRECTORY             0x00000004
03024 #define FILE_APPEND_DATA                  0x00000004
03025 #define FILE_CREATE_PIPE_INSTANCE         0x00000004
03026 #define FILE_READ_EA                      0x00000008
03027 #define FILE_WRITE_EA                     0x00000010
03028 #define FILE_EXECUTE                      0x00000020
03029 #define FILE_TRAVERSE                     0x00000020
03030 #define FILE_DELETE_CHILD                 0x00000040
03031 #define FILE_READ_ATTRIBUTES              0x00000080
03032 #define FILE_WRITE_ATTRIBUTES             0x00000100
03033 
03034 #define FILE_SHARE_READ                   0x00000001
03035 #define FILE_SHARE_WRITE                  0x00000002
03036 #define FILE_SHARE_DELETE                 0x00000004
03037 #define FILE_SHARE_VALID_FLAGS            0x00000007
03038 
03039 #define FILE_ATTRIBUTE_READONLY           0x00000001
03040 #define FILE_ATTRIBUTE_HIDDEN             0x00000002
03041 #define FILE_ATTRIBUTE_SYSTEM             0x00000004
03042 #define FILE_ATTRIBUTE_DIRECTORY          0x00000010
03043 #define FILE_ATTRIBUTE_ARCHIVE            0x00000020
03044 #define FILE_ATTRIBUTE_DEVICE             0x00000040
03045 #define FILE_ATTRIBUTE_NORMAL             0x00000080
03046 #define FILE_ATTRIBUTE_TEMPORARY          0x00000100
03047 #define FILE_ATTRIBUTE_SPARSE_FILE        0x00000200
03048 #define FILE_ATTRIBUTE_REPARSE_POINT      0x00000400
03049 #define FILE_ATTRIBUTE_COMPRESSED         0x00000800
03050 #define FILE_ATTRIBUTE_OFFLINE            0x00001000
03051 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
03052 #define FILE_ATTRIBUTE_ENCRYPTED          0x00004000
03053 #define FILE_ATTRIBUTE_VIRTUAL            0x00010000
03054 
03055 #define FILE_ATTRIBUTE_VALID_FLAGS        0x00007fb7
03056 #define FILE_ATTRIBUTE_VALID_SET_FLAGS    0x000031a7
03057 
03058 #define FILE_VALID_OPTION_FLAGS           0x00ffffff
03059 #define FILE_VALID_PIPE_OPTION_FLAGS      0x00000032
03060 #define FILE_VALID_MAILSLOT_OPTION_FLAGS  0x00000032
03061 #define FILE_VALID_SET_FLAGS              0x00000036
03062 
03063 #define FILE_SUPERSEDE                    0x00000000
03064 #define FILE_OPEN                         0x00000001
03065 #define FILE_CREATE                       0x00000002
03066 #define FILE_OPEN_IF                      0x00000003
03067 #define FILE_OVERWRITE                    0x00000004
03068 #define FILE_OVERWRITE_IF                 0x00000005
03069 #define FILE_MAXIMUM_DISPOSITION          0x00000005
03070 
03071 #define FILE_DIRECTORY_FILE               0x00000001
03072 #define FILE_WRITE_THROUGH                0x00000002
03073 #define FILE_SEQUENTIAL_ONLY              0x00000004
03074 #define FILE_NO_INTERMEDIATE_BUFFERING    0x00000008
03075 #define FILE_SYNCHRONOUS_IO_ALERT         0x00000010
03076 #define FILE_SYNCHRONOUS_IO_NONALERT      0x00000020
03077 #define FILE_NON_DIRECTORY_FILE           0x00000040
03078 #define FILE_CREATE_TREE_CONNECTION       0x00000080
03079 #define FILE_COMPLETE_IF_OPLOCKED         0x00000100
03080 #define FILE_NO_EA_KNOWLEDGE              0x00000200
03081 #define FILE_OPEN_REMOTE_INSTANCE         0x00000400
03082 #define FILE_RANDOM_ACCESS                0x00000800
03083 #define FILE_DELETE_ON_CLOSE              0x00001000
03084 #define FILE_OPEN_BY_FILE_ID              0x00002000
03085 #define FILE_OPEN_FOR_BACKUP_INTENT       0x00004000
03086 #define FILE_NO_COMPRESSION               0x00008000
03087 #if (NTDDI_VERSION >= NTDDI_WIN7)
03088 #define FILE_OPEN_REQUIRING_OPLOCK        0x00010000
03089 #define FILE_DISALLOW_EXCLUSIVE           0x00020000
03090 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
03091 #define FILE_RESERVE_OPFILTER             0x00100000
03092 #define FILE_OPEN_REPARSE_POINT           0x00200000
03093 #define FILE_OPEN_NO_RECALL               0x00400000
03094 #define FILE_OPEN_FOR_FREE_SPACE_QUERY    0x00800000
03095 
03096 $endif (_WDMDDK_)
03097 $if (_WDMDDK_ || _DEVIOCTL_)
03098 #define FILE_ANY_ACCESS                   0x00000000
03099 #define FILE_SPECIAL_ACCESS               FILE_ANY_ACCESS
03100 #define FILE_READ_ACCESS                  0x00000001
03101 #define FILE_WRITE_ACCESS                 0x00000002
03102 
03103 $endif (_WDMDDK_ || _DEVIOCTL_)
03104 $if (_WDMDDK_)
03105 #define FILE_ALL_ACCESS \
03106   (STANDARD_RIGHTS_REQUIRED | \
03107    SYNCHRONIZE | \
03108    0x1FF)
03109 
03110 #define FILE_GENERIC_EXECUTE \
03111   (STANDARD_RIGHTS_EXECUTE | \
03112    FILE_READ_ATTRIBUTES | \
03113    FILE_EXECUTE | \
03114    SYNCHRONIZE)
03115 
03116 #define FILE_GENERIC_READ \
03117   (STANDARD_RIGHTS_READ | \
03118    FILE_READ_DATA | \
03119    FILE_READ_ATTRIBUTES | \
03120    FILE_READ_EA | \
03121    SYNCHRONIZE)
03122 
03123 #define FILE_GENERIC_WRITE \
03124   (STANDARD_RIGHTS_WRITE | \
03125    FILE_WRITE_DATA | \
03126    FILE_WRITE_ATTRIBUTES | \
03127    FILE_WRITE_EA | \
03128    FILE_APPEND_DATA | \
03129    SYNCHRONIZE)
03130 
03131 /* end winnt.h */
03132 
03133 #define WMIREG_ACTION_REGISTER      1
03134 #define WMIREG_ACTION_DEREGISTER    2
03135 #define WMIREG_ACTION_REREGISTER    3
03136 #define WMIREG_ACTION_UPDATE_GUIDS  4
03137 #define WMIREG_ACTION_BLOCK_IRPS    5
03138 
03139 #define WMIREGISTER                 0
03140 #define WMIUPDATE                   1
03141 
03142 _Function_class_(WMI_NOTIFICATION_CALLBACK)
03143 _IRQL_requires_same_
03144 typedef VOID
03145 (NTAPI FWMI_NOTIFICATION_CALLBACK)(
03146   PVOID Wnode,
03147   PVOID Context);
03148 typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
03149 
03150 #ifndef _PCI_X_
03151 #define _PCI_X_
03152 
03153 typedef struct _PCI_SLOT_NUMBER {
03154   union {
03155     struct {
03156       ULONG DeviceNumber:5;
03157       ULONG FunctionNumber:3;
03158       ULONG Reserved:24;
03159     } bits;
03160     ULONG AsULONG;
03161   } u;
03162 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
03163 
03164 #define PCI_TYPE0_ADDRESSES               6
03165 #define PCI_TYPE1_ADDRESSES               2
03166 #define PCI_TYPE2_ADDRESSES               5
03167 
03168 typedef struct _PCI_COMMON_HEADER {
03169   PCI_COMMON_HEADER_LAYOUT
03170 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
03171 
03172 #ifdef __cplusplus
03173 typedef struct _PCI_COMMON_CONFIG {
03174   PCI_COMMON_HEADER_LAYOUT
03175   UCHAR DeviceSpecific[192];
03176 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
03177 #else
03178 typedef struct _PCI_COMMON_CONFIG {
03179   PCI_COMMON_HEADER DUMMYSTRUCTNAME;
03180   UCHAR DeviceSpecific[192];
03181 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
03182 #endif
03183 
03184 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
03185 
03186 #define PCI_EXTENDED_CONFIG_LENGTH               0x1000
03187 
03188 #define PCI_MAX_DEVICES        32
03189 #define PCI_MAX_FUNCTION       8
03190 #define PCI_MAX_BRIDGE_NUMBER  0xFF
03191 #define PCI_INVALID_VENDORID   0xFFFF
03192 
03193 /* PCI_COMMON_CONFIG.HeaderType */
03194 #define PCI_MULTIFUNCTION                 0x80
03195 #define PCI_DEVICE_TYPE                   0x00
03196 #define PCI_BRIDGE_TYPE                   0x01
03197 #define PCI_CARDBUS_BRIDGE_TYPE           0x02
03198 
03199 #define PCI_CONFIGURATION_TYPE(PciData) \
03200   (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
03201 
03202 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
03203   ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
03204 
03205 /* PCI_COMMON_CONFIG.Command */
03206 #define PCI_ENABLE_IO_SPACE               0x0001
03207 #define PCI_ENABLE_MEMORY_SPACE           0x0002
03208 #define PCI_ENABLE_BUS_MASTER             0x0004
03209 #define PCI_ENABLE_SPECIAL_CYCLES         0x0008
03210 #define PCI_ENABLE_WRITE_AND_INVALIDATE   0x0010
03211 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
03212 #define PCI_ENABLE_PARITY                 0x0040
03213 #define PCI_ENABLE_WAIT_CYCLE             0x0080
03214 #define PCI_ENABLE_SERR                   0x0100
03215 #define PCI_ENABLE_FAST_BACK_TO_BACK      0x0200
03216 #define PCI_DISABLE_LEVEL_INTERRUPT       0x0400
03217 
03218 /* PCI_COMMON_CONFIG.Status */
03219 #define PCI_STATUS_INTERRUPT_PENDING      0x0008
03220 #define PCI_STATUS_CAPABILITIES_LIST      0x0010
03221 #define PCI_STATUS_66MHZ_CAPABLE          0x0020
03222 #define PCI_STATUS_UDF_SUPPORTED          0x0040
03223 #define PCI_STATUS_FAST_BACK_TO_BACK      0x0080
03224 #define PCI_STATUS_DATA_PARITY_DETECTED   0x0100
03225 #define PCI_STATUS_DEVSEL                 0x0600
03226 #define PCI_STATUS_SIGNALED_TARGET_ABORT  0x0800
03227 #define PCI_STATUS_RECEIVED_TARGET_ABORT  0x1000
03228 #define PCI_STATUS_RECEIVED_MASTER_ABORT  0x2000
03229 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR  0x4000
03230 #define PCI_STATUS_DETECTED_PARITY_ERROR  0x8000
03231 
03232 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
03233 
03234 #define PCI_WHICHSPACE_CONFIG             0x0
03235 #define PCI_WHICHSPACE_ROM                0x52696350 /* 'PciR' */
03236 
03237 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT  0x01
03238 #define PCI_CAPABILITY_ID_AGP               0x02
03239 #define PCI_CAPABILITY_ID_VPD               0x03
03240 #define PCI_CAPABILITY_ID_SLOT_ID           0x04
03241 #define PCI_CAPABILITY_ID_MSI               0x05
03242 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP      0x06
03243 #define PCI_CAPABILITY_ID_PCIX              0x07
03244 #define PCI_CAPABILITY_ID_HYPERTRANSPORT    0x08
03245 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC   0x09
03246 #define PCI_CAPABILITY_ID_DEBUG_PORT        0x0A
03247 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL     0x0B
03248 #define PCI_CAPABILITY_ID_SHPC              0x0C
03249 #define PCI_CAPABILITY_ID_P2P_SSID          0x0D
03250 #define PCI_CAPABILITY_ID_AGP_TARGET        0x0E
03251 #define PCI_CAPABILITY_ID_SECURE            0x0F
03252 #define PCI_CAPABILITY_ID_PCI_EXPRESS       0x10
03253 #define PCI_CAPABILITY_ID_MSIX              0x11
03254 
03255 typedef struct _PCI_CAPABILITIES_HEADER {
03256   UCHAR CapabilityID;
03257   UCHAR Next;
03258 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
03259 
03260 typedef struct _PCI_PMC {
03261   UCHAR Version:3;
03262   UCHAR PMEClock:1;
03263   UCHAR Rsvd1:1;
03264   UCHAR DeviceSpecificInitialization:1;
03265   UCHAR Rsvd2:2;
03266   struct _PM_SUPPORT {
03267     UCHAR Rsvd2:1;
03268     UCHAR D1:1;
03269     UCHAR D2:1;
03270     UCHAR PMED0:1;
03271     UCHAR PMED1:1;
03272     UCHAR PMED2:1;
03273     UCHAR PMED3Hot:1;
03274     UCHAR PMED3Cold:1;
03275   } Support;
03276 } PCI_PMC, *PPCI_PMC;
03277 
03278 typedef struct _PCI_PMCSR {
03279   USHORT PowerState:2;
03280   USHORT Rsvd1:6;
03281   USHORT PMEEnable:1;
03282   USHORT DataSelect:4;
03283   USHORT DataScale:2;
03284   USHORT PMEStatus:1;
03285 } PCI_PMCSR, *PPCI_PMCSR;
03286 
03287 typedef struct _PCI_PMCSR_BSE {
03288   UCHAR Rsvd1:6;
03289   UCHAR D3HotSupportsStopClock:1;
03290   UCHAR BusPowerClockControlEnabled:1;
03291 } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
03292 
03293 typedef struct _PCI_PM_CAPABILITY {
03294   PCI_CAPABILITIES_HEADER Header;
03295   union {
03296     PCI_PMC Capabilities;
03297     USHORT AsUSHORT;
03298   } PMC;
03299     union {
03300       PCI_PMCSR ControlStatus;
03301       USHORT AsUSHORT;
03302     } PMCSR;
03303     union {
03304       PCI_PMCSR_BSE BridgeSupport;
03305       UCHAR AsUCHAR;
03306     } PMCSR_BSE;
03307   UCHAR Data;
03308 } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
03309 
03310 typedef struct {
03311   PCI_CAPABILITIES_HEADER Header;
03312   union {
03313     struct {
03314       USHORT DataParityErrorRecoveryEnable:1;
03315       USHORT EnableRelaxedOrdering:1;
03316       USHORT MaxMemoryReadByteCount:2;
03317       USHORT MaxOutstandingSplitTransactions:3;
03318       USHORT Reserved:9;
03319     } bits;
03320     USHORT AsUSHORT;
03321   } Command;
03322   union {
03323     struct {
03324       ULONG FunctionNumber:3;
03325       ULONG DeviceNumber:5;
03326       ULONG BusNumber:8;
03327       ULONG Device64Bit:1;
03328       ULONG Capable133MHz:1;
03329       ULONG SplitCompletionDiscarded:1;
03330       ULONG UnexpectedSplitCompletion:1;
03331       ULONG DeviceComplexity:1;
03332       ULONG DesignedMaxMemoryReadByteCount:2;
03333       ULONG DesignedMaxOutstandingSplitTransactions:3;
03334       ULONG DesignedMaxCumulativeReadSize:3;
03335       ULONG ReceivedSplitCompletionErrorMessage:1;
03336       ULONG CapablePCIX266:1;
03337       ULONG CapablePCIX533:1;
03338       } bits;
03339     ULONG AsULONG;
03340   } Status;
03341 } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
03342 
03343 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID                     0x0001
03344 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID                              0x0002
03345 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID                         0x0003
03346 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID                              0x0004
03347 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID                          0x0005
03348 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID                     0x0006
03349 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID      0x0007
03350 #define PCI_EXPRESS_MFVC_CAP_ID                                         0x0008
03351 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID                                  0x0009
03352 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID                                  0x000A
03353 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID                0x0010
03354 
03355 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
03356   USHORT CapabilityID;
03357   USHORT Version:4;
03358   USHORT Next:12;
03359 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
03360 
03361 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
03362   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
03363   ULONG LowSerialNumber;
03364   ULONG HighSerialNumber;
03365 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
03366 
03367 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
03368   _ANONYMOUS_STRUCT struct {
03369     ULONG Undefined:1;
03370     ULONG Reserved1:3;
03371     ULONG DataLinkProtocolError:1;
03372     ULONG SurpriseDownError:1;
03373     ULONG Reserved2:6;
03374     ULONG PoisonedTLP:1;
03375     ULONG FlowControlProtocolError:1;
03376     ULONG CompletionTimeout:1;
03377     ULONG CompleterAbort:1;
03378     ULONG UnexpectedCompletion:1;
03379     ULONG ReceiverOverflow:1;
03380     ULONG MalformedTLP:1;
03381     ULONG ECRCError:1;
03382     ULONG UnsupportedRequestError:1;
03383     ULONG Reserved3:11;
03384   } DUMMYSTRUCTNAME;
03385   ULONG AsULONG;
03386 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
03387 
03388 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
03389   _ANONYMOUS_STRUCT struct {
03390     ULONG Undefined:1;
03391     ULONG Reserved1:3;
03392     ULONG DataLinkProtocolError:1;
03393     ULONG SurpriseDownError:1;
03394     ULONG Reserved2:6;
03395     ULONG PoisonedTLP:1;
03396     ULONG FlowControlProtocolError:1;
03397     ULONG CompletionTimeout:1;
03398     ULONG CompleterAbort:1;
03399     ULONG UnexpectedCompletion:1;
03400     ULONG ReceiverOverflow:1;
03401     ULONG MalformedTLP:1;
03402     ULONG ECRCError:1;
03403     ULONG UnsupportedRequestError:1;
03404     ULONG Reserved3:11;
03405   } DUMMYSTRUCTNAME;
03406   ULONG AsULONG;
03407 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
03408 
03409 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
03410   _ANONYMOUS_STRUCT struct {
03411     ULONG Undefined:1;
03412     ULONG Reserved1:3;
03413     ULONG DataLinkProtocolError:1;
03414     ULONG SurpriseDownError:1;
03415     ULONG Reserved2:6;
03416     ULONG PoisonedTLP:1;
03417     ULONG FlowControlProtocolError:1;
03418     ULONG CompletionTimeout:1;
03419     ULONG CompleterAbort:1;
03420     ULONG UnexpectedCompletion:1;
03421     ULONG ReceiverOverflow:1;
03422     ULONG MalformedTLP:1;
03423     ULONG ECRCError:1;
03424     ULONG UnsupportedRequestError:1;
03425     ULONG Reserved3:11;
03426   } DUMMYSTRUCTNAME;
03427   ULONG AsULONG;
03428 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
03429 
03430 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
03431   _ANONYMOUS_STRUCT struct {
03432     ULONG ReceiverError:1;
03433     ULONG Reserved1:5;
03434     ULONG BadTLP:1;
03435     ULONG BadDLLP:1;
03436     ULONG ReplayNumRollover:1;
03437     ULONG Reserved2:3;
03438     ULONG ReplayTimerTimeout:1;
03439     ULONG AdvisoryNonFatalError:1;
03440     ULONG Reserved3:18;
03441   } DUMMYSTRUCTNAME;
03442   ULONG AsULONG;
03443 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
03444 
03445 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
03446   _ANONYMOUS_STRUCT struct {
03447     ULONG ReceiverError:1;
03448     ULONG Reserved1:5;
03449     ULONG BadTLP:1;
03450     ULONG BadDLLP:1;
03451     ULONG ReplayNumRollover:1;
03452     ULONG Reserved2:3;
03453     ULONG ReplayTimerTimeout:1;
03454     ULONG AdvisoryNonFatalError:1;
03455     ULONG Reserved3:18;
03456   } DUMMYSTRUCTNAME;
03457   ULONG AsULONG;
03458 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
03459 
03460 typedef union _PCI_EXPRESS_AER_CAPABILITIES {
03461   _ANONYMOUS_STRUCT struct {
03462     ULONG FirstErrorPointer:5;
03463     ULONG ECRCGenerationCapable:1;
03464     ULONG ECRCGenerationEnable:1;
03465     ULONG ECRCCheckCapable:1;
03466     ULONG ECRCCheckEnable:1;
03467     ULONG Reserved:23;
03468   } DUMMYSTRUCTNAME;
03469   ULONG AsULONG;
03470 } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
03471 
03472 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
03473   _ANONYMOUS_STRUCT struct {
03474     ULONG CorrectableErrorReportingEnable:1;
03475     ULONG NonFatalErrorReportingEnable:1;
03476     ULONG FatalErrorReportingEnable:1;
03477     ULONG Reserved:29;
03478   } DUMMYSTRUCTNAME;
03479   ULONG AsULONG;
03480 } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
03481 
03482 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
03483   _ANONYMOUS_STRUCT struct {
03484     ULONG CorrectableErrorReceived:1;
03485     ULONG MultipleCorrectableErrorsReceived:1;
03486     ULONG UncorrectableErrorReceived:1;
03487     ULONG MultipleUncorrectableErrorsReceived:1;
03488     ULONG FirstUncorrectableFatal:1;
03489     ULONG NonFatalErrorMessagesReceived:1;
03490     ULONG FatalErrorMessagesReceived:1;
03491     ULONG Reserved:20;
03492     ULONG AdvancedErrorInterruptMessageNumber:5;
03493   } DUMMYSTRUCTNAME;
03494   ULONG AsULONG;
03495 } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
03496 
03497 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
03498   _ANONYMOUS_STRUCT struct {
03499     USHORT CorrectableSourceIdFun:3;
03500     USHORT CorrectableSourceIdDev:5;
03501     USHORT CorrectableSourceIdBus:8;
03502     USHORT UncorrectableSourceIdFun:3;
03503     USHORT UncorrectableSourceIdDev:5;
03504     USHORT UncorrectableSourceIdBus:8;
03505   } DUMMYSTRUCTNAME;
03506   ULONG AsULONG;
03507 } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
03508 
03509 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
03510   _ANONYMOUS_STRUCT struct {
03511     ULONG TargetAbortOnSplitCompletion:1;
03512     ULONG MasterAbortOnSplitCompletion:1;
03513     ULONG ReceivedTargetAbort:1;
03514     ULONG ReceivedMasterAbort:1;
03515     ULONG RsvdZ:1;
03516     ULONG UnexpectedSplitCompletionError:1;
03517     ULONG UncorrectableSplitCompletion:1;
03518     ULONG UncorrectableDataError:1;
03519     ULONG UncorrectableAttributeError:1;
03520     ULONG UncorrectableAddressError:1;
03521     ULONG DelayedTransactionDiscardTimerExpired:1;
03522     ULONG PERRAsserted:1;
03523     ULONG SERRAsserted:1;
03524     ULONG InternalBridgeError:1;
03525     ULONG Reserved:18;
03526   } DUMMYSTRUCTNAME;
03527   ULONG AsULONG;
03528 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
03529 
03530 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
03531   _ANONYMOUS_STRUCT struct {
03532     ULONG TargetAbortOnSplitCompletion:1;
03533     ULONG MasterAbortOnSplitCompletion:1;
03534     ULONG ReceivedTargetAbort:1;
03535     ULONG ReceivedMasterAbort:1;
03536     ULONG RsvdZ:1;
03537     ULONG UnexpectedSplitCompletionError:1;
03538     ULONG UncorrectableSplitCompletion:1;
03539     ULONG UncorrectableDataError:1;
03540     ULONG UncorrectableAttributeError:1;
03541     ULONG UncorrectableAddressError:1;
03542     ULONG DelayedTransactionDiscardTimerExpired:1;
03543     ULONG PERRAsserted:1;
03544     ULONG SERRAsserted:1;
03545     ULONG InternalBridgeError:1;
03546     ULONG Reserved:18;
03547   } DUMMYSTRUCTNAME;
03548   ULONG AsULONG;
03549 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
03550 
03551 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
03552   _ANONYMOUS_STRUCT struct {
03553     ULONG TargetAbortOnSplitCompletion:1;
03554     ULONG MasterAbortOnSplitCompletion:1;
03555     ULONG ReceivedTargetAbort:1;
03556     ULONG ReceivedMasterAbort:1;
03557     ULONG RsvdZ:1;
03558     ULONG UnexpectedSplitCompletionError:1;
03559     ULONG UncorrectableSplitCompletion:1;
03560     ULONG UncorrectableDataError:1;
03561     ULONG UncorrectableAttributeError:1;
03562     ULONG UncorrectableAddressError:1;
03563     ULONG DelayedTransactionDiscardTimerExpired:1;
03564     ULONG PERRAsserted:1;
03565     ULONG SERRAsserted:1;
03566     ULONG InternalBridgeError:1;
03567     ULONG Reserved:18;
03568   } DUMMYSTRUCTNAME;
03569   ULONG AsULONG;
03570 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
03571 
03572 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
03573   _ANONYMOUS_STRUCT struct {
03574     ULONG SecondaryUncorrectableFirstErrorPtr:5;
03575     ULONG Reserved:27;
03576   } DUMMYSTRUCTNAME;
03577   ULONG AsULONG;
03578 } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
03579 
03580 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING  0x00000001
03581 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING     0x00000002
03582 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING        0x00000004
03583 
03584 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
03585     (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
03586      ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
03587      ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
03588 
03589 typedef struct _PCI_EXPRESS_AER_CAPABILITY {
03590   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
03591   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
03592   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
03593   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
03594   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
03595   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
03596   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
03597   ULONG HeaderLog[4];
03598   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
03599   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
03600   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
03601   PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
03602   ULONG SecHeaderLog[4];
03603 } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
03604 
03605 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
03606   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
03607   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
03608   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
03609   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
03610   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
03611   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
03612   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
03613   ULONG HeaderLog[4];
03614   PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
03615   PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
03616   PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
03617 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
03618 
03619 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
03620   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
03621   PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
03622   PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
03623   PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
03624   PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
03625   PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
03626   PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
03627   ULONG HeaderLog[4];
03628   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
03629   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
03630   PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
03631   PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
03632   ULONG SecHeaderLog[4];
03633 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
03634 
03635 typedef union _PCI_EXPRESS_SRIOV_CAPS {
03636   _ANONYMOUS_STRUCT struct {
03637     ULONG VFMigrationCapable:1;
03638     ULONG Reserved1:20;
03639     ULONG VFMigrationInterruptNumber:11;
03640   } DUMMYSTRUCTNAME;
03641   ULONG AsULONG;
03642 } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
03643 
03644 typedef union _PCI_EXPRESS_SRIOV_CONTROL {
03645   _ANONYMOUS_STRUCT struct {
03646     USHORT VFEnable:1;
03647     USHORT VFMigrationEnable:1;
03648     USHORT VFMigrationInterruptEnable:1;
03649     USHORT VFMemorySpaceEnable:1;
03650     USHORT ARICapableHierarchy:1;
03651     USHORT Reserved1:11;
03652   } DUMMYSTRUCTNAME;
03653   USHORT AsUSHORT;
03654 } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
03655 
03656 typedef union _PCI_EXPRESS_SRIOV_STATUS {
03657   _ANONYMOUS_STRUCT struct {
03658     USHORT VFMigrationStatus:1;
03659     USHORT Reserved1:15;
03660   } DUMMYSTRUCTNAME;
03661   USHORT AsUSHORT;
03662 } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
03663 
03664 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
03665   _ANONYMOUS_STRUCT struct {
03666     ULONG VFMigrationStateBIR:3;
03667     ULONG VFMigrationStateOffset:29;
03668   } DUMMYSTRUCTNAME;
03669   ULONG AsULONG;
03670 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
03671 
03672 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
03673   PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
03674   PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
03675   PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
03676   PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
03677   USHORT InitialVFs;
03678   USHORT TotalVFs;
03679   USHORT NumVFs;
03680   UCHAR FunctionDependencyLink;
03681   UCHAR RsvdP1;
03682   USHORT FirstVFOffset;
03683   USHORT VFStride;
03684   USHORT RsvdP2;
03685   USHORT VFDeviceId;
03686   ULONG SupportedPageSizes;
03687   ULONG SystemPageSize;
03688   ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
03689   PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
03690 } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
03691 
03692 /* PCI device classes */
03693 #define PCI_CLASS_PRE_20                    0x00
03694 #define PCI_CLASS_MASS_STORAGE_CTLR         0x01
03695 #define PCI_CLASS_NETWORK_CTLR              0x02
03696 #define PCI_CLASS_DISPLAY_CTLR              0x03
03697 #define PCI_CLASS_MULTIMEDIA_DEV            0x04
03698 #define PCI_CLASS_MEMORY_CTLR               0x05
03699 #define PCI_CLASS_BRIDGE_DEV                0x06
03700 #define PCI_CLASS_SIMPLE_COMMS_CTLR         0x07
03701 #define PCI_CLASS_BASE_SYSTEM_DEV           0x08
03702 #define PCI_CLASS_INPUT_DEV                 0x09
03703 #define PCI_CLASS_DOCKING_STATION           0x0a
03704 #define PCI_CLASS_PROCESSOR                 0x0b
03705 #define PCI_CLASS_SERIAL_BUS_CTLR           0x0c
03706 #define PCI_CLASS_WIRELESS_CTLR             0x0d
03707 #define PCI_CLASS_INTELLIGENT_IO_CTLR       0x0e
03708 #define PCI_CLASS_SATELLITE_COMMS_CTLR      0x0f
03709 #define PCI_CLASS_ENCRYPTION_DECRYPTION     0x10
03710 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC      0x11
03711 #define PCI_CLASS_NOT_DEFINED               0xff
03712 
03713 /* PCI device subclasses for class 0 */
03714 #define PCI_SUBCLASS_PRE_20_NON_VGA         0x00
03715 #define PCI_SUBCLASS_PRE_20_VGA             0x01
03716 
03717 /* PCI device subclasses for class 1 (mass storage controllers)*/
03718 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR      0x00
03719 #define PCI_SUBCLASS_MSC_IDE_CTLR           0x01
03720 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR        0x02
03721 #define PCI_SUBCLASS_MSC_IPI_CTLR           0x03
03722 #define PCI_SUBCLASS_MSC_RAID_CTLR          0x04
03723 #define PCI_SUBCLASS_MSC_OTHER              0x80
03724 
03725 /* PCI device subclasses for class 2 (network controllers)*/
03726 #define PCI_SUBCLASS_NET_ETHERNET_CTLR      0x00
03727 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR    0x01
03728 #define PCI_SUBCLASS_NET_FDDI_CTLR          0x02
03729 #define PCI_SUBCLASS_NET_ATM_CTLR           0x03
03730 #define PCI_SUBCLASS_NET_ISDN_CTLR          0x04
03731 #define PCI_SUBCLASS_NET_OTHER              0x80
03732 
03733 /* PCI device subclasses for class 3 (display controllers)*/
03734 #define PCI_SUBCLASS_VID_VGA_CTLR           0x00
03735 #define PCI_SUBCLASS_VID_XGA_CTLR           0x01
03736 #define PCI_SUBCLASS_VID_3D_CTLR            0x02
03737 #define PCI_SUBCLASS_VID_OTHER              0x80
03738 
03739 /* PCI device subclasses for class 4 (multimedia device)*/
03740 #define PCI_SUBCLASS_MM_VIDEO_DEV           0x00
03741 #define PCI_SUBCLASS_MM_AUDIO_DEV           0x01
03742 #define PCI_SUBCLASS_MM_TELEPHONY_DEV       0x02
03743 #define PCI_SUBCLASS_MM_OTHER               0x80
03744 
03745 /* PCI device subclasses for class 5 (memory controller)*/
03746 #define PCI_SUBCLASS_MEM_RAM                0x00
03747 #define PCI_SUBCLASS_MEM_FLASH              0x01
03748 #define PCI_SUBCLASS_MEM_OTHER              0x80
03749 
03750 /* PCI device subclasses for class 6 (bridge device)*/
03751 #define PCI_SUBCLASS_BR_HOST                0x00
03752 #define PCI_SUBCLASS_BR_ISA                 0x01
03753 #define PCI_SUBCLASS_BR_EISA                0x02
03754 #define PCI_SUBCLASS_BR_MCA                 0x03
03755 #define PCI_SUBCLASS_BR_PCI_TO_PCI          0x04
03756 #define PCI_SUBCLASS_BR_PCMCIA              0x05
03757 #define PCI_SUBCLASS_BR_NUBUS               0x06
03758 #define PCI_SUBCLASS_BR_CARDBUS             0x07
03759 #define PCI_SUBCLASS_BR_RACEWAY             0x08
03760 #define PCI_SUBCLASS_BR_OTHER               0x80
03761 
03762 #define PCI_SUBCLASS_COM_SERIAL             0x00
03763 #define PCI_SUBCLASS_COM_PARALLEL           0x01
03764 #define PCI_SUBCLASS_COM_MULTIPORT          0x02
03765 #define PCI_SUBCLASS_COM_MODEM              0x03
03766 #define PCI_SUBCLASS_COM_OTHER              0x80
03767 
03768 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR     0x00
03769 #define PCI_SUBCLASS_SYS_DMA_CTLR           0x01
03770 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER       0x02
03771 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK    0x03
03772 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR   0x04
03773 #define PCI_SUBCLASS_SYS_SDIO_CTRL          0x05
03774 #define PCI_SUBCLASS_SYS_OTHER              0x80
03775 
03776 #define PCI_SUBCLASS_INP_KEYBOARD           0x00
03777 #define PCI_SUBCLASS_INP_DIGITIZER          0x01
03778 #define PCI_SUBCLASS_INP_MOUSE              0x02
03779 #define PCI_SUBCLASS_INP_SCANNER            0x03
03780 #define PCI_SUBCLASS_INP_GAMEPORT           0x04
03781 #define PCI_SUBCLASS_INP_OTHER              0x80
03782 
03783 #define PCI_SUBCLASS_DOC_GENERIC            0x00
03784 #define PCI_SUBCLASS_DOC_OTHER              0x80
03785 
03786 #define PCI_SUBCLASS_PROC_386               0x00
03787 #define PCI_SUBCLASS_PROC_486               0x01
03788 #define PCI_SUBCLASS_PROC_PENTIUM           0x02
03789 #define PCI_SUBCLASS_PROC_ALPHA             0x10
03790 #define PCI_SUBCLASS_PROC_POWERPC           0x20
03791 #define PCI_SUBCLASS_PROC_COPROCESSOR       0x40
03792 
03793 /* PCI device subclasses for class C (serial bus controller)*/
03794 #define PCI_SUBCLASS_SB_IEEE1394            0x00
03795 #define PCI_SUBCLASS_SB_ACCESS              0x01
03796 #define PCI_SUBCLASS_SB_SSA                 0x02
03797 #define PCI_SUBCLASS_SB_USB                 0x03
03798 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL       0x04
03799 #define PCI_SUBCLASS_SB_SMBUS               0x05
03800 
03801 #define PCI_SUBCLASS_WIRELESS_IRDA          0x00
03802 #define PCI_SUBCLASS_WIRELESS_CON_IR        0x01
03803 #define PCI_SUBCLASS_WIRELESS_RF            0x10
03804 #define PCI_SUBCLASS_WIRELESS_OTHER         0x80
03805 
03806 #define PCI_SUBCLASS_INTIO_I2O              0x00
03807 
03808 #define PCI_SUBCLASS_SAT_TV                 0x01
03809 #define PCI_SUBCLASS_SAT_AUDIO              0x02
03810 #define PCI_SUBCLASS_SAT_VOICE              0x03
03811 #define PCI_SUBCLASS_SAT_DATA               0x04
03812 
03813 #define PCI_SUBCLASS_CRYPTO_NET_COMP        0x00
03814 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT   0x10
03815 #define PCI_SUBCLASS_CRYPTO_OTHER           0x80
03816 
03817 #define PCI_SUBCLASS_DASP_DPIO              0x00
03818 #define PCI_SUBCLASS_DASP_OTHER             0x80
03819 
03820 #define PCI_ADDRESS_IO_SPACE                0x00000001
03821 #define PCI_ADDRESS_MEMORY_TYPE_MASK        0x00000006
03822 #define PCI_ADDRESS_MEMORY_PREFETCHABLE     0x00000008
03823 #define PCI_ADDRESS_IO_ADDRESS_MASK         0xfffffffc
03824 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK     0xfffffff0
03825 #define PCI_ADDRESS_ROM_ADDRESS_MASK        0xfffff800
03826 
03827 #define PCI_TYPE_32BIT                      0
03828 #define PCI_TYPE_20BIT                      2
03829 #define PCI_TYPE_64BIT                      4
03830 
03831 #define PCI_ROMADDRESS_ENABLED              0x00000001
03832 
03833 #endif /* _PCI_X_ */
03834 
03835 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION       1
03836 
03837 _IRQL_requires_max_(PASSIVE_LEVEL)
03838 _Must_inspect_result_
03839 typedef NTSTATUS
03840 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
03841   _Inout_ PVOID Context);
03842 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
03843 
03844 _IRQL_requires_max_(PASSIVE_LEVEL)
03845 _Must_inspect_result_
03846 typedef NTSTATUS
03847 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
03848   _Inout_ PVOID Context);
03849 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
03850 
03851 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
03852   USHORT Size;
03853   USHORT Version;
03854   PVOID Context;
03855   PINTERFACE_REFERENCE InterfaceReference;
03856   PINTERFACE_DEREFERENCE InterfaceDereference;
03857   PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
03858   PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
03859 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
03860 
03861 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION            1
03862 
03863 typedef ULONG
03864 (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
03865   _In_ PVOID Context,
03866   _Out_writes_bytes_(Length) PVOID Buffer,
03867   _In_ ULONG Offset,
03868   _In_ ULONG Length);
03869 
03870 typedef ULONG
03871 (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
03872   _In_ PVOID Context,
03873   _In_reads_bytes_(Length) PVOID Buffer,
03874   _In_ ULONG Offset,
03875   _In_ ULONG Length);
03876 
03877 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
03878   USHORT Size;
03879   USHORT Version;
03880   PVOID Context;
03881   PINTERFACE_REFERENCE InterfaceReference;
03882   PINTERFACE_DEREFERENCE InterfaceDereference;
03883   PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
03884   PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
03885 } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
03886 
03887 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION            1
03888 
03889 _Must_inspect_result_
03890 typedef NTSTATUS
03891 (NTAPI PCI_MSIX_SET_ENTRY)(
03892   _In_ PVOID Context,
03893   _In_ ULONG TableEntry,
03894   _In_ ULONG MessageNumber);
03895 typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
03896 
03897 _Must_inspect_result_
03898 typedef NTSTATUS
03899 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
03900   _In_ PVOID Context,
03901   _In_ ULONG TableEntry);
03902 typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
03903 
03904 _Must_inspect_result_
03905 typedef NTSTATUS
03906 (NTAPI PCI_MSIX_GET_ENTRY)(
03907   _In_ PVOID Context,
03908   _In_ ULONG TableEntry,
03909   _Out_ PULONG MessageNumber,
03910   _Out_ PBOOLEAN Masked);
03911 typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
03912 
03913 _Must_inspect_result_
03914 typedef NTSTATUS
03915 (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
03916   _In_ PVOID Context,
03917   _Out_ PULONG TableSize);
03918 typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
03919 
03920 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
03921   USHORT Size;
03922   USHORT Version;
03923   PVOID Context;
03924   PINTERFACE_REFERENCE InterfaceReference;
03925   PINTERFACE_DEREFERENCE InterfaceDereference;
03926   PPCI_MSIX_SET_ENTRY SetTableEntry;
03927   PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
03928   PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
03929   PPCI_MSIX_GET_ENTRY GetTableEntry;
03930   PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
03931 } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
03932 
03933 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
03934         RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
03935 
03936 $endif (_WDMDDK_)
03937 $if (_NTDDK_)
03938 #ifndef _ARC_DDK_
03939 #define _ARC_DDK_
03940 typedef enum _CONFIGURATION_TYPE {
03941   ArcSystem,
03942   CentralProcessor,
03943   FloatingPointProcessor,
03944   PrimaryIcache,
03945   PrimaryDcache,
03946   SecondaryIcache,
03947   SecondaryDcache,
03948   SecondaryCache,
03949   EisaAdapter,
03950   TcAdapter,
03951   ScsiAdapter,
03952   DtiAdapter,
03953   MultiFunctionAdapter,
03954   DiskController,
03955   TapeController,
03956   CdromController,
03957   WormController,
03958   SerialController,
03959   NetworkController,
03960   DisplayController,
03961   ParallelController,
03962   PointerController,
03963   KeyboardController,
03964   AudioController,
03965   OtherController,
03966   DiskPeripheral,
03967   FloppyDiskPeripheral,
03968   TapePeripheral,
03969   ModemPeripheral,
03970   MonitorPeripheral,
03971   PrinterPeripheral,
03972   PointerPeripheral,
03973   KeyboardPeripheral,
03974   TerminalPeripheral,
03975   OtherPeripheral,
03976   LinePeripheral,
03977   NetworkPeripheral,
03978   SystemMemory,
03979   DockingInformation,
03980   RealModeIrqRoutingTable,
03981   RealModePCIEnumeration,
03982   MaximumType
03983 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
03984 #endif /* !_ARC_DDK_ */
03985 
03986 /*
03987 ** IRP function codes
03988 */
03989 
03990 #define IRP_MN_QUERY_DIRECTORY            0x01
03991 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY    0x02
03992 
03993 #define IRP_MN_USER_FS_REQUEST            0x00
03994 #define IRP_MN_MOUNT_VOLUME               0x01
03995 #define IRP_MN_VERIFY_VOLUME              0x02
03996 #define IRP_MN_LOAD_FILE_SYSTEM           0x03
03997 #define IRP_MN_TRACK_LINK                 0x04
03998 #define IRP_MN_KERNEL_CALL                0x04
03999 
04000 #define IRP_MN_LOCK                       0x01
04001 #define IRP_MN_UNLOCK_SINGLE              0x02
04002 #define IRP_MN_UNLOCK_ALL                 0x03
04003 #define IRP_MN_UNLOCK_ALL_BY_KEY          0x04
04004 
04005 #define IRP_MN_FLUSH_AND_PURGE          0x01
04006 
04007 #define IRP_MN_NORMAL                     0x00
04008 #define IRP_MN_DPC                        0x01
04009 #define IRP_MN_MDL                        0x02
04010 #define IRP_MN_COMPLETE                   0x04
04011 #define IRP_MN_COMPRESSED                 0x08
04012 
04013 #define IRP_MN_MDL_DPC                    (IRP_MN_MDL | IRP_MN_DPC)
04014 #define IRP_MN_COMPLETE_MDL               (IRP_MN_COMPLETE | IRP_MN_MDL)
04015 #define IRP_MN_COMPLETE_MDL_DPC           (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
04016 
04017 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
04018 
04019 #define IO_CHECK_CREATE_PARAMETERS      0x0200
04020 #define IO_ATTACH_DEVICE                0x0400
04021 #define IO_IGNORE_SHARE_ACCESS_CHECK    0x0800
04022 
04023 typedef NTSTATUS
04024 (NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
04025   _In_ PVOID Context,
04026   _In_ PUNICODE_STRING PathName,
04027   _In_ INTERFACE_TYPE BusType,
04028   _In_ ULONG BusNumber,
04029   _In_ PKEY_VALUE_FULL_INFORMATION *BusInformation,
04030   _In_ CONFIGURATION_TYPE ControllerType,
04031   _In_ ULONG ControllerNumber,
04032   _In_ PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
04033   _In_ CONFIGURATION_TYPE PeripheralType,
04034   _In_ ULONG PeripheralNumber,
04035   _In_ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
04036 
04037 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
04038   IoQueryDeviceIdentifier = 0,
04039   IoQueryDeviceConfigurationData,
04040   IoQueryDeviceComponentInformation,
04041   IoQueryDeviceMaxData
04042 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
04043 
04044 typedef VOID
04045 (NTAPI *PDRIVER_REINITIALIZE)(
04046   _In_ struct _DRIVER_OBJECT *DriverObject,
04047   _In_opt_ PVOID Context,
04048   _In_ ULONG Count);
04049 
04050 typedef struct _CONTROLLER_OBJECT {
04051   CSHORT Type;
04052   CSHORT Size;
04053   PVOID ControllerExtension;
04054   KDEVICE_QUEUE DeviceWaitQueue;
04055   ULONG Spare1;
04056   LARGE_INTEGER Spare2;
04057 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
04058 
04059 #define DRVO_REINIT_REGISTERED          0x00000008
04060 #define DRVO_INITIALIZED                0x00000010
04061 #define DRVO_BOOTREINIT_REGISTERED      0x00000020
04062 #define DRVO_LEGACY_RESOURCES           0x00000040
04063 
04064 typedef struct _CONFIGURATION_INFORMATION {
04065   ULONG DiskCount;
04066   ULONG FloppyCount;
04067   ULONG CdRomCount;
04068   ULONG TapeCount;
04069   ULONG ScsiPortCount;
04070   ULONG SerialCount;
04071   ULONG ParallelCount;
04072   BOOLEAN AtDiskPrimaryAddressClaimed;
04073   BOOLEAN AtDiskSecondaryAddressClaimed;
04074   ULONG Version;
04075   ULONG MediumChangerCount;
04076 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
04077 
04078 typedef struct _DISK_SIGNATURE {
04079   ULONG PartitionStyle;
04080   _ANONYMOUS_UNION union {
04081     struct {
04082       ULONG Signature;
04083       ULONG CheckSum;
04084     } Mbr;
04085     struct {
04086       GUID DiskId;
04087     } Gpt;
04088   } DUMMYUNIONNAME;
04089 } DISK_SIGNATURE, *PDISK_SIGNATURE;
04090 
04091 typedef struct _TXN_PARAMETER_BLOCK {
04092   USHORT Length;
04093   USHORT TxFsContext;
04094   PVOID TransactionObject;
04095 } TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK;
04096 
04097 #define TXF_MINIVERSION_DEFAULT_VIEW        (0xFFFE)
04098 
04099 typedef struct _IO_DRIVER_CREATE_CONTEXT {
04100   CSHORT Size;
04101   struct _ECP_LIST *ExtraCreateParameter;
04102   PVOID DeviceObjectHint;
04103   PTXN_PARAMETER_BLOCK TxnParameters;
04104 } IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT;
04105 
04106 typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD {
04107   USHORT Size;
04108   USHORT Version;
04109   PVOID Context;
04110   PINTERFACE_REFERENCE InterfaceReference;
04111   PINTERFACE_DEREFERENCE InterfaceDereference;
04112   PGET_SET_DEVICE_DATA SetBusData;
04113   PGET_SET_DEVICE_DATA GetBusData;
04114   UCHAR CapabilityID;
04115 } AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD;
04116 
04117 _IRQL_requires_max_(PASSIVE_LEVEL)
04118 _Must_inspect_result_
04119 typedef NTSTATUS
04120 (NTAPI *PGET_LOCATION_STRING)(
04121   _Inout_opt_ PVOID Context,
04122   _Outptr_
04123   _At_(*LocationStrings,
04124     _When_(return == 0, __drv_allocatesMem(Mem)))
04125     PZZWSTR *LocationStrings);
04126 
04127 typedef struct _PNP_LOCATION_INTERFACE {
04128   USHORT Size;
04129   USHORT Version;
04130   PVOID Context;
04131   PINTERFACE_REFERENCE InterfaceReference;
04132   PINTERFACE_DEREFERENCE InterfaceDereference;
04133   PGET_LOCATION_STRING GetLocationString;
04134 } PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE;
04135 
04136 typedef enum _ARBITER_ACTION {
04137   ArbiterActionTestAllocation,
04138   ArbiterActionRetestAllocation,
04139   ArbiterActionCommitAllocation,
04140   ArbiterActionRollbackAllocation,
04141   ArbiterActionQueryAllocatedResources,
04142   ArbiterActionWriteReservedResources,
04143   ArbiterActionQueryConflict,
04144   ArbiterActionQueryArbitrate,
04145   ArbiterActionAddReserved,
04146   ArbiterActionBootAllocation
04147 } ARBITER_ACTION, *PARBITER_ACTION;
04148 
04149 typedef struct _ARBITER_CONFLICT_INFO {
04150   PDEVICE_OBJECT OwningObject;
04151   ULONGLONG Start;
04152   ULONGLONG End;
04153 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
04154 
04155 typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS {
04156   _Inout_ PLIST_ENTRY ArbitrationList;
04157   _In_ ULONG AllocateFromCount;
04158   _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
04159 } ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS;
04160 
04161 typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS {
04162   _Inout_ PLIST_ENTRY ArbitrationList;
04163   _In_ ULONG AllocateFromCount;
04164   _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
04165 } ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS;
04166 
04167 typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS {
04168   _Inout_ PLIST_ENTRY ArbitrationList;
04169 } ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS;
04170 
04171 typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS {
04172   _Out_ PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
04173 } ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS;
04174 
04175 typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS {
04176   _In_ PDEVICE_OBJECT PhysicalDeviceObject;
04177   _In_ PIO_RESOURCE_DESCRIPTOR ConflictingResource;
04178   _Out_ PULONG ConflictCount;
04179   _Out_ PARBITER_CONFLICT_INFO *Conflicts;
04180 } ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS;
04181 
04182 typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS {
04183   _In_ PLIST_ENTRY ArbitrationList;
04184 } ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS;
04185 
04186 typedef struct _ARBITER_ADD_RESERVED_PARAMETERS {
04187   _In_ PDEVICE_OBJECT ReserveDevice;
04188 } ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS;
04189 
04190 typedef struct _ARBITER_PARAMETERS {
04191   union {
04192     ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation;
04193     ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation;
04194     ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation;
04195     ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources;
04196     ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict;
04197     ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate;
04198     ARBITER_ADD_RESERVED_PARAMETERS AddReserved;
04199   } Parameters;
04200 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
04201 
04202 typedef enum _ARBITER_REQUEST_SOURCE {
04203   ArbiterRequestUndefined = -1,
04204   ArbiterRequestLegacyReported,
04205   ArbiterRequestHalReported,
04206   ArbiterRequestLegacyAssigned,
04207   ArbiterRequestPnpDetected,
04208   ArbiterRequestPnpEnumerated
04209 } ARBITER_REQUEST_SOURCE;
04210 
04211 typedef enum _ARBITER_RESULT {
04212   ArbiterResultUndefined = -1,
04213   ArbiterResultSuccess,
04214   ArbiterResultExternalConflict,
04215   ArbiterResultNullRequest
04216 } ARBITER_RESULT;
04217 
04218 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
04219 
04220 typedef struct _ARBITER_LIST_ENTRY {
04221   LIST_ENTRY ListEntry;
04222   ULONG AlternativeCount;
04223   PIO_RESOURCE_DESCRIPTOR Alternatives;
04224   PDEVICE_OBJECT PhysicalDeviceObject;
04225   ARBITER_REQUEST_SOURCE RequestSource;
04226   ULONG Flags;
04227   LONG_PTR WorkSpace;
04228   INTERFACE_TYPE InterfaceType;
04229   ULONG SlotNumber;
04230   ULONG BusNumber;
04231   PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
04232   PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
04233   ARBITER_RESULT Result;
04234 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
04235 
04236 typedef NTSTATUS
04237 (NTAPI *PARBITER_HANDLER)(
04238   _Inout_opt_ PVOID Context,
04239   _In_ ARBITER_ACTION Action,
04240   _Inout_ PARBITER_PARAMETERS Parameters);
04241 
04242 #define ARBITER_PARTIAL 0x00000001
04243 
04244 typedef struct _ARBITER_INTERFACE {
04245   USHORT Size;
04246   USHORT Version;
04247   PVOID Context;
04248   PINTERFACE_REFERENCE InterfaceReference;
04249   PINTERFACE_DEREFERENCE InterfaceDereference;
04250   PARBITER_HANDLER ArbiterHandler;
04251   ULONG Flags;
04252 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
04253 
04254 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
04255   TranslateChildToParent,
04256   TranslateParentToChild
04257 } RESOURCE_TRANSLATION_DIRECTION;
04258 
04259 typedef NTSTATUS
04260 (NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
04261   _Inout_opt_ PVOID Context,
04262   _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
04263   _In_ RESOURCE_TRANSLATION_DIRECTION Direction,
04264   _In_opt_ ULONG AlternativesCount,
04265   _In_reads_opt_(AlternativesCount) IO_RESOURCE_DESCRIPTOR Alternatives[],
04266   _In_ PDEVICE_OBJECT PhysicalDeviceObject,
04267   _Out_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
04268 
04269 typedef NTSTATUS
04270 (NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
04271   _Inout_opt_ PVOID Context,
04272   _In_ PIO_RESOURCE_DESCRIPTOR Source,
04273   _In_ PDEVICE_OBJECT PhysicalDeviceObject,
04274   _Out_ PULONG TargetCount,
04275   _Out_writes_(*TargetCount) PIO_RESOURCE_DESCRIPTOR *Target);
04276 
04277 typedef struct _TRANSLATOR_INTERFACE {
04278   USHORT Size;
04279   USHORT Version;
04280   PVOID Context;
04281   PINTERFACE_REFERENCE InterfaceReference;
04282   PINTERFACE_DEREFERENCE InterfaceDereference;
04283   PTRANSLATE_RESOURCE_HANDLER TranslateResources;
04284   PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
04285 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
04286 
04287 typedef struct _PCI_AGP_CAPABILITY {
04288   PCI_CAPABILITIES_HEADER Header;
04289   USHORT Minor:4;
04290   USHORT Major:4;
04291   USHORT Rsvd1:8;
04292   struct _PCI_AGP_STATUS {
04293     ULONG Rate:3;
04294     ULONG Agp3Mode:1;
04295     ULONG FastWrite:1;
04296     ULONG FourGB:1;
04297     ULONG HostTransDisable:1;
04298     ULONG Gart64:1;
04299     ULONG ITA_Coherent:1;
04300     ULONG SideBandAddressing:1;
04301     ULONG CalibrationCycle:3;
04302     ULONG AsyncRequestSize:3;
04303     ULONG Rsvd1:1;
04304     ULONG Isoch:1;
04305     ULONG Rsvd2:6;
04306     ULONG RequestQueueDepthMaximum:8;
04307   } AGPStatus;
04308   struct _PCI_AGP_COMMAND {
04309     ULONG Rate:3;
04310     ULONG Rsvd1:1;
04311     ULONG FastWriteEnable:1;
04312     ULONG FourGBEnable:1;
04313     ULONG Rsvd2:1;
04314     ULONG Gart64:1;
04315     ULONG AGPEnable:1;
04316     ULONG SBAEnable:1;
04317     ULONG CalibrationCycle:3;
04318     ULONG AsyncReqSize:3;
04319     ULONG Rsvd3:8;
04320     ULONG RequestQueueDepth:8;
04321   } AGPCommand;
04322 } PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY;
04323 
04324 typedef enum _EXTENDED_AGP_REGISTER {
04325   IsochStatus,
04326   AgpControl,
04327   ApertureSize,
04328   AperturePageSize,
04329   GartLow,
04330   GartHigh,
04331   IsochCommand
04332 } EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER;
04333 
04334 typedef struct _PCI_AGP_ISOCH_STATUS {
04335   ULONG ErrorCode:2;
04336   ULONG Rsvd1:1;
04337   ULONG Isoch_L:3;
04338   ULONG Isoch_Y:2;
04339   ULONG Isoch_N:8;
04340   ULONG Rsvd2:16;
04341 } PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS;
04342 
04343 typedef struct _PCI_AGP_CONTROL {
04344   ULONG Rsvd1:7;
04345   ULONG GTLB_Enable:1;
04346   ULONG AP_Enable:1;
04347   ULONG CAL_Disable:1;
04348   ULONG Rsvd2:22;
04349 } PCI_AGP_CONTROL, *PPCI_AGP_CONTROL;
04350 
04351 typedef struct _PCI_AGP_APERTURE_PAGE_SIZE {
04352   USHORT PageSizeMask:11;
04353   USHORT Rsvd1:1;
04354   USHORT PageSizeSelect:4;
04355 } PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE;
04356 
04357 typedef struct _PCI_AGP_ISOCH_COMMAND {
04358   USHORT Rsvd1:6;
04359   USHORT Isoch_Y:2;
04360   USHORT Isoch_N:8;
04361 } PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND;
04362 
04363 typedef struct PCI_AGP_EXTENDED_CAPABILITY {
04364   PCI_AGP_ISOCH_STATUS IsochStatus;
04365   PCI_AGP_CONTROL AgpControl;
04366   USHORT ApertureSize;
04367   PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize;
04368   ULONG GartLow;
04369   ULONG GartHigh;
04370   PCI_AGP_ISOCH_COMMAND IsochCommand;
04371 } PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY;
04372 
04373 #define PCI_AGP_RATE_1X     0x1
04374 #define PCI_AGP_RATE_2X     0x2
04375 #define PCI_AGP_RATE_4X     0x4
04376 
04377 #define PCIX_MODE_CONVENTIONAL_PCI  0x0
04378 #define PCIX_MODE1_66MHZ            0x1
04379 #define PCIX_MODE1_100MHZ           0x2
04380 #define PCIX_MODE1_133MHZ           0x3
04381 #define PCIX_MODE2_266_66MHZ        0x9
04382 #define PCIX_MODE2_266_100MHZ       0xA
04383 #define PCIX_MODE2_266_133MHZ       0xB
04384 #define PCIX_MODE2_533_66MHZ        0xD
04385 #define PCIX_MODE2_533_100MHZ       0xE
04386 #define PCIX_MODE2_533_133MHZ       0xF
04387 
04388 #define PCIX_VERSION_MODE1_ONLY     0x0
04389 #define PCIX_VERSION_MODE2_ECC      0x1
04390 #define PCIX_VERSION_DUAL_MODE_ECC  0x2
04391 
04392 typedef struct _PCIX_BRIDGE_CAPABILITY {
04393   PCI_CAPABILITIES_HEADER Header;
04394   union {
04395     _ANONYMOUS_STRUCT struct {
04396       USHORT Bus64Bit:1;
04397       USHORT Bus133MHzCapable:1;
04398       USHORT SplitCompletionDiscarded:1;
04399       USHORT UnexpectedSplitCompletion:1;
04400       USHORT SplitCompletionOverrun:1;
04401       USHORT SplitRequestDelayed:1;
04402       USHORT BusModeFrequency:4;
04403       USHORT Rsvd:2;
04404       USHORT Version:2;
04405       USHORT Bus266MHzCapable:1;
04406       USHORT Bus533MHzCapable:1;
04407     } DUMMYSTRUCTNAME;
04408   USHORT AsUSHORT;
04409   } SecondaryStatus;
04410   union {
04411     _ANONYMOUS_STRUCT struct {
04412       ULONG FunctionNumber:3;
04413       ULONG DeviceNumber:5;
04414       ULONG BusNumber:8;
04415       ULONG Device64Bit:1;
04416       ULONG Device133MHzCapable:1;
04417       ULONG SplitCompletionDiscarded:1;
04418       ULONG UnexpectedSplitCompletion:1;
04419       ULONG SplitCompletionOverrun:1;
04420       ULONG SplitRequestDelayed:1;
04421       ULONG Rsvd:7;
04422       ULONG DIMCapable:1;
04423       ULONG Device266MHzCapable:1;
04424       ULONG Device533MHzCapable:1;
04425     } DUMMYSTRUCTNAME;
04426     ULONG AsULONG;
04427   } BridgeStatus;
04428   USHORT UpstreamSplitTransactionCapacity;
04429   USHORT UpstreamSplitTransactionLimit;
04430   USHORT DownstreamSplitTransactionCapacity;
04431   USHORT DownstreamSplitTransactionLimit;
04432   union {
04433     _ANONYMOUS_STRUCT struct {
04434       ULONG SelectSecondaryRegisters:1;
04435       ULONG ErrorPresentInOtherBank:1;
04436       ULONG AdditionalCorrectableError:1;
04437       ULONG AdditionalUncorrectableError:1;
04438       ULONG ErrorPhase:3;
04439       ULONG ErrorCorrected:1;
04440       ULONG Syndrome:8;
04441       ULONG ErrorFirstCommand:4;
04442       ULONG ErrorSecondCommand:4;
04443       ULONG ErrorUpperAttributes:4;
04444       ULONG ControlUpdateEnable:1;
04445       ULONG Rsvd:1;
04446       ULONG DisableSingleBitCorrection:1;
04447       ULONG EccMode:1;
04448     } DUMMYSTRUCTNAME;
04449   ULONG AsULONG;
04450   } EccControlStatus;
04451   ULONG EccFirstAddress;
04452   ULONG EccSecondAddress;
04453   ULONG EccAttribute;
04454 } PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY;
04455 
04456 typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY {
04457   PCI_CAPABILITIES_HEADER Header;
04458   USHORT Reserved;
04459   USHORT SubVendorID;
04460   USHORT SubSystemID;
04461 } PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY;
04462 
04463 #define OSC_FIRMWARE_FAILURE                            0x02
04464 #define OSC_UNRECOGNIZED_UUID                           0x04
04465 #define OSC_UNRECOGNIZED_REVISION                       0x08
04466 #define OSC_CAPABILITIES_MASKED                         0x10
04467 
04468 #define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION     0x01
04469 
04470 typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
04471   union {
04472     _ANONYMOUS_STRUCT struct {
04473       ULONG ExtendedConfigOpRegions:1;
04474       ULONG ActiveStatePowerManagement:1;
04475       ULONG ClockPowerManagement:1;
04476       ULONG SegmentGroups:1;
04477       ULONG MessageSignaledInterrupts:1;
04478       ULONG WindowsHardwareErrorArchitecture:1;
04479       ULONG Reserved:26;
04480     } DUMMYSTRUCTNAME;
04481     ULONG AsULONG;
04482   } u;
04483 } PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD;
04484 
04485 typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD {
04486   union {
04487     _ANONYMOUS_STRUCT struct {
04488       ULONG ExpressNativeHotPlug:1;
04489       ULONG ShpcNativeHotPlug:1;
04490       ULONG ExpressNativePME:1;
04491       ULONG ExpressAdvancedErrorReporting:1;
04492       ULONG ExpressCapabilityStructure:1;
04493       ULONG Reserved:27;
04494     } DUMMYSTRUCTNAME;
04495   ULONG AsULONG;
04496   } u;
04497 } PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD;
04498 
04499 typedef enum _PCI_HARDWARE_INTERFACE {
04500   PciConventional,
04501   PciXMode1,
04502   PciXMode2,
04503   PciExpress
04504 } PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE;
04505 
04506 typedef enum {
04507   BusWidth32Bits,
04508   BusWidth64Bits
04509 } PCI_BUS_WIDTH;
04510 
04511 typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
04512   PCI_HARDWARE_INTERFACE SecondaryInterface;
04513   _ANONYMOUS_STRUCT struct {
04514     BOOLEAN BusCapabilitiesFound;
04515     ULONG CurrentSpeedAndMode;
04516     ULONG SupportedSpeedsAndModes;
04517     BOOLEAN DeviceIDMessagingCapable;
04518     PCI_BUS_WIDTH SecondaryBusWidth;
04519   } DUMMYSTRUCTNAME;
04520   PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport;
04521   PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest;
04522   PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted;
04523 } PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY;
04524 
04525 typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
04526   _ANONYMOUS_STRUCT struct {
04527     USHORT CapabilityVersion:4;
04528     USHORT DeviceType:4;
04529     USHORT SlotImplemented:1;
04530     USHORT InterruptMessageNumber:5;
04531     USHORT Rsvd:2;
04532   } DUMMYSTRUCTNAME;
04533   USHORT AsUSHORT;
04534 } PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER;
04535 
04536 typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
04537   _ANONYMOUS_STRUCT struct {
04538     ULONG MaxPayloadSizeSupported:3;
04539     ULONG PhantomFunctionsSupported:2;
04540     ULONG ExtendedTagSupported:1;
04541     ULONG L0sAcceptableLatency:3;
04542     ULONG L1AcceptableLatency:3;
04543     ULONG Undefined:3;
04544     ULONG RoleBasedErrorReporting:1;
04545     ULONG Rsvd1:2;
04546     ULONG CapturedSlotPowerLimit:8;
04547     ULONG CapturedSlotPowerLimitScale:2;
04548     ULONG Rsvd2:4;
04549   } DUMMYSTRUCTNAME;
04550   ULONG AsULONG;
04551 } PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER;
04552 
04553 #define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07;
04554 
04555 typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
04556   _ANONYMOUS_STRUCT struct {
04557     USHORT CorrectableErrorEnable:1;
04558     USHORT NonFatalErrorEnable:1;
04559     USHORT FatalErrorEnable:1;
04560     USHORT UnsupportedRequestErrorEnable:1;
04561     USHORT EnableRelaxedOrder:1;
04562     USHORT MaxPayloadSize:3;
04563     USHORT ExtendedTagEnable:1;
04564     USHORT PhantomFunctionsEnable:1;
04565     USHORT AuxPowerEnable:1;
04566     USHORT NoSnoopEnable:1;
04567     USHORT MaxReadRequestSize:3;
04568     USHORT BridgeConfigRetryEnable:1;
04569   } DUMMYSTRUCTNAME;
04570   USHORT AsUSHORT;
04571 } PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER;
04572 
04573 #define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F;
04574 
04575 typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
04576   _ANONYMOUS_STRUCT struct {
04577     USHORT CorrectableErrorDetected:1;
04578     USHORT NonFatalErrorDetected:1;
04579     USHORT FatalErrorDetected:1;
04580     USHORT UnsupportedRequestDetected:1;
04581     USHORT AuxPowerDetected:1;
04582     USHORT TransactionsPending:1;
04583     USHORT Rsvd:10;
04584   } DUMMYSTRUCTNAME;
04585   USHORT AsUSHORT;
04586 } PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER;
04587 
04588 typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
04589   _ANONYMOUS_STRUCT struct {
04590     ULONG MaximumLinkSpeed:4;
04591     ULONG MaximumLinkWidth:6;
04592     ULONG ActiveStatePMSupport:2;
04593     ULONG L0sExitLatency:3;
04594     ULONG L1ExitLatency:3;
04595     ULONG ClockPowerManagement:1;
04596     ULONG SurpriseDownErrorReportingCapable:1;
04597     ULONG DataLinkLayerActiveReportingCapable:1;
04598     ULONG Rsvd:3;
04599     ULONG PortNumber:8;
04600   } DUMMYSTRUCTNAME;
04601   ULONG AsULONG;
04602 } PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER;
04603 
04604 typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
04605   _ANONYMOUS_STRUCT struct {
04606     USHORT ActiveStatePMControl:2;
04607     USHORT Rsvd1:1;
04608     USHORT ReadCompletionBoundary:1;
04609     USHORT LinkDisable:1;
04610     USHORT RetrainLink:1;
04611     USHORT CommonClockConfig:1;
04612     USHORT ExtendedSynch:1;
04613     USHORT EnableClockPowerManagement:1;
04614     USHORT Rsvd2:7;
04615   } DUMMYSTRUCTNAME;
04616   USHORT AsUSHORT;
04617 } PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER;
04618 
04619 typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
04620   _ANONYMOUS_STRUCT struct {
04621     USHORT LinkSpeed:4;
04622     USHORT LinkWidth:6;
04623     USHORT Undefined:1;
04624     USHORT LinkTraining:1;
04625     USHORT SlotClockConfig:1;
04626     USHORT DataLinkLayerActive:1;
04627     USHORT Rsvd:2;
04628   } DUMMYSTRUCTNAME;
04629   USHORT AsUSHORT;
04630 } PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER;
04631 
04632 typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
04633   _ANONYMOUS_STRUCT struct {
04634     ULONG AttentionButtonPresent:1;
04635     ULONG PowerControllerPresent:1;
04636     ULONG MRLSensorPresent:1;
04637     ULONG AttentionIndicatorPresent:1;
04638     ULONG PowerIndicatorPresent:1;
04639     ULONG HotPlugSurprise:1;
04640     ULONG HotPlugCapable:1;
04641     ULONG SlotPowerLimit:8;
04642     ULONG SlotPowerLimitScale:2;
04643     ULONG ElectromechanicalLockPresent:1;
04644     ULONG NoCommandCompletedSupport:1;
04645     ULONG PhysicalSlotNumber:13;
04646   } DUMMYSTRUCTNAME;
04647   ULONG AsULONG;
04648 } PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER;
04649 
04650 typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
04651   _ANONYMOUS_STRUCT struct {
04652     USHORT AttentionButtonEnable:1;
04653     USHORT PowerFaultDetectEnable:1;
04654     USHORT MRLSensorEnable:1;
04655     USHORT PresenceDetectEnable:1;
04656     USHORT CommandCompletedEnable:1;
04657     USHORT HotPlugInterruptEnable:1;
04658     USHORT AttentionIndicatorControl:2;
04659     USHORT PowerIndicatorControl:2;
04660     USHORT PowerControllerControl:1;
04661     USHORT ElectromechanicalLockControl:1;
04662     USHORT DataLinkStateChangeEnable:1;
04663     USHORT Rsvd:3;
04664   } DUMMYSTRUCTNAME;
04665   USHORT AsUSHORT;
04666 } PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER;
04667 
04668 typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER {
04669   _ANONYMOUS_STRUCT struct {
04670     USHORT AttentionButtonPressed:1;
04671     USHORT PowerFaultDetected:1;
04672     USHORT MRLSensorChanged:1;
04673     USHORT PresenceDetectChanged:1;
04674     USHORT CommandCompleted:1;
04675     USHORT MRLSensorState:1;
04676     USHORT PresenceDetectState:1;
04677     USHORT ElectromechanicalLockEngaged:1;
04678     USHORT DataLinkStateChanged:1;
04679     USHORT Rsvd:7;
04680   } DUMMYSTRUCTNAME;
04681   USHORT AsUSHORT;
04682 } PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER;
04683 
04684 typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER {
04685   _ANONYMOUS_STRUCT struct {
04686     USHORT CorrectableSerrEnable:1;
04687     USHORT NonFatalSerrEnable:1;
04688     USHORT FatalSerrEnable:1;
04689     USHORT PMEInterruptEnable:1;
04690     USHORT CRSSoftwareVisibilityEnable:1;
04691     USHORT Rsvd:11;
04692   } DUMMYSTRUCTNAME;
04693   USHORT AsUSHORT;
04694 } PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER;
04695 
04696 typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER {
04697   _ANONYMOUS_STRUCT struct {
04698     USHORT CRSSoftwareVisibility:1;
04699     USHORT Rsvd:15;
04700   } DUMMYSTRUCTNAME;
04701   USHORT AsUSHORT;
04702 } PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER;
04703 
04704 typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER {
04705   _ANONYMOUS_STRUCT struct {
04706     ULONG PMERequestorId:16;
04707     ULONG PMEStatus:1;
04708     ULONG PMEPending:1;
04709     ULONG Rsvd:14;
04710   } DUMMYSTRUCTNAME;
04711   ULONG AsULONG;
04712 } PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER;
04713 
04714 typedef struct _PCI_EXPRESS_CAPABILITY {
04715   PCI_CAPABILITIES_HEADER Header;
04716   PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities;
04717   PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities;
04718   PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl;
04719   PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus;
04720   PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities;
04721   PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl;
04722   PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus;
04723   PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities;
04724   PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl;
04725   PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus;
04726   PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl;
04727   PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities;
04728   PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus;
04729 } PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY;
04730 
04731 typedef enum {
04732   MRLClosed = 0,
04733   MRLOpen
04734 } PCI_EXPRESS_MRL_STATE;
04735 
04736 typedef enum {
04737   SlotEmpty = 0,
04738   CardPresent
04739 } PCI_EXPRESS_CARD_PRESENCE;
04740 
04741 typedef enum {
04742   IndicatorOn = 1,
04743   IndicatorBlink,
04744   IndicatorOff
04745 } PCI_EXPRESS_INDICATOR_STATE;
04746 
04747 typedef enum {
04748   PowerOn = 0,
04749   PowerOff
04750 } PCI_EXPRESS_POWER_STATE;
04751 
04752 typedef enum {
04753   L0sEntrySupport = 1,
04754   L0sAndL1EntrySupport = 3
04755 } PCI_EXPRESS_ASPM_SUPPORT;
04756 
04757 typedef enum {
04758   L0sAndL1EntryDisabled,
04759   L0sEntryEnabled,
04760   L1EntryEnabled,
04761   L0sAndL1EntryEnabled
04762 } PCI_EXPRESS_ASPM_CONTROL;
04763 
04764 typedef enum {
04765   L0s_Below64ns = 0,
04766   L0s_64ns_128ns,
04767   L0s_128ns_256ns,
04768   L0s_256ns_512ns,
04769   L0s_512ns_1us,
04770   L0s_1us_2us,
04771   L0s_2us_4us,
04772   L0s_Above4us
04773 } PCI_EXPRESS_L0s_EXIT_LATENCY;
04774 
04775 typedef enum {
04776   L1_Below1us = 0,
04777   L1_1us_2us,
04778   L1_2us_4us,
04779   L1_4us_8us,
04780   L1_8us_16us,
04781   L1_16us_32us,
04782   L1_32us_64us,
04783   L1_Above64us
04784 } PCI_EXPRESS_L1_EXIT_LATENCY;
04785 
04786 typedef enum {
04787   PciExpressEndpoint = 0,
04788   PciExpressLegacyEndpoint,
04789   PciExpressRootPort = 4,
04790   PciExpressUpstreamSwitchPort,
04791   PciExpressDownstreamSwitchPort,
04792   PciExpressToPciXBridge,
04793   PciXToExpressBridge,
04794   PciExpressRootComplexIntegratedEndpoint,
04795   PciExpressRootComplexEventCollector
04796 } PCI_EXPRESS_DEVICE_TYPE;
04797 
04798 typedef enum {
04799   MaxPayload128Bytes = 0,
04800   MaxPayload256Bytes,
04801   MaxPayload512Bytes,
04802   MaxPayload1024Bytes,
04803   MaxPayload2048Bytes,
04804   MaxPayload4096Bytes
04805 } PCI_EXPRESS_MAX_PAYLOAD_SIZE;
04806 
04807 typedef union _PCI_EXPRESS_PME_REQUESTOR_ID {
04808   _ANONYMOUS_STRUCT struct {
04809     USHORT FunctionNumber:3;
04810     USHORT DeviceNumber:5;
04811     USHORT BusNumber:8;
04812   } DUMMYSTRUCTNAME;
04813   USHORT AsUSHORT;
04814 } PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID;
04815 
04816 typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE {
04817   ResourceTypeSingle = 0,
04818   ResourceTypeRange,
04819   ResourceTypeExtendedCounterConfiguration,
04820   ResourceTypeOverflow,
04821   ResourceTypeMax
04822 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE;
04823 
04824 typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR {
04825   PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type;
04826   ULONG Flags;
04827   union {
04828     ULONG CounterIndex;
04829     ULONG ExtendedRegisterAddress;
04830     struct {
04831       ULONG Begin;
04832       ULONG End;
04833     } Range;
04834   } u;
04835 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR;
04836 
04837 typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST {
04838   ULONG Count;
04839   PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY];
04840 } PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST;
04841 
04842 typedef VOID
04843 (NTAPI *PciPin2Line)(
04844   _In_ struct _BUS_HANDLER *BusHandler,
04845   _In_ struct _BUS_HANDLER *RootHandler,
04846   _In_ PCI_SLOT_NUMBER SlotNumber,
04847   _In_ PPCI_COMMON_CONFIG PciData);
04848 
04849 typedef VOID
04850 (NTAPI *PciLine2Pin)(
04851   _In_ struct _BUS_HANDLER *BusHandler,
04852   _In_ struct _BUS_HANDLER *RootHandler,
04853   _In_ PCI_SLOT_NUMBER SlotNumber,
04854   _In_ PPCI_COMMON_CONFIG PciNewData,
04855   _In_ PPCI_COMMON_CONFIG PciOldData);
04856 
04857 typedef VOID
04858 (NTAPI *PciReadWriteConfig)(
04859   _In_ struct _BUS_HANDLER *BusHandler,
04860   _In_ PCI_SLOT_NUMBER Slot,
04861   _In_reads_bytes_(Length) PVOID Buffer,
04862   _In_ ULONG Offset,
04863   _In_ ULONG Length);
04864 
04865 #define PCI_DATA_TAG ' ICP'
04866 #define PCI_DATA_VERSION 1
04867 
04868 typedef struct _PCIBUSDATA {
04869   ULONG Tag;
04870   ULONG Version;
04871   PciReadWriteConfig ReadConfig;
04872   PciReadWriteConfig WriteConfig;
04873   PciPin2Line Pin2Line;
04874   PciLine2Pin Line2Pin;
04875   PCI_SLOT_NUMBER ParentSlot;
04876   PVOID Reserved[4];
04877 } PCIBUSDATA, *PPCIBUSDATA;
04878 
04879 #ifndef _PCIINTRF_X_
04880 #define _PCIINTRF_X_
04881 
04882 typedef ULONG
04883 (NTAPI *PCI_READ_WRITE_CONFIG)(
04884   _In_ PVOID Context,
04885   _In_ ULONG BusOffset,
04886   _In_ ULONG Slot,
04887   _In_reads_bytes_(Length) PVOID Buffer,
04888   _In_ ULONG Offset,
04889   _In_ ULONG Length);
04890 
04891 typedef VOID
04892 (NTAPI *PCI_PIN_TO_LINE)(
04893   _In_ PVOID Context,
04894   _In_ PPCI_COMMON_CONFIG PciData);
04895 
04896 typedef VOID
04897 (NTAPI *PCI_LINE_TO_PIN)(
04898   _In_ PVOID Context,
04899   _In_ PPCI_COMMON_CONFIG PciNewData,
04900   _In_ PPCI_COMMON_CONFIG PciOldData);
04901 
04902 typedef VOID
04903 (NTAPI *PCI_ROOT_BUS_CAPABILITY)(
04904   _In_ PVOID Context,
04905   _Out_ PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability);
04906 
04907 typedef VOID
04908 (NTAPI *PCI_EXPRESS_WAKE_CONTROL)(
04909   _In_ PVOID Context,
04910   _In_ BOOLEAN EnableWake);
04911 
04912 typedef struct _PCI_BUS_INTERFACE_STANDARD {
04913   USHORT Size;
04914   USHORT Version;
04915   PVOID Context;
04916   PINTERFACE_REFERENCE InterfaceReference;
04917   PINTERFACE_DEREFERENCE InterfaceDereference;
04918   PCI_READ_WRITE_CONFIG ReadConfig;
04919   PCI_READ_WRITE_CONFIG WriteConfig;
04920   PCI_PIN_TO_LINE PinToLine;
04921   PCI_LINE_TO_PIN LineToPin;
04922   PCI_ROOT_BUS_CAPABILITY RootBusCapability;
04923   PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl;
04924 } PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD;
04925 
04926 #define PCI_BUS_INTERFACE_STANDARD_VERSION 1
04927 
04928 #endif /* _PCIINTRF_X_ */
04929 
04930 #if (NTDDI_VERSION >= NTDDI_WIN7)
04931 
04932 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX     0x00004000
04933 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX    0x00008000
04934 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \
04935   (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \
04936    FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX)
04937 
04938 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200
04939 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300
04940 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300
04941 
04942 #else
04943 
04944 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL     0x00000200
04945 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL    0x00000300
04946 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK        0x00000300
04947 
04948 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL
04949 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL
04950 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK
04951 
04952 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
04953 
04954 #define FILE_CHARACTERISTICS_PROPAGATED (FILE_REMOVABLE_MEDIA  | \
04955                                          FILE_READ_ONLY_DEVICE | \
04956                                          FILE_FLOPPY_DISKETTE  | \
04957                                          FILE_WRITE_ONCE_MEDIA | \
04958                                          FILE_DEVICE_SECURE_OPEN)
04959 
04960 typedef struct _FILE_ALIGNMENT_INFORMATION {
04961   ULONG AlignmentRequirement;
04962 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
04963 
04964 typedef struct _FILE_NAME_INFORMATION {
04965   ULONG FileNameLength;
04966   WCHAR FileName[1];
04967 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
04968 
04969 
04970 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
04971   ULONG FileAttributes;
04972   ULONG ReparseTag;
04973 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
04974 
04975 typedef struct _FILE_DISPOSITION_INFORMATION {
04976   BOOLEAN DeleteFile;
04977 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
04978 
04979 typedef struct _FILE_END_OF_FILE_INFORMATION {
04980   LARGE_INTEGER EndOfFile;
04981 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
04982 
04983 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
04984   LARGE_INTEGER ValidDataLength;
04985 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
04986 
04987 typedef struct _FILE_FS_LABEL_INFORMATION {
04988   ULONG VolumeLabelLength;
04989   WCHAR VolumeLabel[1];
04990 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
04991 
04992 typedef struct _FILE_FS_VOLUME_INFORMATION {
04993   LARGE_INTEGER VolumeCreationTime;
04994   ULONG VolumeSerialNumber;
04995   ULONG VolumeLabelLength;
04996   BOOLEAN SupportsObjects;
04997   WCHAR VolumeLabel[1];
04998 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
04999 
05000 typedef struct _FILE_FS_SIZE_INFORMATION {
05001   LARGE_INTEGER TotalAllocationUnits;
05002   LARGE_INTEGER AvailableAllocationUnits;
05003   ULONG SectorsPerAllocationUnit;
05004   ULONG BytesPerSector;
05005 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
05006 
05007 typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
05008   LARGE_INTEGER TotalAllocationUnits;
05009   LARGE_INTEGER CallerAvailableAllocationUnits;
05010   LARGE_INTEGER ActualAvailableAllocationUnits;
05011   ULONG SectorsPerAllocationUnit;
05012   ULONG BytesPerSector;
05013 } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
05014 
05015 typedef struct _FILE_FS_OBJECTID_INFORMATION {
05016   UCHAR ObjectId[16];
05017   UCHAR ExtendedInfo[48];
05018 } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
05019 
05020 typedef union _FILE_SEGMENT_ELEMENT {
05021   PVOID64 Buffer;
05022   ULONGLONG Alignment;
05023 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
05024 
05025 #define IOCTL_AVIO_ALLOCATE_STREAM      CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
05026 #define IOCTL_AVIO_FREE_STREAM          CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
05027 #define IOCTL_AVIO_MODIFY_STREAM        CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
05028 
05029 typedef enum _BUS_DATA_TYPE {
05030   ConfigurationSpaceUndefined = -1,
05031   Cmos,
05032   EisaConfiguration,
05033   Pos,
05034   CbusConfiguration,
05035   PCIConfiguration,
05036   VMEConfiguration,
05037   NuBusConfiguration,
05038   PCMCIAConfiguration,
05039   MPIConfiguration,
05040   MPSAConfiguration,
05041   PNPISAConfiguration,
05042   SgiInternalConfiguration,
05043   MaximumBusDataType
05044 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
05045 
05046 /* Some Server 2003 DDK definitions */
05047 #define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
05048 
05049 typedef NTSTATUS
05050 (NTAPI *PLEGACY_DEVICE_DETECTION_HANDLER)(
05051   IN PVOID Context,
05052   IN INTERFACE_TYPE LegacyBusType,
05053   IN ULONG BusNumber,
05054   IN ULONG SlotNumber,
05055   OUT PDEVICE_OBJECT *PhysicalDeviceObject);
05056 
05057 typedef struct _ROUTING_TOKEN {
05058   PVOID LinkNode;
05059   ULONG StaticVector;
05060   UCHAR Flags;
05061 } ROUTING_TOKEN, *PROUTING_TOKEN;
05062 
05063 typedef NTSTATUS
05064 (NTAPI *PGET_INTERRUPT_ROUTING)(
05065   IN PDEVICE_OBJECT Pdo,
05066   OUT ULONG *Bus,
05067   OUT ULONG *PciSlot,
05068   OUT UCHAR *InterruptLine,
05069   OUT UCHAR *InterruptPin,
05070   OUT UCHAR *ClassCode,
05071   OUT UCHAR *SubClassCode,
05072   OUT PDEVICE_OBJECT *ParentPdo,
05073   OUT ROUTING_TOKEN *RoutingToken,
05074   OUT UCHAR *Flags);
05075 
05076 typedef NTSTATUS
05077 (NTAPI *PSET_INTERRUPT_ROUTING_TOKEN)(
05078   IN PDEVICE_OBJECT Pdo,
05079   IN PROUTING_TOKEN RoutingToken);
05080 
05081 typedef VOID
05082 (NTAPI *PUPDATE_INTERRUPT_LINE)(
05083   IN PDEVICE_OBJECT Pdo,
05084   IN UCHAR LineRegister);
05085 
05086 typedef struct _INT_ROUTE_INTERFACE_STANDARD {
05087   USHORT Size;
05088   USHORT Version;
05089   PVOID Context;
05090   PINTERFACE_REFERENCE InterfaceReference;
05091   PINTERFACE_DEREFERENCE InterfaceDereference;
05092   PGET_INTERRUPT_ROUTING GetInterruptRouting;
05093   PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
05094   PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
05095 } INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
05096 
05097 typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
05098   USHORT Size;
05099   USHORT Version;
05100   PVOID Context;
05101   PINTERFACE_REFERENCE InterfaceReference;
05102   PINTERFACE_DEREFERENCE InterfaceDereference;
05103   PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
05104 } LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
05105 
05106 /* FIXME : These definitions don't exist in public headers */
05107 
05108 #define PCI_CB_INTRF_VERSION             1
05109 #define PCI_PME_INTRF_STANDARD_VER       1
05110 #define PNP_LOCATION_INTERFACE_VERSION   1
05111 
05112 DEFINE_GUID(GUID_PCI_CARDBUS_INTERFACE_PRIVATE, 0xcca82f31, 0x54d6, 0x11d1, 0x82, 0x24, 0x00, 0xa0, 0xc9, 0x32, 0x43, 0x85);
05113 DEFINE_GUID(GUID_PCI_PME_INTERFACE, 0xaac7e6ac, 0xbb0b, 0x11d2, 0xb4, 0x84, 0x00, 0xc0, 0x4f, 0x72, 0xde, 0x8b);
05114 
05115 typedef NTSTATUS
05116 (NTAPI *PCARDBUSADD)(
05117   IN PDEVICE_OBJECT DeviceObject,
05118   IN OUT PVOID *DeviceContext);
05119 
05120 typedef NTSTATUS
05121 (NTAPI *PCARDBUSDELETE)(
05122   IN PVOID DeviceContext);
05123 
05124 typedef NTSTATUS
05125 (NTAPI *PCARDBUSPCIDISPATCH)(
05126   IN PVOID DeviceContext,
05127   IN PIRP Irp);
05128 
05129 typedef VOID
05130 (NTAPI *PPME_SET_PME_ENABLE)(
05131   IN PDEVICE_OBJECT Pdo,
05132   IN BOOLEAN PmeEnable);
05133 
05134 typedef VOID
05135 (NTAPI *PPME_CLEAR_PME_STATUS)(
05136   IN PDEVICE_OBJECT Pdo);
05137 
05138 typedef VOID
05139 (NTAPI *PPME_GET_INFORMATION)(
05140   IN PDEVICE_OBJECT Pdo,
05141   OUT PBOOLEAN PmeCapable,
05142   OUT PBOOLEAN PmeStatus,
05143   OUT PBOOLEAN PmeEnable);
05144 
05145 typedef struct _PCI_CARDBUS_INTERFACE_PRIVATE {
05146   USHORT Size;
05147   USHORT Version;
05148   PVOID Context;
05149   PINTERFACE_REFERENCE InterfaceReference;
05150   PINTERFACE_DEREFERENCE InterfaceDereference;
05151   PDRIVER_OBJECT DriverObject;
05152   PCARDBUSADD AddCardBus;
05153   PCARDBUSDELETE DeleteCardBus;
05154   PCARDBUSPCIDISPATCH DispatchPnp;
05155 } PCI_CARDBUS_INTERFACE_PRIVATE, *PPCI_CARDBUS_INTERFACE_PRIVATE;
05156 
05157 typedef struct _PCI_PME_INTERFACE {
05158   USHORT Size;
05159   USHORT Version;
05160   PVOID Context;
05161   PINTERFACE_REFERENCE InterfaceReference;
05162   PINTERFACE_DEREFERENCE InterfaceDereference;
05163   PPME_GET_INFORMATION GetPmeInformation;
05164   PPME_CLEAR_PME_STATUS ClearPmeStatus;
05165   PPME_SET_PME_ENABLE UpdateEnable;
05166 } PCI_PME_INTERFACE, *PPCI_PME_INTERFACE;
05167 
05168 $endif (_NTDDK_)
05169 $if (_NTIFS_)
05170 
05171 #define FILE_OPLOCK_BROKEN_TO_LEVEL_2   0x00000007
05172 #define FILE_OPLOCK_BROKEN_TO_NONE      0x00000008
05173 #define FILE_OPBATCH_BREAK_UNDERWAY     0x00000009
05174 
05175 /* also in winnt.h */
05176 #define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
05177 #define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
05178 #define FILE_NOTIFY_CHANGE_NAME         0x00000003
05179 #define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004
05180 #define FILE_NOTIFY_CHANGE_SIZE         0x00000008
05181 #define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010
05182 #define FILE_NOTIFY_CHANGE_LAST_ACCESS  0x00000020
05183 #define FILE_NOTIFY_CHANGE_CREATION     0x00000040
05184 #define FILE_NOTIFY_CHANGE_EA           0x00000080
05185 #define FILE_NOTIFY_CHANGE_SECURITY     0x00000100
05186 #define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200
05187 #define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400
05188 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
05189 #define FILE_NOTIFY_VALID_MASK          0x00000fff
05190 
05191 #define FILE_ACTION_ADDED                   0x00000001
05192 #define FILE_ACTION_REMOVED                 0x00000002
05193 #define FILE_ACTION_MODIFIED                0x00000003
05194 #define FILE_ACTION_RENAMED_OLD_NAME        0x00000004
05195 #define FILE_ACTION_RENAMED_NEW_NAME        0x00000005
05196 #define FILE_ACTION_ADDED_STREAM            0x00000006
05197 #define FILE_ACTION_REMOVED_STREAM          0x00000007
05198 #define FILE_ACTION_MODIFIED_STREAM         0x00000008
05199 #define FILE_ACTION_REMOVED_BY_DELETE       0x00000009
05200 #define FILE_ACTION_ID_NOT_TUNNELLED        0x0000000A
05201 #define FILE_ACTION_TUNNELLED_ID_COLLISION  0x0000000B
05202 /* end  winnt.h */
05203 
05204 #define FILE_PIPE_BYTE_STREAM_TYPE          0x00000000
05205 #define FILE_PIPE_MESSAGE_TYPE              0x00000001
05206 
05207 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS     0x00000000
05208 #define FILE_PIPE_REJECT_REMOTE_CLIENTS     0x00000002
05209 
05210 #define FILE_PIPE_ACCEPT_REMOTE_CLIENTS     0x00000000
05211 #define FILE_PIPE_REJECT_REMOTE_CLIENTS     0x00000002
05212 #define FILE_PIPE_TYPE_VALID_MASK           0x00000003
05213 
05214 #define FILE_PIPE_BYTE_STREAM_MODE          0x00000000
05215 #define FILE_PIPE_MESSAGE_MODE              0x00000001
05216 
05217 #define FILE_PIPE_QUEUE_OPERATION           0x00000000
05218 #define FILE_PIPE_COMPLETE_OPERATION        0x00000001
05219 
05220 #define FILE_PIPE_INBOUND                   0x00000000
05221 #define FILE_PIPE_OUTBOUND                  0x00000001
05222 #define FILE_PIPE_FULL_DUPLEX               0x00000002
05223 
05224 #define FILE_PIPE_DISCONNECTED_STATE        0x00000001
05225 #define FILE_PIPE_LISTENING_STATE           0x00000002
05226 #define FILE_PIPE_CONNECTED_STATE           0x00000003
05227 #define FILE_PIPE_CLOSING_STATE             0x00000004
05228 
05229 #define FILE_PIPE_CLIENT_END                0x00000000
05230 #define FILE_PIPE_SERVER_END                0x00000001
05231 
05232 #define FILE_CASE_SENSITIVE_SEARCH          0x00000001
05233 #define FILE_CASE_PRESERVED_NAMES           0x00000002
05234 #define FILE_UNICODE_ON_DISK                0x00000004
05235 #define FILE_PERSISTENT_ACLS                0x00000008
05236 #define FILE_FILE_COMPRESSION               0x00000010
05237 #define FILE_VOLUME_QUOTAS                  0x00000020
05238 #define FILE_SUPPORTS_SPARSE_FILES          0x00000040
05239 #define FILE_SUPPORTS_REPARSE_POINTS        0x00000080
05240 #define FILE_SUPPORTS_REMOTE_STORAGE        0x00000100
05241 #define FILE_VOLUME_IS_COMPRESSED           0x00008000
05242 #define FILE_SUPPORTS_OBJECT_IDS            0x00010000
05243 #define FILE_SUPPORTS_ENCRYPTION            0x00020000
05244 #define FILE_NAMED_STREAMS                  0x00040000
05245 #define FILE_READ_ONLY_VOLUME               0x00080000
05246 #define FILE_SEQUENTIAL_WRITE_ONCE          0x00100000
05247 #define FILE_SUPPORTS_TRANSACTIONS          0x00200000
05248 #define FILE_SUPPORTS_HARD_LINKS            0x00400000
05249 #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES   0x00800000
05250 #define FILE_SUPPORTS_OPEN_BY_FILE_ID       0x01000000
05251 #define FILE_SUPPORTS_USN_JOURNAL           0x02000000
05252 
05253 #define FILE_NEED_EA                    0x00000080
05254 
05255 #define FILE_EA_TYPE_BINARY             0xfffe
05256 #define FILE_EA_TYPE_ASCII              0xfffd
05257 #define FILE_EA_TYPE_BITMAP             0xfffb
05258 #define FILE_EA_TYPE_METAFILE           0xfffa
05259 #define FILE_EA_TYPE_ICON               0xfff9
05260 #define FILE_EA_TYPE_EA                 0xffee
05261 #define FILE_EA_TYPE_MVMT               0xffdf
05262 #define FILE_EA_TYPE_MVST               0xffde
05263 #define FILE_EA_TYPE_ASN1               0xffdd
05264 #define FILE_EA_TYPE_FAMILY_IDS         0xff01
05265 
05266 typedef struct _FILE_NOTIFY_INFORMATION {
05267   ULONG NextEntryOffset;
05268   ULONG Action;
05269   ULONG FileNameLength;
05270   WCHAR FileName[1];
05271 } FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
05272 
05273 typedef struct _FILE_DIRECTORY_INFORMATION {
05274   ULONG NextEntryOffset;
05275   ULONG FileIndex;
05276   LARGE_INTEGER CreationTime;
05277   LARGE_INTEGER LastAccessTime;
05278   LARGE_INTEGER LastWriteTime;
05279   LARGE_INTEGER ChangeTime;
05280   LARGE_INTEGER EndOfFile;
05281   LARGE_INTEGER AllocationSize;
05282   ULONG FileAttributes;
05283   ULONG FileNameLength;
05284   WCHAR FileName[1];
05285 } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
05286 
05287 typedef struct _FILE_FULL_DIR_INFORMATION {
05288   ULONG NextEntryOffset;
05289   ULONG FileIndex;
05290   LARGE_INTEGER CreationTime;
05291   LARGE_INTEGER LastAccessTime;
05292   LARGE_INTEGER LastWriteTime;
05293   LARGE_INTEGER ChangeTime;
05294   LARGE_INTEGER EndOfFile;
05295   LARGE_INTEGER AllocationSize;
05296   ULONG FileAttributes;
05297   ULONG FileNameLength;
05298   ULONG EaSize;
05299   WCHAR FileName[1];
05300 } FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
05301 
05302 typedef struct _FILE_ID_FULL_DIR_INFORMATION {
05303   ULONG NextEntryOffset;
05304   ULONG FileIndex;
05305   LARGE_INTEGER CreationTime;
05306   LARGE_INTEGER LastAccessTime;
05307   LARGE_INTEGER LastWriteTime;
05308   LARGE_INTEGER ChangeTime;
05309   LARGE_INTEGER EndOfFile;
05310   LARGE_INTEGER AllocationSize;
05311   ULONG FileAttributes;
05312   ULONG FileNameLength;
05313   ULONG EaSize;
05314   LARGE_INTEGER FileId;
05315   WCHAR FileName[1];
05316 } FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
05317 
05318 typedef struct _FILE_BOTH_DIR_INFORMATION {
05319   ULONG NextEntryOffset;
05320   ULONG FileIndex;
05321   LARGE_INTEGER CreationTime;
05322   LARGE_INTEGER LastAccessTime;
05323   LARGE_INTEGER LastWriteTime;
05324   LARGE_INTEGER ChangeTime;
05325   LARGE_INTEGER EndOfFile;
05326   LARGE_INTEGER AllocationSize;
05327   ULONG FileAttributes;
05328   ULONG FileNameLength;
05329   ULONG EaSize;
05330   CCHAR ShortNameLength;
05331   WCHAR ShortName[12];
05332   WCHAR FileName[1];
05333 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
05334 
05335 typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
05336   ULONG NextEntryOffset;
05337   ULONG FileIndex;
05338   LARGE_INTEGER CreationTime;
05339   LARGE_INTEGER LastAccessTime;
05340   LARGE_INTEGER LastWriteTime;
05341   LARGE_INTEGER ChangeTime;
05342   LARGE_INTEGER EndOfFile;
05343   LARGE_INTEGER AllocationSize;
05344   ULONG FileAttributes;
05345   ULONG FileNameLength;
05346   ULONG EaSize;
05347   CCHAR ShortNameLength;
05348   WCHAR ShortName[12];
05349   LARGE_INTEGER FileId;
05350   WCHAR FileName[1];
05351 } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
05352 
05353 typedef struct _FILE_NAMES_INFORMATION {
05354   ULONG NextEntryOffset;
05355   ULONG FileIndex;
05356   ULONG FileNameLength;
05357   WCHAR FileName[1];
05358 } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
05359 
05360 typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION {
05361   ULONG NextEntryOffset;
05362   ULONG FileIndex;
05363   LARGE_INTEGER CreationTime;
05364   LARGE_INTEGER LastAccessTime;
05365   LARGE_INTEGER LastWriteTime;
05366   LARGE_INTEGER ChangeTime;
05367   LARGE_INTEGER EndOfFile;
05368   LARGE_INTEGER AllocationSize;
05369   ULONG FileAttributes;
05370   ULONG FileNameLength;
05371   LARGE_INTEGER FileId;
05372   GUID LockingTransactionId;
05373   ULONG TxInfoFlags;
05374   WCHAR FileName[1];
05375 } FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
05376 
05377 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED         0x00000001
05378 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX       0x00000002
05379 #define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX  0x00000004
05380 
05381 typedef struct _FILE_OBJECTID_INFORMATION {
05382   LONGLONG FileReference;
05383   UCHAR ObjectId[16];
05384   _ANONYMOUS_UNION union {
05385     _ANONYMOUS_STRUCT struct {
05386       UCHAR BirthVolumeId[16];
05387       UCHAR BirthObjectId[16];
05388       UCHAR DomainId[16];
05389     } DUMMYSTRUCTNAME;
05390     UCHAR ExtendedInfo[48];
05391   } DUMMYUNIONNAME;
05392 } FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
05393 
05394 #define ANSI_DOS_STAR                   ('<')
05395 #define ANSI_DOS_QM                     ('>')
05396 #define ANSI_DOS_DOT                    ('"')
05397 
05398 #define DOS_STAR                        (L'<')
05399 #define DOS_QM                          (L'>')
05400 #define DOS_DOT                         (L'"')
05401 
05402 typedef struct _FILE_INTERNAL_INFORMATION {
05403   LARGE_INTEGER IndexNumber;
05404 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
05405 
05406 typedef struct _FILE_EA_INFORMATION {
05407   ULONG EaSize;
05408 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
05409 
05410 typedef struct _FILE_ACCESS_INFORMATION {
05411   ACCESS_MASK AccessFlags;
05412 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
05413 
05414 typedef struct _FILE_MODE_INFORMATION {
05415   ULONG Mode;
05416 } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
05417 
05418 typedef struct _FILE_ALL_INFORMATION {
05419   FILE_BASIC_INFORMATION BasicInformation;
05420   FILE_STANDARD_INFORMATION StandardInformation;
05421   FILE_INTERNAL_INFORMATION InternalInformation;
05422   FILE_EA_INFORMATION EaInformation;
05423   FILE_ACCESS_INFORMATION AccessInformation;
05424   FILE_POSITION_INFORMATION PositionInformation;
05425   FILE_MODE_INFORMATION ModeInformation;
05426   FILE_ALIGNMENT_INFORMATION AlignmentInformation;
05427   FILE_NAME_INFORMATION NameInformation;
05428 } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
05429 
05430 typedef struct _FILE_ALLOCATION_INFORMATION {
05431   LARGE_INTEGER AllocationSize;
05432 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
05433 
05434 typedef struct _FILE_COMPRESSION_INFORMATION {
05435   LARGE_INTEGER CompressedFileSize;
05436   USHORT CompressionFormat;
05437   UCHAR CompressionUnitShift;
05438   UCHAR ChunkShift;
05439   UCHAR ClusterShift;
05440   UCHAR Reserved[3];
05441 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
05442 
05443 typedef struct _FILE_LINK_INFORMATION {
05444   BOOLEAN ReplaceIfExists;
05445   HANDLE RootDirectory;
05446   ULONG FileNameLength;
05447   WCHAR FileName[1];
05448 } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
05449 
05450 typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
05451   ULONG ClusterCount;
05452   HANDLE RootDirectory;
05453   ULONG FileNameLength;
05454   WCHAR FileName[1];
05455 } FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
05456 
05457 typedef struct _FILE_RENAME_INFORMATION {
05458   BOOLEAN ReplaceIfExists;
05459   HANDLE RootDirectory;
05460   ULONG FileNameLength;
05461   WCHAR FileName[1];
05462 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
05463 
05464 typedef struct _FILE_STREAM_INFORMATION {
05465   ULONG NextEntryOffset;
05466   ULONG StreamNameLength;
05467   LARGE_INTEGER StreamSize;
05468   LARGE_INTEGER StreamAllocationSize;
05469   WCHAR StreamName[1];
05470 } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
05471 
05472 typedef struct _FILE_TRACKING_INFORMATION {
05473   HANDLE DestinationFile;
05474   ULONG ObjectInformationLength;
05475   CHAR ObjectInformation[1];
05476 } FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
05477 
05478 typedef struct _FILE_COMPLETION_INFORMATION {
05479   HANDLE Port;
05480   PVOID Key;
05481 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
05482 
05483 typedef struct _FILE_PIPE_INFORMATION {
05484   ULONG ReadMode;
05485   ULONG CompletionMode;
05486 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
05487 
05488 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
05489   ULONG NamedPipeType;
05490   ULONG NamedPipeConfiguration;
05491   ULONG MaximumInstances;
05492   ULONG CurrentInstances;
05493   ULONG InboundQuota;
05494   ULONG ReadDataAvailable;
05495   ULONG OutboundQuota;
05496   ULONG WriteQuotaAvailable;
05497   ULONG NamedPipeState;
05498   ULONG NamedPipeEnd;
05499 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
05500 
05501 typedef struct _FILE_PIPE_REMOTE_INFORMATION {
05502   LARGE_INTEGER CollectDataTime;
05503   ULONG MaximumCollectionCount;
05504 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
05505 
05506 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
05507   ULONG MaximumMessageSize;
05508   ULONG MailslotQuota;
05509   ULONG NextMessageSize;
05510   ULONG MessagesAvailable;
05511   LARGE_INTEGER ReadTimeout;
05512 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
05513 
05514 typedef struct _FILE_MAILSLOT_SET_INFORMATION {
05515   PLARGE_INTEGER ReadTimeout;
05516 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
05517 
05518 typedef struct _FILE_REPARSE_POINT_INFORMATION {
05519   LONGLONG FileReference;
05520   ULONG Tag;
05521 } FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
05522 
05523 typedef struct _FILE_LINK_ENTRY_INFORMATION {
05524   ULONG NextEntryOffset;
05525   LONGLONG ParentFileId;
05526   ULONG FileNameLength;
05527   WCHAR FileName[1];
05528 } FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
05529 
05530 typedef struct _FILE_LINKS_INFORMATION {
05531   ULONG BytesNeeded;
05532   ULONG EntriesReturned;
05533   FILE_LINK_ENTRY_INFORMATION Entry;
05534 } FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;
05535 
05536 typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
05537   ULONG FileNameLength;
05538   WCHAR FileName[1];
05539 } FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
05540 
05541 typedef struct _FILE_STANDARD_LINK_INFORMATION {
05542   ULONG NumberOfAccessibleLinks;
05543   ULONG TotalNumberOfLinks;
05544   BOOLEAN DeletePending;
05545   BOOLEAN Directory;
05546 } FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;
05547 
05548 typedef struct _FILE_GET_EA_INFORMATION {
05549   ULONG NextEntryOffset;
05550   UCHAR EaNameLength;
05551   CHAR  EaName[1];
05552 } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
05553 
05554 #define REMOTE_PROTOCOL_FLAG_LOOPBACK       0x00000001
05555 #define REMOTE_PROTOCOL_FLAG_OFFLINE        0x00000002
05556 
05557 typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION {
05558   USHORT StructureVersion;
05559   USHORT StructureSize;
05560   ULONG  Protocol;
05561   USHORT ProtocolMajorVersion;
05562   USHORT ProtocolMinorVersion;
05563   USHORT ProtocolRevision;
05564   USHORT Reserved;
05565   ULONG  Flags;
05566   struct {
05567     ULONG Reserved[8];
05568   } GenericReserved;
05569   struct {
05570     ULONG Reserved[16];
05571   } ProtocolSpecificReserved;
05572 } FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;
05573 
05574 typedef struct _FILE_GET_QUOTA_INFORMATION {
05575   ULONG NextEntryOffset;
05576   ULONG SidLength;
05577   SID Sid;
05578 } FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
05579 
05580 typedef struct _FILE_QUOTA_INFORMATION {
05581   ULONG NextEntryOffset;
05582   ULONG SidLength;
05583   LARGE_INTEGER ChangeTime;
05584   LARGE_INTEGER QuotaUsed;
05585   LARGE_INTEGER QuotaThreshold;
05586   LARGE_INTEGER QuotaLimit;
05587   SID Sid;
05588 } FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
05589 
05590 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
05591   ULONG FileSystemAttributes;
05592   ULONG MaximumComponentNameLength;
05593   ULONG FileSystemNameLength;
05594   WCHAR FileSystemName[1];
05595 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
05596 
05597 typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
05598   BOOLEAN DriverInPath;
05599   ULONG DriverNameLength;
05600   WCHAR DriverName[1];
05601 } FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
05602 
05603 typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
05604   ULONG Flags;
05605 } FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
05606 
05607 #define FILE_VC_QUOTA_NONE              0x00000000
05608 #define FILE_VC_QUOTA_TRACK             0x00000001
05609 #define FILE_VC_QUOTA_ENFORCE           0x00000002
05610 #define FILE_VC_QUOTA_MASK              0x00000003
05611 #define FILE_VC_CONTENT_INDEX_DISABLED  0x00000008
05612 #define FILE_VC_LOG_QUOTA_THRESHOLD     0x00000010
05613 #define FILE_VC_LOG_QUOTA_LIMIT         0x00000020
05614 #define FILE_VC_LOG_VOLUME_THRESHOLD    0x00000040
05615 #define FILE_VC_LOG_VOLUME_LIMIT        0x00000080
05616 #define FILE_VC_QUOTAS_INCOMPLETE       0x00000100
05617 #define FILE_VC_QUOTAS_REBUILDING       0x00000200
05618 #define FILE_VC_VALID_MASK              0x000003ff
05619 
05620 typedef struct _FILE_FS_CONTROL_INFORMATION {
05621   LARGE_INTEGER FreeSpaceStartFiltering;
05622   LARGE_INTEGER FreeSpaceThreshold;
05623   LARGE_INTEGER FreeSpaceStopFiltering;
05624   LARGE_INTEGER DefaultQuotaThreshold;
05625   LARGE_INTEGER DefaultQuotaLimit;
05626   ULONG FileSystemControlFlags;
05627 } FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
05628 
05629 #ifndef _FILESYSTEMFSCTL_
05630 #define _FILESYSTEMFSCTL_
05631 
05632 #define FSCTL_REQUEST_OPLOCK_LEVEL_1    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
05633 #define FSCTL_REQUEST_OPLOCK_LEVEL_2    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
05634 #define FSCTL_REQUEST_BATCH_OPLOCK      CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
05635 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
05636 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
05637 #define FSCTL_OPLOCK_BREAK_NOTIFY       CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
05638 #define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
05639 #define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
05640 #define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
05641 #define FSCTL_IS_VOLUME_MOUNTED         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
05642 #define FSCTL_IS_PATHNAME_VALID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
05643 #define FSCTL_MARK_VOLUME_DIRTY         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
05644 #define FSCTL_QUERY_RETRIEVAL_POINTERS  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER,  FILE_ANY_ACCESS)
05645 #define FSCTL_GET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
05646 #define FSCTL_SET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
05647 #define FSCTL_SET_BOOTLOADER_ACCESSED   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER,  FILE_ANY_ACCESS)
05648 
05649 #define FSCTL_OPLOCK_BREAK_ACK_NO_2     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
05650 #define FSCTL_INVALIDATE_VOLUMES        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
05651 #define FSCTL_QUERY_FAT_BPB             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
05652 #define FSCTL_REQUEST_FILTER_OPLOCK     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
05653 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
05654 
05655 #if (_WIN32_WINNT >= 0x0400)
05656 
05657 #define FSCTL_GET_NTFS_VOLUME_DATA      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
05658 #define FSCTL_GET_NTFS_FILE_RECORD      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
05659 #define FSCTL_GET_VOLUME_BITMAP         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER,  FILE_ANY_ACCESS)
05660 #define FSCTL_GET_RETRIEVAL_POINTERS    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER,  FILE_ANY_ACCESS)
05661 #define FSCTL_MOVE_FILE                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
05662 #define FSCTL_IS_VOLUME_DIRTY           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
05663 #define FSCTL_ALLOW_EXTENDED_DASD_IO    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER,  FILE_ANY_ACCESS)
05664 
05665 #endif
05666 
05667 #if (_WIN32_WINNT >= 0x0500)
05668 
05669 #define FSCTL_FIND_FILES_BY_SID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER,  FILE_ANY_ACCESS)
05670 #define FSCTL_SET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
05671 #define FSCTL_GET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
05672 #define FSCTL_DELETE_OBJECT_ID          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
05673 #define FSCTL_SET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
05674 #define FSCTL_GET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
05675 #define FSCTL_DELETE_REPARSE_POINT      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
05676 #define FSCTL_ENUM_USN_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER,  FILE_READ_DATA)
05677 #define FSCTL_SECURITY_ID_CHECK         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER,  FILE_READ_DATA)
05678 #define FSCTL_READ_USN_JOURNAL          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER,  FILE_READ_DATA)
05679 #define FSCTL_SET_OBJECT_ID_EXTENDED    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
05680 #define FSCTL_CREATE_OR_GET_OBJECT_ID   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
05681 #define FSCTL_SET_SPARSE                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
05682 #define FSCTL_SET_ZERO_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
05683 #define FSCTL_QUERY_ALLOCATED_RANGES    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER,  FILE_READ_DATA)
05684 #define FSCTL_ENABLE_UPGRADE            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
05685 #define FSCTL_SET_ENCRYPTION            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
05686 #define FSCTL_ENCRYPTION_FSCTL_IO       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER,  FILE_ANY_ACCESS)
05687 #define FSCTL_WRITE_RAW_ENCRYPTED       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER,  FILE_ANY_ACCESS)
05688 #define FSCTL_READ_RAW_ENCRYPTED        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER,  FILE_ANY_ACCESS)
05689 #define FSCTL_CREATE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER,  FILE_READ_DATA)
05690 #define FSCTL_READ_FILE_USN_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER,  FILE_READ_DATA)
05691 #define FSCTL_WRITE_USN_CLOSE_RECORD    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER,  FILE_READ_DATA)
05692 #define FSCTL_EXTEND_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
05693 #define FSCTL_QUERY_USN_JOURNAL         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
05694 #define FSCTL_DELETE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
05695 #define FSCTL_MARK_HANDLE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
05696 #define FSCTL_SIS_COPYFILE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
05697 #define FSCTL_SIS_LINK_FILES            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
05698 #define FSCTL_RECALL_FILE               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
05699 #define FSCTL_READ_FROM_PLEX            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
05700 #define FSCTL_FILE_PREFETCH             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
05701 
05702 #endif
05703 
05704 #if (_WIN32_WINNT >= 0x0600)
05705 
05706 #define FSCTL_MAKE_MEDIA_COMPATIBLE         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
05707 #define FSCTL_SET_DEFECT_MANAGEMENT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
05708 #define FSCTL_QUERY_SPARING_INFO            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
05709 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
05710 #define FSCTL_SET_VOLUME_COMPRESSION_STATE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
05711 #define FSCTL_TXFS_MODIFY_RM                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA)
05712 #define FSCTL_TXFS_QUERY_RM_INFORMATION     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA)
05713 #define FSCTL_TXFS_ROLLFORWARD_REDO         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA)
05714 #define FSCTL_TXFS_ROLLFORWARD_UNDO         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA)
05715 #define FSCTL_TXFS_START_RM                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA)
05716 #define FSCTL_TXFS_SHUTDOWN_RM              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
05717 #define FSCTL_TXFS_READ_BACKUP_INFORMATION  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA)
05718 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA)
05719 #define FSCTL_TXFS_CREATE_SECONDARY_RM      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA)
05720 #define FSCTL_TXFS_GET_METADATA_INFO        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA)
05721 #define FSCTL_TXFS_GET_TRANSACTED_VERSION   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA)
05722 #define FSCTL_TXFS_SAVEPOINT_INFORMATION    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA)
05723 #define FSCTL_TXFS_CREATE_MINIVERSION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
05724 #define FSCTL_TXFS_TRANSACTION_ACTIVE       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA)
05725 #define FSCTL_SET_ZERO_ON_DEALLOCATION      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
05726 #define FSCTL_SET_REPAIR                    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
05727 #define FSCTL_GET_REPAIR                    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
05728 #define FSCTL_WAIT_FOR_REPAIR               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
05729 #define FSCTL_INITIATE_REPAIR               CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
05730 #define FSCTL_CSC_INTERNAL                  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER,  FILE_ANY_ACCESS)
05731 #define FSCTL_SHRINK_VOLUME                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
05732 #define FSCTL_SET_SHORT_NAME_BEHAVIOR       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
05733 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
05734 
05735 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \
05736                                             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
05737 #define FSCTL_TXFS_LIST_TRANSACTIONS        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
05738 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
05739 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
05740 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
05741 
05742 #endif
05743 
05744 #if (_WIN32_WINNT >= 0x0601)
05745 
05746 #define FSCTL_QUERY_DEPENDENT_VOLUME        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS)
05747 #define FSCTL_SD_GLOBAL_CHANGE              CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS)
05748 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS)
05749 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS)
05750 #define FSCTL_FILE_TYPE_NOTIFICATION        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS)
05751 #define FSCTL_GET_BOOT_AREA_INFO            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS)
05752 #define FSCTL_GET_RETRIEVAL_POINTER_BASE    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS)
05753 #define FSCTL_SET_PERSISTENT_VOLUME_STATE   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
05754 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
05755 
05756 #define FSCTL_REQUEST_OPLOCK                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)
05757 
05758 #define FSCTL_CSV_TUNNEL_REQUEST            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
05759 #define FSCTL_IS_CSV_FILE                   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
05760 
05761 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS)
05762 #define FSCTL_CSV_GET_VOLUME_PATH_NAME      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS)
05763 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
05764 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150,  METHOD_BUFFERED, FILE_ANY_ACCESS)
05765 #define FSCTL_IS_FILE_ON_CSV_VOLUME         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151,  METHOD_BUFFERED, FILE_ANY_ACCESS)
05766 
05767 typedef struct _CSV_NAMESPACE_INFO {
05768   ULONG Version;
05769   ULONG DeviceNumber;
05770   LARGE_INTEGER StartingOffset;
05771   ULONG SectorSize;
05772 } CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
05773 
05774 #define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
05775 #define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
05776 
05777 #endif
05778 
05779 #define FSCTL_MARK_AS_SYSTEM_HIVE           FSCTL_SET_BOOTLOADER_ACCESSED
05780 
05781 typedef struct _PATHNAME_BUFFER {
05782   ULONG PathNameLength;
05783   WCHAR Name[1];
05784 } PATHNAME_BUFFER, *PPATHNAME_BUFFER;
05785 
05786 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
05787   UCHAR First0x24BytesOfBootSector[0x24];
05788 } FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
05789 
05790 #if (_WIN32_WINNT >= 0x0400)
05791 
05792 typedef struct _NTFS_VOLUME_DATA_BUFFER {
05793   LARGE_INTEGER VolumeSerialNumber;
05794   LARGE_INTEGER NumberSectors;
05795   LARGE_INTEGER TotalClusters;
05796   LARGE_INTEGER FreeClusters;
05797   LARGE_INTEGER TotalReserved;
05798   ULONG BytesPerSector;
05799   ULONG BytesPerCluster;
05800   ULONG BytesPerFileRecordSegment;
05801   ULONG ClustersPerFileRecordSegment;
05802   LARGE_INTEGER MftValidDataLength;
05803   LARGE_INTEGER MftStartLcn;
05804   LARGE_INTEGER Mft2StartLcn;
05805   LARGE_INTEGER MftZoneStart;
05806   LARGE_INTEGER MftZoneEnd;
05807 } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
05808 
05809 typedef struct _NTFS_EXTENDED_VOLUME_DATA {
05810   ULONG ByteCount;
05811   USHORT MajorVersion;
05812   USHORT MinorVersion;
05813 } NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
05814 
05815 typedef struct _STARTING_LCN_INPUT_BUFFER {
05816   LARGE_INTEGER StartingLcn;
05817 } STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
05818 
05819 typedef struct _VOLUME_BITMAP_BUFFER {
05820   LARGE_INTEGER StartingLcn;
05821   LARGE_INTEGER BitmapSize;
05822   UCHAR Buffer[1];
05823 } VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
05824 
05825 typedef struct _STARTING_VCN_INPUT_BUFFER {
05826   LARGE_INTEGER StartingVcn;
05827 } STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
05828 
05829 typedef struct _RETRIEVAL_POINTERS_BUFFER {
05830   ULONG ExtentCount;
05831   LARGE_INTEGER StartingVcn;
05832   struct {
05833     LARGE_INTEGER NextVcn;
05834     LARGE_INTEGER Lcn;
05835   } Extents[1];
05836 } RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
05837 
05838 typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER {
05839   LARGE_INTEGER FileReferenceNumber;
05840 } NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
05841 
05842 typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER {
05843   LARGE_INTEGER FileReferenceNumber;
05844   ULONG FileRecordLength;
05845   UCHAR FileRecordBuffer[1];
05846 } NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
05847 
05848 typedef struct _MOVE_FILE_DATA {
05849   HANDLE FileHandle;
05850   LARGE_INTEGER StartingVcn;
05851   LARGE_INTEGER StartingLcn;
05852   ULONG ClusterCount;
05853 } MOVE_FILE_DATA, *PMOVE_FILE_DATA;
05854 
05855 typedef struct _MOVE_FILE_RECORD_DATA {
05856   HANDLE FileHandle;
05857   LARGE_INTEGER SourceFileRecord;
05858   LARGE_INTEGER TargetFileRecord;
05859 } MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
05860 
05861 #if defined(_WIN64)
05862 typedef struct _MOVE_FILE_DATA32 {
05863   UINT32 FileHandle;
05864   LARGE_INTEGER StartingVcn;
05865   LARGE_INTEGER StartingLcn;
05866   ULONG ClusterCount;
05867 } MOVE_FILE_DATA32, *PMOVE_FILE_DATA32;
05868 #endif
05869 
05870 #endif /* (_WIN32_WINNT >= 0x0400) */
05871 
05872 #if (_WIN32_WINNT >= 0x0500)
05873 
05874 typedef struct _FIND_BY_SID_DATA {
05875   ULONG Restart;
05876   SID Sid;
05877 } FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
05878 
05879 typedef struct _FIND_BY_SID_OUTPUT {
05880   ULONG NextEntryOffset;
05881   ULONG FileIndex;
05882   ULONG FileNameLength;
05883   WCHAR FileName[1];
05884 } FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
05885 
05886 typedef struct _MFT_ENUM_DATA {
05887   ULONGLONG StartFileReferenceNumber;
05888   USN LowUsn;
05889   USN HighUsn;
05890 } MFT_ENUM_DATA, *PMFT_ENUM_DATA;
05891 
05892 typedef struct _CREATE_USN_JOURNAL_DATA {
05893   ULONGLONG MaximumSize;
05894   ULONGLONG AllocationDelta;
05895 } CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
05896 
05897 typedef struct _READ_USN_JOURNAL_DATA {
05898   USN StartUsn;
05899   ULONG ReasonMask;
05900   ULONG ReturnOnlyOnClose;
05901   ULONGLONG Timeout;
05902   ULONGLONG BytesToWaitFor;
05903   ULONGLONG UsnJournalID;
05904 } READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
05905 
05906 typedef struct _USN_RECORD {
05907   ULONG RecordLength;
05908   USHORT MajorVersion;
05909   USHORT MinorVersion;
05910   ULONGLONG FileReferenceNumber;
05911   ULONGLONG ParentFileReferenceNumber;
05912   USN Usn;
05913   LARGE_INTEGER TimeStamp;
05914   ULONG Reason;
05915   ULONG SourceInfo;
05916   ULONG SecurityId;
05917   ULONG FileAttributes;
05918   USHORT FileNameLength;
05919   USHORT FileNameOffset;
05920   WCHAR FileName[1];
05921 } USN_RECORD, *PUSN_RECORD;
05922 
05923 #define USN_PAGE_SIZE                    (0x1000)
05924 
05925 #define USN_REASON_DATA_OVERWRITE        (0x00000001)
05926 #define USN_REASON_DATA_EXTEND           (0x00000002)
05927 #define USN_REASON_DATA_TRUNCATION       (0x00000004)
05928 #define USN_REASON_NAMED_DATA_OVERWRITE  (0x00000010)
05929 #define USN_REASON_NAMED_DATA_EXTEND     (0x00000020)
05930 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
05931 #define USN_REASON_FILE_CREATE           (0x00000100)
05932 #define USN_REASON_FILE_DELETE           (0x00000200)
05933 #define USN_REASON_EA_CHANGE             (0x00000400)
05934 #define USN_REASON_SECURITY_CHANGE       (0x00000800)
05935 #define USN_REASON_RENAME_OLD_NAME       (0x00001000)
05936 #define USN_REASON_RENAME_NEW_NAME       (0x00002000)
05937 #define USN_REASON_INDEXABLE_CHANGE      (0x00004000)
05938 #define USN_REASON_BASIC_INFO_CHANGE     (0x00008000)
05939 #define USN_REASON_HARD_LINK_CHANGE      (0x00010000)
05940 #define USN_REASON_COMPRESSION_CHANGE    (0x00020000)
05941 #define USN_REASON_ENCRYPTION_CHANGE     (0x00040000)
05942 #define USN_REASON_OBJECT_ID_CHANGE      (0x00080000)
05943 #define USN_REASON_REPARSE_POINT_CHANGE  (0x00100000)
05944 #define USN_REASON_STREAM_CHANGE         (0x00200000)
05945 #define USN_REASON_TRANSACTED_CHANGE     (0x00400000)
05946 #define USN_REASON_CLOSE                 (0x80000000)
05947 
05948 typedef struct _USN_JOURNAL_DATA {
05949   ULONGLONG UsnJournalID;
05950   USN FirstUsn;
05951   USN NextUsn;
05952   USN LowestValidUsn;
05953   USN MaxUsn;
05954   ULONGLONG MaximumSize;
05955   ULONGLONG AllocationDelta;
05956 } USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
05957 
05958 typedef struct _DELETE_USN_JOURNAL_DATA {
05959   ULONGLONG UsnJournalID;
05960   ULONG DeleteFlags;
05961 } DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
05962 
05963 #define USN_DELETE_FLAG_DELETE              (0x00000001)
05964 #define USN_DELETE_FLAG_NOTIFY              (0x00000002)
05965 #define USN_DELETE_VALID_FLAGS              (0x00000003)
05966 
05967 typedef struct _MARK_HANDLE_INFO {
05968   ULONG UsnSourceInfo;
05969   HANDLE VolumeHandle;
05970   ULONG HandleInfo;
05971 } MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
05972 
05973 #if defined(_WIN64)
05974 typedef struct _MARK_HANDLE_INFO32 {
05975   ULONG UsnSourceInfo;
05976   UINT32 VolumeHandle;
05977   ULONG HandleInfo;
05978 } MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32;
05979 #endif
05980 
05981 #define USN_SOURCE_DATA_MANAGEMENT          (0x00000001)
05982 #define USN_SOURCE_AUXILIARY_DATA           (0x00000002)
05983 #define USN_SOURCE_REPLICATION_MANAGEMENT   (0x00000004)
05984 
05985 #define MARK_HANDLE_PROTECT_CLUSTERS        (0x00000001)
05986 #define MARK_HANDLE_TXF_SYSTEM_LOG          (0x00000004)
05987 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG      (0x00000008)
05988 
05989 typedef struct _BULK_SECURITY_TEST_DATA {
05990   ACCESS_MASK DesiredAccess;
05991   ULONG SecurityIds[1];
05992 } BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
05993 
05994 #define VOLUME_IS_DIRTY                  (0x00000001)
05995 #define VOLUME_UPGRADE_SCHEDULED         (0x00000002)
05996 #define VOLUME_SESSION_OPEN              (0x00000004)
05997 
05998 typedef struct _FILE_PREFETCH {
05999   ULONG Type;
06000   ULONG Count;
06001   ULONGLONG Prefetch[1];
06002 } FILE_PREFETCH, *PFILE_PREFETCH;
06003 
06004 typedef struct _FILE_PREFETCH_EX {
06005   ULONG Type;
06006   ULONG Count;
06007   PVOID Context;
06008   ULONGLONG Prefetch[1];
06009 } FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
06010 
06011 #define FILE_PREFETCH_TYPE_FOR_CREATE       0x1
06012 #define FILE_PREFETCH_TYPE_FOR_DIRENUM      0x2
06013 #define FILE_PREFETCH_TYPE_FOR_CREATE_EX    0x3
06014 #define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX   0x4
06015 
06016 #define FILE_PREFETCH_TYPE_MAX              0x4
06017 
06018 typedef struct _FILE_OBJECTID_BUFFER {
06019   UCHAR ObjectId[16];
06020   _ANONYMOUS_UNION union {
06021     _ANONYMOUS_STRUCT struct {
06022       UCHAR BirthVolumeId[16];
06023       UCHAR BirthObjectId[16];
06024       UCHAR DomainId[16];
06025     } DUMMYSTRUCTNAME;
06026     UCHAR ExtendedInfo[48];
06027   } DUMMYUNIONNAME;
06028 } FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
06029 
06030 typedef struct _FILE_SET_SPARSE_BUFFER {
06031   BOOLEAN SetSparse;
06032 } FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
06033 
06034 typedef struct _FILE_ZERO_DATA_INFORMATION {
06035   LARGE_INTEGER FileOffset;
06036   LARGE_INTEGER BeyondFinalZero;
06037 } FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
06038 
06039 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
06040   LARGE_INTEGER FileOffset;
06041   LARGE_INTEGER Length;
06042 } FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
06043 
06044 typedef struct _ENCRYPTION_BUFFER {
06045   ULONG EncryptionOperation;
06046   UCHAR Private[1];
06047 } ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
06048 
06049 #define FILE_SET_ENCRYPTION         0x00000001
06050 #define FILE_CLEAR_ENCRYPTION       0x00000002
06051 #define STREAM_SET_ENCRYPTION       0x00000003
06052 #define STREAM_CLEAR_ENCRYPTION     0x00000004
06053 
06054 #define MAXIMUM_ENCRYPTION_VALUE    0x00000004
06055 
06056 typedef struct _DECRYPTION_STATUS_BUFFER {
06057   BOOLEAN NoEncryptedStreams;
06058 } DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
06059 
06060 #define ENCRYPTION_FORMAT_DEFAULT        (0x01)
06061 
06062 #define COMPRESSION_FORMAT_SPARSE        (0x4000)
06063 
06064 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
06065   LONGLONG FileOffset;
06066   ULONG Length;
06067 } REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
06068 
06069 typedef struct _ENCRYPTED_DATA_INFO {
06070   ULONGLONG StartingFileOffset;
06071   ULONG OutputBufferOffset;
06072   ULONG BytesWithinFileSize;
06073   ULONG BytesWithinValidDataLength;
06074   USHORT CompressionFormat;
06075   UCHAR DataUnitShift;
06076   UCHAR ChunkShift;
06077   UCHAR ClusterShift;
06078   UCHAR EncryptionFormat;
06079   USHORT NumberOfDataBlocks;
06080   ULONG DataBlockSize[ANYSIZE_ARRAY];
06081 } ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO;
06082 
06083 typedef struct _PLEX_READ_DATA_REQUEST {
06084   LARGE_INTEGER ByteOffset;
06085   ULONG ByteLength;
06086   ULONG PlexNumber;
06087 } PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
06088 
06089 typedef struct _SI_COPYFILE {
06090   ULONG SourceFileNameLength;
06091   ULONG DestinationFileNameLength;
06092   ULONG Flags;
06093   WCHAR FileNameBuffer[1];
06094 } SI_COPYFILE, *PSI_COPYFILE;
06095 
06096 #define COPYFILE_SIS_LINK       0x0001
06097 #define COPYFILE_SIS_REPLACE    0x0002
06098 #define COPYFILE_SIS_FLAGS      0x0003
06099 
06100 #endif /* (_WIN32_WINNT >= 0x0500) */
06101 
06102 #if (_WIN32_WINNT >= 0x0600)
06103 
06104 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
06105   BOOLEAN CloseDisc;
06106 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
06107 
06108 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
06109   BOOLEAN Disable;
06110 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
06111 
06112 typedef struct _FILE_QUERY_SPARING_BUFFER {
06113   ULONG SparingUnitBytes;
06114   BOOLEAN SoftwareSparing;
06115   ULONG TotalSpareBlocks;
06116   ULONG FreeSpareBlocks;
06117 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
06118 
06119 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
06120   LARGE_INTEGER DirectoryCount;
06121   LARGE_INTEGER FileCount;
06122   USHORT FsFormatMajVersion;
06123   USHORT FsFormatMinVersion;
06124   WCHAR FsFormatName[12];
06125   LARGE_INTEGER FormatTime;
06126   LARGE_INTEGER LastUpdateTime;
06127   WCHAR CopyrightInfo[34];
06128   WCHAR AbstractInfo[34];
06129   WCHAR FormattingImplementationInfo[34];
06130   WCHAR LastModifyingImplementationInfo[34];
06131 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
06132 
06133 #define SET_REPAIR_ENABLED                                      (0x00000001)
06134 #define SET_REPAIR_VOLUME_BITMAP_SCAN                           (0x00000002)
06135 #define SET_REPAIR_DELETE_CROSSLINK                             (0x00000004)
06136 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS                         (0x00000008)
06137 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT             (0x00000010)
06138 #define SET_REPAIR_VALID_MASK                                   (0x0000001F)
06139 
06140 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
06141   ShrinkPrepare = 1,
06142   ShrinkCommit,
06143   ShrinkAbort
06144 } SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES;
06145 
06146 typedef struct _SHRINK_VOLUME_INFORMATION {
06147   SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
06148   ULONGLONG Flags;
06149   LONGLONG NewNumberOfSectors;
06150 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
06151 
06152 #define TXFS_RM_FLAG_LOGGING_MODE                           0x00000001
06153 #define TXFS_RM_FLAG_RENAME_RM                              0x00000002
06154 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX                0x00000004
06155 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN                0x00000008
06156 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS    0x00000010
06157 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT           0x00000020
06158 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE             0x00000040
06159 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX             0x00000080
06160 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN             0x00000100
06161 #define TXFS_RM_FLAG_GROW_LOG                               0x00000400
06162 #define TXFS_RM_FLAG_SHRINK_LOG                             0x00000800
06163 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                   0x00001000
06164 #define TXFS_RM_FLAG_PRESERVE_CHANGES                       0x00002000
06165 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                 0x00004000
06166 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START          0x00008000
06167 #define TXFS_RM_FLAG_PREFER_CONSISTENCY                     0x00010000
06168 #define TXFS_RM_FLAG_PREFER_AVAILABILITY                    0x00020000
06169 
06170 #define TXFS_LOGGING_MODE_SIMPLE        (0x0001)
06171 #define TXFS_LOGGING_MODE_FULL          (0x0002)
06172 
06173 #define TXFS_TRANSACTION_STATE_NONE         0x00
06174 #define TXFS_TRANSACTION_STATE_ACTIVE       0x01
06175 #define TXFS_TRANSACTION_STATE_PREPARED     0x02
06176 #define TXFS_TRANSACTION_STATE_NOTACTIVE    0x03
06177 
06178 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE                        | \
06179                                     TXFS_RM_FLAG_RENAME_RM                           | \
06180                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX             | \
06181                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN             | \
06182                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
06183                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        | \
06184                                     TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          | \
06185                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          | \
06186                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN          | \
06187                                     TXFS_RM_FLAG_SHRINK_LOG                          | \
06188                                     TXFS_RM_FLAG_GROW_LOG                            | \
06189                                     TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                | \
06190                                     TXFS_RM_FLAG_PRESERVE_CHANGES                    | \
06191                                     TXFS_RM_FLAG_RESET_RM_AT_NEXT_START              | \
06192                                     TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START       | \
06193                                     TXFS_RM_FLAG_PREFER_CONSISTENCY                  | \
06194                                     TXFS_RM_FLAG_PREFER_AVAILABILITY)
06195 
06196 typedef struct _TXFS_MODIFY_RM {
06197   ULONG Flags;
06198   ULONG LogContainerCountMax;
06199   ULONG LogContainerCountMin;
06200   ULONG LogContainerCount;
06201   ULONG LogGrowthIncrement;
06202   ULONG LogAutoShrinkPercentage;
06203   ULONGLONG Reserved;
06204   USHORT LoggingMode;
06205 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
06206 
06207 #define TXFS_RM_STATE_NOT_STARTED       0
06208 #define TXFS_RM_STATE_STARTING          1
06209 #define TXFS_RM_STATE_ACTIVE            2
06210 #define TXFS_RM_STATE_SHUTTING_DOWN     3
06211 
06212 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS                           \
06213                 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS   |   \
06214                  TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT          |   \
06215                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX            |   \
06216                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN            |   \
06217                  TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                |   \
06218                  TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START         |   \
06219                  TXFS_RM_FLAG_PREFER_CONSISTENCY                    |   \
06220                  TXFS_RM_FLAG_PREFER_AVAILABILITY)
06221 
06222 typedef struct _TXFS_QUERY_RM_INFORMATION {
06223   ULONG BytesRequired;
06224   ULONGLONG TailLsn;
06225   ULONGLONG CurrentLsn;
06226   ULONGLONG ArchiveTailLsn;
06227   ULONGLONG LogContainerSize;
06228   LARGE_INTEGER HighestVirtualClock;
06229   ULONG LogContainerCount;
06230   ULONG LogContainerCountMax;
06231   ULONG LogContainerCountMin;
06232   ULONG LogGrowthIncrement;
06233   ULONG LogAutoShrinkPercentage;
06234   ULONG Flags;
06235   USHORT LoggingMode;
06236   USHORT Reserved;
06237   ULONG RmState;
06238   ULONGLONG LogCapacity;
06239   ULONGLONG LogFree;
06240   ULONGLONG TopsSize;
06241   ULONGLONG TopsUsed;
06242   ULONGLONG TransactionCount;
06243   ULONGLONG OnePCCount;
06244   ULONGLONG TwoPCCount;
06245   ULONGLONG NumberLogFileFull;
06246   ULONGLONG OldestTransactionAge;
06247   GUID RMName;
06248   ULONG TmLogPathOffset;
06249 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
06250 
06251 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN        0x01
06252 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK   0x02
06253 
06254 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS                               \
06255                 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN |         \
06256                  TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
06257 
06258 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
06259   LARGE_INTEGER LastVirtualClock;
06260   ULONGLONG LastRedoLsn;
06261   ULONGLONG HighestRecoveryLsn;
06262   ULONG Flags;
06263 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
06264 
06265 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX              0x00000001
06266 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN              0x00000002
06267 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                   0x00000004
06268 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS  0x00000008
06269 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT         0x00000010
06270 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE           0x00000020
06271 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX           0x00000040
06272 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN           0x00000080
06273 
06274 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                  0x00000200
06275 #define TXFS_START_RM_FLAG_LOGGING_MODE                         0x00000400
06276 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES                     0x00000800
06277 
06278 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY                   0x00001000
06279 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY                  0x00002000
06280 
06281 #define TXFS_START_RM_VALID_FLAGS                                           \
06282                 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX             |   \
06283                  TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN             |   \
06284                  TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                  |   \
06285                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS |   \
06286                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        |   \
06287                  TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          |   \
06288                  TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                 |   \
06289                  TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          |   \
06290                  TXFS_START_RM_FLAG_LOGGING_MODE                        |   \
06291                  TXFS_START_RM_FLAG_PRESERVE_CHANGES                    |   \
06292                  TXFS_START_RM_FLAG_PREFER_CONSISTENCY                  |   \
06293                  TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
06294 
06295 typedef struct _TXFS_START_RM_INFORMATION {
06296   ULONG Flags;
06297   ULONGLONG LogContainerSize;
06298   ULONG LogContainerCountMin;
06299   ULONG LogContainerCountMax;
06300   ULONG LogGrowthIncrement;
06301   ULONG LogAutoShrinkPercentage;
06302   ULONG TmLogPathOffset;
06303   USHORT TmLogPathLength;
06304   USHORT LoggingMode;
06305   USHORT LogPathLength;
06306   USHORT Reserved;
06307   WCHAR LogPath[1];
06308 } TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
06309 
06310 typedef struct _TXFS_GET_METADATA_INFO_OUT {
06311   struct {
06312     LONGLONG LowPart;
06313     LONGLONG HighPart;
06314   } TxfFileId;
06315   GUID LockingTransaction;
06316   ULONGLONG LastLsn;
06317   ULONG TransactionState;
06318 } TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
06319 
06320 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED   0x00000001
06321 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED   0x00000002
06322 
06323 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
06324   ULONGLONG Offset;
06325   ULONG NameFlags;
06326   LONGLONG FileId;
06327   ULONG Reserved1;
06328   ULONG Reserved2;
06329   LONGLONG Reserved3;
06330   WCHAR FileName[1];
06331 } TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
06332 
06333 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
06334   GUID KtmTransaction;
06335   ULONGLONG NumberOfFiles;
06336   ULONGLONG BufferSizeRequired;
06337   ULONGLONG Offset;
06338 } TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
06339 
06340 typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
06341   GUID TransactionId;
06342   ULONG TransactionState;
06343   ULONG Reserved1;
06344   ULONG Reserved2;
06345   LONGLONG Reserved3;
06346 } TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
06347 
06348 typedef struct _TXFS_LIST_TRANSACTIONS {
06349   ULONGLONG NumberOfTransactions;
06350   ULONGLONG BufferSizeRequired;
06351 } TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
06352 
06353 typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
06354   _ANONYMOUS_UNION union {
06355     ULONG BufferLength;
06356     UCHAR Buffer[1];
06357   } DUMMYUNIONNAME;
06358 } TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
06359 
06360 typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
06361   UCHAR Buffer[1];
06362 } TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
06363 
06364 #define TXFS_TRANSACTED_VERSION_NONTRANSACTED   0xFFFFFFFE
06365 #define TXFS_TRANSACTED_VERSION_UNCOMMITTED     0xFFFFFFFF
06366 
06367 typedef struct _TXFS_GET_TRANSACTED_VERSION {
06368   ULONG ThisBaseVersion;
06369   ULONG LatestVersion;
06370   USHORT ThisMiniVersion;
06371   USHORT FirstMiniVersion;
06372   USHORT LatestMiniVersion;
06373 } TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
06374 
06375 #define TXFS_SAVEPOINT_SET                      0x00000001
06376 #define TXFS_SAVEPOINT_ROLLBACK                 0x00000002
06377 #define TXFS_SAVEPOINT_CLEAR                    0x00000004
06378 #define TXFS_SAVEPOINT_CLEAR_ALL                0x00000010
06379 
06380 typedef struct _TXFS_SAVEPOINT_INFORMATION {
06381   HANDLE KtmTransaction;
06382   ULONG ActionCode;
06383   ULONG SavepointId;
06384 } TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
06385 
06386 typedef struct _TXFS_CREATE_MINIVERSION_INFO {
06387   USHORT StructureVersion;
06388   USHORT StructureLength;
06389   ULONG BaseVersion;
06390   USHORT MiniVersion;
06391 } TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
06392 
06393 typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
06394   BOOLEAN TransactionsActiveAtSnapshot;
06395 } TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
06396 
06397 #endif /* (_WIN32_WINNT >= 0x0600) */
06398 
06399 #if (_WIN32_WINNT >= 0x0601)
06400 
06401 #define MARK_HANDLE_REALTIME                (0x00000020)
06402 #define MARK_HANDLE_NOT_REALTIME            (0x00000040)
06403 
06404 #define NO_8DOT3_NAME_PRESENT               (0x00000001)
06405 #define REMOVED_8DOT3_NAME                  (0x00000002)
06406 
06407 #define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED        (0x00000001)
06408 
06409 typedef struct _BOOT_AREA_INFO {
06410   ULONG BootSectorCount;
06411   struct {
06412     LARGE_INTEGER Offset;
06413   } BootSectors[2];
06414 } BOOT_AREA_INFO, *PBOOT_AREA_INFO;
06415 
06416 typedef struct _RETRIEVAL_POINTER_BASE {
06417   LARGE_INTEGER FileAreaOffset;
06418 } RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
06419 
06420 typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION {
06421   ULONG VolumeFlags;
06422   ULONG FlagMask;
06423   ULONG Version;
06424   ULONG Reserved;
06425 } FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION;
06426 
06427 typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
06428   CHAR FileSystem[9];
06429 } FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
06430 
06431 #define OPLOCK_LEVEL_CACHE_READ         (0x00000001)
06432 #define OPLOCK_LEVEL_CACHE_HANDLE       (0x00000002)
06433 #define OPLOCK_LEVEL_CACHE_WRITE        (0x00000004)
06434 
06435 #define REQUEST_OPLOCK_INPUT_FLAG_REQUEST               (0x00000001)
06436 #define REQUEST_OPLOCK_INPUT_FLAG_ACK                   (0x00000002)
06437 #define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)
06438 
06439 #define REQUEST_OPLOCK_CURRENT_VERSION          1
06440 
06441 typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
06442   USHORT StructureVersion;
06443   USHORT StructureLength;
06444   ULONG RequestedOplockLevel;
06445   ULONG Flags;
06446 } REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
06447 
06448 #define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED     (0x00000001)
06449 #define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED   (0x00000002)
06450 
06451 typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
06452   USHORT StructureVersion;
06453   USHORT StructureLength;
06454   ULONG OriginalOplockLevel;
06455   ULONG NewOplockLevel;
06456   ULONG Flags;
06457   ACCESS_MASK AccessMode;
06458   USHORT ShareMode;
06459 } REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
06460 
06461 #define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID   1
06462 
06463 typedef struct _SD_CHANGE_MACHINE_SID_INPUT {
06464   USHORT CurrentMachineSIDOffset;
06465   USHORT CurrentMachineSIDLength;
06466   USHORT NewMachineSIDOffset;
06467   USHORT NewMachineSIDLength;
06468 } SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT;
06469 
06470 typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
06471   ULONGLONG NumSDChangedSuccess;
06472   ULONGLONG NumSDChangedFail;
06473   ULONGLONG NumSDUnused;
06474   ULONGLONG NumSDTotal;
06475   ULONGLONG NumMftSDChangedSuccess;
06476   ULONGLONG NumMftSDChangedFail;
06477   ULONGLONG NumMftSDTotal;
06478 } SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT;
06479 
06480 typedef struct _SD_GLOBAL_CHANGE_INPUT {
06481   ULONG Flags;
06482   ULONG ChangeType;
06483   _ANONYMOUS_UNION union {
06484     SD_CHANGE_MACHINE_SID_INPUT SdChange;
06485   } DUMMYUNIONNAME;
06486 } SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT;
06487 
06488 typedef struct _SD_GLOBAL_CHANGE_OUTPUT {
06489   ULONG Flags;
06490   ULONG ChangeType;
06491   _ANONYMOUS_UNION union {
06492     SD_CHANGE_MACHINE_SID_OUTPUT SdChange;
06493   } DUMMYUNIONNAME;
06494 } SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT;
06495 
06496 #define ENCRYPTED_DATA_INFO_SPARSE_FILE    1
06497 
06498 typedef struct _EXTENDED_ENCRYPTED_DATA_INFO {
06499   ULONG ExtendedCode;
06500   ULONG Length;
06501   ULONG Flags;
06502   ULONG Reserved;
06503 } EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO;
06504 
06505 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
06506   ULONG Flags;
06507   ULONG NumberOfClusters;
06508   LARGE_INTEGER Cluster[1];
06509 } LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
06510 
06511 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
06512   ULONG Offset;
06513   ULONG NumberOfMatches;
06514   ULONG BufferSizeRequired;
06515 } LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
06516 
06517 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE          0x00000001
06518 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET    0x00000002
06519 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE     0x00000004
06520 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE    0x00000008
06521 
06522 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK          0xff000000
06523 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA          0x01000000
06524 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX         0x02000000
06525 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM        0x03000000
06526 
06527 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
06528   ULONG OffsetToNext;
06529   ULONG Flags;
06530   LARGE_INTEGER Reserved;
06531   LARGE_INTEGER Cluster;
06532   WCHAR FileName[1];
06533 } LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
06534 
06535 typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
06536   ULONG Flags;
06537   ULONG NumFileTypeIDs;
06538   GUID FileTypeID[1];
06539 } FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT;
06540 
06541 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN     0x00000001
06542 #define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END       0x00000002
06543 
06544 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE,         0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c);
06545 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE,  0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7);
06546 DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE,    0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9);
06547 
06548 #ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
06549 #define _VIRTUAL_STORAGE_TYPE_DEFINED
06550 typedef struct _VIRTUAL_STORAGE_TYPE {
06551   ULONG DeviceId;
06552   GUID VendorId;
06553 } VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
06554 #endif
06555 
06556 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST {
06557   ULONG RequestLevel;
06558   ULONG RequestFlags;
06559 } STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST, *PSTORAGE_QUERY_DEPENDENT_VOLUME_REQUEST;
06560 
06561 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_HOST_VOLUMES    0x1
06562 #define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_GUEST_VOLUMES   0x2
06563 
06564 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY {
06565   ULONG EntryLength;
06566   ULONG DependencyTypeFlags;
06567   ULONG ProviderSpecificFlags;
06568   VIRTUAL_STORAGE_TYPE VirtualStorageType;
06569 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY;
06570 
06571 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY {
06572   ULONG EntryLength;
06573   ULONG DependencyTypeFlags;
06574   ULONG ProviderSpecificFlags;
06575   VIRTUAL_STORAGE_TYPE VirtualStorageType;
06576   ULONG AncestorLevel;
06577   ULONG HostVolumeNameOffset;
06578   ULONG HostVolumeNameSize;
06579   ULONG DependentVolumeNameOffset;
06580   ULONG DependentVolumeNameSize;
06581   ULONG RelativePathOffset;
06582   ULONG RelativePathSize;
06583   ULONG DependentDeviceNameOffset;
06584   ULONG DependentDeviceNameSize;
06585 } STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY;
06586 
06587 typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE {
06588   ULONG ResponseLevel;
06589   ULONG NumberEntries;
06590   _ANONYMOUS_UNION union {
06591     STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[0];
06592     STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[0];
06593   } DUMMYUNIONNAME;
06594 } STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE;
06595 
06596 #endif /* (_WIN32_WINNT >= 0x0601) */
06597 
06598 typedef struct _FILESYSTEM_STATISTICS {
06599   USHORT FileSystemType;
06600   USHORT Version;
06601   ULONG SizeOfCompleteStructure;
06602   ULONG UserFileReads;
06603   ULONG UserFileReadBytes;
06604   ULONG UserDiskReads;
06605   ULONG UserFileWrites;
06606   ULONG UserFileWriteBytes;
06607   ULONG UserDiskWrites;
06608   ULONG MetaDataReads;
06609   ULONG MetaDataReadBytes;
06610   ULONG MetaDataDiskReads;
06611   ULONG MetaDataWrites;
06612   ULONG MetaDataWriteBytes;
06613   ULONG MetaDataDiskWrites;
06614 } FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
06615 
06616 #define FILESYSTEM_STATISTICS_TYPE_NTFS     1
06617 #define FILESYSTEM_STATISTICS_TYPE_FAT      2
06618 #define FILESYSTEM_STATISTICS_TYPE_EXFAT    3
06619 
06620 typedef struct _FAT_STATISTICS {
06621   ULONG CreateHits;
06622   ULONG SuccessfulCreates;
06623   ULONG FailedCreates;
06624   ULONG NonCachedReads;
06625   ULONG NonCachedReadBytes;
06626   ULONG NonCachedWrites;
06627   ULONG NonCachedWriteBytes;
06628   ULONG NonCachedDiskReads;
06629   ULONG NonCachedDiskWrites;
06630 } FAT_STATISTICS, *PFAT_STATISTICS;
06631 
06632 typedef struct _EXFAT_STATISTICS {
06633   ULONG CreateHits;
06634   ULONG SuccessfulCreates;
06635   ULONG FailedCreates;
06636   ULONG NonCachedReads;
06637   ULONG NonCachedReadBytes;
06638   ULONG NonCachedWrites;
06639   ULONG NonCachedWriteBytes;
06640   ULONG NonCachedDiskReads;
06641   ULONG NonCachedDiskWrites;
06642 } EXFAT_STATISTICS, *PEXFAT_STATISTICS;
06643 
06644 typedef struct _NTFS_STATISTICS {
06645   ULONG LogFileFullExceptions;
06646   ULONG OtherExceptions;
06647   ULONG MftReads;
06648   ULONG MftReadBytes;
06649   ULONG MftWrites;
06650   ULONG MftWriteBytes;
06651   struct {
06652     USHORT Write;
06653     USHORT Create;
06654     USHORT SetInfo;
06655     USHORT Flush;
06656   } MftWritesUserLevel;
06657   USHORT MftWritesFlushForLogFileFull;
06658   USHORT MftWritesLazyWriter;
06659   USHORT MftWritesUserRequest;
06660   ULONG Mft2Writes;
06661   ULONG Mft2WriteBytes;
06662   struct {
06663     USHORT Write;
06664     USHORT Create;
06665     USHORT SetInfo;
06666     USHORT Flush;
06667   } Mft2WritesUserLevel;
06668   USHORT Mft2WritesFlushForLogFileFull;
06669   USHORT Mft2WritesLazyWriter;
06670   USHORT Mft2WritesUserRequest;
06671   ULONG RootIndexReads;
06672   ULONG RootIndexReadBytes;
06673   ULONG RootIndexWrites;
06674   ULONG RootIndexWriteBytes;
06675   ULONG BitmapReads;
06676   ULONG BitmapReadBytes;
06677   ULONG BitmapWrites;
06678   ULONG BitmapWriteBytes;
06679   USHORT BitmapWritesFlushForLogFileFull;
06680   USHORT BitmapWritesLazyWriter;
06681   USHORT BitmapWritesUserRequest;
06682   struct {
06683     USHORT Write;
06684     USHORT Create;
06685     USHORT SetInfo;
06686   } BitmapWritesUserLevel;
06687   ULONG MftBitmapReads;
06688   ULONG MftBitmapReadBytes;
06689   ULONG MftBitmapWrites;
06690   ULONG MftBitmapWriteBytes;
06691   USHORT MftBitmapWritesFlushForLogFileFull;
06692   USHORT MftBitmapWritesLazyWriter;
06693   USHORT MftBitmapWritesUserRequest;
06694   struct {
06695     USHORT Write;
06696     USHORT Create;
06697     USHORT SetInfo;
06698     USHORT Flush;
06699   } MftBitmapWritesUserLevel;
06700   ULONG UserIndexReads;
06701   ULONG UserIndexReadBytes;
06702   ULONG UserIndexWrites;
06703   ULONG UserIndexWriteBytes;
06704   ULONG LogFileReads;
06705   ULONG LogFileReadBytes;
06706   ULONG LogFileWrites;
06707   ULONG LogFileWriteBytes;
06708   struct {
06709     ULONG Calls;
06710     ULONG Clusters;
06711     ULONG Hints;
06712     ULONG RunsReturned;
06713     ULONG HintsHonored;
06714     ULONG HintsClusters;
06715     ULONG Cache;
06716     ULONG CacheClusters;
06717     ULONG CacheMiss;
06718     ULONG CacheMissClusters;
06719   } Allocate;
06720 } NTFS_STATISTICS, *PNTFS_STATISTICS;
06721 
06722 #endif /* _FILESYSTEMFSCTL_ */
06723 
06724 #define SYMLINK_FLAG_RELATIVE   1
06725 
06726 typedef struct _REPARSE_DATA_BUFFER {
06727   ULONG ReparseTag;
06728   USHORT ReparseDataLength;
06729   USHORT Reserved;
06730   _ANONYMOUS_UNION union {
06731     struct {
06732       USHORT SubstituteNameOffset;
06733       USHORT SubstituteNameLength;
06734       USHORT PrintNameOffset;
06735       USHORT PrintNameLength;
06736       ULONG Flags;
06737       WCHAR PathBuffer[1];
06738     } SymbolicLinkReparseBuffer;
06739     struct {
06740       USHORT SubstituteNameOffset;
06741       USHORT SubstituteNameLength;
06742       USHORT PrintNameOffset;
06743       USHORT PrintNameLength;
06744       WCHAR PathBuffer[1];
06745     } MountPointReparseBuffer;
06746     struct {
06747       UCHAR DataBuffer[1];
06748     } GenericReparseBuffer;
06749   } DUMMYUNIONNAME;
06750 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
06751 
06752 #define REPARSE_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
06753 
06754 typedef struct _REPARSE_GUID_DATA_BUFFER {
06755   ULONG ReparseTag;
06756   USHORT ReparseDataLength;
06757   USHORT Reserved;
06758   GUID ReparseGuid;
06759   struct {
06760     UCHAR DataBuffer[1];
06761   } GenericReparseBuffer;
06762 } REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
06763 
06764 #define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE   FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
06765 
06766 #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE      ( 16 * 1024 )
06767 
06768 /* Reserved reparse tags */
06769 #define IO_REPARSE_TAG_RESERVED_ZERO            (0)
06770 #define IO_REPARSE_TAG_RESERVED_ONE             (1)
06771 #define IO_REPARSE_TAG_RESERVED_RANGE           IO_REPARSE_TAG_RESERVED_ONE
06772 
06773 #define IsReparseTagMicrosoft(_tag)             (((_tag) & 0x80000000))
06774 #define IsReparseTagNameSurrogate(_tag)         (((_tag) & 0x20000000))
06775 
06776 #define IO_REPARSE_TAG_VALID_VALUES             (0xF000FFFF)
06777 
06778 #define IsReparseTagValid(tag) (                               \
06779                   !((tag) & ~IO_REPARSE_TAG_VALID_VALUES) &&   \
06780                   ((tag) > IO_REPARSE_TAG_RESERVED_RANGE)      \
06781                 )
06782 
06783 /* MicroSoft reparse point tags */
06784 #define IO_REPARSE_TAG_MOUNT_POINT              (0xA0000003L)
06785 #define IO_REPARSE_TAG_HSM                      (0xC0000004L)
06786 #define IO_REPARSE_TAG_DRIVE_EXTENDER           (0x80000005L)
06787 #define IO_REPARSE_TAG_HSM2                     (0x80000006L)
06788 #define IO_REPARSE_TAG_SIS                      (0x80000007L)
06789 #define IO_REPARSE_TAG_WIM                      (0x80000008L)
06790 #define IO_REPARSE_TAG_CSV                      (0x80000009L)
06791 #define IO_REPARSE_TAG_DFS                      (0x8000000AL)
06792 #define IO_REPARSE_TAG_FILTER_MANAGER           (0x8000000BL)
06793 #define IO_REPARSE_TAG_SYMLINK                  (0xA000000CL)
06794 #define IO_REPARSE_TAG_IIS_CACHE                (0xA0000010L)
06795 #define IO_REPARSE_TAG_DFSR                     (0x80000012L)
06796 
06797 #pragma pack(4)
06798 typedef struct _REPARSE_INDEX_KEY {
06799   ULONG FileReparseTag;
06800   LARGE_INTEGER FileId;
06801 } REPARSE_INDEX_KEY, *PREPARSE_INDEX_KEY;
06802 #pragma pack()
06803 
06804 #define FSCTL_LMR_GET_LINK_TRACKING_INFORMATION   CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,58,METHOD_BUFFERED,FILE_ANY_ACCESS)
06805 #define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION   CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS)
06806 #define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
06807 
06808 #define FSCTL_PIPE_ASSIGN_EVENT             CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
06809 #define FSCTL_PIPE_DISCONNECT               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
06810 #define FSCTL_PIPE_LISTEN                   CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
06811 #define FSCTL_PIPE_PEEK                     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
06812 #define FSCTL_PIPE_QUERY_EVENT              CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
06813 #define FSCTL_PIPE_TRANSCEIVE               CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER,  FILE_READ_DATA | FILE_WRITE_DATA)
06814 #define FSCTL_PIPE_WAIT                     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
06815 #define FSCTL_PIPE_IMPERSONATE              CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
06816 #define FSCTL_PIPE_SET_CLIENT_PROCESS       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
06817 #define FSCTL_PIPE_QUERY_CLIENT_PROCESS     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
06818 #define FSCTL_PIPE_GET_PIPE_ATTRIBUTE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
06819 #define FSCTL_PIPE_SET_PIPE_ATTRIBUTE       CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
06820 #define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
06821 #define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
06822 #define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
06823 #define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
06824 #define FSCTL_PIPE_FLUSH                    CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)
06825 
06826 #define FSCTL_PIPE_INTERNAL_READ            CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
06827 #define FSCTL_PIPE_INTERNAL_WRITE           CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
06828 #define FSCTL_PIPE_INTERNAL_TRANSCEIVE      CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
06829 #define FSCTL_PIPE_INTERNAL_READ_OVFLOW     CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
06830 
06831 #define FILE_PIPE_READ_DATA                 0x00000000
06832 #define FILE_PIPE_WRITE_SPACE               0x00000001
06833 
06834 typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
06835   HANDLE EventHandle;
06836   ULONG KeyValue;
06837 } FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;
06838 
06839 typedef struct _FILE_PIPE_EVENT_BUFFER {
06840   ULONG NamedPipeState;
06841   ULONG EntryType;
06842   ULONG ByteCount;
06843   ULONG KeyValue;
06844   ULONG NumberRequests;
06845 } FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;
06846 
06847 typedef struct _FILE_PIPE_PEEK_BUFFER {
06848   ULONG NamedPipeState;
06849   ULONG ReadDataAvailable;
06850   ULONG NumberOfMessages;
06851   ULONG MessageLength;
06852   CHAR Data[1];
06853 } FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
06854 
06855 typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
06856   LARGE_INTEGER Timeout;
06857   ULONG NameLength;
06858   BOOLEAN TimeoutSpecified;
06859   WCHAR Name[1];
06860 } FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
06861 
06862 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
06863 #if !defined(BUILD_WOW6432)
06864   PVOID ClientSession;
06865   PVOID ClientProcess;
06866 #else
06867   ULONGLONG ClientSession;
06868   ULONGLONG ClientProcess;
06869 #endif
06870 } FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;
06871 
06872 #define FILE_PIPE_COMPUTER_NAME_LENGTH 15
06873 
06874 typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX {
06875 #if !defined(BUILD_WOW6432)
06876   PVOID ClientSession;
06877   PVOID ClientProcess;
06878 #else
06879   ULONGLONG ClientSession;
06880   ULONGLONG ClientProcess;
06881 #endif
06882   USHORT ClientComputerNameLength;
06883   WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH+1];
06884 } FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX;
06885 
06886 #define FSCTL_MAILSLOT_PEEK             CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
06887 
06888 typedef enum _LINK_TRACKING_INFORMATION_TYPE {
06889   NtfsLinkTrackingInformation,
06890   DfsLinkTrackingInformation
06891 } LINK_TRACKING_INFORMATION_TYPE, *PLINK_TRACKING_INFORMATION_TYPE;
06892 
06893 typedef struct _LINK_TRACKING_INFORMATION {
06894   LINK_TRACKING_INFORMATION_TYPE Type;
06895   UCHAR VolumeId[16];
06896 } LINK_TRACKING_INFORMATION, *PLINK_TRACKING_INFORMATION;
06897 
06898 typedef struct _REMOTE_LINK_TRACKING_INFORMATION {
06899   PVOID TargetFileObject;
06900   ULONG TargetLinkTrackingInformationLength;
06901   UCHAR TargetLinkTrackingInformationBuffer[1];
06902 } REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION;
06903 
06904 #define IO_OPEN_PAGING_FILE                 0x0002
06905 #define IO_OPEN_TARGET_DIRECTORY            0x0004
06906 #define IO_STOP_ON_SYMLINK                  0x0008
06907 #define IO_MM_PAGING_FILE                   0x0010
06908 
06909 typedef VOID
06910 (NTAPI *PDRIVER_FS_NOTIFICATION) (
06911   _In_ PDEVICE_OBJECT DeviceObject,
06912   _In_ BOOLEAN FsActive);
06913 
06914 typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
06915   SyncTypeOther = 0,
06916   SyncTypeCreateSection
06917 } FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
06918 
06919 typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
06920   NotifyTypeCreate = 0,
06921   NotifyTypeRetired
06922 } FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
06923 
06924 typedef union _FS_FILTER_PARAMETERS {
06925   struct {
06926     PLARGE_INTEGER EndingOffset;
06927     PERESOURCE *ResourceToRelease;
06928   } AcquireForModifiedPageWriter;
06929   struct {
06930     PERESOURCE ResourceToRelease;
06931   } ReleaseForModifiedPageWriter;
06932   struct {
06933     FS_FILTER_SECTION_SYNC_TYPE SyncType;
06934     ULONG PageProtection;
06935   } AcquireForSectionSynchronization;
06936   struct {
06937     FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
06938     BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
06939   } NotifyStreamFileObject;
06940   struct {
06941     PVOID Argument1;
06942     PVOID Argument2;
06943     PVOID Argument3;
06944     PVOID Argument4;
06945     PVOID Argument5;
06946   } Others;
06947 } FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
06948 
06949 #define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION      (UCHAR)-1
06950 #define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION      (UCHAR)-2
06951 #define FS_FILTER_ACQUIRE_FOR_MOD_WRITE                    (UCHAR)-3
06952 #define FS_FILTER_RELEASE_FOR_MOD_WRITE                    (UCHAR)-4
06953 #define FS_FILTER_ACQUIRE_FOR_CC_FLUSH                     (UCHAR)-5
06954 #define FS_FILTER_RELEASE_FOR_CC_FLUSH                     (UCHAR)-6
06955 
06956 typedef struct _FS_FILTER_CALLBACK_DATA {
06957   ULONG SizeOfFsFilterCallbackData;
06958   UCHAR Operation;
06959   UCHAR Reserved;
06960   struct _DEVICE_OBJECT *DeviceObject;
06961   struct _FILE_OBJECT *FileObject;
06962   FS_FILTER_PARAMETERS Parameters;
06963 } FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
06964 
06965 typedef NTSTATUS
06966 (NTAPI *PFS_FILTER_CALLBACK) (
06967   _In_ PFS_FILTER_CALLBACK_DATA Data,
06968   _Out_ PVOID *CompletionContext);
06969 
06970 typedef VOID
06971 (NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
06972   _In_ PFS_FILTER_CALLBACK_DATA Data,
06973   _In_ NTSTATUS OperationStatus,
06974   _In_ PVOID CompletionContext);
06975 
06976 typedef struct _FS_FILTER_CALLBACKS {
06977   ULONG SizeOfFsFilterCallbacks;
06978   ULONG Reserved;
06979   PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
06980   PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
06981   PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
06982   PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
06983   PFS_FILTER_CALLBACK PreAcquireForCcFlush;
06984   PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
06985   PFS_FILTER_CALLBACK PreReleaseForCcFlush;
06986   PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
06987   PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
06988   PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
06989   PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
06990   PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
06991 } FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
06992 
06993 #if (NTDDI_VERSION >= NTDDI_WINXP)
06994 NTKERNELAPI
06995 NTSTATUS
06996 NTAPI
06997 FsRtlRegisterFileSystemFilterCallbacks(
06998   _In_ struct _DRIVER_OBJECT *FilterDriverObject,
06999   _In_ PFS_FILTER_CALLBACKS Callbacks);
07000 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
07001 
07002 #if (NTDDI_VERSION >= NTDDI_VISTA)
07003 NTKERNELAPI
07004 NTSTATUS
07005 NTAPI
07006 FsRtlNotifyStreamFileObject(
07007   _In_ struct _FILE_OBJECT * StreamFileObject,
07008   _In_opt_ struct _DEVICE_OBJECT *DeviceObjectHint,
07009   _In_ FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
07010   _In_ BOOLEAN SafeToRecurse);
07011 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
07012 
07013 #define DO_VERIFY_VOLUME                    0x00000002
07014 #define DO_BUFFERED_IO                      0x00000004
07015 #define DO_EXCLUSIVE                        0x00000008
07016 #define DO_DIRECT_IO                        0x00000010
07017 #define DO_MAP_IO_BUFFER                    0x00000020
07018 #define DO_DEVICE_HAS_NAME                  0x00000040
07019 #define DO_DEVICE_INITIALIZING              0x00000080
07020 #define DO_SYSTEM_BOOT_PARTITION            0x00000100
07021 #define DO_LONG_TERM_REQUESTS               0x00000200
07022 #define DO_NEVER_LAST_DEVICE                0x00000400
07023 #define DO_SHUTDOWN_REGISTERED              0x00000800
07024 #define DO_BUS_ENUMERATED_DEVICE            0x00001000
07025 #define DO_POWER_PAGABLE                    0x00002000
07026 #define DO_POWER_INRUSH                     0x00004000
07027 #define DO_LOW_PRIORITY_FILESYSTEM          0x00010000
07028 #define DO_SUPPORTS_TRANSACTIONS            0x00040000
07029 #define DO_FORCE_NEITHER_IO                 0x00080000
07030 #define DO_VOLUME_DEVICE_OBJECT             0x00100000
07031 #define DO_SYSTEM_SYSTEM_PARTITION          0x00200000
07032 #define DO_SYSTEM_CRITICAL_PARTITION        0x00400000
07033 #define DO_DISALLOW_EXECUTE                 0x00800000
07034 
07035 extern KSPIN_LOCK                   IoStatisticsLock;
07036 extern ULONG                        IoReadOperationCount;
07037 extern ULONG                        IoWriteOperationCount;
07038 extern ULONG                        IoOtherOperationCount;
07039 extern LARGE_INTEGER                IoReadTransferCount;
07040 extern LARGE_INTEGER                IoWriteTransferCount;
07041 extern LARGE_INTEGER                IoOtherTransferCount;
07042 
07043 #define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE    64
07044 #define IO_FILE_OBJECT_PAGED_POOL_CHARGE        1024
07045 
07046 #if (NTDDI_VERSION >= NTDDI_VISTA)
07047 typedef struct _IO_PRIORITY_INFO {
07048   ULONG Size;
07049   ULONG ThreadPriority;
07050   ULONG PagePriority;
07051   IO_PRIORITY_HINT IoPriority;
07052 } IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
07053 #endif
07054 $endif (_NTIFS_)

Generated on Sat May 26 2012 04:29:36 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.