收录日期:2019/08/19 20:50:46 时间: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有没有类似移动文件指针的操作,控制码我就只反出了这四个,很纠结。
结贴了,问题还是没解决,谢谢各位了。

我在用ASP向ACCESS数据库写数据时,表中有部分字段数据为空,数据库就不能更新,怎么办? MSFlexGrid打印问题。 点击“ [讨论]:ORACLE、SQLSERVER、MYSQL与DB2的比较”,怎么出来的是“烂书曝光!!!!”? 各位大侠 IE 的自动填充功能 怎样实现的? 请问诸位大侠,ASP中的vbCrlf是什么意思呀,在线等待:) 数据库项目问题 关于atl得很弱的问题 VC程序打包要用那几个DLL? 我是一只菜鸟,请教拉,呵呵 我国将储备80万软件专业人才 来源:财经时报  发表时间:2002-12-9 调用OCX后,退出是报告DDE SERVER访问非法内存,是什么原因? 有一对话框,希望它一出现,不必按任何键或鼠标,就可以用TextOut显示一行文字,怎样编?谢谢! MDB数据倒入错误 如何解决? 我的课程设计,哪位大虾来帮帮我 ejb事务请教 工程未保存,出现了我不能解决的问题???? 有一张表,我想将他变成以下的表格,该如何实现,请高手帮忙。***该问题难度极大,多谢援助*** 请问阻塞式的Socket能设定发送和接收的限定时间吗? 我在J2ME是新人, 先给各位哥哥散分 ,小弟有理拉 网站的时间是不是不准啊! 在SQL语句中如何残能用双引号来引用带有\'号的字符串,亟待 分数线什么时候划定? 在foxpro里面这样的insert为什么不行?? 关于站点目录权限的问题 C++ Builder和VC,究竟哪个更好! 我是菜鸟,大虾帮帮我 一个字符串处理的问题。 为什么还是不能清屏? 关于查询速度的问题 一个CWinThread::Run函数的问题