Programming 版 (精华区)

发信人: Sun (大灯泡), 信区: Programming
标  题: [转载] [讨论]VXD与SYS问题         
发信站: 紫 丁 香 (Thu Sep  9 10:40:47 1999), 转信

Hi, So pleased to visit BBS again!
        十分想念各位学习VXD的朋友!现有很多问题
想和大家讨论:

1. 物理内存:
        Dreammy (这个杀手不太冷)在文章〖技术】Win95下的32位
应用程序访问物理内存的方法中提出了三种办法.我也做了一些试验,
但三种方法中只有DeviceIO有点进展,用的是VC5.0 mfc.但是在VXD中
只是简单的MapPhysToLinear后把结果作为线性地址传给了App.从运
行结果来看,查看f0段的ROM区结果是对的,其他地方的读好象也可以,
但是我写c0段的RAM区时,写不上去,(写完了再读,发现和原来的一样)
(读写的过程都是在App中进行的).请问是什么原因?
        Dreammy 的第一种方法,在VXD提供Win32 Service ,用
Register_Win32_Service . 然后在Win32应用中用VxDCall这些未公
开API.我应如何使用Register_Win32_Service函数?在此函数中,
 DDB_Offset参数应如何获得?因为DDB是用宏产生的.
        Dreammy 的第三种方法,中断门我不太会用,在<<windows95
 system programming secrets>>一书中有类似的调用门的方法,但不
知为何,其程序phys在我的机器上运行的结果不正确,phyaddress
的结果都是FFFFFFFF.程序源文件也无法编译通过.求教.
        还有问题是:在16位的VXD中用Allocate_LDT_Selector等函数
来继MapPhySToLinear后,来处理物理内存,可传给应用一个指针来访问
它,但win32中没有了选择子,这一部分我应该如何操作?
若用函数Map_Lin_To_VM_Addr,其DPL是多少?
        我在VC5.0中无法使用ax=1684h,INT 2fh,所以WIN32的App无法
象以前的WIN16方法和VXD通讯,是不是这样?另外,在VC5.0中(用了MFC)
我无法使用内嵌汇编(编译时总提示类型不匹配).问问各位有何良策?

2.SYS问题:
        因为我的活儿最终定在Nt平台上,所以转想NT DDK了,现在刚
开始,许多问题不懂.
        在VXD中,有很多方法使VXD通讯到APP,如SHELL_POSTMESSAGE
等,但在NT下的SYS有何方法?
在中断后,如何及时通知APP, 信号灯,互斥对象等可用吗?还是只能开一
个线程,不断调用DeviceIoControl?


发信人: suxm (笨笨), 信区: Programming

【 在 arcarc (异乡人) 的大作中提到: 】
: Hi, So pleased to visit BBS again!
:         十分想念各位学习VXD的朋友!现有很多问题
: 想和大家讨论:
: 1. 物理内存:
:         Dreammy (这个杀手不太冷)在文章〖技术】Win95下的32位
: 应用程序访问物理内存的方法中提出了三种办法.我也做了一些试验,
: 但三种方法中只有DeviceIO有点进展,用的是VC5.0 mfc.但是在VXD中
: 只是简单的MapPhysToLinear后把结果作为线性地址传给了App.从运
: 行结果来看,查看f0段的ROM区结果是对的,其他地方的读好象也可以,
: 但是我写c0段的RAM区时,写不上去,(写完了再读,发现和原来的一样)
: (读写的过程都是在App中进行的).请问是什么原因?

内存锁定了吗?在VXD中对内存写一下试试。


:         Dreammy 的第一种方法,在VXD提供Win32 Service ,用
: Register_Win32_Service . 然后在Win32应用中用VxDCall这些未公
: 开API.我应如何使用Register_Win32_Service函数?在此函数中,
:  DDB_Offset参数应如何获得?因为DDB是用宏产生的.
:         Dreammy 的第三种方法,中断门我不太会用,在<<windows95
:  system programming secrets>>一书中有类似的调用门的方法,但不
: 知为何,其程序phys在我的机器上运行的结果不正确,phyaddress
: 的结果都是FFFFFFFF.程序源文件也无法编译通过.求教.
:         还有问题是:在16位的VXD中用Allocate_LDT_Selector等函数
: 来继MapPhySToLinear后,来处理物理内存,可传给应用一个指针来访问
: 它,但win32中没有了选择子,这一部分我应该如何操作?
: 若用函数Map_Lin_To_VM_Addr,其DPL是多少?
:         我在VC5.0中无法使用ax=1684h,INT 2fh,所以WIN32的App无法
: 象以前的WIN16方法和VXD通讯,是不是这样?另外,在VC5.0中(用了MFC)
                             ~~~~~~~~~~
                             是

 : 我无法使用内嵌汇编(编译时总提示类型不匹配).问问各位有何良策?
