Add NvAPI support for PCIE Lanes
[hashcat.git] / src / ext_nvapi.c
1 /**
2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
4 *
5 * License.....: MIT
6 */
7
8 #include <ext_nvapi.h>
9
10 int nvapi_init (NVAPI_PTR *nvapi)
11 {
12 if (!nvapi) return (-1);
13
14 memset (nvapi, 0, sizeof (NVAPI_PTR));
15
16 #if __x86_64__
17 nvapi->lib = hc_dlopen ("nvapi64.dll");
18 #elif __x86__
19 nvapi->lib = hc_dlopen ("nvapi.dll");
20 #endif
21
22 if (!nvapi->lib)
23 {
24 //if (data.quiet == 0)
25 // log_info ("WARNING: load NVAPI library failed, proceed without NVAPI HWMon enabled.");
26
27 return (-1);
28 }
29
30 HC_LOAD_FUNC(nvapi, nvapi_QueryInterface, NVAPI_QUERYINTERFACE, NVAPI, 0)
31 HC_LOAD_ADDR(nvapi, NvAPI_Initialize, NVAPI_INITIALIZE, nvapi_QueryInterface, 0x0150E828, NVAPI, 0)
32 HC_LOAD_ADDR(nvapi, NvAPI_Unload, NVAPI_UNLOAD, nvapi_QueryInterface, 0xD22BDD7E, NVAPI, 0)
33 HC_LOAD_ADDR(nvapi, NvAPI_GetErrorMessage, NVAPI_GETERRORMESSAGE, nvapi_QueryInterface, 0x6C2D048C, NVAPI, 0)
34 HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetDynamicPstatesInfoEx, NVAPI_GPU_GETDYNAMICPSTATESINFOEX, nvapi_QueryInterface, 0x60DED2ED, NVAPI, 0)
35 HC_LOAD_ADDR(nvapi, NvAPI_EnumPhysicalGPUs, NVAPI_ENUMPHYSICALGPUS, nvapi_QueryInterface, 0xE5AC921F, NVAPI, 0)
36 HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetThermalSettings, NVAPI_GPU_GETTHERMALSETTINGS, nvapi_QueryInterface, 0xE3640A56, NVAPI, 0)
37 HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetTachReading, NVAPI_GPU_GETTACHREADING, nvapi_QueryInterface, 0x5F608315, NVAPI, 0)
38 HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetCoolerSettings, NVAPI_GPU_GETCOOLERSETTINGS, nvapi_QueryInterface, 0xDA141340, NVAPI, 0)
39 HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetAllClockFrequencies, NVAPI_GPU_GETALLCLOCKFREQUENCIES, nvapi_QueryInterface, 0xDCB616C3, NVAPI, 0)
40 HC_LOAD_ADDR(nvapi, NvAPI_GPU_GetCurrentPCIEDownstreamWidth, NVAPI_GPU_GETCURRENTPCIEDOWNSTREAMWIDTH, nvapi_QueryInterface, 0xD048C3B1, NVAPI, 0)
41
42 return 0;
43 }
44
45 void nvapi_close (NVAPI_PTR *nvapi)
46 {
47 if (nvapi)
48 {
49 if (nvapi->lib)
50 hc_dlclose (nvapi->lib);
51
52 myfree (nvapi);
53 }
54 }
55
56 int hm_NvAPI_Initialize (NVAPI_PTR *nvapi)
57 {
58 if (!nvapi) return (-1);
59
60 NvAPI_Status NvAPI_rc = nvapi->NvAPI_Initialize ();
61
62 if (NvAPI_rc == NVAPI_LIBRARY_NOT_FOUND) NvAPI_rc = NVAPI_OK; // not a bug
63
64 if (NvAPI_rc != NVAPI_OK)
65 {
66 NvAPI_ShortString string = { 0 };
67
68 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
69
70 log_info ("WARN: %s %d %s\n", "NvAPI_Initialize()", NvAPI_rc, string);
71 }
72
73 return NvAPI_rc;
74 }
75
76 int hm_NvAPI_Unload (NVAPI_PTR *nvapi)
77 {
78 if (!nvapi) return (-1);
79
80 NvAPI_Status NvAPI_rc = nvapi->NvAPI_Unload ();
81
82 if (NvAPI_rc != NVAPI_OK)
83 {
84 NvAPI_ShortString string = { 0 };
85
86 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
87
88 log_info ("WARN: %s %d %s\n", "NvAPI_Unload()", NvAPI_rc, string);
89 }
90
91 return NvAPI_rc;
92 }
93
94 int hm_NvAPI_GetErrorMessage (NVAPI_PTR *nvapi, NvAPI_Status NvAPI_rc, NvAPI_ShortString string)
95 {
96 if (!nvapi) return (-1);
97
98 return nvapi->NvAPI_GetErrorMessage (NvAPI_rc, string);
99 }
100
101 int hm_NvAPI_EnumPhysicalGPUs (NVAPI_PTR *nvapi, NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount)
102 {
103 if (!nvapi) return (-1);
104
105 NvAPI_Status NvAPI_rc = nvapi->NvAPI_EnumPhysicalGPUs (nvGPUHandle, pGpuCount);
106
107 if (NvAPI_rc != NVAPI_OK)
108 {
109 NvAPI_ShortString string = { 0 };
110
111 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
112
113 log_info ("WARN: %s %d %s\n", "NvAPI_EnumPhysicalGPUs()", NvAPI_rc, string);
114 }
115
116 return NvAPI_rc;
117 }
118
119 int hm_NvAPI_GPU_GetThermalSettings (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NvU32 sensorIndex, NV_GPU_THERMAL_SETTINGS *pThermalSettings)
120 {
121 if (!nvapi) return (-1);
122
123 NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetThermalSettings (hPhysicalGpu, sensorIndex, pThermalSettings);
124
125 if (NvAPI_rc != NVAPI_OK)
126 {
127 NvAPI_ShortString string = { 0 };
128
129 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
130
131 log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetThermalSettings()", NvAPI_rc, string);
132 }
133
134 return NvAPI_rc;
135 }
136
137 int hm_NvAPI_GPU_GetTachReading (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGPU, NvU32 *pValue)
138 {
139 if (!nvapi) return (-1);
140
141 NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetTachReading (hPhysicalGPU, pValue);
142
143 if (NvAPI_rc != NVAPI_OK)
144 {
145 NvAPI_ShortString string = { 0 };
146
147 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
148
149 log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetTachReading()", NvAPI_rc, string);
150 }
151
152 return NvAPI_rc;
153 }
154
155 int hm_NvAPI_GPU_GetCoolerSettings (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NvU32 coolerIndex, NV_GPU_COOLER_SETTINGS *pCoolerSettings)
156 {
157 if (!nvapi) return (-1);
158
159 NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetCoolerSettings (hPhysicalGpu, coolerIndex, pCoolerSettings);
160
161 if (NvAPI_rc != NVAPI_OK)
162 {
163 NvAPI_ShortString string = { 0 };
164
165 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
166
167 log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetCoolerSettings()", NvAPI_rc, string);
168 }
169
170 return NvAPI_rc;
171 }
172
173 int hm_NvAPI_GPU_GetDynamicPstatesInfoEx (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_DYNAMIC_PSTATES_INFO_EX *pDynamicPstatesInfoEx)
174 {
175 if (!nvapi) return (-1);
176
177 NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetDynamicPstatesInfoEx (hPhysicalGpu, pDynamicPstatesInfoEx);
178
179 if (NvAPI_rc != NVAPI_OK)
180 {
181 NvAPI_ShortString string = { 0 };
182
183 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
184
185 log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetDynamicPstatesInfoEx()", NvAPI_rc, string);
186 }
187
188 return NvAPI_rc;
189 }
190
191 int hm_NvAPI_GPU_GetAllClockFrequencies (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_CLOCK_FREQUENCIES *pClkFreqs)
192 {
193 if (!nvapi) return (-1);
194
195 NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetAllClockFrequencies (hPhysicalGpu, pClkFreqs);
196
197 if (NvAPI_rc != NVAPI_OK)
198 {
199 NvAPI_ShortString string = { 0 };
200
201 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
202
203 log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetAllClockFrequencies()", NvAPI_rc, string);
204 }
205
206 return NvAPI_rc;
207 }
208
209 int hm_NvAPI_GPU_GetCurrentPCIEDownstreamWidth (NVAPI_PTR *nvapi, NvPhysicalGpuHandle hPhysicalGpu, NvU32 *pWidth)
210 {
211 if (!nvapi) return (-1);
212
213 NvAPI_Status NvAPI_rc = nvapi->NvAPI_GPU_GetCurrentPCIEDownstreamWidth (hPhysicalGpu, pWidth);
214
215 if (NvAPI_rc != NVAPI_OK)
216 {
217 NvAPI_ShortString string = { 0 };
218
219 hm_NvAPI_GetErrorMessage (nvapi, NvAPI_rc, string);
220
221 log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetCurrentPCIEDownstreamWidth()", NvAPI_rc, string);
222 }
223
224 return NvAPI_rc;
225 }
226
227 #ifdef __MINGW64__
228
229 void __security_check_cookie (uintptr_t _StackCookie)
230 {
231 (void) _StackCookie;
232 }
233
234 void __GSHandlerCheck ()
235 {
236 }
237
238 #endif