Programming 版 (精华区)
发信人: Sun (大灯泡), 信区: Programming
标 题: [转载] 〖技术〗挂接IRQ8的完整VXD例子
发信站: 紫 丁 香 (Thu Sep 9 10:41:22 1999), 转信
【 以下文字转载自 VisualProgram 讨论区 】
【 原文由 xiaojun 所发表 】
主题: 〖技术〗挂接IRQ8的完整VXD例子 kingchurch (转寄)
日期: 1998年9月19日 07:31:58
发件人: lyj.bbs@bbs.net.tsinghua.edu.cn
收件人: lyj@hs1.hit.edu.cn
发信人: suxm (笨笨), 信区: Programming
标 题: 关于挂IRQ 8的一个完整的VXD例子。
发信站: BBS 水木清华站 (Sun Apr 26 00:51:29 1998)
下面这个例子由VTOOLSD自带的东东改写而来。
以前那个挂IRQ 12,现在我挂IRQ 8。
// HARDINTC.H - include file for VxD HARDINTC
#include <vtoolsc.h>
#define HARDINTC_Major 1
#define HARDINTC_Minor 0
#define HARDINTC_DeviceID UNDEFINED_DEVICE_ID
#define HARDINTC_Init_Order UNDEFINED_INIT_ORDER
//请注意,下面的两个函数是我添加的,很重要。
BYTE CmosReadReg( BYTE reg );
void CmosWriteReg( BYTE reg, BYTE val );
/////////////////////////////////////////////////////
// HARDINTC.C - main module for VxD HARDINTC
#define DEVICE_MAIN
#include "hardintc.h"
//
#define RTC_STATUSA 0xA
#define RTC_STATUSB 0xB
#define RTC_STATUSC 0xC
#define STATUSB_ENINT 0x40
#define CMOS_ADDR 0x70
#define CMOS_DATA 0x71
//
#undef DEVICE_MAIN
Declare_Virtual_Device(HARDINTC)
DefineControlHandler(DEVICE_INIT, OnDeviceInit);
BOOL ControlDispatcher(
DWORD dwControlMessage,
DWORD EBX,
DWORD EDX,
DWORD ESI,
DWORD EDI,
DWORD ECX)
{
START_CONTROL_DISPATCH
ON_DEVICE_INIT(OnDeviceInit);
END_CONTROL_DISPATCH
return TRUE;
}
#define MY_IRQ 8 // Define IRQ to virtualize
VPICD_HWInt_THUNK My_Hw_Int_Thunk; // Hardware interrupt thunk
VPICD_EOI_THUNK My_EOI_Thunk; // EOI thunk
BYTE StatusA;
BYTE StatusB;
IRQHANDLE MyIRQHandle; // to be assigned by VPICD
// when IRQ is virtualized
//这个必须放在这儿,曾经放在最后面,但是发现
//启动时会出现页面错误.(我把hardintc.vxd放在
//了system.ini中了).
//这是因为后面的段是init的,一断时间后就被discarded了.
BYTE CmosReadReg( BYTE reg )
{
BYTE data;
_asm
{
; disable NMI then ints
mov al, reg
or al, 80h
cli
; first output reg to address port
out CMOS_ADDR, al
jmp _1
_1:
jmp _2
_2:
; then read data from data port
in al, CMOS_DATA
mov data, al
jmp _3
_3:
jmp _4
_4:
; reenable NMI then ints
xor al, al
out CMOS_ADDR, al
sti
}
return data;
}
后面还有。
--
;33m___________________
;32m吃睡吃睡吃睡吃睡吃睡
;33m___________________
6m※ 修改:·suxm 於 Apr 26 01:06:53 修改本文·[FROM: 166.111.10.154]m
6m※ 修改:·suxm 於 Apr 26 02:06:02 修改本文·[FROM: 166.111.10.154]m
m4m※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.10.154]m
发信人: suxm (笨笨), 信区: Programming
标 题: 关于挂IRQ 8的一个完整的VXD例子(续)
发信站: BBS 水木清华站 (Sun Apr 26 00:57:32 1998)
//接上一篇
void CmosWriteReg( BYTE reg, BYTE val )
{
_asm
{
; disable NMI then ints
mov al, reg
or al, 80h
cli
; first output reg to address port
out CMOS_ADDR, al
jmp __1
__1:
jmp __2
__2:
; then output val to data port
mov al, val
out CMOS_DATA, al
jmp __3
__3:
jmp __4
__4:
; reenable NMI then ints
xor al, al
out CMOS_ADDR, al
sti
}
}
// Handler for VID_Hw_Int callback
//
BOOL __stdcall My_Hw_Int_Handler(VMHANDLE hVM, IRQHANDLE hIRQ)
{
//你可以把很多东东放在这里的,比如说EVENT。
// VPICD_Set_Int_Request(hVM, hIRQ);
dprintf("HardInt ISR\r\n"); //这里验证一下
CmosReadReg( RTC_STATUSC );
VPICD_Phys_EOI(hIRQ); // tell VPICD to clear the interrupt
return TRUE; // thunk will clear carry
}
VOID __stdcall My_EOI_Handler(VMHANDLE hVM, IRQHANDLE hIRQ)
{
//可能你用得上,但这个例子只是想显示一些基本的东东
// VPICD_Clear_Int_Request(hVM, hIRQ);
// VPICD_Phys_EOI(hIRQ);
}
// Handler for Control Message DEVICE_INIT
//
#include INIT_CODE_SEGMENT // switch to INIT code segment
//
BOOL OnDeviceInit(VMHANDLE hVM, PCHAR CommandTail)
{
struct VPICD_IRQ_Descriptor IRQdesc; // struct to pass to
// VPICD_Virtualize_IRQ
// Set up the structure to pass to VPICD_Virtualize_IRQ
IRQdesc.VID_IRQ_Number = MY_IRQ; // IRQ to virtualize
IRQdesc.VID_Options = 0; // reserved
// This example requests two callbacks: VID_Hw_Int_Proc and VID_EOI_Proc.
IRQdesc.VID_Hw_Int_Proc =
(DWORD)VPICD_Thunk_HWInt(My_Hw_Int_Handler, &My_Hw_Int_Thunk);
IRQdesc.VID_EOI_Proc = 0;
IRQdesc.VID_Virt_Int_Proc = 0;
IRQdesc.VID_Mask_Change_Proc = 0;
IRQdesc.VID_IRET_Proc = 0;
IRQdesc.VID_IRET_Time_Out = 500;
MyIRQHandle = VPICD_Virtualize_IRQ(&IRQdesc);
if (MyIRQHandle != 0)
{
dprintf("TURE\r\n");
//
StatusA = CmosReadReg(RTC_STATUSA);
StatusB = CmosReadReg(RTC_STATUSB);
//我把时钟定为2time/sec。
CmosWriteReg(RTC_STATUSA, StatusA | 0x0F);//可能你需要改动这里
CmosWriteReg(RTC_STATUSB, StatusB | STATUSB_ENINT);
CmosReadReg(RTC_STATUSC);
//
VPICD_Physically_Unmask(MyIRQHandle);
return TRUE;
}
else
{
dprintf("FALSE\r\n");
return FALSE;
}
}
--
;33m___________________
;32m吃睡吃睡吃睡吃睡吃睡
;33m___________________
6m※ 修改:·suxm 於 Apr 26 01:01:44 修改本文·[FROM: 166.111.10.154]m
6m※ 修改:·suxm 於 Apr 26 02:08:54 修改本文·[FROM: 166.111.10.154]m
m5m※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.10.154]m
发信人: suxm (笨笨), 信区: Programming
标 题: 关于挂IRQ 8的一个完整的VXD例子(补充说明)
发信站: BBS 水木清华站 (Sun Apr 26 01:05:28 1998)
怎样知道这个例子是挂上了IRQ 8呢?
嗯。这样做,用SOFTICE 3。0 FOR WIN95。
每次当你按CTRL+D进到SOFTICE 3。0的窗口之后,
你看到的将是一连串的HARDINT ISR字符串。
每次的输出都在增加。
所以嘛。。。。
--
;33m___________________
;32m吃睡吃睡吃睡吃睡吃睡
;33m___________________
m5m※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.10.154]m
--
※ 来源:.紫 丁 香 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)
页面执行时间:207.853毫秒