bool ext2_read_block(PEXT2_FILESYS fs, ULONG block, void *inbuf) { bool retval = false; retval = NT_SUCCESS(Ext2ReadDisk( fs, ((ULONGLONG)block * fs->blocksize), fs->blocksize, (unsigned char *)inbuf)); return retval; }
bool ext2_load_inode(PEXT2_FILESYS Ext2Sys, ULONG no, PEXT2_INODE pInode) { LONGLONG Offset; bool bRet = false; if (ext2_get_inode_lba(Ext2Sys, no, &Offset)) { bRet = NT_SUCCESS(Ext2ReadDisk( Ext2Sys, Offset, sizeof(EXT2_INODE), (unsigned char *)pInode)); } return bRet; }
bool ext2_read_inode(PEXT2_FILESYS Ext2Sys, ULONG ino, ULONG offset, PVOID Buffer, ULONG size, PULONG dwReturn) { PEXT2_BDL ext2_bdl = NULL; ULONG blocks, i; bool bRet = true; EXT2_INODE ext2_inode; ULONG dwTotal = 0; if (!ext2_load_inode(Ext2Sys, ino, &ext2_inode)) { return false; } blocks = ext2_build_bdl(Ext2Sys, &ext2_inode, offset, size, &ext2_bdl); if (blocks <= 0) return false; for(i = 0; i < blocks; i++) { bRet = NT_SUCCESS(Ext2ReadDisk( Ext2Sys, ext2_bdl[i].Lba, ext2_bdl[i].Length, (PUCHAR)Buffer + ext2_bdl[i].Offset )); if (!bRet) break; dwTotal += ext2_bdl[i].Length; } *dwReturn = dwTotal; if (ext2_bdl) RtlFreeHeap(RtlGetProcessHeap(), 0, ext2_bdl); return bRet; }