1 #ifndef _INCLUDE_DDK_IOFUNCS_H
2 #define _INCLUDE_DDK_IOFUNCS_H
5 /* --- EXPORTED BY NTOSKRNL --- */
7 /**********************************************************************
9 * IoAcquireCancelSpinLock@4
12 * Synchronizes cancelable-state transistions for IRPs in a
13 * multiprocessor-safe way.
17 * Variable to store the current IRQ level.
27 IoAcquireCancelSpinLock (
32 IoAcquireVpbSpinLock (
35 /**********************************************************************
37 * IoAllocateAdapterChannel@
40 * Allocates an adaptor object for a DMA operation on the target
45 * Adapter channel or busmaster adapter to be allocated;
48 * Target device for DMA;
50 * NumberOfMapRegisters
51 * Number of map registers;
54 * Routine to be called when the adaptor is available;
57 * Driver defined contex that will be passed to the
61 * Success or failure code.
68 IoAllocateAdapterChannel (
69 PADAPTER_OBJECT AdaperObject,
70 PDEVICE_OBJECT DeviceObject,
71 ULONG NumberOfMapRegisters,
72 PDRIVER_CONTROL ExecutionRoutine,
75 /**********************************************************************
77 * IoAllocateController@16
80 * Sets up a call to a driver supplied controller object as
81 * soon as it is available.
85 * Driver created controller object;
91 * Routine to be called;
94 * Driver determined context to be based to the
105 IoAllocateController (
106 PCONTROLLER_OBJECT ControllerObject,
107 PDEVICE_OBJECT DeviceObject,
108 PDRIVER_CONTROL ExecutionRoutine,
111 /**********************************************************************
113 * IoAllocateErrorLogEntry@8
116 * Allocates an error log packet.
120 * Object which found the error;
123 * Size in bytes of the packet to be allocated.
126 * On success, a pointer to the allocated packet.
127 * On failure, it returns NULL.
131 IoAllocateErrorLogEntry (
135 /**********************************************************************
144 * Number of stack locations to allocate;
150 * On success, the allocated IRP. On failure, NULL.
158 /**********************************************************************
163 * Allocates an MDL large enough to map the supplied buffer.
167 * Base virtual address of the buffer to be mapped;
170 * Length of the buffer to be mapped;
173 * Whether the buffer is primary or secondary;
176 * Charge non-paged pool quota to current thread;
179 * Optional irp to be associated with the MDL.
182 * On success, the allocated MDL; on failure, NULL.
187 PVOID VirtualAddress,
189 BOOLEAN SecondaryBuffer,
194 /**********************************************************************
199 * Creates a symbolic link between the ARC name of a physical
200 * device and the name of the corresponding device object
204 * ARC name of the device
207 * Name of the device object
212 * PUNICODE_STRING ArcName,
213 * PUNICODE_STRING DeviceName
216 #define IoAssignArcName(ArcName,DeviceName) \
217 (IoCreateSymbolicLink((ArcName),(DeviceName)))
219 /**********************************************************************
221 * IoAssignResources@24
224 * Takes a list of requested hardware resources and allocates
235 * Driver object passed to the DriverEntry routine;
248 PUNICODE_STRING RegistryPath,
249 PUNICODE_STRING DriverClassName,
250 PDRIVER_OBJECT DriverObject,
251 PDEVICE_OBJECT DeviceObject,
252 PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
253 PCM_RESOURCE_LIST * AllocatedResources
256 * FUNCTION: Attaches the callers device object to a named target device
258 * SourceDevice = caller's device
259 * TargetDevice = Name of the target device
260 * AttachedDevice = Caller allocated storage. On return contains
261 * a pointer to the target device
262 * RETURNS: Success or failure code
267 PDEVICE_OBJECT SourceDevice,
268 PUNICODE_STRING TargetDevice,
269 PDEVICE_OBJECT * AttachedDevice
274 * SourceDevice = device to attach
275 * TargetDevice = device to be attached to
276 * RETURNS: Success or failure code
280 IoAttachDeviceByPointer (
281 PDEVICE_OBJECT SourceDevice,
282 PDEVICE_OBJECT TargetDevice
285 * FUNCTION: Attaches the callers device to the highest device in the chain
287 * SourceDevice = caller's device
288 * TargetDevice = Device to attach
289 * RETURNS: On success the previously highest device
294 IoAttachDeviceToDeviceStack (
295 PDEVICE_OBJECT SourceDevice,
296 PDEVICE_OBJECT TargetDevice
299 * FUNCTION: Builds a irp to be sent to lower level drivers
301 * MajorFunction = Major function code to be set in the IRP
302 * DeviceObject = Next lower device object
303 * Buffer = Buffer (only required for some major function codes)
304 * Length = Length in bytes of the buffer
305 * StartingOffset = Starting offset on the target device
306 * IoStatusBlock = Storage for status about the operation (optional)
307 * RETURNS: On success the IRP allocated
312 IoBuildAsynchronousFsdRequest (
314 PDEVICE_OBJECT DeviceObject,
317 PLARGE_INTEGER StartingOffset,
318 PIO_STATUS_BLOCK IoStatusBlock
321 * FUNCTION: Allocates and sets up an IRP for a device control request
323 * IoControlCode = Type of request
324 * DeviceObject = Target device
325 * InputBuffer = Optional input buffer to the driver
326 * InputBufferLength = Length of the input buffer
327 * OutputBuffer = Optional output buffer
328 * OutputBufferLength = Length of the output buffer
329 * InternalDeviceIoControl = TRUE if the request is internal
330 * Event = Initialized event for the caller to wait for the request
332 * IoStatusBlock = I/O status block to be set when the request is
334 * RETURNS: Returns the IRP created
338 IoBuildDeviceIoControlRequest (
340 PDEVICE_OBJECT DeviceObject,
342 ULONG InputBufferLength,
344 ULONG OutputBufferLength,
345 BOOLEAN InternalDeviceIoControl,
347 PIO_STATUS_BLOCK IoStatusBlock
354 PVOID VirtualAddress,
359 IoBuildSynchronousFsdRequest (
361 PDEVICE_OBJECT DeviceObject,
364 PLARGE_INTEGER StartingOffset,
366 PIO_STATUS_BLOCK IoStatusBlock
371 PDEVICE_OBJECT DeviceObject,
381 IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess,
382 IN ACCESS_MASK GrantedAccess);
385 IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer,
387 OUT PULONG ErrorOffset);
390 IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess,
391 IN UCHAR MajorFunction,
392 IN UCHAR MinorFunction,
393 IN ULONG IoControlCode,
394 IN PFILE_INFORMATION_CLASS FileInformationClass OPTIONAL,
395 IN PFS_INFORMATION_CLASS FsInformationClass OPTIONAL);
400 ACCESS_MASK DesiredAccess,
401 ULONG DesiredShareAccess,
402 PFILE_OBJECT FileObject,
403 PSHARE_ACCESS ShareAccess,
415 PKINTERRUPT * InterruptObject,
416 PKSERVICE_ROUTINE ServiceRoutine,
417 PVOID ServiceContext,
418 PKSPIN_LOCK SpinLock,
421 KIRQL SynchronizeIrql,
422 KINTERRUPT_MODE InterruptMode,
424 KAFFINITY ProcessorEnableMask,
434 * FUNCTION: Allocates memory for and intializes a device object for use for
437 * DriverObject : Driver object passed by iomgr when the driver was
439 * DeviceExtensionSize : Number of bytes for the device extension
440 * DeviceName : Unicode name of device
441 * DeviceType : Device type
442 * DeviceCharacteristics : Bit mask of device characteristics
443 * Exclusive : True if only one thread can access the device at a
447 * DeviceObject : Contains a pointer to allocated device object
448 * if the call succeeded
449 * NOTES: See the DDK documentation for more information
454 PDRIVER_OBJECT DriverObject,
455 ULONG DeviceExtensionSize,
456 PUNICODE_STRING DeviceName,
457 DEVICE_TYPE DeviceType,
458 ULONG DeviceCharacteristics,
460 PDEVICE_OBJECT * DeviceObject
465 OUT PHANDLE FileHandle,
466 IN ACCESS_MASK DesiredAccess,
467 IN POBJECT_ATTRIBUTES ObjectAttributes,
468 OUT PIO_STATUS_BLOCK IoStatusBlock,
469 IN PLARGE_INTEGER AllocationSize OPTIONAL,
470 IN ULONG FileAttributes,
471 IN ULONG ShareAccess,
472 IN ULONG CreateDisposition,
473 IN ULONG CreateOptions,
474 IN PVOID EaBuffer OPTIONAL,
476 IN CREATE_FILE_TYPE CreateFileType,
477 IN PVOID ExtraCreateParameters OPTIONAL,
482 IoCreateNotificationEvent (
483 PUNICODE_STRING EventName,
488 IoCreateStreamFileObject (
489 PFILE_OBJECT FileObject,
490 PDEVICE_OBJECT DeviceObject
494 IoCreateSymbolicLink (
495 PUNICODE_STRING SymbolicLinkName,
496 PUNICODE_STRING DeviceName
500 IoCreateSynchronizationEvent (
501 PUNICODE_STRING EventName,
506 IoCreateUnprotectedSymbolicLink (
507 PUNICODE_STRING SymbolicLinkName,
508 PUNICODE_STRING DeviceName
513 * Deletes a symbolic link between the ARC name of a physical
514 * device and the name of the corresponding device object
517 * ArcName = ARC name of the device
521 * IoDeassignArcName (
522 * PUNICODE_STRING ArcName
525 #define IoDeassignArcName(ArcName) \
526 (IoDeleteSymbolicLink((ArcName)))
531 PCONTROLLER_OBJECT ControllerObject
536 PDEVICE_OBJECT DeviceObject
540 IoDeleteSymbolicLink (
541 PUNICODE_STRING SymbolicLinkName
546 PDEVICE_OBJECT TargetDevice
550 IoDisconnectInterrupt (
551 PKINTERRUPT InterruptObject
560 IoFastQueryNetworkAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
561 IN ACCESS_MASK DesiredAccess,
562 IN ULONG OpenOptions,
563 OUT PIO_STATUS_BLOCK IoStatus,
564 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer);
569 PCONTROLLER_OBJECT ControllerObject
583 IoGetAttachedDevice (
584 PDEVICE_OBJECT DeviceObject
588 IoGetAttachedDeviceReference (
589 PDEVICE_OBJECT DeviceObject
593 IoGetBaseFileSystemDeviceObject (
594 IN PFILE_OBJECT FileObject
596 PCONFIGURATION_INFORMATION
598 IoGetConfigurationInformation (
603 * FUNCTION: Gets a pointer to the callers location in the I/O stack in
606 * Irp = Points to the IRP
607 * RETURNS: A pointer to the stack location
611 * IoGetCurrentIrpStackLocation (PIRP Irp)
613 #define IoGetCurrentIrpStackLocation(Irp) \
614 ((Irp)->Tail.Overlay.CurrentStackLocation)
616 #define IoGetPreviousIrpStackLocation(Irp) \
617 ((Irp)->Tail.Overlay.CurrentStackLocation+1)
619 #define IoSetNextIrpStackLocation(Irp) { \
620 (Irp)->CurrentLocation--; \
621 (Irp)->Tail.Overlay.CurrentStackLocation--; }
623 #define IoCopyCurrentIrpStackLocationToNext(Irp) { \
624 PIO_STACK_LOCATION IrpSp; \
625 PIO_STACK_LOCATION NextIrpSp; \
626 IrpSp = IoGetCurrentIrpStackLocation((Irp)); \
627 NextIrpSp = IoGetNextIrpStackLocation((Irp)); \
628 RtlCopyMemory(NextIrpSp, IrpSp, \
629 FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
630 NextIrpSp->Control = 0; }
632 #define IoSkipCurrentIrpStackLocation(Irp) \
633 (Irp)->CurrentLocation++; \
634 (Irp)->Tail.Overlay.CurrentStackLocation++;
636 #define IoSetPreviousIrpStackLocation(Irp) \
637 IoSkipCurrentIrpStackLocation(Irp)
639 #define IoRetardCurrentIrpStackLocation(Irp) \
640 IoSkipCurrentIrpStackLocation(Irp)
644 IoGetCurrentProcess (
649 IoGetDeviceObjectPointer (
650 PUNICODE_STRING ObjectName,
651 ACCESS_MASK DesiredAccess,
652 PFILE_OBJECT * FileObject,
653 PDEVICE_OBJECT * DeviceObject
657 IoGetDeviceToVerify (
658 struct _ETHREAD* Thread
662 IoGetFileObjectGenericMapping (
666 #define IoGetFunctionCodeFromCtlCode(ControlCode) \
667 ((ControlCode >> 2) & 0x00000FFF)
676 * FUNCTION: Gives a higher level driver access to the next lower driver's
679 * Irp = points to the irp
680 * RETURNS: A pointer to the stack location
684 * IoGetNextIrpStackLocation (PIRP Irp)
686 #define IoGetNextIrpStackLocation(Irp) \
687 ((Irp)->Tail.Overlay.CurrentStackLocation-1)
692 IoGetRelatedDeviceObject (
693 PFILE_OBJECT FileObject
697 IoGetRequestorProcess (
714 #define IoInitializeDpcRequest(DeviceObject,DpcRoutine) \
715 (KeInitializeDpc(&(DeviceObject)->Dpc, \
716 (PKDEFERRED_ROUTINE)(DpcRoutine), \
720 * FUNCTION: Initalizes an irp allocated by the caller
722 * Irp = IRP to initalize
723 * PacketSize = Size in bytes of the IRP
724 * StackSize = Number of stack locations in the IRP
736 PDEVICE_OBJECT DeviceObject,
737 PIO_TIMER_ROUTINE TimerRoutine,
744 * IsErrorUserInduced (NTSTATUS Status)
746 #define IoIsErrorUserInduced(Status) \
747 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
748 ((Status) == STATUS_IO_TIMEOUT) || \
749 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
750 ((Status) == STATUS_NO_MEDIA_IN_DRIVE) || \
751 ((Status) == STATUS_VERIFY_REQUIRED) || \
752 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
753 ((Status) == STATUS_WRONG_VOLUME)))
757 IoIsOperationSynchronous (
760 typedef struct _ETHREAD *PETHREAD;
768 IoMakeAssociatedIrp (
774 * FUNCTION: Marks the specified irp, indicating further processing will
775 * be required by other driver routines
780 * IoMarkIrpPending (PIRP Irp)
782 #define IoMarkIrpPending(Irp) \
783 (IoGetCurrentIrpStackLocation(Irp)->Control |= SL_PENDING_RETURNED)
788 IoOpenDeviceInstanceKey (
797 IoQueryDeviceDescription (
798 PINTERFACE_TYPE BusType,
800 PCONFIGURATION_TYPE ControllerType,
801 PULONG ControllerNumber,
802 PCONFIGURATION_TYPE PeripheralType,
803 PULONG PeripheralNumber,
804 PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
809 IoQueryDeviceEnumInfo (
813 // IoQueryFileInformation: confirmed - Undocumented because it does not require a valid file handle
816 IoQueryFileInformation (
817 IN PFILE_OBJECT FileObject,
818 IN FILE_INFORMATION_CLASS FileInformationClass,
820 OUT PVOID FileInformation,
821 OUT PULONG ReturnedLength
825 IoQueryVolumeInformation (
826 IN PFILE_OBJECT FileObject,
827 IN FS_INFORMATION_CLASS FsInformationClass,
829 OUT PVOID FsInformation,
830 OUT PULONG ReturnedLength
841 IN PIO_WORKITEM IoWorkItem,
842 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
843 IN WORK_QUEUE_TYPE QueueType,
850 PIO_WORKITEM IoWorkItem
856 PDEVICE_OBJECT DeviceObject
864 PDEVICE_OBJECT RealDeviceObject
868 IoRaiseInformationalHardError (
869 NTSTATUS ErrorStatus,
870 PUNICODE_STRING String,
871 struct _KTHREAD* Thread
875 IoRegisterDriverReinitialization (
876 PDRIVER_OBJECT DriverObject,
877 PDRIVER_REINITIALIZE ReinitRoutine,
882 IoRegisterFileSystem (
883 PDEVICE_OBJECT DeviceObject
885 #if (_WIN32_WINNT >= 0x0400)
888 IoRegisterFsRegistrationChange (
889 IN PDRIVER_OBJECT DriverObject,
890 IN PFSDNOTIFICATIONPROC FSDNotificationProc
892 #endif // (_WIN32_WINNT >= 0x0400)
895 IoRegisterShutdownNotification (
896 PDEVICE_OBJECT DeviceObject
900 IoReleaseCancelSpinLock (
905 IoReleaseVpbSpinLock (
910 IoRemoveShareAccess (
911 PFILE_OBJECT FileObject,
912 PSHARE_ACCESS ShareAccess
916 IoReportHalResourceUsage (
917 IN PUNICODE_STRING HalDescription,
918 IN PCM_RESOURCE_LIST RawList,
919 IN PCM_RESOURCE_LIST TranslatedList,
924 IoReportResourceUsage (
925 PUNICODE_STRING DriverClassName,
926 PDRIVER_OBJECT DriverObject,
927 PCM_RESOURCE_LIST DriverList,
928 ULONG DriverListSize,
929 PDEVICE_OBJECT DeviceObject,
930 PCM_RESOURCE_LIST DeviceList,
931 ULONG DeviceListSize,
932 BOOLEAN OverrideConflict,
933 PBOOLEAN ConflictDetected
936 #define IoRequestDpc(DeviceObject,Irp,Context) \
937 (KeInsertQueueDpc(&(DeviceObject)->Dpc,(Irp),(Context)))
939 #define IoSetCancelRoutine(Irp,NewCancelRoutine) \
940 ((PDRIVER_CANCEL)InterlockedExchangePointer(&(Irp)->CancelRoutine, \
943 // AG: Context is now NewContext, otherwise we end up with this:
944 // param->LocalLength=(LocalLength)
945 // ...which isn't possible.
947 #define IoSetCompletionRoutine(Irp,Routine,NewContext,Success,Error,Cancel) \
949 PIO_STACK_LOCATION param; \
950 assert((Success)||(Error)||(Cancel)?(Routine)!=NULL:TRUE); \
951 param = IoGetNextIrpStackLocation((Irp)); \
952 param->CompletionRoutine=(Routine); \
953 param->Context=(NewContext); \
954 param->Control = 0; \
956 param->Control = SL_INVOKE_ON_SUCCESS; \
958 param->Control |= SL_INVOKE_ON_ERROR; \
960 param->Control |= SL_INVOKE_ON_CANCEL; \
964 IoSetDeviceToVerify (IN struct _ETHREAD* Thread,
965 IN PDEVICE_OBJECT DeviceObject);
968 IoSetHardErrorOrVerifyDevice (
970 IN PDEVICE_OBJECT DeviceObject
975 IN PFILE_OBJECT FileObject,
976 IN FILE_INFORMATION_CLASS FileInformationClass,
978 OUT PVOID FileInformation
981 #define IoSetNextIrpStackLocation(Irp) \
983 (Irp)->CurrentLocation--; \
984 (Irp)->Tail.Overlay.CurrentStackLocation--; \
990 ACCESS_MASK DesiredAccess,
991 ULONG DesiredShareAccess,
992 PFILE_OBJECT FileObject,
993 PSHARE_ACCESS ShareAccess
997 IoSetThreadHardErrorMode (
998 IN BOOLEAN HardErrorEnabled
1007 * FUNCTION: Determines the size of an IRP
1009 * StackSize = number of stack locations in the IRP
1010 * RETURNS: The size of the IRP in bytes
1012 IoSizeOfIrp (CCHAR StackSize)
1014 #define IoSizeOfIrp(StackSize) \
1015 ((USHORT)(sizeof(IRP)+(((StackSize)-1)*sizeof(IO_STACK_LOCATION))))
1017 /* original macro */
1019 #define IoSizeOfIrp(StackSize) \
1020 ((USHORT)(sizeof(IRP)+((StackSize)*sizeof(IO_STACK_LOCATION))))
1024 * FUNCTION: Dequeues the next IRP from the device's associated queue and
1025 * calls its StartIo routine
1027 * DeviceObject = Device object
1028 * Cancelable = True if IRPs in the queue can be cancelled
1033 PDEVICE_OBJECT DeviceObject,
1038 IoStartNextPacketByKey (
1039 PDEVICE_OBJECT DeviceObject,
1044 * FUNCTION: Calls the drivers StartIO routine with the IRP or queues it if
1045 * the device is busy
1047 * DeviceObject = Device to pass the IRP to
1048 * Irp = Irp to be processed
1049 * Key = Optional value for where to insert the IRP
1050 * CancelFunction = Entry point for a driver supplied cancel function
1055 PDEVICE_OBJECT DeviceObject,
1058 PDRIVER_CANCEL CancelFunction
1063 PDEVICE_OBJECT DeviceObject
1068 PDEVICE_OBJECT DeviceObject
1072 IoPageRead(PFILE_OBJECT FileObject,
1074 PLARGE_INTEGER Offset,
1076 PIO_STATUS_BLOCK StatusBlock);
1079 IoSynchronousPageWrite (PFILE_OBJECT FileObject,
1081 PLARGE_INTEGER Offset,
1083 PIO_STATUS_BLOCK StatusBlock);
1085 struct _EPROCESS* STDCALL IoThreadToProcess (struct _ETHREAD* Thread);
1088 IoUnregisterFileSystem (
1089 IN PDEVICE_OBJECT DeviceObject
1091 #if (_WIN32_WINNT >= 0x0400)
1094 IoUnregisterFsRegistrationChange (
1095 IN PDRIVER_OBJECT DriverObject,
1096 IN PFSDNOTIFICATIONPROC FSDNotificationProc
1098 #endif // (_WIN32_WINNT >= 0x0400)
1101 IoUnregisterShutdownNotification (
1102 IN PDEVICE_OBJECT DeviceObject
1106 IoUpdateShareAccess (
1107 IN PFILE_OBJECT FileObject,
1108 IN PSHARE_ACCESS ShareAccess
1113 IN PDEVICE_OBJECT DeviceObject,
1114 IN BOOLEAN AllowRawMount
1118 IoWriteErrorLogEntry (
1122 * FUNCTION: Sends an irp to the next lower driver
1127 PDEVICE_OBJECT DeviceObject,
1131 * FUNCTION: Indicates the caller has finished all processing for a given
1132 * I/O request and is returning the given IRP to the I/O manager
1134 * Irp = Irp to be cancelled
1135 * PriorityBoost = Increment by which to boost the priority of the
1136 * thread making the request
1140 IofCompleteRequest (
1145 /* --- EXPORTED BY HAL --- */
1149 IoFlushAdapterBuffers (
1150 PADAPTER_OBJECT AdapterObject,
1152 PVOID MapRegisterBase,
1155 BOOLEAN WriteToDevice
1160 IoFreeAdapterChannel (
1161 PADAPTER_OBJECT AdapterObject
1166 IoFreeMapRegisters (
1167 PADAPTER_OBJECT AdapterObject,
1168 PVOID MapRegisterBase,
1169 ULONG NumberOfMapRegisters
1175 PADAPTER_OBJECT AdapterObject,
1177 PVOID MapRegisterBase,
1180 BOOLEAN WriteToDevice
1185 IoReadPartitionTable (
1186 PDEVICE_OBJECT DeviceObject,
1188 BOOLEAN ReturnedRecognizedPartitions,
1189 PDRIVE_LAYOUT_INFORMATION * PartitionBuffer
1194 IoSetPartitionInformation (
1195 PDEVICE_OBJECT DeviceObject,
1197 ULONG PartitionNumber,
1203 IoWritePartitionTable (
1204 PDEVICE_OBJECT DeviceObject,
1206 ULONG SectorsPerTrack,
1207 ULONG NumberOfHeads,
1208 PDRIVE_LAYOUT_INFORMATION PartitionBuffer
1212 /* --- --- --- INTERNAL or REACTOS ONLY --- --- --- */
1215 * FUNCTION: Registers the driver with WMI
1217 * DeviceObject = Device to register
1218 * Action = Action to take
1219 * RETURNS: Status (?)
1223 IoWMIRegistrationControl (
1224 PDEVICE_OBJECT DeviceObject,
1225 WMIREGACTION Action);
1229 IoIsTotalDeviceFailure (
1234 #endif /* ndef _INCLUDE_DDK_IOFUNCS_H */