: 2.SYS问题:
:         因为我的活儿最终定在Nt平台上,所以转想NT DDK了,现在刚
: 开始,许多问题不懂.
:         在VXD中,有很多方法使VXD通讯到APP,如SHELL_POSTMESSAGE
: 等,但在NT下的SYS有何方法?
: 在中断后,如何及时通知APP, 信号灯,互斥对象等可用吗?还是只能开一
: 个线程,不断调用DeviceIoControl?

VxD与NT不兼容,NT支持的是kernel-mode-driver.清华书店有本讲
NT驱动程序的书,可以参考一下。

BTW:你的问题说得不是很清楚,到底是谁分配了内存,又想给谁用?
     我都读糊涂了。






发信人: arcarc (异乡人), 信区: Programming

【 在 suxm (笨笨) 的大作中提到: 】
: 内存锁定了吗?在VXD中对内存写一下试试。
:                              ~~~~~~~~~~
:                              是
:  : 我无法使用内嵌汇编(编译时总提示类型不匹配).问问各位有何良策?
: VxD与NT不兼容,NT支持的是kernel-mode-driver.清华书店有本讲
: NT驱动程序的书,可以参考一下。
: BTW:你的问题说得不是很清楚,到底是谁分配了内存,又想给谁用?
:      我都读糊涂了。
I just want to access phy-memory,and use it in App
How to  lock the memory in vxd? I am sorry,I find there are much different
between win32 and win16.

The other question is about NTDDK, in my sys part,how can I inform the
App that the certain interupt has occured.

 Thanks


发信人: suxm (笨笨), 信区: Programming

【 在 arcarc (异乡人) 的大作中提到: 】
: I just want to access phy-memory,and use it in App
: How to  lock the memory in vxd? I am sorry,I find there are much different
: between win32 and win16.
在VXD中锁定内存,如果是VXD分配的,那你可以在分配时
用一些FLAG来锁定它。
PageAllocate(1,PG_VM,hVM,0,0,-1,&PhysAddr, 
                  PAGECONTIG|PAGEUSEALIGN|PAGEFIXED,&hMem,&iAddress); 
或者:
PageAllocate(1,PG_SYS,0,0,0,-1,&PhysAddr,PAGELOCKED,&hMem,&iAddress);
这样分配的内存都是锁定的。

的确,对于WIN32和WIN16差别很大。
下面分别说一下:
对于WIN16:
(1)在WIN16中分配了内存,想给VXD用。
     在Win16中,GlobalAlloc(),GlobalLock(),GlobalFix() ,GlobalPageLock(),
     wSeg =HIWORD(lpBuf);
   wOff = LOWORD(lpBuf);这里的lpBuf是前面几个函数分配的内存。
     mov cx,wSeg 
   mov dx,wOff 

     用完之后,GlobalFree();     
     在VxD中
     int* pLinearAddress; 
  
     pLinearAddress = Map_Flat(CLIENT_CX,CLIENT_DX);
然后你就可以在VxD中对pLinearAddress进行操作了。
(2)在VXD中分配了内存,想给WIN16用。
_MapPhysToLinear,Map_Lin_To_VM_Addr,同样,你应
该注意内存锁定。


对于WIN32:
最简单了,只要内存锁定了,那在VXD中分配内存后得到的指针
可以直接传给WIN32用。反之亦然。不过要说明的是,WIN32分配的内存
要想在全局与VXD共享,就必须用内存映射。

: The other question is about NTDDK, in my sys part,how can I inform the
: App that the certain interupt has occured.
:  Thanks
对于kernel-mode-driver我不是很熟悉,对不起。
多看看NTDDK的文档可能会有帮助吧。




发信人: arcarc (异乡人), 信区: Programming

