1 /******************************************************************************
2 * I/O Manager Functions *
3 ******************************************************************************/
9 READ_PORT_BUFFER_UCHAR(
17 READ_PORT_BUFFER_ULONG(
25 READ_PORT_BUFFER_USHORT(
51 READ_REGISTER_BUFFER_UCHAR(
59 READ_REGISTER_BUFFER_ULONG(
67 READ_REGISTER_BUFFER_USHORT(
93 WRITE_PORT_BUFFER_UCHAR(
101 WRITE_PORT_BUFFER_ULONG(
109 WRITE_PORT_BUFFER_USHORT(
138 WRITE_REGISTER_BUFFER_UCHAR(
146 WRITE_REGISTER_BUFFER_ULONG(
154 WRITE_REGISTER_BUFFER_USHORT(
162 WRITE_REGISTER_UCHAR(
169 WRITE_REGISTER_ULONG(
176 WRITE_REGISTER_USHORT(
184 READ_PORT_BUFFER_UCHAR(
189 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
194 READ_PORT_BUFFER_ULONG(
199 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
204 READ_PORT_BUFFER_USHORT(
209 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
217 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
225 return __indword((USHORT
)(ULONG_PTR
)Port
);
233 return __inword((USHORT
)(ULONG_PTR
)Port
);
238 READ_REGISTER_BUFFER_UCHAR(
243 __movsb(Register
, Buffer
, Count
);
248 READ_REGISTER_BUFFER_ULONG(
253 __movsd(Register
, Buffer
, Count
);
258 READ_REGISTER_BUFFER_USHORT(
263 __movsw(Register
, Buffer
, Count
);
269 IN
volatile UCHAR
*Register
)
277 IN
volatile ULONG
*Register
)
284 READ_REGISTER_USHORT(
285 IN
volatile USHORT
*Register
)
292 WRITE_PORT_BUFFER_UCHAR(
297 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
302 WRITE_PORT_BUFFER_ULONG(
307 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
312 WRITE_PORT_BUFFER_USHORT(
317 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
326 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
335 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
344 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
349 WRITE_REGISTER_BUFFER_UCHAR(
355 __movsb(Register
, Buffer
, Count
);
356 InterlockedOr(&Synch
, 1);
361 WRITE_REGISTER_BUFFER_ULONG(
367 __movsd(Register
, Buffer
, Count
);
368 InterlockedOr(&Synch
, 1);
373 WRITE_REGISTER_BUFFER_USHORT(
379 __movsw(Register
, Buffer
, Count
);
380 InterlockedOr(&Synch
, 1);
385 WRITE_REGISTER_UCHAR(
386 IN
volatile UCHAR
*Register
,
391 InterlockedOr(&Synch
, 1);
396 WRITE_REGISTER_ULONG(
397 IN
volatile ULONG
*Register
,
402 InterlockedOr(&Synch
, 1);
407 WRITE_REGISTER_USHORT(
408 IN
volatile USHORT
*Register
,
413 InterlockedOr(&Sync
, 1);
417 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
418 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
420 #define DMA_MACROS_DEFINED
424 IoAllocateAdapterChannel(
425 IN PDMA_ADAPTER DmaAdapter
,
426 IN PDEVICE_OBJECT DeviceObject
,
427 IN ULONG NumberOfMapRegisters
,
428 IN PDRIVER_CONTROL ExecutionRoutine
,
431 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
432 AllocateAdapterChannel
=
433 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
434 ASSERT(AllocateAdapterChannel
);
435 return AllocateAdapterChannel(DmaAdapter
,
437 NumberOfMapRegisters
,
445 IoFlushAdapterBuffers(
446 IN PDMA_ADAPTER DmaAdapter
,
448 IN PVOID MapRegisterBase
,
451 IN BOOLEAN WriteToDevice
)
453 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
454 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
455 ASSERT(FlushAdapterBuffers
);
456 return FlushAdapterBuffers(DmaAdapter
,
467 IoFreeAdapterChannel(
468 IN PDMA_ADAPTER DmaAdapter
)
470 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
471 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
472 ASSERT(FreeAdapterChannel
);
473 FreeAdapterChannel(DmaAdapter
);
480 IN PDMA_ADAPTER DmaAdapter
,
481 IN PVOID MapRegisterBase
,
482 IN ULONG NumberOfMapRegisters
)
484 PFREE_MAP_REGISTERS FreeMapRegisters
;
485 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
486 ASSERT(FreeMapRegisters
);
487 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
494 IN PDMA_ADAPTER DmaAdapter
,
496 IN PVOID MapRegisterBase
,
498 IN OUT PULONG Length
,
499 IN BOOLEAN WriteToDevice
)
501 PMAP_TRANSFER MapTransfer
;
503 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
505 return MapTransfer(DmaAdapter
,
514 #if (NTDDI_VERSION >= NTDDI_WIN2K)
519 IoAcquireCancelSpinLock(
525 IoAcquireRemoveLockEx(
526 IN PIO_REMOVE_LOCK RemoveLock
,
527 IN PVOID Tag OPTIONAL
,
530 IN ULONG RemlockSize
);
536 * IoAcquireRemoveLock(
537 * IN PIO_REMOVE_LOCK RemoveLock,
538 * IN OPTIONAL PVOID Tag)
541 #define IoAcquireRemoveLock(RemoveLock, Tag) \
542 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
544 #define IoAcquireRemoveLock(RemoveLock, Tag) \
545 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
550 * IoAdjustPagingPathCount(
552 * IN BOOLEAN Increment)
554 #define IoAdjustPagingPathCount(_Count, \
559 InterlockedIncrement(_Count); \
563 InterlockedDecrement(_Count); \
567 #if (NTDDI_VERSION >= NTDDI_WIN2K)
572 IoAllocateDriverObjectExtension(
573 IN PDRIVER_OBJECT DriverObject
,
574 IN PVOID ClientIdentificationAddress
,
575 IN ULONG DriverObjectExtensionSize
,
576 OUT PVOID
*DriverObjectExtension
);
581 IoAllocateErrorLogEntry(
590 IN BOOLEAN ChargeQuota
);
596 IN PVOID VirtualAddress OPTIONAL
,
598 IN BOOLEAN SecondaryBuffer
,
599 IN BOOLEAN ChargeQuota
,
600 IN OUT PIRP Irp OPTIONAL
);
606 IN PDEVICE_OBJECT DeviceObject
);
612 IN PDEVICE_OBJECT SourceDevice
,
613 IN PUNICODE_STRING TargetDevice
,
614 OUT PDEVICE_OBJECT
*AttachedDevice
);
619 IoAttachDeviceToDeviceStack(
620 IN PDEVICE_OBJECT SourceDevice
,
621 IN PDEVICE_OBJECT TargetDevice
);
626 IoBuildAsynchronousFsdRequest(
627 IN ULONG MajorFunction
,
628 IN PDEVICE_OBJECT DeviceObject
,
629 IN OUT PVOID Buffer OPTIONAL
,
630 IN ULONG Length OPTIONAL
,
631 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
632 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
637 IoBuildDeviceIoControlRequest(
638 IN ULONG IoControlCode
,
639 IN PDEVICE_OBJECT DeviceObject
,
640 IN PVOID InputBuffer OPTIONAL
,
641 IN ULONG InputBufferLength
,
642 OUT PVOID OutputBuffer OPTIONAL
,
643 IN ULONG OutputBufferLength
,
644 IN BOOLEAN InternalDeviceIoControl
,
646 OUT PIO_STATUS_BLOCK IoStatusBlock
);
653 IN OUT PMDL TargetMdl
,
654 IN PVOID VirtualAddress
,
660 IoBuildSynchronousFsdRequest(
661 IN ULONG MajorFunction
,
662 IN PDEVICE_OBJECT DeviceObject
,
663 IN OUT PVOID Buffer OPTIONAL
,
664 IN ULONG Length OPTIONAL
,
665 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
667 OUT PIO_STATUS_BLOCK IoStatusBlock
);
673 IN PDEVICE_OBJECT DeviceObject
,
675 #define IoCallDriver IofCallDriver
682 IN CCHAR PriorityBoost
);
683 #define IoCompleteRequest IofCompleteRequest
695 IN ACCESS_MASK DesiredAccess
,
696 IN ULONG DesiredShareAccess
,
697 IN OUT PFILE_OBJECT FileObject
,
698 IN OUT PSHARE_ACCESS ShareAccess
,
706 IN CCHAR PriorityBoost
);
712 OUT PKINTERRUPT
*InterruptObject
,
713 IN PKSERVICE_ROUTINE ServiceRoutine
,
714 IN PVOID ServiceContext OPTIONAL
,
715 IN PKSPIN_LOCK SpinLock OPTIONAL
,
718 IN KIRQL SynchronizeIrql
,
719 IN KINTERRUPT_MODE InterruptMode
,
720 IN BOOLEAN ShareVector
,
721 IN KAFFINITY ProcessorEnableMask
,
722 IN BOOLEAN FloatingSave
);
728 IN PDRIVER_OBJECT DriverObject
,
729 IN ULONG DeviceExtensionSize
,
730 IN PUNICODE_STRING DeviceName OPTIONAL
,
731 IN DEVICE_TYPE DeviceType
,
732 IN ULONG DeviceCharacteristics
,
733 IN BOOLEAN Exclusive
,
734 OUT PDEVICE_OBJECT
*DeviceObject
);
740 OUT PHANDLE FileHandle
,
741 IN ACCESS_MASK DesiredAccess
,
742 IN POBJECT_ATTRIBUTES ObjectAttributes
,
743 OUT PIO_STATUS_BLOCK IoStatusBlock
,
744 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
745 IN ULONG FileAttributes
,
746 IN ULONG ShareAccess
,
747 IN ULONG Disposition
,
748 IN ULONG CreateOptions
,
749 IN PVOID EaBuffer OPTIONAL
,
751 IN CREATE_FILE_TYPE CreateFileType
,
752 IN PVOID InternalParameters OPTIONAL
,
758 IoCreateNotificationEvent(
759 IN PUNICODE_STRING EventName
,
760 OUT PHANDLE EventHandle
);
765 IoCreateSymbolicLink(
766 IN PUNICODE_STRING SymbolicLinkName
,
767 IN PUNICODE_STRING DeviceName
);
772 IoCreateSynchronizationEvent(
773 IN PUNICODE_STRING EventName
,
774 OUT PHANDLE EventHandle
);
779 IoCreateUnprotectedSymbolicLink(
780 IN PUNICODE_STRING SymbolicLinkName
,
781 IN PUNICODE_STRING DeviceName
);
787 IN PDEVICE_OBJECT DeviceObject
);
792 IoDeleteSymbolicLink(
793 IN PUNICODE_STRING SymbolicLinkName
);
799 IN OUT PDEVICE_OBJECT TargetDevice
);
804 IoDisconnectInterrupt(
805 IN PKINTERRUPT InterruptObject
);
823 IN PIO_WORKITEM IoWorkItem
);
829 IN PDEVICE_OBJECT DeviceObject
);
834 IoGetAttachedDeviceReference(
835 IN PDEVICE_OBJECT DeviceObject
);
840 IoGetBootDiskInformation(
841 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
847 IoGetDeviceInterfaceAlias(
848 IN PUNICODE_STRING SymbolicLinkName
,
849 IN CONST GUID
*AliasInterfaceClassGuid
,
850 OUT PUNICODE_STRING AliasSymbolicLinkName
);
855 IoGetCurrentProcess(VOID
);
860 IoGetDeviceInterfaces(
861 IN CONST GUID
*InterfaceClassGuid
,
862 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
864 OUT PWSTR
*SymbolicLinkList
);
869 IoGetDeviceObjectPointer(
870 IN PUNICODE_STRING ObjectName
,
871 IN ACCESS_MASK DesiredAccess
,
872 OUT PFILE_OBJECT
*FileObject
,
873 OUT PDEVICE_OBJECT
*DeviceObject
);
879 IN PDEVICE_OBJECT DeviceObject
,
880 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
881 IN ULONG BufferLength
,
882 OUT PVOID PropertyBuffer
,
883 OUT PULONG ResultLength
);
889 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
890 IN PDEVICE_DESCRIPTION DeviceDescription
,
891 IN OUT PULONG NumberOfMapRegisters
);
896 IoGetDriverObjectExtension(
897 IN PDRIVER_OBJECT DriverObject
,
898 IN PVOID ClientIdentificationAddress
);
903 IoGetInitialStack(VOID
);
908 IoGetRelatedDeviceObject(
909 IN PFILE_OBJECT FileObject
);
915 IN PIO_WORKITEM IoWorkItem
,
916 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
917 IN WORK_QUEUE_TYPE QueueType
,
918 IN PVOID Context OPTIONAL
);
925 IN USHORT PacketSize
,
931 IoInitializeRemoveLockEx(
932 IN PIO_REMOVE_LOCK Lock
,
933 IN ULONG AllocateTag
,
934 IN ULONG MaxLockedMinutes
,
935 IN ULONG HighWatermark
,
936 IN ULONG RemlockSize
);
942 IN PDEVICE_OBJECT DeviceObject
,
943 IN PIO_TIMER_ROUTINE TimerRoutine
,
944 IN PVOID Context OPTIONAL
);
949 IoInvalidateDeviceRelations(
950 IN PDEVICE_OBJECT DeviceObject
,
951 IN DEVICE_RELATION_TYPE Type
);
956 IoInvalidateDeviceState(
957 IN PDEVICE_OBJECT PhysicalDeviceObject
);
962 IoIsWdmVersionAvailable(
963 IN UCHAR MajorVersion
,
964 IN UCHAR MinorVersion
);
969 IoOpenDeviceInterfaceRegistryKey(
970 IN PUNICODE_STRING SymbolicLinkName
,
971 IN ACCESS_MASK DesiredAccess
,
972 OUT PHANDLE DeviceInterfaceKey
);
977 IoOpenDeviceRegistryKey(
978 IN PDEVICE_OBJECT DeviceObject
,
979 IN ULONG DevInstKeyType
,
980 IN ACCESS_MASK DesiredAccess
,
981 OUT PHANDLE DevInstRegKey
);
986 IoRegisterDeviceInterface(
987 IN PDEVICE_OBJECT PhysicalDeviceObject
,
988 IN CONST GUID
*InterfaceClassGuid
,
989 IN PUNICODE_STRING ReferenceString OPTIONAL
,
990 OUT PUNICODE_STRING SymbolicLinkName
);
995 IoRegisterPlugPlayNotification(
996 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
997 IN ULONG EventCategoryFlags
,
998 IN PVOID EventCategoryData OPTIONAL
,
999 IN PDRIVER_OBJECT DriverObject
,
1000 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
1001 IN OUT PVOID Context OPTIONAL
,
1002 OUT PVOID
*NotificationEntry
);
1007 IoRegisterShutdownNotification(
1008 IN PDEVICE_OBJECT DeviceObject
);
1013 IoReleaseCancelSpinLock(
1019 IoReleaseRemoveLockAndWaitEx(
1020 IN PIO_REMOVE_LOCK RemoveLock
,
1021 IN PVOID Tag OPTIONAL
,
1022 IN ULONG RemlockSize
);
1027 IoReleaseRemoveLockEx(
1028 IN PIO_REMOVE_LOCK RemoveLock
,
1029 IN PVOID Tag OPTIONAL
,
1030 IN ULONG RemlockSize
);
1035 IoRemoveShareAccess(
1036 IN PFILE_OBJECT FileObject
,
1037 IN OUT PSHARE_ACCESS ShareAccess
);
1042 IoReportTargetDeviceChange(
1043 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1044 IN PVOID NotificationStructure
);
1049 IoReportTargetDeviceChangeAsynchronous(
1050 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1051 IN PVOID NotificationStructure
,
1052 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
1053 IN PVOID Context OPTIONAL
);
1058 IoRequestDeviceEject(
1059 IN PDEVICE_OBJECT PhysicalDeviceObject
);
1066 IN NTSTATUS Status
);
1071 IoSetDeviceInterfaceState(
1072 IN PUNICODE_STRING SymbolicLinkName
,
1079 IN ACCESS_MASK DesiredAccess
,
1080 IN ULONG DesiredShareAccess
,
1081 IN OUT PFILE_OBJECT FileObject
,
1082 OUT PSHARE_ACCESS ShareAccess
);
1088 IN PDEVICE_OBJECT DeviceObject
,
1089 IN BOOLEAN Cancelable
);
1094 IoStartNextPacketByKey(
1095 IN PDEVICE_OBJECT DeviceObject
,
1096 IN BOOLEAN Cancelable
,
1103 IN PDEVICE_OBJECT DeviceObject
,
1105 IN PULONG Key OPTIONAL
,
1106 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
1112 IN PDEVICE_OBJECT DeviceObject
);
1118 IN PDEVICE_OBJECT DeviceObject
);
1123 IoUnregisterPlugPlayNotification(
1124 IN PVOID NotificationEntry
);
1129 IoUnregisterShutdownNotification(
1130 IN PDEVICE_OBJECT DeviceObject
);
1135 IoUpdateShareAccess(
1136 IN PFILE_OBJECT FileObject
,
1137 IN OUT PSHARE_ACCESS ShareAccess
);
1142 IoWMIAllocateInstanceIds(
1144 IN ULONG InstanceCount
,
1145 OUT ULONG
*FirstInstanceId
);
1150 IoWMIQuerySingleInstanceMultiple(
1151 IN PVOID
*DataBlockObjectList
,
1152 IN PUNICODE_STRING InstanceNames
,
1153 IN ULONG ObjectCount
,
1154 IN OUT ULONG
*InOutBufferSize
,
1155 OUT PVOID OutBuffer
);
1160 IoWMIRegistrationControl(
1161 IN PDEVICE_OBJECT DeviceObject
,
1167 IoWMISuggestInstanceName(
1168 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
1169 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
1170 IN BOOLEAN CombineNames
,
1171 OUT PUNICODE_STRING SuggestedInstanceName
);
1177 IN OUT PVOID WnodeEventItem
);
1182 IoWriteErrorLogEntry(
1188 IoGetTopLevelIrp(VOID
);
1193 IoRegisterLastChanceShutdownNotification(
1194 IN PDEVICE_OBJECT DeviceObject
);
1200 IN PIRP Irp OPTIONAL
);
1202 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1204 #if (NTDDI_VERSION >= NTDDI_WINXP)
1211 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
1212 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
1213 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
1214 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
1215 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
1216 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
1224 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
);
1231 IN PIO_CSQ_IRP_CONTEXT Context
);
1238 IN PVOID PeekContext OPTIONAL
);
1243 IoForwardIrpSynchronously(
1244 IN PDEVICE_OBJECT DeviceObject
,
1247 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
1252 IoFreeErrorLogEntry(
1258 IoSetCompletionRoutineEx(
1259 IN PDEVICE_OBJECT DeviceObject
,
1261 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
1263 IN BOOLEAN InvokeOnSuccess
,
1264 IN BOOLEAN InvokeOnError
,
1265 IN BOOLEAN InvokeOnCancel
);
1269 IoSetStartIoAttributes(
1270 IN PDEVICE_OBJECT DeviceObject
,
1271 IN BOOLEAN DeferredStartIo
,
1272 IN BOOLEAN NonCancelable
);
1277 IoWMIDeviceObjectToInstanceName(
1278 IN PVOID DataBlockObject
,
1279 IN PDEVICE_OBJECT DeviceObject
,
1280 OUT PUNICODE_STRING InstanceName
);
1286 IN PVOID DataBlockObject
,
1287 IN PUNICODE_STRING InstanceName
,
1289 IN ULONG InBufferSize
,
1290 IN OUT PULONG OutBufferSize
,
1291 IN OUT PUCHAR InOutBuffer
);
1296 IoWMIHandleToInstanceName(
1297 IN PVOID DataBlockObject
,
1298 IN HANDLE FileHandle
,
1299 OUT PUNICODE_STRING InstanceName
);
1305 IN GUID
*DataBlockGuid
,
1306 IN ULONG DesiredAccess
,
1307 OUT PVOID
*DataBlockObject
);
1313 IN PVOID DataBlockObject
,
1314 IN OUT ULONG
*InOutBufferSize
,
1315 OUT PVOID OutBuffer
);
1320 IoWMIQueryAllDataMultiple(
1321 IN PVOID
*DataBlockObjectList
,
1322 IN ULONG ObjectCount
,
1323 IN OUT ULONG
*InOutBufferSize
,
1324 OUT PVOID OutBuffer
);
1329 IoWMIQuerySingleInstance(
1330 IN PVOID DataBlockObject
,
1331 IN PUNICODE_STRING InstanceName
,
1332 IN OUT ULONG
*InOutBufferSize
,
1333 OUT PVOID OutBuffer
);
1338 IoWMISetNotificationCallback(
1339 IN OUT PVOID Object
,
1340 IN WMI_NOTIFICATION_CALLBACK Callback
,
1341 IN PVOID Context OPTIONAL
);
1346 IoWMISetSingleInstance(
1347 IN PVOID DataBlockObject
,
1348 IN PUNICODE_STRING InstanceName
,
1350 IN ULONG ValueBufferSize
,
1351 IN PVOID ValueBuffer
);
1357 IN PVOID DataBlockObject
,
1358 IN PUNICODE_STRING InstanceName
,
1359 IN ULONG DataItemId
,
1361 IN ULONG ValueBufferSize
,
1362 IN PVOID ValueBuffer
);
1364 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1366 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
1370 IoValidateDeviceIoControlAccess(
1372 IN ULONG RequiredAccess
);
1375 #if (NTDDI_VERSION >= NTDDI_WS03)
1382 IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp
,
1383 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
1384 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
1385 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
1386 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
1387 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
1395 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
,
1396 IN PVOID InsertContext OPTIONAL
);
1400 #if (NTDDI_VERSION >= NTDDI_VISTA)
1405 IoGetBootDiskInformationLite(
1406 OUT PBOOTDISK_INFORMATION_LITE
*BootDiskInformation
);
1411 IoCheckShareAccessEx(
1412 IN ACCESS_MASK DesiredAccess
,
1413 IN ULONG DesiredShareAccess
,
1414 IN OUT PFILE_OBJECT FileObject
,
1415 IN OUT PSHARE_ACCESS ShareAccess
,
1417 IN PBOOLEAN WritePermission
);
1422 IoConnectInterruptEx(
1423 IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters
);
1428 IoDisconnectInterruptEx(
1429 IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters
);
1433 IoWithinStackLimits(
1434 IN ULONG_PTR RegionStart
,
1435 IN SIZE_T RegionSize
);
1441 IN ACCESS_MASK DesiredAccess
,
1442 IN ULONG DesiredShareAccess
,
1443 IN OUT PFILE_OBJECT FileObject
,
1444 OUT PSHARE_ACCESS ShareAccess
,
1445 IN PBOOLEAN WritePermission
);
1449 IoSizeofWorkItem(VOID
);
1453 IoInitializeWorkItem(
1455 IN PIO_WORKITEM IoWorkItem
);
1459 IoUninitializeWorkItem(
1460 IN PIO_WORKITEM IoWorkItem
);
1465 IN PIO_WORKITEM IoWorkItem
,
1466 IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine
,
1467 IN WORK_QUEUE_TYPE QueueType
,
1468 IN PVOID Context OPTIONAL
);
1472 IoGetIoPriorityHint(
1477 IoSetIoPriorityHint(
1479 IN IO_PRIORITY_HINT PriorityHint
);
1483 IoAllocateSfioStreamIdentifier(
1484 IN PFILE_OBJECT FileObject
,
1487 OUT PVOID
*StreamIdentifier
);
1491 IoGetSfioStreamIdentifier(
1492 IN PFILE_OBJECT FileObject
,
1493 IN PVOID Signature
);
1497 IoFreeSfioStreamIdentifier(
1498 IN PFILE_OBJECT FileObject
,
1499 IN PVOID Signature
);
1504 IoRequestDeviceEjectEx(
1505 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1506 IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL
,
1507 IN PVOID Context OPTIONAL
,
1508 IN PDRIVER_OBJECT DriverObject OPTIONAL
);
1513 IoSetDevicePropertyData(
1514 IN PDEVICE_OBJECT Pdo
,
1515 IN CONST DEVPROPKEY
*PropertyKey
,
1518 IN DEVPROPTYPE Type
,
1520 IN PVOID Data OPTIONAL
);
1525 IoGetDevicePropertyData(
1527 CONST DEVPROPKEY
*PropertyKey
,
1532 PULONG RequiredSize
,
1535 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1537 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
1539 #if (NTDDI_VERSION >= NTDDI_WS08)
1543 IoReplacePartitionUnit(
1544 IN PDEVICE_OBJECT TargetPdo
,
1545 IN PDEVICE_OBJECT SparePdo
,
1549 #if (NTDDI_VERSION >= NTDDI_WIN7)
1554 IoGetAffinityInterrupt(
1555 IN PKINTERRUPT InterruptObject
,
1556 OUT PGROUP_AFFINITY GroupAffinity
);
1560 IoGetContainerInformation(
1561 IN IO_CONTAINER_INFORMATION_CLASS InformationClass
,
1562 IN PVOID ContainerObject OPTIONAL
,
1563 IN OUT PVOID Buffer OPTIONAL
,
1564 IN ULONG BufferLength
);
1568 IoRegisterContainerNotification(
1569 IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass
,
1570 IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction
,
1571 IN PVOID NotificationInformation OPTIONAL
,
1572 IN ULONG NotificationInformationLength
,
1573 OUT PVOID CallbackRegistration
);
1577 IoUnregisterContainerNotification(
1578 IN PVOID CallbackRegistration
);
1583 IoUnregisterPlugPlayNotificationEx(
1584 IN PVOID NotificationEntry
);
1589 IoGetDeviceNumaNode(
1590 IN PDEVICE_OBJECT Pdo
,
1591 OUT PUSHORT NodeNumber
);
1593 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1599 IoWMIDeviceObjectToProviderId(
1600 IN PDEVICE_OBJECT DeviceObject
);
1602 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
1608 * IN CCHAR StackSize)
1610 #define IoSizeOfIrp(_StackSize) \
1611 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
1615 IoSkipCurrentIrpStackLocation(
1618 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
1619 Irp
->CurrentLocation
++;
1620 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
1625 IoSetNextIrpStackLocation(
1628 ASSERT(Irp
->CurrentLocation
> 0);
1629 Irp
->CurrentLocation
--;
1630 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
1635 IoGetNextIrpStackLocation(
1638 ASSERT(Irp
->CurrentLocation
> 0);
1639 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
1644 IoSetCompletionRoutine(
1646 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
1647 IN PVOID Context OPTIONAL
,
1648 IN BOOLEAN InvokeOnSuccess
,
1649 IN BOOLEAN InvokeOnError
,
1650 IN BOOLEAN InvokeOnCancel
)
1652 PIO_STACK_LOCATION irpSp
;
1653 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
1654 irpSp
= IoGetNextIrpStackLocation(Irp
);
1655 irpSp
->CompletionRoutine
= CompletionRoutine
;
1656 irpSp
->Context
= Context
;
1659 if (InvokeOnSuccess
) {
1660 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
1663 if (InvokeOnError
) {
1664 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
1667 if (InvokeOnCancel
) {
1668 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
1674 * IoSetCancelRoutine(
1676 * IN PDRIVER_CANCEL CancelRoutine)
1678 #define IoSetCancelRoutine(_Irp, \
1680 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
1681 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
1686 * IN PDEVICE_OBJECT DeviceObject,
1688 * IN PVOID Context);
1690 #define IoRequestDpc(DeviceObject, Irp, Context)( \
1691 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
1695 * IoReleaseRemoveLock(
1696 * IN PIO_REMOVE_LOCK RemoveLock,
1699 #define IoReleaseRemoveLock(_RemoveLock, \
1701 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
1705 * IoReleaseRemoveLockAndWait(
1706 * IN PIO_REMOVE_LOCK RemoveLock,
1709 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
1711 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
1717 IN PIRP Irp OPTIONAL
);
1720 #define PLUGPLAY_REGKEY_DEVICE 1
1721 #define PLUGPLAY_REGKEY_DRIVER 2
1722 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
1726 IoGetCurrentIrpStackLocation(
1729 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
1730 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
1738 IoGetCurrentIrpStackLocation( (Irp
) )->Control
|= SL_PENDING_RETURNED
;
1743 * IoIsErrorUserInduced(
1744 * IN NTSTATUS Status);
1746 #define IoIsErrorUserInduced(Status) \
1747 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
1748 ((Status) == STATUS_IO_TIMEOUT) || \
1749 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
1750 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
1751 ((Status) == STATUS_VERIFY_REQUIRED) || \
1752 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
1753 ((Status) == STATUS_WRONG_VOLUME)))
1756 * IoInitializeRemoveLock(
1757 * IN PIO_REMOVE_LOCK Lock,
1758 * IN ULONG AllocateTag,
1759 * IN ULONG MaxLockedMinutes,
1760 * IN ULONG HighWatermark)
1762 #define IoInitializeRemoveLock( \
1763 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
1764 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
1765 HighWatermark, sizeof(IO_REMOVE_LOCK))
1769 IoInitializeDpcRequest(
1770 IN PDEVICE_OBJECT DeviceObject
,
1771 IN PIO_DPC_ROUTINE DpcRoutine
)
1773 KeInitializeDpc( &DeviceObject
->Dpc
,
1774 (PKDEFERRED_ROUTINE
) DpcRoutine
,
1778 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
1782 * IoGetFunctionCodeFromCtlCode(
1783 * IN ULONG ControlCode)
1785 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
1786 (((_ControlCode) >> 2) & 0x00000FFF)
1790 IoCopyCurrentIrpStackLocationToNext(
1793 PIO_STACK_LOCATION irpSp
;
1794 PIO_STACK_LOCATION nextIrpSp
;
1795 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
1796 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
1797 RtlCopyMemory( nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
1798 nextIrpSp
->Control
= 0;
1805 OUT PULONG_PTR LowLimit
,
1806 OUT PULONG_PTR HighLimit
);
1810 IoGetRemainingStackSize(VOID
)
1812 ULONG_PTR End
, Begin
;
1815 IoGetStackLimits(&Begin
, &End
);
1816 Result
= (ULONG_PTR
)(&End
) - Begin
;
1820 #if (NTDDI_VERSION >= NTDDI_WS03)
1823 IoInitializeThreadedDpcRequest(
1824 IN PDEVICE_OBJECT DeviceObject
,
1825 IN PIO_DPC_ROUTINE DpcRoutine
)
1827 KeInitializeThreadedDpc(&DeviceObject
->Dpc
,
1828 (PKDEFERRED_ROUTINE
) DpcRoutine
,