Move keyspress detecting thread to outer loop
[hashcat.git] / src / hashcat.c
index b147aee..0259a17 100644 (file)
@@ -413,7 +413,7 @@ const char *USAGE_BIG[] =
   "     --cpu-affinity            | Str  | Locks to CPU devices, separate with comma            | --cpu-affinity=1,2,3",
   "     --opencl-platforms        | Str  | OpenCL platforms to use, separate with comma         | --opencl-platforms=2",
   " -d, --opencl-devices          | Str  | OpenCL devices to use, separate with comma           | -d 1",
-  "     --opencl-device-types     | Str  | OpenCL device-types to use, separate with comma      | --opencl-device-type=1",
+  " -D, --opencl-device-types     | Str  | OpenCL device-types to use, separate with comma      | -D 1",
   "     --opencl-vector-width     | Num  | Manual override OpenCL vector-width to X             | --opencl-vector=4",
   " -w, --workload-profile        | Num  | Enable a specific workload profile, see pool below   | -w 3",
   " -n, --kernel-accel            | Num  | Manual workload tuning, set outerloop step size to X | -n 64",
@@ -5959,7 +5959,7 @@ int main (int argc, char **argv)
   #define IDX_CPU_AFFINITY              0xff25
   #define IDX_OPENCL_DEVICES            'd'
   #define IDX_OPENCL_PLATFORMS          0xff72
-  #define IDX_OPENCL_DEVICE_TYPES       0xff73
+  #define IDX_OPENCL_DEVICE_TYPES       'D'
   #define IDX_OPENCL_VECTOR_WIDTH       0xff74
   #define IDX_WORKLOAD_PROFILE          'w'
   #define IDX_KERNEL_ACCEL              'n'
@@ -5983,7 +5983,7 @@ int main (int argc, char **argv)
   #define IDX_CUSTOM_CHARSET_3          '3'
   #define IDX_CUSTOM_CHARSET_4          '4'
 
-  char short_options[] = "hVvm:a:r:j:k:g:o:t:d:n:u:c:p:s:l:1:2:3:4:ibw:";
+  char short_options[] = "hVvm:a:r:j:k:g:o:t:d:D:n:u:c:p:s:l:1:2:3:4:ibw:";
 
   struct option long_options[] =
   {
@@ -7332,6 +7332,35 @@ int main (int argc, char **argv)
     }
   }
 
+  /**
+   * status, monitor and outfile remove threads
+   */
+
+  uint wordlist_mode = ((optind + 1) < myargc) ? WL_MODE_FILE : WL_MODE_STDIN;
+
+  data.wordlist_mode = wordlist_mode;
+
+  if (wordlist_mode == WL_MODE_STDIN)
+  {
+    status = 1;
+
+    data.status = status;
+  }
+
+  uint i_threads_cnt = 0;
+
+  hc_thread_t *i_threads = (hc_thread_t *) mycalloc (10, sizeof (hc_thread_t));
+
+  if (keyspace == 0 && benchmark == 0 && stdout_flag == 0)
+  {
+    if ((data.wordlist_mode == WL_MODE_FILE) || (data.wordlist_mode == WL_MODE_MASK))
+    {
+      hc_thread_create (i_threads[i_threads_cnt], thread_keypress, NULL);
+
+      i_threads_cnt++;
+    }
+  }
+
   /**
    * config
    */
@@ -15393,32 +15422,59 @@ int main (int argc, char **argv)
        * default building options
        */
 
-      char build_opts[1024] = { 0 };
+      char cpath[1024] = { 0 };
 
-      // we don't have sm_* on vendors not NV but it doesn't matter
+      char build_opts[1024] = { 0 };
 
       #if _WIN
-      snprintf (build_opts, sizeof (build_opts) - 1, "-I \"%s\\OpenCL\\\" -I '%s\\OpenCL\\' -I %s\\OpenCL\\ -I\"%s\\OpenCL\\\" -I'%s\\OpenCL\\' -I%s\\OpenCL\\", shared_dir, shared_dir, shared_dir, shared_dir, shared_dir, shared_dir);
-      #else
-      snprintf (build_opts, sizeof (build_opts) - 1, "-I \"%s/OpenCL/\" -I '%s/OpenCL/' -I %s/OpenCL/ -I\"%s/OpenCL/\" -I'%s/OpenCL/' -I%s/OpenCL/", shared_dir, shared_dir, shared_dir, shared_dir, shared_dir, shared_dir);
-      #endif
 