【 在 suxm (笨笨) 的大作中提到: 】
: 在VXD中锁定内存,如果是VXD分配的,那你可以在分配时
: 用一些FLAG来锁定它。
: PageAllocate(1,PG_VM,hVM,0,0,-1,&PhysAddr, 
:                   PAGECONTIG|PAGEUSEALIGN|PAGEFIXED,&hMem,&iAddress); 
: 或者:
: PageAllocate(1,PG_SYS,0,0,0,-1,&PhysAddr,PAGELOCKED,&hMem,&iAddress);
: 这样分配的内存都是锁定的。

谢谢suxm,PageAllocate是VDtools里的函数吧,我一直没有用VDTools,在Win95DDK中
应该用什么函数呢? BTW,哪里有好的VDTOOLS? sjtu上有,但安装到26%时就出错了,
lib.pku上好象找不到. 还有,VDTools写的VXD效率是不是很好?

我查了一下NTDDK的例子,有一个采用event通讯的,可能用的上.谢谢
 



发信人: suxm (笨笨), 信区: Programming


【 在 arcarc (异乡人) 的大作中提到: 】
: 【 在 suxm (笨笨) 的大作中提到: 】

: 谢谢suxm,PageAllocate是VDtools里的函数吧,我一直没有用VDTools,在Win95DDK中
: 应该用什么函数呢? BTW,哪里有好的VDTOOLS? sjtu上有,但安装到26%时就出错了,
: lib.pku上好象找不到. 还有,VDTools写的VXD效率是不是很好?
在DDK中是同名的函数。几乎VTOOLSD中的所有函数都是
VMM服务的WRAP形式。应该都可以到DDK中的同名函数的。

安装时出错是因为选择了一些不该选择的项吧。换换选项试试。
前面有篇文章讲了一个FTP站有,找下吧。
VTOOLSD写的VXD效率没有问题,如果你怀疑C的效率,那NT就
完了,因为KERNEL-MODE-DRIVER可都是用C开发的。


: 我查了一下NTDDK的例子,有一个采用event通讯的,可能用的上.谢谢
:  





       主题: [讨论]VXD与SYS问题                     kingchurch (转寄)
日期: 1998年9月19日 07:31:09
发件人: lyj.bbs@bbs.net.tsinghua.edu.cn
收件人: lyj@hs1.hit.edu.cn

发信人: arcarc (异乡人), 信区: Programming

Hi, So pleased to visit BBS again!
        十分想念各位学习VXD的朋友!现有很多问题
想和大家讨论:

1. 物理内存:
        Dreammy (这个杀手不太冷)在文章〖技术】Win95下的32位
应用程序访问物理内存的方法中提出了三种办法.我也做了一些试验,
但三种方法中只有DeviceIO有点进展,用的是VC5.0 mfc.但是在VXD中
只是简单的MapPhysToLinear后把结果作为线性地址传给了App.从运
行结果来看,查看f0段的ROM区结果是对的,其他地方的读好象也可以,
但是我写c0段的RAM区时,写不上去,(写完了再读,发现和原来的一样)
(读写的过程都是在App中进行的).请问是什么原因?
        Dreammy 的第一种方法,在VXD提供Win32 Service ,用
Register_Win32_Service . 然后在Win32应用中用VxDCall这些未公
开API.我应如何使用Register_Win32_Service函数?在此函数中,
 DDB_Offset参数应如何获得?因为DDB是用宏产生的.
        Dreammy 的第三种方法,中断门我不太会用,在<<windows95
 system programming secrets>>一书中有类似的调用门的方法,但不
知为何,其程序phys在我的机器上运行的结果不正确,phyaddress
的结果都是FFFFFFFF.程序源文件也无法编译通过.求教.
        还有问题是:在16位的VXD中用Allocate_LDT_Selector等函数
来继MapPhySToLinear后,来处理物理内存,可传给应用一个指针来访问
它,但win32中没有了选择子,这一部分我应该如何操作?
若用函数Map_Lin_To_VM_Addr,其DPL是多少?
        我在VC5.0中无法使用ax=1684h,INT 2fh,所以WIN32的App无法
象以前的WIN16方法和VXD通讯,是不是这样?另外,在VC5.0中(用了MFC)
我无法使用内嵌汇编(编译时总提示类型不匹配).问问各位有何良策?

