Merge pull request #392 from unix-ninja/master
[hashcat.git] / src / shared.c
index 9e16c02..2cc6d9f 100644 (file)
@@ -3402,11 +3402,17 @@ int hm_get_throttle_with_device_id (const uint device_id)
     if (hm_NVML_nvmlDeviceGetCurrentClocksThrottleReasons   (data.hm_nvml, 1, data.hm_device[device_id].nvml, &clocksThrottleReasons)    != NVML_SUCCESS) return -1;
     if (hm_NVML_nvmlDeviceGetSupportedClocksThrottleReasons (data.hm_nvml, 1, data.hm_device[device_id].nvml, &supportedThrottleReasons) != NVML_SUCCESS) return -1;
 
-    clocksThrottleReasons &= supportedThrottleReasons;
-
+    clocksThrottleReasons &=  supportedThrottleReasons;
+    clocksThrottleReasons &= ~nvmlClocksThrottleReasonGpuIdle;
+    clocksThrottleReasons &= ~nvmlClocksThrottleReasonApplicationsClocksSetting;
     clocksThrottleReasons &= ~nvmlClocksThrottleReasonUnknown;
 
-    return (clocksThrottleReasons > 0);
+    if (data.kernel_power_final)
+    {
+      clocksThrottleReasons &= ~nvmlClocksThrottleReasonHwSlowdown;
+    }
+
+    return (clocksThrottleReasons != nvmlClocksThrottleReasonNone);
   }
 
   return -1;
@@ -3418,33 +3424,51 @@ int hm_set_fanspeed_with_device_id_adl (const uint device_id, const int fanspeed
   {
     if (data.hm_adl)
     {
-      if (data.hm_device[device_id].od_version == 5)
+      if (fanpolicy == 1)
       {
-        ADLFanSpeedValue lpFanSpeedValue;
+        if (data.hm_device[device_id].od_version == 5)
+        {
+          ADLFanSpeedValue lpFanSpeedValue;
 
-        memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
+          memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue));
 
-        lpFanSpeedValue.iSize      = sizeof (lpFanSpeedValue);
-        lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
-        lpFanSpeedValue.iFlags     = (fanpolicy == 1) ? ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED : 0;
-        lpFanSpeedValue.iFanSpeed  = fanspeed;
+          lpFanSpeedValue.iSize      = sizeof (lpFanSpeedValue);
+          lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
+          lpFanSpeedValue.iFlags     = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
+          lpFanSpeedValue.iFanSpeed  = fanspeed;
 
-        if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
+          if (hm_ADL_Overdrive5_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, 0, &lpFanSpeedValue) != ADL_OK) return -1;
 
-        return 0;
-      }
-      else // od_version == 6
-      {
-        ADLOD6FanSpeedValue fan_speed_value;
+          return 0;
+        }
+        else // od_version == 6
+        {
+          ADLOD6FanSpeedValue fan_speed_value;
 
-        memset (&fan_speed_value, 0, sizeof (fan_speed_value));
+          memset (&fan_speed_value, 0, sizeof (fan_speed_value));
 
-        fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
-        fan_speed_value.iFanSpeed  = fanspeed;
+          fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT;
+          fan_speed_value.iFanSpeed  = fanspeed;
 
-        if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, &fan_speed_value) != ADL_OK) return -1;
+          if (hm_ADL_Overdrive6_FanSpeed_Set (data.hm_adl, data.hm_device[device_id].adl, &fan_speed_value) != ADL_OK) return -1;
 
-        return 0;
+          return 0;
+        }
+      }
+      else
+      {
+        if (data.hm_device[device_id].od_version == 5)
+        {
+          if (hm_ADL_Overdrive5_FanSpeedToDefault_Set (data.hm_adl, data.hm_device[device_id].adl, 0) != ADL_OK) return -1;
+
+          return 0;
+        }
+        else // od_version == 6
+        {
+          if (hm_ADL_Overdrive6_FanSpeed_Reset (data.hm_adl, data.hm_device[device_id].adl) != ADL_OK) return -1;
+
+          return 0;
+        }
       }
     }
   }
@@ -3458,16 +3482,25 @@ int hm_set_fanspeed_with_device_id_nvapi (const uint device_id, const int fanspe
   {
     if (data.hm_nvapi)
     {
-      NV_GPU_COOLER_LEVELS CoolerLevels = { 0 };
+      if (fanpolicy == 1)
+      {
+        NV_GPU_COOLER_LEVELS CoolerLevels = { 0 };
 
-      CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS);
+        CoolerLevels.Version = GPU_COOLER_LEVELS_VER | sizeof (NV_GPU_COOLER_LEVELS);
 
-      CoolerLevels.Levels[0].Level  = fanspeed;
-      CoolerLevels.Levels[0].Policy = fanpolicy;
+        CoolerLevels.Levels[0].Level  = fanspeed;
+        CoolerLevels.Levels[0].Policy = 1;
 
-      if (hm_NvAPI_GPU_SetCoolerLevels (data.hm_nvapi, data.hm_device[device_id].nvapi, 0, &CoolerLevels) != NVAPI_OK) return -1;
+        if (hm_NvAPI_GPU_SetCoolerLevels (data.hm_nvapi, data.hm_device[device_id].nvapi, 0, &CoolerLevels) != NVAPI_OK) return -1;
 
-      return 0;
+        return 0;
+      }
+      else
+      {
+        if (hm_NvAPI_GPU_RestoreCoolerSettings (data.hm_nvapi, data.hm_device[device_id].nvapi, 0) != NVAPI_OK) return -1;
+
+        return 0;
+      }
     }
   }
 