-      char build_opts_new[1024] = { 0 };
-
-      snprintf (build_opts_new, sizeof (build_opts_new) - 1, "%s -DVENDOR_ID=%u -DCUDA_ARCH=%d -DVECT_SIZE=%u -DDEVICE_TYPE=%u -DKERN_TYPE=%u -D_unroll -cl-std=CL1.1", build_opts, device_param->device_vendor_id, (device_param->sm_major * 100) + device_param->sm_minor, device_param->vector_width, (u32) device_param->device_type, kern_type);
+      snprintf (cpath, sizeof (cpath) - 1, "%s\\OpenCL\\", shared_dir);
 
-      strncpy (build_opts, build_opts_new, sizeof (build_opts) - 1);
+      char *cpath_real = mymalloc (MAX_PATH);
 
-      /*
-      if (device_param->device_vendor_id == VENDOR_ID_INTEL_SDK)
+      if (GetFullPathName (cpath, MAX_PATH, cpath_real, NULL) == 0)
       {
-        // we do vectorizing much better than the auto-vectorizer
+        log_error ("ERROR: %s: %s", cpath, "GetFullPathName()");
+
+        return -1;
+      }
+
+      naive_replace (cpath_real, '\\', '/');
+
+      // not escaping here, windows has quotes
+
+      snprintf (build_opts, sizeof (build_opts) - 1, "-I \"%s\"", cpath_real);
+
+      myfree (cpath_real);
+
+      #else
 
-        snprintf (build_opts_new, sizeof (build_opts_new) - 1, "%s -cl-opt-disable", build_opts);
+      snprintf (cpath, sizeof (cpath) - 1, "%s/OpenCL/", shared_dir);
 
-        strncpy (build_opts, build_opts_new, sizeof (build_opts) - 1);
+      char *cpath_real = mymalloc (PATH_MAX);
+
+      if (realpath (cpath, cpath_real) == NULL)
+      {
+        log_error ("ERROR: %s: %s", cpath, strerror (errno));
+
+        return -1;
       }
-      */
+
+      naive_escape (cpath_real, PATH_MAX,  ' ', '\\');
+
+      snprintf (build_opts, sizeof (build_opts) - 1, "-I %s", cpath_real);
+
+      myfree (cpath_real);
+
+      #endif
+
+      // we don't have sm_* on vendors not NV but it doesn't matter
+
+      char build_opts_new[1024] = { 0 };
+
+      snprintf (build_opts_new, sizeof (build_opts_new) - 1, "%s -D VENDOR_ID=%u -D CUDA_ARCH=%d -D VECT_SIZE=%u -D DEVICE_TYPE=%u -D KERN_TYPE=%u -D _unroll -cl-std=CL1.1", build_opts, device_param->device_vendor_id, (device_param->sm_major * 100) + device_param->sm_minor, device_param->vector_width, (u32) device_param->device_type, kern_type);
+
+      strncpy (build_opts, build_opts_new, sizeof (build_opts));
 
       #ifdef DEBUG
       log_info ("- Device #%u: build_opts '%s'\n", device_id + 1, build_opts);
@@ -16368,10 +16424,6 @@ int main (int argc, char **argv)
     wl_data->cnt   = 0;
     wl_data->pos   = 0;
 
-    uint wordlist_mode = ((optind + 1) < myargc) ? WL_MODE_FILE : WL_MODE_STDIN;
-
-    data.wordlist_mode = wordlist_mode;
-
     cs_t  *css_buf   = NULL;
     uint   css_cnt   = 0;
     uint   dictcnt   = 0;
@@ -17164,29 +17216,17 @@ int main (int argc, char **argv)
      * status and monitor threads
      */
 
-    if (data.devices_status != STATUS_CRACKED) data.devices_status = STATUS_STARTING;
-
-    uint i_threads_cnt = 0;
-
-    hc_thread_t *i_threads = (hc_thread_t *) mycalloc (10, sizeof (hc_thread_t));
-
-    if ((data.wordlist_mode == WL_MODE_FILE) || (data.wordlist_mode == WL_MODE_MASK))
-    {
-      if (stdout_flag == 0)
-      {
-        hc_thread_create (i_threads[i_threads_cnt], thread_keypress, &benchmark);
-
-        i_threads_cnt++;
-      }
-    }
+    if (data.devices_status == STATUS_CRACKED) break;
+    if (data.devices_status == STATUS_ABORTED) break;
+    if (data.devices_status == STATUS_QUIT)    break;
 
