Xiaodong Fu

127 papers A* 1A 4B 3C 8Misc 1Journal 73Unranked 35
YearRankTypeTitle / Venue / Authors
2026 J jnl
Future Gener. Comput. Syst.
Fengqin Ping, Xiaodong Fu, Shihai Zhao, Li Liu, Juncheng Pu, Jiaman Ding
2026 J jnl
Expert Syst. Appl.
Ruilong Yuan, Yong Feng, Nianbo Liu, Yingna Li, Xiaodong Fu
2026 J jnl
Knowl. Based Syst.
Nuo Xu, Yong Feng, Nianbo Liu, Ming Liu, Yingna Li, Xiaodong Fu
2026 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Wei Yin, Li Liu, Xiaodong Fu, Lijun Liu, Wei Peng
2026 J jnl
Pattern Recognit.
Lianyin Jia, Aoxiang Gao, Mengjuan Li, Xiaodong Fu, Haihe Zhou, Jiaman Ding
2026 J jnl
Int. J. Web Grid Serv.
Qianzhi Yin, Xiaodong Fu, Fei Dai, Li Liu, Yan Feng, Jiaman Ding
2025 conf
ISBRA (2)
Xinyue Xu, Wei Peng, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu
2025 J jnl
IEEE Access
Jiaman Ding, Jinyuan Yin, Lianyin Jia, Xiaodong Fu, Hongbin Wang
2025 conf
ICSOC (1)
Hedan Zheng, Xiaodong Fu, Zhizhong Liu, Li Liu, Jiaman Ding, Lianyin Jia
2025 J jnl
PeerJ Comput. Sci.
Senfu Ke, Xiaodong Fu, Jie Li
2025 J jnl
Neural Networks
Wei Peng, Yanhan Ma, Chunshan Li, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Jin Liu
2025 J jnl
Earth Sci. Informatics
Javid Hussain, Nafees Ali, Xiaodong Fu, Jian Chen, Sayed Muhammad Iqbal, Altaf Hussain, Hikmat Salam
2025 J jnl
IET Image Process.
Lanqing Ye, Li Liu, Xiaodong Fu, Lijun Liu, Wei Peng
2025 J jnl
Comput. Secur.
Yunfei Li, Xiaodong Fu, Li Liu, Jiaman Ding, Wei Peng, Lianyin Jia
2025 J jnl
IEEE Trans. Comput. Biol. Bioinform.
Wei Peng, Xinyue Xu, Jiangzhen Lin, Gong Chen, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2025 J jnl
Health Inf. Sci. Syst.
Wei Dai, Sifan Pang, Zhichen He, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2025 J jnl
J. Supercomput.
Shihai Zhao, Xiaodong Fu, Li Liu, Jie Li, Wei Peng, Jiaman Ding
2025 J jnl
J. Supercomput.
Jie Li, Wenbo Wang, Xiaodong Fu
2025 conf
BIBM
Ling Lin, Wei Peng, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2025 J jnl
Int. J. Mach. Learn. Cybern.
Jiaman Ding, Xiangyu Jiang, Lianyin Jia, Xiaodong Fu, Ying Jiang
2025 J jnl
Vis. Informatics
Li Liu, Jing Duan, Xiaodong Fu, Wei Peng, Lijun Liu
2024 J jnl
Comput. Networks
Wenxian Li, Yong Feng, Nianbo Liu, Yingna Li, Xiaodong Fu, Yongtao Yu
2024 J jnl
Sensors
LeCheng Li, Fei Dai, Bi Huang, Shuai Wang, Wanchun Dou, Xiaodong Fu
2024 J jnl
Future Gener. Comput. Syst.
Shihai Zhao, Juncheng Pu, Xiaodong Fu, Li Liu, Fei Dai
2024 J jnl
Int. J. Gaming Comput. Mediat. Simulations
Runzhuo Lu, Xiaodong Fu, Yan Feng
2024 conf
ISBRA (2)
Wei Peng, Zhengnan Zhou, Wei Dai, Xinping Xu, Xiaodong Fu, Li Liu, Lijun Liu
2024 J jnl
IEEE Trans. Serv. Comput.
Juncheng Pu, Xiaodong Fu, Hai Dong, Pengcheng Zhang, Li Liu
2024 conf
ISBRA (2)
Wei Peng, Jiangzhen Lin, Wei Dai, Gong Chen, Xiaodong Fu, Li Liu, Lijun Liu
2024 J jnl
Remote. Sens.
Nafees Ali, Jian Chen, Xiaodong Fu, Rashid Ali, Muhammad Afaq Hussain, Hamza Daud, Javid Hussain, Ali Altalbe
2024 J jnl
Data Min. Knowl. Discov.
Xinran Wu, Kun Yue, Liang Duan, Xiaodong Fu
2024 J jnl
Multim. Tools Appl.
Yunzhu Wang, Li Liu, Xiaodong Fu, Lijun Liu
2024 J jnl
Inf. Sci.
Jiaman Ding, Yihang Zhang, Lianyin Jia, Xiaodong Fu, Ying Jiang
2024 conf
BIBM
Wei Peng, Zhihao Ping, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2024 J jnl
Health Inf. Sci. Syst.
Fangxu Chen, Wei Peng, Wei Dai, Shoulin Wei, Xiaodong Fu, Li Liu, Lijun Liu
2024 J jnl
Int. J. Web Inf. Syst.
Yahan Xiong, Xiaodong Fu
2023 conf
BIBM
Wei Peng, Zhihao Zhang, Wei Dai, Xiaodong Fu, Li Liu, Lijun Liu, Ning Yu
2023 J jnl
Future Gener. Comput. Syst.
Guozhi Liu, Fei Dai, Xiaolong Xu, Xiaodong Fu, Wanchun Dou, Neeraj Kumar, Muhammad Bilal
2023 J jnl
Mach. Vis. Appl.
Yong Wei, Li Liu, Xiaodong Fu, Lijun Liu, Wei Peng
2023 J jnl
Comput. Graph. Forum
Juncheng Pu, Li Liu, Xiaodong Fu, Zhuo Su, Lijun Liu, Wei Peng
2023 J jnl
Robotica
Xiaodong Fu, Haiping Ai, Li Chen
2023 J jnl
Comput. Biol. Medicine
Kaiqi Wang, Li Liu, Xiaodong Fu, Lijun Liu, Wei Peng
2022 A conf
ICWS
Xiaoning Sun, Peng Chen, Mengxuan Dai, Yunni Xia, Wanbo Zheng, Jianqi Li, Hong Xie, Xiaodong Fu, Kai Peng, Xianhua Niu, Juan Chen
2022 J jnl
Digit. Commun. Networks
Tingyan Long, Yong Ma, Lei Wu, Yunni Xia, Ning Jiang, Jianqi Li, Xiaodong Fu, Xiangmi You, Bo Zhang
2022 J jnl
J. Cloud Comput.
Xifeng Xu, Yunni Xia, Feng Zeng, Fan Li, Hong Xie, Xiaodong Fu, Mengdi Wang
2022 J jnl
IEEE Access
Jiaman Ding, Zhou Shujie, Runxin Li, Xiaodong Fu, Lianyin Jia
2022 conf
BlockSys
Xinxin Qi, Xiaodong Fu, Fei Dai, Li Liu, Lijun Liu, Jiaman Ding, Wei Peng
2022 A conf
ICWS
Jiale Zhao, Mengxuan Dai, Yunni Xia, Yong Ma, Meibin He, Kai Peng, Jianqi Li, Fan Li, Xiaodong Fu
2022 conf
BIBM
Wei Peng, Piaofang Yu, Wei Dai, Xiaodong Fu, Li Liu, Yi Pan
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Xuan Xiao, Yong Ma, Yunni Xia, MengChu Zhou, Xin Luo, Xu Wang, Xiaodong Fu, Wei Wei, Ning Jiang
2022 J jnl
Int. J. Uncertain. Fuzziness Knowl. Based Syst.
Yirong Kan, Kun Yue, Hao Wu, Xiaodong Fu, Zhengbao Sun
2022 J jnl
Comput. Methods Programs Biomed.
Anna Guan, Li Liu, Xiaodong Fu, Lijun Liu
2021 B conf
SMC
Yanmao Zhou, Wei Wei, Yunni Xia, Ning Jiang, Xingli Zhong, Xiaodong Fu, Peng Chen
2021 conf
BlockSys
Huajie Wang, Jin Gan, Yong Feng, Yingna Li, Xiaodong Fu
2021 J jnl
Expert Syst. Appl.
Zhiwei Qi, Kun Yue, Liang Duan, Jiahui Wang, Shaojie Qiao, Xiaodong Fu
2021 J jnl
J. Syst. Archit.
Chunrong Wu, Qinglan Peng, Yunni Xia, Yong Ma, Wangbo Zheng, Hong Xie, Shanchen Pang, Fan Li, Xiaodong Fu, Xiaobo Li, Wei Liu
2021 J jnl
Clust. Comput.
Jia Hao, Kun Yue, Liang Duan, Binbin Zhang, Xiaodong Fu
2021 J jnl
IEEE Trans. Serv. Comput.
Xiaodong Fu, Kun Yue, Li Liu, Yong Feng, Lijun Liu
2021 J jnl
Appl. Intell.
Jia Hao, Kun Yue, Binbin Zhang, Liang Duan, Xiaodong Fu
2020 conf
BlockSys
Dunfeng Li, Yong Feng, Yao Xiao, Mingjing Tang, Xiaodong Fu
2020 J jnl
Comput. Methods Programs Biomed.
Lijun Liu, Lizhen Wang, Qingsong Huang, Lihua Zhou, Xiaodong Fu, Li Liu
2020 ed.
BlockSys
Zibin Zheng, Hong-Ning Dai, Xiaodong Fu, Benhui Chen
2020 J jnl
KSII Trans. Internet Inf. Syst.
Yang Li, Gaochao Xu, Jiaqi Ge, Peng Liu, Xiaodong Fu
2020 B conf
WCNC
Yang Li, Gaochao Xu, Jiaqi Ge, Peng Liu, Xiaodong Fu, Zhenjun Jin
2020 A conf
ICWS
Xiaodong Fu, Li Liu, Lijun Liu, Yong Feng, Kun Yue
2020 conf
BlockSys
Yong Feng, Yao Xiao, Dunfeng Li, Xiaodong Fu
2020 conf
BlockSys
Biaoqi Li, Xiaodong Fu, Kun Yue, Li Liu, Lijun Liu, Yong Feng
2019 J jnl
IEEE Access
Yang Li, Gaochao Xu, Jiaqi Ge, Xiaodong Fu, Peng Liu
2019 J jnl
Future Internet
Ziqi Liu, Gaochao Xu, Peng Liu, Xiaodong Fu, Yang Liu
2019 J jnl
Int. J. Distributed Sens. Networks
Min Yang, Yong Feng, Xiaodong Fu, Qian Qian
2019 J jnl
J. Intell. Fuzzy Syst.
Yuxiang Du, Qian Sheng, Xiaodong Fu, Hua Tang, Zhenping Zhang, Xin Zhao
2019 conf
OFC
Shifeng Ding, Xiaodong Fu, Boping Jiang, Sanjay K. Bose, Gangxiang Shen
2019 J jnl
Multim. Tools Appl.
Li Liu, Jianhong Zhang, Xiaodong Fu, Lijun Liu, Qingsong Huang
2018 J jnl
J. Biomed. Informatics
Lijun Liu, Li Liu, Xiaodong Fu, Qingsong Huang, Xianwen Zhang, Yin Zhang
2018 J jnl
Intell. Autom. Soft Comput.
Jie Liu, Xiaodong Fu, Jin Liu, Yunchuan Sun
2018 J jnl
Appl. Intell.
Weiyi Liu, Kun Yue, Hao Wu, Xiaodong Fu, Zhijian Zhang, Weipeng Huang
2018 conf
ICTON
Yongcheng Li, Kai Xu, Xiaodong Fu, Sanjay K. Bose, Gangxiang Shen
2017 B conf
GLOBECOM
Yong Feng, Nianbo Liu, Feng Wang, Qian Qian, Xiaodong Fu
2017 J jnl
Multim. Tools Appl.
Li Liu, Zhuo Su, Xiaodong Fu, Lijun Liu, Ruomei Wang, Xiaonan Luo
2017 J jnl
Neurocomputing
Kun Yue, Hao Wu, Xiaodong Fu, Juan Xu, Zidu Yin, Weiyi Liu
2017 J jnl
Ann. des Télécommunications
Junjie Pang, Gaochao Xu, Xiaodong Fu, Kuo Zhao
2017 J jnl
IEEE Access
Junjie Pang, Gaochao Xu, Xiaodong Fu
2016 A conf
ICWS
Xiaodong Fu, Kun Yue, Li Liu, Lijun Liu
2016 J jnl
Remote. Sens.
Xin Jing, Xi Shao, Changyong Cao, Xiaodong Fu, Lei Yan
2016 conf
WAIM Workshops
Renshang Gao, Kun Yue, Hao Wu, Binbin Zhang, Xiaodong Fu
2016 J jnl
Int. J. Artif. Intell. Tools
Weiyi Liu, Kun Yue, Xiaodong Fu, Zidu Yin, Jin Li
2016 conf
ICTON
Changyuan Yu, Yi Yu, Xiaodong Fu
2016 C conf
CollaborateCom
Hong Wu, Kun Yue, Xiaodong Fu, Yujie Wang, Weiyi Liu
2016 conf
WAIM Workshops
Ying Chen, Xiaodong Fu, Kun Yue, Li Liu, Lijun Liu
2015 conf
IEEE WISA
Xiaosa Wang, Xiaodong Fu, Li Liu, Qingsong Huang, Kun Yue
2015 conf
ITQM
Weihua Li, Chunyan Yang, Xiaodong Fu
2015 J jnl
Frontiers Comput. Sci.
Xiaodong Fu, Kun Yue, Li Liu, Ping Zou, Yong Feng
2015 J jnl
Soft Comput.
Kun Yue, Wenhua Qian, Xiaodong Fu, Jin Li, Weiyi Liu
2015 J jnl
Int. J. Wirel. Mob. Comput.
Jing Zhang, Han Yan, Bin Wang, Jianping Wang, Xiaodong Fu
2015 J jnl
J. Digit. Imaging
Lijun Liu, Li Liu, Xiaodong Fu, Qingsong Huang, Yin Zhang, Qiaoyi Luo, Xin Xiong
2015 conf
ICSS
Jie Liu, Xiaodong Fu, Li Liu, Kun Yue
2015 J jnl
计算机科学
Xin Yue, Zhenhong Shang, Zhenping Qiang, Hui Liu, Xiaodong Fu, Zhihua Zhang
2014 J jnl
J. Softw.
Xiaobao Li, Xiaoyan Liu, Xiaodong Fu, Feng Wang
2013 C conf
APWeb
Qiyu Fang, Kun Yue, Xiaodong Fu, Hong Wu, Weiyi Liu
2013 conf
CBD
Yongying Xia, Xiaodong Fu, Peng Lin
2013 J jnl
J. Softw.
Gaochao Xu, Yushuang Dong, Xiaodong Fu, Yan Ding, Jia Zhao, Xinzhong Liu
2013 C conf
APWeb
Ping Zhang, Kun Yue, Jin Li, Xiaodong Fu, Weiyi Liu
2012 conf
MSN
Ting Li, Yong Feng, Feng Wang, Xiaodong Fu
2012 conf
APWeb Workshops
Xiaodong Fu, Kun Yue, Ping Zou, Feng Wang, Kaifan Ji
2012 C conf
APWeb
Yingbo Liu, Feng Wang, Hui Deng, Xiaodong Fu, Kaifan Ji
2012 J jnl
J. Comput.
Xiaozhong Geng, Gaochao Xu, Xiaodong Fu, Yuan Zhang
2012 Misc conf
TASE
Xiaodong Fu, Feng Wang, Xiaoyan Liu, Kaifan Ji, Ping Zou
2012 conf
MSN
Yong Feng, Feng Wang, Hui Deng, Xiaodong Fu
2012 J jnl
Int. J. Distributed Sens. Networks
Yong Feng, Ke Liu, Qian Qian, Feng Wang, Xiaodong Fu
2010 C conf
APSCC
Xiaodong Fu, Ping Zou, Yuqian Ma, Ying Jiang, Kun Yue
2010 conf
FCST
Xinzhong Liu, Gaochao Xu, Xiaodong Fu, Yushuang Dong
2010 conf
FCST
Ying Jiang, Ying-Na Li, Xiaodong Fu
2008 conf
NCM (1)
Zhiguo Zhou, Wenyin Li, Tong Li, Chunyan Deng, Xiaodong Fu
2008 C conf
SNPD
Jinxin He, Gaochao Xu, Xiaodong Fu, Zhiguo Zhou, Jianhua Jiang
2007 conf
SNPD (2)
Jinxin He, Gaochao Xu, Xiaodong Fu, Zhiguo Zhou
2005 J jnl
Comput. Commun.
Xiaodong Fu, Vijay Karamcheti
2004 C conf
IPCCC
Xiaodong Fu, Vijay Karamcheti
2003
Xiaodong Fu
2003 C conf
DAIS
Xiaodong Fu, Vijay Karamcheti
2001 conf
Active Media Technology
Weihua Li, Xiaodong Fu
2001 conf
USITS
Xiaodong Fu, Weisong Shi, Anatoly Akkerman, Vijay Karamcheti
2000 conf
CANPC
Xiaodong Fu, Hua Wang, Vijay Karamcheti
1999 A* conf
VR
Ying Zhu, Jim X. Chen, Xiaodong Fu, Donna J. Quammen
1999 conf
DIS-RT
Jim X. Chen, Christopher J. Dede, Xiaodong Fu, Yonggao Yang
1999 J jnl
Comput. Sci. Eng.
Jim X. Chen, Xiaodong Fu
1999 conf
DIS-RT
Jim X. Chen, Edward J. Wegman, Xiaodong Fu, Yonggao Yang
1999 J jnl
ACM Trans. Model. Comput. Simul.
Jim X. Chen, Xiaodong Fu, Edward J. Wegman
1997 conf
APDC
Xiaodong Fu, Dingxing Wang, Weimin Zheng
redb/ext/spoof_check.py
← Index redb/ext/spoof_check.py python
import copy
import struct
from enum import Enum

