Borden
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2009-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2167回复:12

再问那个没想到的问题!

楼主#
更多 发布于:2001-08-22 15:22
关于昨天问的怎样在用户应用程序中访问设备的问题,竟然就没有人肯说一句?这个论坛是怎么回事啊?有位兄弟回贴说说起来太复杂了,不说了,我只有忍了,谁叫咱笨呢;又有一位斑竹回贴说vtools有,叫我去查,既然这样,您说一句不行吗?我在2000下做WDM,我没有vtools啊!结果我只有自己慢慢查,学sample程序里用SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces以及SetupDiGetDeviceInterfaceDetail来枚举,可编译的时候有一个ULONG_PTR类型说是64位Windows的东东,死活找不到定义编译通不过,结果我弄了一上午也没弄出来....
    各位大哥,我再来厚着脸皮问问,我怎样在用户应用程序里打开我自己的驱动程序访问设备?也就是说,我怎样得到CreateFile的第一个参数?求求你们知道的直接说一声好吗?不要说到哪里查什么什么好吗?我什么资料都没有,您就说调什么函数也就是一句话;不要说以前有N个人问过叫我去找好吗?您再说一次也就是一句话,省了我查找的时间啊,而且我还不一定找得到。各位大哥,如果你们谁知道就拉兄弟一把好吗?我已经在这上面浪费两天了,我想说的正如前面有位兄弟说的,我只是菜鸟,我不是弱智...

最新喜欢:

Jkw_DevJkw_De...
dspboy
驱动牛犊
驱动牛犊
  • 注册日期2001-06-09
  • 最后登录2001-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-08-22 15:55
首先,你的驱动程序中设备命名方式是什么?
如果是符号连接方式,用CreateFile()

HANDLE CreateFile(
  LPCTSTR lpFileName,          // pointer to name of the file ---符号连接名
  DWORD dwDesiredAccess,       // access (read-write) mode
  DWORD dwShareMode,           // share mode
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                               // pointer to security attributes
  DWORD dwCreationDisposition,  // how to create
  DWORD dwFlagsAndAttributes,  // file attributes
  HANDLE hTemplateFile         // handle to file with attributes to
                               // copy
);
如果是全局描述符方式,就只好再说一次去看书了,我也没用过。
其实从开发网可以down资料的,强烈向你推荐walter oney的那本经典书,及其适合初学者,这里的大侠已经把它翻译成中文了,加上
msdn和ddk帮助,这些资料就不少了,呵呵,:P
走进城市的狼,乐观执着的狼。
Borden
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2009-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-08-22 16:07
谢谢您的关心!在WDM中,我遵照walter oney的说法,没有创建符号连接名,因为他说那样做不安全,而我的程序不是编来自己玩的,所以我用GUID注册了一个Interface,然后我就傻了,因为walter oney这孙子自己的样板程序全是符号连接的,虽然他在AddDevice函数那一节讲了通过SetupDi...函数枚举访问设备的方法,但是如上所说,我编译通不过,我又将Chris Cant的Writing Windows WDM Device Drivers一书的样板程序拿来编译,同样通不过,同样是通过SetupDi..函数访问的。所以现在我就不知道该怎么做了,walter oney的书我来来回回地看了,NTDDK和MSDN我也装了,昨天晚上回家还查了半天SetupDi..函数族,没想到会出找不到ULONG_PTR定义这么恶心的事,唉,人生不如意10有89。
dspboy
驱动牛犊
驱动牛犊
  • 注册日期2001-06-09
  • 最后登录2001-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-08-22 16:08
比如说驱动程序里创建了一个设备,符号链接名字是abcdefg,
那么,win32程序可以使用\\.\abcdefg作为传递给createfile的文件名参数来打开这个设备:
HANDLE H1 = CreateFile("\\.\abcdefg"......)
然后就可以利用这个句柄来访问了。
走进城市的狼,乐观执着的狼。
dspboy
驱动牛犊
驱动牛犊
  • 注册日期2001-06-09
  • 最后登录2001-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-08-22 16:10
呵呵,你发在我前头了。
我自己用的符号连接名,没觉得有什么不安全的,很多人都在用,我是指单CPU的情况。
走进城市的狼,乐观执着的狼。
dspboy
驱动牛犊
驱动牛犊
  • 注册日期2001-06-09
  • 最后登录2001-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-08-22 16:16