@@ -9129,36 +9162,32 @@ void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos)
 
 void SuspendThreads ()
 {
-  if (data.devices_status == STATUS_RUNNING)
-  {
-    hc_timer_set (&data.timer_paused);
+  if (data.devices_status != STATUS_RUNNING) return;
 
-    data.devices_status = STATUS_PAUSED;
+  hc_timer_set (&data.timer_paused);
 
-    log_info ("Paused");
-  }
+  data.devices_status = STATUS_PAUSED;
+
+  log_info ("Paused");
 }
 
 void ResumeThreads ()
 {
-  if (data.devices_status == STATUS_PAUSED)
-  {
-    double ms_paused;
+  if (data.devices_status != STATUS_PAUSED) return;
 
-    hc_timer_get (data.timer_paused, ms_paused);
+  double ms_paused;
 
-    data.ms_paused += ms_paused;
+  hc_timer_get (data.timer_paused, ms_paused);
 
-    data.devices_status = STATUS_RUNNING;
+  data.ms_paused += ms_paused;
 
-    log_info ("Resumed");
-  }
+  data.devices_status = STATUS_RUNNING;
+
+  log_info ("Resumed");
 }
 
 void bypass ()
 {
-  if (data.devices_status != STATUS_RUNNING) return;
-
   data.devices_status = STATUS_BYPASS;
 
   log_info ("Next dictionary / mask in queue selected, bypassing current one");
@@ -9206,39 +9235,54 @@ void stop_at_checkpoint ()
 
 void myabort ()
 {
-  if (data.devices_status == STATUS_INIT)     return;
-  if (data.devices_status == STATUS_STARTING) return;
-
   data.devices_status = STATUS_ABORTED;
 }
 
 void myquit ()
 {
-  if (data.devices_status == STATUS_INIT)     return;
-  if (data.devices_status == STATUS_STARTING) return;
-
   data.devices_status = STATUS_QUIT;
 }
 
-void naive_escape (const char *cpath_real, char *cpath_escaped, const size_t cpath_escaped_len)
+void naive_replace (char *s, const u8 key_char, const u8 replace_char)
 {
-  const size_t len = strlen (cpath_real);
+  const size_t len = strlen (s);
+
+  for (size_t in = 0; in < len; in++)
+  {
+    const u8 c = s[in];
+
+    if (c == key_char)
+    {
+      s[in] = replace_char;
+    }
+  }
+}
+
+void naive_escape (char *s, size_t s_max, const u8 key_char, const u8 escape_char)
+{
+  char s_escaped[1024] = { 0 };
+
+  size_t s_escaped_max = sizeof (s_escaped);
+
+  const size_t len = strlen (s);
 
   for (size_t in = 0, out = 0; in < len; in++, out++)
   {
-    const u8 c = cpath_real[in];
+    const u8 c = s[in];
 
-    if (c == ' ')
+    if (c == key_char)
     {
-      cpath_escaped[out] = '\\';
+      s_escaped[out] = escape_char;
 
       out++;
     }
 
-    if (out == cpath_escaped_len) break;
+    if (out == s_escaped_max - 2) break;
 
-    cpath_escaped[out] = c;
+    s_escaped[out] = c;
   }
+
+  strncpy (s, s_escaped, s_max - 1);
 }
 
 void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const u8 **kernel_sources)
@@ -20683,7 +20727,7 @@ BOOL WINAPI sigHandler_benchmark (DWORD sig)
   {
     case CTRL_CLOSE_EVENT:
 
-      myabort ();
+      myquit ();
 
       SetConsoleCtrlHandler (NULL, TRUE);
 
@@ -20748,13 +20792,11 @@ void status_display ();
 
 void *thread_keypress (void *p)
 {
-  int benchmark = *((int *) p);
-
   uint quiet = data.quiet;
 
   tty_break();
 
-  while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT))
+  while (data.shutdown_outer == 0)
   {
     int ch = tty_getchar();
 
@@ -20831,8 +20873,6 @@ void *thread_keypress (void *p)
 
         log_info ("");
 
-        if (benchmark == 1) break;
-
         stop_at_checkpoint ();
 
         log_info ("");
@@ -20846,14 +20886,7 @@ void *thread_keypress (void *p)
 
         log_info ("");
 
-        if (benchmark == 1)
-        {
-          myquit ();
-        }
-        else
-        {
-          myabort ();
-        }
+        myabort ();
 
         break;
     }