阅读:1221回复:5
新手求教
:D
1。请问:Win32应用程序中CreateFile()所获得的Handle是从哪,以什么形式分配来的呢?因为在“Windows WDM设备驱动程序开发指南“的例子程序WDM1中,Wdm1Create()好像并没有返回什么句柄之类的。 2。在Windows系统中,设备栈是不只有一个,所有的设备都往上添呢.还是每一类设备有一个设备栈?在“Windows WDM设备驱动程序开发指南“中好像说得不太清楚。 请指教。谢谢! |
|
沙发#
发布于:2004-02-27 15:08
Handle是内核数据结构表的索引
设备栈是不只有一个,同一种设备类型里所有的设备都往上添。 UPFILTER-》FDO-》LOWER FILTER-》PDO |
|
|
板凳#
发布于:2004-02-27 17:13
谢谢答复。
那么,是不是可以这样理解呢, 对于1。在AddDevice()中,通过登录符号连接或设备接口,在系统内核就建立起了这么一个索引,之后在CreateFile()时,内核就可返回一个Handle了?那么,他是根本就不用经过驱动程序呢,还是驱动程序在Wdm1Create()中通过向下传递IO请求包(IRP)来由内核返回Handle呢? 对于2。是不就是说如果USB集线器上挂了3个设备的话,每一个设备都有一个自己的设备栈呢? 对不起,罗罗嗦嗦问了一大堆。 |
|
地板#
发布于:2004-02-28 16:11
在chris cant的书的wdm1的exe\wdm1test.cpp里的有wdm1的句柄,涉及到的函数如下。被main调用的函数GetDeviceViaInterface((LPGUID)&WDM1_GUID,0).此函数返回wdm1的句柄。GetDeviceViaInterface((LPGUID)&WDM1_GUID,0).此函数的WIN32调用保证打开指定GUID的设备信息集。最后以return rv=CreateFile( ifDetail->DevicePath,
GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);来返回实际句柄.rv返回至GetDeviceViaInterface |
|
地下室#
发布于:2004-03-03 17:41
谢谢。
对不起,问题没有写清楚。 我想问的实际上就是Win32应用程序中的CreateFile()与驱动程序中的Create()例程之间是什么关系。因为在Wdm1Create()中正如作者所说什么也没做,只是把IRP向下传递,那么是不是通过这个传递,系统内核向CreateFile()返回一个句柄呢?还是在Wdm1这个例子中实际上没有Wdm1Create()也行? |
|
5楼#
发布于:2004-03-04 09:50
好象是必须的吧,在wdm1源代码的dispatch.cpp里的wdm1creat例程前面有一行注释写着//Handle IRP_MJ_CREATE requests
所以这例程可能是必须的,否则IRP_MJ_CREATE会找不到例程而返回失败(我是菜鸟,说不不定对) |
|