hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1949回复:12

又是DeviceIoControl惹的祸

楼主#
更多 发布于:2004-01-13 21:43
又是DeviceIoControl惹的祸
应用程序中置数,驱动中接收到后立刻返回该数,但是数就变了,为什么?
请各位老大援手,以下是程序段:

驱动:
NTSTATUS ThinDevice::READ_DATA_Handler(KIrp I)
{

NTSTATUS status;
UCHAR a[84];
UCHAR b;

b=(UCHAR)I.IoctlBuffer();

if(I.IoctlOutputBufferSize()>=sizeof(UCHAR))
{
*(UCHAR*)I.IoctlBuffer()=b;
I.Information() = sizeof(UCHAR);
status=STATUS_SUCCESS;
}
else
{
I.Information()=0;
status=STATUS_BUFFER_TOO_SMALL;
}

return status;
}

WRITE_DATA_HANDLER中未作处理。

应用程序中:

#define IOCTL_INBUF_SIZE 512
#define IOCTL_OUTBUF_SIZE 512
void Test_READ_DATA(void)
{
UCHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device
UCHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device
ULONG nOutput; // Count written to bufOutput

// Call device IO Control interface (READ_DATA) in driver
printf(\"Issuing Ioctl to device - \");
if (!DeviceIoControl(hDevice,
READ_DATA,
NULL,
0,
bufOutput,
IOCTL_OUTBUF_SIZE,
&nOutput,
NULL)
)
{
printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError());
Exit(1);
}
else
{
printf(\"Reveiving Data Now...\\n\");
printf(\"Data:0x%x\\n\",*bufOutput);
}
}

返回的数有时是0x8,有时是0xFFFFFFE8,有时是0xFFFFFFC8,怎么一个原因呢?
请各位大虾援手!!!


[编辑 -  1/13/04 by  hawkdtw]
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-01-14 14:35
各位老大,一天多了也没有人搭理,斑竹呢?给点指示吗。只好自己顶顶了。
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
dswei
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2010-06-13
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-01-14 14:54
对于UCHAR类型的变量来说,用printf(\"%x...)输出时,是不会出现“0xFFFFFFE8,有时是0xFFFFFFC8”这种情况的
CYoung
驱动中牛
驱动中牛
  • 注册日期2003-06-10
  • 最后登录2005-01-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-01-14 15:12
检查一下你的数据线,看看和你的数据类型符不符合,不符合就有可能出现这样的情况。
答得好的话,请兄弟们加点分,那是对我的肯定
dswei
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2010-06-13
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-01-14 15:31
0xFFFFFFE8或0xFFFFFFC8已经是4个字节的输出了,你用printf(\"%d\")试试。如果你的应用程序没出错的话,这真是个棘手的问题。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2004-01-14 16:19
1、
b=(UCHAR)I.IoctlBuffer();
这是什么?地址被截掉大部分,赋值给b。
2、
*(UCHAR*)I.IoctlBuffer()=b;
I.Information() = sizeof(UCHAR);
那么这相当于是bufOutput[ 0 ]=b了
3、
printf(\"Data:0x%x\\n\",*bufOutput);
打印出bufOutput[ 0 ]的值。但是也不会0xFFFFFFC8这样的。
hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-01-14 17:12
检查一下你的数据线,看看和你的数据类型符不符合,不符合就有可能出现这样的情况。

-----------------------------
不知你说的是哪儿的数据线?PCI侧还是LOCAL侧?我的LOCAL侧是8位复用的PCI侧是32位的。
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-01-14 17:23
对于UCHAR类型的变量来说,用printf(\"%x...)输出时,是不会出现“0xFFFFFFE8,有时是0xFFFFFFC8”这种情况的
---------------------

我已经改正了,目前是没有前面的0xFFFFFF字符了,而且已经把UCHAR改成ULONG了,不过返回的数据还是不对,刚编译完VC的测试程序后返回的是0x28,然后是0x8,一直是0x8就不变了。为什么不是我想要的0xcf呢?
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
dswei
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2010-06-13
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-01-14 21:48
我知道怎么回事了!
把例程NTSTATUS ThinDevice::READ_DATA_Handler(KIrp I)里的
b=(UCHAR)I.IoctlBuffer();
改成
UCHAR* p=(UCHAR*)I.IoctlBuffer();
b=p[0];
再不成就没天理了

hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-01-15 19:23
老大,不灵呀,还有其他招没有?
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
dswei
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2010-06-13
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-01-15 20:07
你的DEVICE IO 是METHOD_BUFFERED方式吗
hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-01-20 12:02
谢谢大家的关注,首先祝大家春节快乐!

我在用DS生成框架时选择的是Buffer类啊!
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
ahun1234
驱动牛犊
驱动牛犊
  • 注册日期2008-07-25
  • 最后登录2011-03-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望19点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-07-31 14:24
试试用wprintf()看看
游客

返回顶部