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

Function Ext2ReadInode

Ext4Fsd/read.c:310–468  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

308}
309
310NTSTATUS
311Ext2ReadInode (
312 IN PEXT2_IRP_CONTEXT IrpContext,
313 IN PEXT2_VCB Vcb,
314 IN PEXT2_MCB Mcb,
315 IN ULONGLONG Offset,
316 IN PVOID Buffer,
317 IN ULONG Size,
318 IN BOOLEAN bDirectIo,
319 OUT PULONG BytesRead
320)
321{
322 PEXT2_EXTENT Chain = NULL;
323 PEXT2_EXTENT Extent = NULL, Prev = NULL;
324
325 IO_STATUS_BLOCK IoStatus;
326 NTSTATUS Status = STATUS_UNSUCCESSFUL;
327 ULONG RealSize ;
328
329 if (BytesRead) {
330 *BytesRead = 0;
331 }
332
333 __try {
334
335 Ext2ReferMcb(Mcb);
336
337 ASSERT((Mcb->Identifier.Type == EXT2MCB) &&
338 (Mcb->Identifier.Size == sizeof(EXT2_MCB)));
339
340 if ((Mcb->Identifier.Type != EXT2MCB) ||
341 (Mcb->Identifier.Size != sizeof(EXT2_MCB))) {
342 __leave;
343 }
344
345 if (Buffer == NULL && IrpContext != NULL)
346 Buffer = Ext2GetUserBuffer(IrpContext->Irp);
347
348
349 /* handle fast symlinks */
350 if (S_ISLNK(Mcb->Inode.i_mode) && 0 == Mcb->Inode.i_blocks) {
351
352 PUCHAR Data = (PUCHAR) (&Mcb->Inode.i_block[0]);
353 if (!Buffer) {
354 Status = STATUS_INSUFFICIENT_RESOURCES;
355 __leave;
356 }
357
358 if (Offset < EXT2_LINKLEN_IN_INODE) {
359 if ((ULONG)Offset + Size >= EXT2_LINKLEN_IN_INODE)
360 Size = EXT2_LINKLEN_IN_INODE - (ULONG)Offset - 1;
361 RtlCopyMemory(Buffer, Data + (ULONG)Offset, Size);
362 Status = STATUS_SUCCESS;
363 } else {
364 Status = STATUS_END_OF_FILE;
365 }
366 __leave;
367 }

Callers 4

Ext2QueryDirectoryFunction · 0.85
Ext2ReadSymlinkFunction · 0.85
Ext2ReadFileFunction · 0.85
Ext2SetParentEntryFunction · 0.85

Calls 4

Ext2GetUserBufferFunction · 0.85
Ext2BuildExtentsFunction · 0.85
Ext2ReadWriteBlocksFunction · 0.85
Ext2DestroyExtentChainFunction · 0.85

Tested by

no test coverage detected