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

测试的应用程序返回的数据很古怪(DeviceIoControl)

楼主#
更多 发布于:2004-01-13 19:34
测试的应用程序返回的数据很古怪:

当驱动中希望返回0x00~0x7F时,应用程序返回的是0x00~0x7F;
而当驱动中希望返回>0x7F,例如期望返回0xAF时,应用程序返回的却是0xFFFFFFAF.

为什么会变呢?DeviceIoControl函数究竟怎么用才正确呢?

以下是驱动和应用测试程序的有关代码:

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

NTSTATUS status;

UCHAR a[84];
int i;

UCHAR b;
b=0xa5;

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;
}

应用程序中:
void Test_READ_DATA(void)
{

CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device
CHAR 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,
bufInput,
IOCTL_INBUF_SIZE,
bufOutput,
IOCTL_OUTBUF_SIZE,
&nOutput,
NULL)
  )
{
printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError());
Exit(1);
}
else
printf(\"Data:0x%x\\n\",*bufOutput);
}
哪位大侠指导一下啊,困了好几天了。
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
dswei
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2010-06-13
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-01-13 19:57
你把
CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device
CHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device
改为
UCHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device
UCHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device
试试
hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-01-13 20:22
给分先。
大侠果然是高手,刚刚试了试,果然灵验(不知能否给个联系方法,我的email:hawk@emails.bjut.edu.cn),不过又有新问题如下:

又是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)
{
CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device
CHAR 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]

[编辑 -  1/13/04 by  hawkdtw]
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
dswei
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2010-06-13
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-01-13 20:27
你把CHAR改为UCHAR就可以了,
你不访用printf(\"%d...\")替换printf(\"%x...\"),就会发现所谓出错的地方全是负数。其实你没错,程序也没错,只是你认为打印结果错了。

你比我深入得多,我基本上都是用DS做的,现在才刚摸DDK,互相切磋:dswei99@sina.com

[编辑 -  1/13/04 by  dswei]
游客

返回顶部