查看: 541|回复: 1
|
操作系统的API只不过是……
[复制链接]
|
|
本帖最后由 褐眼睛 于 1-3-2021 10:45 PM 编辑
我这里指的是Windows NT的翻版React OS(https://github.com/reactos/reactos)
ReactOS的内部API与Windows几乎一样,它也能运行Windows EXE。虽然如此,开发人员并没有抄袭Windows内核。
我这里讲一讲Console.WriteLine(C#)或Print(Visual Basic)的典故,以前DOS时代,程序员可以直接写入Screen Buffer B800:0或A000:0。
现在除非在Windows 32-bit使用NTVDM(Virtual DOS Machine),不然操作系统禁止直接写入内存。
换句话说,操作系统只能允许程序员使用它的API(如Win32 API)来WriteLine 或Print字符串。
Win32 API主要有两款:WriteFile和WriteConsole,都可以显示字符串在CUI (Console Screen)之下,不过WriteFile除了可以WriteConsole外,它可以重定向到文件写入。
这里只是列举WriteConsole. Win32 API又有提供两款WriteConsole,一个是显示Unicode字符串,一个是显示ANSI字符串(为英语系国家用户所用)。
- #ifdef UNICODE
- #define WriteConsole WriteConsoleW
- #else
- #define WriteConsole WriteConsoleA
- #endif
复制代码
然后,WriteConsoleA的函数是:
- BOOL
- WINAPI
- WriteConsoleA(
- _In_ HANDLE hConsoleOutput,
- _In_reads_(nNumberOfCharsToWrite) CONST VOID *lpBuffer,
- _In_ DWORD nNumberOfCharsToWrite,
- _Out_opt_ LPDWORD lpNumberOfCharsWritten,
- _Reserved_ LPVOID lpReserved);
复制代码 这里可以说ReactOS模仿得Windows很好,连Win32 API的参数都一样。
如果大家有仔细找到WriteConsoleA的做法,可以在这里讨论出来。我读了一回,它其实也不过是用RtlCopyMemory()将字符串复制到另一处,虽然我没有找到那“另一处”是什么,但是我敢假设,它也是复制到Screen Buffer。
由始至终,Windows 只不过复制了DOS时代让程序员自由发挥的方法,进而限制他们不再能有Direct Memory Access (DMA),唯独通过操作系统的内部API。
这也不难理解,现代操作系统同时有许多进程,需要锁定某个内存区域,避免让程序员自由写入或读取。
|
|
|
|
|
|
|
|
发表于 1-3-2021 11:56 PM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|