我想知道是否有一个选项,如果是这样 - 在Windows中如何准确地将原始字节写入文件而不使用WIN32API文件处理调用。
我尝试使用x86asm直接文件调用的直接前进方法,但在此期间没有成功。
答案 0 :(得分:2)
您可以尝试使用来自ntdll的native API甚至直接使用syscalls(int 2eh或systenter指令),但这非常棘手 - 您需要使用内核样式的文件名。
答案 1 :(得分:1)
在回答您的问题之前,请允许我提一下,在Windows中使用API写入文件包含以下(简化)阶段:
WriteFile
(kernel32.dll)WriteFile
调用NtWriteFile
(ntdll.dll)NtWriteFile
调用SYSENTER
,操作进入内核模式NtWriteFile
函数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)。