采用VXD技术实现实的通信
> 该函数用来完成VXD初始化所做的工作。在本例中,由于实时监视串口中断的需要,要给COM1的中断安装一个自定义的断服务函数。98DDK已经提供了这个函数的C语言版,其原型是HIRQstaticVPICD_Virtualize_IRQ(PVIDpvid),在vpicd.h中。该函数需要一个指针作为参数(指向名为VPICD_IRQ_Descriptor的结构体),函数传回一个指向该虚拟IRQ的句柄(该句柄在后来的VPICD服务中需要提供)。VPICD_IRQ_Descriptor结构体的组成为:
typedefstructVPICD_IRQ_Descriptor{
USHORTVID_IRQ_Number;//IRQ号(0~15)
USHORTVID_Options;//标志位选项
ULONGVID_Hw_Int_Proc;//硬件中断服务程序的地址
ULONGVID_Virt_Int_Proc;//虚拟中断服务程序
ULONGVID_Mask_Change_Proc//MaskChange调用例程
ULONGVID_IRET_Proc;//IRET调用例程
ULONGVID_IRET_Time_Out;//在Vm的进程优先级提升之前的最大等待时间
ULONGVID_Hw_Int_Ref;//硬件中断服务程序的数据存放地址
}VID;
其中只用到三位。在本例中需要声明一个名为irq4的全局变量为VID结构,并付给如下初值:VIDirq4={4,0,hwproc,0,0,0,0,500,0},表示将要虚拟化IRQ4,改变其中断处理函数为voidhwproc(void),该函数的原型如下:
voidhwproc(void){
_asm{
movdx,0x3f8
inal,dx
movbyteptr[readin],al
clc
}
return;
}
在这个中断处理中,仅仅从COM1的数据寄存器(地址为3F8h)中读取接收到的数值,并把该数值存放在一个类型为BYTE、名为readin的内存中。
(2)OnSysDynamicDeviceExit()函数
BOOLOnSysDynamicDeviceExit()
{
VPICD_Force_Default_Behavior(irqhandle);
//解除IRQ4虚拟化
returnTRUE;
}//OnSysDynamicDeviceExit
该数提供了用于善后处理VXD在卸载时需要完成的事件。在本例中,和VXD初始化对应,需要解除对COM1的中断IRQ4的虚拟化。作者也是用98DDK在vpicd.h中提供的外包函数voidstatic_inlineVPICD_Force_Default_Behavior(HIRQhirp)。该函数唯一需要的参数便是使用VPICD_Virtualize_IRQ函数传回的IRQ句柄。
(3)OnDeviceIoControl()函数
DWORDOnDeviceIoControl(PDIOCPARAMETERSp){
Switch(p->dwIoCon
trolCode)
{
case1://端口写功能
if(!p->lpvOutBuffer||p->cbOutBuffer<1)
{//输出缓存的有效性检查
returnERROR_INVALID_PARAMETER;
}
if(serial_out((DWORD)(p->lpvInBuffer)))
{//数据发送
*(BYTE*)(p->lpvOutBuffer)=*(BYTE*)(p->lpvInBuffer);
}
else{
*(BYTE*)(p->lpvOutBuffer)=0;
}
open_int();//打开com1中断
return0;
case2://端口读功能
if(*(BYTE*)reading==0x00)
{//数据读入
*(BYTE*)(p->lpvOutBuffer)=0x00;
return0;
}
*(BTYE*)(p->lpvOutBuffer)=*(BYTE*)(readin);
return0;
}
return0;
}
return0;
}
OnDeviceIoControl函数用来处理Win32应用程序对VXD的呼叫 《采用VXD技术实现实的通信(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/173349.html
typedefstructVPICD_IRQ_Descriptor{
USHORTVID_IRQ_Number;//IRQ号(0~15)
USHORTVID_Options;//标志位选项
ULONGVID_Hw_Int_Proc;//硬件中断服务程序的地址
ULONGVID_Virt_Int_Proc;//虚拟中断服务程序
ULONGVID_Mask_Change_Proc//MaskChange调用例程
ULONGVID_IRET_Proc;//IRET调用例程
ULONGVID_IRET_Time_Out;//在Vm的进程优先级提升之前的最大等待时间
ULONGVID_Hw_Int_Ref;//硬件中断服务程序的数据存放地址
}VID;
其中只用到三位。在本例中需要声明一个名为irq4的全局变量为VID结构,并付给如下初值:VIDirq4={4,0,hwproc,0,0,0,0,500,0},表示将要虚拟化IRQ4,改变其中断处理函数为voidhwproc(void),该函数的原型如下:
voidhwproc(void){
_asm{
movdx,0x3f8
inal,dx
movbyteptr[readin],al
clc
}
return;
}
在这个中断处理中,仅仅从COM1的数据寄存器(地址为3F8h)中读取接收到的数值,并把该数值存放在一个类型为BYTE、名为readin的内存中。
(2)OnSysDynamicDeviceExit()函数
BOOLOnSysDynamicDeviceExit()
{
VPICD_Force_Default_Behavior(irqhandle);
//解除IRQ4虚拟化
returnTRUE;
}//OnSysDynamicDeviceExit
该数提供了用于善后处理VXD在卸载时需要完成的事件。在本例中,和VXD初始化对应,需要解除对COM1的中断IRQ4的虚拟化。作者也是用98DDK在vpicd.h中提供的外包函数voidstatic_inlineVPICD_Force_Default_Behavior(HIRQhirp)。该函数唯一需要的参数便是使用VPICD_Virtualize_IRQ函数传回的IRQ句柄。
(3)OnDeviceIoControl()函数
DWORDOnDeviceIoControl(PDIOCPARAMETERSp){
Switch(p->dwIoCon
trolCode)
{
case1://端口写功能
if(!p->lpvOutBuffer||p->cbOutBuffer<1)
{//输出缓存的有效性检查
returnERROR_INVALID_PARAMETER;
}
if(serial_out((DWORD)(p->lpvInBuffer)))
{//数据发送
*(BYTE*)(p->lpvOutBuffer)=*(BYTE*)(p->lpvInBuffer);
}
else{
*(BYTE*)(p->lpvOutBuffer)=0;
}
open_int();//打开com1中断
return0;
case2://端口读功能
if(*(BYTE*)reading==0x00)
{//数据读入
*(BYTE*)(p->lpvOutBuffer)=0x00;
return0;
}
*(BTYE*)(p->lpvOutBuffer)=*(BYTE*)(readin);
return0;
}
return0;
}
return0;
}
OnDeviceIoControl函数用来处理Win32应用程序对VXD的呼叫 《采用VXD技术实现实的通信(第2页)》