-    if (wordlist_mode == WL_MODE_STDIN) data.status = 1;
+    data.devices_status = STATUS_STARTING;
 
     uint ni_threads_cnt = 0;
 
     hc_thread_t *ni_threads = (hc_thread_t *) mycalloc (10, sizeof (hc_thread_t));
 
-    if (stdout_flag == 0)
+    if (keyspace == 0 && benchmark == 0 && stdout_flag == 0)
     {
       hc_thread_create (ni_threads[ni_threads_cnt], thread_monitor, NULL);
 
@@ -17197,7 +17237,7 @@ int main (int argc, char **argv)
       * Outfile remove
       */
 
-    if (keyspace == 0)
+    if (keyspace == 0 && benchmark == 0 && stdout_flag == 0)
     {
       if (outfile_check_timer != 0)
       {
@@ -17257,6 +17297,8 @@ int main (int argc, char **argv)
     for (uint maskpos = rd->maskpos; maskpos < maskcnt; maskpos++)
     {
       if (data.devices_status == STATUS_CRACKED) break;
+      if (data.devices_status == STATUS_ABORTED) break;
+      if (data.devices_status == STATUS_QUIT)    break;
 
       data.devices_status = STATUS_INIT;
 
@@ -17505,6 +17547,10 @@ int main (int argc, char **argv)
 
         logfile_sub_msg ("START");
 
+        if (data.devices_status == STATUS_CRACKED) break;
+        if (data.devices_status == STATUS_ABORTED) break;
+        if (data.devices_status == STATUS_QUIT)    break;
+
         data.devices_status = STATUS_INIT;
 
         memset (data.words_progress_done,     0, data.salts_cnt * sizeof (u64));
@@ -18046,6 +18092,10 @@ int main (int argc, char **argv)
 
         hc_thread_t *c_threads = (hc_thread_t *) mycalloc (data.devices_cnt, sizeof (hc_thread_t));
 
+        if (data.devices_status == STATUS_CRACKED) break;
+        if (data.devices_status == STATUS_ABORTED) break;
+        if (data.devices_status == STATUS_QUIT)    break;
+
         data.devices_status = STATUS_AUTOTUNE;
 
         for (uint device_id = 0; device_id < data.devices_cnt; device_id++)
@@ -18100,6 +18150,12 @@ int main (int argc, char **argv)
          * create cracker threads
          */
 
+        if (data.devices_status == STATUS_STOP_AT_CHECKPOINT) check_checkpoint ();
+
+        if (data.devices_status == STATUS_CRACKED) break;
+        if (data.devices_status == STATUS_ABORTED) break;
+        if (data.devices_status == STATUS_QUIT)    break;
+
         data.devices_status = STATUS_RUNNING;
 
         if (initial_restore_done == 0)
@@ -18312,15 +18368,6 @@ int main (int argc, char **argv)
 
     local_free (ni_threads);
 
-    // wait for interactive threads
-
-    for (uint thread_idx = 0; thread_idx < i_threads_cnt; thread_idx++)
-    {
-      hc_thread_wait (1, &i_threads[thread_idx]);
-    }
-
-    local_free (i_threads);
-
     // we dont need restore file anymore
     if (data.restore_disable == 0)
     {
@@ -18361,7 +18408,7 @@ int main (int argc, char **argv)
 
       if (quiet == 0) log_info ("");
 
-      if (status == 1)
+      if (status == 1 && stdout_flag == 0)
       {
         status_display ();
       }
@@ -18673,6 +18720,15 @@ int main (int argc, char **argv)
     if (data.devices_status == STATUS_QUIT) break;
   }
 
+  // wait for interactive threads
+
+  for (uint thread_idx = 0; thread_idx < i_threads_cnt; thread_idx++)
+  {
+    hc_thread_wait (1, &i_threads[thread_idx]);
+  }
+
+  local_free (i_threads);
+
   // destroy others mutex
 
   hc_thread_mutex_delete (mux_dispatcher);