"""
Checks that the metadata within a file's Rich header does not contradict the
other metadata contained within it.

References:
    https://gist.github.com/skochinsky/07c8e95e33d9429d81a75622b5d24c8b
    https://www.sec.in.tum.de/i20/publications/finding-the-needle-a-study-of-
    the-pe32-rich-header-and-respective-malware-triage
"""

KNOWN_PRODUCT_IDS = {
    0: "Unknown",
    1: "Import0",
    2: "Linker510",
    3: "Cvtomf510",
    4: "Linker600",
    5: "Cvtomf600",
    6: "Cvtres500",
    7: "Utc11_Basic",
    8: "Utc11_C",
    9: "Utc12_Basic",
    10: "Utc12_C",
    11: "Utc12_CPP",
    12: "AliasObj60",
    13: "VisualBasic60",
    14: "Masm613",
    15: "Masm710",
    16: "Linker511",
    17: "Cvtomf511",
    18: "Masm614",
    19: "Linker512",
    20: "Cvtomf512",
    21: "Utc12_C_Std",
    22: "Utc12_CPP_Std",
    23: "Utc12_C_Book",
    24: "Utc12_CPP_Book",
    25: "Implib700",
    26: "Cvtomf700",
    27: "Utc13_Basic",
    28: "Utc13_C",
    29: "Utc13_CPP",
    30: "Linker610",
    31: "Cvtomf610",
    32: "Linker601",
    33: "Cvtomf601",
    34: "Utc12_1_Basic",
    35: "Utc12_1_C",
    36: "Utc12_1_CPP",
    37: "Linker620",
    38: "Cvtomf620",
    39: "AliasObj70",
    40: "Linker621",
    41: "Cvtomf621",
    42: "Masm615",
    43: "Utc13_LTCG_C",
    44: "Utc13_LTCG_CPP",
    45: "Masm620",
    46: "ILAsm100",
    47: "Utc12_2_Basic",
    48: "Utc12_2_C",
    49: "Utc12_2_CPP",
    50: "Utc12_2_C_Std",
    51: "Utc12_2_CPP_Std",
    52: "Utc12_2_C_Book",
    53: "Utc12_2_CPP_Book",
    54: "Implib622",
    55: "Cvtomf622",
    56: "Cvtres501",
    57: "Utc13_C_Std",
    58: "Utc13_CPP_Std",
    59: "Cvtpgd1300",
    60: "Linker622",
    61: "Linker700",
    62: "Export622",
    63: "Export700",
    64: "Masm700",
    65: "Utc13_POGO_I_C",
    66: "Utc13_POGO_I_CPP",
    67: "Utc13_POGO_O_C",
    68: "Utc13_POGO_O_CPP",
    69: "Cvtres700",
    70: "Cvtres710p",
    71: "Linker710p",
    72: "Cvtomf710p",
    73: "Export710p",
    74: "Implib710p",
    75: "Masm710p",
    76: "Utc1310p_C",
    77: "Utc1310p_CPP",
    78: "Utc1310p_C_Std",
    79: "Utc1310p_CPP_Std",
    80: "Utc1310p_LTCG_C",
    81: "Utc1310p_LTCG_CPP",
    82: "Utc1310p_POGO_I_C",
    83: "Utc1310p_POGO_I_CPP",
    84: "Utc1310p_POGO_O_C",
    85: "Utc1310p_POGO_O_CPP",
    86: "Linker624",
    87: "Cvtomf624",
    88: "Export624",
    89: "Implib624",
    90: "Linker710",
    91: "Cvtomf710",
    92: "Export710",
    93: "Implib710",
    94: "Cvtres710",
    95: "Utc1310_C",
    96: "Utc1310_CPP",
    97: "Utc1310_C_Std",
    98: "Utc1310_CPP_Std",
    99: "Utc1310_LTCG_C",
    100: "Utc1310_LTCG_CPP",
    101: "Utc1310_POGO_I_C",
    102: "Utc1310_POGO_I_CPP",
    103: "Utc1310_POGO_O_C",
    104: "Utc1310_POGO_O_CPP",
    105: "AliasObj710",
    106: "AliasObj710p",
    107: "Cvtpgd1310",
    108: "Cvtpgd1310p",
    109: "Utc1400_C",
    110: "Utc1400_CPP",
    111: "Utc1400_C_Std",
    112: "Utc1400_CPP_Std",
    113: "Utc1400_LTCG_C",
    114: "Utc1400_LTCG_CPP",
    115: "Utc1400_POGO_I_C",
    116: "Utc1400_POGO_I_CPP",
    117: "Utc1400_POGO_O_C",
    118: "Utc1400_POGO_O_CPP",
    119: "Cvtpgd1400",
    120: "Linker800",
    121: "Cvtomf800",
    122: "Export800",
    123: "Implib800",
    124: "Cvtres800",
    125: "Masm800",
    126: "AliasObj800",
    127: "PhoenixPrerelease",
    128: "Utc1400_CVTCIL_C",
    129: "Utc1400_CVTCIL_CPP",
    130: "Utc1400_LTCG_MSIL",
    131: "Utc1500_C",
    132: "Utc1500_CPP",
    133: "Utc1500_C_Std",
    134: "Utc1500_CPP_Std",
    135: "Utc1500_CVTCIL_C",
    136: "Utc1500_CVTCIL_CPP",
    137: "Utc1500_LTCG_C",
    138: "Utc1500_LTCG_CPP",
    139: "Utc1500_LTCG_MSIL",
    140: "Utc1500_POGO_I_C",
    141: "Utc1500_POGO_I_CPP",
    142: "Utc1500_POGO_O_C",
    143: "Utc1500_POGO_O_CPP",
    144: "Cvtpgd1500",
    145: "Linker900",
    146: "Export900",
    147: "Implib900",
    148: "Cvtres900",
    149: "Masm900",
    150: "AliasObj900",
    151: "Resource900",
    152: "AliasObj1000",
    154: "Cvtres1000",
    155: "Export1000",
    156: "Implib1000",
    157: "Linker1000",
    158: "Masm1000",
    170: "Utc1600_C",
    171: "Utc1600_CPP",
    172: "Utc1600_CVTCIL_C",
    173: "Utc1600_CVTCIL_CPP",
    174: "Utc1600_LTCG_C ",
    175: "Utc1600_LTCG_CPP",
    176: "Utc1600_LTCG_MSIL",
    177: "Utc1600_POGO_I_C",
    178: "Utc1600_POGO_I_CPP",
    179: "Utc1600_POGO_O_C",
    180: "Utc1600_POGO_O_CPP",
    183: "Linker1010",
    184: "Export1010",
    185: "Implib1010",
    186: "Cvtres1010",
    187: "Masm1010",
    188: "AliasObj1010",
    199: "AliasObj1100",
    201: "Cvtres1100",
    202: "Export1100",
    203: "Implib1100",
    204: "Linker1100",
    205: "Masm1100",
    206: "Utc1700_C",
    207: "Utc1700_CPP",
    208: "Utc1700_CVTCIL_C",
    209: "Utc1700_CVTCIL_CPP",
    210: "Utc1700_LTCG_C ",
    211: "Utc1700_LTCG_CPP",
    212: "Utc1700_LTCG_MSIL",
    213: "Utc1700_POGO_I_C",
    214: "Utc1700_POGO_I_CPP",
    215: "Utc1700_POGO_O_C",
    216: "Utc1700_POGO_O_CPP",
    219: "Cvtres1200",
    220: "Export1200",
    221: "Implib1200",
    222: "Linker1200",
    223: "Masm1200",
    # Speculation
    224: "AliasObj1200",
    237: "Cvtres1210",
    238: "Export1210",
    239: "Implib1210",
    240: "Linker1210",
    241: "Masm1210",
    # Speculation
    242: "Utc1810_C",
    243: "Utc1810_CPP",
    244: "Utc1810_CVTCIL_C",
    245: "Utc1810_CVTCIL_CPP",
    246: "Utc1810_LTCG_C ",
    247: "Utc1810_LTCG_CPP",
    248: "Utc1810_LTCG_MSIL",
    249: "Utc1810_POGO_I_C",
    250: "Utc1810_POGO_I_CPP",
    251: "Utc1810_POGO_O_C",
    252: "Utc1810_POGO_O_CPP",
    255: "Cvtres1400",
    256: "Export1400",
    257: "Implib1400",
    258: "Linker1400",
    259: "Masm1400",
    260: "Utc1900_C",
    261: "Utc1900_CPP",
    # Speculation
    262: "Utc1900_CVTCIL_C",
    263: "Utc1900_CVTCIL_CPP",
    264: "Utc1900_LTCG_C ",
    265: "Utc1900_LTCG_CPP",
    266: "Utc1900_LTCG_MSIL",
    267: "Utc1900_POGO_I_C",
    268: "Utc1900_POGO_I_CPP",
    269: "Utc1900_POGO_O_C",
    270: "Utc1900_POGO_O_CPP",
}


class Result(Enum):
    VALID = 0
    INVALID = 1
    UNABLE_TO_PARSE = 2


def _rol(val, num):
    """Rotates val to the left by num bits."""
    return ((val << (num % 32)) & 0xFFFFFFFF) | (val >> (32 - (num % 32)))


def checksum_test(pe, rich_header):
    """Tests that the Rich header checksum is valid.

    Computes what the Rich header checksum should be. If the Rich header
    contains a different checksum value, this function returns INVALID
    This indicates that either the Rich header or MS-DOS stub has been modified

    The Rich header checksum is computed from the following:
        Length of the MS-DOS stub
        Contents of the MS-DOS stub, with e_lfanew zeroed out
        Rich header @Comp.IDs and lowest 5 bits of each count
    """
    if rich_header is None:
        rich_header = {}
    # Checksum stored in Rich header
    rich_checksum = rich_header.get("checksum", None)

    # Get DOS header data
    if pe.DOS_HEADER.e_lfanew > len(pe.__data__):
        return Result.UNABLE_TO_PARSE
    data = pe.__data__[: pe.DOS_HEADER.e_lfanew]

    # Get start marker
    mask = 0x536E6144  # DanS (little-endian)
    start_marker = struct.pack(
        "<LLLL", rich_checksum ^ mask, rich_checksum, rich_checksum, rich_checksum
    )
    if not len(start_marker):
        return Result.UNABLE_TO_PARSE

    # Get index of start marker
    start_index = data.find(start_marker)
    if start_index == -1:
        return Result.UNABLE_TO_PARSE

    # Get list of @Comp.IDs and counts from Rich header
    # Elements in rich_fields at even indices are @Comp.IDs
    # Elements in rich_fields at odd indices are counts
    rich_fields = copy.deepcopy(rich_header.get("values", None))
    if len(rich_fields) % 2 != 0:
        return Result.UNABLE_TO_PARSE

    # Compute cd as MS-DOS stub portion of checksum
    # Zero out e_lfanew from 0x3c to 0x3f
    cd = 0
    for i in range(start_index):
        if i >= 0x3C and i <= 0x3F:
            cd += _rol(0, i)
        else:
            cd += _rol(data[i], i)

    # Compute cd as Rich header portion of checksum
    cr = 0
    while len(rich_fields):
        compid = rich_fields.pop(0)
        count = rich_fields.pop(0)
        cr += _rol(compid, count & 0x1F)

    # Compute checksum from MS-DOS stub start index, cd, cr
    # Only keep lowest 32 bits
    checksum = (start_index + cd + cr) & 0xFFFFFFFF

    # Compare computed checksum with the checksum in the Rich header
    if checksum != rich_checksum:
        return Result.INVALID
    else:
        return Result.VALID


