xiaohuating
驱动牛犊
驱动牛犊
  • 注册日期2004-04-15
  • 最后登录2018-01-09
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望27点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2046回复:12

怎么样在DDK下嵌入汇编中改变ebp寄存器的数.

楼主#
更多 发布于:2004-07-24 08:23
本人工作需要开发一套windows下类似WinFlash的读写BIOS的东东.
基本功能已经实现,可以在非超线程CPU下工作;但在超线程CPU下Erase/Write时候不能正常工作.我已经在GUI层设置好cpu mask;

但现在需要操作Ebp寄存器,~~~在Windows下是不能操作它的啊,该怎么办.
在Driver层我用DDK编译,需要嵌入汇编里需要做以下动作:
push ebp
move ebp,eax
....
pop ebp

欢迎有嵌入汇编开发经验的朋友指点啊.
这已经是我所有的分了啊.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-07-24 09:31
函数申明为_DECLSPEC (NAKED)
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
juventus
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2009-07-02
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-25 15:48
请问一下,可以用汇编写WDM驱动程序吗?
有什么例子没有?
xiaohuating
驱动牛犊
驱动牛犊
  • 注册日期2004-04-15
  • 最后登录2018-01-09
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望27点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-07-26 08:20
大佬,
你说的那个_DECLSPEC (NAKED),我在DDK文档里怎么找不到啊.

汇编可以做任何事情,如果你愿意做的话.我这没什么例子.

你也可以在DDK或别的语言里嵌入汇编写驱动.
lovedrvdev
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望42点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-27 21:07
楼上的兄弟,在MSDN找,我有一个问题
我在DRIVERENTRY中嵌入汇编
_asm
{
...
}
安装成功了
而先定义 void _declspec(naked) fucname()
{
_asm
{
//为空,无内容
}
}
在DRIVERENTRY中调用,一安装驱动就重启,为什么?
xiaohuating
驱动牛犊
驱动牛犊
  • 注册日期2004-04-15
  • 最后登录2018-01-09
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望27点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2004-07-28 09:07
哦,这两天不舒服没上来.

我试了一下,情况和你说的一样啊,都自动重启.是不是还应该更改编译器某些设置才行啊.真不知道Winflash是怎么实现的,我用softice看了他的这段代码啊,都差不多哦.
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
6楼#
发布于:2004-07-28 10:44
void _declspec(naked) fucname()
{
_asm
{
  //至少应该加一个ret
  ret
}
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2004-07-28 11:51
void _declspec(naked)表示编译器完全不管你的函数了,所以要你自己来平衡堆栈.
_asm
{
enter x,0

....
leave
ret
}
x为你要使用变量的字节数.
BTW网上有专门的WDM汇编开发包,可以用纯汇编来写,不过我觉得还是不方便(玩玩可以),嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
xiaohuating
驱动牛犊
驱动牛犊
  • 注册日期2004-04-15
  • 最后登录2018-01-09
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望27点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2004-07-28 16:50
我现在的代码如下,现在会自动reboot的.
如果去掉 "_declspec(naked) " 声明和对EBP寄存器的操作在非超线程CPU下可以跑的.

是不是我把所有寄存器先保存下来,如下就可以了啊.

大家一起来讨论这个话题啊,好象这个技巧还是很有用的哦,欢迎大家给我点建议.

//writeAddr -- Erase/Write ROM address;
//pData -- source buf(write).
//uCount -- Erase/Write count.
//op -- Erase or write.

_declspec(naked) void WriteFlash(ULONG WriteAddr, ULONG
                             pData,ULONG uCount,ULONG op)
{
 _asm{
//save all registers
          pushad
//cli
mov esi,pData
mov ecx,uCount
mov edi,WriteAddr

push ebp //;danny_MP
mov ebp, '$SMI' //;danny_MP

mov eax,op
mov edx,SMIPort
out dx,al
cmp ebp,'SMI$'

pop ebp
jnz Write_Exit

lahf
xchg al,ah
mov RetMessage, eax
sti
Write_Exit:
popad
}
// return msg;
}
lovedrvdev
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望42点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-28 19:13
请问wowocock,我直接用汇编也能完成,为什么还用_declspec(naked)

xiaohuating
驱动牛犊
驱动牛犊
  • 注册日期2004-04-15
  • 最后登录2018-01-09
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望27点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2004-07-29 08:39
OK,谢谢wowocock大佬.
原来这样声明的函数需要自己处理压栈,退出动作.编译器只负责调用此函数的入口点.

lovedrvdev:
嵌入的汇编一般都有限制的.用这个方法可以避开某些限制.
xiaohuating
驱动牛犊
驱动牛犊
  • 注册日期2004-04-15
  • 最后登录2018-01-09
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望27点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2004-07-29 08:41
可以问下怎么给分吗?分虽然少,但也是我的一点心意.
KingV
驱动牛犊
驱动牛犊
  • 注册日期2001-11-27
  • 最后登录2006-08-04
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-08-01 23:10
其实在DDK里任何地方都可以用汇编~~
但是~!!!EBP寄存器一定小小心使用~!!否则挂了你都不知道怎么死的~――很难找到错误~!!呵呵,好自为知吧~!
游客

返回顶部