ULONG_PTR?换个类型试试不行吗?
走进城市的狼,乐观执着的狼。
Borden
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2009-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-08-22 16:28
我现在就是先用着符号连接在调程序,但我想最后我会去掉符号连接的,不管怎么说,我们总应该知道怎么用注册接口访问吧。ULONG_PTR不是我定义的,在SetupDi..函数族中的参数大量使用这种类型,可是我找不到哪个头文件有ULONG_PTR的定义,MSDN说是64位Windows用的类型,我试着在我的程序中typedef了一下ULONG_PTR,结果一编译连stdio.h中都报错了,我搜索NTDDK中的所有头文件,好像没有定义这东西,看来应该是由PlatformSDK定义的,可是我找不到。
另外,访问设备除了createfile还有没有别的方法?createfile除了符号连接和注册接口还有没有别的方法?谢谢
dspboy
驱动牛犊
驱动牛犊
  • 注册日期2001-06-09
  • 最后登录2001-12-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-08-22 16:48
刚刚去看了一下,walter 那本书第二章第三节有这个详细说明啊,不好使吗?
走进城市的狼,乐观执着的狼。
Borden
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2009-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-08-22 17:15
不好使!我就是按照这样写的!Chris Cant那本书的样板代码和这个差不多,就是SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces和SetupDiGetDeviceInterfaceDetail这三个函数,可是编译通不过!我直接#include的setupapi.h,Chris Cant的样板代码也是这样include的啊!难道必须通过这种恶心的函数才能CreateFile?
Buddha
驱动老牛
驱动老牛
  • 注册日期2001-04-29
  • 最后登录2013-05-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望17点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-08-23 09:26

我当时以为你是用符号连接名来createfile呢。
GUID我也没用过,看到Chris Cant的书里写的那么麻烦就没有试过了。
ULONG_PTR:在NTDDK\INC\basetsd.h中定义
typedef [public] unsigned __int3264 ULONG_PTR, *PULONG_PTR;
typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

应该就是一个64无符号的长整形指针吧
<table style="filter: glow(color=sky blue, strength=10)"> <font color=white> 猫生病了, 老鼠大声朗诵诗集, 并修剪盆花. 猫生病了, 老鼠慢慢刷牙洗脸, 并打扫房间. 猫生病了, 老鼠倚在窗边欣赏夜色, 并对流星许愿. 猫生病了, 老鼠也病了, 它说:"我还是习惯那种时时紧张, 处处小心, 夜夜逃亡的生活." 午夜, 我听到老鼠在叹息, 且不再读诗了. </font></table>
Borden
驱动牛犊
驱动牛犊
  • 注册日期2001-07-10
  • 最后登录2009-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-08-23 09:52
ok,谢谢,我会试试那个变态的ULONG_PTR。还有,难道除了GUID就只有符号连接这一条路了吗?难道千千万跟我一样觉得GUID十分恶心的同志都在使用\\\\.\\吗?
Tomgin
驱动牛犊
驱动牛犊
  • 注册日期2001-08-08
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-08-23 11:16
1、应用程序和 .sys 驱动程序的通信
   应用程序和 .sys 驱动程序之间有几种通信方式,他们的优缺点。
2、.sys 驱动程序的动态加载
   nt/2k 下能否通过应用程序进行驱动程序的动态加载,如何加载。

努力呀,还有许多东西不会呢。
Tomgin
驱动牛犊
驱动牛犊
  • 注册日期2001-08-08
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2001-08-23 11:43
我先谈一下,请大家指导。

因为我只接触过 98 的 vxd 编程,所以对于 nt/2k 的驱动程序
我只知道 通过 CreateFile() DeviceIoControl() CloseHandle()
三个函数与驱动程序进行通信。


对于动态加载,我认为 2k 下是可以的,nt 不太清楚。
只是在 2k 下不知道怎样实现。
walter oney 的 devview 就是动态加载的。

在 2k 下,不论怎样,都是通过 CreateFile() 来打开驱动程序。
对 CreateFile() 函数中的第一个参数,肯定是注册过的设备名称
的符号连接。否则 CreateFile() 不会找到驱动程序。
在 98 下 CreateFile 可以通过访问到的驱动程序文件名来加载
驱动程序。 2k 下好像不行。

所以实现动态加载,在应用程序的级别,需要的条件是 注册的设备
名称的符号连接。首先要注册设备,有两种方法,第一种 做一个
.inf 的安装文件。第二种方法手工写注册表,你必须知道你的驱动
程序应该注册那些注册项。创建符号连接,也有两种方法,第一种
在驱动程序里通过 IoCreateSymbolicLink 函数创建,第二种还是
通过手工写注册表来实现。在驱动程序级里你的驱动程序应该实现
IRP_MJ_CREATE,RP_MJ_CLOSE,IRP_MJ_DEVICE_CONTROL 函数。

请大家指正。

努力呀,还有许多东西不会呢。
游客

返回顶部