ZBLOG

UNICODE_STRING deviceName = RTL_CONSTANT_STRING(L"\\Device\\MyDevice"); UNICODE_STRING symLinkName = RTL_CONSTANT_STRING(L"\\??\\MyDevice"); PDEVICE_OBJECT deviceObject; NTSTATUS status = IoCreateDevice(DriverObject, 0, &deviceName, FILE_DEVICE_...

在你的驱动程序代码中,MyDriverDispatchWrite 函数会在以下情况下被调用:

  1. 设备已成功创建: IoCreateDevice 调用成功(即返回的 statusSTATUS_SUCCESS)。

  2. 符号链接已创建: IoCreateSymbolicLink 调用成功,这使得用户模式应用程序能够通过符号链接来访问设备。

  3. 打开设备: 用户模式应用程序(如记事本)通过符号链接 (\\??\\MyDevice) 打开你的设备。这通常使用 API,如 CreateFile 在用户空间进行。具体而言,打开方式应是以写入权限打开设备,例如使用 GENERIC_WRITE

  4. IRP_MJ_WRITE 请求: 当用户模式应用程序向该设备执行写操作时,会生成一个 I/O 请求包 (IRP),并将其发送到驱动程序。这是通过文件句柄对应的 IRP 进行的,如果驱动正确设置了对应的调度例程,则这个请求会被送到你的驱动中的 MyDriverDispatchWrite 函数处理。

示例流程

  1. 驱动加载并调用你的初始化代码,其中包含上述代码。
  2. 确保没有错误并且设备和符号链接都已创建成功。
  3. 在用户模式下,应用程序例如记事本,尝试打开或写入该设备:
    
    HANDLE hDevice = CreateFile(L"\\\\.\\MyDevice", 
                                GENERIC_WRITE, 
                                0, 
                                NULL, 
                                OPEN_EXISTING, 
                                0, 
                                NULL);
    DWORD bytesWritten;
    WriteFile(hDevice, dataToWrite, dataSize, &bytesWritten, NULL);
    CloseHandle(hDevice);
    
  4. 当调用 WriteFile 时,它会触发一个 IRP_MJ_WRITE 请求,并将其传递给你的驱动程序。由于你在驱动中为这个请求设置了处理函数 MyDriverDispatchWrite,因此它将被调用。

注意事项

  • 如果没有看到对 MyDriverDispatchWrite 的调用,请检查所有步骤是否正确执行,特别是在创建和打开设备时可能遇到的权限问题或其他错误。
  • 确保 IRP 被正确定义和处理,并且没有其他地方阻止 IRP 到达期望的位置。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=5583

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?