ReactOS 0.4.17-dev-1190-g4c812f4
io.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel - Vista+ APIs
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Io functions of Vista+
5 * COPYRIGHT: 2016 Pierre Schweitzer (pierre@reactos.org)
6 * 2020 Victor Perevertkin (victor.perevertkin@reactos.org)
7 */
8
9#include <ntdef.h>
10#include <ntifs.h>
11
13{
18
19#define TAG_IOWI 'IWOI'
20
25 OUT PECP_LIST *ExtraCreateParameter)
26{
27 /* Check we have a create operation */
29 {
31 }
32
33 /* If so, return user buffer */
34 *ExtraCreateParameter = Irp->UserBuffer;
35 return STATUS_SUCCESS;
36}
37
38_Function_class_(IO_WORKITEM_ROUTINE)
39static
40VOID
42IopWorkItemExCallback(
44 PVOID Ctx)
45{
47
48 context->WorkItemRoutineEx(DeviceObject, context->Context, context->WorkItem);
50}
51
53VOID
60{
62 newContext->WorkItem = IoWorkItem;
63 newContext->WorkItemRoutineEx = WorkerRoutine;
64 newContext->Context = Context;
65
66 IoQueueWorkItem(IoWorkItem, IopWorkItemExCallback, QueueType, newContext);
67}
68
69typedef
79
80typedef
91
92/* Forward to the kernel export when present, it only exists on NT 6.2+ */
98IoSetDeviceInterfacePropertyData(
101 _In_ LCID Lcid,
106{
107 static PSET_INTERFACE_PROPERTY_ROUTINE SetRoutine;
108 UNICODE_STRING RoutineName;
109
110 if (!SetRoutine)
111 {
112 RtlInitUnicodeString(&RoutineName, L"IoSetDeviceInterfacePropertyData");
114 if (!SetRoutine)
116 }
117
118 return SetRoutine(SymbolicLinkName, PropertyKey, Lcid, Flags, Type, Size, Data);
119}
120
125NTAPI
126IoGetDeviceInterfacePropertyData(
129 _In_ LCID Lcid,
135{
136 static PGET_INTERFACE_PROPERTY_ROUTINE GetRoutine;
137 UNICODE_STRING RoutineName;
138
139 if (!GetRoutine)
140 {
141 RtlInitUnicodeString(&RoutineName, L"IoGetDeviceInterfacePropertyData");
143 if (!GetRoutine)
145 }
146
148}
149
152NTAPI
154 _In_ PIRP Irp)
155{
156 return IoPriorityNormal;
157}
158
160VOID
161NTAPI
163 _Inout_ PIRP MasterIrp,
165{
166 NTSTATUS MasterStatus = MasterIrp->IoStatus.Status;
167
169 {
170 return;
171 }
172
174 (MasterStatus == STATUS_SUCCESS && !NT_SUCCESS(Status)) ||
175 (!NT_SUCCESS(MasterStatus) && !NT_SUCCESS(Status) && Status > MasterStatus))
176 {
177 MasterIrp->IoStatus.Status = Status;
178 }
179}
Type
Definition: Type.h:7
LONG NTSTATUS
Definition: precomp.h:26
#define __drv_aliasesMem
Definition: btrfs_drv.h:203
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
ULONG DEVPROPTYPE
Definition: devpropdef.h:24
ULONG * PDEVPROPTYPE
Definition: devpropdef.h:24
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define NTSTATUS
Definition: precomp.h:19
#define L(x)
Definition: resources.c:13
#define _IRQL_requires_max_(irql)
Definition: driverspecs.h:230
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define BooleanFlagOn(F, SF)
Definition: ext2fs.h:183
_Must_inspect_result_ _In_ PFLT_CALLBACK_DATA _In_ PFLT_DEFERRED_IO_WORKITEM_ROUTINE _In_ WORK_QUEUE_TYPE QueueType
Definition: fltkernel.h:1978
_Must_inspect_result_ _In_ PFLT_CALLBACK_DATA _In_ PFLT_DEFERRED_IO_WORKITEM_ROUTINE WorkerRoutine
Definition: fltkernel.h:1977
Status
Definition: gdiplustypes.h:24
_In_ PUNICODE_STRING SymbolicLinkName
Definition: hubucx.h:491
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
_In_ PIRP Irp
Definition: kse.h:79
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
_Out_ PLCID Lcid
Definition: rtlfuncs.h:5258
#define _Inout_
Definition: no_sal2.h:162
#define _Must_inspect_result_
Definition: no_sal2.h:62
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define _Out_writes_bytes_to_opt_(s, c)
Definition: no_sal2.h:240
#define _Function_class_(n)
Definition: no_sal2.h:398
#define _Reserved_
Definition: no_sal2.h:504
#define _In_reads_bytes_opt_(s)
Definition: no_sal2.h:224
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define STATUS_FT_READ_FROM_COPY
Definition: ntstatus.h:242
#define CONST
Definition: pedump.c:81
DWORD LCID
Definition: nls.h:13
struct _EX_WORKITEM_CONTEXT EX_WORKITEM_CONTEXT
#define TAG_IOWI
Definition: io.c:19
NTKRNLVISTAAPI IO_PRIORITY_HINT NTAPI IoGetIoPriorityHint(_In_ PIRP Irp)
Definition: io.c:153
NTKRNLVISTAAPI NTSTATUS NTAPI IoGetIrpExtraCreateParameter(IN PIRP Irp, OUT PECP_LIST *ExtraCreateParameter)
Definition: io.c:24
NTKRNLVISTAAPI VOID NTAPI IoSetMasterIrpStatus(_Inout_ PIRP MasterIrp, _In_ NTSTATUS Status)
Definition: io.c:162
NTSTATUS(NTAPI * PSET_INTERFACE_PROPERTY_ROUTINE)(_In_ PUNICODE_STRING SymbolicLinkName, _In_ CONST DEVPROPKEY *PropertyKey, _In_ LCID Lcid, _In_ ULONG Flags, _In_ DEVPROPTYPE Type, _In_ ULONG Size, _In_reads_bytes_opt_(Size) PVOID Data)
Definition: io.c:71
NTSTATUS(NTAPI * PGET_INTERFACE_PROPERTY_ROUTINE)(_In_ PUNICODE_STRING SymbolicLinkName, _In_ CONST DEVPROPKEY *PropertyKey, _In_ LCID Lcid, _Reserved_ ULONG Flags, _In_ ULONG Size, _Out_writes_bytes_to_opt_(Size, *RequiredSize) PVOID Data, _Out_ PULONG RequiredSize, _Out_ PDEVPROPTYPE Type)
Definition: io.c:82
struct _EX_WORKITEM_CONTEXT * PEX_WORKITEM_CONTEXT
NTKRNLVISTAAPI VOID NTAPI IoQueueWorkItemEx(_Inout_ PIO_WORKITEM IoWorkItem, _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine, _In_ WORK_QUEUE_TYPE QueueType, _In_opt_ __drv_aliasesMem PVOID Context)
Definition: io.c:55
_In_ PSP_DEVINFO_DATA _In_ const DEVPROPKEY * PropertyKey
Definition: setupapi.h:1667
#define STATUS_SUCCESS
Definition: shellext.h:65
PVOID Context
Definition: io.c:16
PIO_WORKITEM WorkItem
Definition: io.c:14
PIO_WORKITEM_ROUTINE_EX WorkItemRoutineEx
Definition: io.c:15
Definition: http.c:7783
PVOID NTAPI MmGetSystemRoutineAddress(IN PUNICODE_STRING SystemRoutineName)
Definition: sysldr.c:3672
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_VERIFY_REQUIRED
Definition: udferr_usr.h:130
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ ULONG _Out_ PVOID _Out_ PULONG RequiredSize
Definition: wdfdevice.h:4445
#define NTKRNLVISTAAPI
_Enum_is_bitflag_ enum _WORK_QUEUE_TYPE WORK_QUEUE_TYPE
_In_opt_ PVOID _In_ PIO_WORKITEM IoWorkItem
Definition: iotypes.h:521
@ IoPriorityNormal
Definition: iotypes.h:1233
#define IRP_CREATE_OPERATION
IO_WORKITEM_ROUTINE_EX * PIO_WORKITEM_ROUTINE_EX
Definition: iotypes.h:522
enum _IO_PRIORITY_HINT IO_PRIORITY_HINT
@ NonPagedPoolMustSucceed
Definition: ketypes.h:948