1use std::collections::HashMap;
4use std::convert::AsRef;
5
6const WS2_32_ORDINALS: &[(u32, &'static str)] = &[
7 (1u32, "accept"),
8 (2, "bind"),
9 (3, "closesocket"),
10 (4, "connect"),
11 (5, "getpeername"),
12 (6, "getsockname"),
13 (7, "getsockopt"),
14 (8, "htonl"),
15 (9, "htons"),
16 (10, "ioctlsocket"),
17 (11, "inet_addr"),
18 (12, "inet_ntoa"),
19 (13, "listen"),
20 (14, "ntohl"),
21 (15, "ntohs"),
22 (16, "recv"),
23 (17, "recvfrom"),
24 (18, "select"),
25 (19, "send"),
26 (20, "sendto"),
27 (21, "setsockopt"),
28 (22, "shutdown"),
29 (23, "socket"),
30 (24, "GetAddrInfoW"),
31 (25, "GetNameInfoW"),
32 (26, "WSApSetPostRoutine"),
33 (27, "FreeAddrInfoW"),
34 (28, "WPUCompleteOverlappedRequest"),
35 (29, "WSAAccept"),
36 (30, "WSAAddressToStringA"),
37 (31, "WSAAddressToStringW"),
38 (32, "WSACloseEvent"),
39 (33, "WSAConnect"),
40 (34, "WSACreateEvent"),
41 (35, "WSADuplicateSocketA"),
42 (36, "WSADuplicateSocketW"),
43 (37, "WSAEnumNameSpaceProvidersA"),
44 (38, "WSAEnumNameSpaceProvidersW"),
45 (39, "WSAEnumNetworkEvents"),
46 (40, "WSAEnumProtocolsA"),
47 (41, "WSAEnumProtocolsW"),
48 (42, "WSAEventSelect"),
49 (43, "WSAGetOverlappedResult"),
50 (44, "WSAGetQOSByName"),
51 (45, "WSAGetServiceClassInfoA"),
52 (46, "WSAGetServiceClassInfoW"),
53 (47, "WSAGetServiceClassNameByClassIdA"),
54 (48, "WSAGetServiceClassNameByClassIdW"),
55 (49, "WSAHtonl"),
56 (50, "WSAHtons"),
57 (51, "gethostbyaddr"),
58 (52, "gethostbyname"),
59 (53, "getprotobyname"),
60 (54, "getprotobynumber"),
61 (55, "getservbyname"),
62 (56, "getservbyport"),
63 (57, "gethostname"),
64 (58, "WSAInstallServiceClassA"),
65 (59, "WSAInstallServiceClassW"),
66 (60, "WSAIoctl"),
67 (61, "WSAJoinLeaf"),
68 (62, "WSALookupServiceBeginA"),
69 (63, "WSALookupServiceBeginW"),
70 (64, "WSALookupServiceEnd"),
71 (65, "WSALookupServiceNextA"),
72 (66, "WSALookupServiceNextW"),
73 (67, "WSANSPIoctl"),
74 (68, "WSANtohl"),
75 (69, "WSANtohs"),
76 (70, "WSAProviderConfigChange"),
77 (71, "WSARecv"),
78 (72, "WSARecvDisconnect"),
79 (73, "WSARecvFrom"),
80 (74, "WSARemoveServiceClass"),
81 (75, "WSAResetEvent"),
82 (76, "WSASend"),
83 (77, "WSASendDisconnect"),
84 (78, "WSASendTo"),
85 (79, "WSASetEvent"),
86 (80, "WSASetServiceA"),
87 (81, "WSASetServiceW"),
88 (82, "WSASocketA"),
89 (83, "WSASocketW"),
90 (84, "WSAStringToAddressA"),
91 (85, "WSAStringToAddressW"),
92 (86, "WSAWaitForMultipleEvents"),
93 (87, "WSCDeinstallProvider"),
94 (88, "WSCEnableNSProvider"),
95 (89, "WSCEnumProtocols"),
96 (90, "WSCGetProviderPath"),
97 (91, "WSCInstallNameSpace"),
98 (92, "WSCInstallProvider"),
99 (93, "WSCUnInstallNameSpace"),
100 (94, "WSCUpdateProvider"),
101 (95, "WSCWriteNameSpaceOrder"),
102 (96, "WSCWriteProviderOrder"),
103 (97, "freeaddrinfo"),
104 (98, "getaddrinfo"),
105 (99, "getnameinfo"),
106 (101, "WSAAsyncSelect"),
107 (102, "WSAAsyncGetHostByAddr"),
108 (103, "WSAAsyncGetHostByName"),
109 (104, "WSAAsyncGetProtoByNumber"),
110 (105, "WSAAsyncGetProtoByName"),
111 (106, "WSAAsyncGetServByPort"),
112 (107, "WSAAsyncGetServByName"),
113 (108, "WSACancelAsyncRequest"),
114 (109, "WSASetBlockingHook"),
115 (110, "WSAUnhookBlockingHook"),
116 (111, "WSAGetLastError"),
117 (112, "WSASetLastError"),
118 (113, "WSACancelBlockingCall"),
119 (114, "WSAIsBlocking"),
120 (115, "WSAStartup"),
121 (116, "WSACleanup"),
122 (151, "__WSAFDIsSet"),
123 (500, "WEP"),
124];
125
126const OLEAUT32_ORDINALS: &[(u32, &'static str)] = &[
128 (2u32, "SysAllocString"),
129 (3, "SysReAllocString"),
130 (4, "SysAllocStringLen"),
131 (5, "SysReAllocStringLen"),
132 (6, "SysFreeString"),
133 (7, "SysStringLen"),
134 (8, "VariantInit"),
135 (9, "VariantClear"),
136 (10, "VariantCopy"),
137 (11, "VariantCopyInd"),
138 (12, "VariantChangeType"),
139 (13, "VariantTimeToDosDateTime"),
140 (14, "DosDateTimeToVariantTime"),
141 (15, "SafeArrayCreate"),
142 (16, "SafeArrayDestroy"),
143 (17, "SafeArrayGetDim"),
144 (18, "SafeArrayGetElemsize"),
145 (19, "SafeArrayGetUBound"),
146 (20, "SafeArrayGetLBound"),
147 (21, "SafeArrayLock"),
148 (22, "SafeArrayUnlock"),
149 (23, "SafeArrayAccessData"),
150 (24, "SafeArrayUnaccessData"),
151 (25, "SafeArrayGetElement"),
152 (26, "SafeArrayPutElement"),
153 (27, "SafeArrayCopy"),
154 (28, "DispGetParam"),
155 (29, "DispGetIDsOfNames"),
156 (30, "DispInvoke"),
157 (31, "CreateDispTypeInfo"),
158 (32, "CreateStdDispatch"),
159 (33, "RegisterActiveObject"),
160 (34, "RevokeActiveObject"),
161 (35, "GetActiveObject"),
162 (36, "SafeArrayAllocDescriptor"),
163 (37, "SafeArrayAllocData"),
164 (38, "SafeArrayDestroyDescriptor"),
165 (39, "SafeArrayDestroyData"),
166 (40, "SafeArrayRedim"),
167 (41, "SafeArrayAllocDescriptorEx"),
168 (42, "SafeArrayCreateEx"),
169 (43, "SafeArrayCreateVectorEx"),
170 (44, "SafeArraySetRecordInfo"),
171 (45, "SafeArrayGetRecordInfo"),
172 (46, "VarParseNumFromStr"),
173 (47, "VarNumFromParseNum"),
174 (48, "VarI2FromUI1"),
175 (49, "VarI2FromI4"),
176 (50, "VarI2FromR4"),
177 (51, "VarI2FromR8"),
178 (52, "VarI2FromCy"),
179 (53, "VarI2FromDate"),
180 (54, "VarI2FromStr"),
181 (55, "VarI2FromDisp"),
182 (56, "VarI2FromBool"),
183 (57, "SafeArraySetIID"),
184 (58, "VarI4FromUI1"),
185 (59, "VarI4FromI2"),
186 (60, "VarI4FromR4"),
187 (61, "VarI4FromR8"),
188 (62, "VarI4FromCy"),
189 (63, "VarI4FromDate"),
190 (64, "VarI4FromStr"),
191 (65, "VarI4FromDisp"),
192 (66, "VarI4FromBool"),
193 (67, "SafeArrayGetIID"),
194 (68, "VarR4FromUI1"),
195 (69, "VarR4FromI2"),
196 (70, "VarR4FromI4"),
197 (71, "VarR4FromR8"),
198 (72, "VarR4FromCy"),
199 (73, "VarR4FromDate"),
200 (74, "VarR4FromStr"),
201 (75, "VarR4FromDisp"),
202 (76, "VarR4FromBool"),
203 (77, "SafeArrayGetVartype"),
204 (78, "VarR8FromUI1"),
205 (79, "VarR8FromI2"),
206 (80, "VarR8FromI4"),
207 (81, "VarR8FromR4"),
208 (82, "VarR8FromCy"),
209 (83, "VarR8FromDate"),
210 (84, "VarR8FromStr"),
211 (85, "VarR8FromDisp"),
212 (86, "VarR8FromBool"),
213 (87, "VarFormat"),
214 (88, "VarDateFromUI1"),
215 (89, "VarDateFromI2"),
216 (90, "VarDateFromI4"),
217 (91, "VarDateFromR4"),
218 (92, "VarDateFromR8"),
219 (93, "VarDateFromCy"),
220 (94, "VarDateFromStr"),
221 (95, "VarDateFromDisp"),
222 (96, "VarDateFromBool"),
223 (97, "VarFormatDateTime"),
224 (98, "VarCyFromUI1"),
225 (99, "VarCyFromI2"),
226 (100, "VarCyFromI4"),
227 (101, "VarCyFromR4"),
228 (102, "VarCyFromR8"),
229 (103, "VarCyFromDate"),
230 (104, "VarCyFromStr"),
231 (105, "VarCyFromDisp"),
232 (106, "VarCyFromBool"),
233 (107, "VarFormatNumber"),
234 (108, "VarBstrFromUI1"),
235 (109, "VarBstrFromI2"),
236 (110, "VarBstrFromI4"),
237 (111, "VarBstrFromR4"),
238 (112, "VarBstrFromR8"),
239 (113, "VarBstrFromCy"),
240 (114, "VarBstrFromDate"),
241 (115, "VarBstrFromDisp"),
242 (116, "VarBstrFromBool"),
243 (117, "VarFormatPercent"),
244 (118, "VarBoolFromUI1"),
245 (119, "VarBoolFromI2"),
246 (120, "VarBoolFromI4"),
247 (121, "VarBoolFromR4"),
248 (122, "VarBoolFromR8"),
249 (123, "VarBoolFromDate"),
250 (124, "VarBoolFromCy"),
251 (125, "VarBoolFromStr"),
252 (126, "VarBoolFromDisp"),
253 (127, "VarFormatCurrency"),
254 (128, "VarWeekdayName"),
255 (129, "VarMonthName"),
256 (130, "VarUI1FromI2"),
257 (131, "VarUI1FromI4"),
258 (132, "VarUI1FromR4"),
259 (133, "VarUI1FromR8"),
260 (134, "VarUI1FromCy"),
261 (135, "VarUI1FromDate"),
262 (136, "VarUI1FromStr"),
263 (137, "VarUI1FromDisp"),
264 (138, "VarUI1FromBool"),
265 (139, "VarFormatFromTokens"),
266 (140, "VarTokenizeFormatString"),
267 (141, "VarAdd"),
268 (142, "VarAnd"),
269 (143, "VarDiv"),
270 (144, "DllCanUnloadNow"),
271 (145, "DllGetClassObject"),
272 (146, "DispCallFunc"),
273 (147, "VariantChangeTypeEx"),
274 (148, "SafeArrayPtrOfIndex"),
275 (149, "SysStringByteLen"),
276 (150, "SysAllocStringByteLen"),
277 (151, "DllRegisterServer"),
278 (152, "VarEqv"),
279 (153, "VarIdiv"),
280 (154, "VarImp"),
281 (155, "VarMod"),
282 (156, "VarMul"),
283 (157, "VarOr"),
284 (158, "VarPow"),
285 (159, "VarSub"),
286 (160, "CreateTypeLib"),
287 (161, "LoadTypeLib"),
288 (162, "LoadRegTypeLib"),
289 (163, "RegisterTypeLib"),
290 (164, "QueryPathOfRegTypeLib"),
291 (165, "LHashValOfNameSys"),
292 (166, "LHashValOfNameSysA"),
293 (167, "VarXor"),
294 (168, "VarAbs"),
295 (169, "VarFix"),
296 (170, "OaBuildVersion"),
297 (171, "ClearCustData"),
298 (172, "VarInt"),
299 (173, "VarNeg"),
300 (174, "VarNot"),
301 (175, "VarRound"),
302 (176, "VarCmp"),
303 (177, "VarDecAdd"),
304 (178, "VarDecDiv"),
305 (179, "VarDecMul"),
306 (180, "CreateTypeLib2"),
307 (181, "VarDecSub"),
308 (182, "VarDecAbs"),
309 (183, "LoadTypeLibEx"),
310 (184, "SystemTimeToVariantTime"),
311 (185, "VariantTimeToSystemTime"),
312 (186, "UnRegisterTypeLib"),
313 (187, "VarDecFix"),
314 (188, "VarDecInt"),
315 (189, "VarDecNeg"),
316 (190, "VarDecFromUI1"),
317 (191, "VarDecFromI2"),
318 (192, "VarDecFromI4"),
319 (193, "VarDecFromR4"),
320 (194, "VarDecFromR8"),
321 (195, "VarDecFromDate"),
322 (196, "VarDecFromCy"),
323 (197, "VarDecFromStr"),
324 (198, "VarDecFromDisp"),
325 (199, "VarDecFromBool"),
326 (200, "GetErrorInfo"),
327 (201, "SetErrorInfo"),
328 (202, "CreateErrorInfo"),
329 (203, "VarDecRound"),
330 (204, "VarDecCmp"),
331 (205, "VarI2FromI1"),
332 (206, "VarI2FromUI2"),
333 (207, "VarI2FromUI4"),
334 (208, "VarI2FromDec"),
335 (209, "VarI4FromI1"),
336 (210, "VarI4FromUI2"),
337 (211, "VarI4FromUI4"),
338 (212, "VarI4FromDec"),
339 (213, "VarR4FromI1"),
340 (214, "VarR4FromUI2"),
341 (215, "VarR4FromUI4"),
342 (216, "VarR4FromDec"),
343 (217, "VarR8FromI1"),
344 (218, "VarR8FromUI2"),
345 (219, "VarR8FromUI4"),
346 (220, "VarR8FromDec"),
347 (221, "VarDateFromI1"),
348 (222, "VarDateFromUI2"),
349 (223, "VarDateFromUI4"),
350 (224, "VarDateFromDec"),
351 (225, "VarCyFromI1"),
352 (226, "VarCyFromUI2"),
353 (227, "VarCyFromUI4"),
354 (228, "VarCyFromDec"),
355 (229, "VarBstrFromI1"),
356 (230, "VarBstrFromUI2"),
357 (231, "VarBstrFromUI4"),
358 (232, "VarBstrFromDec"),
359 (233, "VarBoolFromI1"),
360 (234, "VarBoolFromUI2"),
361 (235, "VarBoolFromUI4"),
362 (236, "VarBoolFromDec"),
363 (237, "VarUI1FromI1"),
364 (238, "VarUI1FromUI2"),
365 (239, "VarUI1FromUI4"),
366 (240, "VarUI1FromDec"),
367 (241, "VarDecFromI1"),
368 (242, "VarDecFromUI2"),
369 (243, "VarDecFromUI4"),
370 (244, "VarI1FromUI1"),
371 (245, "VarI1FromI2"),
372 (246, "VarI1FromI4"),
373 (247, "VarI1FromR4"),
374 (248, "VarI1FromR8"),
375 (249, "VarI1FromDate"),
376 (250, "VarI1FromCy"),
377 (251, "VarI1FromStr"),
378 (252, "VarI1FromDisp"),
379 (253, "VarI1FromBool"),
380 (254, "VarI1FromUI2"),
381 (255, "VarI1FromUI4"),
382 (256, "VarI1FromDec"),
383 (257, "VarUI2FromUI1"),
384 (258, "VarUI2FromI2"),
385 (259, "VarUI2FromI4"),
386 (260, "VarUI2FromR4"),
387 (261, "VarUI2FromR8"),
388 (262, "VarUI2FromDate"),
389 (263, "VarUI2FromCy"),
390 (264, "VarUI2FromStr"),
391 (265, "VarUI2FromDisp"),
392 (266, "VarUI2FromBool"),
393 (267, "VarUI2FromI1"),
394 (268, "VarUI2FromUI4"),
395 (269, "VarUI2FromDec"),
396 (270, "VarUI4FromUI1"),
397 (271, "VarUI4FromI2"),
398 (272, "VarUI4FromI4"),
399 (273, "VarUI4FromR4"),
400 (274, "VarUI4FromR8"),
401 (275, "VarUI4FromDate"),
402 (276, "VarUI4FromCy"),
403 (277, "VarUI4FromStr"),
404 (278, "VarUI4FromDisp"),
405 (279, "VarUI4FromBool"),
406 (280, "VarUI4FromI1"),
407 (281, "VarUI4FromUI2"),
408 (282, "VarUI4FromDec"),
409 (283, "BSTR_UserSize"),
410 (284, "BSTR_UserMarshal"),
411 (285, "BSTR_UserUnmarshal"),
412 (286, "BSTR_UserFree"),
413 (287, "VARIANT_UserSize"),
414 (288, "VARIANT_UserMarshal"),
415 (289, "VARIANT_UserUnmarshal"),
416 (290, "VARIANT_UserFree"),
417 (291, "LPSAFEARRAY_UserSize"),
418 (292, "LPSAFEARRAY_UserMarshal"),
419 (293, "LPSAFEARRAY_UserUnmarshal"),
420 (294, "LPSAFEARRAY_UserFree"),
421 (295, "LPSAFEARRAY_Size"),
422 (296, "LPSAFEARRAY_Marshal"),
423 (297, "LPSAFEARRAY_Unmarshal"),
424 (298, "VarDecCmpR8"),
425 (299, "VarCyAdd"),
426 (300, "DllUnregisterServer"),
427 (301, "OACreateTypeLib2"),
428 (303, "VarCyMul"),
429 (304, "VarCyMulI4"),
430 (305, "VarCySub"),
431 (306, "VarCyAbs"),
432 (307, "VarCyFix"),
433 (308, "VarCyInt"),
434 (309, "VarCyNeg"),
435 (310, "VarCyRound"),
436 (311, "VarCyCmp"),
437 (312, "VarCyCmpR8"),
438 (313, "VarBstrCat"),
439 (314, "VarBstrCmp"),
440 (315, "VarR8Pow"),
441 (316, "VarR4CmpR8"),
442 (317, "VarR8Round"),
443 (318, "VarCat"),
444 (319, "VarDateFromUdateEx"),
445 (322, "GetRecordInfoFromGuids"),
446 (323, "GetRecordInfoFromTypeInfo"),
447 (325, "SetVarConversionLocaleSetting"),
448 (326, "GetVarConversionLocaleSetting"),
449 (327, "SetOaNoCache"),
450 (329, "VarCyMulI8"),
451 (330, "VarDateFromUdate"),
452 (331, "VarUdateFromDate"),
453 (332, "GetAltMonthNames"),
454 (333, "VarI8FromUI1"),
455 (334, "VarI8FromI2"),
456 (335, "VarI8FromR4"),
457 (336, "VarI8FromR8"),
458 (337, "VarI8FromCy"),
459 (338, "VarI8FromDate"),
460 (339, "VarI8FromStr"),
461 (340, "VarI8FromDisp"),
462 (341, "VarI8FromBool"),
463 (342, "VarI8FromI1"),
464 (343, "VarI8FromUI2"),
465 (344, "VarI8FromUI4"),
466 (345, "VarI8FromDec"),
467 (346, "VarI2FromI8"),
468 (347, "VarI2FromUI8"),
469 (348, "VarI4FromI8"),
470 (349, "VarI4FromUI8"),
471 (360, "VarR4FromI8"),
472 (361, "VarR4FromUI8"),
473 (362, "VarR8FromI8"),
474 (363, "VarR8FromUI8"),
475 (364, "VarDateFromI8"),
476 (365, "VarDateFromUI8"),
477 (366, "VarCyFromI8"),
478 (367, "VarCyFromUI8"),
479 (368, "VarBstrFromI8"),
480 (369, "VarBstrFromUI8"),
481 (370, "VarBoolFromI8"),
482 (371, "VarBoolFromUI8"),
483 (372, "VarUI1FromI8"),
484 (373, "VarUI1FromUI8"),
485 (374, "VarDecFromI8"),
486 (375, "VarDecFromUI8"),
487 (376, "VarI1FromI8"),
488 (377, "VarI1FromUI8"),
489 (378, "VarUI2FromI8"),
490 (379, "VarUI2FromUI8"),
491 (401, "OleLoadPictureEx"),
492 (402, "OleLoadPictureFileEx"),
493 (411, "SafeArrayCreateVector"),
494 (412, "SafeArrayCopyData"),
495 (413, "VectorFromBstr"),
496 (414, "BstrFromVector"),
497 (415, "OleIconToCursor"),
498 (416, "OleCreatePropertyFrameIndirect"),
499 (417, "OleCreatePropertyFrame"),
500 (418, "OleLoadPicture"),
501 (419, "OleCreatePictureIndirect"),
502 (420, "OleCreateFontIndirect"),
503 (421, "OleTranslateColor"),
504 (422, "OleLoadPictureFile"),
505 (423, "OleSavePictureFile"),
506 (424, "OleLoadPicturePath"),
507 (425, "VarUI4FromI8"),
508 (426, "VarUI4FromUI8"),
509 (427, "VarI8FromUI8"),
510 (428, "VarUI8FromI8"),
511 (429, "VarUI8FromUI1"),
512 (430, "VarUI8FromI2"),
513 (431, "VarUI8FromR4"),
514 (432, "VarUI8FromR8"),
515 (433, "VarUI8FromCy"),
516 (434, "VarUI8FromDate"),
517 (435, "VarUI8FromStr"),
518 (436, "VarUI8FromDisp"),
519 (437, "VarUI8FromBool"),
520 (438, "VarUI8FromI1"),
521 (439, "VarUI8FromUI2"),
522 (440, "VarUI8FromUI4"),
523 (441, "VarUI8FromDec"),
524 (442, "RegisterTypeLibForUser"),
525 (443, "UnRegisterTypeLibForUser"),
526];
527
528pub fn imphash_resolve<S: AsRef<str>>(dll_name: S, ordinal: u32) -> String {
530 let dll = dll_name.as_ref().to_string().to_ascii_lowercase();
531
532 if dll == "ws2_32.dll" || dll == "wsock32.dll" {
533 return match WS2_32_ORDINALS.iter().cloned().collect::<HashMap<u32, &'static str>>().get(&ordinal) {
534 None => format!("ord{}", ordinal).to_string(),
535 Some(s) => s.to_string(),
536 };
537 }
538 else if dll == "oleaut32.dll" {
539 return match OLEAUT32_ORDINALS.iter().cloned().collect::<HashMap<u32, &'static str>>().get(&ordinal) {
540 None => format!("ord{}", ordinal).to_string(),
541 Some(s) => s.to_string(),
542 };
543 }
544
545 format!("ord{}", ordinal).to_string()
546}