(windows)raw写入文件而不涉及win32api

时间:2012-06-27 15:19:08

标签: windows winapi assembly file-io

我想知道是否有一个选项,如果是这样 - 在Windows中如何准确地将原始字节写入文件而不使用WIN32API文件处理调用。

我尝试使用x86asm直接文件调用的直接前进方法,但在此期间没有成功。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

  1. 您致电WriteFile(kernel32.dll)
  2. WriteFile调用NtWriteFile(ntdll.dll)
  3. NtWriteFile调用SYSENTER,操作进入内核模式
  4. 在内核模式下,调用Ntoskrnl.exe的NtWriteFile函数
  5. 这会将IRP_MJ_WRITE发送到文件系统驱动程序
  6. 文件系统驱动程序确定应写入哪些扇区并传递给存储驱动程序
  7. 存储驱动程序向硬盘驱动器发送命令以实际将数据写入指定扇区
  8. 硬盘写入数据
  9. 与8相比,所有操作1到7都非常快(除非您使用的是RAM驱动器或速度极快的SSD)

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

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

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