void FileSystem::writeInodeEntry(PartitionEntry *partition, unsigned int inodeNumber) { InodeData inode = readInode(partition, lostFoundInode); InodeData inode_cur = readInode(partition, inodeNumber); int blockNumber = readDataBlocks(partition, lostFoundInode, (blockSize / SECTOR_SIZE_BYTES), inode.dataBlocksPointers, 0, 0, 2); if (blockNumber == -1) return; unsigned int blockSector = getBlockSector(partition, blockNumber); unsigned char buf[blockSize]; unsigned int i = 0; readSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf); while (i < blockSize - 1) { struct ext2_dir_entry_2 *fileEntry = (struct ext2_dir_entry_2 *) (buf + i); if (fileEntry->rec_len > ((((__u16 ) 8 + fileEntry->name_len) + 3) & ~0x03)) { fileEntry->rec_len = (((__u16 ) 8 + fileEntry->name_len) + 3) & ~0x03; i = i + fileEntry->rec_len; fileEntry = (struct ext2_dir_entry_2*) (buf + i); fileEntry->inode = inodeNumber; sprintf(fileEntry->name, "%d", inodeNumber); fileEntry->rec_len = (__u16)(blockSize - i); fileEntry->name_len = (__u8)(strlen(fileEntry->name)); if (!(inode_cur.fileType & EXT2_S_IFREG) == 0) fileEntry->file_type = 1; else if (!(inode_cur.fileType & EXT2_S_IFDIR) == 0) fileEntry->file_type = 2; writeSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf); return; } else { i = i + fileEntry->rec_len; } } }
UmdReader::UmdReader(const QString name, QWidget *parent):QSplitter(parent) { bookName=name; creatParser(); creatWidget(); readChapters(); readDataBlocks(); creatConnection(); }
void FileSystem::readRootInode(PartitionEntry *partition) { unsigned int i; InodeData inode = readInode(partition, 2); blockSize = 1024 << super_block.s_log_block_size; firstRootBataBlock = inode.dataBlocksPointers[0]; readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 1, 1, 2); readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 2, 1, 2); for (i = 11; i <= super_block.s_inodes_count; i++) { InodeData in = readInode(partition, i); if (!(in.fileType & EXT2_S_IFDIR) == 0 && checkInodeBitmap(partition, i) == 1) { readDataBlocks(partition, i, -1, in.dataBlocksPointers, 0, 2, 2); } } for (i = 11; i <= super_block.s_inodes_count; i++) { unsigned int bitmapValue = checkInodeBitmap(partition, i); if (bitmapValue == 1 && inodeMap[i] == 0) { InodeData in = readInode(partition, i); if (in.fileType != 0) { QString tmpStr = QString("Inode ") + QString::number(i) + QString(" has invalid entry in inode bitmap. Bitmap value: ") + QString::number(bitmapValue) + QString(", collected value:") + QString::number(inodeMap[i]) + QString(".\n"); textBrowser->append(tmpStr); errorQt++; if (performRepair) { writeInodeEntry(partition, i); } } } } readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 1, 1, 2); readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 3, 1, 2); for (i = 1; i <= super_block.s_inodes_count; i++) { InodeData in = readInode(partition, i); if (inodeLinkCount[i] != in.hardLinksQt) { if (in.fileType != 0) { QString tmpStr = QString("Inode ") + QString::number(i) + QString( " has invalid inode count in inode entry. Current value : ") + QString::number(in.hardLinksQt) + QString(", collected value:") + QString::number(inodeLinkCount[i]) + QString(".\n"); textBrowser->append(tmpStr); errorQt++; } if (performRepair) { UpdateHardLinkCounter(partition, i, inodeLinkCount[i]); } } } readDataBlocks(partition, 2, 2, inode.dataBlocksPointers, 4, 1, 2); for (i = 1; i <= super_block.s_blocks_count; i++) { unsigned int bitmapValue = checkBlockBitmap(partition, i); if (i < firstRootBataBlock && checkBlockBitmap(partition, i) == 0) { QString tmpStr = QString("Block ") + i + QString( " has invalid entry in block bitmap. Bitmap value: 0, collected value: 1.\n"); textBrowser->append(tmpStr); errorQt++; if (performRepair) { setBlockBitmap(partition, i); } } if (blockMap[i] == 1 && bitmapValue != blockMap[i]) { QString tmpStr = QString("Block ") + QString::number(i) + QString(" has invalid entry in block bitmap. Bitmap value: ") + QString::number(bitmapValue) + QString(", collected value: ") + QString::number(blockMap[i]) + QString(".\n"); textBrowser->append(tmpStr); errorQt++; if (performRepair) { setBlockBitmap(partition, i); } } } }
unsigned int FileSystem::parseFilesystem(PartitionEntry *partition, unsigned int blockNumber, unsigned int passNumber, unsigned int currentInode, unsigned int parentInode, int performCheck) { unsigned char buf[blockSize]; unsigned int i = 0; struct ext2_dir_entry_2 *fileEntry; unsigned int blockSector = getBlockSector(partition, blockNumber); readSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf); while (i < blockSize - 1) { fileEntry = (struct ext2_dir_entry_2 *) (buf + i); if (fileEntry->inode == 0) return -1; if (currentInode == 2 && parentInode == 2 && (strcmp(fileEntry->name, "lost+found") == 0)) { lostFoundInode = fileEntry->inode; } if (passNumber == 1 && performCheck == 1) { if (fileEntry->inode != currentInode && (strcmp(fileEntry->name, ".") == 0)) { QString tmpStr = QString("Entry '.' has inode ") + QString::number(fileEntry->inode) + QString(" instead of ") + QString::number(currentInode) + QString(".\n"); textBrowser->append(tmpStr); errorQt++; fileEntry->inode = currentInode; writeSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf); } if (fileEntry->inode != parentInode && (!strcmp(fileEntry->name, ".."))) { QString tmpStr = QString("Entry '..' has inode ") + QString::number(fileEntry->inode) + QString(" instead of ") + QString::number(parentInode) + QString(".\n"); textBrowser->append(tmpStr); errorQt++; fileEntry->inode = parentInode; writeSectors(blockSector, (blockSize / SECTOR_SIZE_BYTES), buf); } } else if (passNumber == 2 && performCheck == 1) { inodeMap[fileEntry->inode] = 1; } else if (passNumber == 3 && performCheck == 1) { inodeLinkCount[fileEntry->inode] += 1; } else if (passNumber == 4 && performCheck == 1) { blockMap[blockNumber] = 1; } if (strcmp(fileEntry->name, ".") && strcmp(fileEntry->name, "..") && performCheck != 0) { if (performCheck == 2) { inodeMap[fileEntry->inode] = 1; } InodeData inode = readInode(partition, fileEntry->inode); if ((inode.fileType & 0xF000) == EXT2_S_IFREG && passNumber == 4) { readDataBlocks(partition, fileEntry->inode, currentInode, inode.dataBlocksPointers, passNumber, performCheck, 1); } else if (!(inode.fileType & EXT2_S_IFDIR) == 0) { readDataBlocks(partition, fileEntry->inode, currentInode, inode.dataBlocksPointers, passNumber, performCheck, 2); } } i = i + fileEntry->rec_len; } if (fileEntry != NULL && fileEntry->rec_len > 8 + fileEntry->name_len && (fileEntry->rec_len - 8 - fileEntry->name_len) > 16 && !performCheck) return blockNumber; return -1; }