0

我想知道是否有一个选项,如果有的话 - 在 Windows 中,如何在不使用 WIN32API 文件处理调用的情况下将原始字节写入文件。

我尝试使用 x86asm 直接文件调用的直接方法,但同时没有成功。

4

2 回答 2

2

您可以尝试使用来自 ntdll 的本机 API,甚至直接使用系统调用(int 2eh 或 systenter 指令),但这非常棘手——您需要使用内核样式的文件名。

于 2012-06-27T16:13:18.077 回答
1

在回答您的问题之前,让我提一下在 Windows 中使用 API 写入文件包括以下(简化)阶段:

  1. 你打电话WriteFile(kernel32.dll)
  2. WriteFile调用NtWriteFile(ntdll.dll)
  3. NtWriteFile调用SYSENTER和操作进入内核模式
  4. 在内核模式下NtWriteFile调用 Ntoskrnl.exe 的函数
  5. 这发送IRP_MJ_WRITE到文件系统驱动程序
  6. 文件系统驱动程序确定应该写入哪些扇区并传递给存储驱动程序
  7. 存储驱动程序向硬盘驱动器发送命令以实际将数据写入指定扇区
  8. 硬盘写入数据

与 8 相比,所有操作 1 到 7 都非常快(除非您使用 RAM 驱动器或极快的 SSD)

方法 1 - 您可以轻松跳过第 1 步(通过调用NtWriteFile)和第 2 步(通过调用SYSENTER- 不容易)。但是,您不会获得任何性能改进,所以这样做没有意义。只考虑WriteFile那些的包装器(我不认为你是在消除一个额外的函数调用之后)。

方法 2 - 您可以找出文件占用的扇区并直接写入它们(有效地跳过所有步骤到第 7 步)。为此,您需要打开并锁定卷,通过FSCTL_GET_RETRIEVAL_POINTERS调用找到目标文件占用的集群,并调用WriteFile卷句柄。但是这样比较是不公平的,因为文件系统驱动程序不仅会写入数据扇区,还会在调用 WriteFile 时更新文件系统元数据。

底线是 - “测试 win32 API 的效率”没有多大意义。您可以跳过操作系统所做的一些事情,但要么不会给您带来任何速度差异(方法 1),要么会有不公平的比较(方法 2)。

于 2012-06-28T20:09:30.220 回答