晋朝帝王年表

西晋

庙号 帝号 姓名 在位时期 上位 在位 年号
高祖 宣帝 司马懿 249-251 70岁 3年
世宗 景帝 司马师 252-254 44岁 3年
太祖 文帝 司马昭 255-265 44岁 11年
世祖 武帝 司马炎 266-290 30岁 25年 泰始/咸宁/太康/太熙
孝惠帝 司马衷 291-306 35岁 16年 永平/元康/永康/永宁/太安/永安/建武/永兴/光熙
孝怀帝 司马炽 307-313 23岁 7年 永嘉
孝愍帝 司马邺 313-316 13岁 4年 建兴

东晋

庙号 帝号 姓名 在位时期 上位 在位 年号
中宗 元帝 司马睿 317-323 41岁 7年 建武/太兴/永昌/太宁
肃宗 明帝 司马绍 323-326 24岁 4年 太宁
显宗 成帝 司马衍 326-342 5岁 15年 咸和/咸康
康帝 司马岳 343-344 21岁 2年 建元
孝宗 穆帝 司马聃 345-361 2岁 17年 永和/升平
哀帝 司马丕 362-365 21岁 4年 隆和/兴宁
司马奕 366-371 24岁 6年 太和
太宗 简文帝 司马昱 371-372 51岁 2年 咸安
烈宗 孝武帝 司马曜 373-396 11岁 28年 宁康/太元
安帝 司马德宗 397-402 15岁 6年 隆安/元兴/大亨
恒楚 桓玄 403-404 34岁 2年 永始
恒楚 恒谦 404-410 7年 天康
安帝 司马德宗 405-418 23岁 14年 义熙
恭帝 司马德文 419-420 33岁 2年 元熙

refer to: https://baike.baidu.com/item/%E6%99%8B%E6%9C%9D/195770?fr=aladdin

从cmdline解析出参数token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <string>
#include <vector>
#include <sstream>
 
using namespace std;
 
wstring copySpanStr(const wchar_t* start, const wchar_t* end)
{
	wchar_t* buf = (wchar_t*)malloc((end - start + 1) * sizeof(wchar_t));
	wchar_t* pTo = buf;
	for (const wchar_t* p = start; p != end; p++)
	{
		if (*p == L'\\' && p + 1 != end)
		{
			p++;
			*pTo++ = *p;
		}
		else
			*pTo++ = *p;
	}
	*pTo = 0;
	wstring out = buf;
	free(buf);
	return out;
}
 
int getParams(const wchar_t* str, vector<wstring>& out)
{
	int isInQMark = 0;
	int isInSpace = 1;
	const wchar_t* tokenStart = str;
	for (const wchar_t* p = str; ; p++)
	{
		if (*p == L'"')
		{
			if (!isInQMark)
			{
				isInQMark = 1;
				tokenStart = p + 1;
			}
			else
			{
				isInQMark = 0;
				out.push_back(copySpanStr(tokenStart, p));
			}
		}
		else if (*p == L'\\')
		{
			if (*(p + 1) != 0)
				p++;
		}
		else if (*p == L' ' || *p == 0)
		{
			if (!isInQMark)
			{
				if (!isInSpace)
				{
					isInSpace = 1;
					if (tokenStart != p)
					{
						out.push_back(copySpanStr(tokenStart, p));
						tokenStart = p;
					}
				}
				else
				{
 
				}
			}
		}
		else
		{
			if (!isInQMark)
			{
				if (!isInSpace)
				{
 
				}
				else
				{
					isInSpace = 0;
					tokenStart = p;
				}
			}
		}
		if (*p == 0)
			break;
	}
	return out.size();
}
 
wstring strReplaceCh2Str(const wchar_t* in, wchar_t fromCh, const wchar_t* toStr)
{
	const wchar_t* p = in;
	wstringstream ss;
	const wchar_t* pToStr;
	for (; *p != 0; p++)
	{
		if (*p == fromCh)
		{
			for (pToStr = toStr; *pToStr != 0; pToStr++)
			{
				ss << *pToStr;
			}
		}
		else
			ss << *p;
	}
	return ss.str();
}
 
int main()
{
	wstring path = strReplaceCh2Str(L"c:\\aa.txt", L'\\', L"\\\\");
	wstring msg = strReplaceCh2Str(L"\"优孩\"是EuhatExpert的中文名。", L'\"', L"\\\"");
 
	wstring cmd = L"EuhatExample.exe subCmd \"" + path + L"\" \"" + msg + L"\" 1234 5678";
 
	vector<wstring> params;
	getParams(cmd.c_str(), params);
	return 0;
}

dll中的全局类实例什么时候初始化

如果外部工程ExeB调了动态库DllA中的函数,当ExeB运行时,DllA中的全局类实例一定会初始化,但不一定非得在ExeB中调DllA中的函数后DllA中的全局类实例才会初始化,比如在DllA中代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class DllA01()
{
public:
	DllA01()
	{
		MessageBoxA(NULL, "init", NULL, 0);
	}
	~DllA01()
	{
		MessageBoxA(NULL, "fini", NULL, 0);
	}
	void test(void)
	{
		MessageBoxA(NULL, "test", NULL, 0);
	}
};
__declspec(dllexport) DllA01 gA01;
extern "C" __declspec(dllexport) void dllA01Test(void)
{
	MessageBoxA(NULL, "dllA01Test", NULL, 0);
}

在ExeB中加入