def duplicate_test(pe, rich_header):
    """Checks for duplicate @Comp.IDs in the Rich header.

    If the Rich header contains duplicate entries, returns INVALID
    This indicates that the Rich header has been modified
    """
    if rich_header is None:
        rich_header = {}

    # Get list of @Comp.IDs and counts from Rich header
    # Elements in rich_fields at even indices are @Comp.IDs
    # Elements in rich_fields at odd indices are counts
    rich_fields = copy.deepcopy(rich_header.get("values", None))
    if len(rich_fields) % 2 != 0:
        return Result.UNABLE_TO_PARSE

    # Get a list of @Comp.IDs in rich_fields
    compids = []
    for i in range(len(rich_fields)):
        if i % 2 == 0:
            compids.append(rich_fields[i])

    # Check if any @Comp.IDs are duplicates
    if len(compids) != len(set(compids)):
        return Result.INVALID

    return Result.VALID


def linker_test(pe, rich_header):
    """Checks that the Rich and PE header linker versions do not conflict.

    Certain Rich Header ProdIDs correspond to linker versions
    Although they are undocumented, we have used prior research as well as our
    own to determine many of them
    There are likely more linker version ProdIDs that we have not identified

    If the linker versions conflict, this function returns INVALID
    This indicates that the Rich header or PE header has been modified
    """
    if rich_header is None:
        rich_header = {}

    # Get list of @Comp.IDs and counts from Rich header
    # Elements in rich_fields at even indices are @Comp.IDs
    # Elements in rich_fields at odd indices are counts
    rich_fields = copy.deepcopy(rich_header.get("values", None))
    if len(rich_fields) % 2 != 0:
        return Result.UNABLE_TO_PARSE

    # Get list of ProdIDs from rich_fields
    prodids = []
    for i in range(len(rich_fields)):
        if i % 2 == 0:
            prodids.append(rich_fields[i] >> 16)

    # Parse major and minor linker versions from PE header
    pe_major = pe.OPTIONAL_HEADER.MajorLinkerVersion
    pe_minor = pe.OPTIONAL_HEADER.MinorLinkerVersion

    # Iterate over Rich header ProdIDs
    found_linker = False
    for prodid in prodids:

        # Only interested in ProdIDs that correspond to linker versions
        if KNOWN_PRODUCT_IDS.get(prodid) is None:
            continue
        prodid_name = KNOWN_PRODUCT_IDS[prodid]
        if not prodid_name.startswith("Linker"):
            continue

        found_linker = True

        # Parse major and minor linker version from ProdID
        prodid_name = prodid_name[6:]
        if prodid_name.endswith("p"):
            prodid_name = prodid_name[:-1]
        rich_major = int(prodid_name[:-2])
        rich_minor = int(prodid_name[-2:])

        # Check whether the Rich and PE linker versions match
        if pe_major == rich_major and pe_minor == rich_minor:
            return Result.VALID

    if not found_linker:
        return Result.UNABLE_TO_PARSE

    return Result.INVALID


