阅读:2167回复:12
再问那个没想到的问题!
关于昨天问的怎样在用户应用程序中访问设备的问题,竟然就没有人肯说一句?这个论坛是怎么回事啊?有位兄弟回贴说说起来太复杂了,不说了,我只有忍了,谁叫咱笨呢;又有一位斑竹回贴说vtools有,叫我去查,既然这样,您说一句不行吗?我在2000下做WDM,我没有vtools啊!结果我只有自己慢慢查,学sample程序里用SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces以及SetupDiGetDeviceInterfaceDetail来枚举,可编译的时候有一个ULONG_PTR类型说是64位Windows的东东,死活找不到定义编译通不过,结果我弄了一上午也没弄出来....
各位大哥,我再来厚着脸皮问问,我怎样在用户应用程序里打开我自己的驱动程序访问设备?也就是说,我怎样得到CreateFile的第一个参数?求求你们知道的直接说一声好吗?不要说到哪里查什么什么好吗?我什么资料都没有,您就说调什么函数也就是一句话;不要说以前有N个人问过叫我去找好吗?您再说一次也就是一句话,省了我查找的时间啊,而且我还不一定找得到。各位大哥,如果你们谁知道就拉兄弟一把好吗?我已经在这上面浪费两天了,我想说的正如前面有位兄弟说的,我只是菜鸟,我不是弱智... |
|
最新喜欢:Jkw_De... |
沙发#
发布于: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 |
|
|
板凳#
发布于: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。
|
|
地板#
发布于:2001-08-22 16:08
比如说驱动程序里创建了一个设备,符号链接名字是abcdefg,
那么,win32程序可以使用\\.\abcdefg作为传递给createfile的文件名参数来打开这个设备: HANDLE H1 = CreateFile("\\.\abcdefg"......) 然后就可以利用这个句柄来访问了。 |
|
|
地下室#
发布于:2001-08-22 16:10
呵呵,你发在我前头了。
我自己用的符号连接名,没觉得有什么不安全的,很多人都在用,我是指单CPU的情况。 |
|
|
5楼#
发布于:2001-08-22 16:16
ULONG_PTR?换个类型试试不行吗?
|
|
|
6楼#
发布于:2001-08-22 16:28
我现在就是先用着符号连接在调程序,但我想最后我会去掉符号连接的,不管怎么说,我们总应该知道怎么用注册接口访问吧。ULONG_PTR不是我定义的,在SetupDi..函数族中的参数大量使用这种类型,可是我找不到哪个头文件有ULONG_PTR的定义,MSDN说是64位Windows用的类型,我试着在我的程序中typedef了一下ULONG_PTR,结果一编译连stdio.h中都报错了,我搜索NTDDK中的所有头文件,好像没有定义这东西,看来应该是由PlatformSDK定义的,可是我找不到。
另外,访问设备除了createfile还有没有别的方法?createfile除了符号连接和注册接口还有没有别的方法?谢谢 |
|
7楼#
发布于:2001-08-22 16:48
刚刚去看了一下,walter 那本书第二章第三节有这个详细说明啊,不好使吗?
|
|
|
8楼#
发布于:2001-08-22 17:15
不好使!我就是按照这样写的!Chris Cant那本书的样板代码和这个差不多,就是SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces和SetupDiGetDeviceInterfaceDetail这三个函数,可是编译通不过!我直接#include的setupapi.h,Chris Cant的样板代码也是这样include的啊!难道必须通过这种恶心的函数才能CreateFile?
|
|
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无符号的长整形指针吧 |
|
|
10楼#
发布于:2001-08-23 09:52
ok,谢谢,我会试试那个变态的ULONG_PTR。还有,难道除了GUID就只有符号连接这一条路了吗?难道千千万跟我一样觉得GUID十分恶心的同志都在使用\\\\.\\吗?
|
|
11楼#
发布于:2001-08-23 11:16
1、应用程序和 .sys 驱动程序的通信
应用程序和 .sys 驱动程序之间有几种通信方式,他们的优缺点。 2、.sys 驱动程序的动态加载 nt/2k 下能否通过应用程序进行驱动程序的动态加载,如何加载。 |
|
|
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 函数。 请大家指正。 |
|
|