Files
xyou f70b061d1a
CI / Go Backend (push) Canceled after 0s
feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
2026-08-08 14:07:56 +08:00

152 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace PCL.Core.Utils;
// ReSharper disable InconsistentNaming
/// <summary>
/// 通用化 PE 文件头读取器
/// </summary>
public static class PEHeaderReader
{
private const int PE_POINTER_OFFSET = 0x3C;
private const uint PE_SIGNATURE = 0x00004550; // "PE\0\0"
/// <summary>
/// 读取并解析 PE 文件头结构
/// </summary>
public static PEStruct ReadPEHeader(string filePath)
{
var result = new PEStruct();
if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath))
{
result.ErrorMessage = "文件不存在或路径无效";
return result;
}
try
{
using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
// 验证 DOS 头
if (!_IsValidDosHeader(fs))
{
result.ErrorMessage = "无效的DOS头(MZ签名)";
return result;
}
// 获取 NT 头偏移量
var peHeaderOffset = _GetPEOffset(fs);
if (peHeaderOffset <= 0 || peHeaderOffset >= fs.Length - 24)
{
result.ErrorMessage = "无效的PE头偏移量";
return result;
}
// 定位并验证 PE 签名
fs.Seek(peHeaderOffset, SeekOrigin.Begin);
if (!_IsValidPESignature(fs))
{
result.ErrorMessage = "无效的PE签名";
return result;
}
// 读取完整的 IMAGE_FILE_HEADER 结构
result = _ParseImageFileHeader(fs);
result.IsValid = true;
}
catch (Exception ex)
{
result.IsValid = false;
result.ErrorMessage = $"读取失败: {ex.Message}";
}
return result;
}
private static bool _IsValidDosHeader(FileStream fs)
{
if (fs.Length < 2) return false;
fs.Seek(0, SeekOrigin.Begin);
return fs.ReadByte() == 'M' && fs.ReadByte() == 'Z';
}
private static long _GetPEOffset(FileStream fs)
{
fs.Seek(PE_POINTER_OFFSET, SeekOrigin.Begin);
using var reader = new BinaryReader(fs, Encoding.Default, true);
return reader.ReadInt32();
}
private static bool _IsValidPESignature(FileStream fs)
{
using var reader = new BinaryReader(fs, Encoding.Default, true);
return reader.ReadUInt32() == PE_SIGNATURE;
}
private static PEStruct _ParseImageFileHeader(FileStream fs)
{
using var reader = new BinaryReader(fs, Encoding.Default, true);
return new PEStruct
{
// 将读取的ushort值转换为MachineType枚举
Machine = (MachineType)reader.ReadUInt16(),
NumberOfSections = reader.ReadUInt16(),
TimeDateStamp = reader.ReadUInt32(),
PointerToSymbolTable = reader.ReadUInt32(),
NumberOfSymbols = reader.ReadUInt32(),
SizeOfOptionalHeader = reader.ReadUInt16(),
Characteristics = reader.ReadUInt16()
};
}
public static bool IsMachine64Bit(MachineType machine)
{
return new List<MachineType> { MachineType.IA64, MachineType.ARM64, MachineType.AMD64 }.Contains(machine);
}
}
/// <summary>
/// PE 文件机器架构类型
/// </summary>
public enum MachineType : ushort
{
Unknown = 0x0,
I386 = 0x14C, // x86
IA64 = 0x200, // Intel Itanium
AMD64 = 0x8664, // x64 (AMD or Intel)
ARM = 0x1C0, // ARM little endian
ARM64 = 0xAA64, // ARM64 little endian
ARMNT = 0x1C4, // ARM Thumb-2 little endian
EFI_BYTECODE = 0xEBC, // EFI byte code
M32R = 0x9041, // Mitsubishi M32R little endian
MIPS16 = 0x266, // MIPS16
MIPSFPU = 0x366, // MIPS with FPU
MIPSFPU16 = 0x466, // MIPS16 with FPU
POWERPC = 0x1F0, // Power PC little endian
POWERPCFP = 0x1F1, // Power PC with floating point support
R4000 = 0x166, // MIPS little endian
SH3 = 0x1A2, // Hitachi SH3
SH3DSP = 0x1A3, // Hitachi SH3 DSP
SH4 = 0x1A6, // Hitachi SH4
SH5 = 0x1A8, // Hitachi SH5
THUMB = 0x1C2, // Thumb
WCEMIPSV2 = 0x169, // MIPS little-endian WCE v2
}
[Serializable]
public struct PEStruct
{
public MachineType Machine;
public ushort NumberOfSections;
public uint TimeDateStamp;
public uint PointerToSymbolTable;
public uint NumberOfSymbols;
public ushort SizeOfOptionalHeader;
public ushort Characteristics;
public bool IsValid;
public string ErrorMessage;
}