您的位置:程序门 -> delphi -> 非技术区



【求助】玩过ddk的同仁进来帮一下忙,ly_liuyang一定要来哦:)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


【求助】玩过ddk的同仁进来帮一下忙,ly_liuyang一定要来哦:)[已结贴,结贴人:clasj]
发表于:2007-08-03 17:34:10 楼主
在网上找到的方法一般是用deviceiocontrol、readfile、writefile等,但是用这些方法的前提是先调用   createfile,这个函数的第一个参数是一个symboliclink(例如:"\\\\.\\testsample"),这个   symboliclink一般是在驱动程序中调用iocreatesymboliclink创建的,这样的驱动程序一般有类似如下入口例程:
ntstatus   driverentry(in   pdriver_object   driverobject,in   punicode_string   registrypath)
{
        pfile_object   plowerfileobject=null;
        unicode_string   devicename;
        unicode_string   dosdevicename;
        unicode_string   name;
        pdevice_object   plowerdeviceobject=null;
        pdevice_object   pdeviceobject=null;
        ntstatus   status;
     
        driverobject-> driverunload=driverunload;
        driverobject-> majorfunction[irp_mj_read]                       =   testsampleread;
        driverobject-> majorfunction[irp_mj_write]                       =   testsamplewrite;
        driverobject-> majorfunction[irp_mj_create]                 =   testsamplecreate;
        driverobject-> majorfunction[irp_mj_close]                     =   testsampleclose;
        driverobject-> majorfunction[irp_mj_device_control]   =   testsampledevicecontrol;
        rtlinitunicodestring(&devicename,gdevicename);
        rtlinitunicodestring(&dosdevicename,gdosdevicename);
        iocreatedevice(driverobject,0,&devicename,file_device_unknown,0,false,&pdeviceobject);
        pdeviceobject-> flags ¦=do_buffered_io;
        status   =   iocreatesymboliclink(&dosdevicename,&devicename);
        if(status)
                dbgprint("iocreatesymboliclink   return   %0x\n",status);
        keinitializespinlock(&gspinlock);
        rtlinitunicodestring(&name,gkeventname);
        pmsgkevent   =   iocreatesynchronizationevent(&name,&hmsgevent);
        status   =   obreferenceobjectbyhandle(hmsgevent,event_all_access,*exeventobjecttype,kernelmode,(pvoid*)&gkeventobject,null);      
        if(!nt_success(status))
        {
                dbgprint("sdbgmsg   :   obreferenceobjectbyhandle\n");
        }
        else
        {
                dbgprint("gkeventobject   =   %x   pmsgkevent=%x\n",gkeventobject,pmsgkevent);
        }
        if(gkeventobject)
                keclearevent(gkeventobject);
        if(pmsgkevent)
                keresetevent(pmsgkevent);
     
        return   0;
}

我现在碰到一个这样的驱动程序,它的入口例程如下:
ulong
driverentry   (
        in   pdriver_object   driverobject,
        in   punicode_string   registrypath
        )
{
        hw_initialization_data             hwinitdata;
        ulong                                             returnvalue;

        rtlzeromemory(&hwinitdata,   sizeof(hwinitdata));

        hwinitdata.hwinitializationdatasize   =   sizeof(hwinitdata);

        //
        //   set   the   adapter   entry   points   for   the   driver
        //

        hwinitdata.hwinterrupt                             =   null;   //   hwinterrupt;

        hwinitdata.hwreceivepacket                     =   adapterreceivepacket;
        hwinitdata.hwcancelpacket                     =   adaptercancelpacket;
        hwinitdata.hwrequesttimeouthandler     =   adaptertimeoutpacket;

        hwinitdata.deviceextensionsize             =   sizeof(hw_device_extension);
        hwinitdata.perrequestextensionsize     =   sizeof(srb_extension);
        hwinitdata.filterinstanceextensionsize   =   0;
        hwinitdata.perstreamextensionsize     =   sizeof(streamex);
        hwinitdata.busmasterdma                         =   false;
        hwinitdata.dma24bitaddresses                 =   false;
        hwinitdata.bufferalignment                     =   3;
        hwinitdata.dmabuffersize                         =   0;

        //   don't   rely   on   the   stream   class   using   raised   irql   to   synchronize
        //   EXECution.     this   single   paramter   most   affects   the   overall   structure
        //   of   the   driver.

        hwinitdata.turnoffsynchronization     =   true;

        returnvalue   =   streamclassregisteradapter(driverobject,   registrypath,   &hwinitdata);

        return   returnvalue;
}
我现在不知道怎么跟这样的驱动程序通讯啊,大虾们帮帮忙啊。
发表于:2007-08-03 17:38:271楼 得分:20
sf
发表于:2007-08-03 17:38:512楼 得分:0
兄弟,来帮你顶
发表于:2007-08-03 18:01:323楼 得分:20
ding起来
发表于:2007-08-05 01:34:514楼 得分:20
不大懂也~`   友情帮顶
发表于:2007-08-05 10:11:215楼 得分:20
没玩过ddk,   帮顶.
发表于:2007-08-05 10:12:026楼 得分:0
移到c++去吧,   d版估计搞ddk的比较少.
发表于:2007-08-05 15:00:147楼 得分:20
delphi如果不用ddk,永远不能做出像“冰点”这样的软件了。。。。。。。。。。。。
发表于:2007-08-06 09:18:218楼 得分:0
我在vc版也发了帖子,没有得到很好的答复,发在这里主要是想让ly帮着看看,他居然没来。。。到时候散分。
发表于:2007-08-08 09:11:549楼 得分:0
自己顶
发表于:2007-08-08 09:23:3210楼 得分:20
bs   ly
发表于:2007-08-08 10:56:0211楼 得分:20
应用层和sys通讯,都是使用irp   请求的,
即用createfile打开sys得到句柄,再调用deviceiocontrol往这个sys,发送i/o控制码   进行通讯

所以,sys要能接收并处理,应用层发送过来的io请求才行,

如例子1:
                driverobject-   > majorfunction[irp_mj_read]                                               =       testsampleread;
                driverobject-   > majorfunction[irp_mj_write]                                               =       testsamplewrite;
                driverobject-   > majorfunction[irp_mj_create]                                   =       testsamplecreate;
                driverobject-   > majorfunction[irp_mj_close]                                           =       testsampleclose;
                driverobject-   > majorfunction[irp_mj_device_control]       =       testsampledevicecontrol;  

它可以处理的io请求有:irp_mj_read、irp_mj_write,irp_mj_device_control...

而楼主碰到驱动,要通讯的话,也要能接收和处理   irp
 
发表于:2007-08-08 15:29:1812楼 得分:0
> >   “createfile打开sys得到句柄”

修改一下:

    createfile打开   驱动创建的设备,
发表于:2007-08-08 15:48:0313楼 得分:20
ding
发表于:2007-08-08 16:16:3214楼 得分:40
才看见这个贴的
这个应该是stream   mini驱动,是物理硬件的驱动,而不是r0的软件(应用)驱动
发表于:2007-08-08 16:18:3915楼 得分:0
参考
http://blog.csdn.net/epbon/archive/2006/01/14/578984.aspx


快速检索

最新资讯
热门点击