xcdyjx
驱动牛犊
驱动牛犊
  • 注册日期2004-11-14
  • 最后登录2011-11-14
  • 粉丝0
  • 关注0
  • 积分135分
  • 威望37点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:2246回复:10

bcb6下call fword ptr [farcall]编译不通,请指教

楼主#
更多 发布于:2004-11-22 14:17
我看了有关调用门的资料,但我在BCB6下用CALL指令调用它老是出错.

首先:CALL FWORD PTR [farcall]编译出错,说是无效的FWORD
然后:我该用CALL FAR WORD PTR [farcall],编译是过了.但好象不起作用.因为用CALL指令调用调用门要传递48位全指针,但好象CPU只取32位,如此一来调用门的选择子不就取不到了吗?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-22 18:14
下面代码在BCB5下面编译,BCB6也应该可以吧!?

//---------------------------------------------------------------------------
//
// 一般性测试
//
void __fastcall TForm1::Ring0BtnClick(TObject *Sender)
{
    DWORD dwCGSelector;
    WORD FarCall[3];

    CreateCallGate(EnterRing0_1,&dwCGSelector);

    if(dwCGSelector == (DWORD)-1)
    {
        Memo1->Lines->Add("Can not found a null GDT Entry.");
        return;
    }

    Memo1->Lines->Add("Selector = " + IntToStr(dwCGSelector));

    __try
    {
        FarCall[2] = dwCGSelector;

        _asm CALL FWORD PTR [FarCall]

        Memo1->Lines->Add("CR0 = " + IntToHex((__int64)CR0Value,8));
        Memo1->Lines->Add("CR2 = " + IntToHex((__int64)CR2Value,8));
        Memo1->Lines->Add("CR3 = " + IntToHex((__int64)CR3Value,8));
        Memo1->Lines->Add("PortVal  = " + IntToStr(PortValue));

        ReleaseCallGate();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        ReleaseCallGate();
        Memo1->Lines->Add("Exceptoin occur");
    }
}
//---------------------------------------------------------------------------
// 更改IOPL测试

void __fastcall TForm1::IOPLBtnClick(TObject *Sender)
{
    DWORD dwCGSelector;
    WORD FarCall[3];

    CreateCallGate(EnterRing0_2,&dwCGSelector);

    if(dwCGSelector == (DWORD)-1)
    {
        Memo1->Lines->Add("Can not found a null GDT Entry.");
        return;
    }

    Memo1->Lines->Add("Selector = " + IntToStr(dwCGSelector));

    __try
    {
        FarCall[2] = dwCGSelector;

        _asm CALL FWORD PTR [FarCall]

        Memo1->Lines->Add("已经更改IOPL为3,可以在Win32程序中直接使用In/Out指令了。");
        ReleaseCallGate();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        ReleaseCallGate();

        Memo1->Lines->Add("Exceptoin occur");
    }
}
xcdyjx
驱动牛犊
驱动牛犊
  • 注册日期2004-11-14
  • 最后登录2011-11-14
  • 粉丝0
  • 关注0
  • 积分135分
  • 威望37点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-22 19:35
我试了还是不行

代码:

WORD ccadd[3];

//ccadd[0] = 0;
//ccadd[1] = 0;
ccadd[2] = (((ULONG)cg-(ULONG)BaseAddress)/sizeof(CALLGATE_DESCRIPTOR));

_asm CALL FWORD PTR [ccadd];

错误:
E2329 Invalid combination of opcode and operands

