Index: cracker.c
===================================================================
--- cracker.c	(revision 113)
+++ cracker.c	(working copy)
@@ -285,18 +285,65 @@
 	}
 }
 
+char *get_max_time_remaining(int average, int attempts_remaining)
+{
+	char *max_time, hours[12], minutes[2], seconds[2];
+	int max_hours = 0, max_minutes = 0, max_seconds = 0;
+
+	max_time = malloc(16);
+
+	if(!max_time)
+		exit(-1);
+
+	if(average)
+	{
+		max_seconds = attempts_remaining * average;
+		if(max_seconds > 60)
+		{
+			max_minutes = max_seconds / 60;
+			max_seconds -= max_minutes * 60;
+		}
+		if(max_minutes > 60)
+		{
+			max_hours = max_minutes / 60;
+			max_minutes -= max_hours * 60;
+		}
+
+		if(max_seconds < 0 || max_minutes < 0 || max_hours < 0)
+		{
+			free(max_time);
+			return NULL;
+		}
+
+		sprintf(hours, "%d", max_hours);
+		sprintf(minutes, "%s%d", max_minutes > 9 ? "" : "0", max_minutes);
+		sprintf(seconds, "%s%d", max_seconds > 9 ? "" : "0", max_seconds);
+
+		sprintf(max_time, "%s:%s:%s", hours, minutes, seconds);
+	}
+	else
+	{
+		free(max_time);
+		return NULL;
+	}
+
+	return max_time;
+}
+
 /* Displays the status and rate of cracking */
 void display_status(float pin_count, time_t start_time)
 {
 	float percentage = 0;
 	int attempts = 0, average = 0;
+	int attempts_remaining = 0;
 	time_t now = 0, diff = 0;
 	struct tm *tm_p = NULL;
-        char time_s[256] = { 0 };
+        char time_s[256] = { 0 }, *max_time;
 
 	if(get_key_status() == KEY1_WIP)
 	{
 		attempts = get_p1_index() + get_p2_index();
+		attempts_remaining = 11000 - attempts;
 	}
 	/* 
 	 * If we've found the first half of the key, then the entire key1 keyspace
@@ -305,10 +352,12 @@
 	else if(get_key_status() == KEY2_WIP)
 	{
 		attempts = P1_SIZE + get_p2_index();
+		attempts_remaining = 11000 - attempts;
 	}
 	else if(get_key_status() == KEY_DONE)
 	{
 		attempts = P1_SIZE + P2_SIZE;
+		attempts_remaining = 0;
 	}
 
 	percentage = (float) (((float) attempts / (P1_SIZE + P2_SIZE)) * 100);
@@ -335,7 +384,12 @@
 		average = 0;
 	}
 
+	max_time = get_max_time_remaining(average, attempts_remaining);
+
 	cprintf(INFO, "[+] %.2f%% complete @ %s (%d seconds/pin)\n", percentage, time_s, average);
+	cprintf(INFO, "[+] Max time remaining at this rate: %s (%d pins left to try)\n", max_time ? max_time : "(undetermined)", attempts_remaining);
 
+	free(max_time);
+
 	return;
 }