一、系统知识
二、windows编程
1. 网络编程
1.1. 工具函数
1) 网络字节序转换
1 | // #include <WinSock2.h> |
2) 时间函数
用途 | 精度 | 耗时比(不精确) | |
---|---|---|---|
GetTickCount | 系统启动时间 | 1ms | 26 |
GetSystemTimeAsFileTime | 系统时间(UTC) | 100ns | 39 |
GetLocalTime | 系统时间(本地时区) | 100ns | 1722 |
QueryPerformanceFrequency QueryPerformanceCounter | 系统启动时间 | 和cpu频率相关 | 2258 |
系统启动时间,不随系统时间调整变化
GetTickCount
: ms级系统启动时间,不随系统时间变化,速度更快QueryPerformanceFrequency
: 系统内部计时其的时钟频率,速度很慢QueryPerformanceCounter
: 计数器计数,速度很慢
系统时间,修改系统时间会变化
GetLocalTime
: 精度100nsGetSystemTimeAsFileTime
2. 编译器
2.1. visual studio
1) 预定义宏
https://docs.microsoft.com/zh-cn/cpp/preprocessor/predefined-macros?view=msvc-170
3. 宽字符
3.1. C语言方式转换
1 | int main() |
3.2. C++标准库
1 | int main() |
或者下面的方式
1 | int main() |
4. windows特殊类型
WORD
- 16位无符号整数
- 一般用于windows系统调用的参数
DWORD
- 32位无符号整数
- 一般用于windows系统调用的返回值
WCHAR
- 宽字符类型,2字节16位
- 一般用于windows系统调用的参数
5. 注册表修改
5.1. 修改系统环境变量
- 使用官方的SetEnvironmentVariable函数只能修改当前进程和子进程的,无法影响到其他进程
- 需要修改注册表进行修改到系统环境变量,还需要进行通知
1 | // 修改系统的temp环境变量 |
三、有用的几个技巧
1. 查看程序是64bit还是32bit
- 对exe右键属性
- 若降低色彩和分辨率的选项可勾选就是32位,不可勾选就是64位
四、好用的软件
1. mingw
- minimal gnu for windows
- 在windows上使用gcc
1.1. 安装
- 下载免安装版本sourceForge
posix和win32
- posix可以将
std::thread
转发成windows的实现 - win32不允许使用
std::thread
,需要使用win32实现
seh和sjlj
- seh可以处理
signal()
2. make
2.1. 安装
- 下载地址: https://gnuwin32.sourceforge.net/packages/make.htm
- 需要下载二进制和依赖的动态库
3. openssh
3.1. 离线安装
3.2. 配置
1) 修改端口
- sshd的配置文件在
%programdata%\ssh\sshd_config
2) 公私钥登陆
- windows上的OpenSSH对管理员账户有一个特殊配置
1 | Match Group administrators |
- 所以管理员账户需要放到这个位置才行
- 其他账户正常放到
%userprofile%\.ssh\authrized_keys
五、win11
1. 跳过windows11安装检查
- 在安装界面输入
Shift + F10
调出cmd - 输入
regedit
打开注册表 - 在
HKEY_LOCAL_MACHINE\SYSTEM\Setup
下面添加一个key,值为LabConfig
- 在其下面新建下面的几个
DWORD (32bit)
的值BypassTPMCheck
: 跳过tpm检查BypassSecureBootCheck
: 跳过安全启动检查BypassRAMCheck
: 跳过内存检查
- 返回重新选择系统进入即可
小技巧和踩坑记
1. 低版本windows调用系统api获取dns地址时报11003错误
- 根据排查,发现是系统api对于dns回包的兼容性不好
- dns请求在win7上请求会有A和AAAA两个记录,但是如果AAAA记录的响应返回了A的ip,就会报这个错误
2. windows的线程轮转时间是10ms
- 使用
std::future
的wait_for()
方法,看似等待3ms
,实际可能整体执行时间是10ms
以上
3. IN和OUT为windows的api默认定义用来进行标识参数的方向
- 定义关键字不能使用
IN
和OUT
,因为它们是windows的api的默认定义
1 | // 编译会报错,因为IN和OUT在windows下定义成了空 |
4. 编译错误
4.1. 无法解析外部符号 _GetAdaptersInfo@8
- 在代码中添加下面一句即可
1 |
4.2. error C2899: typename cannot be used outside a template declaration
- VS2015的某个版本之前会报错,在
2015.3
之后就不会了
5. 添加开机启动脚本
- 编写bat文件
1 | @echo off |
- 将bat文件放到
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
即可
6. windows和linux双系统时间不一致
- windows把系统硬件时间作为本地时间,直接显示硬件时间
- linux把硬件时间作为UTC,会根据当前时区做运算,也就是显示硬件时间+8(北京时间UTC+8)
- 修改可以从linux或windows两方面改,建议从windows改,因为更加符合未来趋势,硬件时间不用频繁变动
- windows按照下面管理员运行设置将硬件时间作为UTC时间,重启就生效了
1 | Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1 |
7. 修改windows的远程桌面的默认3389端口
- 注册表项
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
中的PortNumber - 修改完之后重启即可
8. 管理员修改其他用户密码
- 命令行输入
lusrmgr.msc
,打开用户和用户组 - 点击用户,在右侧找到对应的用户,右键设置密码就可以修改了
9. grub引导win11启动
- 由于TPM导致grub找不到win11的引导,需要手动添加
- 在grub引导界面,按c进入命令行,使用ls命令查看磁盘情况
1 | ls -l |
- 找到windows的fat分区地方,如
hd0,gpt1
- 查看是否有此文件
bootmgfw.efi
1 | ls (hd0,gpt1)/efi/Microsoft/Boot/bootmgfw.efi |
- 启动linux,修改grub的配置
/etc/grub.d/40_custom
如下
1 | => cat /etc/grub.d/40_custom |
- 执行
grub-mkconfig -o /boot/grub/grub.cfg
更新grub配置即可找到win11
10. ssh报错Bad owner or permissions on C:\Users\xxx\.ssh\config
- 需要编辑文件属性>安全>高级,config不允许未知用户有任何权限,id_rsa同样
11. 修改windows的默认445的共享文件夹端口
服务端
- windows不允许修改445端口,想要操作需要配置端口转发
1 | :: 配置监听0.0.0.0:1234转发到127.0.0.1:445 |
客户端
- windows同样客户端不允许修改,也是使用端口转发
1 | :: 配置监听127.0.0.1:445转发到x.x.x.x:445 |
- 需要先关闭本地的445端口,使用cmd执行
1 | sc config LanmanServer start=disabled |
- 或使用powershell执行
1 | :: 禁止服务启动 |
- 使用netstat发现没有监听0.0.0.0:445后,就可以使用127.0.0.1进行共享文件夹连接
12. 降级某个WindowsApp后,重启还是发现使用高版本
如windows terminal的1.17版本无法启动,降级到1.16版本可以启动,结果每次重启都提示版本为1.17,重新卸载后安装低版本无效
原因是因为卸载只是针对当前用户的,需要使用管理员启动powershell,执行命令查看是否完全卸载完了
1 | PS C:\Users\User> Get-AppxPackage -allusers *WindowsTerminal* |
上面是完全卸载完了,只剩下1.16了。没卸载完全会有两个,执行命令进行卸载
1 | :: 一次可能没卸载完,可以执行完再查一次 |
13. 新版本win10如何设置自动登录
- 新版本win10把netplwiz中的
要使用本计算机,用户必须输入用户名和密码
隐藏了,需要修改注册表将其打开 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device
下的DevicePasswordLessBuildVersion,将其设置为0即可显示- 然后执行
netplwiz
将选项勾上,应用。取消,应用就会让输入密码,输入就可以自动登陆了
14. 账户被锁定无法登陆
- 按着shift点击重启会进入到高级选项
- 选择疑难解答 => 启动设置 => 重启
- 重启后进入到高级重启界面,选择4进入安全模式,登陆用户
- 在命令行界面输入
net user xxx /ACTIVE:YES
将用户解锁