找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
楼主: HoviDelphic

【紫水晶首发】VB小子玩转驱动程序(3):驱动通信

 火... [复制链接]

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-24 12:11:34 | 显示全部楼层
硬编码?
硬编码是啥?
好像更难吧

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-1-24 16:50:12 | 显示全部楼层
回复 33# ok100fen
比如说sizeof(ULONG)在XP系统上结果是4 在驱动中就不用写sizeof(ULONG)而是4

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-24 22:55:20 | 显示全部楼层
看了好几遍你的那个驱动模板了
不明白什么意思
再举一个比较生动的例子吧
有点实用价值的
谢谢
我这个 ...
ok100fen 发表于 2010-1-24 00:07



    好吧,写给你。

评分

参与人数 1水晶币 +8 +20 收起 理由
ok100fen + 8 + 20 谢谢,加分了

查看全部评分

如果附件无法下载,请点击这里

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-24 23:54:55 | 显示全部楼层
谢谢斑竹
你太好了

评分

参与人数 1水晶币 +40 +40 收起 理由
HoviDelphic + 40 + 40 精神损失费

查看全部评分

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-25 01:47:35 | 显示全部楼层
本帖最后由 HoviDelphic 于 2010-1-25 01:50 编辑

回复 36# ok100fen


ok大哥,我写了一会,真的写不出来,因为那个驱动模板里面“restore kernel function by name”其实就是VB向驱动里传递字符串的例子“Get EPROCESS By Process ID”就是VB向驱动里传递数字以及驱动向VB传递数字的例子

你若真的还不明白我就真的没办法了,xiaoly99网友在解释上比我清楚,你去问他吧,我给你加点分当作精神损失费吧。:L
如果附件无法下载,请点击这里

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-25 12:07:07 | 显示全部楼层
这么理解对不对
驱动相当于一个程序,这个程序不使用vb写的,可能是用c写的,比如像*.sys这样的。能够隐藏进程或者是键盘记录这样的比较底层的小程序。
而用vb调用这样的驱动,其实vb起到一个调用的作用
也就是说vb写不了*.sys这样的程序
不知道我这样理解对不对~~

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-1-25 12:13:12 | 显示全部楼层
对 驱动是Native Exe

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-1-25 12:14:02 | 显示全部楼层
vb也能写 都是pe文件 但是vb写不出什么有用的

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-25 14:00:45 | 显示全部楼层
对 驱动是Native Exe
xiaoly99 发表于 2010-1-25 12:13



  Native Exe,这是什么意思?

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-1-25 14:15:59 | 显示全部楼层
原生exe 跟原生Api一样 不能在Ring3调用/操作 需要通过sysenter

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-1-26 09:47:01 | 显示全部楼层
晕几天不来 出了这么多!!!!!:L

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-1-27 17:26:06 | 显示全部楼层
回复 19# ok100fen


     所谓驱动,其实我觉得Windows的“驱动”的叫法不太准确,容易让人混淆,我觉得Linux里的内核模块或者内核程序的叫法更准确些,
驱动就是在内核里运行的程序
     什么是内核:操作系统本身就叫内核,比如hal.dll,ntoskernel.exe(这两个实际上是两个动态链接库,也就是标准DLL)这几个是整个windows的核心部分,Windows里成千上万的程序都是靠它在运行,我们看到的桌面等等所有可见不可见的东西,最终都是直接或间接调用的这两个文件里的函数,驱动是直接调用这两个文件里的函数的,普通的程序,不能直接调用这两个文件里的函数。普通程序通常会调用user32.dll这种类型的DLL里的函数,比如VB里:
      Declare Sub MessageBox Alias "MessageBoxA" lib user32(byval hwnd as long,byval pcstr as long,byval pcstr as long,byval Flags as long )

  这个就是VB里msgbox最终实现时调用的函数,这个MessageBoxA是位于user32.dll这个文件里的,而MessageBoxA最终又通过某种方式,调用了ntoskernel.exe这个文件里的N个函数

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-1-27 17:30:18 | 显示全部楼层
比如CreateFile这个函数位于kernel32.dll这个文件里,事实上,这个程序会最终调用内核函数zwCreateFile,但在内核程序里(驱动),我们可以直接使用zwCreateFile(不过这个函数事实上也不是最终调用,最终zwCreateFile被内核里的IO管理器转变成了IRP发到了相应设备上)

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-1-27 17:32:36 | 显示全部楼层
所谓驱动通信,就是让VB有一种途径可以把自己的数据传给驱动程序处理,还可以通过这种途径获得驱动提供的数据

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-27 18:13:01 | 显示全部楼层
回复  ok100fen


     所谓驱动,其实我觉得Windows的“驱动”的叫法不太准确,容易让人混淆,我觉得L ...
