void init_fat(){ ushort* mbr = (ushort*) kmalloc(512); ata_read_block(mbr, 0); memcpy(&fat_header, mbr, sizeof(fat_header_t)); kfree(mbr); cluster_list = (ushort*) kmalloc(fat_header.sectors_per_fat * 512); ata_read_blocks(cluster_list, fat_header.number_reserved, fat_header.sectors_per_fat); fat_dir = (fat_dir_t*) kmalloc(32 * fat_header.dir_size); ata_read_blocks((ushort*) fat_dir, fat_header.number_reserved + FAT_TOTAL_SIZE, FAT_DIR_SIZE); ASSERT(((fat_header.dir_size * 32) % 512) == 0); }
static void hard_drive_handle_connection (ata_drive_type *ata_drive, mailbox_id_type reply_mailbox_id) { message_parameter_type message_parameter; ipc_structure_type ipc_structure; bool done = FALSE; u32 *data; unsigned int data_size = 1024; memory_allocate ((void **) &data, data_size); /* Accept the connection. */ ipc_structure.output_mailbox_id = reply_mailbox_id; ipc_connection_establish (&ipc_structure); message_parameter.block = TRUE; while (!done) { message_parameter.protocol = IPC_PROTOCOL_BLOCK; message_parameter.message_class = IPC_CLASS_NONE; message_parameter.length = data_size; message_parameter.data = data; if (ipc_receive (ipc_structure.input_mailbox_id, &message_parameter, &data_size) != IPC_RETURN_SUCCESS) { continue; } switch (message_parameter.message_class) { case IPC_BLOCK_READ: { ipc_block_read_type *ipc_block_read = (ipc_block_read_type *) data; /* FIXME: Do some boundary checking. */ #ifdef DEBUG log_print_formatted (&log_structure, LOG_URGENCY_DEBUG, "Reading blocks %u-%u data.", ipc_block_read->start_block_number, ipc_block_read->start_block_number + ipc_block_read->number_of_blocks); #endif ata_read_block (ata_drive, ipc_block_read->start_block_number, message_parameter.data, ipc_block_read->number_of_blocks); message_parameter.length = ipc_block_read->number_of_blocks; message_parameter.block = TRUE; ipc_send (ipc_structure.output_mailbox_id, &message_parameter); break; } case IPC_BLOCK_WRITE: { break; } case IPC_BLOCK_GET_INFO: { break; } } } }