首页
社区
课程
招聘
[原创]Delphi研究之驱动开发篇(一)--实现原理
发表于: 2008-1-5 21:48 55417

[原创]Delphi研究之驱动开发篇(一)--实现原理

2008-1-5 21:48
55417
收藏
免费 7
支持
分享
最新回复 (73)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
51
这是FileDiskThread的更正:

procedure FileDiskThread(Context: PVOID); stdcall;
var
AIRP : PIRP;
ABuffer : PUCHAR;
ARequest : PLIST_ENTRY;
ASystemBuffer : PUCHAR;
AIOStack : PIO_STACK_LOCATION;
ADeviceObject : PDEVICE_OBJECT;
ADeviceExtension : PDEVICE_EXTENSION;
ADelta : CCHAR;
begin
ASSERT(Context <> nil);
ADeviceObject := Context;
ADeviceExtension := ADeviceObject^.DeviceExtension;

KeSetPriorityThread(KeGetCurrentThread,LOW_REALTIME_PRIORITY);

FileDiskAdjustPrivilege(SE_IMPERSONATE_PRIVILEGE,true);

while true do
begin
  KeWaitForSingleObject(
      @ADeviceExtension^.request_event,
      Executive,
      Byte(KernelMode),
      FALSE,
      nil);

  if ADeviceExtension^.terminate_thread then
   PsTerminateSystemThread(STATUS_SUCCESS);

  ARequest := ExInterlockedRemoveHeadList(@ADeviceExtension^.list_head,
                                          @ADeviceExtension^.list_lock);

  while ARequest <> nil do
  begin
   // #define CONTAINING_RECORD(address, type, field) \
   // ((type *)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type *)0)->field))))
   // AIRP := CONTAINING_RECORD(request, IRP, Tail.Overlay.ListEntry);
   AIRP := PIRP(ULONG_PTR(ARequest) - ULONG_PTR(@PIRP(0)^.Tail.Overlay.wListEntry));
   AIOStack := IoGetCurrentIrpStackLocation(AIRP);

   case AIOStack^.MajorFunction of
    IRP_MJ_READ:
     begin
      ASystemBuffer := MmGetSystemAddressForMdlSafe(AIRP^.MdlAddress,NormalPagePriority);
      if ASystemBuffer = nil then
      begin
       AIRP^.IoStatus.Status := STATUS_INSUFFICIENT_RESOURCES;
       AIRP^.IoStatus.Information := 0;
      end else begin
       ABuffer := ExAllocatePool(PagedPool,AIOStack^.Parameters.Read.Length);
       if ABuffer = nil then
       begin
        AIRP^.IoStatus.Status := STATUS_INSUFFICIENT_RESOURCES;
        AIRP^.IoStatus.Information := 0;
       end else begin
        ZwReadFile(ADeviceExtension^.file_handle,
                   NULL,
                   nil,
                   nil,
                   @AIRP^.IoStatus,
                   ABuffer,
                   AIOStack^.Parameters.Read.Length,
                   @AIOStack^.Parameters.Read.ByteOffset,
                   nil);
        memcpy(ASystemBuffer,ABuffer,AIOStack^.Parameters.Read.Length);
        ExFreePool(ABuffer);
       end;
      end;
     end;

    IRP_MJ_WRITE:
     begin
      if (AIOStack^.Parameters.Write.ByteOffset.QuadPart +
          AIOStack^.Parameters.Write.Length) >
          ADeviceExtension^.file_size.QuadPart then
      begin
       AIRP^.IoStatus.Status := STATUS_INVALID_PARAMETER;
       AIRP^.IoStatus.Information := 0;
      end;
      ZwWriteFile(ADeviceExtension^.file_handle,
                  NULL,
                  nil,
                  nil,
                  @AIRP^.IoStatus,
                  MmGetSystemAddressForMdlSafe(AIRP^.MdlAddress,NormalPagePriority),
                  AIOStack^.Parameters.Write.Length,
                  @AIOStack^.Parameters.Write.ByteOffset,
                  nil);
     end;

    IRP_MJ_DEVICE_CONTROL:
     begin
      case AIOStack^.Parameters.DeviceIoControl.IoControlCode of
       IOCTL_FILE_DISK_OPEN_FILE:
        begin
         SeImpersonateClient(ADeviceExtension^.security_client_context,nil);
         AIRP^.IoStatus.Status := FileDiskOpenFile(ADeviceObject,AIRP);
         PsRevertToSelf;
        end;
       IOCTL_FILE_DISK_CLOSE_FILE:
        begin
         AIRP^.IoStatus.Status := FileDiskCloseFile(ADeviceObject,AIRP);
        end;
       else AIRP^.IoStatus.Status := STATUS_DRIVER_INTERNAL_ERROR;
      end;
     end;
    else AIRP^.IoStatus.Status := STATUS_DRIVER_INTERNAL_ERROR;
   end;

   if NT_SUCCESS(AIRP^.IoStatus.Status) then
    ADelta := CCHAR(IO_DISK_INCREMENT)
   else
    ADelta := CCHAR(IO_NO_INCREMENT);
   IoCompleteRequest(AIRP,ADelta);

   ARequest := ExInterlockedRemoveHeadList(@ADeviceExtension^.list_head,
                                           @ADeviceExtension^.list_lock);
  end;
