阅读:1668回复:9
可不可以在驱动代码中像应用层一样使用硬件?用zwCreateFile
看到一些在内核中读写文件的例子,不知道能不能通过设备名访问硬件呢?
|
|
沙发#
发布于:2007-01-18 16:13
兄弟们请指点一下阿,做过的兄弟能不能给点意见
|
|
板凳#
发布于:2007-01-18 16:15
能~
我习惯于使用ObOpenObjectByName,不过ZeCreateFile也行的哈~ |
|
|
地板#
发布于:2007-01-18 18:01
ObOpenObjectByName是必经之地,做什么都好,嘿嘿......
|
|
|
地下室#
发布于:2007-01-18 18:29
引用第3楼wowocock于2007-01-18 18:01发表的“”: 有时候我也会直接去访问obpDir的~~不过这种事情一般不会发生~ |
|
|
5楼#
发布于:2007-01-18 20:08
多谢斑竹! 兄弟们多指导。
上面那个函数是不是标准函数?MSDN查不到?能不能给一个函数说明?以及简单的使用举例? 另外, 如何在驱动程序里创建系统线程? (我已经知道但是还是问一下具体的) 有哪些限制没? 是不是基本上和应用层的使用方法类似。(我已写了个大概,但是以前没经验, 所以不敢确定写的是否正确)。 有经验的兄弟们,给一些确定的建议 |
|
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。 我的设备卸载时,系统回重启!! 我在没有实际 操作硬件时不会,挂上了线程和硬件后就不行了,预计是什么原因? |
|
7楼#
发布于:2007-01-22 06:30
引用第6楼yanjvn于2007-01-19 16:00发表的“”: 做thread,当然要用event/semaphore/mutex/spinlock了,怎么可以一直不停的循环呢?在thread的循环开始的地方,等event/semaphore,然后执行操作,再重复等。循环中检查stop变量,如果要stop,就退出thread。如果操作的是共享资源,就用mutex/spinlock保护。和user mode thread没有什么区别 卸载的时候看看有没有什么东西没有释放,用WinDbg看一下就知道了 |
|
|
8楼#
发布于:2007-01-23 15:33
大虾们告知,一个死机调试的方法,现在的情况是,在某种情况下,会重启。
我想可能是某些资源不存在导致的, 前面我都使用简单的 debugview 来调试的。 求教如何调试死机时的情景!?? 不胜感谢 |
|
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; } |
|