ReactOS 0.4.16-dev-250-g3ecd236
worker-thread.c File Reference
#include "btrfs_drv.h"
Include dependency graph for worker-thread.c:

Go to the source code of this file.

Classes

struct  job_info
 

Functions

NTSTATUS do_read_job (PIRP Irp)
 
NTSTATUS do_write_job (device_extension *Vcb, PIRP Irp)
 
 _Function_class_ (WORKER_THREAD_ROUTINE)
 
bool add_thread_job (device_extension *Vcb, PIRP Irp)
 

Function Documentation

◆ _Function_class_()

_Function_class_ ( WORKER_THREAD_ROUTINE  )

Definition at line 95 of file worker-thread.c.

96 {
97 job_info* ji = context;
99
101 do_read_job(ji->Irp);
102 } else if (IrpSp->MajorFunction == IRP_MJ_WRITE) {
103 do_write_job(ji->Vcb, ji->Irp);
104 }
105
106 ExFreePool(ji);
107}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define NULL
Definition: types.h:112
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define IRP_MJ_READ
Definition: rdpdr.c:46
#define IRP_MJ_WRITE
Definition: rdpdr.c:47
Definition: http.c:7252
device_extension * Vcb
Definition: worker-thread.c:21
NTSTATUS do_write_job(device_extension *Vcb, PIRP Irp)
Definition: worker-thread.c:68
NTSTATUS do_read_job(PIRP Irp)
Definition: worker-thread.c:26

◆ add_thread_job()

bool add_thread_job ( device_extension Vcb,
PIRP  Irp 
)

Definition at line 109 of file worker-thread.c.

109 {
110 job_info* ji;
111
113 if (!ji) {
114 ERR("out of memory\n");
115 return false;
116 }
117
118 ji->Vcb = Vcb;
119 ji->Irp = Irp;
120
121 if (!Irp->MdlAddress) {
122 PMDL Mdl;
124 ULONG len;
126
129 len = IrpSp->Parameters.Read.Length;
130 } else if (IrpSp->MajorFunction == IRP_MJ_WRITE) {
132 len = IrpSp->Parameters.Write.Length;
133 } else {
134 ERR("unexpected major function %u\n", IrpSp->MajorFunction);
135 ExFreePool(ji);
136 return false;
137 }
138
139 Mdl = IoAllocateMdl(Irp->UserBuffer, len, false, false, Irp);
140
141 if (!Mdl) {
142 ERR("out of memory\n");
143 ExFreePool(ji);
144 return false;
145 }
146
147 _SEH2_TRY {
148 MmProbeAndLockPages(Mdl, Irp->RequestorMode, op);
150 ERR("MmProbeAndLockPages raised status %08lx\n", _SEH2_GetExceptionCode());
151
152 IoFreeMdl(Mdl);
153 Irp->MdlAddress = NULL;
154 ExFreePool(ji);
155
156 _SEH2_YIELD(return FALSE);
157 } _SEH2_END;
158 }
159
160 ExInitializeWorkItem(&ji->item, do_job, ji);
162
163 return true;
164}
#define ERR(fmt,...)
Definition: precomp.h:57
#define ALLOC_TAG
Definition: btrfs_drv.h:87
_In_ PIRP Irp
Definition: csq.h:116
#define FALSE
Definition: types.h:117
UINT op
Definition: effect.c:236
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define NonPagedPool
Definition: env_spec_w32.h:307
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
#define IoFreeMdl
Definition: fxmdl.h:89
#define IoAllocateMdl
Definition: fxmdl.h:88
GLenum GLsizei len
Definition: glext.h:6722
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:931
#define Vcb
Definition: cdprocs.h:1415
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:168
union _IO_STACK_LOCATION::@1579 Parameters
struct _IO_STACK_LOCATION::@3978::@3983 Write
struct _IO_STACK_LOCATION::@3978::@3982 Read
WORK_QUEUE_ITEM item
Definition: worker-thread.c:23
uint32_t ULONG
Definition: typedefs.h:59
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
Definition: work.c:723
#define ExInitializeWorkItem(Item, Routine, Context)
Definition: exfuncs.h:265
@ DelayedWorkQueue
Definition: extypes.h:190
enum _LOCK_OPERATION LOCK_OPERATION
@ IoReadAccess
Definition: ketypes.h:863
@ IoWriteAccess
Definition: ketypes.h:864

Referenced by _Dispatch_type_().

◆ do_read_job()

NTSTATUS do_read_job ( PIRP  Irp)

Definition at line 26 of file worker-thread.c.

26 {
28 ULONG bytes_read;
29 bool top_level = is_top_level(Irp);
32 fcb* fcb = FileObject->FsContext;
33 bool acquired_fcb_lock = false;
34
35 Irp->IoStatus.Information = 0;
36
38 ExAcquireResourceSharedLite(fcb->Header.Resource, true);
39 acquired_fcb_lock = true;
40 }
41
42 _SEH2_TRY {
43 Status = do_read(Irp, true, &bytes_read);
46 } _SEH2_END;
47
48 if (acquired_fcb_lock)
50
51 if (!NT_SUCCESS(Status))
52 ERR("do_read returned %08lx\n", Status);
53
54 Irp->IoStatus.Status = Status;
55
56 TRACE("read %Iu bytes\n", Irp->IoStatus.Information);
57
59
60 if (top_level)
62
63 TRACE("returning %08lx\n", Status);
64
65 return Status;
66}
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTSTATUS NTSTATUS do_read(PIRP Irp, bool wait, ULONG *bytes_read)
Definition: read.c:3328
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
bool is_top_level(_In_ PIRP Irp)
Definition: btrfs.c:278
#define ExAcquireResourceSharedLite(res, wait)
Definition: env_spec_w32.h:621
Status
Definition: gdiplustypes.h:25
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1822
ULONG NTAPI ExIsResourceAcquiredSharedLite(IN PERESOURCE Resource)
Definition: resource.c:1663
#define IoCompleteRequest
Definition: irp.c:1240
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
Definition: irp.c:2000
#define TRACE(s)
Definition: solgame.cpp:4
PFILE_OBJECT FileObject
Definition: iotypes.h:3169
FSRTL_ADVANCED_FCB_HEADER Header
Definition: btrfs_drv.h:283
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
#define IO_NO_INCREMENT
Definition: iotypes.h:598
* PFILE_OBJECT
Definition: iotypes.h:1998

Referenced by _Dispatch_type_(), and _Function_class_().

◆ do_write_job()

NTSTATUS do_write_job ( device_extension Vcb,
PIRP  Irp 
)

Definition at line 68 of file worker-thread.c.

68 {
69 bool top_level = is_top_level(Irp);
71
72 _SEH2_TRY {
73 Status = write_file(Vcb, Irp, true, true);
76 } _SEH2_END;
77
78 if (!NT_SUCCESS(Status))
79 ERR("write_file returned %08lx\n", Status);
80
81 Irp->IoStatus.Status = Status;
82
83 TRACE("wrote %Iu bytes\n", Irp->IoStatus.Information);
84
86
87 if (top_level)
89
90 TRACE("returning %08lx\n", Status);
91
92 return Status;
93}
static void write_file(HANDLE hFile, const WCHAR *str)
Definition: export.c:22

Referenced by _Dispatch_type_(), and _Function_class_().