yanjvn
驱动牛犊
驱动牛犊
  • 注册日期2003-05-20
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望57点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
阅读:1668回复:9

可不可以在驱动代码中像应用层一样使用硬件?用zwCreateFile

楼主#
更多 发布于:2007-01-18 11:39
  看到一些在内核中读写文件的例子,不知道能不能通过设备名访问硬件呢?
 
yanjvn
驱动牛犊
驱动牛犊
  • 注册日期2003-05-20
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望57点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-01-18 16:13
兄弟们请指点一下阿,做过的兄弟能不能给点意见
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2007-01-18 16:15
能~
我习惯于使用ObOpenObjectByName,不过ZeCreateFile也行的哈~
没有战争就没有进步 X3工作组 为您提供最好的军火
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-01-18 18:01
ObOpenObjectByName是必经之地,做什么都好,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2007-01-18 18:29
引用第3楼wowocock2007-01-18 18:01发表的“”:
ObOpenObjectByName是必经之地,做什么都好,嘿嘿......


有时候我也会直接去访问obpDir的~~不过这种事情一般不会发生~
没有战争就没有进步 X3工作组 为您提供最好的军火
yanjvn
驱动牛犊
驱动牛犊
  • 注册日期2003-05-20
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望57点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-01-18 20:08
多谢斑竹! 兄弟们多指导。
上面那个函数是不是标准函数?MSDN查不到?能不能给一个函数说明?以及简单的使用举例?



另外,
如何在驱动程序里创建系统线程? (我已经知道但是还是问一下具体的)
有哪些限制没? 是不是基本上和应用层的使用方法类似。(我已写了个大概,但是以前没经验,
所以不敢确定写的是否正确)。


有经验的兄弟们,给一些确定的建议
yanjvn
驱动牛犊
驱动牛犊
  • 注册日期2003-05-20
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望57点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-01-19 14:00
今天使用
  status = PsCreateSystemThread(  
                              &ThreadHandle,    
                              THREAD_ALL_ACCESS, //???FILE_ALL_ACCESS
                              &ObjectAttributes,    
                              NULL,// ProcessHandle    
                              NULL,// ClientId      
                              (PKSTART_ROUTINE)ReadThread,    
                              pGlobalVar);

作为线程运行时,
我在这里面写成死循环 ReadThread
那这个线程怎么终止阿?

而且,我看到系统中的 system 进程 非常的 占CPU ,50%
请问,可不可以这样的在线程中不断读,而没有等待事件。

一般的线程内如何写 ? 斑竹多多指点


2。
我的设备卸载时,系统回重启!!
我在没有实际 操作硬件时不会,挂上了线程和硬件后就不行了,预计是什么原因?
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-01-22 06:30
引用第6楼yanjvn2007-01-19 16:00发表的“”:
今天使用
  status = PsCreateSystemThread(  
                              &ThreadHandle,    
                              THREAD_ALL_ACCESS, //???FILE_ALL_ACCESS
                              &ObjectAttributes,    
.......


做thread,当然要用event/semaphore/mutex/spinlock了,怎么可以一直不停的循环呢?在thread的循环开始的地方,等event/semaphore,然后执行操作,再重复等。循环中检查stop变量,如果要stop,就退出thread。如果操作的是共享资源,就用mutex/spinlock保护。和user mode thread没有什么区别

卸载的时候看看有没有什么东西没有释放,用WinDbg看一下就知道了
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
yanjvn
驱动牛犊
驱动牛犊
  • 注册日期2003-05-20
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望57点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-01-23 15:33
大虾们告知,一个死机调试的方法,现在的情况是,在某种情况下,会重启。
我想可能是某些资源不存在导致的,
前面我都使用简单的 debugview 来调试的。


求教如何调试死机时的情景!?? 不胜感谢
yanjvn
驱动牛犊
驱动牛犊
  • 注册日期2003-05-20
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望57点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-01-26 17:19
不想新开贴,在这里继续问一些问题。

今天装上 softICE 调试的时候,奇怪系统不挂了, 本来想抓死机时的情况。现在的问题 是

杀不死掉线程, 在unload 函数里面,想杀死线程没有成功。下面给出创建和 杀死线程的函数,主要来源于网上的参考,大虾们帮我看看,有没有问题,怎么写更好


//
// Terminate Thread
//
NTSTATUS
TerminateReadThread(PGLOBAL_DRIVER_EXTENSION pGlobalVar)
{
    NTSTATUS status;

   // KeSetEvent(&pExt->evBeep, IO_NO_INCREMENT, FALSE);
    pGlobalVar->ReadStopThread = 1; //stop
   //这样能不能停掉线程???
//    KeResetEvent( &pGlobalVar->ReadCompleteEvent);


    if(pGlobalVar->ReadThreadPointer != NULL) {
        //
        // Wait for the thread to terminate
        //
//程序执行到这里等待,,,,永远等待下去了
     status = KeWaitForSingleObject(pGlobalVar->ReadThreadPointer,
                                      Executive,
                                      KernelMode,
                                      FALSE,
                                      NULL );

        ObDereferenceObject(pGlobalVar->ReadThreadPointer);
        pGlobalVar->ReadThreadPointer = NULL;
    }

    return status;
}

//
//CreateReadThread
//
NTSTATUS
CreateReadThread(PGLOBAL_DRIVER_EXTENSION  pGlobalVar)
{
    NTSTATUS                status;
    HANDLE                    ThreadHandle;
    OBJECT_ATTRIBUTES  ObjectAttributes;

    DebugPrint(("---  CreateReadThread ---\n"));

    pGlobalVar->ReadStopThread = 0; //stop

    status = PsCreateSystemThread(
                    &ThreadHandle,
                    (ACCESS_MASK) 0L,
                    NULL,
                    NULL,
                    NULL,
                    ReadThread,
                    pGlobalVar
                    );    

    if(!NT_SUCCESS(status))
     {
           DebugPrint(("CreateReadThread Failed %x \n",status));
         return status;
     }  

    status = ObReferenceObjectByHandle(
                    ThreadHandle,
                    THREAD_ALL_ACCESS,
                    NULL,
                    KernelMode,
                    &pGlobalVar->ReadThreadPointer,
                    NULL
                    );

   DebugPrint(("ObReferenceObjectByHandle status:%x \n",status));
   return  status;
}
游客

返回顶部