end;
end;
2008-10-22 22:48
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
52
其他地方肯定还有语法错误和翻译错误,慢慢来吧!,能和大家一起修改就更好了,共同学习,共同进步!
2008-10-22 22:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
53
没时间研究啊,不过记住楼主了。
2008-10-27 11:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
54
牛,delphi搞驱动的话,要求汇编是不是要很强呀?
2008-11-8 20:59
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
55
为什么大家现在不用delphi7编译 不是说7最稳定吗?
2008-11-9 08:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
56
如题,在俄语网站上找到一个的汇编版KmdKit的例子及工具包,有参考价值的!
上传的附件:
2008-11-14 00:46
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
57
全部源码编译成功,没做任何设置,有时会提示.dpr文件找不到,我发现是路径问题。
beeper.pas那个文件是不是错了?
能否将NTDDK。PAS放在include/下,这样能编译我以前找到的一些源码吗?
2008-11-23 09:01
0
雪    币: 376
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
58
http://bbs.pediy.com/showthread.php?t=50052
我使用上文中的Driver.pas+2ccc下载的DDDK编译,前两步没有问题,第三步出错了。。。这是因为什么啊?

I:\DDDK004\bin>dcc32.exe -U..\inc -B -CG -JP -$A-,C-,D-,G-,H-,I-,L-,P-,V-,W+,Y- Driver.pas

Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
I:\DDDK004\inc\DDDK.pas(1029)
Driver.pas(71)
1102 lines, 0.02 seconds, 192 bytes code, 12 bytes data.
-----------------------------------------------------
I:\DDDK004\bin>omf2d.exe Driver.obj

OMF2D 1.02 converts 32bit OMF to Delphi linkable OMF
Copyright (C) 2003 Radim Picha, www.anticracking.sk/EliCZ
Converting "Driver.obj" to "Driver.obj"
-------------------------------------------------------
I:\DDDK004\bin>link.exe /NOLOGO /ALIGN:4096 /BASE:0x10000 /SUBSYSTEM:NATIVE /DRIVER /LIBPATH:..\lib /ENTRY:DriverEntry ntoskrnl.lib /out:Driver.sys
LINK : warning LNK4001: no object files specified; libraries used
LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
LINK : error LNK2001: unresolved external symbol _DriverEntry
Driver.sys : fatal error LNK1120: 1 unresolved externals
2008-11-23 14:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
59
太崇拜你了!

努力学习ing
2008-12-17 17:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
60
谢谢!!!!
2008-12-18 14:13
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
61
学习 向大家 都不懂 啊 学习
2008-12-28 22:08
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
62
用 delphi 开发windows 驱动 有何 很现实 或者 高效的 意义嘛? 既然 从c++可以完成windows 驱动开发 为何 还要选择 delphi 呢?
2008-12-28 22:24
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
63
多一个方法变通而已,方便了Delphi程序员也能动手写驱动。再说C++对于一般人有一定的难度,Delphi相对更简单。
2009-1-28 21:27
0
雪    币: 202
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
64
scp.exe  这个文件是那来的,
2009-1-29 21:01
0
雪    币: 402
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
65
你好!请问出现这种错为什么呢?

D:\KmdKit4D\samples\basic>dcc32 -U D:\KmdKit4D\include -B -CG -JP -$A-,C-,D-,G-,
H-,I-,L-,P-,V-,W+,Y- -O+ "D:\KmdKit4D\samples\basic\driver.pas"
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
Fatal: File not found: 'D:\KmdKit4D\include.dpr'

D:\KmdKit4D\samples\basic>PAUSE
请按任意键继续. . .
2009-2-7 17:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
66
我有点异议
_xxxx@8之类的并不是因为COFF格式,而是应为里面的函数是STDCALL的调用方式吧
2009-3-14 15:05
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
67
很简单,因为Delphi用的很爽,他有很多C++并没有在语言层次直接支持的新特性,比如说闭包,构造函数调虚函数
2009-3-14 15:06
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
68
驱动不是要用 c 和ddk写么 delphi? 怎麽个意思?
2009-3-20 22:39
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
69
dddk  投一次听说啊 就知道ddk。。
2009-3-20 22:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
70
真是对我等用Delphi之辈的莫大鼓舞啊。
2009-5-19 13:55
0
雪    币: 204
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
71
原来DELPHI也可以这么强大
2009-5-19 15:53
0
雪    币: 200
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
72
楼主好心态,笑看风云。
2009-7-9 22:56
0
雪    币: 405
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
74
准备用Delphi玩玩驱动,正在持续学习中...
2011-1-14 08:57
0
雪    币: 104
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
75
非常好啊,支持支持!
2012-10-5 07:34
0
游客
登录 | 注册 方可回帖
返回
//