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 PVOID WnodeEventItem
);
1182 IoWriteErrorLogEntry(
1185 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1187 #if (NTDDI_VERSION >= NTDDI_WINXP)
1194 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
1195 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
1196 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
1197 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
1198 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
1199 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
1207 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
);
1214 IN PIO_CSQ_IRP_CONTEXT Context
);
1221 IN PVOID PeekContext
);
1226 IoForwardIrpSynchronously(
1227 IN PDEVICE_OBJECT DeviceObject
,
1230 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
1235 IoFreeErrorLogEntry(
1241 IoSetCompletionRoutineEx(
1242 IN PDEVICE_OBJECT DeviceObject
,
1244 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
1246 IN BOOLEAN InvokeOnSuccess
,
1247 IN BOOLEAN InvokeOnError
,
1248 IN BOOLEAN InvokeOnCancel
);
1252 IoSetStartIoAttributes(
1253 IN PDEVICE_OBJECT DeviceObject
,
1254 IN BOOLEAN DeferredStartIo
,
1255 IN BOOLEAN NonCancelable
);
1260 IoWMIDeviceObjectToInstanceName(
1261 IN PVOID DataBlockObject
,
1262 IN PDEVICE_OBJECT DeviceObject
,
1263 OUT PUNICODE_STRING InstanceName
);
1269 IN PVOID DataBlockObject
,
1270 IN PUNICODE_STRING InstanceName
,
1272 IN ULONG InBufferSize
,
1273 IN OUT PULONG OutBufferSize
,
1274 IN OUT PUCHAR InOutBuffer
);
1279 IoWMIHandleToInstanceName(
1280 IN PVOID DataBlockObject
,
1281 IN HANDLE FileHandle
,
1282 OUT PUNICODE_STRING InstanceName
);
1288 IN GUID
*DataBlockGuid
,
1289 IN ULONG DesiredAccess
,
1290 OUT PVOID
*DataBlockObject
);
1296 IN PVOID DataBlockObject
,
1297 IN OUT ULONG
*InOutBufferSize
,
1298 OUT PVOID OutBuffer
);
1303 IoWMIQueryAllDataMultiple(
1304 IN PVOID
*DataBlockObjectList
,
1305 IN ULONG ObjectCount
,
1306 IN OUT ULONG
*InOutBufferSize
,
1307 OUT PVOID OutBuffer
);
1312 IoWMIQuerySingleInstance(
1313 IN PVOID DataBlockObject
,
1314 IN PUNICODE_STRING InstanceName
,
1315 IN OUT ULONG
*InOutBufferSize
,
1316 OUT PVOID OutBuffer
);
1321 IoWMISetNotificationCallback(
1322 IN OUT PVOID Object
,
1323 IN WMI_NOTIFICATION_CALLBACK Callback
,
1324 IN PVOID Context OPTIONAL
);
1329 IoWMISetSingleInstance(
1330 IN PVOID DataBlockObject
,
1331 IN PUNICODE_STRING InstanceName
,
1333 IN ULONG ValueBufferSize
,
1334 IN PVOID ValueBuffer
);
1340 IN PVOID DataBlockObject
,
1341 IN PUNICODE_STRING InstanceName
,
1342 IN ULONG DataItemId
,
1344 IN ULONG ValueBufferSize
,
1345 IN PVOID ValueBuffer
);
1347 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1353 IoWMIDeviceObjectToProviderId(
1354 IN PDEVICE_OBJECT DeviceObject
);
1356 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
1362 * IN CCHAR StackSize)
1364 #define IoSizeOfIrp(_StackSize) \
1365 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
1369 IoSkipCurrentIrpStackLocation(
1372 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
1373 Irp
->CurrentLocation
++;
1374 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
1379 IoSetNextIrpStackLocation(
1382 ASSERT(Irp
->CurrentLocation
> 0);
1383 Irp
->CurrentLocation
--;
1384 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
1389 IoGetNextIrpStackLocation(
1392 ASSERT(Irp
->CurrentLocation
> 0);
1393 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
1398 IoSetCompletionRoutine(
1400 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
1401 IN PVOID Context OPTIONAL
,
1402 IN BOOLEAN InvokeOnSuccess
,
1403 IN BOOLEAN InvokeOnError
,
1404 IN BOOLEAN InvokeOnCancel
)
1406 PIO_STACK_LOCATION irpSp
;
1407 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
1408 irpSp
= IoGetNextIrpStackLocation(Irp
);
1409 irpSp
->CompletionRoutine
= CompletionRoutine
;
1410 irpSp
->Context
= Context
;
1413 if (InvokeOnSuccess
) {
1414 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
1417 if (InvokeOnError
) {
1418 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
1421 if (InvokeOnCancel
) {
1422 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
1428 * IoSetCancelRoutine(
1430 * IN PDRIVER_CANCEL CancelRoutine)
1432 #define IoSetCancelRoutine(_Irp, \
1434 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
1435 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
1440 * IN PDEVICE_OBJECT DeviceObject,
1442 * IN PVOID Context);
1444 #define IoRequestDpc(DeviceObject, Irp, Context)( \
1445 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
1449 * IoReleaseRemoveLock(
1450 * IN PIO_REMOVE_LOCK RemoveLock,
1453 #define IoReleaseRemoveLock(_RemoveLock, \
1455 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
1459 * IoReleaseRemoveLockAndWait(
1460 * IN PIO_REMOVE_LOCK RemoveLock,
1463 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
1465 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
1471 IN PIRP Irp OPTIONAL
);
1474 #define PLUGPLAY_REGKEY_DEVICE 1
1475 #define PLUGPLAY_REGKEY_DRIVER 2
1476 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
1480 IoGetCurrentIrpStackLocation(
1483 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
1484 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
1492 IoGetCurrentIrpStackLocation( (Irp
) )->Control
|= SL_PENDING_RETURNED
;
1497 * IoIsErrorUserInduced(
1498 * IN NTSTATUS Status);
1500 #define IoIsErrorUserInduced(Status) \
1501 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
1502 ((Status) == STATUS_IO_TIMEOUT) || \
1503 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
1504 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
1505 ((Status) == STATUS_VERIFY_REQUIRED) || \
1506 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
1507 ((Status) == STATUS_WRONG_VOLUME)))
1510 * IoInitializeRemoveLock(
1511 * IN PIO_REMOVE_LOCK Lock,
1512 * IN ULONG AllocateTag,
1513 * IN ULONG MaxLockedMinutes,
1514 * IN ULONG HighWatermark)
1516 #define IoInitializeRemoveLock( \
1517 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
1518 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
1519 HighWatermark, sizeof(IO_REMOVE_LOCK))
1523 IoInitializeDpcRequest(
1524 IN PDEVICE_OBJECT DeviceObject
,
1525 IN PIO_DPC_ROUTINE DpcRoutine
)
1527 KeInitializeDpc( &DeviceObject
->Dpc
,
1528 (PKDEFERRED_ROUTINE
) DpcRoutine
,
1532 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
1536 * IoGetFunctionCodeFromCtlCode(
1537 * IN ULONG ControlCode)
1539 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
1540 (((_ControlCode) >> 2) & 0x00000FFF)
1544 IoCopyCurrentIrpStackLocationToNext(
1547 PIO_STACK_LOCATION irpSp
;
1548 PIO_STACK_LOCATION nextIrpSp
;
1549 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
1550 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
1551 RtlCopyMemory( nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
1552 nextIrpSp
->Control
= 0;
1559 OUT PULONG_PTR LowLimit
,
1560 OUT PULONG_PTR HighLimit
);
1564 IoGetRemainingStackSize(VOID
)
1566 ULONG_PTR End
, Begin
;
1569 IoGetStackLimits(&Begin
, &End
);
1570 Result
= (ULONG_PTR
)(&End
) - Begin
;