Sync with trunk head (part 1 of x)
[reactos.git] / include / xdk / iofuncs.h
1 /******************************************************************************
2 * I/O Manager Functions *
3 ******************************************************************************/
4 $if (_NTDDK_)
5 /*
6 * VOID IoAssignArcName(
7 * IN PUNICODE_STRING ArcName,
8 * IN PUNICODE_STRING DeviceName);
9 */
10 #define IoAssignArcName(_ArcName, _DeviceName) ( \
11 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
12
13 /*
14 * VOID
15 * IoDeassignArcName(
16 * IN PUNICODE_STRING ArcName)
17 */
18 #define IoDeassignArcName IoDeleteSymbolicLink
19
20 VOID
21 FORCEINLINE
22 NTAPI
23 IoInitializeDriverCreateContext(
24 PIO_DRIVER_CREATE_CONTEXT DriverContext)
25 {
26 RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT));
27 DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT);
28 }
29 $endif
30
31
32 $if (_WDMDDK_)
33 /*
34 * NTSTATUS
35 * IoAcquireRemoveLock(
36 * IN PIO_REMOVE_LOCK RemoveLock,
37 * IN OPTIONAL PVOID Tag)
38 */
39 #if DBG
40 #define IoAcquireRemoveLock(RemoveLock, Tag) \
41 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
42 #else
43 #define IoAcquireRemoveLock(RemoveLock, Tag) \
44 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
45 #endif
46
47 /*
48 * VOID
49 * IoAdjustPagingPathCount(
50 * IN PLONG Count,
51 * IN BOOLEAN Increment)
52 */
53 #define IoAdjustPagingPathCount(_Count, \
54 _Increment) \
55 { \
56 if (_Increment) \
57 { \
58 InterlockedIncrement(_Count); \
59 } \
60 else \
61 { \
62 InterlockedDecrement(_Count); \
63 } \
64 }
65
66 #if !defined(_M_AMD64)
67 NTHALAPI
68 VOID
69 NTAPI
70 READ_PORT_BUFFER_UCHAR(
71 IN PUCHAR Port,
72 IN PUCHAR Buffer,
73 IN ULONG Count);
74
75 NTHALAPI
76 VOID
77 NTAPI
78 READ_PORT_BUFFER_ULONG(
79 IN PULONG Port,
80 IN PULONG Buffer,
81 IN ULONG Count);
82
83 NTHALAPI
84 VOID
85 NTAPI
86 READ_PORT_BUFFER_USHORT(
87 IN PUSHORT Port,
88 IN PUSHORT Buffer,
89 IN ULONG Count);
90
91 NTHALAPI
92 UCHAR
93 NTAPI
94 READ_PORT_UCHAR(
95 IN PUCHAR Port);
96
97 NTHALAPI
98 ULONG
99 NTAPI
100 READ_PORT_ULONG(
101 IN PULONG Port);
102
103 NTHALAPI
104 USHORT
105 NTAPI
106 READ_PORT_USHORT(
107 IN PUSHORT Port);
108
109 NTKERNELAPI
110 VOID
111 NTAPI
112 READ_REGISTER_BUFFER_UCHAR(
113 IN PUCHAR Register,
114 IN PUCHAR Buffer,
115 IN ULONG Count);
116
117 NTKERNELAPI
118 VOID
119 NTAPI
120 READ_REGISTER_BUFFER_ULONG(
121 IN PULONG Register,
122 IN PULONG Buffer,
123 IN ULONG Count);
124
125 NTKERNELAPI
126 VOID
127 NTAPI
128 READ_REGISTER_BUFFER_USHORT(
129 IN PUSHORT Register,
130 IN PUSHORT Buffer,
131 IN ULONG Count);
132
133 NTKERNELAPI
134 UCHAR
135 NTAPI
136 READ_REGISTER_UCHAR(
137 IN PUCHAR Register);
138
139 NTKERNELAPI
140 ULONG
141 NTAPI
142 READ_REGISTER_ULONG(
143 IN PULONG Register);
144
145 NTKERNELAPI
146 USHORT
147 NTAPI
148 READ_REGISTER_USHORT(
149 IN PUSHORT Register);
150
151 NTHALAPI
152 VOID
153 NTAPI
154 WRITE_PORT_BUFFER_UCHAR(
155 IN PUCHAR Port,
156 IN PUCHAR Buffer,
157 IN ULONG Count);
158
159 NTHALAPI
160 VOID
161 NTAPI
162 WRITE_PORT_BUFFER_ULONG(
163 IN PULONG Port,
164 IN PULONG Buffer,
165 IN ULONG Count);
166
167 NTHALAPI
168 VOID
169 NTAPI
170 WRITE_PORT_BUFFER_USHORT(
171 IN PUSHORT Port,
172 IN PUSHORT Buffer,
173 IN ULONG Count);
174
175 NTHALAPI
176 VOID
177 NTAPI
178 WRITE_PORT_UCHAR(
179 IN PUCHAR Port,
180 IN UCHAR Value);
181
182 NTHALAPI
183 VOID
184 NTAPI
185 WRITE_PORT_ULONG(
186 IN PULONG Port,
187 IN ULONG Value);
188
189 NTHALAPI
190 VOID
191 NTAPI
192 WRITE_PORT_USHORT(
193 IN PUSHORT Port,
194 IN USHORT Value);
195
196 NTKERNELAPI
197 VOID
198 NTAPI
199 WRITE_REGISTER_BUFFER_UCHAR(
200 IN PUCHAR Register,
201 IN PUCHAR Buffer,
202 IN ULONG Count);
203
204 NTKERNELAPI
205 VOID
206 NTAPI
207 WRITE_REGISTER_BUFFER_ULONG(
208 IN PULONG Register,
209 IN PULONG Buffer,
210 IN ULONG Count);
211
212 NTKERNELAPI
213 VOID
214 NTAPI
215 WRITE_REGISTER_BUFFER_USHORT(
216 IN PUSHORT Register,
217 IN PUSHORT Buffer,
218 IN ULONG Count);
219
220 NTKERNELAPI
221 VOID
222 NTAPI
223 WRITE_REGISTER_UCHAR(
224 IN PUCHAR Register,
225 IN UCHAR Value);
226
227 NTKERNELAPI
228 VOID
229 NTAPI
230 WRITE_REGISTER_ULONG(
231 IN PULONG Register,
232 IN ULONG Value);
233
234 NTKERNELAPI
235 VOID
236 NTAPI
237 WRITE_REGISTER_USHORT(
238 IN PUSHORT Register,
239 IN USHORT Value);
240
241 #else
242
243 FORCEINLINE
244 VOID
245 READ_PORT_BUFFER_UCHAR(
246 IN PUCHAR Port,
247 IN PUCHAR Buffer,
248 IN ULONG Count)
249 {
250 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
251 }
252
253 FORCEINLINE
254 VOID
255 READ_PORT_BUFFER_ULONG(
256 IN PULONG Port,
257 IN PULONG Buffer,
258 IN ULONG Count)
259 {
260 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
261 }
262
263 FORCEINLINE
264 VOID
265 READ_PORT_BUFFER_USHORT(
266 IN PUSHORT Port,
267 IN PUSHORT Buffer,
268 IN ULONG Count)
269 {
270 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
271 }
272
273 FORCEINLINE
274 UCHAR
275 READ_PORT_UCHAR(
276 IN PUCHAR Port)
277 {
278 return __inbyte((USHORT)(ULONG_PTR)Port);
279 }
280
281 FORCEINLINE
282 ULONG
283 READ_PORT_ULONG(
284 IN PULONG Port)
285 {
286 return __indword((USHORT)(ULONG_PTR)Port);
287 }
288
289 FORCEINLINE
290 USHORT
291 READ_PORT_USHORT(
292 IN PUSHORT Port)
293 {
294 return __inword((USHORT)(ULONG_PTR)Port);
295 }
296
297 FORCEINLINE
298 VOID
299 READ_REGISTER_BUFFER_UCHAR(
300 IN PUCHAR Register,
301 IN PUCHAR Buffer,
302 IN ULONG Count)
303 {
304 __movsb(Register, Buffer, Count);
305 }
306
307 FORCEINLINE
308 VOID
309 READ_REGISTER_BUFFER_ULONG(
310 IN PULONG Register,
311 IN PULONG Buffer,
312 IN ULONG Count)
313 {
314 __movsd(Register, Buffer, Count);
315 }
316
317 FORCEINLINE
318 VOID
319 READ_REGISTER_BUFFER_USHORT(
320 IN PUSHORT Register,
321 IN PUSHORT Buffer,
322 IN ULONG Count)
323 {
324 __movsw(Register, Buffer, Count);
325 }
326
327 FORCEINLINE
328 UCHAR
329 READ_REGISTER_UCHAR(
330 IN volatile UCHAR *Register)
331 {
332 return *Register;
333 }
334
335 FORCEINLINE
336 ULONG
337 READ_REGISTER_ULONG(
338 IN volatile ULONG *Register)
339 {
340 return *Register;
341 }
342
343 FORCEINLINE
344 USHORT
345 READ_REGISTER_USHORT(
346 IN volatile USHORT *Register)
347 {
348 return *Register;
349 }
350
351 FORCEINLINE
352 VOID
353 WRITE_PORT_BUFFER_UCHAR(
354 IN PUCHAR Port,
355 IN PUCHAR Buffer,
356 IN ULONG Count)
357 {
358 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
359 }
360
361 FORCEINLINE
362 VOID
363 WRITE_PORT_BUFFER_ULONG(
364 IN PULONG Port,
365 IN PULONG Buffer,
366 IN ULONG Count)
367 {
368 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
369 }
370
371 FORCEINLINE
372 VOID
373 WRITE_PORT_BUFFER_USHORT(
374 IN PUSHORT Port,
375 IN PUSHORT Buffer,
376 IN ULONG Count)
377 {
378 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
379 }
380
381 FORCEINLINE
382 VOID
383 WRITE_PORT_UCHAR(
384 IN PUCHAR Port,
385 IN UCHAR Value)
386 {
387 __outbyte((USHORT)(ULONG_PTR)Port, Value);
388 }
389
390 FORCEINLINE
391 VOID
392 WRITE_PORT_ULONG(
393 IN PULONG Port,
394 IN ULONG Value)
395 {
396 __outdword((USHORT)(ULONG_PTR)Port, Value);
397 }
398
399 FORCEINLINE
400 VOID
401 WRITE_PORT_USHORT(
402 IN PUSHORT Port,
403 IN USHORT Value)
404 {
405 __outword((USHORT)(ULONG_PTR)Port, Value);
406 }
407
408 FORCEINLINE
409 VOID
410 WRITE_REGISTER_BUFFER_UCHAR(
411 IN PUCHAR Register,
412 IN PUCHAR Buffer,
413 IN ULONG Count)
414 {
415 LONG Synch;
416 __movsb(Register, Buffer, Count);
417 InterlockedOr(&Synch, 1);
418 }
419
420 FORCEINLINE
421 VOID
422 WRITE_REGISTER_BUFFER_ULONG(
423 IN PULONG Register,
424 IN PULONG Buffer,
425 IN ULONG Count)
426 {
427 LONG Synch;
428 __movsd(Register, Buffer, Count);
429 InterlockedOr(&Synch, 1);
430 }
431
432 FORCEINLINE
433 VOID
434 WRITE_REGISTER_BUFFER_USHORT(
435 IN PUSHORT Register,
436 IN PUSHORT Buffer,
437 IN ULONG Count)
438 {
439 LONG Synch;
440 __movsw(Register, Buffer, Count);
441 InterlockedOr(&Synch, 1);
442 }
443
444 FORCEINLINE
445 VOID
446 WRITE_REGISTER_UCHAR(
447 IN volatile UCHAR *Register,
448 IN UCHAR Value)
449 {
450 LONG Synch;
451 *Register = Value;
452 InterlockedOr(&Synch, 1);
453 }
454
455 FORCEINLINE
456 VOID
457 WRITE_REGISTER_ULONG(
458 IN volatile ULONG *Register,
459 IN ULONG Value)
460 {
461 LONG Synch;
462 *Register = Value;
463 InterlockedOr(&Synch, 1);
464 }
465
466 FORCEINLINE
467 VOID
468 WRITE_REGISTER_USHORT(
469 IN volatile USHORT *Register,
470 IN USHORT Value)
471 {
472 LONG Sync;
473 *Register = Value;
474 InterlockedOr(&Sync, 1);
475 }
476 #endif
477
478 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
479 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
480
481 #define DMA_MACROS_DEFINED
482
483 FORCEINLINE
484 NTSTATUS
485 IoAllocateAdapterChannel(
486 IN PDMA_ADAPTER DmaAdapter,
487 IN PDEVICE_OBJECT DeviceObject,
488 IN ULONG NumberOfMapRegisters,
489 IN PDRIVER_CONTROL ExecutionRoutine,
490 IN PVOID Context)
491 {
492 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
493 AllocateAdapterChannel =
494 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
495 ASSERT(AllocateAdapterChannel);
496 return AllocateAdapterChannel(DmaAdapter,
497 DeviceObject,
498 NumberOfMapRegisters,
499 ExecutionRoutine,
500 Context );
501 }
502
503 FORCEINLINE
504 BOOLEAN
505 NTAPI
506 IoFlushAdapterBuffers(
507 IN PDMA_ADAPTER DmaAdapter,
508 IN PMDL Mdl,
509 IN PVOID MapRegisterBase,
510 IN PVOID CurrentVa,
511 IN ULONG Length,
512 IN BOOLEAN WriteToDevice)
513 {
514 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
515 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
516 ASSERT(FlushAdapterBuffers);
517 return FlushAdapterBuffers(DmaAdapter,
518 Mdl,
519 MapRegisterBase,
520 CurrentVa,
521 Length,
522 WriteToDevice);
523 }
524
525 FORCEINLINE
526 VOID
527 NTAPI
528 IoFreeAdapterChannel(
529 IN PDMA_ADAPTER DmaAdapter)
530 {
531 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
532 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
533 ASSERT(FreeAdapterChannel);
534 FreeAdapterChannel(DmaAdapter);
535 }
536
537 FORCEINLINE
538 VOID
539 NTAPI
540 IoFreeMapRegisters(
541 IN PDMA_ADAPTER DmaAdapter,
542 IN PVOID MapRegisterBase,
543 IN ULONG NumberOfMapRegisters)
544 {
545 PFREE_MAP_REGISTERS FreeMapRegisters;
546 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
547 ASSERT(FreeMapRegisters);
548 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
549 }
550
551 FORCEINLINE
552 PHYSICAL_ADDRESS
553 NTAPI
554 IoMapTransfer(
555 IN PDMA_ADAPTER DmaAdapter,
556 IN PMDL Mdl,
557 IN PVOID MapRegisterBase,
558 IN PVOID CurrentVa,
559 IN OUT PULONG Length,
560 IN BOOLEAN WriteToDevice)
561 {
562 PMAP_TRANSFER MapTransfer;
563
564 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
565 ASSERT(MapTransfer);
566 return MapTransfer(DmaAdapter,
567 Mdl,
568 MapRegisterBase,
569 CurrentVa,
570 Length,
571 WriteToDevice);
572 }
573 #endif
574 $endif
575
576 #if (NTDDI_VERSION >= NTDDI_WIN2K)
577 $if (_NTDDK_)
578 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
579 NTKERNELAPI
580 NTSTATUS
581 NTAPI
582 IoAllocateAdapterChannel(
583 IN PADAPTER_OBJECT AdapterObject,
584 IN PDEVICE_OBJECT DeviceObject,
585 IN ULONG NumberOfMapRegisters,
586 IN PDRIVER_CONTROL ExecutionRoutine,
587 IN PVOID Context);
588 #endif
589
590 #if !defined(DMA_MACROS_DEFINED)
591 //DECLSPEC_DEPRECATED_DDK
592 NTHALAPI
593 PHYSICAL_ADDRESS
594 NTAPI
595 IoMapTransfer(
596 IN PADAPTER_OBJECT AdapterObject,
597 IN PMDL Mdl,
598 IN PVOID MapRegisterBase,
599 IN PVOID CurrentVa,
600 IN OUT PULONG Length,
601 IN BOOLEAN WriteToDevice);
602 #endif
603
604 NTKERNELAPI
605 VOID
606 NTAPI
607 IoAllocateController(
608 IN PCONTROLLER_OBJECT ControllerObject,
609 IN PDEVICE_OBJECT DeviceObject,
610 IN PDRIVER_CONTROL ExecutionRoutine,
611 IN PVOID Context OPTIONAL);
612
613 NTKERNELAPI
614 PCONTROLLER_OBJECT
615 NTAPI
616 IoCreateController(
617 IN ULONG Size);
618
619 NTKERNELAPI
620 VOID
621 NTAPI
622 IoDeleteController(
623 IN PCONTROLLER_OBJECT ControllerObject);
624
625 NTKERNELAPI
626 VOID
627 NTAPI
628 IoFreeController(
629 IN PCONTROLLER_OBJECT ControllerObject);
630
631 NTKERNELAPI
632 PCONFIGURATION_INFORMATION
633 NTAPI
634 IoGetConfigurationInformation(VOID);
635
636 NTKERNELAPI
637 PDEVICE_OBJECT
638 NTAPI
639 IoGetDeviceToVerify(
640 IN PETHREAD Thread);
641
642 NTKERNELAPI
643 VOID
644 NTAPI
645 IoCancelFileOpen(
646 IN PDEVICE_OBJECT DeviceObject,
647 IN PFILE_OBJECT FileObject);
648
649 NTKERNELAPI
650 PGENERIC_MAPPING
651 NTAPI
652 IoGetFileObjectGenericMapping(VOID);
653
654 NTKERNELAPI
655 PIRP
656 NTAPI
657 IoMakeAssociatedIrp(
658 IN PIRP Irp,
659 IN CCHAR StackSize);
660
661 NTKERNELAPI
662 NTSTATUS
663 NTAPI
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);
673
674 NTKERNELAPI
675 VOID
676 NTAPI
677 IoRaiseHardError(
678 IN PIRP Irp,
679 IN PVPB Vpb OPTIONAL,
680 IN PDEVICE_OBJECT RealDeviceObject);
681
682 NTKERNELAPI
683 BOOLEAN
684 NTAPI
685 IoRaiseInformationalHardError(
686 IN NTSTATUS ErrorStatus,
687 IN PUNICODE_STRING String OPTIONAL,
688 IN PKTHREAD Thread OPTIONAL);
689
690 NTKERNELAPI
691 VOID
692 NTAPI
693 IoRegisterBootDriverReinitialization(
694 IN PDRIVER_OBJECT DriverObject,
695 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
696 IN PVOID Context OPTIONAL);
697
698 NTKERNELAPI
699 VOID
700 NTAPI
701 IoRegisterDriverReinitialization(
702 IN PDRIVER_OBJECT DriverObject,
703 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
704 IN PVOID Context OPTIONAL);
705
706 NTKERNELAPI
707 NTSTATUS
708 NTAPI
709 IoAttachDeviceByPointer(
710 IN PDEVICE_OBJECT SourceDevice,
711 IN PDEVICE_OBJECT TargetDevice);
712
713 NTKERNELAPI
714 NTSTATUS
715 NTAPI
716 IoReportDetectedDevice(
717 IN PDRIVER_OBJECT DriverObject,
718 IN INTERFACE_TYPE LegacyBusType,
719 IN ULONG BusNumber,
720 IN ULONG SlotNumber,
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);
725
726 NTKERNELAPI
727 NTSTATUS
728 NTAPI
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);
737
738 NTKERNELAPI
739 NTSTATUS
740 NTAPI
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);
751
752 NTKERNELAPI
753 VOID
754 NTAPI
755 IoSetHardErrorOrVerifyDevice(
756 IN PIRP Irp,
757 IN PDEVICE_OBJECT DeviceObject);
758
759 NTKERNELAPI
760 NTSTATUS
761 NTAPI
762 IoAssignResources(
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);
769
770 NTKERNELAPI
771 BOOLEAN
772 NTAPI
773 IoSetThreadHardErrorMode(
774 IN BOOLEAN EnableHardErrors);
775 $endif
776
777 $if (_WDMDDK_)
778 NTKERNELAPI
779 VOID
780 NTAPI
781 IoAcquireCancelSpinLock(
782 OUT PKIRQL Irql);
783
784 NTKERNELAPI
785 NTSTATUS
786 NTAPI
787 IoAcquireRemoveLockEx(
788 IN PIO_REMOVE_LOCK RemoveLock,
789 IN PVOID Tag OPTIONAL,
790 IN PCSTR File,
791 IN ULONG Line,
792 IN ULONG RemlockSize);
793 NTKERNELAPI
794 NTSTATUS
795 NTAPI
796 IoAllocateDriverObjectExtension(
797 IN PDRIVER_OBJECT DriverObject,
798 IN PVOID ClientIdentificationAddress,
799 IN ULONG DriverObjectExtensionSize,
800 OUT PVOID *DriverObjectExtension);
801
802 NTKERNELAPI
803 PVOID
804 NTAPI
805 IoAllocateErrorLogEntry(
806 IN PVOID IoObject,
807 IN UCHAR EntrySize);
808
809 NTKERNELAPI
810 PIRP
811 NTAPI
812 IoAllocateIrp(
813 IN CCHAR StackSize,
814 IN BOOLEAN ChargeQuota);
815
816 NTKERNELAPI
817 PMDL
818 NTAPI
819 IoAllocateMdl(
820 IN PVOID VirtualAddress OPTIONAL,
821 IN ULONG Length,
822 IN BOOLEAN SecondaryBuffer,
823 IN BOOLEAN ChargeQuota,
824 IN OUT PIRP Irp OPTIONAL);
825
826 NTKERNELAPI
827 PIO_WORKITEM
828 NTAPI
829 IoAllocateWorkItem(
830 IN PDEVICE_OBJECT DeviceObject);
831
832 NTKERNELAPI
833 NTSTATUS
834 NTAPI
835 IoAttachDevice(
836 IN PDEVICE_OBJECT SourceDevice,
837 IN PUNICODE_STRING TargetDevice,
838 OUT PDEVICE_OBJECT *AttachedDevice);
839
840 NTKERNELAPI
841 PDEVICE_OBJECT
842 NTAPI
843 IoAttachDeviceToDeviceStack(
844 IN PDEVICE_OBJECT SourceDevice,
845 IN PDEVICE_OBJECT TargetDevice);
846
847 NTKERNELAPI
848 PIRP
849 NTAPI
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);
857
858 NTKERNELAPI
859 PIRP
860 NTAPI
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,
869 IN PKEVENT Event,
870 OUT PIO_STATUS_BLOCK IoStatusBlock);
871
872 NTKERNELAPI
873 VOID
874 NTAPI
875 IoBuildPartialMdl(
876 IN PMDL SourceMdl,
877 IN OUT PMDL TargetMdl,
878 IN PVOID VirtualAddress,
879 IN ULONG Length);
880
881 NTKERNELAPI
882 PIRP
883 NTAPI
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,
890 IN PKEVENT Event,
891 OUT PIO_STATUS_BLOCK IoStatusBlock);
892
893 NTKERNELAPI
894 NTSTATUS
895 FASTCALL
896 IofCallDriver(
897 IN PDEVICE_OBJECT DeviceObject,
898 IN OUT PIRP Irp);
899 #define IoCallDriver IofCallDriver
900
901 NTKERNELAPI
902 VOID
903 FASTCALL
904 IofCompleteRequest(
905 IN PIRP Irp,
906 IN CCHAR PriorityBoost);
907 #define IoCompleteRequest IofCompleteRequest
908
909 NTKERNELAPI
910 BOOLEAN
911 NTAPI
912 IoCancelIrp(
913 IN PIRP Irp);
914
915 NTKERNELAPI
916 NTSTATUS
917 NTAPI
918 IoCheckShareAccess(
919 IN ACCESS_MASK DesiredAccess,
920 IN ULONG DesiredShareAccess,
921 IN OUT PFILE_OBJECT FileObject,
922 IN OUT PSHARE_ACCESS ShareAccess,
923 IN BOOLEAN Update);
924
925 NTKERNELAPI
926 VOID
927 FASTCALL
928 IofCompleteRequest(
929 IN PIRP Irp,
930 IN CCHAR PriorityBoost);
931
932 NTKERNELAPI
933 NTSTATUS
934 NTAPI
935 IoConnectInterrupt(
936 OUT PKINTERRUPT *InterruptObject,
937 IN PKSERVICE_ROUTINE ServiceRoutine,
938 IN PVOID ServiceContext OPTIONAL,
939 IN PKSPIN_LOCK SpinLock OPTIONAL,
940 IN ULONG Vector,
941 IN KIRQL Irql,
942 IN KIRQL SynchronizeIrql,
943 IN KINTERRUPT_MODE InterruptMode,
944 IN BOOLEAN ShareVector,
945 IN KAFFINITY ProcessorEnableMask,
946 IN BOOLEAN FloatingSave);
947
948 NTKERNELAPI
949 NTSTATUS
950 NTAPI
951 IoCreateDevice(
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);
959
960 NTKERNELAPI
961 NTSTATUS
962 NTAPI
963 IoCreateFile(
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,
974 IN ULONG EaLength,
975 IN CREATE_FILE_TYPE CreateFileType,
976 IN PVOID InternalParameters OPTIONAL,
977 IN ULONG Options);
978
979 NTKERNELAPI
980 PKEVENT
981 NTAPI
982 IoCreateNotificationEvent(
983 IN PUNICODE_STRING EventName,
984 OUT PHANDLE EventHandle);
985
986 NTKERNELAPI
987 NTSTATUS
988 NTAPI
989 IoCreateSymbolicLink(
990 IN PUNICODE_STRING SymbolicLinkName,
991 IN PUNICODE_STRING DeviceName);
992
993 NTKERNELAPI
994 PKEVENT
995 NTAPI
996 IoCreateSynchronizationEvent(
997 IN PUNICODE_STRING EventName,
998 OUT PHANDLE EventHandle);
999
1000 NTKERNELAPI
1001 NTSTATUS
1002 NTAPI
1003 IoCreateUnprotectedSymbolicLink(
1004 IN PUNICODE_STRING SymbolicLinkName,
1005 IN PUNICODE_STRING DeviceName);
1006
1007 NTKERNELAPI
1008 VOID
1009 NTAPI
1010 IoDeleteDevice(
1011 IN PDEVICE_OBJECT DeviceObject);
1012
1013 NTKERNELAPI
1014 NTSTATUS
1015 NTAPI
1016 IoDeleteSymbolicLink(
1017 IN PUNICODE_STRING SymbolicLinkName);
1018
1019 NTKERNELAPI
1020 VOID
1021 NTAPI
1022 IoDetachDevice(
1023 IN OUT PDEVICE_OBJECT TargetDevice);
1024
1025 NTKERNELAPI
1026 VOID
1027 NTAPI
1028 IoDisconnectInterrupt(
1029 IN PKINTERRUPT InterruptObject);
1030
1031 NTKERNELAPI
1032 VOID
1033 NTAPI
1034 IoFreeIrp(
1035 IN PIRP Irp);
1036
1037 NTKERNELAPI
1038 VOID
1039 NTAPI
1040 IoFreeMdl(
1041 IN PMDL Mdl);
1042
1043 NTKERNELAPI
1044 VOID
1045 NTAPI
1046 IoFreeWorkItem(
1047 IN PIO_WORKITEM IoWorkItem);
1048
1049 NTKERNELAPI
1050 PDEVICE_OBJECT
1051 NTAPI
1052 IoGetAttachedDevice(
1053 IN PDEVICE_OBJECT DeviceObject);
1054
1055 NTKERNELAPI
1056 PDEVICE_OBJECT
1057 NTAPI
1058 IoGetAttachedDeviceReference(
1059 IN PDEVICE_OBJECT DeviceObject);
1060
1061 NTKERNELAPI
1062 NTSTATUS
1063 NTAPI
1064 IoGetBootDiskInformation(
1065 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
1066 IN ULONG Size);
1067
1068 NTKERNELAPI
1069 NTSTATUS
1070 NTAPI
1071 IoGetDeviceInterfaceAlias(
1072 IN PUNICODE_STRING SymbolicLinkName,
1073 IN CONST GUID *AliasInterfaceClassGuid,
1074 OUT PUNICODE_STRING AliasSymbolicLinkName);
1075
1076 NTKERNELAPI
1077 PEPROCESS
1078 NTAPI
1079 IoGetCurrentProcess(VOID);
1080
1081 NTKERNELAPI
1082 NTSTATUS
1083 NTAPI
1084 IoGetDeviceInterfaces(
1085 IN CONST GUID *InterfaceClassGuid,
1086 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
1087 IN ULONG Flags,
1088 OUT PWSTR *SymbolicLinkList);
1089
1090 NTKERNELAPI
1091 NTSTATUS
1092 NTAPI
1093 IoGetDeviceObjectPointer(
1094 IN PUNICODE_STRING ObjectName,
1095 IN ACCESS_MASK DesiredAccess,
1096 OUT PFILE_OBJECT *FileObject,
1097 OUT PDEVICE_OBJECT *DeviceObject);
1098
1099 NTKERNELAPI
1100 NTSTATUS
1101 NTAPI
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);
1108
1109 NTKERNELAPI
1110 PDMA_ADAPTER
1111 NTAPI
1112 IoGetDmaAdapter(
1113 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
1114 IN PDEVICE_DESCRIPTION DeviceDescription,
1115 IN OUT PULONG NumberOfMapRegisters);
1116
1117 NTKERNELAPI
1118 PVOID
1119 NTAPI
1120 IoGetDriverObjectExtension(
1121 IN PDRIVER_OBJECT DriverObject,
1122 IN PVOID ClientIdentificationAddress);
1123
1124 NTKERNELAPI
1125 PVOID
1126 NTAPI
1127 IoGetInitialStack(VOID);
1128
1129 NTKERNELAPI
1130 PDEVICE_OBJECT
1131 NTAPI
1132 IoGetRelatedDeviceObject(
1133 IN PFILE_OBJECT FileObject);
1134
1135 NTKERNELAPI
1136 VOID
1137 NTAPI
1138 IoQueueWorkItem(
1139 IN PIO_WORKITEM IoWorkItem,
1140 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
1141 IN WORK_QUEUE_TYPE QueueType,
1142 IN PVOID Context OPTIONAL);
1143
1144 NTKERNELAPI
1145 VOID
1146 NTAPI
1147 IoInitializeIrp(
1148 IN OUT PIRP Irp,
1149 IN USHORT PacketSize,
1150 IN CCHAR StackSize);
1151
1152 NTKERNELAPI
1153 VOID
1154 NTAPI
1155 IoInitializeRemoveLockEx(
1156 IN PIO_REMOVE_LOCK Lock,
1157 IN ULONG AllocateTag,
1158 IN ULONG MaxLockedMinutes,
1159 IN ULONG HighWatermark,
1160 IN ULONG RemlockSize);
1161
1162 NTKERNELAPI
1163 NTSTATUS
1164 NTAPI
1165 IoInitializeTimer(
1166 IN PDEVICE_OBJECT DeviceObject,
1167 IN PIO_TIMER_ROUTINE TimerRoutine,
1168 IN PVOID Context OPTIONAL);
1169
1170 NTKERNELAPI
1171 VOID
1172 NTAPI
1173 IoInvalidateDeviceRelations(
1174 IN PDEVICE_OBJECT DeviceObject,
1175 IN DEVICE_RELATION_TYPE Type);
1176
1177 NTKERNELAPI
1178 VOID
1179 NTAPI
1180 IoInvalidateDeviceState(
1181 IN PDEVICE_OBJECT PhysicalDeviceObject);
1182
1183 NTKERNELAPI
1184 BOOLEAN
1185 NTAPI
1186 IoIsWdmVersionAvailable(
1187 IN UCHAR MajorVersion,
1188 IN UCHAR MinorVersion);
1189
1190 NTKERNELAPI
1191 NTSTATUS
1192 NTAPI
1193 IoOpenDeviceInterfaceRegistryKey(
1194 IN PUNICODE_STRING SymbolicLinkName,
1195 IN ACCESS_MASK DesiredAccess,
1196 OUT PHANDLE DeviceInterfaceKey);
1197
1198 NTKERNELAPI
1199 NTSTATUS
1200 NTAPI
1201 IoOpenDeviceRegistryKey(
1202 IN PDEVICE_OBJECT DeviceObject,
1203 IN ULONG DevInstKeyType,
1204 IN ACCESS_MASK DesiredAccess,
1205 OUT PHANDLE DevInstRegKey);
1206
1207 NTKERNELAPI
1208 NTSTATUS
1209 NTAPI
1210 IoRegisterDeviceInterface(
1211 IN PDEVICE_OBJECT PhysicalDeviceObject,
1212 IN CONST GUID *InterfaceClassGuid,
1213 IN PUNICODE_STRING ReferenceString OPTIONAL,
1214 OUT PUNICODE_STRING SymbolicLinkName);
1215
1216 NTKERNELAPI
1217 NTSTATUS
1218 NTAPI
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);
1227
1228 NTKERNELAPI
1229 NTSTATUS
1230 NTAPI
1231 IoRegisterShutdownNotification(
1232 IN PDEVICE_OBJECT DeviceObject);
1233
1234 NTKERNELAPI
1235 VOID
1236 NTAPI
1237 IoReleaseCancelSpinLock(
1238 IN KIRQL Irql);
1239
1240 NTKERNELAPI
1241 VOID
1242 NTAPI
1243 IoReleaseRemoveLockAndWaitEx(
1244 IN PIO_REMOVE_LOCK RemoveLock,
1245 IN PVOID Tag OPTIONAL,
1246 IN ULONG RemlockSize);
1247
1248 NTKERNELAPI
1249 VOID
1250 NTAPI
1251 IoReleaseRemoveLockEx(
1252 IN PIO_REMOVE_LOCK RemoveLock,
1253 IN PVOID Tag OPTIONAL,
1254 IN ULONG RemlockSize);
1255
1256 NTKERNELAPI
1257 VOID
1258 NTAPI
1259 IoRemoveShareAccess(
1260 IN PFILE_OBJECT FileObject,
1261 IN OUT PSHARE_ACCESS ShareAccess);
1262
1263 NTKERNELAPI
1264 NTSTATUS
1265 NTAPI
1266 IoReportTargetDeviceChange(
1267 IN PDEVICE_OBJECT PhysicalDeviceObject,
1268 IN PVOID NotificationStructure);
1269
1270 NTKERNELAPI
1271 NTSTATUS
1272 NTAPI
1273 IoReportTargetDeviceChangeAsynchronous(
1274 IN PDEVICE_OBJECT PhysicalDeviceObject,
1275 IN PVOID NotificationStructure,
1276 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
1277 IN PVOID Context OPTIONAL);
1278
1279 NTKERNELAPI
1280 VOID
1281 NTAPI
1282 IoRequestDeviceEject(
1283 IN PDEVICE_OBJECT PhysicalDeviceObject);
1284
1285 NTKERNELAPI
1286 VOID
1287 NTAPI
1288 IoReuseIrp(
1289 IN OUT PIRP Irp,
1290 IN NTSTATUS Status);
1291
1292 NTKERNELAPI
1293 NTSTATUS
1294 NTAPI
1295 IoSetDeviceInterfaceState(
1296 IN PUNICODE_STRING SymbolicLinkName,
1297 IN BOOLEAN Enable);
1298
1299 NTKERNELAPI
1300 VOID
1301 NTAPI
1302 IoSetShareAccess(
1303 IN ACCESS_MASK DesiredAccess,
1304 IN ULONG DesiredShareAccess,
1305 IN OUT PFILE_OBJECT FileObject,
1306 OUT PSHARE_ACCESS ShareAccess);
1307
1308 NTKERNELAPI
1309 VOID
1310 NTAPI
1311 IoStartNextPacket(
1312 IN PDEVICE_OBJECT DeviceObject,
1313 IN BOOLEAN Cancelable);
1314
1315 NTKERNELAPI
1316 VOID
1317 NTAPI
1318 IoStartNextPacketByKey(
1319 IN PDEVICE_OBJECT DeviceObject,
1320 IN BOOLEAN Cancelable,
1321 IN ULONG Key);
1322
1323 NTKERNELAPI
1324 VOID
1325 NTAPI
1326 IoStartPacket(
1327 IN PDEVICE_OBJECT DeviceObject,
1328 IN PIRP Irp,
1329 IN PULONG Key OPTIONAL,
1330 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
1331
1332 NTKERNELAPI
1333 VOID
1334 NTAPI
1335 IoStartTimer(
1336 IN PDEVICE_OBJECT DeviceObject);
1337
1338 NTKERNELAPI
1339 VOID
1340 NTAPI
1341 IoStopTimer(
1342 IN PDEVICE_OBJECT DeviceObject);
1343
1344 NTKERNELAPI
1345 NTSTATUS
1346 NTAPI
1347 IoUnregisterPlugPlayNotification(
1348 IN PVOID NotificationEntry);
1349
1350 NTKERNELAPI
1351 VOID
1352 NTAPI
1353 IoUnregisterShutdownNotification(
1354 IN PDEVICE_OBJECT DeviceObject);
1355
1356 NTKERNELAPI
1357 VOID
1358 NTAPI
1359 IoUpdateShareAccess(
1360 IN PFILE_OBJECT FileObject,
1361 IN OUT PSHARE_ACCESS ShareAccess);
1362
1363 NTKERNELAPI
1364 NTSTATUS
1365 NTAPI
1366 IoWMIAllocateInstanceIds(
1367 IN GUID *Guid,
1368 IN ULONG InstanceCount,
1369 OUT ULONG *FirstInstanceId);
1370
1371 NTKERNELAPI
1372 NTSTATUS
1373 NTAPI
1374 IoWMIQuerySingleInstanceMultiple(
1375 IN PVOID *DataBlockObjectList,
1376 IN PUNICODE_STRING InstanceNames,
1377 IN ULONG ObjectCount,
1378 IN OUT ULONG *InOutBufferSize,
1379 OUT PVOID OutBuffer);
1380
1381 NTKERNELAPI
1382 NTSTATUS
1383 NTAPI
1384 IoWMIRegistrationControl(
1385 IN PDEVICE_OBJECT DeviceObject,
1386 IN ULONG Action);
1387
1388 NTKERNELAPI
1389 NTSTATUS
1390 NTAPI
1391 IoWMISuggestInstanceName(
1392 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
1393 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
1394 IN BOOLEAN CombineNames,
1395 OUT PUNICODE_STRING SuggestedInstanceName);
1396
1397 NTKERNELAPI
1398 NTSTATUS
1399 NTAPI
1400 IoWMIWriteEvent(
1401 IN OUT PVOID WnodeEventItem);
1402
1403 NTKERNELAPI
1404 VOID
1405 NTAPI
1406 IoWriteErrorLogEntry(
1407 IN PVOID ElEntry);
1408
1409 NTKERNELAPI
1410 PIRP
1411 NTAPI
1412 IoGetTopLevelIrp(VOID);
1413
1414 NTKERNELAPI
1415 NTSTATUS
1416 NTAPI
1417 IoRegisterLastChanceShutdownNotification(
1418 IN PDEVICE_OBJECT DeviceObject);
1419
1420 NTKERNELAPI
1421 VOID
1422 NTAPI
1423 IoSetTopLevelIrp(
1424 IN PIRP Irp OPTIONAL);
1425
1426 $endif
1427 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1428
1429 $if (_NTDDK_)
1430 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1431
1432 NTKERNELAPI
1433 BOOLEAN
1434 NTAPI
1435 IoIsFileOriginRemote(
1436 IN PFILE_OBJECT FileObject);
1437
1438 NTKERNELAPI
1439 NTSTATUS
1440 NTAPI
1441 IoSetFileOrigin(
1442 IN PFILE_OBJECT FileObject,
1443 IN BOOLEAN Remote);
1444
1445 #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */
1446 $endif
1447
1448 #if (NTDDI_VERSION >= NTDDI_WINXP)
1449 $if (_NTDDK_)
1450 NTKERNELAPI
1451 NTSTATUS
1452 FASTCALL
1453 IoReadPartitionTable(
1454 IN PDEVICE_OBJECT DeviceObject,
1455 IN ULONG SectorSize,
1456 IN BOOLEAN ReturnRecognizedPartitions,
1457 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
1458
1459 NTKERNELAPI
1460 NTSTATUS
1461 FASTCALL
1462 IoSetPartitionInformation(
1463 IN PDEVICE_OBJECT DeviceObject,
1464 IN ULONG SectorSize,
1465 IN ULONG PartitionNumber,
1466 IN ULONG PartitionType);
1467
1468 NTKERNELAPI
1469 NTSTATUS
1470 FASTCALL
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);
1477
1478 NTKERNELAPI
1479 NTSTATUS
1480 NTAPI
1481 IoCreateDisk(
1482 IN PDEVICE_OBJECT DeviceObject,
1483 IN struct _CREATE_DISK* Disk OPTIONAL);
1484
1485 NTKERNELAPI
1486 NTSTATUS
1487 NTAPI
1488 IoReadDiskSignature(
1489 IN PDEVICE_OBJECT DeviceObject,
1490 IN ULONG BytesPerSector,
1491 OUT PDISK_SIGNATURE Signature);
1492
1493 NTKERNELAPI
1494 NTSTATUS
1495 NTAPI
1496 IoReadPartitionTableEx(
1497 IN PDEVICE_OBJECT DeviceObject,
1498 OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
1499
1500 NTKERNELAPI
1501 NTSTATUS
1502 NTAPI
1503 IoSetPartitionInformationEx(
1504 IN PDEVICE_OBJECT DeviceObject,
1505 IN ULONG PartitionNumber,
1506 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
1507
1508 NTKERNELAPI
1509 NTSTATUS
1510 NTAPI
1511 IoSetSystemPartition(
1512 IN PUNICODE_STRING VolumeNameString);
1513
1514 NTKERNELAPI
1515 NTSTATUS
1516 NTAPI
1517 IoVerifyPartitionTable(
1518 IN PDEVICE_OBJECT DeviceObject,
1519 IN BOOLEAN FixErrors);
1520
1521 NTKERNELAPI
1522 NTSTATUS
1523 NTAPI
1524 IoVolumeDeviceToDosName(
1525 IN PVOID VolumeDeviceObject,
1526 OUT PUNICODE_STRING DosName);
1527
1528 NTKERNELAPI
1529 NTSTATUS
1530 NTAPI
1531 IoWritePartitionTableEx(
1532 IN PDEVICE_OBJECT DeviceObject,
1533 IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
1534
1535 NTKERNELAPI
1536 NTSTATUS
1537 NTAPI
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,
1549 IN ULONG EaLength,
1550 IN CREATE_FILE_TYPE CreateFileType,
1551 IN PVOID InternalParameters OPTIONAL,
1552 IN ULONG Options,
1553 IN PVOID DeviceObject OPTIONAL);
1554
1555 NTKERNELAPI
1556 NTSTATUS
1557 NTAPI
1558 IoAttachDeviceToDeviceStackSafe(
1559 IN PDEVICE_OBJECT SourceDevice,
1560 IN PDEVICE_OBJECT TargetDevice,
1561 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
1562 $endif
1563
1564 $if (_WDMDDK_)
1565 NTKERNELAPI
1566 NTSTATUS
1567 NTAPI
1568 IoCsqInitialize(
1569 IN PIO_CSQ Csq,
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);
1576
1577 NTKERNELAPI
1578 VOID
1579 NTAPI
1580 IoCsqInsertIrp(
1581 IN PIO_CSQ Csq,
1582 IN PIRP Irp,
1583 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
1584
1585 NTKERNELAPI
1586 PIRP
1587 NTAPI
1588 IoCsqRemoveIrp(
1589 IN PIO_CSQ Csq,
1590 IN PIO_CSQ_IRP_CONTEXT Context);
1591
1592 NTKERNELAPI
1593 PIRP
1594 NTAPI
1595 IoCsqRemoveNextIrp(
1596 IN PIO_CSQ Csq,
1597 IN PVOID PeekContext OPTIONAL);
1598
1599 NTKERNELAPI
1600 BOOLEAN
1601 NTAPI
1602 IoForwardIrpSynchronously(
1603 IN PDEVICE_OBJECT DeviceObject,
1604 IN PIRP Irp);
1605
1606 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
1607
1608 NTKERNELAPI
1609 VOID
1610 NTAPI
1611 IoFreeErrorLogEntry(
1612 PVOID ElEntry);
1613
1614 NTKERNELAPI
1615 NTSTATUS
1616 NTAPI
1617 IoSetCompletionRoutineEx(
1618 IN PDEVICE_OBJECT DeviceObject,
1619 IN PIRP Irp,
1620 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
1621 IN PVOID Context,
1622 IN BOOLEAN InvokeOnSuccess,
1623 IN BOOLEAN InvokeOnError,
1624 IN BOOLEAN InvokeOnCancel);
1625
1626 VOID
1627 NTAPI
1628 IoSetStartIoAttributes(
1629 IN PDEVICE_OBJECT DeviceObject,
1630 IN BOOLEAN DeferredStartIo,
1631 IN BOOLEAN NonCancelable);
1632
1633 NTKERNELAPI
1634 NTSTATUS
1635 NTAPI
1636 IoWMIDeviceObjectToInstanceName(
1637 IN PVOID DataBlockObject,
1638 IN PDEVICE_OBJECT DeviceObject,
1639 OUT PUNICODE_STRING InstanceName);
1640
1641 NTKERNELAPI
1642 NTSTATUS
1643 NTAPI
1644 IoWMIExecuteMethod(
1645 IN PVOID DataBlockObject,
1646 IN PUNICODE_STRING InstanceName,
1647 IN ULONG MethodId,
1648 IN ULONG InBufferSize,
1649 IN OUT PULONG OutBufferSize,
1650 IN OUT PUCHAR InOutBuffer);
1651
1652 NTKERNELAPI
1653 NTSTATUS
1654 NTAPI
1655 IoWMIHandleToInstanceName(
1656 IN PVOID DataBlockObject,
1657 IN HANDLE FileHandle,
1658 OUT PUNICODE_STRING InstanceName);
1659
1660 NTKERNELAPI
1661 NTSTATUS
1662 NTAPI
1663 IoWMIOpenBlock(
1664 IN GUID *DataBlockGuid,
1665 IN ULONG DesiredAccess,
1666 OUT PVOID *DataBlockObject);
1667
1668 NTKERNELAPI
1669 NTSTATUS
1670 NTAPI
1671 IoWMIQueryAllData(
1672 IN PVOID DataBlockObject,
1673 IN OUT ULONG *InOutBufferSize,
1674 OUT PVOID OutBuffer);
1675
1676 NTKERNELAPI
1677 NTSTATUS
1678 NTAPI
1679 IoWMIQueryAllDataMultiple(
1680 IN PVOID *DataBlockObjectList,
1681 IN ULONG ObjectCount,
1682 IN OUT ULONG *InOutBufferSize,
1683 OUT PVOID OutBuffer);
1684
1685 NTKERNELAPI
1686 NTSTATUS
1687 NTAPI
1688 IoWMIQuerySingleInstance(
1689 IN PVOID DataBlockObject,
1690 IN PUNICODE_STRING InstanceName,
1691 IN OUT ULONG *InOutBufferSize,
1692 OUT PVOID OutBuffer);
1693
1694 NTKERNELAPI
1695 NTSTATUS
1696 NTAPI
1697 IoWMISetNotificationCallback(
1698 IN OUT PVOID Object,
1699 IN WMI_NOTIFICATION_CALLBACK Callback,
1700 IN PVOID Context OPTIONAL);
1701
1702 NTKERNELAPI
1703 NTSTATUS
1704 NTAPI
1705 IoWMISetSingleInstance(
1706 IN PVOID DataBlockObject,
1707 IN PUNICODE_STRING InstanceName,
1708 IN ULONG Version,
1709 IN ULONG ValueBufferSize,
1710 IN PVOID ValueBuffer);
1711
1712 NTKERNELAPI
1713 NTSTATUS
1714 NTAPI
1715 IoWMISetSingleItem(
1716 IN PVOID DataBlockObject,
1717 IN PUNICODE_STRING InstanceName,
1718 IN ULONG DataItemId,
1719 IN ULONG Version,
1720 IN ULONG ValueBufferSize,
1721 IN PVOID ValueBuffer);
1722 $endif
1723 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1724
1725 $if (_WDMDDK_)
1726 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
1727 NTKERNELAPI
1728 NTSTATUS
1729 NTAPI
1730 IoValidateDeviceIoControlAccess(
1731 IN PIRP Irp,
1732 IN ULONG RequiredAccess);
1733 #endif
1734 $endif
1735
1736 #if (NTDDI_VERSION >= NTDDI_WS03)
1737 $if (_NTDDK_)
1738 NTKERNELAPI
1739 IO_PAGING_PRIORITY
1740 FASTCALL
1741 IoGetPagingIoPriority(
1742 IN PIRP Irp);
1743 $endif
1744
1745 $if (_WDMDDK_)
1746 NTKERNELAPI
1747 NTSTATUS
1748 NTAPI
1749 IoCsqInitializeEx(
1750 IN PIO_CSQ Csq,
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);
1757
1758 NTKERNELAPI
1759 NTSTATUS
1760 NTAPI
1761 IoCsqInsertIrpEx(
1762 IN PIO_CSQ Csq,
1763 IN PIRP Irp,
1764 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL,
1765 IN PVOID InsertContext OPTIONAL);
1766 $endif
1767 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
1768
1769 $if (_NTDDK_)
1770 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1771 BOOLEAN
1772 NTAPI
1773 IoTranslateBusAddress(
1774 IN INTERFACE_TYPE InterfaceType,
1775 IN ULONG BusNumber,
1776 IN PHYSICAL_ADDRESS BusAddress,
1777 IN OUT PULONG AddressSpace,
1778 OUT PPHYSICAL_ADDRESS TranslatedAddress);
1779 #endif
1780 $endif
1781
1782 #if (NTDDI_VERSION >= NTDDI_VISTA)
1783 $if (_NTDDK_)
1784 NTKERNELAPI
1785 NTSTATUS
1786 NTAPI
1787 IoUpdateDiskGeometry(
1788 IN PDEVICE_OBJECT DeviceObject,
1789 IN struct _DISK_GEOMETRY_EX* OldDiskGeometry,
1790 IN struct _DISK_GEOMETRY_EX* NewDiskGeometry);
1791
1792 PTXN_PARAMETER_BLOCK
1793 NTAPI
1794 IoGetTransactionParameterBlock(
1795 IN PFILE_OBJECT FileObject);
1796
1797 NTKERNELAPI
1798 NTSTATUS
1799 NTAPI
1800 IoCreateFileEx(
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,
1811 IN ULONG EaLength,
1812 IN CREATE_FILE_TYPE CreateFileType,
1813 IN PVOID InternalParameters OPTIONAL,
1814 IN ULONG Options,
1815 IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL);
1816
1817 NTSTATUS
1818 NTAPI
1819 IoSetIrpExtraCreateParameter(
1820 IN OUT PIRP Irp,
1821 IN struct _ECP_LIST *ExtraCreateParameter);
1822
1823 VOID
1824 NTAPI
1825 IoClearIrpExtraCreateParameter(
1826 IN OUT PIRP Irp);
1827
1828 NTSTATUS
1829 NTAPI
1830 IoGetIrpExtraCreateParameter(
1831 IN PIRP Irp,
1832 OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL);
1833
1834 BOOLEAN
1835 NTAPI
1836 IoIsFileObjectIgnoringSharing(
1837 IN PFILE_OBJECT FileObject);
1838 $endif
1839
1840 $if (_WDMDDK_)
1841 NTKERNELAPI
1842 NTSTATUS
1843 NTAPI
1844 IoGetBootDiskInformationLite(
1845 OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
1846
1847 NTKERNELAPI
1848 NTSTATUS
1849 NTAPI
1850 IoCheckShareAccessEx(
1851 IN ACCESS_MASK DesiredAccess,
1852 IN ULONG DesiredShareAccess,
1853 IN OUT PFILE_OBJECT FileObject,
1854 IN OUT PSHARE_ACCESS ShareAccess,
1855 IN BOOLEAN Update,
1856 IN PBOOLEAN WritePermission);
1857
1858 NTKERNELAPI
1859 NTSTATUS
1860 NTAPI
1861 IoConnectInterruptEx(
1862 IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
1863
1864 NTKERNELAPI
1865 VOID
1866 NTAPI
1867 IoDisconnectInterruptEx(
1868 IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
1869
1870 LOGICAL
1871 NTAPI
1872 IoWithinStackLimits(
1873 IN ULONG_PTR RegionStart,
1874 IN SIZE_T RegionSize);
1875
1876 NTKERNELAPI
1877 VOID
1878 NTAPI
1879 IoSetShareAccessEx(
1880 IN ACCESS_MASK DesiredAccess,
1881 IN ULONG DesiredShareAccess,
1882 IN OUT PFILE_OBJECT FileObject,
1883 OUT PSHARE_ACCESS ShareAccess,
1884 IN PBOOLEAN WritePermission);
1885
1886 ULONG
1887 NTAPI
1888 IoSizeofWorkItem(VOID);
1889
1890 VOID
1891 NTAPI
1892 IoInitializeWorkItem(
1893 IN PVOID IoObject,
1894 IN PIO_WORKITEM IoWorkItem);
1895
1896 VOID
1897 NTAPI
1898 IoUninitializeWorkItem(
1899 IN PIO_WORKITEM IoWorkItem);
1900
1901 VOID
1902 NTAPI
1903 IoQueueWorkItemEx(
1904 IN PIO_WORKITEM IoWorkItem,
1905 IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
1906 IN WORK_QUEUE_TYPE QueueType,
1907 IN PVOID Context OPTIONAL);
1908
1909 IO_PRIORITY_HINT
1910 NTAPI
1911 IoGetIoPriorityHint(
1912 IN PIRP Irp);
1913
1914 NTSTATUS
1915 NTAPI
1916 IoSetIoPriorityHint(
1917 IN PIRP Irp,
1918 IN IO_PRIORITY_HINT PriorityHint);
1919
1920 NTSTATUS
1921 NTAPI
1922 IoAllocateSfioStreamIdentifier(
1923 IN PFILE_OBJECT FileObject,
1924 IN ULONG Length,
1925 IN PVOID Signature,
1926 OUT PVOID *StreamIdentifier);
1927
1928 PVOID
1929 NTAPI
1930 IoGetSfioStreamIdentifier(
1931 IN PFILE_OBJECT FileObject,
1932 IN PVOID Signature);
1933
1934 NTSTATUS
1935 NTAPI
1936 IoFreeSfioStreamIdentifier(
1937 IN PFILE_OBJECT FileObject,
1938 IN PVOID Signature);
1939
1940 NTKERNELAPI
1941 NTSTATUS
1942 NTAPI
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);
1948
1949 NTKERNELAPI
1950 NTSTATUS
1951 NTAPI
1952 IoSetDevicePropertyData(
1953 IN PDEVICE_OBJECT Pdo,
1954 IN CONST DEVPROPKEY *PropertyKey,
1955 IN LCID Lcid,
1956 IN ULONG Flags,
1957 IN DEVPROPTYPE Type,
1958 IN ULONG Size,
1959 IN PVOID Data OPTIONAL);
1960
1961 NTKERNELAPI
1962 NTSTATUS
1963 NTAPI
1964 IoGetDevicePropertyData(
1965 PDEVICE_OBJECT Pdo,
1966 CONST DEVPROPKEY *PropertyKey,
1967 LCID Lcid,
1968 ULONG Flags,
1969 ULONG Size,
1970 PVOID Data,
1971 PULONG RequiredSize,
1972 PDEVPROPTYPE Type);
1973 $endif
1974
1975 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1976
1977 $if (_WDMDDK_)
1978 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
1979
1980 #if (NTDDI_VERSION >= NTDDI_WS08)
1981 NTKERNELAPI
1982 NTSTATUS
1983 NTAPI
1984 IoReplacePartitionUnit(
1985 IN PDEVICE_OBJECT TargetPdo,
1986 IN PDEVICE_OBJECT SparePdo,
1987 IN ULONG Flags);
1988 #endif
1989 $endif
1990
1991 #if (NTDDI_VERSION >= NTDDI_WIN7)
1992 $if (_NTDDK_)
1993 NTSTATUS
1994 NTAPI
1995 IoSetFileObjectIgnoreSharing(
1996 IN PFILE_OBJECT FileObject);
1997 $endif
1998
1999 $if (_WDMDDK_)
2000 NTKERNELAPI
2001 NTSTATUS
2002 NTAPI
2003 IoGetAffinityInterrupt(
2004 IN PKINTERRUPT InterruptObject,
2005 OUT PGROUP_AFFINITY GroupAffinity);
2006
2007 NTSTATUS
2008 NTAPI
2009 IoGetContainerInformation(
2010 IN IO_CONTAINER_INFORMATION_CLASS InformationClass,
2011 IN PVOID ContainerObject OPTIONAL,
2012 IN OUT PVOID Buffer OPTIONAL,
2013 IN ULONG BufferLength);
2014
2015 NTSTATUS
2016 NTAPI
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);
2023
2024 VOID
2025 NTAPI
2026 IoUnregisterContainerNotification(
2027 IN PVOID CallbackRegistration);
2028
2029 NTKERNELAPI
2030 NTSTATUS
2031 NTAPI
2032 IoUnregisterPlugPlayNotificationEx(
2033 IN PVOID NotificationEntry);
2034
2035 NTKERNELAPI
2036 NTSTATUS
2037 NTAPI
2038 IoGetDeviceNumaNode(
2039 IN PDEVICE_OBJECT Pdo,
2040 OUT PUSHORT NodeNumber);
2041 $endif
2042
2043 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2044
2045 $if (_WDMDDK_)
2046 #if defined(_WIN64)
2047 NTKERNELAPI
2048 ULONG
2049 NTAPI
2050 IoWMIDeviceObjectToProviderId(
2051 IN PDEVICE_OBJECT DeviceObject);
2052 #else
2053 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
2054 #endif
2055
2056 /*
2057 * USHORT
2058 * IoSizeOfIrp(
2059 * IN CCHAR StackSize)
2060 */
2061 #define IoSizeOfIrp(_StackSize) \
2062 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
2063
2064 FORCEINLINE
2065 VOID
2066 IoSkipCurrentIrpStackLocation(
2067 IN OUT PIRP Irp)
2068 {
2069 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
2070 Irp->CurrentLocation++;
2071 Irp->Tail.Overlay.CurrentStackLocation++;
2072 }
2073
2074 FORCEINLINE
2075 VOID
2076 IoSetNextIrpStackLocation(
2077 IN OUT PIRP Irp)
2078 {
2079 ASSERT(Irp->CurrentLocation > 0);
2080 Irp->CurrentLocation--;
2081 Irp->Tail.Overlay.CurrentStackLocation--;
2082 }
2083
2084 FORCEINLINE
2085 PIO_STACK_LOCATION
2086 IoGetNextIrpStackLocation(
2087 IN PIRP Irp)
2088 {
2089 ASSERT(Irp->CurrentLocation > 0);
2090 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
2091 }
2092
2093 FORCEINLINE
2094 VOID
2095 IoSetCompletionRoutine(
2096 IN PIRP Irp,
2097 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
2098 IN PVOID Context OPTIONAL,
2099 IN BOOLEAN InvokeOnSuccess,
2100 IN BOOLEAN InvokeOnError,
2101 IN BOOLEAN InvokeOnCancel)
2102 {
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;
2108 irpSp->Control = 0;
2109
2110 if (InvokeOnSuccess) {
2111 irpSp->Control = SL_INVOKE_ON_SUCCESS;
2112 }
2113
2114 if (InvokeOnError) {
2115 irpSp->Control |= SL_INVOKE_ON_ERROR;
2116 }
2117
2118 if (InvokeOnCancel) {
2119 irpSp->Control |= SL_INVOKE_ON_CANCEL;
2120 }
2121 }
2122
2123 /*
2124 * PDRIVER_CANCEL
2125 * IoSetCancelRoutine(
2126 * IN PIRP Irp,
2127 * IN PDRIVER_CANCEL CancelRoutine)
2128 */
2129 #define IoSetCancelRoutine(_Irp, \
2130 _CancelRoutine) \
2131 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
2132 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
2133
2134 /*
2135 * VOID
2136 * IoRequestDpc(
2137 * IN PDEVICE_OBJECT DeviceObject,
2138 * IN PIRP Irp,
2139 * IN PVOID Context);
2140 */
2141 #define IoRequestDpc(DeviceObject, Irp, Context)( \
2142 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
2143
2144 /*
2145 * VOID
2146 * IoReleaseRemoveLock(
2147 * IN PIO_REMOVE_LOCK RemoveLock,
2148 * IN PVOID Tag)
2149 */
2150 #define IoReleaseRemoveLock(_RemoveLock, \
2151 _Tag) \
2152 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
2153
2154 /*
2155 * VOID
2156 * IoReleaseRemoveLockAndWait(
2157 * IN PIO_REMOVE_LOCK RemoveLock,
2158 * IN PVOID Tag)
2159 */
2160 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
2161 _Tag) \
2162 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
2163
2164 #if defined(_WIN64)
2165 NTKERNELAPI
2166 BOOLEAN
2167 IoIs32bitProcess(
2168 IN PIRP Irp OPTIONAL);
2169 #endif
2170
2171 #define PLUGPLAY_REGKEY_DEVICE 1
2172 #define PLUGPLAY_REGKEY_DRIVER 2
2173 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
2174
2175 FORCEINLINE
2176 PIO_STACK_LOCATION
2177 IoGetCurrentIrpStackLocation(
2178 IN PIRP Irp)
2179 {
2180 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
2181 return Irp->Tail.Overlay.CurrentStackLocation;
2182 }
2183
2184 FORCEINLINE
2185 VOID
2186 IoMarkIrpPending(
2187 IN OUT PIRP Irp)
2188 {
2189 IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
2190 }
2191
2192 /*
2193 * BOOLEAN
2194 * IoIsErrorUserInduced(
2195 * IN NTSTATUS Status);
2196 */
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)))
2205
2206 /* VOID
2207 * IoInitializeRemoveLock(
2208 * IN PIO_REMOVE_LOCK Lock,
2209 * IN ULONG AllocateTag,
2210 * IN ULONG MaxLockedMinutes,
2211 * IN ULONG HighWatermark)
2212 */
2213 #define IoInitializeRemoveLock( \
2214 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
2215 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
2216 HighWatermark, sizeof(IO_REMOVE_LOCK))
2217
2218 VOID
2219 FORCEINLINE
2220 IoInitializeDpcRequest(
2221 IN PDEVICE_OBJECT DeviceObject,
2222 IN PIO_DPC_ROUTINE DpcRoutine)
2223 {
2224 KeInitializeDpc( &DeviceObject->Dpc,
2225 (PKDEFERRED_ROUTINE) DpcRoutine,
2226 DeviceObject );
2227 }
2228
2229 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
2230
2231 /*
2232 * ULONG
2233 * IoGetFunctionCodeFromCtlCode(
2234 * IN ULONG ControlCode)
2235 */
2236 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
2237 (((_ControlCode) >> 2) & 0x00000FFF)
2238
2239 FORCEINLINE
2240 VOID
2241 IoCopyCurrentIrpStackLocationToNext(
2242 IN OUT PIRP Irp)
2243 {
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;
2250 }
2251
2252 NTKERNELAPI
2253 VOID
2254 NTAPI
2255 IoGetStackLimits(
2256 OUT PULONG_PTR LowLimit,
2257 OUT PULONG_PTR HighLimit);
2258
2259 FORCEINLINE
2260 ULONG_PTR
2261 IoGetRemainingStackSize(VOID)
2262 {
2263 ULONG_PTR End, Begin;
2264 ULONG_PTR Result;
2265
2266 IoGetStackLimits(&Begin, &End);
2267 Result = (ULONG_PTR)(&End) - Begin;
2268 return Result;
2269 }
2270
2271 #if (NTDDI_VERSION >= NTDDI_WS03)
2272 VOID
2273 FORCEINLINE
2274 IoInitializeThreadedDpcRequest(
2275 IN PDEVICE_OBJECT DeviceObject,
2276 IN PIO_DPC_ROUTINE DpcRoutine)
2277 {
2278 KeInitializeThreadedDpc(&DeviceObject->Dpc,
2279 (PKDEFERRED_ROUTINE) DpcRoutine,
2280 DeviceObject );
2281 }
2282 #endif
2283 $endif
2284