def import_count_test(pe, rich_header):
    """Checks that import0 does not conflict with the IAT import count.

    The Rich header contains a ProdID called import0
    It is related to the number of imports in the IAT, but we are unsure how
    It is never less than the number of imports in the IAT

    If import0 is less than IAT import count, this function returns INVALID
    This indicates that the Rich header or IAT has been modified
    """
    if rich_header is None:
        rich_header = {}

    # Check whether the file has an IAT
    if not hasattr(pe, "DIRECTORY_ENTRY_IMPORT"):
        return Result.UNABLE_TO_PARSE

    # Get the number of imports in the IAT
    iat_count = 0
    for entry in pe.DIRECTORY_ENTRY_IMPORT:
        for imported_function in entry.imports:
            iat_count += 1

    # Get list of @Comp.IDs and counts from Rich header
    # Elements in rich_fields at even indices are @Comp.IDs
    # Elements in rich_fields at odd indices are counts
    rich_fields = copy.deepcopy(rich_header.get("values", None))
    if len(rich_fields) % 2 != 0:
        return Result.INVALID

    # Get @Comp.ID 65536 (ProdID Import0)
    import0_count = None
    while len(rich_fields):
        compid = rich_fields.pop(0)
        count = rich_fields.pop(0)
        if compid == 65536:
            import0_count = count

    # Legitimate files never have import0_count < iat_count
    if import0_count is None:
        return Result.VALID

    if import0_count < iat_count:
        return Result.INVALID

    return Result.VALID