1 /******************************************************************************
2 * I/O Manager Functions *
3 ******************************************************************************/
9 * IN PIO_REMOVE_LOCK RemoveLock,
10 * IN OPTIONAL PVOID Tag)
13 #define IoAcquireRemoveLock(RemoveLock, Tag) \
14 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
16 #define IoAcquireRemoveLock(RemoveLock, Tag) \
17 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
22 * IoAdjustPagingPathCount(
24 * IN BOOLEAN Increment)
26 #define IoAdjustPagingPathCount(_Count, \
31 InterlockedIncrement(_Count); \
35 InterlockedDecrement(_Count); \
39 #if !defined(_M_AMD64)
43 READ_PORT_BUFFER_UCHAR(
51 READ_PORT_BUFFER_ULONG(
59 READ_PORT_BUFFER_USHORT(
85 READ_REGISTER_BUFFER_UCHAR(
93 READ_REGISTER_BUFFER_ULONG(
101 READ_REGISTER_BUFFER_USHORT(
121 READ_REGISTER_USHORT(
122 IN PUSHORT Register
);
127 WRITE_PORT_BUFFER_UCHAR(
135 WRITE_PORT_BUFFER_ULONG(
143 WRITE_PORT_BUFFER_USHORT(
172 WRITE_REGISTER_BUFFER_UCHAR(
180 WRITE_REGISTER_BUFFER_ULONG(
188 WRITE_REGISTER_BUFFER_USHORT(
196 WRITE_REGISTER_UCHAR(
203 WRITE_REGISTER_ULONG(
210 WRITE_REGISTER_USHORT(
218 READ_PORT_BUFFER_UCHAR(
223 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
228 READ_PORT_BUFFER_ULONG(
233 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
238 READ_PORT_BUFFER_USHORT(
243 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
251 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
259 return __indword((USHORT
)(ULONG_PTR
)Port
);
267 return __inword((USHORT
)(ULONG_PTR
)Port
);
272 READ_REGISTER_BUFFER_UCHAR(
277 __movsb(Register
, Buffer
, Count
);
282 READ_REGISTER_BUFFER_ULONG(
287 __movsd(Register
, Buffer
, Count
);
292 READ_REGISTER_BUFFER_USHORT(
297 __movsw(Register
, Buffer
, Count
);
303 IN
volatile UCHAR
*Register
)
311 IN
volatile ULONG
*Register
)
318 READ_REGISTER_USHORT(
319 IN
volatile USHORT
*Register
)
326 WRITE_PORT_BUFFER_UCHAR(
331 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
336 WRITE_PORT_BUFFER_ULONG(
341 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
346 WRITE_PORT_BUFFER_USHORT(
351 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
360 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
369 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
378 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
383 WRITE_REGISTER_BUFFER_UCHAR(
389 __movsb(Register
, Buffer
, Count
);
390 InterlockedOr(&Synch
, 1);
395 WRITE_REGISTER_BUFFER_ULONG(
401 __movsd(Register
, Buffer
, Count
);
402 InterlockedOr(&Synch
, 1);
407 WRITE_REGISTER_BUFFER_USHORT(
413 __movsw(Register
, Buffer
, Count
);
414 InterlockedOr(&Synch
, 1);
419 WRITE_REGISTER_UCHAR(
420 IN
volatile UCHAR
*Register
,
425 InterlockedOr(&Synch
, 1);
430 WRITE_REGISTER_ULONG(
431 IN
volatile ULONG
*Register
,
436 InterlockedOr(&Synch
, 1);
441 WRITE_REGISTER_USHORT(
442 IN
volatile USHORT
*Register
,
447 InterlockedOr(&Sync
, 1);
451 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
452 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
454 #define DMA_MACROS_DEFINED
456 _IRQL_requires_max_(DISPATCH_LEVEL
)
457 _IRQL_requires_min_(DISPATCH_LEVEL
)
460 IoAllocateAdapterChannel(
461 _In_ PDMA_ADAPTER DmaAdapter
,
462 _In_ PDEVICE_OBJECT DeviceObject
,
463 _In_ ULONG NumberOfMapRegisters
,
464 _In_ PDRIVER_CONTROL ExecutionRoutine
,
467 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
468 AllocateAdapterChannel
=
469 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
470 ASSERT(AllocateAdapterChannel
);
471 return AllocateAdapterChannel(DmaAdapter
,
473 NumberOfMapRegisters
,
481 IoFlushAdapterBuffers(
482 _In_ PDMA_ADAPTER DmaAdapter
,
484 _In_ PVOID MapRegisterBase
,
485 _In_ PVOID CurrentVa
,
487 _In_ BOOLEAN WriteToDevice
)
489 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
490 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
491 ASSERT(FlushAdapterBuffers
);
492 return FlushAdapterBuffers(DmaAdapter
,
503 IoFreeAdapterChannel(
504 _In_ PDMA_ADAPTER DmaAdapter
)
506 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
507 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
508 ASSERT(FreeAdapterChannel
);
509 FreeAdapterChannel(DmaAdapter
);
516 _In_ PDMA_ADAPTER DmaAdapter
,
517 _In_ PVOID MapRegisterBase
,
518 _In_ ULONG NumberOfMapRegisters
)
520 PFREE_MAP_REGISTERS FreeMapRegisters
;
521 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
522 ASSERT(FreeMapRegisters
);
523 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
530 _In_ PDMA_ADAPTER DmaAdapter
,
532 _In_ PVOID MapRegisterBase
,
533 _In_ PVOID CurrentVa
,
534 _Inout_ PULONG Length
,
535 _In_ BOOLEAN WriteToDevice
)
537 PMAP_TRANSFER MapTransfer
;
539 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
541 return MapTransfer(DmaAdapter
,
553 * VOID IoAssignArcName(
554 * IN PUNICODE_STRING ArcName,
555 * IN PUNICODE_STRING DeviceName);
557 #define IoAssignArcName(_ArcName, _DeviceName) ( \
558 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
563 * IN PUNICODE_STRING ArcName)
565 #define IoDeassignArcName IoDeleteSymbolicLink
570 IoInitializeDriverCreateContext(
571 PIO_DRIVER_CREATE_CONTEXT DriverContext
)
573 RtlZeroMemory(DriverContext
, sizeof(IO_DRIVER_CREATE_CONTEXT
));
574 DriverContext
->Size
= sizeof(IO_DRIVER_CREATE_CONTEXT
);
579 #define IoIsFileOpenedExclusively(FileObject) ( \
581 (FileObject)->SharedRead || \
582 (FileObject)->SharedWrite || \
583 (FileObject)->SharedDelete \
587 #if (NTDDI_VERSION == NTDDI_WIN2K)
591 IoRegisterFsRegistrationChangeEx(
592 _In_ PDRIVER_OBJECT DriverObject
,
593 _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine
);
596 #if (NTDDI_VERSION >= NTDDI_WIN2K)
599 _Acquires_lock_(_Global_cancel_spin_lock_
)
600 _Requires_lock_not_held_(_Global_cancel_spin_lock_
)
601 _IRQL_requires_max_(DISPATCH_LEVEL
)
602 _IRQL_raises_(DISPATCH_LEVEL
)
606 IoAcquireCancelSpinLock(
607 _Out_
_At_(*Irql
, _IRQL_saves_
) PKIRQL Irql
);
609 _IRQL_requires_max_(DISPATCH_LEVEL
)
613 IoAcquireRemoveLockEx(
614 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
618 _In_ ULONG RemlockSize
);
620 _IRQL_requires_max_(DISPATCH_LEVEL
)
625 IoAllocateDriverObjectExtension(
626 _In_ PDRIVER_OBJECT DriverObject
,
627 _In_ PVOID ClientIdentificationAddress
,
628 _In_ ULONG DriverObjectExtensionSize
,
629 _Post_
_At_(*DriverObjectExtension
, _When_(return==0,
630 __drv_aliasesMem
__drv_allocatesMem(Mem
) _Post_notnull_
))
631 _When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize
))
632 PVOID
*DriverObjectExtension
);
634 _IRQL_requires_max_(DISPATCH_LEVEL
)
638 IoAllocateErrorLogEntry(
640 _In_ UCHAR EntrySize
);
642 _Must_inspect_result_
643 _IRQL_requires_max_(DISPATCH_LEVEL
)
648 _In_ CCHAR StackSize
,
649 _In_ BOOLEAN ChargeQuota
);
651 _IRQL_requires_max_(DISPATCH_LEVEL
)
656 _In_opt_ __drv_aliasesMem PVOID VirtualAddress
,
658 _In_ BOOLEAN SecondaryBuffer
,
659 _In_ BOOLEAN ChargeQuota
,
660 _Inout_opt_ PIRP Irp
);
662 __drv_allocatesMem(Mem
)
663 _IRQL_requires_max_(DISPATCH_LEVEL
)
668 _In_ PDEVICE_OBJECT DeviceObject
);
670 _IRQL_requires_max_(APC_LEVEL
)
676 _In_
_Kernel_requires_resource_held_(Memory
) _When_(return==0, __drv_aliasesMem
)
677 PDEVICE_OBJECT SourceDevice
,
678 _In_ PUNICODE_STRING TargetDevice
,
679 _Out_ PDEVICE_OBJECT
*AttachedDevice
);
681 _Must_inspect_result_
682 _IRQL_requires_max_(DISPATCH_LEVEL
)
686 IoAttachDeviceToDeviceStack(
687 _In_
_Kernel_requires_resource_held_(Memory
) _When_(return!=0, __drv_aliasesMem
)
688 PDEVICE_OBJECT SourceDevice
,
689 _In_ PDEVICE_OBJECT TargetDevice
);
691 _Must_inspect_result_
693 _IRQL_requires_max_(DISPATCH_LEVEL
)
697 IoBuildAsynchronousFsdRequest(
698 _In_ ULONG MajorFunction
,
699 _In_ PDEVICE_OBJECT DeviceObject
,
700 _Inout_opt_ PVOID Buffer
,
701 _In_opt_ ULONG Length
,
702 _In_opt_ PLARGE_INTEGER StartingOffset
,
703 _In_opt_ PIO_STATUS_BLOCK IoStatusBlock
);
705 _Must_inspect_result_
707 _IRQL_requires_max_(PASSIVE_LEVEL
)
711 IoBuildDeviceIoControlRequest(
712 _In_ ULONG IoControlCode
,
713 _In_ PDEVICE_OBJECT DeviceObject
,
714 _In_opt_ PVOID InputBuffer
,
715 _In_ ULONG InputBufferLength
,
716 _Out_opt_ PVOID OutputBuffer
,
717 _In_ ULONG OutputBufferLength
,
718 _In_ BOOLEAN InternalDeviceIoControl
,
719 _In_opt_ PKEVENT Event
,
720 _Out_ PIO_STATUS_BLOCK IoStatusBlock
);
722 _IRQL_requires_max_(DISPATCH_LEVEL
)
728 _Inout_ PMDL TargetMdl
,
729 _In_ PVOID VirtualAddress
,
732 _Must_inspect_result_
734 _IRQL_requires_max_(PASSIVE_LEVEL
)
738 IoBuildSynchronousFsdRequest(
739 _In_ ULONG MajorFunction
,
740 _In_ PDEVICE_OBJECT DeviceObject
,
741 _Inout_opt_ PVOID Buffer
,
742 _In_opt_ ULONG Length
,
743 _In_opt_ PLARGE_INTEGER StartingOffset
,
745 _Out_ PIO_STATUS_BLOCK IoStatusBlock
);
747 _IRQL_requires_max_(DISPATCH_LEVEL
)
753 _In_ PDEVICE_OBJECT DeviceObject
,
754 _Inout_ __drv_aliasesMem PIRP Irp
);
755 #define IoCallDriver IofCallDriver
757 _IRQL_requires_max_(DISPATCH_LEVEL
)
763 _In_ CCHAR PriorityBoost
);
764 #define IoCompleteRequest IofCompleteRequest
766 _IRQL_requires_max_(DISPATCH_LEVEL
)
773 _IRQL_requires_max_(PASSIVE_LEVEL
)
778 _In_ ACCESS_MASK DesiredAccess
,
779 _In_ ULONG DesiredShareAccess
,
780 _Inout_ PFILE_OBJECT FileObject
,
781 _Inout_ PSHARE_ACCESS ShareAccess
,
782 _In_ BOOLEAN Update
);
784 _IRQL_requires_max_(DISPATCH_LEVEL
)
790 _In_ CCHAR PriorityBoost
);
792 _IRQL_requires_max_(PASSIVE_LEVEL
)
797 _Out_ PKINTERRUPT
*InterruptObject
,
798 _In_ PKSERVICE_ROUTINE ServiceRoutine
,
799 _In_opt_ PVOID ServiceContext
,
800 _In_opt_ PKSPIN_LOCK SpinLock
,
803 _In_ KIRQL SynchronizeIrql
,
804 _In_ KINTERRUPT_MODE InterruptMode
,
805 _In_ BOOLEAN ShareVector
,
806 _In_ KAFFINITY ProcessorEnableMask
,
807 _In_ BOOLEAN FloatingSave
);
809 _IRQL_requires_max_(APC_LEVEL
)
815 _In_ PDRIVER_OBJECT DriverObject
,
816 _In_ ULONG DeviceExtensionSize
,
817 _In_opt_ PUNICODE_STRING DeviceName
,
818 _In_ DEVICE_TYPE DeviceType
,
819 _In_ ULONG DeviceCharacteristics
,
820 _In_ BOOLEAN Exclusive
,
821 _Outptr_result_nullonfailure_
823 __drv_allocatesMem(Mem
)
824 _When_(((_In_function_class_(DRIVER_INITIALIZE
))
825 ||(_In_function_class_(DRIVER_DISPATCH
))),
827 PDEVICE_OBJECT
*DeviceObject
);
829 _IRQL_requires_max_(PASSIVE_LEVEL
)
834 _Out_ PHANDLE FileHandle
,
835 _In_ ACCESS_MASK DesiredAccess
,
836 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
837 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
838 _In_opt_ PLARGE_INTEGER AllocationSize
,
839 _In_ ULONG FileAttributes
,
840 _In_ ULONG ShareAccess
,
841 _In_ ULONG Disposition
,
842 _In_ ULONG CreateOptions
,
843 _In_opt_ PVOID EaBuffer
,
845 _In_ CREATE_FILE_TYPE CreateFileType
,
846 _In_opt_ PVOID InternalParameters
,
849 _IRQL_requires_max_(PASSIVE_LEVEL
)
853 IoCreateNotificationEvent(
854 _In_ PUNICODE_STRING EventName
,
855 _Out_ PHANDLE EventHandle
);
857 _IRQL_requires_max_(PASSIVE_LEVEL
)
861 IoCreateSymbolicLink(
862 _In_ PUNICODE_STRING SymbolicLinkName
,
863 _In_ PUNICODE_STRING DeviceName
);
865 _IRQL_requires_max_(PASSIVE_LEVEL
)
869 IoCreateSynchronizationEvent(
870 _In_ PUNICODE_STRING EventName
,
871 _Out_ PHANDLE EventHandle
);
873 _IRQL_requires_max_(PASSIVE_LEVEL
)
877 IoCreateUnprotectedSymbolicLink(
878 _In_ PUNICODE_STRING SymbolicLinkName
,
879 _In_ PUNICODE_STRING DeviceName
);
881 _IRQL_requires_max_(APC_LEVEL
)
882 _Kernel_clear_do_init_(__yes
)
887 _In_
_Kernel_requires_resource_held_(Memory
) __drv_freesMem(Mem
)
888 PDEVICE_OBJECT DeviceObject
);
890 _IRQL_requires_max_(PASSIVE_LEVEL
)
894 IoDeleteSymbolicLink(
895 _In_ PUNICODE_STRING SymbolicLinkName
);
897 _IRQL_requires_max_(PASSIVE_LEVEL
)
902 _Inout_ PDEVICE_OBJECT TargetDevice
);
904 _IRQL_requires_max_(PASSIVE_LEVEL
)
908 IoDisconnectInterrupt(
909 _In_ PKINTERRUPT InterruptObject
);
912 _IRQL_requires_max_(DISPATCH_LEVEL
)
919 _IRQL_requires_max_(DISPATCH_LEVEL
)
926 _IRQL_requires_max_(DISPATCH_LEVEL
)
931 _In_
__drv_freesMem(Mem
) PIO_WORKITEM IoWorkItem
);
937 IN PDEVICE_OBJECT DeviceObject
);
939 _IRQL_requires_max_(DISPATCH_LEVEL
)
943 IoGetAttachedDeviceReference(
944 _In_ PDEVICE_OBJECT DeviceObject
);
949 IoGetBootDiskInformation(
950 _Inout_ PBOOTDISK_INFORMATION BootDiskInformation
,
953 _IRQL_requires_max_(PASSIVE_LEVEL
)
954 _Must_inspect_result_
958 IoGetDeviceInterfaceAlias(
959 _In_ PUNICODE_STRING SymbolicLinkName
,
960 _In_ CONST GUID
*AliasInterfaceClassGuid
,
962 _When_(return==0, _At_(AliasSymbolicLinkName
->Buffer
, __drv_allocatesMem(Mem
)))
963 PUNICODE_STRING AliasSymbolicLinkName
);
968 IoGetCurrentProcess(VOID
);
970 _IRQL_requires_max_(PASSIVE_LEVEL
)
971 _Must_inspect_result_
975 IoGetDeviceInterfaces(
976 _In_ CONST GUID
*InterfaceClassGuid
,
977 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
979 _Outptr_result_nullonfailure_
980 _At_(*SymbolicLinkList
, _When_(return==0, __drv_allocatesMem(Mem
)))
981 PZZWSTR
*SymbolicLinkList
);
983 _IRQL_requires_max_(PASSIVE_LEVEL
)
987 IoGetDeviceObjectPointer(
988 _In_ PUNICODE_STRING ObjectName
,
989 _In_ ACCESS_MASK DesiredAccess
,
990 _Out_ PFILE_OBJECT
*FileObject
,
991 _Out_ PDEVICE_OBJECT
*DeviceObject
);
993 _IRQL_requires_max_(PASSIVE_LEVEL
)
994 _When_((DeviceProperty
& __string_type
),
995 _At_(PropertyBuffer
, _Post_z_
))
996 _When_((DeviceProperty
& __multiString_type
),
997 _At_(PropertyBuffer
, _Post_ _NullNull_terminated_
))
1001 IoGetDeviceProperty(
1002 _In_ PDEVICE_OBJECT DeviceObject
,
1003 _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty
,
1004 _In_ ULONG BufferLength
,
1005 _Out_writes_bytes_opt_(BufferLength
) PVOID PropertyBuffer
,
1006 _Deref_out_range_(<=, BufferLength
) PULONG ResultLength
);
1008 _Must_inspect_result_
1009 _IRQL_requires_max_(PASSIVE_LEVEL
)
1014 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
1015 _In_ PDEVICE_DESCRIPTION DeviceDescription
,
1016 _Out_
_When_(return!=0, _Kernel_IoGetDmaAdapter_
_At_(*NumberOfMapRegisters
, _Must_inspect_result_
))
1017 PULONG NumberOfMapRegisters
);
1020 _IRQL_requires_max_(DISPATCH_LEVEL
)
1024 IoGetDriverObjectExtension(
1025 _In_ PDRIVER_OBJECT DriverObject
,
1026 _In_ PVOID ClientIdentificationAddress
);
1028 _IRQL_requires_max_(APC_LEVEL
)
1032 IoGetInitialStack(VOID
);
1037 IoGetRelatedDeviceObject(
1038 _In_ PFILE_OBJECT FileObject
);
1040 _IRQL_requires_max_(DISPATCH_LEVEL
)
1045 _Inout_ PIO_WORKITEM IoWorkItem
,
1046 _In_ PIO_WORKITEM_ROUTINE WorkerRoutine
,
1047 _In_ WORK_QUEUE_TYPE QueueType
,
1048 _In_opt_ __drv_aliasesMem PVOID Context
);
1050 _IRQL_requires_max_(DISPATCH_LEVEL
)
1056 _In_ USHORT PacketSize
,
1057 _In_ CCHAR StackSize
);
1059 _IRQL_requires_max_(PASSIVE_LEVEL
)
1063 IoInitializeRemoveLockEx(
1064 _Out_ PIO_REMOVE_LOCK Lock
,
1065 _In_ ULONG AllocateTag
,
1066 _In_ ULONG MaxLockedMinutes
,
1067 _In_ ULONG HighWatermark
,
1068 _In_ ULONG RemlockSize
);
1070 _IRQL_requires_max_(PASSIVE_LEVEL
)
1075 _In_ PDEVICE_OBJECT DeviceObject
,
1076 _In_ PIO_TIMER_ROUTINE TimerRoutine
,
1077 _In_opt_ __drv_aliasesMem PVOID Context
);
1079 _IRQL_requires_max_(DISPATCH_LEVEL
)
1083 IoInvalidateDeviceRelations(
1084 _In_ PDEVICE_OBJECT DeviceObject
,
1085 _In_ DEVICE_RELATION_TYPE Type
);
1087 _IRQL_requires_max_(DISPATCH_LEVEL
)
1091 IoInvalidateDeviceState(
1092 _In_ PDEVICE_OBJECT PhysicalDeviceObject
);
1094 _IRQL_requires_max_(PASSIVE_LEVEL
)
1098 IoIsWdmVersionAvailable(
1099 _When_(MajorVersion
!=1&&MajorVersion
!=6, _In_
__drv_reportError("MajorVersion must be 1 or 6"))
1101 _In_
_When_(MinorVersion
!=0 && MinorVersion
!=5 &&
1102 MinorVersion
!=16 && MinorVersion
!=32 &&
1103 MinorVersion
!=48, __drv_reportError("MinorVersion must be 0, 0x5, 0x10, 0x20, or 0x30"))
1104 UCHAR MinorVersion
);
1106 _IRQL_requires_max_(PASSIVE_LEVEL
)
1107 _Must_inspect_result_
1111 IoOpenDeviceInterfaceRegistryKey(
1112 _In_ PUNICODE_STRING SymbolicLinkName
,
1113 _In_ ACCESS_MASK DesiredAccess
,
1114 _Out_ PHANDLE DeviceInterfaceKey
);
1116 _IRQL_requires_max_(PASSIVE_LEVEL
)
1117 _Must_inspect_result_
1121 IoOpenDeviceRegistryKey(
1122 _In_ PDEVICE_OBJECT DeviceObject
,
1123 _In_ ULONG DevInstKeyType
,
1124 _In_ ACCESS_MASK DesiredAccess
,
1125 _Out_ PHANDLE DevInstRegKey
);
1127 _IRQL_requires_max_(PASSIVE_LEVEL
)
1128 _Must_inspect_result_
1132 IoRegisterDeviceInterface(
1133 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
1134 _In_ CONST GUID
*InterfaceClassGuid
,
1135 _In_opt_ PUNICODE_STRING ReferenceString
,
1136 _Out_
_When_(return==0, _At_(SymbolicLinkName
->Buffer
, __drv_allocatesMem(Mem
)))
1137 PUNICODE_STRING SymbolicLinkName
);
1139 _IRQL_requires_max_(PASSIVE_LEVEL
)
1140 _Must_inspect_result_
1144 IoRegisterPlugPlayNotification(
1145 _In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
1146 _In_ ULONG EventCategoryFlags
,
1147 _In_opt_ PVOID EventCategoryData
,
1148 _In_ PDRIVER_OBJECT DriverObject
,
1149 _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
1150 _Inout_opt_ __drv_aliasesMem PVOID Context
,
1151 _Outptr_result_nullonfailure_
1152 _At_(*NotificationEntry
, _When_(return==0, __drv_allocatesMem(Mem
)))
1153 PVOID
*NotificationEntry
);
1155 _IRQL_requires_max_(PASSIVE_LEVEL
)
1159 IoRegisterShutdownNotification(
1160 _In_ PDEVICE_OBJECT DeviceObject
);
1162 _Requires_lock_held_(_Global_cancel_spin_lock_
)
1163 _Releases_lock_(_Global_cancel_spin_lock_
)
1164 _IRQL_requires_max_(DISPATCH_LEVEL
)
1165 _IRQL_requires_min_(DISPATCH_LEVEL
)
1169 IoReleaseCancelSpinLock(
1170 _In_ _IRQL_restores_ _IRQL_uses_cancel_ KIRQL Irql
);
1172 _IRQL_requires_max_(PASSIVE_LEVEL
)
1176 IoReleaseRemoveLockAndWaitEx(
1177 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
1179 _In_ ULONG RemlockSize
);
1184 IoReleaseRemoveLockEx(
1185 _Inout_ PIO_REMOVE_LOCK RemoveLock
,
1187 _In_ ULONG RemlockSize
);
1189 _IRQL_requires_max_(PASSIVE_LEVEL
)
1193 IoRemoveShareAccess(
1194 _In_ PFILE_OBJECT FileObject
,
1195 _Inout_ PSHARE_ACCESS ShareAccess
);
1197 _IRQL_requires_max_(PASSIVE_LEVEL
)
1201 IoReportTargetDeviceChange(
1202 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
1203 _In_ PVOID NotificationStructure
);
1205 _IRQL_requires_max_(DISPATCH_LEVEL
)
1209 IoReportTargetDeviceChangeAsynchronous(
1210 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
1211 _In_ PVOID NotificationStructure
,
1212 _In_opt_ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback
,
1213 _In_opt_ PVOID Context
);
1215 _IRQL_requires_max_(DISPATCH_LEVEL
)
1219 IoRequestDeviceEject(
1220 _In_ PDEVICE_OBJECT PhysicalDeviceObject
);
1222 _IRQL_requires_max_(DISPATCH_LEVEL
)
1228 _In_ NTSTATUS Status
);
1230 _IRQL_requires_max_(PASSIVE_LEVEL
)
1231 _Must_inspect_result_
1235 IoSetDeviceInterfaceState(
1236 _In_ PUNICODE_STRING SymbolicLinkName
,
1237 _In_ BOOLEAN Enable
);
1243 _In_ ACCESS_MASK DesiredAccess
,
1244 _In_ ULONG DesiredShareAccess
,
1245 _Inout_ PFILE_OBJECT FileObject
,
1246 _Out_ PSHARE_ACCESS ShareAccess
);
1248 _IRQL_requires_max_(DISPATCH_LEVEL
)
1249 _IRQL_requires_min_(DISPATCH_LEVEL
)
1254 _In_ PDEVICE_OBJECT DeviceObject
,
1255 _In_ BOOLEAN Cancelable
);
1257 _IRQL_requires_max_(DISPATCH_LEVEL
)
1261 IoStartNextPacketByKey(
1262 _In_ PDEVICE_OBJECT DeviceObject
,
1263 _In_ BOOLEAN Cancelable
,
1266 _IRQL_requires_max_(DISPATCH_LEVEL
)
1271 _In_ PDEVICE_OBJECT DeviceObject
,
1273 _In_opt_ PULONG Key
,
1274 _In_opt_ PDRIVER_CANCEL CancelFunction
);
1276 _IRQL_requires_max_(DISPATCH_LEVEL
)
1281 _In_ PDEVICE_OBJECT DeviceObject
);
1283 _IRQL_requires_max_(DISPATCH_LEVEL
)
1288 _In_ PDEVICE_OBJECT DeviceObject
);
1290 _IRQL_requires_max_(PASSIVE_LEVEL
)
1291 __drv_freesMem(Pool
)
1295 IoUnregisterPlugPlayNotification(
1296 _In_ PVOID NotificationEntry
);
1298 _IRQL_requires_max_(PASSIVE_LEVEL
)
1302 IoUnregisterShutdownNotification(
1303 _In_ PDEVICE_OBJECT DeviceObject
);
1305 _IRQL_requires_max_(PASSIVE_LEVEL
)
1309 IoUpdateShareAccess(
1310 _In_ PFILE_OBJECT FileObject
,
1311 _Inout_ PSHARE_ACCESS ShareAccess
);
1313 _IRQL_requires_max_(PASSIVE_LEVEL
)
1317 IoWMIAllocateInstanceIds(
1319 _In_ ULONG InstanceCount
,
1320 _Out_ ULONG
*FirstInstanceId
);
1325 IoWMIQuerySingleInstanceMultiple(
1326 _In_reads_(ObjectCount
) PVOID
*DataBlockObjectList
,
1327 _In_reads_(ObjectCount
) PUNICODE_STRING InstanceNames
,
1328 _In_ ULONG ObjectCount
,
1329 _Inout_ ULONG
*InOutBufferSize
,
1330 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
1332 _IRQL_requires_max_(PASSIVE_LEVEL
)
1336 IoWMIRegistrationControl(
1337 _In_ PDEVICE_OBJECT DeviceObject
,
1343 IoWMISuggestInstanceName(
1344 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject
,
1345 _In_opt_ PUNICODE_STRING SymbolicLinkName
,
1346 _In_ BOOLEAN CombineNames
,
1347 _Out_ PUNICODE_STRING SuggestedInstanceName
);
1349 _Must_inspect_result_
1350 _IRQL_requires_max_(DISPATCH_LEVEL
)
1356 _Inout_
_When_(return==0, __drv_aliasesMem
) PVOID WnodeEventItem
);
1358 _IRQL_requires_max_(DISPATCH_LEVEL
)
1362 IoWriteErrorLogEntry(
1363 _In_ PVOID ElEntry
);
1368 IoGetTopLevelIrp(VOID
);
1370 _IRQL_requires_max_(PASSIVE_LEVEL
)
1374 IoRegisterLastChanceShutdownNotification(
1375 _In_ PDEVICE_OBJECT DeviceObject
);
1385 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
1386 _IRQL_requires_max_(DISPATCH_LEVEL
)
1387 _IRQL_requires_min_(DISPATCH_LEVEL
)
1391 IoAllocateAdapterChannel(
1392 _In_ PADAPTER_OBJECT AdapterObject
,
1393 _In_ PDEVICE_OBJECT DeviceObject
,
1394 _In_ ULONG NumberOfMapRegisters
,
1395 _In_ PDRIVER_CONTROL ExecutionRoutine
,
1396 _In_ PVOID Context
);
1399 #if !defined(DMA_MACROS_DEFINED)
1400 //DECLSPEC_DEPRECATED_DDK
1405 _In_ PADAPTER_OBJECT AdapterObject
,
1407 _In_ PVOID MapRegisterBase
,
1408 _In_ PVOID CurrentVa
,
1409 _Inout_ PULONG Length
,
1410 _In_ BOOLEAN WriteToDevice
);
1413 _IRQL_requires_max_(DISPATCH_LEVEL
)
1414 _IRQL_requires_min_(DISPATCH_LEVEL
)
1418 IoAllocateController(
1419 _In_ PCONTROLLER_OBJECT ControllerObject
,
1420 _In_ PDEVICE_OBJECT DeviceObject
,
1421 _In_ PDRIVER_CONTROL ExecutionRoutine
,
1422 _In_opt_ PVOID Context
);
1424 _IRQL_requires_max_(PASSIVE_LEVEL
)
1431 _IRQL_requires_max_(PASSIVE_LEVEL
)
1436 _In_ PCONTROLLER_OBJECT ControllerObject
);
1438 _IRQL_requires_max_(DISPATCH_LEVEL
)
1439 _IRQL_requires_min_(DISPATCH_LEVEL
)
1444 _In_ PCONTROLLER_OBJECT ControllerObject
);
1446 _IRQL_requires_max_(PASSIVE_LEVEL
)
1448 PCONFIGURATION_INFORMATION
1450 IoGetConfigurationInformation(VOID
);
1452 _IRQL_requires_max_(PASSIVE_LEVEL
)
1456 IoGetDeviceToVerify(
1457 _In_ PETHREAD Thread
);
1463 _In_ PDEVICE_OBJECT DeviceObject
,
1464 _In_ PFILE_OBJECT FileObject
);
1466 _IRQL_requires_max_(PASSIVE_LEVEL
)
1470 IoGetFileObjectGenericMapping(VOID
);
1472 _IRQL_requires_max_(DISPATCH_LEVEL
)
1476 IoMakeAssociatedIrp(
1478 _In_ CCHAR StackSize
);
1483 IoQueryDeviceDescription(
1484 _In_opt_ PINTERFACE_TYPE BusType
,
1485 _In_opt_ PULONG BusNumber
,
1486 _In_opt_ PCONFIGURATION_TYPE ControllerType
,
1487 _In_opt_ PULONG ControllerNumber
,
1488 _In_opt_ PCONFIGURATION_TYPE PeripheralType
,
1489 _In_opt_ PULONG PeripheralNumber
,
1490 _In_ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
,
1491 _Inout_opt_ PVOID Context
);
1493 _IRQL_requires_max_(APC_LEVEL
)
1500 _In_ PDEVICE_OBJECT RealDeviceObject
);
1502 _IRQL_requires_max_(APC_LEVEL
)
1506 IoRaiseInformationalHardError(
1507 _In_ NTSTATUS ErrorStatus
,
1508 _In_opt_ PUNICODE_STRING String
,
1509 _In_opt_ PKTHREAD Thread
);
1511 _IRQL_requires_max_(PASSIVE_LEVEL
)
1515 IoRegisterBootDriverReinitialization(
1516 _In_ PDRIVER_OBJECT DriverObject
,
1517 _In_ PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
1518 _In_opt_ PVOID Context
);
1520 _IRQL_requires_max_(PASSIVE_LEVEL
)
1524 IoRegisterDriverReinitialization(
1525 _In_ PDRIVER_OBJECT DriverObject
,
1526 _In_ PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
1527 _In_opt_ PVOID Context
);
1532 IoAttachDeviceByPointer(
1533 _In_ PDEVICE_OBJECT SourceDevice
,
1534 _In_ PDEVICE_OBJECT TargetDevice
);
1536 _IRQL_requires_max_(PASSIVE_LEVEL
)
1537 _Must_inspect_result_
1541 IoReportDetectedDevice(
1542 _In_ PDRIVER_OBJECT DriverObject
,
1543 _In_ INTERFACE_TYPE LegacyBusType
,
1544 _In_ ULONG BusNumber
,
1545 _In_ ULONG SlotNumber
,
1546 _In_opt_ PCM_RESOURCE_LIST ResourceList
,
1547 _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements
,
1548 _In_ BOOLEAN ResourceAssigned
,
1549 _Inout_ PDEVICE_OBJECT
*DeviceObject
);
1554 IoReportResourceForDetection(
1555 _In_ PDRIVER_OBJECT DriverObject
,
1556 _In_reads_bytes_opt_(DriverListSize
) PCM_RESOURCE_LIST DriverList
,
1557 _In_opt_ ULONG DriverListSize
,
1558 _In_opt_ PDEVICE_OBJECT DeviceObject
,
1559 _In_reads_bytes_opt_(DeviceListSize
) PCM_RESOURCE_LIST DeviceList
,
1560 _In_opt_ ULONG DeviceListSize
,
1561 _Out_ PBOOLEAN ConflictDetected
);
1566 IoReportResourceUsage(
1567 _In_opt_ PUNICODE_STRING DriverClassName
,
1568 _In_ PDRIVER_OBJECT DriverObject
,
1569 _In_reads_bytes_opt_(DriverListSize
) PCM_RESOURCE_LIST DriverList
,
1570 _In_opt_ ULONG DriverListSize
,
1571 _In_opt_ PDEVICE_OBJECT DeviceObject
,
1572 _In_reads_bytes_opt_(DeviceListSize
) PCM_RESOURCE_LIST DeviceList
,
1573 _In_opt_ ULONG DeviceListSize
,
1574 _In_ BOOLEAN OverrideConflict
,
1575 _Out_ PBOOLEAN ConflictDetected
);
1577 _IRQL_requires_max_(DISPATCH_LEVEL
)
1581 IoSetHardErrorOrVerifyDevice(
1583 _In_ PDEVICE_OBJECT DeviceObject
);
1589 _In_ PUNICODE_STRING RegistryPath
,
1590 _In_opt_ PUNICODE_STRING DriverClassName
,
1591 _In_ PDRIVER_OBJECT DriverObject
,
1592 _In_opt_ PDEVICE_OBJECT DeviceObject
,
1593 _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources
,
1594 _Inout_ PCM_RESOURCE_LIST
*AllocatedResources
);
1596 _IRQL_requires_max_(DISPATCH_LEVEL
)
1600 IoSetThreadHardErrorMode(
1601 _In_ BOOLEAN EnableHardErrors
);
1609 IoAcquireVpbSpinLock(
1615 IoCheckDesiredAccess(
1616 _Inout_ PACCESS_MASK DesiredAccess
,
1617 _In_ ACCESS_MASK GrantedAccess
);
1622 IoCheckEaBufferValidity(
1623 _In_ PFILE_FULL_EA_INFORMATION EaBuffer
,
1624 _In_ ULONG EaLength
,
1625 _Out_ PULONG ErrorOffset
);
1630 IoCheckFunctionAccess(
1631 _In_ ACCESS_MASK GrantedAccess
,
1632 _In_ UCHAR MajorFunction
,
1633 _In_ UCHAR MinorFunction
,
1634 _In_ ULONG IoControlCode
,
1635 _In_opt_ PVOID Argument1
,
1636 _In_opt_ PVOID Argument2
);
1641 IoCheckQuerySetFileInformation(
1642 _In_ FILE_INFORMATION_CLASS FileInformationClass
,
1644 _In_ BOOLEAN SetOperation
);
1649 IoCheckQuerySetVolumeInformation(
1650 _In_ FS_INFORMATION_CLASS FsInformationClass
,
1652 _In_ BOOLEAN SetOperation
);
1657 IoCheckQuotaBufferValidity(
1658 _In_ PFILE_QUOTA_INFORMATION QuotaBuffer
,
1659 _In_ ULONG QuotaLength
,
1660 _Out_ PULONG ErrorOffset
);
1665 IoCreateStreamFileObject(
1666 _In_opt_ PFILE_OBJECT FileObject
,
1667 _In_opt_ PDEVICE_OBJECT DeviceObject
);
1672 IoCreateStreamFileObjectLite(
1673 _In_opt_ PFILE_OBJECT FileObject
,
1674 _In_opt_ PDEVICE_OBJECT DeviceObject
);
1679 IoFastQueryNetworkAttributes(
1680 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
1681 _In_ ACCESS_MASK DesiredAccess
,
1682 _In_ ULONG OpenOptions
,
1683 _Out_ PIO_STATUS_BLOCK IoStatus
,
1684 _Out_ PFILE_NETWORK_OPEN_INFORMATION Buffer
);
1690 _In_ PFILE_OBJECT FileObject
,
1692 _In_ PLARGE_INTEGER Offset
,
1694 _Out_ PIO_STATUS_BLOCK IoStatusBlock
);
1699 IoGetBaseFileSystemDeviceObject(
1700 _In_ PFILE_OBJECT FileObject
);
1702 _IRQL_requires_max_(PASSIVE_LEVEL
)
1704 PCONFIGURATION_INFORMATION
1706 IoGetConfigurationInformation(VOID
);
1711 IoGetRequestorProcessId(
1717 IoGetRequestorProcess(
1723 IoGetTopLevelIrp(VOID
);
1728 IoIsOperationSynchronous(
1735 _In_ PETHREAD Thread
);
1740 IoIsValidNameGraftingBuffer(
1742 _In_ PREPARSE_DATA_BUFFER ReparseBuffer
);
1747 IoQueryFileInformation(
1748 _In_ PFILE_OBJECT FileObject
,
1749 _In_ FILE_INFORMATION_CLASS FileInformationClass
,
1751 _Out_ PVOID FileInformation
,
1752 _Out_ PULONG ReturnedLength
);
1757 IoQueryVolumeInformation(
1758 _In_ PFILE_OBJECT FileObject
,
1759 _In_ FS_INFORMATION_CLASS FsInformationClass
,
1761 _Out_ PVOID FsInformation
,
1762 _Out_ PULONG ReturnedLength
);
1773 IoRegisterFileSystem(
1774 _In_ __drv_aliasesMem PDEVICE_OBJECT DeviceObject
);
1779 IoRegisterFsRegistrationChange(
1780 _In_ PDRIVER_OBJECT DriverObject
,
1781 _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine
);
1786 IoReleaseVpbSpinLock(
1792 IoSetDeviceToVerify(
1793 _In_ PETHREAD Thread
,
1794 _In_opt_ PDEVICE_OBJECT DeviceObject
);
1800 _In_ PFILE_OBJECT FileObject
,
1801 _In_ FILE_INFORMATION_CLASS FileInformationClass
,
1803 _In_ PVOID FileInformation
);
1814 IoSynchronousPageWrite(
1815 _In_ PFILE_OBJECT FileObject
,
1817 _In_ PLARGE_INTEGER FileOffset
,
1819 _Out_ PIO_STATUS_BLOCK IoStatusBlock
);
1825 _In_ PETHREAD Thread
);
1830 IoUnregisterFileSystem(
1831 _In_ PDEVICE_OBJECT DeviceObject
);
1836 IoUnregisterFsRegistrationChange(
1837 _In_ PDRIVER_OBJECT DriverObject
,
1838 _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine
);
1844 _In_ PDEVICE_OBJECT DeviceObject
,
1845 _In_ BOOLEAN AllowRawMount
);
1850 IoGetRequestorSessionId(
1852 _Out_ PULONG pSessionId
);
1855 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1858 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1863 IoIsFileOriginRemote(
1864 _In_ PFILE_OBJECT FileObject
);
1870 _In_ PFILE_OBJECT FileObject
,
1871 _In_ BOOLEAN Remote
);
1873 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */
1876 #if (NTDDI_VERSION >= NTDDI_WINXP)
1884 _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp
,
1885 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
1886 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
1887 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
1888 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
1889 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
1895 _Inout_ PIO_CSQ Csq
,
1897 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context
);
1903 _Inout_ PIO_CSQ Csq
,
1904 _Inout_ PIO_CSQ_IRP_CONTEXT Context
);
1910 _Inout_ PIO_CSQ Csq
,
1911 _In_opt_ PVOID PeekContext
);
1916 IoForwardIrpSynchronously(
1917 _In_ PDEVICE_OBJECT DeviceObject
,
1920 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
1925 IoFreeErrorLogEntry(
1926 _In_ PVOID ElEntry
);
1928 _IRQL_requires_max_(DISPATCH_LEVEL
)
1929 _Must_inspect_result_
1933 IoSetCompletionRoutineEx(
1934 _In_ PDEVICE_OBJECT DeviceObject
,
1936 _In_ PIO_COMPLETION_ROUTINE CompletionRoutine
,
1937 _In_opt_ PVOID Context
,
1938 _In_ BOOLEAN InvokeOnSuccess
,
1939 _In_ BOOLEAN InvokeOnError
,
1940 _In_ BOOLEAN InvokeOnCancel
);
1944 IoSetStartIoAttributes(
1945 _In_ PDEVICE_OBJECT DeviceObject
,
1946 _In_ BOOLEAN DeferredStartIo
,
1947 _In_ BOOLEAN NonCancelable
);
1952 IoWMIDeviceObjectToInstanceName(
1953 _In_ PVOID DataBlockObject
,
1954 _In_ PDEVICE_OBJECT DeviceObject
,
1955 _Out_ PUNICODE_STRING InstanceName
);
1961 _In_ PVOID DataBlockObject
,
1962 _In_ PUNICODE_STRING InstanceName
,
1963 _In_ ULONG MethodId
,
1964 _In_ ULONG InBufferSize
,
1965 _Inout_ PULONG OutBufferSize
,
1966 _Inout_updates_bytes_to_opt_(*OutBufferSize
, InBufferSize
) PUCHAR InOutBuffer
);
1971 IoWMIHandleToInstanceName(
1972 _In_ PVOID DataBlockObject
,
1973 _In_ HANDLE FileHandle
,
1974 _Out_ PUNICODE_STRING InstanceName
);
1980 _In_ LPCGUID DataBlockGuid
,
1981 _In_ ULONG DesiredAccess
,
1982 _Out_ PVOID
*DataBlockObject
);
1988 _In_ PVOID DataBlockObject
,
1989 _Inout_ ULONG
*InOutBufferSize
,
1990 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
1995 IoWMIQueryAllDataMultiple(
1996 _In_reads_(ObjectCount
) PVOID
*DataBlockObjectList
,
1997 _In_ ULONG ObjectCount
,
1998 _Inout_ ULONG
*InOutBufferSize
,
1999 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
2004 IoWMIQuerySingleInstance(
2005 _In_ PVOID DataBlockObject
,
2006 _In_ PUNICODE_STRING InstanceName
,
2007 _Inout_ ULONG
*InOutBufferSize
,
2008 _Out_writes_bytes_opt_(*InOutBufferSize
) PVOID OutBuffer
);
2013 IoWMISetNotificationCallback(
2014 _Inout_ PVOID Object
,
2015 _In_ WMI_NOTIFICATION_CALLBACK Callback
,
2016 _In_opt_ PVOID Context
);
2021 IoWMISetSingleInstance(
2022 _In_ PVOID DataBlockObject
,
2023 _In_ PUNICODE_STRING InstanceName
,
2025 _In_ ULONG ValueBufferSize
,
2026 _In_reads_bytes_(ValueBufferSize
) PVOID ValueBuffer
);
2032 _In_ PVOID DataBlockObject
,
2033 _In_ PUNICODE_STRING InstanceName
,
2034 _In_ ULONG DataItemId
,
2036 _In_ ULONG ValueBufferSize
,
2037 _In_reads_bytes_(ValueBufferSize
) PVOID ValueBuffer
);
2040 _IRQL_requires_max_(PASSIVE_LEVEL
)
2044 IoReadPartitionTable(
2045 _In_ PDEVICE_OBJECT DeviceObject
,
2046 _In_ ULONG SectorSize
,
2047 _In_ BOOLEAN ReturnRecognizedPartitions
,
2048 _Out_
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
2050 _IRQL_requires_max_(PASSIVE_LEVEL
)
2054 IoSetPartitionInformation(
2055 _In_ PDEVICE_OBJECT DeviceObject
,
2056 _In_ ULONG SectorSize
,
2057 _In_ ULONG PartitionNumber
,
2058 _In_ ULONG PartitionType
);
2060 _IRQL_requires_max_(PASSIVE_LEVEL
)
2064 IoWritePartitionTable(
2065 _In_ PDEVICE_OBJECT DeviceObject
,
2066 _In_ ULONG SectorSize
,
2067 _In_ ULONG SectorsPerTrack
,
2068 _In_ ULONG NumberOfHeads
,
2069 _In_
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
2075 _In_ PDEVICE_OBJECT DeviceObject
,
2076 _In_opt_
struct _CREATE_DISK
* Disk
);
2081 IoReadDiskSignature(
2082 _In_ PDEVICE_OBJECT DeviceObject
,
2083 _In_ ULONG BytesPerSector
,
2084 _Out_ PDISK_SIGNATURE Signature
);
2086 _IRQL_requires_max_(PASSIVE_LEVEL
)
2090 IoReadPartitionTableEx(
2091 _In_ PDEVICE_OBJECT DeviceObject
,
2092 _Out_
struct _DRIVE_LAYOUT_INFORMATION_EX
**PartitionBuffer
);
2094 _IRQL_requires_max_(PASSIVE_LEVEL
)
2098 IoSetPartitionInformationEx(
2099 _In_ PDEVICE_OBJECT DeviceObject
,
2100 _In_ ULONG PartitionNumber
,
2101 _In_
struct _SET_PARTITION_INFORMATION_EX
*PartitionInfo
);
2106 IoSetSystemPartition(
2107 _In_ PUNICODE_STRING VolumeNameString
);
2112 IoVerifyPartitionTable(
2113 _In_ PDEVICE_OBJECT DeviceObject
,
2114 _In_ BOOLEAN FixErrors
);
2119 IoVolumeDeviceToDosName(
2120 _In_ PVOID VolumeDeviceObject
,
2121 _Out_
_When_(return==0,
2122 _At_(DosName
->Buffer
, __drv_allocatesMem(Mem
)))
2123 PUNICODE_STRING DosName
);
2125 _IRQL_requires_max_(PASSIVE_LEVEL
)
2129 IoWritePartitionTableEx(
2130 _In_ PDEVICE_OBJECT DeviceObject
,
2131 _In_reads_(_Inexpressible_(FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX
, PartitionEntry
[0])))
2132 struct _DRIVE_LAYOUT_INFORMATION_EX
*DriveLayout
);
2137 IoCreateFileSpecifyDeviceObjectHint(
2138 _Out_ PHANDLE FileHandle
,
2139 _In_ ACCESS_MASK DesiredAccess
,
2140 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
2141 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
2142 _In_opt_ PLARGE_INTEGER AllocationSize
,
2143 _In_ ULONG FileAttributes
,
2144 _In_ ULONG ShareAccess
,
2145 _In_ ULONG Disposition
,
2146 _In_ ULONG CreateOptions
,
2147 _In_opt_ PVOID EaBuffer
,
2148 _In_ ULONG EaLength
,
2149 _In_ CREATE_FILE_TYPE CreateFileType
,
2150 _In_opt_ PVOID InternalParameters
,
2152 _In_opt_ PVOID DeviceObject
);
2157 IoAttachDeviceToDeviceStackSafe(
2158 _In_ PDEVICE_OBJECT SourceDevice
,
2159 _In_ PDEVICE_OBJECT TargetDevice
,
2160 _Outptr_ PDEVICE_OBJECT
*AttachedToDeviceObject
);
2168 IoCreateStreamFileObjectEx(
2169 _In_opt_ PFILE_OBJECT FileObject
,
2170 _In_opt_ PDEVICE_OBJECT DeviceObject
,
2171 _Out_opt_ PHANDLE FileObjectHandle
);
2176 IoQueryFileDosDeviceName(
2177 _In_ PFILE_OBJECT FileObject
,
2178 _Out_ POBJECT_NAME_INFORMATION
*ObjectNameInformation
);
2183 IoEnumerateDeviceObjectList(
2184 _In_ PDRIVER_OBJECT DriverObject
,
2185 _Out_writes_bytes_to_opt_(DeviceObjectListSize
,(*ActualNumberDeviceObjects
)*sizeof(PDEVICE_OBJECT
))
2186 PDEVICE_OBJECT
*DeviceObjectList
,
2187 _In_ ULONG DeviceObjectListSize
,
2188 _Out_ PULONG ActualNumberDeviceObjects
);
2193 IoGetLowerDeviceObject(
2194 _In_ PDEVICE_OBJECT DeviceObject
);
2199 IoGetDeviceAttachmentBaseRef(
2200 _In_ PDEVICE_OBJECT DeviceObject
);
2205 IoGetDiskDeviceObject(
2206 _In_ PDEVICE_OBJECT FileSystemDeviceObject
,
2207 _Out_ PDEVICE_OBJECT
*DiskDeviceObject
);
2210 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2213 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
2217 IoValidateDeviceIoControlAccess(
2219 _In_ ULONG RequiredAccess
);
2223 $
if (_WDMDDK_
|| _NTDDK_
)
2224 #if (NTDDI_VERSION >= NTDDI_WS03)
2225 $
endif (_WDMDDK_
|| _NTDDK_
)
2230 IoGetPagingIoPriority(
2240 _In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrp
,
2241 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
2242 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
2243 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
2244 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
2245 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
2251 _Inout_ PIO_CSQ Csq
,
2253 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context
,
2254 _In_opt_ PVOID InsertContext
);
2256 $
if (_WDMDDK_
|| _NTDDK_
)
2257 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
2258 $
endif (_WDMDDK_
|| _NTDDK_
)
2259 $
if (_NTDDK_
|| _NTIFS_
)
2260 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2261 $
endif (_NTDDK_
|| _NTIFS_
)
2266 IoTranslateBusAddress(
2267 _In_ INTERFACE_TYPE InterfaceType
,
2268 _In_ ULONG BusNumber
,
2269 _In_ PHYSICAL_ADDRESS BusAddress
,
2270 _Inout_ PULONG AddressSpace
,
2271 _Out_ PPHYSICAL_ADDRESS TranslatedAddress
);
2278 IoEnumerateRegisteredFiltersList(
2279 _Out_writes_bytes_to_opt_(DriverObjectListSize
,(*ActualNumberDriverObjects
)*sizeof(PDRIVER_OBJECT
))
2280 PDRIVER_OBJECT
*DriverObjectList
,
2281 _In_ ULONG DriverObjectListSize
,
2282 _Out_ PULONG ActualNumberDriverObjects
);
2284 $
if (_NTDDK_
|| _NTIFS_
)
2285 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
2286 $
endif (_NTDDK_
|| _NTIFS_
)
2288 #if (NTDDI_VERSION >= NTDDI_VISTA)
2293 IoGetBootDiskInformationLite(
2294 _Outptr_ PBOOTDISK_INFORMATION_LITE
*BootDiskInformation
);
2299 IoCheckShareAccessEx(
2300 _In_ ACCESS_MASK DesiredAccess
,
2301 _In_ ULONG DesiredShareAccess
,
2302 _Inout_ PFILE_OBJECT FileObject
,
2303 _Inout_ PSHARE_ACCESS ShareAccess
,
2304 _In_ BOOLEAN Update
,
2305 _In_ PBOOLEAN WritePermission
);
2310 IoConnectInterruptEx(
2311 _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters
);
2316 IoDisconnectInterruptEx(
2317 _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters
);
2321 IoWithinStackLimits(
2322 _In_ ULONG_PTR RegionStart
,
2323 _In_ SIZE_T RegionSize
);
2329 _In_ ACCESS_MASK DesiredAccess
,
2330 _In_ ULONG DesiredShareAccess
,
2331 _Inout_ PFILE_OBJECT FileObject
,
2332 _Out_ PSHARE_ACCESS ShareAccess
,
2333 _In_ PBOOLEAN WritePermission
);
2337 IoSizeofWorkItem(VOID
);
2341 IoInitializeWorkItem(
2342 _In_ PVOID IoObject
,
2343 _Out_ PIO_WORKITEM IoWorkItem
);
2347 IoUninitializeWorkItem(
2348 _Inout_ PIO_WORKITEM IoWorkItem
);
2350 _IRQL_requires_max_(DISPATCH_LEVEL
)
2354 _Inout_ PIO_WORKITEM IoWorkItem
,
2355 _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine
,
2356 _In_ WORK_QUEUE_TYPE QueueType
,
2357 _In_opt_ __drv_aliasesMem PVOID Context
);
2361 IoGetIoPriorityHint(
2366 IoSetIoPriorityHint(
2368 _In_ IO_PRIORITY_HINT PriorityHint
);
2372 IoAllocateSfioStreamIdentifier(
2373 _In_ PFILE_OBJECT FileObject
,
2375 _In_ PVOID Signature
,
2376 _Out_ PVOID
*StreamIdentifier
);
2380 IoGetSfioStreamIdentifier(
2381 _In_ PFILE_OBJECT FileObject
,
2382 _In_ PVOID Signature
);
2386 IoFreeSfioStreamIdentifier(
2387 _In_ PFILE_OBJECT FileObject
,
2388 _In_ PVOID Signature
);
2390 _IRQL_requires_max_(DISPATCH_LEVEL
)
2391 _Must_inspect_result_
2395 IoRequestDeviceEjectEx(
2396 _In_ PDEVICE_OBJECT PhysicalDeviceObject
,
2397 _In_opt_ PIO_DEVICE_EJECT_CALLBACK Callback
,
2398 _In_opt_ PVOID Context
,
2399 _In_opt_ PDRIVER_OBJECT DriverObject
);
2401 _IRQL_requires_max_(PASSIVE_LEVEL
)
2402 _Must_inspect_result_
2406 IoSetDevicePropertyData(
2407 _In_ PDEVICE_OBJECT Pdo
,
2408 _In_ CONST DEVPROPKEY
*PropertyKey
,
2411 _In_ DEVPROPTYPE Type
,
2413 _In_opt_ PVOID Data
);
2415 _IRQL_requires_max_(PASSIVE_LEVEL
)
2416 _Must_inspect_result_
2420 IoGetDevicePropertyData(
2421 _In_ PDEVICE_OBJECT Pdo
,
2422 _In_ CONST DEVPROPKEY
*PropertyKey
,
2424 _Reserved_ ULONG Flags
,
2427 _Out_ PULONG RequiredSize
,
2428 _Out_ PDEVPROPTYPE Type
);
2435 IoUpdateDiskGeometry(
2436 _In_ PDEVICE_OBJECT DeviceObject
,
2437 _In_
struct _DISK_GEOMETRY_EX
* OldDiskGeometry
,
2438 _In_
struct _DISK_GEOMETRY_EX
* NewDiskGeometry
);
2440 PTXN_PARAMETER_BLOCK
2442 IoGetTransactionParameterBlock(
2443 _In_ PFILE_OBJECT FileObject
);
2449 _Out_ PHANDLE FileHandle
,
2450 _In_ ACCESS_MASK DesiredAccess
,
2451 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
2452 _Out_ PIO_STATUS_BLOCK IoStatusBlock
,
2453 _In_opt_ PLARGE_INTEGER AllocationSize
,
2454 _In_ ULONG FileAttributes
,
2455 _In_ ULONG ShareAccess
,
2456 _In_ ULONG Disposition
,
2457 _In_ ULONG CreateOptions
,
2458 _In_opt_ PVOID EaBuffer
,
2459 _In_ ULONG EaLength
,
2460 _In_ CREATE_FILE_TYPE CreateFileType
,
2461 _In_opt_ PVOID InternalParameters
,
2463 _In_opt_ PIO_DRIVER_CREATE_CONTEXT DriverContext
);
2467 IoSetIrpExtraCreateParameter(
2469 _In_
struct _ECP_LIST
*ExtraCreateParameter
);
2473 IoClearIrpExtraCreateParameter(
2478 IoGetIrpExtraCreateParameter(
2480 _Outptr_result_maybenull_
struct _ECP_LIST
**ExtraCreateParameter
);
2484 IoIsFileObjectIgnoringSharing(
2485 _In_ PFILE_OBJECT FileObject
);
2493 IoInitializePriorityInfo(
2494 _In_ PIO_PRIORITY_INFO PriorityInfo
)
2496 PriorityInfo
->Size
= sizeof(IO_PRIORITY_INFO
);
2497 PriorityInfo
->ThreadPriority
= 0xffff;
2498 PriorityInfo
->IoPriority
= IoPriorityNormal
;
2499 PriorityInfo
->PagePriority
= 0;
2502 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
2505 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
2507 #if (NTDDI_VERSION >= NTDDI_WS08)
2508 _IRQL_requires_max_(PASSIVE_LEVEL
)
2509 _Must_inspect_result_
2513 IoReplacePartitionUnit(
2514 _In_ PDEVICE_OBJECT TargetPdo
,
2515 _In_ PDEVICE_OBJECT SparePdo
,
2520 #if (NTDDI_VERSION >= NTDDI_WIN7)
2526 IoGetAffinityInterrupt(
2527 _In_ PKINTERRUPT InterruptObject
,
2528 _Out_ PGROUP_AFFINITY GroupAffinity
);
2532 IoGetContainerInformation(
2533 _In_ IO_CONTAINER_INFORMATION_CLASS InformationClass
,
2534 _In_opt_ PVOID ContainerObject
,
2535 _Inout_updates_bytes_opt_(BufferLength
) PVOID Buffer
,
2536 _In_ ULONG BufferLength
);
2540 IoRegisterContainerNotification(
2541 _In_ IO_CONTAINER_NOTIFICATION_CLASS NotificationClass
,
2542 _In_ PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction
,
2543 _In_reads_bytes_opt_(NotificationInformationLength
) PVOID NotificationInformation
,
2544 _In_ ULONG NotificationInformationLength
,
2545 _Out_ PVOID CallbackRegistration
);
2549 IoUnregisterContainerNotification(
2550 _In_ PVOID CallbackRegistration
);
2552 _IRQL_requires_max_(PASSIVE_LEVEL
)
2553 __drv_freesMem(Pool
)
2557 IoUnregisterPlugPlayNotificationEx(
2558 _In_ PVOID NotificationEntry
);
2560 _IRQL_requires_max_(PASSIVE_LEVEL
)
2561 _Must_inspect_result_
2565 IoGetDeviceNumaNode(
2566 _In_ PDEVICE_OBJECT Pdo
,
2567 _Out_ PUSHORT NodeNumber
);
2573 IoSetFileObjectIgnoreSharing(
2574 _In_ PFILE_OBJECT FileObject
);
2582 IoRegisterFsRegistrationChangeMountAware(
2583 _In_ PDRIVER_OBJECT DriverObject
,
2584 _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine
,
2585 _In_ BOOLEAN SynchronizeWithMounts
);
2590 IoReplaceFileObjectName(
2591 _In_ PFILE_OBJECT FileObject
,
2592 _In_reads_bytes_(FileNameLength
) PWSTR NewFileName
,
2593 _In_ USHORT FileNameLength
);
2595 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2602 IoWMIDeviceObjectToProviderId(
2603 _In_ PDEVICE_OBJECT DeviceObject
);
2605 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
2611 * IN CCHAR StackSize)
2613 #define IoSizeOfIrp(_StackSize) \
2614 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
2618 IoSkipCurrentIrpStackLocation(
2621 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
2622 Irp
->CurrentLocation
++;
2623 #ifdef NONAMELESSUNION
2624 Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
++;
2626 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
2632 IoSetNextIrpStackLocation(
2635 ASSERT(Irp
->CurrentLocation
> 0);
2636 Irp
->CurrentLocation
--;
2637 #ifdef NONAMELESSUNION
2638 Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
--;
2640 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
2647 IoGetNextIrpStackLocation(
2650 ASSERT(Irp
->CurrentLocation
> 0);
2651 #ifdef NONAMELESSUNION
2652 return ((Irp
)->Tail
.Overlay
.s
.u
.CurrentStackLocation
- 1 );
2654 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
2658 _IRQL_requires_max_(DISPATCH_LEVEL
)
2661 IoSetCompletionRoutine(
2663 _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine
,
2664 _In_opt_ __drv_aliasesMem PVOID Context
,
2665 _In_ BOOLEAN InvokeOnSuccess
,
2666 _In_ BOOLEAN InvokeOnError
,
2667 _In_ BOOLEAN InvokeOnCancel
)
2669 PIO_STACK_LOCATION irpSp
;
2670 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
2671 irpSp
= IoGetNextIrpStackLocation(Irp
);
2672 irpSp
->CompletionRoutine
= CompletionRoutine
;
2673 irpSp
->Context
= Context
;
2676 if (InvokeOnSuccess
) {
2677 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
2680 if (InvokeOnError
) {
2681 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
2684 if (InvokeOnCancel
) {
2685 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
2689 _IRQL_requires_max_(DISPATCH_LEVEL
)
2695 _In_opt_ PDRIVER_CANCEL CancelRoutine
)
2697 return (PDRIVER_CANCEL
)(ULONG_PTR
) InterlockedExchangePointer((PVOID
*)&(Irp
)->CancelRoutine
, (PVOID
)(ULONG_PTR
)(CancelRoutine
));
2703 _Inout_ PDEVICE_OBJECT DeviceObject
,
2705 _In_opt_ __drv_aliasesMem PVOID Context
)
2707 KeInsertQueueDpc(&DeviceObject
->Dpc
, Irp
, Context
);
2712 * IoReleaseRemoveLock(
2713 * IN PIO_REMOVE_LOCK RemoveLock,
2716 #define IoReleaseRemoveLock(_RemoveLock, \
2718 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
2722 * IoReleaseRemoveLockAndWait(
2723 * IN PIO_REMOVE_LOCK RemoveLock,
2726 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
2728 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
2731 _IRQL_requires_max_(DISPATCH_LEVEL
)
2738 #define PLUGPLAY_REGKEY_DEVICE 1
2739 #define PLUGPLAY_REGKEY_DRIVER 2
2740 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
2745 IoGetCurrentIrpStackLocation(
2748 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
2749 #ifdef NONAMELESSUNION
2750 return Irp
->Tail
.Overlay
.s
.u
.CurrentStackLocation
;
2752 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
2761 IoGetCurrentIrpStackLocation((Irp
))->Control
|= SL_PENDING_RETURNED
;
2766 * IoIsErrorUserInduced(
2767 * IN NTSTATUS Status);
2769 #define IoIsErrorUserInduced(Status) \
2770 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
2771 ((Status) == STATUS_IO_TIMEOUT) || \
2772 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
2773 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
2774 ((Status) == STATUS_VERIFY_REQUIRED) || \
2775 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
2776 ((Status) == STATUS_WRONG_VOLUME)))
2779 * IoInitializeRemoveLock(
2780 * IN PIO_REMOVE_LOCK Lock,
2781 * IN ULONG AllocateTag,
2782 * IN ULONG MaxLockedMinutes,
2783 * IN ULONG HighWatermark)
2785 #define IoInitializeRemoveLock( \
2786 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
2787 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
2788 HighWatermark, sizeof(IO_REMOVE_LOCK))
2792 IoInitializeDpcRequest(
2793 _In_ PDEVICE_OBJECT DeviceObject
,
2794 _In_ PIO_DPC_ROUTINE DpcRoutine
)
2797 #pragma warning(push)
2798 #pragma warning(disable:28024)
2800 KeInitializeDpc(&DeviceObject
->Dpc
,
2801 (PKDEFERRED_ROUTINE
) DpcRoutine
,
2804 #pragma warning(pop)
2808 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
2812 * IoGetFunctionCodeFromCtlCode(
2813 * IN ULONG ControlCode)
2815 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
2816 (((_ControlCode) >> 2) & 0x00000FFF)
2820 IoCopyCurrentIrpStackLocationToNext(
2823 PIO_STACK_LOCATION irpSp
;
2824 PIO_STACK_LOCATION nextIrpSp
;
2825 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
2826 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
2827 RtlCopyMemory(nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
2828 nextIrpSp
->Control
= 0;
2831 _IRQL_requires_max_(APC_LEVEL
)
2836 _Out_ PULONG_PTR LowLimit
,
2837 _Out_ PULONG_PTR HighLimit
);
2839 _IRQL_requires_max_(APC_LEVEL
)
2842 IoGetRemainingStackSize(VOID
)
2844 ULONG_PTR End
, Begin
;
2847 IoGetStackLimits(&Begin
, &End
);
2848 Result
= (ULONG_PTR
)(&End
) - Begin
;
2852 #if (NTDDI_VERSION >= NTDDI_WS03)
2855 IoInitializeThreadedDpcRequest(
2856 _In_ PDEVICE_OBJECT DeviceObject
,
2857 _In_ PIO_DPC_ROUTINE DpcRoutine
)
2860 #pragma warning(push)
2861 #pragma warning(disable:28024)
2862 #pragma warning(disable:28128)
2864 KeInitializeThreadedDpc(&DeviceObject
->Dpc
,
2865 (PKDEFERRED_ROUTINE
) DpcRoutine
,
2868 #pragma warning(pop)