首页
社区
课程
招聘
[求助][求助]把IRP当作参数传给下层函数时,为什么SystemBuffer里读取出来的数据为0??
发表于: 2008-9-29 19:56 4213

[求助][求助]把IRP当作参数传给下层函数时,为什么SystemBuffer里读取出来的数据为0??

2008-9-29 19:56
4213
大家好,我刚学Windows驱动编程,大概有1个月的时间了.今天写一个驱动程序,目的是为了让驱动程序能够接收到应用程序发送的参数,我用DeviceIoControl函数传了两个参数过去,一个是文件名,一个是文件大小,但是出现了问题, 在驱动程序的dispatch函数XxxDeviceControl()里面,当我把Irp当作参数传给一个自定义函数(XxxOpenFile())处理时,在XxxOpenFile()里面读取到的Irp->AssociatedIrp.SystemBuffer的值为0, 但是我在XxxDeviceControl()函数里读取Irp->AssociateIrp.SystemBuffer,却可以正常读取到, 请问这是什么原因?

部分代码:

应用程序的IoDeviceControl函数:
DeviceIoControl(
    Device,
    IOCTL_XXX_OPEN_FILE,
    file_info,                              // file_info是一个FILE_INFORMATION,下面定义
    sizeof(FILE_INFORMATION) + file_info->FileNameLength - 1,
    NULL,
    0,
    &BytesReturned,
    NULL
    ))

typedef struct _FILE_INFORMATION {
  LARGE_INTEGER FileSize;
  USHORT FileNameLength;
  UCHAR FileName[1];
} FILE_INFORMATION, *PFILE_INFORMATION;

驱动程序的Dispatch函数:
XxxDeviceControl(PDEVICE_OBJECT   DeviceObject,PIRP Irp)
{
pfile_info = (PFILE_INFORMATION) Irp -> AssociatedIrp.SystemBuffer;
// 这里能够打印出file size
DbgPrint("the file size is %d, where is XxxDeviceControl\n", pfile_info -> FileSize);

...
io_stack = IoGetCurrentIrpStackLocation(Irp);
switch (io_stack->MajorFunction)
  {
  case IRP_MJ_DEVICE_CONTROL:
    switch (io_stack->Parameters.DeviceIoControl.IoControlCode)
    {
    case IOCTL_XXX_OPEN_FILE:
      Irp->IoStatus.Status = XxxDiskOpenFile(DeviceObject, Irp);
      break;
        ...
        }
}

自定义函数XxxDiskOpenFile函数
XxxDiskOpenFile (
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp
    )
{
    ...
    file_infomation = (PFILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
    // 这里打印出来是 0, 为什么呢??????
    DbgPrint("file size is %d\n", file_infomation->FileNameLength);
    ....
}

希望知道告知一下原因,先谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回