1
2
3
4
#pragma comment(lib, "DllA.lib")
#pragma comment(linker, "/include:__imp__dllA01Test")
//#pragma comment(linker, "/include:__imp_?gA01@@3VDllA01@@A")
//#pragma comment(linker, "/ENTRY:foo")

GetHDSerial编译不通过

源码参见https://www.codeleading.com/article/62852336906/
提示

1
2
3
4
error C2065: “STORAGE_PROPERTY_QUERY”: 未声明的标识符
error C2065: “StorageDeviceProperty”: 未声明的标识符
error C2065: “PropertyStandardQuery”: 未声明的标识符
error C2065: “IOCTL_STORAGE_QUERY_PROPERTY”: 未声明的标识符

按F1在msdn上查到的可能结果为

1
#include <Ntddstor.h>

但加了还是编译不通过,其实正确的是只要加入

1
#include <WinIoCtl.h>

refer to: https://stackoverflow.com/questions/4420632/i-dont-know-what-problem-it-is-error-error-c2065-storage-property-query

删除win10下的20G恢复分区

现在很多笔记本都内置了一块固态硬盘用于跑win10系统,用磁盘管理工具可以发现这块硬盘上有20G的恢复分区休眠着,本来固态硬盘的大小就捉襟见肘,而这20G能否删除呢?

如果win10用得得心应手,不担心以后会出现系统要恢复出厂设置的问题,并且在磁盘管理工具中看到的这二十多G分区在系统分区之后,则可以删除这20G分区,并合到系统分区中。我是指不重装系统或不用专业的磁盘分区移动软件的情况下。

由于是系统运行在系统分区中,只能用winpe装U盘引导机器去干这件事。

方法如下:

  1. 网上有各种各样的winpe iso可供下载,但考虑到安全性,还是到微软官网下载adk之类的包。
  2. 装完后,以管理员方式运行“部署和映像工具环境”。
  3. 运行命令

    1
    2
    
    copype amd64 d:\WinPE_amd64
    MakeWinPEMedia /UFD d:\WinPE_amd64 P:

    其中P:为插入的U盘盘符。

  4. 如果提示格式化错误,运行命令

    1
    
    MakeWinPEMedia /ISO d:\WinPE_amd64 d:\winpe.iso

    再参见在linux虚拟机中将ISO写入U盘

  5. 机器插入U盘后开机,比如DELL G7是开机时反复点击F12键,而不是一直按着F12不动,进入bios,设置成non-secure boot,再重启进入winpe环境。
  6. 进去后就一个dos窗口,运行diskpart,在此程序里多敲help看命令帮助,list是查看磁盘、分区等信息,select是进入磁盘,再进入分区,把系统分区后的分区都delete掉,再将系统分区extend到之后的所有空闲空间。注意这里操作一定要小心再小心,因为没有OS的保护,一不小心会把系统分区或引导分区删了,那就game over了,小心小心再小心!
  7. 完成扩容后,exit退出重启,再反复点击F12键进bios设成为secure boot,再重启进入win10,就可看到c:盘增加了十几G的空间了。

Failed to format -2147024809

直接用adk里的MakeWinPEMedia写winpe到U盘里报标题这个错误,所以我们换一种思路,用MakeWinPEMedia生成iso,再在linux环境将iso擦写到U盘里。

先以管理员方式运行“部署和映像工具环境”
输入

1
MakeWinPEMedia /ISO d:\euhat\WinPE_amd64 d:\winpe.iso

成功后,将winpe.iso拷贝到ubuntu linux虚拟机或实机里面。
我们现在以vmware的ubuntu虚拟机为例,为了使虚拟机正常识别U盘,需要做两件事

  1. 以管理员方式运行vmware player或workstation。
  2. ubuntu虚拟机设置里USB控制器兼容性中选择正确的版本,新买的机器一般选USB 3.0以上。这一步骤若选错,在vmware工具条上将U盘连接到虚拟机里时会提示“无法连接到理想的主机控制器。将尝试将该设备连接到可用的最佳主机控制器”不成功的错误,那时再重复此步骤选择其它USB控制器版本试试。

启动ubuntu虚拟机,打开终端以root身份运行

1
fdisk -l

通过看容量找到U盘的设备路径,如我这里是/dev/sdb,则再运行

1
2
dd if=/home/euhat/Desktop/winpe.iso of=/dev/sdb
sync

这样winpe就写入U盘了,正常从虚拟机、Windows卸载U盘后,再插到机器上用U盘引导试试!

Golang备忘录

1
go env -w GOPROXY=https://goproxy.cn

To debug in VSCode, write .vscode/launch.json

1
2
3
4
5
6
7
8
9
10
11
12
13
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "program": "${workspaceFolder}/main.go",
            "args": ["-h", "192.168.11.128", "-user", "test", "-pwd", "123123", "-p", "1-65535"]
       }
    ]
}

refer to: https://blog.csdn.net/qq_22211217/article/details/101854419

cannot find -lbz2

ubuntu下编译源码出现错误

1
/usr/bin/ld: cannot find -lbz2

解决办法

1
apt-get install libbz2-dev

wireshark过滤数据包的第一个INT

比如,tcp连接,往往包头第一个INT或第二个INT表示包的类型,可以用wireshark过滤显示指定类型的数据包,比如过滤包头第一个INT对应整型值为10的包的过滤表达式为

1
ip.addr == 192.168.1.21 && tcp.port == 7222 && frame[54:4]==0a:00:00:00

附:tcpdump抓包

1
tcpdump -i eth0 -w file.cap host 192.168.168.18 and tcp port 8081

refer to:
https://blog.csdn.net/qq_19167629/article/details/83088878