我想知道是否有一个选项,如果有的话 - 在 Windows 中,如何在不使用 WIN32API 文件处理调用的情况下将原始字节写入文件。
我尝试使用 x86asm 直接文件调用的直接方法,但同时没有成功。
您可以尝试使用来自 ntdll 的本机 API,甚至直接使用系统调用(int 2eh 或 systenter 指令),但这非常棘手——您需要使用内核样式的文件名。
在回答您的问题之前,让我提一下在 Windows 中使用 API 写入文件包括以下(简化)阶段:
WriteFile
(kernel32.dll)WriteFile
调用NtWriteFile
(ntdll.dll)NtWriteFile
调用SYSENTER
和操作进入内核模式NtWriteFile
调用 Ntoskrnl.exe 的函数IRP_MJ_WRITE
到文件系统驱动程序与 8 相比,所有操作 1 到 7 都非常快(除非您使用 RAM 驱动器或极快的 SSD)
方法 1 - 您可以轻松跳过第 1 步(通过调用NtWriteFile
)和第 2 步(通过调用SYSENTER
- 不容易)。但是,您不会获得任何性能改进,所以这样做没有意义。只考虑WriteFile
那些的包装器(我不认为你是在消除一个额外的函数调用之后)。
方法 2 - 您可以找出文件占用的扇区并直接写入它们(有效地跳过所有步骤到第 7 步)。为此,您需要打开并锁定卷,通过FSCTL_GET_RETRIEVAL_POINTERS
调用找到目标文件占用的集群,并调用WriteFile
卷句柄。但是这样比较是不公平的,因为文件系统驱动程序不仅会写入数据扇区,还会在调用 WriteFile 时更新文件系统元数据。
底线是 - “测试 win32 API 的效率”没有多大意义。您可以跳过操作系统所做的一些事情,但要么不会给您带来任何速度差异(方法 1),要么会有不公平的比较(方法 2)。