2.SYS问题:
        因为我的活儿最终定在Nt平台上,所以转想NT DDK了,现在刚
开始,许多问题不懂.
        在VXD中,有很多方法使VXD通讯到APP,如SHELL_POSTMESSAGE
等,但在NT下的SYS有何方法?
在中断后,如何及时通知APP, 信号灯,互斥对象等可用吗?还是只能开一
个线程,不断调用DeviceIoControl?


发信人: suxm (笨笨), 信区: Programming

【 在 arcarc (异乡人) 的大作中提到: 】
: Hi, So pleased to visit BBS again!
:         十分想念各位学习VXD的朋友!现有很多问题
: 想和大家讨论:
: 1. 物理内存:
:         Dreammy (这个杀手不太冷)在文章〖技术】Win95下的32位
: 应用程序访问物理内存的方法中提出了三种办法.我也做了一些试验,
: 但三种方法中只有DeviceIO有点进展,用的是VC5.0 mfc.但是在VXD中
: 只是简单的MapPhysToLinear后把结果作为线性地址传给了App.从运
: 行结果来看,查看f0段的ROM区结果是对的,其他地方的读好象也可以,
: 但是我写c0段的RAM区时,写不上去,(写完了再读,发现和原来的一样)
: (读写的过程都是在App中进行的).请问是什么原因?

内存锁定了吗?在VXD中对内存写一下试试。


:         Dreammy 的第一种方法,在VXD提供Win32 Service ,用
: Register_Win32_Service . 然后在Win32应用中用VxDCall这些未公
: 开API.我应如何使用Register_Win32_Service函数?在此函数中,
:  DDB_Offset参数应如何获得?因为DDB是用宏产生的.
:         Dreammy 的第三种方法,中断门我不太会用,在<<windows95
:  system programming secrets>>一书中有类似的调用门的方法,但不
: 知为何,其程序phys在我的机器上运行的结果不正确,phyaddress
: 的结果都是FFFFFFFF.程序源文件也无法编译通过.求教.
:         还有问题是:在16位的VXD中用Allocate_LDT_Selector等函数
: 来继MapPhySToLinear后,来处理物理内存,可传给应用一个指针来访问
: 它,但win32中没有了选择子,这一部分我应该如何操作?
: 若用函数Map_Lin_To_VM_Addr,其DPL是多少?
:         我在VC5.0中无法使用ax=1684h,INT 2fh,所以WIN32的App无法
: 象以前的WIN16方法和VXD通讯,是不是这样?另外,在VC5.0中(用了MFC)
                             ~~~~~~~~~~
                             是

 : 我无法使用内嵌汇编(编译时总提示类型不匹配).问问各位有何良策?
: 2.SYS问题:
:         因为我的活儿最终定在Nt平台上,所以转想NT DDK了,现在刚
: 开始,许多问题不懂.
:         在VXD中,有很多方法使VXD通讯到APP,如SHELL_POSTMESSAGE
: 等,但在NT下的SYS有何方法?
: 在中断后,如何及时通知APP, 信号灯,互斥对象等可用吗?还是只能开一
: 个线程,不断调用DeviceIoControl?

VxD与NT不兼容,NT支持的是kernel-mode-driver.清华书店有本讲
NT驱动程序的书,可以参考一下。

BTW:你的问题说得不是很清楚,到底是谁分配了内存,又想给谁用?
     我都读糊涂了。






发信人: arcarc (异乡人), 信区: Programming

【 在 suxm (笨笨) 的大作中提到: 】
: 内存锁定了吗?在VXD中对内存写一下试试。
:                              ~~~~~~~~~~
:                              是
:  : 我无法使用内嵌汇编(编译时总提示类型不匹配).问问各位有何良策?
: VxD与NT不兼容,NT支持的是kernel-mode-driver.清华书店有本讲
: NT驱动程序的书,可以参考一下。
: BTW:你的问题说得不是很清楚,到底是谁分配了内存,又想给谁用?
:      我都读糊涂了。
I just want to access phy-memory,and use it in App
How to  lock the memory in vxd? I am sorry,I find there are much different
between win32 and win16.

The other question is about NTDDK, in my sys part,how can I inform the
App that the certain interupt has occured.

 Thanks


发信人: suxm (笨笨), 信区: Programming

