fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1883回复:14

请教IoControl问题

楼主#
更多 发布于:2003-12-29 10:37
写了一个中间层驱动,
在使用iocontrol的时候,
发现在IRP中的结构乱了
代码如下:

NTSTATUS IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION  irpSp;
    ULONG               functionCode;
    NDIS_STATUS         status;
    ULONG               dataLength =0;

status = NDIS_STATUS_SUCCESS;
    irpSp = IoGetCurrentIrpStackLocation(Irp);

    functionCode=irpSp->Parameters.DeviceIoControl.IoControlCode;
    if(functionCode == IOCTL_SET_PORT)
{
short wPort = 0;
memcpy(&wPort,irpSp->Parameters.DeviceIoControl.Type3InputBuffer,sizeof(short));
g_wPort = wPort;
}
else if(functionCode == IOCTL_BEGIN_TRANS)
{
g_bTrans = 1;
}
else if(functionCode == IOCTL_STOP_TRANS)
{
g_bTrans = 0;
}

Irp->IoStatus.Status = status;
    Irp->IoStatus.Information = dataLength;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return status;
}

外部则是调用CreateFile,然后用DeviceIoControl
结果发现dwIoControlCode变成了nInBufferSize
xiongcs
驱动牛犊
驱动牛犊
  • 注册日期2003-12-17
  • 最后登录2004-03-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-29 16:23
是否使用了UNICODE
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-29 17:07
好像没有吧?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-29 17:51
确定你上层来的数据是否使用的是TYPE3INPUTBUFFER,你返回上层的DATALENGTH忘了设了?
IOCTL是怎么定义的?上层的DEVICEIOCONTROL是怎么用的?
根据地的兄弟们,团结就是力量
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-30 08:41
下面是测试的代码

m_hFile=CreateFile(\"\\\\\\\\.\\\\TransUDPIoDispatchDevice\",
GENERIC_ALL,
                         0,
                         NULL,
                         OPEN_EXISTING,
                         FILE_FLAG_OVERLAPPED,
                         0
                         );

         BOOL bRet = FALSE;
         DWORD dwIo = 0;
dwIo = (DWORD)IOCTL_SET_PORT;
DWORD dwRet;
bRet = DeviceIoControl(
m_hFile,
dwIo,
&m_Port,
sizeof(short),
NULL,
0,
&dwRet,
NULL
);

定义如下:
#define FILE_DEVICE_TRANSUDP        0x9000
#define METHOD_BUFFERED                 0
#define FILE_ANY_ACCESS                 0
0

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \\
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \\
)

#define IOCTL_SET_PORT   (ULONG) CTL_CODE(FILE_DEVICE_TRANSUDP, 1 , METHOD_BUFFERED, FILE_ANY_ACCESS)
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-30 11:46
有些地方确实没试过你这样行不行,这些地方是:
bRet = DeviceIoControl(
m_hFile,
dwIo,
&m_Port,
sizeof(short),
NULL,
0,
&dwRet,
NULL
);
输出缓冲区你不要,用NULL不知道是否有影响
你可以试试给一个输出缓冲区

#define METHOD_BUFFERED 0
这个你是摘录的WIN的定义还是你自己定义的?这个可以不定义,改了会有影响的。


你这儿用的METHOD_BUFFERED,那传到下层的数据不再irpSp->Parameters.DeviceIoControl.Type3InputBuffer,在pIrp->AssociatedIrp.SystemBuffer


其它参数我使用的和你不一样,我给你我用了可以得吧
CreateFile( name,
            GENERIC_READ | GENERIC_WRITE,
  0,
  NULL,
  OPEN_EXISTING,
  0,
  NULL);

#define FILE_DEVICE_TRANSUDP 0x9000
这个忘了WIN留给用户的是哪些了,越大越好



根据地的兄弟们,团结就是力量
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-12-30 13:04
这些东西,是我根据Packet里面的稍加修改弄过来的
DeviceIoControl的参数是合法的
CreateFile参数也合法

那些Buffer,我也指定过,结果还是一样
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-12-31 10:50
那你指的DWIOCONTROLCODE变成了NINBUFFERSIZE是指什么时候?

PACKET弄过来的?能说清楚一点吗?
根据地的兄弟们,团结就是力量
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-01-02 13:13
主要是在驱动里收到的irp结构中的数据位置不正确

我的所有定义,和调用方法都是根据Packet例子里的方法作相关修改的
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-01-06 16:01
对不起,这几天没来,你说IRP里面数据域和你想象不一样,你是怎么判断的?用调试工具还是你应用的时候直接用了偏移量?
根据地的兄弟们,团结就是力量
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-01-09 08:36
我用softice看过

我用Packet例子里面的方法来解析IRP内容的
具体代码在上面贴了
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-01-09 11:52
你再看看是不是你对上层发下来的参数存放位置理解有偏差,这些参数好多用的是联合,我看你用的是METHOD_BUFFERED,但是它的参数不是在Parameters.DeviceIoControl.Type3InputBuffer,而是pIrp->AssociatedIrp.SystemBuffer,用的方式不一样,这些联合存放的参数意义就不一样了。
根据地的兄弟们,团结就是力量
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-01-09 14:07
那请问,如果我采用METHOD_BUFFERED
那我从哪里取得上层传下来的控制码(dwIoControlCode)那?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-01-09 21:01
控制码的地方一样,但是数据缓冲区不同,不过你再试试,说不定和文挡的不一样喃:)
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-01-09 21:01
控制码的地方一样,但是数据缓冲区不同,不过你再试试其他的是不是也有不同,说不定和文挡的不一样喃:)
根据地的兄弟们,团结就是力量
游客

返回顶部