-
-
[求助][求助]把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);
....
}
希望知道告知一下原因,先谢谢!
部分代码:
应用程序的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直播授课
赞赏
赞赏
雪币:
留言: