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毫秒