收录日期:2019/12/09 21:24:07 时间:2016/08/13 18:43:15 标签:驱动开发/核心开发
各位哥哥姐姐,我想请教怎么样用DeviceIoControl()读取PCI板卡的内存空间,我想一个字节一个字节地读取,就是说定义输出缓冲区为一个字节,但是它每次都是读取的是内存空间的第一个字节,怎么样移动它的文件指针呀,让它一个一个字节依次把内存空间里的数据都读取出来呢?
没人回自己up
能把代码贴出来么
读取数据的时候肯定会有一个地址呢 偏移地址就行
这个函数原型是:BOOL DeviceIoControl(
  HANDLE hDevice, 
  DWORD dwIoControlCode, 
  LPVOID lpInBuffer, 
  DWORD nInBufferSize, 
  LPVOID lpOutBuffer, 
  DWORD nOutBufferSize, 
  LPDWORD lpBytesReturned, 
  LPOVERLAPPED lpOverlapped
);   
里面好像用不到读取数据的地址呀,还有偏移地址该怎么写呀,我现在就是只想一个个字节读出来,不用 readfile(),可是我每次调用这个函数读取到的都是内存空间的第一个字节,第二个及以后的字节怎么才能读出来呢,输出缓冲区是一个字节大小
这个是我用IDA反的驱动程序附带的测试程序:
char __cdecl sub_401340(int OutBuffer)
{
  int InBuffer; // [sp+0h] [bp-8h]@1
  DWORD BytesReturned; // [sp+4h] [bp-4h]@1

  InBuffer = 4 * OutBuffer;
  if ( !DeviceIoControl(hDevice, 0x222008u, &InBuffer, 4u, &OutBuffer, 1u, &BytesReturned, 0) )
    AfxMessageBox("Memory READBYTE ERROR!", 0, 0);
  return OutBuffer;
}
它里面就是定义输出缓冲区为一个字节整型,我也没有办法呀,它的驱动程序我没法改,只能在我自己程序中调用它的,我看它的测试程序是这样写的,所以我也想把这个应用到自己的程序中呀,如果是我自己写的驱动我就不会定义一个字节的输出缓冲区了,我是菜鸟呀希望各位不要嫌弃
哎没人知道准备结账吧
DeviceIoControl(hDevice, 0x222008u, &InBuffer, 4u, &OutBuffer, 1u, &BytesReturned, 0)
hDevice为设备对象句柄,0x222008u为给驱动程序的控制码,
&InBuffer使应用程序输入给驱动的信息,4u代表应用程序输给驱动程序信息大小(就是&InBuffer的缓冲区长度)。
&OutBuffer为驱动程序给应用程序输出信息,1u代表&OutBuffer分配的应用程序缓冲区大小,如果应用程序接受驱动程序的缓冲区大小不够,那么BytesReturned会有驱动程序实际需要的缓冲区大小,根据BytesReturned返回的值应用程序重新分配缓冲区,接受应用程序的数据。
0代表了同步的执行deviceiocontrol
引用 7 楼 jzxsasch 的回复:
DeviceIoControl(hDevice, 0x222008u, &InBuffer, 4u, &OutBuffer, 1u, &BytesReturned, 0)
hDevice为设备对象句柄,0x222008u为给驱动程序的控制码,
&InBuffer使应用程序输入给驱动的信息,4u代表应用程序输给驱动程序信息大小(就是&InBuffer的缓冲……

我用这个0x222008u控制码的时候,我自己定义输出缓冲不管多大,BytesReturned返回的总是1啊,现在的情况就是可以返回一个字节,但是是不是原来驱动程序的问题啊,可是我看它带的那个测试程序里面可以读2K的哦,还可以读任意地址,我怀疑是不是用了readfile这个函数,可是我在IDA里面找不到测试程序里面用的readfile(),只有deviceiocontrol(),
引用 3 楼 woshi_ziyu 的回复:
读取数据的时候肯定会有一个地址呢 偏移地址就行

请问怎么写偏移地址呀
readfile 和DeviceIoControl在对应到驱动中是不同的分派函数,就像访问不同的网站一样。应用程序调用DeviceIoControl根据不同控制码来区分是什么样的控制请求,所以不同控制码返回值不同,如同访问一个网站的不同页面。
readfile和deviceIoControl对应到驱动中是不同的请求,就像访问不同的网站站点一样。deviceIoControl又根据不同的控制码返回执行不同的操作,返回结果也不一样,如同访问同一网站的不同模块网页。
readfile和deviceIoControl对应到驱动中是不同的请求,就像访问不同的网站站点一样。deviceIoControl又根据不同的控制码返回执行不同的操作,返回结果也不一样,如同访问同一网站的不同模块网页。
引用 10 楼 jzxsasch 的回复:
readfile 和DeviceIoControl在对应到驱动中是不同的分派函数,就像访问不同的网站一样。应用程序调用DeviceIoControl根据不同控制码来区分是什么样的控制请求,所以不同控制码返回值不同,如同访问一个网站的不同页面。

我懂您的意思了,但是我用IDA看它那个测试的时候与deviceiocontrol()有关的只有下面几个:
__int16 __cdecl sub_4012A0(char InBuffer)
{
  __int16 OutBuffer; // [sp+2h] [bp-6h]@1
  DWORD BytesReturned; // [sp+4h] [bp-4h]@1

  if ( !DeviceIoControl(hDevice, 0x222000u, &InBuffer, 4u, &OutBuffer, 2u, &BytesReturned, 0) )
    AfxMessageBox("IO READWORD ERROR!", 0, 0);
  return OutBuffer;
}


BOOL __cdecl sub_4012F0(int OutBuffer, DWORD BytesReturned)
{
  BOOL result; // eax@1
  int InBuffer; // [sp+0h] [bp-8h]@1
  __int16 v4; // [sp+4h] [bp-4h]@1

  InBuffer = OutBuffer;
  v4 = BytesReturned;
  result = DeviceIoControl(hDevice, 0x222004u, &InBuffer, 8u, &OutBuffer, 4u, &BytesReturned, 0);
  if ( !result )
    result = AfxMessageBox("IO WRITEWORD ERROR!", 0, 0);
  return result;
}


char __cdecl sub_401340(int OutBuffer)
{
  int InBuffer; // [sp+0h] [bp-8h]@1
  DWORD BytesReturned; // [sp+4h] [bp-4h]@1

  InBuffer = 4 * OutBuffer;
  if ( !DeviceIoControl(hDevice, 0x222008u, &InBuffer, 4u, &OutBuffer, 1u, &BytesReturned, 0) )
    AfxMessageBox("Memory READBYTE ERROR!", 0, 0);
  return OutBuffer;
}


BOOL __cdecl sub_4013A0(int OutBuffer, DWORD BytesReturned)
{
  BOOL result; // eax@1
  int InBuffer; // [sp+0h] [bp-8h]@1
  char v4; // [sp+4h] [bp-4h]@1

  v4 = BytesReturned;
  InBuffer = 4 * OutBuffer;
  result = DeviceIoControl(hDevice, 0x22200Cu, &InBuffer, 8u, &OutBuffer, 4u, &BytesReturned, 0);
  if ( !result )
    result = AfxMessageBox("Memory WRITEBYTE ERROR!", 0, 0);
  return result;
}
这几个,也就是与它有关的控制码只有四个,里面控制码都是只读一个字节或者一个双字的,但是运行它的测试程序的时候它却是可以访问2KB的,我找不到它那个读2K的控制码,用什么方法可以读出其他字节出来呢?我搜索也找不到readfile,我知道readfile是可以移动文件指针的,但是很奇怪它用的是deviceiocontrol(),我不知道deviceiocontrol有没有类似移动文件指针的操作,控制码我就只反出了这四个,很纠结。
结贴了,问题还是没解决,谢谢各位了。

在二元树中找出和为某一值的所有路径 C++迷茫啊,高手指点一下 csv文件转表格网页的php脚本报错 Strict Standards 突然看到string.h中还有extern \"c++\"---什么作用啊? 【原创&交流】《Windows图形编程》中的一个例程所引发的收获和思考 innerhtml可以放置asp.net控件吗? 关于setsockopt函数 有经验人进来指点迷津 js调用html向前 js可以编写一个自动注册QQ号码的脚本么 一段SQL返回错误,不知道什么原因 用c++编面向对象的程序,用指针后程序报读内存出错 初学者的问题,关于在客服端onclick调用js函数的问题 将数据从文件中读出,并将其中的回车符‘\\r’替换为‘#’,存放在一个Buffer中 Oracle建表问题 ! !关于fstream的一个问题 为什么NetBeans6.8默认格式是utf-8,但看不了utf-8的文件 新手问个问题 想学习C/C++,应该如何开始啊 十万火急,有谁对facebook api的ASP调用比较熟悉,请救我于水火,愿把所有可用分送上,谢谢! 腾迅骂360?有什么好骂的?互骂? 一个简单的界面问题 最近项目中遇见的问题和参考资料 Sax解析解析遇见中文就解析报not well-formed 异常 字符串 操作 不小心把SYBASE的配置文件REMOVE了,请问怎样创建?? 十万火急,有谁对facebook api的ASP调用比较熟悉,请救我于水火,愿把所有可用分送上,谢谢! mail.jar问题 oracle 截取字符 如果调试封装了窗体的DLL 关于windows api中的LoadString的一个问题