【 在 arcarc (异乡人) 的大作中提到: 】
: I just want to access phy-memory,and use it in App
: How to  lock the memory in vxd? I am sorry,I find there are much different
: between win32 and win16.
在VXD中锁定内存,如果是VXD分配的,那你可以在分配时
用一些FLAG来锁定它。
PageAllocate(1,PG_VM,hVM,0,0,-1,&PhysAddr, 
                  PAGECONTIG|PAGEUSEALIGN|PAGEFIXED,&hMem,&iAddress); 
或者:
PageAllocate(1,PG_SYS,0,0,0,-1,&PhysAddr,PAGELOCKED,&hMem,&iAddress);
这样分配的内存都是锁定的。

的确,对于WIN32和WIN16差别很大。
下面分别说一下:
对于WIN16:
(1)在WIN16中分配了内存,想给VXD用。
     在Win16中,GlobalAlloc(),GlobalLock(),GlobalFix() ,GlobalPageLock(),
     wSeg =HIWORD(lpBuf);
   wOff = LOWORD(lpBuf);这里的lpBuf是前面几个函数分配的内存。
     mov cx,wSeg 
   mov dx,wOff 

     用完之后,GlobalFree();     
     在VxD中
     int* pLinearAddress; 
  
     pLinearAddress = Map_Flat(CLIENT_CX,CLIENT_DX);
然后你就可以在VxD中对pLinearAddress进行操作了。
(2)在VXD中分配了内存,想给WIN16用。
_MapPhysToLinear,Map_Lin_To_VM_Addr,同样,你应
该注意内存锁定。


对于WIN32:
最简单了,只要内存锁定了,那在VXD中分配内存后得到的指针
可以直接传给WIN32用。反之亦然。不过要说明的是,WIN32分配的内存
要想在全局与VXD共享,就必须用内存映射。

: The other question is about NTDDK, in my sys part,how can I inform the
: App that the certain interupt has occured.
:  Thanks
对于kernel-mode-driver我不是很熟悉,对不起。
多看看NTDDK的文档可能会有帮助吧。




发信人: arcarc (异乡人), 信区: Programming

【 在 suxm (笨笨) 的大作中提到: 】
: 在VXD中锁定内存,如果是VXD分配的,那你可以在分配时
: 用一些FLAG来锁定它。
: PageAllocate(1,PG_VM,hVM,0,0,-1,&PhysAddr, 
:                   PAGECONTIG|PAGEUSEALIGN|PAGEFIXED,&hMem,&iAddress); 
: 或者:
: PageAllocate(1,PG_SYS,0,0,0,-1,&PhysAddr,PAGELOCKED,&hMem,&iAddress);
: 这样分配的内存都是锁定的。

谢谢suxm,PageAllocate是VDtools里的函数吧,我一直没有用VDTools,在Win95DDK中
应该用什么函数呢? BTW,哪里有好的VDTOOLS? sjtu上有,但安装到26%时就出错了,
lib.pku上好象找不到. 还有,VDTools写的VXD效率是不是很好?

我查了一下NTDDK的例子,有一个采用event通讯的,可能用的上.谢谢
 



发信人: suxm (笨笨), 信区: Programming


【 在 arcarc (异乡人) 的大作中提到: 】
: 【 在 suxm (笨笨) 的大作中提到: 】

: 谢谢suxm,PageAllocate是VDtools里的函数吧,我一直没有用VDTools,在Win95DDK中
: 应该用什么函数呢? BTW,哪里有好的VDTOOLS? sjtu上有,但安装到26%时就出错了,
: lib.pku上好象找不到. 还有,VDTools写的VXD效率是不是很好?
在DDK中是同名的函数。几乎VTOOLSD中的所有函数都是
VMM服务的WRAP形式。应该都可以到DDK中的同名函数的。

安装时出错是因为选择了一些不该选择的项吧。换换选项试试。
前面有篇文章讲了一个FTP站有,找下吧。
VTOOLSD写的VXD效率没有问题,如果你怀疑C的效率,那NT就
完了,因为KERNEL-MODE-DRIVER可都是用C开发的。


: 我查了一下NTDDK的例子,有一个采用event通讯的,可能用的上.谢谢
:  





--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: hs5.hit.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.239.237]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:209.417毫秒