在你的驱动程序代码中,MyDriverDispatchWrite
函数会在以下情况下被调用:
设备已成功创建:
IoCreateDevice
调用成功(即返回的status
为STATUS_SUCCESS
)。符号链接已创建:
IoCreateSymbolicLink
调用成功,这使得用户模式应用程序能够通过符号链接来访问设备。打开设备: 用户模式应用程序(如记事本)通过符号链接 (
\\??\\MyDevice
) 打开你的设备。这通常使用 API,如CreateFile
在用户空间进行。具体而言,打开方式应是以写入权限打开设备,例如使用GENERIC_WRITE
。IRP_MJ_WRITE 请求: 当用户模式应用程序向该设备执行写操作时,会生成一个 I/O 请求包 (IRP),并将其发送到驱动程序。这是通过文件句柄对应的 IRP 进行的,如果驱动正确设置了对应的调度例程,则这个请求会被送到你的驱动中的
MyDriverDispatchWrite
函数处理。
示例流程
- 驱动加载并调用你的初始化代码,其中包含上述代码。
- 确保没有错误并且设备和符号链接都已创建成功。
- 在用户模式下,应用程序例如记事本,尝试打开或写入该设备:
HANDLE hDevice = CreateFile(L"\\\\.\\MyDevice", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); DWORD bytesWritten; WriteFile(hDevice, dataToWrite, dataSize, &bytesWritten, NULL); CloseHandle(hDevice);
- 当调用
WriteFile
时,它会触发一个 IRP_MJ_WRITE 请求,并将其传递给你的驱动程序。由于你在驱动中为这个请求设置了处理函数MyDriverDispatchWrite
,因此它将被调用。
注意事项
- 如果没有看到对
MyDriverDispatchWrite
的调用,请检查所有步骤是否正确执行,特别是在创建和打开设备时可能遇到的权限问题或其他错误。 - 确保 IRP 被正确定义和处理,并且没有其他地方阻止 IRP 到达期望的位置。
内容由零声教学AI助手提供,问题来源于学员提问