364589886 发表于 2010-1-27 17:26



    msgbox貌似和ntoskrnl.exe无关,和win32k.sys有关。
如果附件无法下载,请点击这里

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-1-29 09:08:38 | 显示全部楼层
回复 47# HoviDelphic


    你说的这个在以前,MS是放在用户态的,后来为了提高效率(因为这个文件是关于GDI等操作的,用户能直接感觉到),所以才转移到了内核(不过这种做法违背了windows微内核的架构原则),但最终还是通过调用ntoskernel.exe和hal.dll这两个文件里的函数来实现的,只不过从内核进行调用而已。
   另外,几乎所有(除非自己完全二进制实现)的windows函数,最终都是由ntoskernel.exe和hal.dll这两个文件实现的。所以实质上所谓的windows系统,也就只有这两个文件。。。。不过这种说法不是太精确

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-29 12:03:43 | 显示全部楼层
ls解释得非常通俗易懂
喜欢这样的教程
希望版主继续
看来这个论坛虽然人不多,但是高手很多

0

主题

12

回帖

0

精华

初来乍到

积分
5
发表于 2010-1-30 22:20:18 | 显示全部楼层
看完就顶,好的习惯!

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-30 22:28:45 | 显示全部楼层
回复  HoviDelphic
有段时间琢磨了好久给驱动传构造类型,弄了半天,都没成功,最后还是一个个传好……
TengAttack 发表于 2010-1-21 23:22



所谓的构造类型就是自定义类型吧?很好传递的:
VB:

  1. Private Type RsData
  2.     TarAddr As Long
  3.     RsLength As Long
  4.     OriDat(259) As Byte
  5. End Type
  6. Dim xx As RsData '自定义类型
  7. With DrvController
  8.     .IoControl .CTL_CODE_GEN(&H1), VarPtr(xx), Len(xx), 0, 0 '函数名称
  9. End With
复制代码
Driver:

  1. typedef struct _Unhook {
  2.    ULONG    TarAddr; //目标地址
  3.    ULONG    Length;    //需要覆盖的长度
  4.    BYTE        OrigiData[MAX_PATH];//原始数据
  5. } UNHOOK, *PUNHOOK;
  6.     switch(uIoControlCode)
  7.     {
  8.         case IOCTL_UnHook:
  9.             {
  10.                 UNHOOK UnHook={0};

  11.                 memcpy(&UnHook,InputBuffer,sizeof(UNHOOK));

  12.                 MemOpen();
  13.                 memcpy((PVOID)UnHook.TarAddr,UnHook.OrigiData,UnHook.Length);
  14.                 MemClose();
  15.                 ntStatus = STATUS_SUCCESS;
  16.                 break;
  17.             }
  18.     }
复制代码
如果附件无法下载,请点击这里

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-1-31 18:41:02 | 显示全部楼层
回复 49# ok100fen


    建议去FreeBasic板块看下相关文章,我打算用BASIC讲驱动了。。。当然不是VB,VB没法写驱动,FB基本可以做C能做的所有事

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
发表于 2010-2-1 09:41:38 | 显示全部楼层
回复 51# HoviDelphic


    呵呵,MemOpen();,这个以前都没见过……
上帝一样掷骰子!

0

主题

14

回帖

0

精华

初来乍到

积分
26
发表于 2010-5-5 19:26:05 | 显示全部楼层
我刚开始学驱动开发,模板能不能给一个,要不学起来太费劲了

1

主题

16

回帖

0

精华

初来乍到

积分
27
发表于 2010-5-16 23:54:59 | 显示全部楼层
很好很强大

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-9-8 23:18:17 | 显示全部楼层
重新看了一遍

觉得好多了

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-9-8 23:20:10 | 显示全部楼层
重新看了一遍

觉得好多了

0

主题

30

回帖

0

精华

铜牌会员

积分
124
发表于 2012-5-18 21:47:19 | 显示全部楼层
好东西。。受益匪浅。。

1

主题

48

回帖

0

精华

金牌会员

积分
978
发表于 2012-6-23 18:15:06 | 显示全部楼层
先回了再看
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表