feat: 提供了修改功能

This commit is contained in:
2024-12-12 16:08:19 +08:00
parent bfe54cae1f
commit d8b49c12d1
10 changed files with 189 additions and 39 deletions

View File

@@ -1,16 +1,73 @@
import { useEffect, useState } from "react";
import NodeTableComponent, {
DataTemplateInterface,
DataType,
} from "../NodeTableComponent/NodeTableComponent";
import { invoke } from '@tauri-apps/api/core';
import { invoke } from "@tauri-apps/api/core";
import { message } from "antd";
interface DosHeaderResponseData {
base_offset: number;
fields: {
[key: string]: number | number[];
};
}
const checkEditValue = (item: DataType) => {
const { value, data_type, size } = item;
if (data_type === "hex") {
let numberValue = value as number;
if (typeof value === "string") {
numberValue = parseInt(value, 10);
}
// 如果是2位 最大为 0xFFFF 10进制为 65535
let maxBit = Math.pow(2, size * 8) - 1;
console.log("maxBit", maxBit);
if (numberValue > maxBit) {
return false;
}
return true;
}
};
const formatEditValue = (item: DataType) => {
const { value, data_type, size } = item;
let bufs = [];
if (data_type === "hex") {
let numberValue = value as number;
if (typeof value === "string") {
numberValue = parseInt(value, 10);
}
// 转小尾
for (let i = 0; i < size; i++) {
bufs.push(numberValue & 0xff);
numberValue = numberValue >> 8;
}
console.log("bufs", bufs);
return bufs;
}
};
export default function DosHeader() {
const [data, setData] = useState<any[]>([]);
const [data, setData] = useState<DosHeaderResponseData>();
const [messageApi, contextHolder] = message.useMessage();
const success = () => {
messageApi.open({
type: "success",
content: "修改成功!",
});
};
const error = () => {
messageApi.open({
type: "error",
content: "修改失败!",
});
};
const dataTemplate: DataTemplateInterface = {
e_magic: {
name: "e_magic",
description: "标识文件的魔数DOS 可执行文件的值通常为 'MZ'。",
value: 0,
size: 2,
offset: 0,
@@ -18,6 +75,7 @@ export default function DosHeader() {
},
e_cblp: {
name: "e_cblp",
description: "文件最后一页的字节数,指示文件不完整页的大小。",
value: 0,
size: 2,
offset: 2,
@@ -25,6 +83,7 @@ export default function DosHeader() {
},
e_cp: {
name: "e_cp",
description: "文件的总页数(每页 512 字节)。",
value: 0,
size: 2,
offset: 4,
@@ -32,6 +91,7 @@ export default function DosHeader() {
},
e_crlc: {
name: "e_crlc",
description: "重定位表中的条目数。",
value: 0,
size: 2,
offset: 6,
@@ -39,6 +99,7 @@ export default function DosHeader() {
},
e_cparhdr: {
name: "e_cparhdr",
description: "文件头部的段数,单位为 16 字节段。",
value: 0,
size: 2,
offset: 8,
@@ -46,6 +107,7 @@ export default function DosHeader() {
},
e_minalloc: {
name: "e_minalloc",
description: "程序需要的最小额外段数。",
value: 0,
size: 2,
offset: 10,
@@ -53,6 +115,7 @@ export default function DosHeader() {
},
e_maxalloc: {
name: "e_maxalloc",
description: "程序可以分配的最大额外段数。",
value: 0,
size: 2,
offset: 12,
@@ -60,6 +123,7 @@ export default function DosHeader() {
},
e_ss: {
name: "e_ss",
description: "初始的 SS 寄存器值,段偏移地址。",
value: 0,
size: 2,
offset: 14,
@@ -67,6 +131,7 @@ export default function DosHeader() {
},
e_sp: {
name: "e_sp",
description: "初始的 SP 寄存器值,栈顶指针。",
value: 0,
size: 2,
offset: 16,
@@ -74,6 +139,7 @@ export default function DosHeader() {
},
e_csum: {
name: "e_csum",
description: "校验和(一般为 0。",
value: 0,
size: 2,
offset: 18,
@@ -81,6 +147,7 @@ export default function DosHeader() {
},
e_ip: {
name: "e_ip",
description: "初始的 IP 寄存器值,代码段的入口偏移地址。",
value: 0,
size: 2,
offset: 20,
@@ -88,6 +155,7 @@ export default function DosHeader() {
},
e_cs: {
name: "e_cs",
description: "初始的 CS 寄存器值,代码段的段基址。",
value: 0,
size: 2,
offset: 22,
@@ -95,6 +163,7 @@ export default function DosHeader() {
},
e_lfarlc: {
name: "e_lfarlc",
description: "重定位表的文件偏移。",
value: 0,
size: 2,
offset: 24,
@@ -102,6 +171,7 @@ export default function DosHeader() {
},
e_ovno: {
name: "e_ovno",
description: "覆盖号(通常为 0。",
value: 0,
size: 2,
offset: 26,
@@ -109,15 +179,16 @@ export default function DosHeader() {
},
e_res: {
name: "e_res",
description: "保留字段,通常为 0。",
value: null,
size: 8,
offset: 28,
// field_type: "[WORD; 4]",
array_element_size: 2,
data_type: "array",
},
e_oemid: {
name: "e_oemid",
description: "OEM 标识符。",
value: 0,
size: 2,
offset: 36,
@@ -125,6 +196,7 @@ export default function DosHeader() {
},
e_oeminfo: {
name: "e_oeminfo",
description: "OEM 信息。",
value: 0,
size: 2,
offset: 38,
@@ -132,6 +204,7 @@ export default function DosHeader() {
},
e_res2: {
name: "e_res2",
description: "保留字段,通常为 0。",
value: 0,
size: 20,
offset: 40,
@@ -140,6 +213,7 @@ export default function DosHeader() {
},
e_lfanew: {
name: "e_lfanew",
description: "PE 文件头的偏移地址。",
value: 0,
size: 4,
offset: 60,
@@ -154,20 +228,20 @@ export default function DosHeader() {
title: "字段名",
dataIndex: "name",
key: "name",
width: 120
width: 120,
},
{
title: "偏移",
dataIndex: "offset",
key: "offset",
hexSwitch: true,
width: 80
width: 80,
},
{
title: "大小",
dataIndex: "size",
key: "size",
width: 80
width: 80,
},
{
title: "值",
@@ -175,28 +249,56 @@ export default function DosHeader() {
key: "value",
hexSwitch: true,
editable: true,
minWidth: 200
minWidth: 200,
},
{
title: "描述信息",
dataIndex: "description",
key: "description",
width: 250
width: 250,
},
];
useEffect(()=>{
invoke(command).then(res => {
console.log("asdfsadf",res);
setData(res as any);
const handleSave = (item: DataType) => {
console.log("handleSave", item);
if (!checkEditValue(item)) {
return;
}
const bufs = formatEditValue(item);
console.log("change value", bufs);
invoke("command_write_data", {
offset: item.offset,
data: bufs,
})
}, [])
.then((res) => {
// 提示
success();
getData();
})
.catch(() => {
error();
});
};
const getData = () => {
invoke(command).then((res) => {
setData(res as any);
});
};
useEffect(() => {
getData();
}, []);
return (
<NodeTableComponent
dataTemplate={dataTemplate}
defaultData={data}
columns={columns as any}
></NodeTableComponent>
<>
{contextHolder}
<NodeTableComponent
dataTemplate={dataTemplate}
defaultData={data}
columns={columns as any}
onEdit={handleSave}
></NodeTableComponent>
</>
);
}

View File

@@ -14,6 +14,7 @@ export default function NTHeader() {
size: 4,
value: 0,
data_type: "hex",
description: "PE文件的标志可执行文件的标志是0x00004550",
},
};
const command = "command_get_pe_data_nt_header";

View File

@@ -54,7 +54,8 @@ interface NodeTableComponentProps {
dataTemplate: DataTemplateInterface; // 数据模板
// command: string; // 请求数据的命令
columns: NodeTableColumnInterface<DataType>[];
defaultData?: DataType[];
defaultData?: ResponsData;
onEdit?: (record: DataType) => void;
}
interface EditableRowProps {
@@ -77,7 +78,7 @@ interface EditableCellProps {
editable: boolean;
dataIndex: keyof DataType;
record: DataType;
handleSave: (record: DataType) => void;
handleSave?: (record: DataType) => void;
}
const EditableCell: React.FC<React.PropsWithChildren<EditableCellProps>> = ({
@@ -108,7 +109,7 @@ const EditableCell: React.FC<React.PropsWithChildren<EditableCellProps>> = ({
try {
const values = await form.validateFields();
toggleEdit();
handleSave({ ...record, ...values });
handleSave?.({ ...record, ...values });
} catch (errInfo) {
console.log("Save failed:", errInfo);
}
@@ -151,10 +152,6 @@ export default function NodeTableComponent(props: NodeTableComponentProps) {
setHexSwitchStatus(newHexSwitchStatus);
};
const handleSave = (_row: DataType) => {
// TODO: 保存逻辑
};
const hexSwitchRender = (text: string, dataIndex: string) => {
if (text == null || text == undefined || typeof text !== "number") {
return text;
@@ -180,7 +177,7 @@ export default function NodeTableComponent(props: NodeTableComponentProps) {
editable: col.editable,
dataIndex: col.dataIndex,
title: col.title,
handleSave,
handleSave: props.onEdit,
});
}
if (col.hexSwitch) {

View File

@@ -133,7 +133,6 @@ export default function SectionHeaders() {
setData(formatDataHandler(res));
});
}, []);
console.log("yhyy", data);
return (
<Flex className={styles.content}>
{data.map((item, index) => {