另外,调用门的选择子是否就是它在GDT或LDT中的索引号
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-22 20:26
估计是BCB6的毛病:(

添加下面这行到CPP中,再编译看看

#pragma inline
xcdyjx
驱动牛犊
驱动牛犊
  • 注册日期2004-11-14
  • 最后登录2011-11-14
  • 粉丝0
  • 关注0
  • 积分135分
  • 威望37点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-22 22:30
过拉,给分拉 :D
xcdyjx
驱动牛犊
驱动牛犊
  • 注册日期2004-11-14
  • 最后登录2011-11-14
  • 粉丝0
  • 关注0
  • 积分135分
  • 威望37点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-23 10:08
还有一个问题,我加了#pragma inline后
__asm sgdt gdt 有出现编译不过的情况

typedef struct gdtr {
unsigned short Limit;
unsigned short BaseLow;
unsigned short BaseHigh;
} Gdtr_t, *PGdtr_t;

Gdtr_t gdt;
__asm sgdt gdt

错误为:[Tasm Error] :Argument to operation or instruction has illegal size
xcdyjx
驱动牛犊
驱动牛犊
  • 注册日期2004-11-14
  • 最后登录2011-11-14
  • 粉丝0
  • 关注0
  • 积分135分
  • 威望37点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-23 12:03
下面代码在BCB5下面编译,BCB6也应该可以吧!?

//---------------------------------------------------------------------------
//
// 一般性测试
//
void __fastcall TForm1::Ring0BtnClick(TObject *Sender)
{
    DWORD dwCGSelector;
    WORD FarCall[3];

    CreateCallGate(EnterRing0_1,&dwCGSelector);

    if(dwCGSelector == (DWORD)-1)
    {
        Memo1->Lines->Add("Can not found a null GDT Entry.");
        return;
    }

    Memo1->Lines->Add("Selector = " + IntToStr(dwCGSelector));

    __try
    {
        FarCall[2] = dwCGSelector;

        _asm CALL FWORD PTR [FarCall]

        Memo1->Lines->Add("CR0 = " + IntToHex((__int64)CR0Value,8));
        Memo1->Lines->Add("CR2 = " + IntToHex((__int64)CR2Value,8));
        Memo1->Lines->Add("CR3 = " + IntToHex((__int64)CR3Value,8));
        Memo1->Lines->Add("PortVal  = " + IntToStr(PortValue));

        ReleaseCallGate();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        ReleaseCallGate();
        Memo1->Lines->Add("Exceptoin occur");
    }
}
//---------------------------------------------------------------------------
// 更改IOPL测试

void __fastcall TForm1::IOPLBtnClick(TObject *Sender)
{
    DWORD dwCGSelector;
    WORD FarCall[3];

    CreateCallGate(EnterRing0_2,&dwCGSelector);

    if(dwCGSelector == (DWORD)-1)
    {
        Memo1->Lines->Add("Can not found a null GDT Entry.");
        return;
    }

    Memo1->Lines->Add("Selector = " + IntToStr(dwCGSelector));

    __try
    {
        FarCall[2] = dwCGSelector;

        _asm CALL FWORD PTR [FarCall]

        Memo1->Lines->Add("已经更改IOPL为3,可以在Win32程序中直接使用In/Out指令了。");
        ReleaseCallGate();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        ReleaseCallGate();

        Memo1->Lines->Add("Exceptoin occur");
    }
}
 



能不能把代码给我试一试
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2004-11-23 16:02
调用门的选择子是否就是它在GDT或LDT中的索引号
不错,不过从3位开始
0,1代表RPL,2位为0  从GDT中取,为1从LDT中取,另外在AMD64下所有的门都扩展为16个字节,但SELECTOR还是16位,所以计算起来有所不同,而且在AMD64下的CALLGATE中的堆栈参数拷贝将不被支持,因为本来就是多余的,你本来就完全可以在RING0访问RING3堆栈的.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2004-11-23 16:06
另外如果你想实现IO的话,修改IO许可位图比修改IOPL更好,这也是INTEL和AMD在CPU指令手册中的建议.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
xcdyjx
驱动牛犊
驱动牛犊
  • 注册日期2004-11-14
  • 最后登录2011-11-14
  • 粉丝0
  • 关注0
  • 积分135分
  • 威望37点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-11-24 17:38
多谢回复,我想我应该找一些相关资料去看看了,有什么好资料请介绍两本?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2004-11-25 13:33
多谢回复,我想我应该找一些相关资料去看看了,有什么好资料请介绍两本?

INTEL和AMD在CPU指令手册
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部