1 /******************************************************************************
2 * I/O Manager Functions *
3 ******************************************************************************/
6 * VOID IoAssignArcName(
7 * IN PUNICODE_STRING ArcName,
8 * IN PUNICODE_STRING DeviceName);
10 #define IoAssignArcName(_ArcName, _DeviceName) ( \
11 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
16 * IN PUNICODE_STRING ArcName)
18 #define IoDeassignArcName IoDeleteSymbolicLink
23 IoInitializeDriverCreateContext(
24 PIO_DRIVER_CREATE_CONTEXT DriverContext
)
26 RtlZeroMemory(DriverContext
, sizeof(IO_DRIVER_CREATE_CONTEXT
));
27 DriverContext
->Size
= sizeof(IO_DRIVER_CREATE_CONTEXT
);
35 * IoAcquireRemoveLock(
36 * IN PIO_REMOVE_LOCK RemoveLock,
37 * IN OPTIONAL PVOID Tag)
40 #define IoAcquireRemoveLock(RemoveLock, Tag) \
41 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
43 #define IoAcquireRemoveLock(RemoveLock, Tag) \
44 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
49 * IoAdjustPagingPathCount(
51 * IN BOOLEAN Increment)
53 #define IoAdjustPagingPathCount(_Count, \
58 InterlockedIncrement(_Count); \
62 InterlockedDecrement(_Count); \
66 #if !defined(_M_AMD64)
70 READ_PORT_BUFFER_UCHAR(
78 READ_PORT_BUFFER_ULONG(
86 READ_PORT_BUFFER_USHORT(
112 READ_REGISTER_BUFFER_UCHAR(
120 READ_REGISTER_BUFFER_ULONG(
128 READ_REGISTER_BUFFER_USHORT(
148 READ_REGISTER_USHORT(
149 IN PUSHORT Register
);
154 WRITE_PORT_BUFFER_UCHAR(
162 WRITE_PORT_BUFFER_ULONG(
170 WRITE_PORT_BUFFER_USHORT(
199 WRITE_REGISTER_BUFFER_UCHAR(
207 WRITE_REGISTER_BUFFER_ULONG(
215 WRITE_REGISTER_BUFFER_USHORT(
223 WRITE_REGISTER_UCHAR(
230 WRITE_REGISTER_ULONG(
237 WRITE_REGISTER_USHORT(
245 READ_PORT_BUFFER_UCHAR(
250 __inbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
255 READ_PORT_BUFFER_ULONG(
260 __indwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
265 READ_PORT_BUFFER_USHORT(
270 __inwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
278 return __inbyte((USHORT
)(ULONG_PTR
)Port
);
286 return __indword((USHORT
)(ULONG_PTR
)Port
);
294 return __inword((USHORT
)(ULONG_PTR
)Port
);
299 READ_REGISTER_BUFFER_UCHAR(
304 __movsb(Register
, Buffer
, Count
);
309 READ_REGISTER_BUFFER_ULONG(
314 __movsd(Register
, Buffer
, Count
);
319 READ_REGISTER_BUFFER_USHORT(
324 __movsw(Register
, Buffer
, Count
);
330 IN
volatile UCHAR
*Register
)
338 IN
volatile ULONG
*Register
)
345 READ_REGISTER_USHORT(
346 IN
volatile USHORT
*Register
)
353 WRITE_PORT_BUFFER_UCHAR(
358 __outbytestring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
363 WRITE_PORT_BUFFER_ULONG(
368 __outdwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
373 WRITE_PORT_BUFFER_USHORT(
378 __outwordstring((USHORT
)(ULONG_PTR
)Port
, Buffer
, Count
);
387 __outbyte((USHORT
)(ULONG_PTR
)Port
, Value
);
396 __outdword((USHORT
)(ULONG_PTR
)Port
, Value
);
405 __outword((USHORT
)(ULONG_PTR
)Port
, Value
);
410 WRITE_REGISTER_BUFFER_UCHAR(
416 __movsb(Register
, Buffer
, Count
);
417 InterlockedOr(&Synch
, 1);
422 WRITE_REGISTER_BUFFER_ULONG(
428 __movsd(Register
, Buffer
, Count
);
429 InterlockedOr(&Synch
, 1);
434 WRITE_REGISTER_BUFFER_USHORT(
440 __movsw(Register
, Buffer
, Count
);
441 InterlockedOr(&Synch
, 1);
446 WRITE_REGISTER_UCHAR(
447 IN
volatile UCHAR
*Register
,
452 InterlockedOr(&Synch
, 1);
457 WRITE_REGISTER_ULONG(
458 IN
volatile ULONG
*Register
,
463 InterlockedOr(&Synch
, 1);
468 WRITE_REGISTER_USHORT(
469 IN
volatile USHORT
*Register
,
474 InterlockedOr(&Sync
, 1);
478 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
479 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
481 #define DMA_MACROS_DEFINED
485 IoAllocateAdapterChannel(
486 IN PDMA_ADAPTER DmaAdapter
,
487 IN PDEVICE_OBJECT DeviceObject
,
488 IN ULONG NumberOfMapRegisters
,
489 IN PDRIVER_CONTROL ExecutionRoutine
,
492 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel
;
493 AllocateAdapterChannel
=
494 *(DmaAdapter
)->DmaOperations
->AllocateAdapterChannel
;
495 ASSERT(AllocateAdapterChannel
);
496 return AllocateAdapterChannel(DmaAdapter
,
498 NumberOfMapRegisters
,
506 IoFlushAdapterBuffers(
507 IN PDMA_ADAPTER DmaAdapter
,
509 IN PVOID MapRegisterBase
,
512 IN BOOLEAN WriteToDevice
)
514 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers
;
515 FlushAdapterBuffers
= *(DmaAdapter
)->DmaOperations
->FlushAdapterBuffers
;
516 ASSERT(FlushAdapterBuffers
);
517 return FlushAdapterBuffers(DmaAdapter
,
528 IoFreeAdapterChannel(
529 IN PDMA_ADAPTER DmaAdapter
)
531 PFREE_ADAPTER_CHANNEL FreeAdapterChannel
;
532 FreeAdapterChannel
= *(DmaAdapter
)->DmaOperations
->FreeAdapterChannel
;
533 ASSERT(FreeAdapterChannel
);
534 FreeAdapterChannel(DmaAdapter
);
541 IN PDMA_ADAPTER DmaAdapter
,
542 IN PVOID MapRegisterBase
,
543 IN ULONG NumberOfMapRegisters
)
545 PFREE_MAP_REGISTERS FreeMapRegisters
;
546 FreeMapRegisters
= *(DmaAdapter
)->DmaOperations
->FreeMapRegisters
;
547 ASSERT(FreeMapRegisters
);
548 FreeMapRegisters(DmaAdapter
, MapRegisterBase
, NumberOfMapRegisters
);
555 IN PDMA_ADAPTER DmaAdapter
,
557 IN PVOID MapRegisterBase
,
559 IN OUT PULONG Length
,
560 IN BOOLEAN WriteToDevice
)
562 PMAP_TRANSFER MapTransfer
;
564 MapTransfer
= *(DmaAdapter
)->DmaOperations
->MapTransfer
;
566 return MapTransfer(DmaAdapter
,
576 #if (NTDDI_VERSION >= NTDDI_WIN2K)
578 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
582 IoAllocateAdapterChannel(
583 IN PADAPTER_OBJECT AdapterObject
,
584 IN PDEVICE_OBJECT DeviceObject
,
585 IN ULONG NumberOfMapRegisters
,
586 IN PDRIVER_CONTROL ExecutionRoutine
,
590 #if !defined(DMA_MACROS_DEFINED)
591 //DECLSPEC_DEPRECATED_DDK
596 IN PADAPTER_OBJECT AdapterObject
,
598 IN PVOID MapRegisterBase
,
600 IN OUT PULONG Length
,
601 IN BOOLEAN WriteToDevice
);
607 IoAllocateController(
608 IN PCONTROLLER_OBJECT ControllerObject
,
609 IN PDEVICE_OBJECT DeviceObject
,
610 IN PDRIVER_CONTROL ExecutionRoutine
,
611 IN PVOID Context OPTIONAL
);
623 IN PCONTROLLER_OBJECT ControllerObject
);
629 IN PCONTROLLER_OBJECT ControllerObject
);
632 PCONFIGURATION_INFORMATION
634 IoGetConfigurationInformation(VOID
);
646 IN PDEVICE_OBJECT DeviceObject
,
647 IN PFILE_OBJECT FileObject
);
652 IoGetFileObjectGenericMapping(VOID
);
664 IoQueryDeviceDescription(
665 IN PINTERFACE_TYPE BusType OPTIONAL
,
666 IN PULONG BusNumber OPTIONAL
,
667 IN PCONFIGURATION_TYPE ControllerType OPTIONAL
,
668 IN PULONG ControllerNumber OPTIONAL
,
669 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL
,
670 IN PULONG PeripheralNumber OPTIONAL
,
671 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
,
672 IN OUT PVOID Context OPTIONAL
);
679 IN PVPB Vpb OPTIONAL
,
680 IN PDEVICE_OBJECT RealDeviceObject
);
685 IoRaiseInformationalHardError(
686 IN NTSTATUS ErrorStatus
,
687 IN PUNICODE_STRING String OPTIONAL
,
688 IN PKTHREAD Thread OPTIONAL
);
693 IoRegisterBootDriverReinitialization(
694 IN PDRIVER_OBJECT DriverObject
,
695 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
696 IN PVOID Context OPTIONAL
);
701 IoRegisterDriverReinitialization(
702 IN PDRIVER_OBJECT DriverObject
,
703 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
704 IN PVOID Context OPTIONAL
);
709 IoAttachDeviceByPointer(
710 IN PDEVICE_OBJECT SourceDevice
,
711 IN PDEVICE_OBJECT TargetDevice
);
716 IoReportDetectedDevice(
717 IN PDRIVER_OBJECT DriverObject
,
718 IN INTERFACE_TYPE LegacyBusType
,
721 IN PCM_RESOURCE_LIST ResourceList OPTIONAL
,
722 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL
,
723 IN BOOLEAN ResourceAssigned
,
724 IN OUT PDEVICE_OBJECT
*DeviceObject OPTIONAL
);
729 IoReportResourceForDetection(
730 IN PDRIVER_OBJECT DriverObject
,
731 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
732 IN ULONG DriverListSize OPTIONAL
,
733 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
734 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
735 IN ULONG DeviceListSize OPTIONAL
,
736 OUT PBOOLEAN ConflictDetected
);
741 IoReportResourceUsage(
742 IN PUNICODE_STRING DriverClassName OPTIONAL
,
743 IN PDRIVER_OBJECT DriverObject
,
744 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
745 IN ULONG DriverListSize OPTIONAL
,
746 IN PDEVICE_OBJECT DeviceObject
,
747 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
748 IN ULONG DeviceListSize OPTIONAL
,
749 IN BOOLEAN OverrideConflict
,
750 OUT PBOOLEAN ConflictDetected
);
755 IoSetHardErrorOrVerifyDevice(
757 IN PDEVICE_OBJECT DeviceObject
);
763 IN PUNICODE_STRING RegistryPath
,
764 IN PUNICODE_STRING DriverClassName OPTIONAL
,
765 IN PDRIVER_OBJECT DriverObject
,
766 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
767 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL
,
768 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
);
773 IoSetThreadHardErrorMode(
774 IN BOOLEAN EnableHardErrors
);
781 IoAcquireCancelSpinLock(
787 IoAcquireRemoveLockEx(
788 IN PIO_REMOVE_LOCK RemoveLock
,
789 IN PVOID Tag OPTIONAL
,
792 IN ULONG RemlockSize
);
796 IoAllocateDriverObjectExtension(
797 IN PDRIVER_OBJECT DriverObject
,
798 IN PVOID ClientIdentificationAddress
,
799 IN ULONG DriverObjectExtensionSize
,
800 OUT PVOID
*DriverObjectExtension
);
805 IoAllocateErrorLogEntry(
814 IN BOOLEAN ChargeQuota
);
820 IN PVOID VirtualAddress OPTIONAL
,
822 IN BOOLEAN SecondaryBuffer
,
823 IN BOOLEAN ChargeQuota
,
824 IN OUT PIRP Irp OPTIONAL
);
830 IN PDEVICE_OBJECT DeviceObject
);
836 IN PDEVICE_OBJECT SourceDevice
,
837 IN PUNICODE_STRING TargetDevice
,
838 OUT PDEVICE_OBJECT
*AttachedDevice
);
843 IoAttachDeviceToDeviceStack(
844 IN PDEVICE_OBJECT SourceDevice
,
845 IN PDEVICE_OBJECT TargetDevice
);
850 IoBuildAsynchronousFsdRequest(
851 IN ULONG MajorFunction
,
852 IN PDEVICE_OBJECT DeviceObject
,
853 IN OUT PVOID Buffer OPTIONAL
,
854 IN ULONG Length OPTIONAL
,
855 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
856 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
861 IoBuildDeviceIoControlRequest(
862 IN ULONG IoControlCode
,
863 IN PDEVICE_OBJECT DeviceObject
,
864 IN PVOID InputBuffer OPTIONAL
,
865 IN ULONG InputBufferLength
,
866 OUT PVOID OutputBuffer OPTIONAL
,
867 IN ULONG OutputBufferLength
,
868 IN BOOLEAN InternalDeviceIoControl
,
870 OUT PIO_STATUS_BLOCK IoStatusBlock
);
877 IN OUT PMDL TargetMdl
,
878 IN PVOID VirtualAddress
,
884 IoBuildSynchronousFsdRequest(
885 IN ULONG MajorFunction
,
886 IN PDEVICE_OBJECT DeviceObject
,
887 IN OUT PVOID Buffer OPTIONAL
,
888 IN ULONG Length OPTIONAL
,
889 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
891 OUT PIO_STATUS_BLOCK IoStatusBlock
);
897 IN PDEVICE_OBJECT DeviceObject
,
899 #define IoCallDriver IofCallDriver
906 IN CCHAR PriorityBoost
);
907 #define IoCompleteRequest IofCompleteRequest
919 IN ACCESS_MASK DesiredAccess
,
920 IN ULONG DesiredShareAccess
,
921 IN OUT PFILE_OBJECT FileObject
,
922 IN OUT PSHARE_ACCESS ShareAccess
,
930 IN CCHAR PriorityBoost
);
936 OUT PKINTERRUPT
*InterruptObject
,
937 IN PKSERVICE_ROUTINE ServiceRoutine
,
938 IN PVOID ServiceContext OPTIONAL
,
939 IN PKSPIN_LOCK SpinLock OPTIONAL
,
942 IN KIRQL SynchronizeIrql
,
943 IN KINTERRUPT_MODE InterruptMode
,
944 IN BOOLEAN ShareVector
,
945 IN KAFFINITY ProcessorEnableMask
,
946 IN BOOLEAN FloatingSave
);
952 IN PDRIVER_OBJECT DriverObject
,
953 IN ULONG DeviceExtensionSize
,
954 IN PUNICODE_STRING DeviceName OPTIONAL
,
955 IN DEVICE_TYPE DeviceType
,
956 IN ULONG DeviceCharacteristics
,
957 IN BOOLEAN Exclusive
,
958 OUT PDEVICE_OBJECT
*DeviceObject
);
964 OUT PHANDLE FileHandle
,
965 IN ACCESS_MASK DesiredAccess
,
966 IN POBJECT_ATTRIBUTES ObjectAttributes
,
967 OUT PIO_STATUS_BLOCK IoStatusBlock
,
968 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
969 IN ULONG FileAttributes
,
970 IN ULONG ShareAccess
,
971 IN ULONG Disposition
,
972 IN ULONG CreateOptions
,
973 IN PVOID EaBuffer OPTIONAL
,
975 IN CREATE_FILE_TYPE CreateFileType
,
976 IN PVOID InternalParameters OPTIONAL
,
982 IoCreateNotificationEvent(
983 IN PUNICODE_STRING EventName
,
984 OUT PHANDLE EventHandle
);
989 IoCreateSymbolicLink(
990 IN PUNICODE_STRING SymbolicLinkName
,
991 IN PUNICODE_STRING DeviceName
);
996 IoCreateSynchronizationEvent(
997 IN PUNICODE_STRING EventName
,
998 OUT PHANDLE EventHandle
);
1003 IoCreateUnprotectedSymbolicLink(
1004 IN PUNICODE_STRING SymbolicLinkName
,
1005 IN PUNICODE_STRING DeviceName
);
1011 IN PDEVICE_OBJECT DeviceObject
);
1016 IoDeleteSymbolicLink(
1017 IN PUNICODE_STRING SymbolicLinkName
);
1023 IN OUT PDEVICE_OBJECT TargetDevice
);
1028 IoDisconnectInterrupt(
1029 IN PKINTERRUPT InterruptObject
);
1047 IN PIO_WORKITEM IoWorkItem
);
1052 IoGetAttachedDevice(
1053 IN PDEVICE_OBJECT DeviceObject
);
1058 IoGetAttachedDeviceReference(
1059 IN PDEVICE_OBJECT DeviceObject
);
1064 IoGetBootDiskInformation(
1065 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
1071 IoGetDeviceInterfaceAlias(
1072 IN PUNICODE_STRING SymbolicLinkName
,
1073 IN CONST GUID
*AliasInterfaceClassGuid
,
1074 OUT PUNICODE_STRING AliasSymbolicLinkName
);
1079 IoGetCurrentProcess(VOID
);
1084 IoGetDeviceInterfaces(
1085 IN CONST GUID
*InterfaceClassGuid
,
1086 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
1088 OUT PWSTR
*SymbolicLinkList
);
1093 IoGetDeviceObjectPointer(
1094 IN PUNICODE_STRING ObjectName
,
1095 IN ACCESS_MASK DesiredAccess
,
1096 OUT PFILE_OBJECT
*FileObject
,
1097 OUT PDEVICE_OBJECT
*DeviceObject
);
1102 IoGetDeviceProperty(
1103 IN PDEVICE_OBJECT DeviceObject
,
1104 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
1105 IN ULONG BufferLength
,
1106 OUT PVOID PropertyBuffer
,
1107 OUT PULONG ResultLength
);
1113 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
1114 IN PDEVICE_DESCRIPTION DeviceDescription
,
1115 IN OUT PULONG NumberOfMapRegisters
);
1120 IoGetDriverObjectExtension(
1121 IN PDRIVER_OBJECT DriverObject
,
1122 IN PVOID ClientIdentificationAddress
);
1127 IoGetInitialStack(VOID
);
1132 IoGetRelatedDeviceObject(
1133 IN PFILE_OBJECT FileObject
);
1139 IN PIO_WORKITEM IoWorkItem
,
1140 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
1141 IN WORK_QUEUE_TYPE QueueType
,
1142 IN PVOID Context OPTIONAL
);
1149 IN USHORT PacketSize
,
1150 IN CCHAR StackSize
);
1155 IoInitializeRemoveLockEx(
1156 IN PIO_REMOVE_LOCK Lock
,
1157 IN ULONG AllocateTag
,
1158 IN ULONG MaxLockedMinutes
,
1159 IN ULONG HighWatermark
,
1160 IN ULONG RemlockSize
);
1166 IN PDEVICE_OBJECT DeviceObject
,
1167 IN PIO_TIMER_ROUTINE TimerRoutine
,
1168 IN PVOID Context OPTIONAL
);
1173 IoInvalidateDeviceRelations(
1174 IN PDEVICE_OBJECT DeviceObject
,
1175 IN DEVICE_RELATION_TYPE Type
);
1180 IoInvalidateDeviceState(
1181 IN PDEVICE_OBJECT PhysicalDeviceObject
);
1186 IoIsWdmVersionAvailable(
1187 IN UCHAR MajorVersion
,
1188 IN UCHAR MinorVersion
);
1193 IoOpenDeviceInterfaceRegistryKey(
1194 IN PUNICODE_STRING SymbolicLinkName
,
1195 IN ACCESS_MASK DesiredAccess
,
1196 OUT PHANDLE DeviceInterfaceKey
);
1201 IoOpenDeviceRegistryKey(
1202 IN PDEVICE_OBJECT DeviceObject
,
1203 IN ULONG DevInstKeyType
,
1204 IN ACCESS_MASK DesiredAccess
,
1205 OUT PHANDLE DevInstRegKey
);
1210 IoRegisterDeviceInterface(
1211 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1212 IN CONST GUID
*InterfaceClassGuid
,
1213 IN PUNICODE_STRING ReferenceString OPTIONAL
,
1214 OUT PUNICODE_STRING SymbolicLinkName
);
1219 IoRegisterPlugPlayNotification(
1220 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
1221 IN ULONG EventCategoryFlags
,
1222 IN PVOID EventCategoryData OPTIONAL
,
1223 IN PDRIVER_OBJECT DriverObject
,
1224 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
1225 IN OUT PVOID Context OPTIONAL
,
1226 OUT PVOID
*NotificationEntry
);
1231 IoRegisterShutdownNotification(
1232 IN PDEVICE_OBJECT DeviceObject
);
1237 IoReleaseCancelSpinLock(
1243 IoReleaseRemoveLockAndWaitEx(
1244 IN PIO_REMOVE_LOCK RemoveLock
,
1245 IN PVOID Tag OPTIONAL
,
1246 IN ULONG RemlockSize
);
1251 IoReleaseRemoveLockEx(
1252 IN PIO_REMOVE_LOCK RemoveLock
,
1253 IN PVOID Tag OPTIONAL
,
1254 IN ULONG RemlockSize
);
1259 IoRemoveShareAccess(
1260 IN PFILE_OBJECT FileObject
,
1261 IN OUT PSHARE_ACCESS ShareAccess
);
1266 IoReportTargetDeviceChange(
1267 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1268 IN PVOID NotificationStructure
);
1273 IoReportTargetDeviceChangeAsynchronous(
1274 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1275 IN PVOID NotificationStructure
,
1276 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
1277 IN PVOID Context OPTIONAL
);
1282 IoRequestDeviceEject(
1283 IN PDEVICE_OBJECT PhysicalDeviceObject
);
1290 IN NTSTATUS Status
);
1295 IoSetDeviceInterfaceState(
1296 IN PUNICODE_STRING SymbolicLinkName
,
1303 IN ACCESS_MASK DesiredAccess
,
1304 IN ULONG DesiredShareAccess
,
1305 IN OUT PFILE_OBJECT FileObject
,
1306 OUT PSHARE_ACCESS ShareAccess
);
1312 IN PDEVICE_OBJECT DeviceObject
,
1313 IN BOOLEAN Cancelable
);
1318 IoStartNextPacketByKey(
1319 IN PDEVICE_OBJECT DeviceObject
,
1320 IN BOOLEAN Cancelable
,
1327 IN PDEVICE_OBJECT DeviceObject
,
1329 IN PULONG Key OPTIONAL
,
1330 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
1336 IN PDEVICE_OBJECT DeviceObject
);
1342 IN PDEVICE_OBJECT DeviceObject
);
1347 IoUnregisterPlugPlayNotification(
1348 IN PVOID NotificationEntry
);
1353 IoUnregisterShutdownNotification(
1354 IN PDEVICE_OBJECT DeviceObject
);
1359 IoUpdateShareAccess(
1360 IN PFILE_OBJECT FileObject
,
1361 IN OUT PSHARE_ACCESS ShareAccess
);
1366 IoWMIAllocateInstanceIds(
1368 IN ULONG InstanceCount
,
1369 OUT ULONG
*FirstInstanceId
);
1374 IoWMIQuerySingleInstanceMultiple(
1375 IN PVOID
*DataBlockObjectList
,
1376 IN PUNICODE_STRING InstanceNames
,
1377 IN ULONG ObjectCount
,
1378 IN OUT ULONG
*InOutBufferSize
,
1379 OUT PVOID OutBuffer
);
1384 IoWMIRegistrationControl(
1385 IN PDEVICE_OBJECT DeviceObject
,
1391 IoWMISuggestInstanceName(
1392 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
1393 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
1394 IN BOOLEAN CombineNames
,
1395 OUT PUNICODE_STRING SuggestedInstanceName
);
1401 IN OUT PVOID WnodeEventItem
);
1406 IoWriteErrorLogEntry(
1412 IoGetTopLevelIrp(VOID
);
1417 IoRegisterLastChanceShutdownNotification(
1418 IN PDEVICE_OBJECT DeviceObject
);
1424 IN PIRP Irp OPTIONAL
);
1427 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1430 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1435 IoIsFileOriginRemote(
1436 IN PFILE_OBJECT FileObject
);
1442 IN PFILE_OBJECT FileObject
,
1445 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */
1448 #if (NTDDI_VERSION >= NTDDI_WINXP)
1453 IoReadPartitionTable(
1454 IN PDEVICE_OBJECT DeviceObject
,
1455 IN ULONG SectorSize
,
1456 IN BOOLEAN ReturnRecognizedPartitions
,
1457 OUT
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
1462 IoSetPartitionInformation(
1463 IN PDEVICE_OBJECT DeviceObject
,
1464 IN ULONG SectorSize
,
1465 IN ULONG PartitionNumber
,
1466 IN ULONG PartitionType
);
1471 IoWritePartitionTable(
1472 IN PDEVICE_OBJECT DeviceObject
,
1473 IN ULONG SectorSize
,
1474 IN ULONG SectorsPerTrack
,
1475 IN ULONG NumberOfHeads
,
1476 IN
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
1482 IN PDEVICE_OBJECT DeviceObject
,
1483 IN
struct _CREATE_DISK
* Disk OPTIONAL
);
1488 IoReadDiskSignature(
1489 IN PDEVICE_OBJECT DeviceObject
,
1490 IN ULONG BytesPerSector
,
1491 OUT PDISK_SIGNATURE Signature
);
1496 IoReadPartitionTableEx(
1497 IN PDEVICE_OBJECT DeviceObject
,
1498 OUT
struct _DRIVE_LAYOUT_INFORMATION_EX
**PartitionBuffer
);
1503 IoSetPartitionInformationEx(
1504 IN PDEVICE_OBJECT DeviceObject
,
1505 IN ULONG PartitionNumber
,
1506 IN
struct _SET_PARTITION_INFORMATION_EX
*PartitionInfo
);
1511 IoSetSystemPartition(
1512 IN PUNICODE_STRING VolumeNameString
);
1517 IoVerifyPartitionTable(
1518 IN PDEVICE_OBJECT DeviceObject
,
1519 IN BOOLEAN FixErrors
);
1524 IoVolumeDeviceToDosName(
1525 IN PVOID VolumeDeviceObject
,
1526 OUT PUNICODE_STRING DosName
);
1531 IoWritePartitionTableEx(
1532 IN PDEVICE_OBJECT DeviceObject
,
1533 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
*DriveLayout
);
1538 IoCreateFileSpecifyDeviceObjectHint(
1539 OUT PHANDLE FileHandle
,
1540 IN ACCESS_MASK DesiredAccess
,
1541 IN POBJECT_ATTRIBUTES ObjectAttributes
,
1542 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1543 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
1544 IN ULONG FileAttributes
,
1545 IN ULONG ShareAccess
,
1546 IN ULONG Disposition
,
1547 IN ULONG CreateOptions
,
1548 IN PVOID EaBuffer OPTIONAL
,
1550 IN CREATE_FILE_TYPE CreateFileType
,
1551 IN PVOID InternalParameters OPTIONAL
,
1553 IN PVOID DeviceObject OPTIONAL
);
1558 IoAttachDeviceToDeviceStackSafe(
1559 IN PDEVICE_OBJECT SourceDevice
,
1560 IN PDEVICE_OBJECT TargetDevice
,
1561 OUT PDEVICE_OBJECT
*AttachedToDeviceObject
);
1570 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
1571 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
1572 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
1573 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
1574 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
1575 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
1583 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
);
1590 IN PIO_CSQ_IRP_CONTEXT Context
);
1597 IN PVOID PeekContext OPTIONAL
);
1602 IoForwardIrpSynchronously(
1603 IN PDEVICE_OBJECT DeviceObject
,
1606 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
1611 IoFreeErrorLogEntry(
1617 IoSetCompletionRoutineEx(
1618 IN PDEVICE_OBJECT DeviceObject
,
1620 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
1622 IN BOOLEAN InvokeOnSuccess
,
1623 IN BOOLEAN InvokeOnError
,
1624 IN BOOLEAN InvokeOnCancel
);
1628 IoSetStartIoAttributes(
1629 IN PDEVICE_OBJECT DeviceObject
,
1630 IN BOOLEAN DeferredStartIo
,
1631 IN BOOLEAN NonCancelable
);
1636 IoWMIDeviceObjectToInstanceName(
1637 IN PVOID DataBlockObject
,
1638 IN PDEVICE_OBJECT DeviceObject
,
1639 OUT PUNICODE_STRING InstanceName
);
1645 IN PVOID DataBlockObject
,
1646 IN PUNICODE_STRING InstanceName
,
1648 IN ULONG InBufferSize
,
1649 IN OUT PULONG OutBufferSize
,
1650 IN OUT PUCHAR InOutBuffer
);
1655 IoWMIHandleToInstanceName(
1656 IN PVOID DataBlockObject
,
1657 IN HANDLE FileHandle
,
1658 OUT PUNICODE_STRING InstanceName
);
1664 IN GUID
*DataBlockGuid
,
1665 IN ULONG DesiredAccess
,
1666 OUT PVOID
*DataBlockObject
);
1672 IN PVOID DataBlockObject
,
1673 IN OUT ULONG
*InOutBufferSize
,
1674 OUT PVOID OutBuffer
);
1679 IoWMIQueryAllDataMultiple(
1680 IN PVOID
*DataBlockObjectList
,
1681 IN ULONG ObjectCount
,
1682 IN OUT ULONG
*InOutBufferSize
,
1683 OUT PVOID OutBuffer
);
1688 IoWMIQuerySingleInstance(
1689 IN PVOID DataBlockObject
,
1690 IN PUNICODE_STRING InstanceName
,
1691 IN OUT ULONG
*InOutBufferSize
,
1692 OUT PVOID OutBuffer
);
1697 IoWMISetNotificationCallback(
1698 IN OUT PVOID Object
,
1699 IN WMI_NOTIFICATION_CALLBACK Callback
,
1700 IN PVOID Context OPTIONAL
);
1705 IoWMISetSingleInstance(
1706 IN PVOID DataBlockObject
,
1707 IN PUNICODE_STRING InstanceName
,
1709 IN ULONG ValueBufferSize
,
1710 IN PVOID ValueBuffer
);
1716 IN PVOID DataBlockObject
,
1717 IN PUNICODE_STRING InstanceName
,
1718 IN ULONG DataItemId
,
1720 IN ULONG ValueBufferSize
,
1721 IN PVOID ValueBuffer
);
1723 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1726 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
1730 IoValidateDeviceIoControlAccess(
1732 IN ULONG RequiredAccess
);
1736 #if (NTDDI_VERSION >= NTDDI_WS03)
1741 IoGetPagingIoPriority(
1751 IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp
,
1752 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
1753 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
1754 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
1755 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
1756 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
1764 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
,
1765 IN PVOID InsertContext OPTIONAL
);
1767 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
1770 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1773 IoTranslateBusAddress(
1774 IN INTERFACE_TYPE InterfaceType
,
1776 IN PHYSICAL_ADDRESS BusAddress
,
1777 IN OUT PULONG AddressSpace
,
1778 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
1782 #if (NTDDI_VERSION >= NTDDI_VISTA)
1787 IoUpdateDiskGeometry(
1788 IN PDEVICE_OBJECT DeviceObject
,
1789 IN
struct _DISK_GEOMETRY_EX
* OldDiskGeometry
,
1790 IN
struct _DISK_GEOMETRY_EX
* NewDiskGeometry
);
1792 PTXN_PARAMETER_BLOCK
1794 IoGetTransactionParameterBlock(
1795 IN PFILE_OBJECT FileObject
);
1801 OUT PHANDLE FileHandle
,
1802 IN ACCESS_MASK DesiredAccess
,
1803 IN POBJECT_ATTRIBUTES ObjectAttributes
,
1804 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1805 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
1806 IN ULONG FileAttributes
,
1807 IN ULONG ShareAccess
,
1808 IN ULONG Disposition
,
1809 IN ULONG CreateOptions
,
1810 IN PVOID EaBuffer OPTIONAL
,
1812 IN CREATE_FILE_TYPE CreateFileType
,
1813 IN PVOID InternalParameters OPTIONAL
,
1815 IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL
);
1819 IoSetIrpExtraCreateParameter(
1821 IN
struct _ECP_LIST
*ExtraCreateParameter
);
1825 IoClearIrpExtraCreateParameter(
1830 IoGetIrpExtraCreateParameter(
1832 OUT
struct _ECP_LIST
**ExtraCreateParameter OPTIONAL
);
1836 IoIsFileObjectIgnoringSharing(
1837 IN PFILE_OBJECT FileObject
);
1844 IoGetBootDiskInformationLite(
1845 OUT PBOOTDISK_INFORMATION_LITE
*BootDiskInformation
);
1850 IoCheckShareAccessEx(
1851 IN ACCESS_MASK DesiredAccess
,
1852 IN ULONG DesiredShareAccess
,
1853 IN OUT PFILE_OBJECT FileObject
,
1854 IN OUT PSHARE_ACCESS ShareAccess
,
1856 IN PBOOLEAN WritePermission
);
1861 IoConnectInterruptEx(
1862 IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters
);
1867 IoDisconnectInterruptEx(
1868 IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters
);
1872 IoWithinStackLimits(
1873 IN ULONG_PTR RegionStart
,
1874 IN SIZE_T RegionSize
);
1880 IN ACCESS_MASK DesiredAccess
,
1881 IN ULONG DesiredShareAccess
,
1882 IN OUT PFILE_OBJECT FileObject
,
1883 OUT PSHARE_ACCESS ShareAccess
,
1884 IN PBOOLEAN WritePermission
);
1888 IoSizeofWorkItem(VOID
);
1892 IoInitializeWorkItem(
1894 IN PIO_WORKITEM IoWorkItem
);
1898 IoUninitializeWorkItem(
1899 IN PIO_WORKITEM IoWorkItem
);
1904 IN PIO_WORKITEM IoWorkItem
,
1905 IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine
,
1906 IN WORK_QUEUE_TYPE QueueType
,
1907 IN PVOID Context OPTIONAL
);
1911 IoGetIoPriorityHint(
1916 IoSetIoPriorityHint(
1918 IN IO_PRIORITY_HINT PriorityHint
);
1922 IoAllocateSfioStreamIdentifier(
1923 IN PFILE_OBJECT FileObject
,
1926 OUT PVOID
*StreamIdentifier
);
1930 IoGetSfioStreamIdentifier(
1931 IN PFILE_OBJECT FileObject
,
1932 IN PVOID Signature
);
1936 IoFreeSfioStreamIdentifier(
1937 IN PFILE_OBJECT FileObject
,
1938 IN PVOID Signature
);
1943 IoRequestDeviceEjectEx(
1944 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1945 IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL
,
1946 IN PVOID Context OPTIONAL
,
1947 IN PDRIVER_OBJECT DriverObject OPTIONAL
);
1952 IoSetDevicePropertyData(
1953 IN PDEVICE_OBJECT Pdo
,
1954 IN CONST DEVPROPKEY
*PropertyKey
,
1957 IN DEVPROPTYPE Type
,
1959 IN PVOID Data OPTIONAL
);
1964 IoGetDevicePropertyData(
1966 CONST DEVPROPKEY
*PropertyKey
,
1971 PULONG RequiredSize
,
1975 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1978 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
1980 #if (NTDDI_VERSION >= NTDDI_WS08)
1984 IoReplacePartitionUnit(
1985 IN PDEVICE_OBJECT TargetPdo
,
1986 IN PDEVICE_OBJECT SparePdo
,
1991 #if (NTDDI_VERSION >= NTDDI_WIN7)
1995 IoSetFileObjectIgnoreSharing(
1996 IN PFILE_OBJECT FileObject
);
2003 IoGetAffinityInterrupt(
2004 IN PKINTERRUPT InterruptObject
,
2005 OUT PGROUP_AFFINITY GroupAffinity
);
2009 IoGetContainerInformation(
2010 IN IO_CONTAINER_INFORMATION_CLASS InformationClass
,
2011 IN PVOID ContainerObject OPTIONAL
,
2012 IN OUT PVOID Buffer OPTIONAL
,
2013 IN ULONG BufferLength
);
2017 IoRegisterContainerNotification(
2018 IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass
,
2019 IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction
,
2020 IN PVOID NotificationInformation OPTIONAL
,
2021 IN ULONG NotificationInformationLength
,
2022 OUT PVOID CallbackRegistration
);
2026 IoUnregisterContainerNotification(
2027 IN PVOID CallbackRegistration
);
2032 IoUnregisterPlugPlayNotificationEx(
2033 IN PVOID NotificationEntry
);
2038 IoGetDeviceNumaNode(
2039 IN PDEVICE_OBJECT Pdo
,
2040 OUT PUSHORT NodeNumber
);
2043 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2050 IoWMIDeviceObjectToProviderId(
2051 IN PDEVICE_OBJECT DeviceObject
);
2053 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
2059 * IN CCHAR StackSize)
2061 #define IoSizeOfIrp(_StackSize) \
2062 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
2066 IoSkipCurrentIrpStackLocation(
2069 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
2070 Irp
->CurrentLocation
++;
2071 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
2076 IoSetNextIrpStackLocation(
2079 ASSERT(Irp
->CurrentLocation
> 0);
2080 Irp
->CurrentLocation
--;
2081 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
2086 IoGetNextIrpStackLocation(
2089 ASSERT(Irp
->CurrentLocation
> 0);
2090 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
2095 IoSetCompletionRoutine(
2097 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
2098 IN PVOID Context OPTIONAL
,
2099 IN BOOLEAN InvokeOnSuccess
,
2100 IN BOOLEAN InvokeOnError
,
2101 IN BOOLEAN InvokeOnCancel
)
2103 PIO_STACK_LOCATION irpSp
;
2104 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
2105 irpSp
= IoGetNextIrpStackLocation(Irp
);
2106 irpSp
->CompletionRoutine
= CompletionRoutine
;
2107 irpSp
->Context
= Context
;
2110 if (InvokeOnSuccess
) {
2111 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
2114 if (InvokeOnError
) {
2115 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
2118 if (InvokeOnCancel
) {
2119 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
2125 * IoSetCancelRoutine(
2127 * IN PDRIVER_CANCEL CancelRoutine)
2129 #define IoSetCancelRoutine(_Irp, \
2131 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
2132 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
2137 * IN PDEVICE_OBJECT DeviceObject,
2139 * IN PVOID Context);
2141 #define IoRequestDpc(DeviceObject, Irp, Context)( \
2142 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
2146 * IoReleaseRemoveLock(
2147 * IN PIO_REMOVE_LOCK RemoveLock,
2150 #define IoReleaseRemoveLock(_RemoveLock, \
2152 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
2156 * IoReleaseRemoveLockAndWait(
2157 * IN PIO_REMOVE_LOCK RemoveLock,
2160 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
2162 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
2168 IN PIRP Irp OPTIONAL
);
2171 #define PLUGPLAY_REGKEY_DEVICE 1
2172 #define PLUGPLAY_REGKEY_DRIVER 2
2173 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
2177 IoGetCurrentIrpStackLocation(
2180 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
2181 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
2189 IoGetCurrentIrpStackLocation( (Irp
) )->Control
|= SL_PENDING_RETURNED
;
2194 * IoIsErrorUserInduced(
2195 * IN NTSTATUS Status);
2197 #define IoIsErrorUserInduced(Status) \
2198 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
2199 ((Status) == STATUS_IO_TIMEOUT) || \
2200 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
2201 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
2202 ((Status) == STATUS_VERIFY_REQUIRED) || \
2203 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
2204 ((Status) == STATUS_WRONG_VOLUME)))
2207 * IoInitializeRemoveLock(
2208 * IN PIO_REMOVE_LOCK Lock,
2209 * IN ULONG AllocateTag,
2210 * IN ULONG MaxLockedMinutes,
2211 * IN ULONG HighWatermark)
2213 #define IoInitializeRemoveLock( \
2214 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
2215 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
2216 HighWatermark, sizeof(IO_REMOVE_LOCK))
2220 IoInitializeDpcRequest(
2221 IN PDEVICE_OBJECT DeviceObject
,
2222 IN PIO_DPC_ROUTINE DpcRoutine
)
2224 KeInitializeDpc( &DeviceObject
->Dpc
,
2225 (PKDEFERRED_ROUTINE
) DpcRoutine
,
2229 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
2233 * IoGetFunctionCodeFromCtlCode(
2234 * IN ULONG ControlCode)
2236 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
2237 (((_ControlCode) >> 2) & 0x00000FFF)
2241 IoCopyCurrentIrpStackLocationToNext(
2244 PIO_STACK_LOCATION irpSp
;
2245 PIO_STACK_LOCATION nextIrpSp
;
2246 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
2247 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
2248 RtlCopyMemory( nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
2249 nextIrpSp
->Control
= 0;
2256 OUT PULONG_PTR LowLimit
,
2257 OUT PULONG_PTR HighLimit
);
2261 IoGetRemainingStackSize(VOID
)
2263 ULONG_PTR End
, Begin
;
2266 IoGetStackLimits(&Begin
, &End
);
2267 Result
= (ULONG_PTR
)(&End
) - Begin
;
2271 #if (NTDDI_VERSION >= NTDDI_WS03)
2274 IoInitializeThreadedDpcRequest(
2275 IN PDEVICE_OBJECT DeviceObject
,
2276 IN PIO_DPC_ROUTINE DpcRoutine
)
2278 KeInitializeThreadedDpc(&DeviceObject
->Dpc
,
2279 (PKDEFERRED_ROUTINE
) DpcRoutine
,