MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2ReadWriteBlocks

Function Ext2ReadWriteBlocks

Ext4Fsd/block.c:239–457  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

237}
238
239NTSTATUS
240Ext2ReadWriteBlocks(
241 IN PEXT2_IRP_CONTEXT IrpContext,
242 IN PEXT2_VCB Vcb,
243 IN PEXT2_EXTENT Chain,
244 IN ULONG Length
245 )
246{
247 PIRP Irp;
248 PIRP MasterIrp = IrpContext->Irp;
249 PIO_STACK_LOCATION IrpSp;
250 PMDL Mdl;
251 PEXT2_RW_CONTEXT pContext = NULL;
252 PEXT2_EXTENT Extent;
253 KEVENT Wait;
254 NTSTATUS Status = STATUS_SUCCESS;
255 BOOLEAN bMasterCompleted = FALSE;
256 BOOLEAN bBugCheck = FALSE;
257
258 ASSERT(MasterIrp);
259
260 __try {
261
262 pContext = Ext2AllocatePool(NonPagedPool, sizeof(EXT2_RW_CONTEXT), EXT2_RWC_MAGIC);
263
264 if (!pContext) {
265 DEBUG(DL_ERR, ( "Ex2ReadWriteBlocks: failed to allocate pContext.\n"));
266 Status = STATUS_INSUFFICIENT_RESOURCES;
267 __leave;
268 }
269
270 INC_MEM_COUNT(PS_RW_CONTEXT, pContext, sizeof(EXT2_RW_CONTEXT));
271 RtlZeroMemory(pContext, sizeof(EXT2_RW_CONTEXT));
272 pContext->Wait = Ext2CanIWait();
273 pContext->MasterIrp = MasterIrp;
274 pContext->Length = Length;
275
276 if (IrpContext->MajorFunction == IRP_MJ_WRITE) {
277 SetFlag(pContext->Flags, EXT2_RW_CONTEXT_WRITE);
278 }
279
280 if (pContext->Wait) {
281
282 KeInitializeEvent(&(pContext->Event), NotificationEvent, FALSE);
283
284 } else if (IrpContext->Fcb->Identifier.Type == EXT2FCB) {
285
286 if (IsFlagOn(MasterIrp->Flags, IRP_PAGING_IO)) {
287 pContext->Resource = &IrpContext->Fcb->PagingIoResource;
288 } else {
289 pContext->Resource = &IrpContext->Fcb->MainResource;
290 }
291
292 pContext->FileObject = IrpContext->FileObject;
293 pContext->ThreadId = ExGetCurrentResourceThread();
294 }
295
296

Callers 4

Ext2WriteVolumeFunction · 0.85
Ext2WriteInodeFunction · 0.85
Ext2ReadVolumeFunction · 0.85
Ext2ReadInodeFunction · 0.85

Calls 2

Ext2AllocatePoolFunction · 0.85
Ext2FreePoolFunction · 0.85

Tested by

no test coverage detected