首页
社区
课程
招聘
[求助]蓝屏50次以上,大牛们帮帮们看看是怎么回事
发表于: 2010-12-20 13:59 5078

[求助]蓝屏50次以上,大牛们帮帮们看看是怎么回事

2010-12-20 13:59
5078
小弟用的delphi开发驱动,在驱动里用到了PsLookupProcessByProcessI这个函数,这样调用
st := PsLookupProcessByProcessId(ClientId.UniqueProcess, eprocess);
该函数的声明在ntoskrnl.pas里面:
function PsLookupProcessByProcessId(ulProcId: ULONG; var EProcess: PVOID   NTSTATUS; stdcall;
function PsLookupProcessByProcessId; external NtKernel name '_PsLookupProcessByProcessId';
我引入了ntoskrnl.单元,然后就直接调用了该函数,经过windbg查看
ba658b90 55              push    ebp
ba658b91 8bec            mov     ebp,esp
ba658b93 51              push    ecx
ba658b94 53              push    ebx
ba658b95 56              push    esi
ba658b96 57              push    edi
ba658b97 8b5d14          mov     ebx,dword ptr [ebp+14h]
ba658b9a 8b33            mov     esi,dword ptr [ebx]
ba658b9c 81feffc99a3b    cmp     esi,3B9AC9FFh
ba658ba2 750c            jne     ba658bb0
ba658ba4 8d45fc          lea     eax,[ebp-4]
ba658ba7 50              push    eax
ba658ba8 56              push    esi
ba658ba9 e852f4ffff      call    ba658000 //////////////这里为刚刚的那个函数调用(后面跟进去一看显示下面的代码,后显示这个地址是错误的,所以蓝屏了)
Flow analysis was incomplete, some code may be missing
ba658000 4d              dec     ebp
ba658001 5a              pop     edx
ba658002 90              nop
ba658003 0003            add     byte ptr [ebx],al
ba658005 0000            add     byte ptr [eax],al
ba658007 000400          add     byte ptr [eax+eax],al
ba65800a 0000            add     byte ptr [eax],al
请问大大们delphi能这样引入ntoskrnl.pas 然后就直接调用里面的函数吗,我随变试了几个ntoskrnl.pas里定义的其它函数发现他们的call的地址都是一样的。。另外我查看了本机的内核为
ntkrnlpa.exe ..于是把ntoskrnl.pas 单元里的NtKernel='ntoskrnl.exe'; 改为Ntkernel='ntkrnlpa.exe';还是一样的结果。。。。请大牛们看看这是怎么回事?不胜感激!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 7992
活跃值: (2566)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
PsLookupProcessByProcessId(ClientId.UniqueProcess, eprocess);

注意第二个参数.需要传递一个PEPROCESS的指针.也就是PEPROCESS*类型数据.
2010-12-20 14:05
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢大大的回复,不过现在的主要问题不是参数问题,而是这个函数的地址问题哦。。call进去一个错误的地址导致了蓝屏。。。
2010-12-20 14:06
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
调用ntoskrnl.pas里的任何一个函数用windbg查看call后面的地址都是一样的,如下面都是call ba658000...问题就出在这里哦
ba658ba9 e852f4ffff      call    ba658000 //////////////
2010-12-20 14:08
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
任何一个函数?我想你搞错了吧!
2010-12-20 15:07
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你知道是怎么回事嘛?
2010-12-20 15:09
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
7
PEPROCESS eprocess=NULL;

PsLookupProcessByProcessId((HANDLE)998,&eprocess);

用完之后:

ObDereferenceObject(eprocess);
2010-12-20 15:32
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大哥,不是参数问题啊,你讲的这些我都注意过的,还是一样的蓝屏。。主要是那个函数地址不正确
2010-12-20 15:50
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
var
  peProcess: PVOID;   { PEPROCESS }
  fbDereference: Boolean;
  us: UNICODE_STRING;
begin
  if PsLookupProcessByProcessId(dwProcessId, peProcess) = STATUS_SUCCESS then
  begin
      fbDereference := True;  { PsLookupProcessByProcessId references process object }
  end ;
if fbDereference then
  begin
     ObfDereferenceObject(peProcess);
  end;
------------------------------------------------
Delphi 驱动开发网上的代码,摘抄了一些,也不知道对不对,如果象所说的编译后函数不能正确寻址,只有等Mickeylan来解决了
2010-12-20 17:02
0
游客
登录 | 注册 方可回帖
返回
//