ReactOS Development Notes

📅 2026/7/13 8:11:10
ReactOS Development Notes
ReactOS Development Notes禁止使用clean 整个编译目录只能针对某个局部目录。VM Name实际 VM 名称是ReactOS-Test-New不是ReactOS-Test。Build Run VM (CDROM)1. Build bootcdcd d:\reactos\output-MinGW-i386 ninja-j 20 bootcd2. Power off VM if runningE:\VirtualBox\VBoxManage.execontrolvmReactOS-Test-Newpoweroff3. Detach old CDROM ISOE:\VirtualBox\VBoxManage.exestorageattachReactOS-Test-New--storagectlIDE Controller--port 1--device 0--typedvddrive--medium none4. Attach new bootcd.isoE:\VirtualBox\VBoxManage.exestorageattachReactOS-Test-New--storagectlIDE Controller--port 1--device 0--typedvddrive--mediumD:\reactos\output-MinGW-i386\bootcd.iso5. Delete old serial logRemove-ItemD:\reactos\output-MinGW-i386\serial_output.log-ErrorAction SilentlyContinue6. Start VM (headless)E:\VirtualBox\VBoxManage.exestartvmReactOS-Test-New--typeheadless7. Check serial output (after ~15s)Get-ContentD:\reactos\output-MinGW-i386\serial_output.log-Tail 30VDI 修改工作流经验证修改 VDI添加/替换文件的标准流程。准备工作mount/detach 脚本mount_vhd.txtD:\reactos\output-MinGW-i386\mount_vhd.txtselect vdisk fileD:\reactos\output-MinGW-i386\temp_deploy.vhd attach vdisk select partition 1 assign letterV exitdetach_vhd.txtD:\reactos\output-MinGW-i386\detach_vhd.txtselect vdisk fileD:\reactos\output-MinGW-i386\temp_deploy.vhd detach vdisk exit完整操作步骤# 0. 先关闭 VME:\VirtualBox\VBoxManage.execontrolvmReactOS-Test-Newpoweroff 2$null# 1. 清理 VirtualBox 中所有过期的介质注册关键否则后续 clonehd 会失败E:\VirtualBox\VBoxManage.exelist hdds|Select-StringUUID:|ForEach-Object{$uuid$_.ToString().Trim().Replace(UUID:,).Trim()E:\VirtualBox\VBoxManage.execlosemedium disk$uuid2$null}# 2. 克隆 VDI → VHDE:\VirtualBox\VBoxManage.execlonehdD:\reactos\output-MinGW-i386\ReactOS-Test.vdiD:\reactos\output-MinGW-i386\temp_deploy.vhd--format VHD# 3. 挂载 VHD 为 V: 盘diskpart/s D:\reactos\output-MinGW-i386\mount_vhd.txt# 4. 拷贝文件必须用 [System.IO.File]::Copy不能用 Copy-Item# 因为 V: 盘不在 PowerShell 安全策略允许路径中[System.IO.File]::Copy(D:\reactos\output-MinGW-i386\dll\win32\kernel32\kernel32.dll,V:\ReactOS\system32\kernel32.dll,$true)[System.IO.File]::Copy(D:\reactos\output-MinGW-i386\dll\win32\kernel32\kernel32_vista\kernel32_vista.dll,V:\ReactOS\system32\kernel32_vista.dll,$true)[System.IO.File]::Copy(D:\reactos\output-MinGW-i386\109.0.5414.120_chrome_installer.exe,V:\109.0.5414.120_chrome_installer.exe,$true)# 5. 卸载 VHDdiskpart/s D:\reactos\output-MinGW-i386\detach_vhd.txt# 6. 清理旧 VDI 注册和文件E:\VirtualBox\VBoxManage.execlosemedium diskD:\reactos\output-MinGW-i386\ReactOS-Test.vdi2$nullRemove-ItemD:\reactos\output-MinGW-i386\ReactOS-Test.vdi-Force# 7. VHD → VDIE:\VirtualBox\VBoxManage.execlonehdD:\reactos\output-MinGW-i386\temp_deploy.vhdD:\reactos\output-MinGW-i386\ReactOS-Test.vdi--format VDI# 8. 附加到 VME:\VirtualBox\VBoxManage.exestorageattachReactOS-Test-New--storagectlIDE Controller--port 0--device 0--typehdd--mediumD:\reactos\output-MinGW-i386\ReactOS-Test.vdi# 9. 清理临时 VHD 和旧日志Remove-ItemD:\reactos\output-MinGW-i386\temp_deploy.vhd-Force-ErrorAction SilentlyContinueRemove-ItemD:\reactos\output-MinGW-i386\serial_output.log-ErrorAction SilentlyContinue# 10. 启动 VMGUI 模式不加 --typeheadless 模式加 --type headlessE:\VirtualBox\VBoxManage.exestartvmReactOS-Test-New注意事项VBoxManage.exe路径E:\VirtualBox\VBoxManage.exe每次 clonehd 到已存在的路径时必须先清理 VirtualBox 注册表中同路径的旧记录否则会报E_INVALIDARGclosemedium如果失败提示 still attached先storageattach ... --medium none分离V: 盘的文件操作必须用[System.IO.File]::Copy()不能用Copy-Item或cmd /c copykernel32 添加新 API 的模式ReactOS 中 Vista API 的实现模式以SetFileInformationByHandle为例实现文件放在dll/win32/kernel32/kernel32_vista/目录下CMakeLists.txt在dll/win32/kernel32/kernel32_vista/CMakeLists.txt的SOURCE列表中添加kernel32_vista.spec在dll/win32/kernel32/kernel32_vista/kernel32_vista.spec中添加导出函数会同时出现在kernel32_vista.dll和kernel32.dll通过静态链接kernel32.spec在dll/win32/kernel32/kernel32.spec中添加转发 stdcall FunctionName(params) kernel32_vista.FunctionName不能直接转发到kernelbase该版本的 ReactOS 没有kernelbase.dllWRK ReferenceD:\work\Windows-Research-Kernel-WRK