| | | 虚拟设备驱动程序两关键问题(下) | | 2000-12-25·
·陈国友··中国操作系统支持者
| 1 2 下一页 ∫蛭猈indows采用基于消息的事件驱动机制,而VxD并不提供直接发往应用程序线程的消息,所以PostMessage所发消息与其它众多的消息都在主线程的消息循环中处理。这样,当执行一些界面操作时,大量的消息占据了消息队列,VxD所发送的消息就有可能得不到相应的处理。为解决这一问题,在实际设计中可采用的方法有两种:第一种是仍采用PostMessage,但在应用程序和VxD中需设置标志位,判断消息是否被处理并作了相应的工作(如重传数据);第二种是使用Win32事件机制,将一个线程专用于等待响应Win32事件,而另一些线程用于其它处理。下面给出VxD利用Win32事件机制激活Win32应用程序线程的部分例程(见程序2)。当生成或消除(destroy)一个VM,VxD便通知注册的应用程序,并显示出相应的信息。
在VxD中,
DWORD OnW32Deviceiocontrol ( PDIOCPARAMETERS p ) //VxD与Win32应用程序的接口函数
{
DWORD rc;
swirch ( p-$#@62;dwIoControlCode )
{
case DIOC_OPEN: //系统定义功能号:设备打开
rc = 0;
break;
case DIOC_CLOSEHANDLE: //设备关闭
bClientRegistered = FALSE;
rc = 0;
break;
case EVENTVXD_REGISTER: //自定义功能号
hWin32Event = p-$#@62;lpvInBuffer;
*( (DWORD *) (p-$#@62;lpvOutBuffer) ) = (DWORD) & GlobalVMInfo;
*( (DWORD *) (p-$#@62;lpcbBytesReturned) ) = sizeof (DWORD);
bClientRegistered = TRUE;
rc = 0;
break;
default:
rc = 0xffffffff;
}
return rc; //若返回0表示成功
}
BOOL OnVmInit ( VMHANDLE hVM ) //一旦有VM被初始化便执行
{
if ( bClientRegistered )
{
GlobalVMInfo.hVM = hVM;
GlobalVMInfo.bVmCreated = TRUE;
Call_Priority_VM_Event (LOW_PRI_DEVICE_BOOST , Get_Sys_VM_Handle() ,
PEF_WAIT_FOR_STI+PEF_WAIT_NOT_CRIT ,
hWin32Event , PriorityEventThunk , 0 );
//使System VM为当前运行状态,将Ring0级事件句柄作为回调过程的参数
}
return TRUE;
}
VOID OnVmTerminate ( VMHANDLE hVM ) //一旦有VM被终结便执行
{
if ( bClientRegistered )
{
GlobalVMInfo.hVM = hVM;
GlobalVMInfo.bVmCreated = FALSE;
Call_Priority_VM_Event (LOW_PRI_DEVICE_BOOST , Get_Sys_VM_Handle() ,
PEF_WAIT_FOR_STI+PEF_WAIT_NOT_CRIT ,
hWin32Event , PriorityEventThunk , 0 );
}
}
VOID _stdcall PriorityEventHandler ( VMHANDLE hVM , PVOID Refdata , CRS *
pRegs )
{
HANDLE hWin32Event = Refdata;
_VWIN32_SetWin32Event ( hWin32Event ); //激活事件对象
}
在Win32应用程序中;
VOID main ( int ac , char *av[ ] )
{
hEventRing3 = CreateEvent ( 0 , FALSE , FALSE , NULL ); //生成Ring3级事件句柄
if ( !hEventRing3 )
{
printf ( "Cannot create Ring3 event\n" );
exit ( 1 );
}
hKernel32Dll = LoadLibrary ( "kernel32.dll" );
if ( !hKernel32Dll )
{
printf ( "Cannot load KERNEL32.DLL\n" );
exit ( 1 );
}
1 2 下一页 | | | 感谢
访问天极网,如果您觉得该文章涉及版权问题,请看这里!
|
|