📄 csdn_文档中心_windows 95 vxd c source code for vanydevd.htm
字号:
void Disable_AnyDev(void)
{
//This would likely be a port WRITE to DISABLE the board's interrupt
}
// ----------------
// Enable hardware
// ----------------
void Enable_AnyDev(void)
{
//This would likely be a port WRITE to ENABLE the board's interrupt
}
// --------------------------
// ISR Processing for ANYDEV
// --------------------------
void Process_ISR(void)
{
//This is where the user might SET FLAGS and indicators in the ANYDEVX structure
//in order to notify the application that data is available below 1MB
}
// -----------------
// ISR for ANYDEV
// -----------------
void _declspec(naked)ISR_ANYDEV(void)
{
// Save registers
_asm sti
_asm pushad
_asm pushfd
//Process the ISR
Process_ISR();
//End ISR
_asm clc
End_ISR(ANYDEVX.IRQhandle);
//Set GOOD return code
_asm clc
//Restore saved registers
_asm popfd
_asm popad
_asm ret;
}
// -------------------
// Virtualize the IRQ
// -------------------
DWORD CVirt_IRQ(void)
{
// If in use by an instance of this program, RETURN with BAD code
if (ANYDEVX.IRQcount)
return (BOGUSADDRESS);
// If in use by another program, RETURN with BAD code
ANYDEVX.IRQstatus = Get_IRQ_Status();
if (ANYDEVX.IRQstatus)
return (BOGUSADDRESS);
// If IRQ NOT in use this point is reached
// Set BAD return code
ANYDEVX.IRQhandle = BOGUSADDRESS;
// Disable ANYDEV hardware
Disable_AnyDev();
// Get global memory address below 1mb
ANYDEVX.Global_addr_1MB = GET_BD_MEM();
if (ANYDEVX.Global_addr_1MB != BOGUSADDRESS)
{
// Virtualize the IRQ
ANYDEVX.IRQhandle = Virt_IRQ();
if (ANYDEVX.IRQhandle != BOGUSADDRESS)
{
// unmask the IRQ, set OK flag & increment IRQ count
Physically_UNMask_IRQ(ANYDEVX.IRQhandle);
ANYDEVX.IRQflags |= IRQ_VIRT_OK;
++(ANYDEVX.IRQcount);
}
}
return(ANYDEVX.IRQhandle);
}
// ----------------------
// UN Virtualize the IRQ
// ----------------------
void CUNVirt_IRQ(DWORD IRQhandle)
{
// if IRQ has been successfully virtualized
if ((ANYDEVX.IRQhandle != 0)
&& (ANYDEVX.IRQhandle != BOGUSADDRESS))
{
// Physically mask the IRQ and UN virtualized it
Physically_Mask_IRQ(ANYDEVX.IRQhandle);
UNVirt_IRQ(ANYDEVX.IRQhandle);
}
// Set UNvirtualized flags and indicators
ANYDEVX.IRQhandle = BOGUSADDRESS;
ANYDEVX.IRQflags &= ~IRQ_VIRT_OK;
return;
}
// ---------------------------------------
// Set Good Return code for DIOC requests
// ---------------------------------------
void _declspec(naked)GoodReturnDIOC(void)
{
// Clear eax and carry flag for GOOD return
_asm xor eax,eax
_asm clc
_asm ret;
}
// ---------------------------------------
// Set Bad Return code for DIOC requests
// ---------------------------------------
void _declspec(naked) BadReturnDIOC(void)
{
// NOTE: 50 is a FCN NOT SUPPORTED code -- ok to use
// SET carry flag for BAD return
_asm mov eax,50
_asm stc
_asm ret;
}
// ------------------------------
// Routine for ANYDEV Device UNINIT
// ------------------------------
void CVANYDEVD_Device_UNInit()
{
// Disable ANYDEV, Unvirtualize IRQ, set GOOD return code
Disable_AnyDev();
CUNVirt_IRQ(ANYDEVX.IRQhandle);
GoodReturnDIOC();
return;
}
// ------------------------------
// Routine for ANYDEV Device INIT
// ------------------------------
void CVANYDEVD_Device_Init()
{
DWORD retcode;
// Try to virtualize the IRQ
retcode = CVirt_IRQ();
// Set GOOD or BAD return code based on success
if (retcode == BOGUSADDRESS)
BadReturnDIOC();
else
GoodReturnDIOC();
return;
}
// --------------------------------
// Routine for ANYDEV Device IO ctrl
// --------------------------------
void CVANYDEVD_Device_IOctrl(PDIOCPARAMETERS ptr)
{
DWORD *obuf1;
// Field the DEV IO requests from VMM
switch(ptr->dwIoControlCode)
{
case(VANYDEVD_INIT_ADEV_HARDWARE):
ANYDEVX.flags = 0;
//User likely to require other initialization here
break;
case(VANYDEVD_GRAB_ADDRESSES):
// Point to Output buffer
obuf1 = (DWORD *) ptr->lpvOutBuffer;
// Return GLOBAL 1MB addr, addr of data structure
// and return indicators of IRQ virtuaization request
*obuf1 = ANYDEVX.Global_addr_1MB;
*(obuf1+1) = (DWORD) &ANYDEVX;
*(obuf1+2) = (DWORD) ANYDEVX.IRQhandle;
*(obuf1+3) = (DWORD) ANYDEVX.IRQflags;
//User might want to return other/different values here
break;
case(VANYDEVD_ENABLE_ANYDEV_HDWR):
//Call routine to enable interrupt
Enable_AnyDev();
break;
case(VANYDEVD_DISABLE_ANYDEV_HWR):
//Call routine to disable interrupt
Disable_AnyDev();
break;
//The below DIOC_GETVERSION is a part of the dynamic load protocol
//It MUST return a GOOD code (all codes here use GoodReturnDIOC()
case(DIOC_GETVERSION):
case(DIOC_CLOSEHANDLE):
default:
break;
}
GoodReturnDIOC();
return;
}
</PRE><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle>
<SCRIPT
src="CSDN_文档中心_Windows 95 VxD C Source Code for VANYDEVD.files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TH bgColor=#006699 id=white><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=1522">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48
src="CSDN_文档中心_Windows 95 VxD C Source Code for VANYDEVD.files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -