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 //DECLSPEC_DEPRECATED_DDK
595 IN PADAPTER_OBJECT AdapterObject
,
597 IN PVOID MapRegisterBase
,
599 IN OUT PULONG Length
,
600 IN BOOLEAN WriteToDevice
);
605 IoAllocateController(
606 IN PCONTROLLER_OBJECT ControllerObject
,
607 IN PDEVICE_OBJECT DeviceObject
,
608 IN PDRIVER_CONTROL ExecutionRoutine
,
609 IN PVOID Context OPTIONAL
);
621 IN PCONTROLLER_OBJECT ControllerObject
);
627 IN PCONTROLLER_OBJECT ControllerObject
);
630 PCONFIGURATION_INFORMATION
632 IoGetConfigurationInformation(VOID
);
644 IN PDEVICE_OBJECT DeviceObject
,
645 IN PFILE_OBJECT FileObject
);
650 IoGetFileObjectGenericMapping(VOID
);
662 IoQueryDeviceDescription(
663 IN PINTERFACE_TYPE BusType OPTIONAL
,
664 IN PULONG BusNumber OPTIONAL
,
665 IN PCONFIGURATION_TYPE ControllerType OPTIONAL
,
666 IN PULONG ControllerNumber OPTIONAL
,
667 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL
,
668 IN PULONG PeripheralNumber OPTIONAL
,
669 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
,
670 IN OUT PVOID Context OPTIONAL
);
677 IN PVPB Vpb OPTIONAL
,
678 IN PDEVICE_OBJECT RealDeviceObject
);
683 IoRaiseInformationalHardError(
684 IN NTSTATUS ErrorStatus
,
685 IN PUNICODE_STRING String OPTIONAL
,
686 IN PKTHREAD Thread OPTIONAL
);
691 IoRegisterBootDriverReinitialization(
692 IN PDRIVER_OBJECT DriverObject
,
693 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
694 IN PVOID Context OPTIONAL
);
699 IoRegisterDriverReinitialization(
700 IN PDRIVER_OBJECT DriverObject
,
701 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
702 IN PVOID Context OPTIONAL
);
707 IoAttachDeviceByPointer(
708 IN PDEVICE_OBJECT SourceDevice
,
709 IN PDEVICE_OBJECT TargetDevice
);
714 IoReportDetectedDevice(
715 IN PDRIVER_OBJECT DriverObject
,
716 IN INTERFACE_TYPE LegacyBusType
,
719 IN PCM_RESOURCE_LIST ResourceList OPTIONAL
,
720 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL
,
721 IN BOOLEAN ResourceAssigned
,
722 IN OUT PDEVICE_OBJECT
*DeviceObject OPTIONAL
);
727 IoReportResourceForDetection(
728 IN PDRIVER_OBJECT DriverObject
,
729 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
730 IN ULONG DriverListSize OPTIONAL
,
731 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
732 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
733 IN ULONG DeviceListSize OPTIONAL
,
734 OUT PBOOLEAN ConflictDetected
);
739 IoReportResourceUsage(
740 IN PUNICODE_STRING DriverClassName OPTIONAL
,
741 IN PDRIVER_OBJECT DriverObject
,
742 IN PCM_RESOURCE_LIST DriverList OPTIONAL
,
743 IN ULONG DriverListSize OPTIONAL
,
744 IN PDEVICE_OBJECT DeviceObject
,
745 IN PCM_RESOURCE_LIST DeviceList OPTIONAL
,
746 IN ULONG DeviceListSize OPTIONAL
,
747 IN BOOLEAN OverrideConflict
,
748 OUT PBOOLEAN ConflictDetected
);
753 IoSetHardErrorOrVerifyDevice(
755 IN PDEVICE_OBJECT DeviceObject
);
761 IN PUNICODE_STRING RegistryPath
,
762 IN PUNICODE_STRING DriverClassName OPTIONAL
,
763 IN PDRIVER_OBJECT DriverObject
,
764 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
765 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL
,
766 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
);
771 IoSetThreadHardErrorMode(
772 IN BOOLEAN EnableHardErrors
);
779 IoAcquireCancelSpinLock(
785 IoAcquireRemoveLockEx(
786 IN PIO_REMOVE_LOCK RemoveLock
,
787 IN PVOID Tag OPTIONAL
,
790 IN ULONG RemlockSize
);
794 IoAllocateDriverObjectExtension(
795 IN PDRIVER_OBJECT DriverObject
,
796 IN PVOID ClientIdentificationAddress
,
797 IN ULONG DriverObjectExtensionSize
,
798 OUT PVOID
*DriverObjectExtension
);
803 IoAllocateErrorLogEntry(
812 IN BOOLEAN ChargeQuota
);
818 IN PVOID VirtualAddress OPTIONAL
,
820 IN BOOLEAN SecondaryBuffer
,
821 IN BOOLEAN ChargeQuota
,
822 IN OUT PIRP Irp OPTIONAL
);
828 IN PDEVICE_OBJECT DeviceObject
);
834 IN PDEVICE_OBJECT SourceDevice
,
835 IN PUNICODE_STRING TargetDevice
,
836 OUT PDEVICE_OBJECT
*AttachedDevice
);
841 IoAttachDeviceToDeviceStack(
842 IN PDEVICE_OBJECT SourceDevice
,
843 IN PDEVICE_OBJECT TargetDevice
);
848 IoBuildAsynchronousFsdRequest(
849 IN ULONG MajorFunction
,
850 IN PDEVICE_OBJECT DeviceObject
,
851 IN OUT PVOID Buffer OPTIONAL
,
852 IN ULONG Length OPTIONAL
,
853 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
854 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
);
859 IoBuildDeviceIoControlRequest(
860 IN ULONG IoControlCode
,
861 IN PDEVICE_OBJECT DeviceObject
,
862 IN PVOID InputBuffer OPTIONAL
,
863 IN ULONG InputBufferLength
,
864 OUT PVOID OutputBuffer OPTIONAL
,
865 IN ULONG OutputBufferLength
,
866 IN BOOLEAN InternalDeviceIoControl
,
868 OUT PIO_STATUS_BLOCK IoStatusBlock
);
875 IN OUT PMDL TargetMdl
,
876 IN PVOID VirtualAddress
,
882 IoBuildSynchronousFsdRequest(
883 IN ULONG MajorFunction
,
884 IN PDEVICE_OBJECT DeviceObject
,
885 IN OUT PVOID Buffer OPTIONAL
,
886 IN ULONG Length OPTIONAL
,
887 IN PLARGE_INTEGER StartingOffset OPTIONAL
,
889 OUT PIO_STATUS_BLOCK IoStatusBlock
);
895 IN PDEVICE_OBJECT DeviceObject
,
897 #define IoCallDriver IofCallDriver
904 IN CCHAR PriorityBoost
);
905 #define IoCompleteRequest IofCompleteRequest
917 IN ACCESS_MASK DesiredAccess
,
918 IN ULONG DesiredShareAccess
,
919 IN OUT PFILE_OBJECT FileObject
,
920 IN OUT PSHARE_ACCESS ShareAccess
,
928 IN CCHAR PriorityBoost
);
934 OUT PKINTERRUPT
*InterruptObject
,
935 IN PKSERVICE_ROUTINE ServiceRoutine
,
936 IN PVOID ServiceContext OPTIONAL
,
937 IN PKSPIN_LOCK SpinLock OPTIONAL
,
940 IN KIRQL SynchronizeIrql
,
941 IN KINTERRUPT_MODE InterruptMode
,
942 IN BOOLEAN ShareVector
,
943 IN KAFFINITY ProcessorEnableMask
,
944 IN BOOLEAN FloatingSave
);
950 IN PDRIVER_OBJECT DriverObject
,
951 IN ULONG DeviceExtensionSize
,
952 IN PUNICODE_STRING DeviceName OPTIONAL
,
953 IN DEVICE_TYPE DeviceType
,
954 IN ULONG DeviceCharacteristics
,
955 IN BOOLEAN Exclusive
,
956 OUT PDEVICE_OBJECT
*DeviceObject
);
962 OUT PHANDLE FileHandle
,
963 IN ACCESS_MASK DesiredAccess
,
964 IN POBJECT_ATTRIBUTES ObjectAttributes
,
965 OUT PIO_STATUS_BLOCK IoStatusBlock
,
966 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
967 IN ULONG FileAttributes
,
968 IN ULONG ShareAccess
,
969 IN ULONG Disposition
,
970 IN ULONG CreateOptions
,
971 IN PVOID EaBuffer OPTIONAL
,
973 IN CREATE_FILE_TYPE CreateFileType
,
974 IN PVOID InternalParameters OPTIONAL
,
980 IoCreateNotificationEvent(
981 IN PUNICODE_STRING EventName
,
982 OUT PHANDLE EventHandle
);
987 IoCreateSymbolicLink(
988 IN PUNICODE_STRING SymbolicLinkName
,
989 IN PUNICODE_STRING DeviceName
);
994 IoCreateSynchronizationEvent(
995 IN PUNICODE_STRING EventName
,
996 OUT PHANDLE EventHandle
);
1001 IoCreateUnprotectedSymbolicLink(
1002 IN PUNICODE_STRING SymbolicLinkName
,
1003 IN PUNICODE_STRING DeviceName
);
1009 IN PDEVICE_OBJECT DeviceObject
);
1014 IoDeleteSymbolicLink(
1015 IN PUNICODE_STRING SymbolicLinkName
);
1021 IN OUT PDEVICE_OBJECT TargetDevice
);
1026 IoDisconnectInterrupt(
1027 IN PKINTERRUPT InterruptObject
);
1045 IN PIO_WORKITEM IoWorkItem
);
1050 IoGetAttachedDevice(
1051 IN PDEVICE_OBJECT DeviceObject
);
1056 IoGetAttachedDeviceReference(
1057 IN PDEVICE_OBJECT DeviceObject
);
1062 IoGetBootDiskInformation(
1063 IN OUT PBOOTDISK_INFORMATION BootDiskInformation
,
1069 IoGetDeviceInterfaceAlias(
1070 IN PUNICODE_STRING SymbolicLinkName
,
1071 IN CONST GUID
*AliasInterfaceClassGuid
,
1072 OUT PUNICODE_STRING AliasSymbolicLinkName
);
1077 IoGetCurrentProcess(VOID
);
1082 IoGetDeviceInterfaces(
1083 IN CONST GUID
*InterfaceClassGuid
,
1084 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
1086 OUT PWSTR
*SymbolicLinkList
);
1091 IoGetDeviceObjectPointer(
1092 IN PUNICODE_STRING ObjectName
,
1093 IN ACCESS_MASK DesiredAccess
,
1094 OUT PFILE_OBJECT
*FileObject
,
1095 OUT PDEVICE_OBJECT
*DeviceObject
);
1100 IoGetDeviceProperty(
1101 IN PDEVICE_OBJECT DeviceObject
,
1102 IN DEVICE_REGISTRY_PROPERTY DeviceProperty
,
1103 IN ULONG BufferLength
,
1104 OUT PVOID PropertyBuffer
,
1105 OUT PULONG ResultLength
);
1111 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
1112 IN PDEVICE_DESCRIPTION DeviceDescription
,
1113 IN OUT PULONG NumberOfMapRegisters
);
1118 IoGetDriverObjectExtension(
1119 IN PDRIVER_OBJECT DriverObject
,
1120 IN PVOID ClientIdentificationAddress
);
1125 IoGetInitialStack(VOID
);
1130 IoGetRelatedDeviceObject(
1131 IN PFILE_OBJECT FileObject
);
1137 IN PIO_WORKITEM IoWorkItem
,
1138 IN PIO_WORKITEM_ROUTINE WorkerRoutine
,
1139 IN WORK_QUEUE_TYPE QueueType
,
1140 IN PVOID Context OPTIONAL
);
1147 IN USHORT PacketSize
,
1148 IN CCHAR StackSize
);
1153 IoInitializeRemoveLockEx(
1154 IN PIO_REMOVE_LOCK Lock
,
1155 IN ULONG AllocateTag
,
1156 IN ULONG MaxLockedMinutes
,
1157 IN ULONG HighWatermark
,
1158 IN ULONG RemlockSize
);
1164 IN PDEVICE_OBJECT DeviceObject
,
1165 IN PIO_TIMER_ROUTINE TimerRoutine
,
1166 IN PVOID Context OPTIONAL
);
1171 IoInvalidateDeviceRelations(
1172 IN PDEVICE_OBJECT DeviceObject
,
1173 IN DEVICE_RELATION_TYPE Type
);
1178 IoInvalidateDeviceState(
1179 IN PDEVICE_OBJECT PhysicalDeviceObject
);
1184 IoIsWdmVersionAvailable(
1185 IN UCHAR MajorVersion
,
1186 IN UCHAR MinorVersion
);
1191 IoOpenDeviceInterfaceRegistryKey(
1192 IN PUNICODE_STRING SymbolicLinkName
,
1193 IN ACCESS_MASK DesiredAccess
,
1194 OUT PHANDLE DeviceInterfaceKey
);
1199 IoOpenDeviceRegistryKey(
1200 IN PDEVICE_OBJECT DeviceObject
,
1201 IN ULONG DevInstKeyType
,
1202 IN ACCESS_MASK DesiredAccess
,
1203 OUT PHANDLE DevInstRegKey
);
1208 IoRegisterDeviceInterface(
1209 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1210 IN CONST GUID
*InterfaceClassGuid
,
1211 IN PUNICODE_STRING ReferenceString OPTIONAL
,
1212 OUT PUNICODE_STRING SymbolicLinkName
);
1217 IoRegisterPlugPlayNotification(
1218 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory
,
1219 IN ULONG EventCategoryFlags
,
1220 IN PVOID EventCategoryData OPTIONAL
,
1221 IN PDRIVER_OBJECT DriverObject
,
1222 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine
,
1223 IN OUT PVOID Context OPTIONAL
,
1224 OUT PVOID
*NotificationEntry
);
1229 IoRegisterShutdownNotification(
1230 IN PDEVICE_OBJECT DeviceObject
);
1235 IoReleaseCancelSpinLock(
1241 IoReleaseRemoveLockAndWaitEx(
1242 IN PIO_REMOVE_LOCK RemoveLock
,
1243 IN PVOID Tag OPTIONAL
,
1244 IN ULONG RemlockSize
);
1249 IoReleaseRemoveLockEx(
1250 IN PIO_REMOVE_LOCK RemoveLock
,
1251 IN PVOID Tag OPTIONAL
,
1252 IN ULONG RemlockSize
);
1257 IoRemoveShareAccess(
1258 IN PFILE_OBJECT FileObject
,
1259 IN OUT PSHARE_ACCESS ShareAccess
);
1264 IoReportTargetDeviceChange(
1265 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1266 IN PVOID NotificationStructure
);
1271 IoReportTargetDeviceChangeAsynchronous(
1272 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1273 IN PVOID NotificationStructure
,
1274 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL
,
1275 IN PVOID Context OPTIONAL
);
1280 IoRequestDeviceEject(
1281 IN PDEVICE_OBJECT PhysicalDeviceObject
);
1288 IN NTSTATUS Status
);
1293 IoSetDeviceInterfaceState(
1294 IN PUNICODE_STRING SymbolicLinkName
,
1301 IN ACCESS_MASK DesiredAccess
,
1302 IN ULONG DesiredShareAccess
,
1303 IN OUT PFILE_OBJECT FileObject
,
1304 OUT PSHARE_ACCESS ShareAccess
);
1310 IN PDEVICE_OBJECT DeviceObject
,
1311 IN BOOLEAN Cancelable
);
1316 IoStartNextPacketByKey(
1317 IN PDEVICE_OBJECT DeviceObject
,
1318 IN BOOLEAN Cancelable
,
1325 IN PDEVICE_OBJECT DeviceObject
,
1327 IN PULONG Key OPTIONAL
,
1328 IN PDRIVER_CANCEL CancelFunction OPTIONAL
);
1334 IN PDEVICE_OBJECT DeviceObject
);
1340 IN PDEVICE_OBJECT DeviceObject
);
1345 IoUnregisterPlugPlayNotification(
1346 IN PVOID NotificationEntry
);
1351 IoUnregisterShutdownNotification(
1352 IN PDEVICE_OBJECT DeviceObject
);
1357 IoUpdateShareAccess(
1358 IN PFILE_OBJECT FileObject
,
1359 IN OUT PSHARE_ACCESS ShareAccess
);
1364 IoWMIAllocateInstanceIds(
1366 IN ULONG InstanceCount
,
1367 OUT ULONG
*FirstInstanceId
);
1372 IoWMIQuerySingleInstanceMultiple(
1373 IN PVOID
*DataBlockObjectList
,
1374 IN PUNICODE_STRING InstanceNames
,
1375 IN ULONG ObjectCount
,
1376 IN OUT ULONG
*InOutBufferSize
,
1377 OUT PVOID OutBuffer
);
1382 IoWMIRegistrationControl(
1383 IN PDEVICE_OBJECT DeviceObject
,
1389 IoWMISuggestInstanceName(
1390 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
1391 IN PUNICODE_STRING SymbolicLinkName OPTIONAL
,
1392 IN BOOLEAN CombineNames
,
1393 OUT PUNICODE_STRING SuggestedInstanceName
);
1399 IN OUT PVOID WnodeEventItem
);
1404 IoWriteErrorLogEntry(
1410 IoGetTopLevelIrp(VOID
);
1415 IoRegisterLastChanceShutdownNotification(
1416 IN PDEVICE_OBJECT DeviceObject
);
1422 IN PIRP Irp OPTIONAL
);
1425 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1428 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1433 IoIsFileOriginRemote(
1434 IN PFILE_OBJECT FileObject
);
1440 IN PFILE_OBJECT FileObject
,
1443 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */
1446 #if (NTDDI_VERSION >= NTDDI_WINXP)
1451 IoReadPartitionTable(
1452 IN PDEVICE_OBJECT DeviceObject
,
1453 IN ULONG SectorSize
,
1454 IN BOOLEAN ReturnRecognizedPartitions
,
1455 OUT
struct _DRIVE_LAYOUT_INFORMATION
**PartitionBuffer
);
1460 IoSetPartitionInformation(
1461 IN PDEVICE_OBJECT DeviceObject
,
1462 IN ULONG SectorSize
,
1463 IN ULONG PartitionNumber
,
1464 IN ULONG PartitionType
);
1469 IoWritePartitionTable(
1470 IN PDEVICE_OBJECT DeviceObject
,
1471 IN ULONG SectorSize
,
1472 IN ULONG SectorsPerTrack
,
1473 IN ULONG NumberOfHeads
,
1474 IN
struct _DRIVE_LAYOUT_INFORMATION
*PartitionBuffer
);
1480 IN PDEVICE_OBJECT DeviceObject
,
1481 IN
struct _CREATE_DISK
* Disk OPTIONAL
);
1486 IoReadDiskSignature(
1487 IN PDEVICE_OBJECT DeviceObject
,
1488 IN ULONG BytesPerSector
,
1489 OUT PDISK_SIGNATURE Signature
);
1494 IoReadPartitionTableEx(
1495 IN PDEVICE_OBJECT DeviceObject
,
1496 OUT
struct _DRIVE_LAYOUT_INFORMATION_EX
**PartitionBuffer
);
1501 IoSetPartitionInformationEx(
1502 IN PDEVICE_OBJECT DeviceObject
,
1503 IN ULONG PartitionNumber
,
1504 IN
struct _SET_PARTITION_INFORMATION_EX
*PartitionInfo
);
1509 IoSetSystemPartition(
1510 IN PUNICODE_STRING VolumeNameString
);
1515 IoVerifyPartitionTable(
1516 IN PDEVICE_OBJECT DeviceObject
,
1517 IN BOOLEAN FixErrors
);
1522 IoVolumeDeviceToDosName(
1523 IN PVOID VolumeDeviceObject
,
1524 OUT PUNICODE_STRING DosName
);
1529 IoWritePartitionTableEx(
1530 IN PDEVICE_OBJECT DeviceObject
,
1531 IN
struct _DRIVE_LAYOUT_INFORMATION_EX
*DriveLayout
);
1536 IoCreateFileSpecifyDeviceObjectHint(
1537 OUT PHANDLE FileHandle
,
1538 IN ACCESS_MASK DesiredAccess
,
1539 IN POBJECT_ATTRIBUTES ObjectAttributes
,
1540 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1541 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
1542 IN ULONG FileAttributes
,
1543 IN ULONG ShareAccess
,
1544 IN ULONG Disposition
,
1545 IN ULONG CreateOptions
,
1546 IN PVOID EaBuffer OPTIONAL
,
1548 IN CREATE_FILE_TYPE CreateFileType
,
1549 IN PVOID InternalParameters OPTIONAL
,
1551 IN PVOID DeviceObject OPTIONAL
);
1556 IoAttachDeviceToDeviceStackSafe(
1557 IN PDEVICE_OBJECT SourceDevice
,
1558 IN PDEVICE_OBJECT TargetDevice
,
1559 OUT PDEVICE_OBJECT
*AttachedToDeviceObject
);
1568 IN PIO_CSQ_INSERT_IRP CsqInsertIrp
,
1569 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
1570 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
1571 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
1572 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
1573 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
1581 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
);
1588 IN PIO_CSQ_IRP_CONTEXT Context
);
1595 IN PVOID PeekContext OPTIONAL
);
1600 IoForwardIrpSynchronously(
1601 IN PDEVICE_OBJECT DeviceObject
,
1604 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
1609 IoFreeErrorLogEntry(
1615 IoSetCompletionRoutineEx(
1616 IN PDEVICE_OBJECT DeviceObject
,
1618 IN PIO_COMPLETION_ROUTINE CompletionRoutine
,
1620 IN BOOLEAN InvokeOnSuccess
,
1621 IN BOOLEAN InvokeOnError
,
1622 IN BOOLEAN InvokeOnCancel
);
1626 IoSetStartIoAttributes(
1627 IN PDEVICE_OBJECT DeviceObject
,
1628 IN BOOLEAN DeferredStartIo
,
1629 IN BOOLEAN NonCancelable
);
1634 IoWMIDeviceObjectToInstanceName(
1635 IN PVOID DataBlockObject
,
1636 IN PDEVICE_OBJECT DeviceObject
,
1637 OUT PUNICODE_STRING InstanceName
);
1643 IN PVOID DataBlockObject
,
1644 IN PUNICODE_STRING InstanceName
,
1646 IN ULONG InBufferSize
,
1647 IN OUT PULONG OutBufferSize
,
1648 IN OUT PUCHAR InOutBuffer
);
1653 IoWMIHandleToInstanceName(
1654 IN PVOID DataBlockObject
,
1655 IN HANDLE FileHandle
,
1656 OUT PUNICODE_STRING InstanceName
);
1662 IN GUID
*DataBlockGuid
,
1663 IN ULONG DesiredAccess
,
1664 OUT PVOID
*DataBlockObject
);
1670 IN PVOID DataBlockObject
,
1671 IN OUT ULONG
*InOutBufferSize
,
1672 OUT PVOID OutBuffer
);
1677 IoWMIQueryAllDataMultiple(
1678 IN PVOID
*DataBlockObjectList
,
1679 IN ULONG ObjectCount
,
1680 IN OUT ULONG
*InOutBufferSize
,
1681 OUT PVOID OutBuffer
);
1686 IoWMIQuerySingleInstance(
1687 IN PVOID DataBlockObject
,
1688 IN PUNICODE_STRING InstanceName
,
1689 IN OUT ULONG
*InOutBufferSize
,
1690 OUT PVOID OutBuffer
);
1695 IoWMISetNotificationCallback(
1696 IN OUT PVOID Object
,
1697 IN WMI_NOTIFICATION_CALLBACK Callback
,
1698 IN PVOID Context OPTIONAL
);
1703 IoWMISetSingleInstance(
1704 IN PVOID DataBlockObject
,
1705 IN PUNICODE_STRING InstanceName
,
1707 IN ULONG ValueBufferSize
,
1708 IN PVOID ValueBuffer
);
1714 IN PVOID DataBlockObject
,
1715 IN PUNICODE_STRING InstanceName
,
1716 IN ULONG DataItemId
,
1718 IN ULONG ValueBufferSize
,
1719 IN PVOID ValueBuffer
);
1721 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1724 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
1728 IoValidateDeviceIoControlAccess(
1730 IN ULONG RequiredAccess
);
1734 #if (NTDDI_VERSION >= NTDDI_WS03)
1739 IoGetPagingIoPriority(
1749 IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp
,
1750 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp
,
1751 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp
,
1752 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock
,
1753 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock
,
1754 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp
);
1762 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL
,
1763 IN PVOID InsertContext OPTIONAL
);
1765 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
1768 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1771 IoTranslateBusAddress(
1772 IN INTERFACE_TYPE InterfaceType
,
1774 IN PHYSICAL_ADDRESS BusAddress
,
1775 IN OUT PULONG AddressSpace
,
1776 OUT PPHYSICAL_ADDRESS TranslatedAddress
);
1780 #if (NTDDI_VERSION >= NTDDI_VISTA)
1785 IoUpdateDiskGeometry(
1786 IN PDEVICE_OBJECT DeviceObject
,
1787 IN
struct _DISK_GEOMETRY_EX
* OldDiskGeometry
,
1788 IN
struct _DISK_GEOMETRY_EX
* NewDiskGeometry
);
1790 PTXN_PARAMETER_BLOCK
1792 IoGetTransactionParameterBlock(
1793 IN PFILE_OBJECT FileObject
);
1799 OUT PHANDLE FileHandle
,
1800 IN ACCESS_MASK DesiredAccess
,
1801 IN POBJECT_ATTRIBUTES ObjectAttributes
,
1802 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1803 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
1804 IN ULONG FileAttributes
,
1805 IN ULONG ShareAccess
,
1806 IN ULONG Disposition
,
1807 IN ULONG CreateOptions
,
1808 IN PVOID EaBuffer OPTIONAL
,
1810 IN CREATE_FILE_TYPE CreateFileType
,
1811 IN PVOID InternalParameters OPTIONAL
,
1813 IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL
);
1817 IoSetIrpExtraCreateParameter(
1819 IN
struct _ECP_LIST
*ExtraCreateParameter
);
1823 IoClearIrpExtraCreateParameter(
1828 IoGetIrpExtraCreateParameter(
1830 OUT
struct _ECP_LIST
**ExtraCreateParameter OPTIONAL
);
1834 IoIsFileObjectIgnoringSharing(
1835 IN PFILE_OBJECT FileObject
);
1842 IoGetBootDiskInformationLite(
1843 OUT PBOOTDISK_INFORMATION_LITE
*BootDiskInformation
);
1848 IoCheckShareAccessEx(
1849 IN ACCESS_MASK DesiredAccess
,
1850 IN ULONG DesiredShareAccess
,
1851 IN OUT PFILE_OBJECT FileObject
,
1852 IN OUT PSHARE_ACCESS ShareAccess
,
1854 IN PBOOLEAN WritePermission
);
1859 IoConnectInterruptEx(
1860 IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters
);
1865 IoDisconnectInterruptEx(
1866 IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters
);
1870 IoWithinStackLimits(
1871 IN ULONG_PTR RegionStart
,
1872 IN SIZE_T RegionSize
);
1878 IN ACCESS_MASK DesiredAccess
,
1879 IN ULONG DesiredShareAccess
,
1880 IN OUT PFILE_OBJECT FileObject
,
1881 OUT PSHARE_ACCESS ShareAccess
,
1882 IN PBOOLEAN WritePermission
);
1886 IoSizeofWorkItem(VOID
);
1890 IoInitializeWorkItem(
1892 IN PIO_WORKITEM IoWorkItem
);
1896 IoUninitializeWorkItem(
1897 IN PIO_WORKITEM IoWorkItem
);
1902 IN PIO_WORKITEM IoWorkItem
,
1903 IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine
,
1904 IN WORK_QUEUE_TYPE QueueType
,
1905 IN PVOID Context OPTIONAL
);
1909 IoGetIoPriorityHint(
1914 IoSetIoPriorityHint(
1916 IN IO_PRIORITY_HINT PriorityHint
);
1920 IoAllocateSfioStreamIdentifier(
1921 IN PFILE_OBJECT FileObject
,
1924 OUT PVOID
*StreamIdentifier
);
1928 IoGetSfioStreamIdentifier(
1929 IN PFILE_OBJECT FileObject
,
1930 IN PVOID Signature
);
1934 IoFreeSfioStreamIdentifier(
1935 IN PFILE_OBJECT FileObject
,
1936 IN PVOID Signature
);
1941 IoRequestDeviceEjectEx(
1942 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1943 IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL
,
1944 IN PVOID Context OPTIONAL
,
1945 IN PDRIVER_OBJECT DriverObject OPTIONAL
);
1950 IoSetDevicePropertyData(
1951 IN PDEVICE_OBJECT Pdo
,
1952 IN CONST DEVPROPKEY
*PropertyKey
,
1955 IN DEVPROPTYPE Type
,
1957 IN PVOID Data OPTIONAL
);
1962 IoGetDevicePropertyData(
1964 CONST DEVPROPKEY
*PropertyKey
,
1969 PULONG RequiredSize
,
1973 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1976 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
1978 #if (NTDDI_VERSION >= NTDDI_WS08)
1982 IoReplacePartitionUnit(
1983 IN PDEVICE_OBJECT TargetPdo
,
1984 IN PDEVICE_OBJECT SparePdo
,
1989 #if (NTDDI_VERSION >= NTDDI_WIN7)
1993 IoSetFileObjectIgnoreSharing(
1994 IN PFILE_OBJECT FileObject
);
2001 IoGetAffinityInterrupt(
2002 IN PKINTERRUPT InterruptObject
,
2003 OUT PGROUP_AFFINITY GroupAffinity
);
2007 IoGetContainerInformation(
2008 IN IO_CONTAINER_INFORMATION_CLASS InformationClass
,
2009 IN PVOID ContainerObject OPTIONAL
,
2010 IN OUT PVOID Buffer OPTIONAL
,
2011 IN ULONG BufferLength
);
2015 IoRegisterContainerNotification(
2016 IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass
,
2017 IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction
,
2018 IN PVOID NotificationInformation OPTIONAL
,
2019 IN ULONG NotificationInformationLength
,
2020 OUT PVOID CallbackRegistration
);
2024 IoUnregisterContainerNotification(
2025 IN PVOID CallbackRegistration
);
2030 IoUnregisterPlugPlayNotificationEx(
2031 IN PVOID NotificationEntry
);
2036 IoGetDeviceNumaNode(
2037 IN PDEVICE_OBJECT Pdo
,
2038 OUT PUSHORT NodeNumber
);
2041 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2048 IoWMIDeviceObjectToProviderId(
2049 IN PDEVICE_OBJECT DeviceObject
);
2051 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
2057 * IN CCHAR StackSize)
2059 #define IoSizeOfIrp(_StackSize) \
2060 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
2064 IoSkipCurrentIrpStackLocation(
2067 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
);
2068 Irp
->CurrentLocation
++;
2069 Irp
->Tail
.Overlay
.CurrentStackLocation
++;
2074 IoSetNextIrpStackLocation(
2077 ASSERT(Irp
->CurrentLocation
> 0);
2078 Irp
->CurrentLocation
--;
2079 Irp
->Tail
.Overlay
.CurrentStackLocation
--;
2084 IoGetNextIrpStackLocation(
2087 ASSERT(Irp
->CurrentLocation
> 0);
2088 return ((Irp
)->Tail
.Overlay
.CurrentStackLocation
- 1 );
2093 IoSetCompletionRoutine(
2095 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
2096 IN PVOID Context OPTIONAL
,
2097 IN BOOLEAN InvokeOnSuccess
,
2098 IN BOOLEAN InvokeOnError
,
2099 IN BOOLEAN InvokeOnCancel
)
2101 PIO_STACK_LOCATION irpSp
;
2102 ASSERT( (InvokeOnSuccess
|| InvokeOnError
|| InvokeOnCancel
) ? (CompletionRoutine
!= NULL
) : TRUE
);
2103 irpSp
= IoGetNextIrpStackLocation(Irp
);
2104 irpSp
->CompletionRoutine
= CompletionRoutine
;
2105 irpSp
->Context
= Context
;
2108 if (InvokeOnSuccess
) {
2109 irpSp
->Control
= SL_INVOKE_ON_SUCCESS
;
2112 if (InvokeOnError
) {
2113 irpSp
->Control
|= SL_INVOKE_ON_ERROR
;
2116 if (InvokeOnCancel
) {
2117 irpSp
->Control
|= SL_INVOKE_ON_CANCEL
;
2123 * IoSetCancelRoutine(
2125 * IN PDRIVER_CANCEL CancelRoutine)
2127 #define IoSetCancelRoutine(_Irp, \
2129 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
2130 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
2135 * IN PDEVICE_OBJECT DeviceObject,
2137 * IN PVOID Context);
2139 #define IoRequestDpc(DeviceObject, Irp, Context)( \
2140 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
2144 * IoReleaseRemoveLock(
2145 * IN PIO_REMOVE_LOCK RemoveLock,
2148 #define IoReleaseRemoveLock(_RemoveLock, \
2150 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
2154 * IoReleaseRemoveLockAndWait(
2155 * IN PIO_REMOVE_LOCK RemoveLock,
2158 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
2160 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
2166 IN PIRP Irp OPTIONAL
);
2169 #define PLUGPLAY_REGKEY_DEVICE 1
2170 #define PLUGPLAY_REGKEY_DRIVER 2
2171 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
2175 IoGetCurrentIrpStackLocation(
2178 ASSERT(Irp
->CurrentLocation
<= Irp
->StackCount
+ 1);
2179 return Irp
->Tail
.Overlay
.CurrentStackLocation
;
2187 IoGetCurrentIrpStackLocation( (Irp
) )->Control
|= SL_PENDING_RETURNED
;
2192 * IoIsErrorUserInduced(
2193 * IN NTSTATUS Status);
2195 #define IoIsErrorUserInduced(Status) \
2196 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
2197 ((Status) == STATUS_IO_TIMEOUT) || \
2198 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
2199 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
2200 ((Status) == STATUS_VERIFY_REQUIRED) || \
2201 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
2202 ((Status) == STATUS_WRONG_VOLUME)))
2205 * IoInitializeRemoveLock(
2206 * IN PIO_REMOVE_LOCK Lock,
2207 * IN ULONG AllocateTag,
2208 * IN ULONG MaxLockedMinutes,
2209 * IN ULONG HighWatermark)
2211 #define IoInitializeRemoveLock( \
2212 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
2213 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
2214 HighWatermark, sizeof(IO_REMOVE_LOCK))
2218 IoInitializeDpcRequest(
2219 IN PDEVICE_OBJECT DeviceObject
,
2220 IN PIO_DPC_ROUTINE DpcRoutine
)
2222 KeInitializeDpc( &DeviceObject
->Dpc
,
2223 (PKDEFERRED_ROUTINE
) DpcRoutine
,
2227 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
2231 * IoGetFunctionCodeFromCtlCode(
2232 * IN ULONG ControlCode)
2234 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
2235 (((_ControlCode) >> 2) & 0x00000FFF)
2239 IoCopyCurrentIrpStackLocationToNext(
2242 PIO_STACK_LOCATION irpSp
;
2243 PIO_STACK_LOCATION nextIrpSp
;
2244 irpSp
= IoGetCurrentIrpStackLocation(Irp
);
2245 nextIrpSp
= IoGetNextIrpStackLocation(Irp
);
2246 RtlCopyMemory( nextIrpSp
, irpSp
, FIELD_OFFSET(IO_STACK_LOCATION
, CompletionRoutine
));
2247 nextIrpSp
->Control
= 0;
2254 OUT PULONG_PTR LowLimit
,
2255 OUT PULONG_PTR HighLimit
);
2259 IoGetRemainingStackSize(VOID
)
2261 ULONG_PTR End
, Begin
;
2264 IoGetStackLimits(&Begin
, &End
);
2265 Result
= (ULONG_PTR
)(&End
) - Begin
;
2269 #if (NTDDI_VERSION >= NTDDI_WS03)
2272 IoInitializeThreadedDpcRequest(
2273 IN PDEVICE_OBJECT DeviceObject
,
2274 IN PIO_DPC_ROUTINE DpcRoutine
)
2276 KeInitializeThreadedDpc(&DeviceObject
->Dpc
,
2277 (PKDEFERRED_ROUTINE
) DpcRoutine
,