阅读:1966回复:17
WDM驱动程序中是不是不能用mmsystem.h啊?
为什么我只要把它包含进去就有错,如果是在用户程序中,用它的话还要用<windows.h>和<windowsx.h>才行,是不是在驱动中不能用这个头文件呀?
我想在我的驱动中播放WAV文件,是在驱动中,没有与它通信的用户程序,请问可以做到吗?能不能给点思路,有些迷茫,哪位指点一下,谢谢了。 |
|
沙发#
发布于:2005-04-28 16:46
为什么我只要把它包含进去就有错,如果是在用户程序中,用它的话还要用\"windows.h\"和\"windowsx.h\"才行,是不是在驱动中不能用这个头文件呀? 哪位大虾说说话呀,有什么实现思路吗?菜鸟这厢有礼了 |
|
板凳#
发布于:2005-04-29 10:08
[quote]为什么我只要把它包含进去就有错,如果是在用户程序中,用它的话还要用\"windows.h\"和\"windowsx.h\"才行,是不是在驱动中不能用这个头文件呀? 哪位大虾说说话呀,有什么实现思路吗?菜鸟这厢有礼了 [/quote] 发音还是用PC喇叭吧,虽然难听,但有怀旧的感觉,呵呵。。。 |
|
|
地板#
发布于:2005-04-29 14:07
[quote][quote]为什么我只要把它包含进去就有错,如果是在用户程序中,用它的话还要用\"windows.h\"和\"windowsx.h\"才行,是不是在驱动中不能用这个头文件呀? 哪位大虾说说话呀,有什么实现思路吗?菜鸟这厢有礼了 [/quote] 发音还是用PC喇叭吧,虽然难听,但有怀旧的感觉,呵呵。。。 [/quote] PC喇叭?以前没有用过,可以说得详细一点吗?或者给一个例子,太感谢你了,好几个问题都是你帮忙,以后要分尽管说,只要有,给!! |
|
地下室#
发布于:2005-04-29 15:19
PC喇叭就是你开机听到的那个嘀的一声的东东
看最老的那本清华大学出的pc汇编语言,黄色书皮的,我那时定价仅6元,操作61端口,现在Windows中系统设备中它叫System speaker,过去DOS下有个1645病毒,它还会用PC 喇叭唱东方红和浏阳河呢!!!嘻嘻,以前我把它的传染部分去掉了,由于DOS病毒都是TSR,所以做程序时候当现在的Mp3听,用起来也很简单 |
|
|
5楼#
发布于:2005-04-29 16:04
PC喇叭就是你开机听到的那个嘀的一声的东东 呵呵,谢谢了,我找一下看,那本书估计是找不到了,我去网上搜一下,如果你有源码什么的,可以给我发一下吗? 我的邮箱:zhangheng607@163.com 谢谢了 |
|
6楼#
发布于:2005-04-29 16:50
[quote]PC喇叭就是你开机听到的那个嘀的一声的东东 呵呵,谢谢了,我找一下看,那本书估计是找不到了,我去网上搜一下,如果你有源码什么的,可以给我发一下吗? 我的邮箱:zhangheng607@163.com 谢谢了 [/quote] 这本书是当年垄断天下的汇编教材,很好找 |
|
|
7楼#
发布于:2005-04-29 16:53
我的那本早压箱底了,不好找,不过绝对在
不过现在web这么发达,到google中搜一下PC喇叭,一箩筐。。。嘻嘻。。。 |
|
|
8楼#
发布于:2005-04-29 16:56
或者加上汇编这个关键字
用汇编PC喇叭搜 :D |
|
|
9楼#
发布于:2005-04-30 02:05
或者加上汇编这个关键字 呵呵,我们的汇编书也是清华编的,也是黄色,不过已经不是6块了,而是46块,上面确实有关于PC喇叭的,我也试过一些用PC喇叭做的东西,感觉不是我想要的:) 我加了mmsystem.h,现在编译通过了,可是运行就死机,是不是不能用这个东东呀,还是我用得不对,我说一下吧,我定义了一个系统线程,这个应该没有问题,如果有问题应该在下面的SoundKeys()里面: class NewThread : public KSystemThread { SAFE_DESTRUCTORS public: NewThread(); VOID Post(KIrp I); KInterlockedList<IRP> myQueue; KSemaphore myMailbox; }; NewThread::NewThread():myMailbox((LONG)0, MAX_IRP) { } VOID NewThread::Post(KIrp I) { myQueue.InsertTail(I); myMailbox.Signal(); } 然后,如果收到F3,以后如果有按键,则根据它的扫描码找到它对应的WAV文件,然后发音。其它函数可以保证对,因为如果我把那一句注释掉就可以用了,sndPlaySound和mciSendCommand都试过了,都不行。 #define SOUND_DIR \"f:\\\\Sound\\\\_.wav\" 或者 #define SOUND_DIR \"\\\\DosDevices\\\\f:\\\\Sound\\\\_.wav\"哪个才对,都试过了,都不行,所以我想问题不在这儿吧 以下是线程 如果传过来的字符没有被识别,则发音文件用的是_.wav void MyKBFilterDevice::SoundKeys() { char code; char path[]=SOUND_DIR; /* MCI_OPEN_PARMS mciOpenParms; MCI_PLAY_PARMS PlayParms; mciOpenParms.dwCallback=0; mciOpenParms.wDeviceID=0; mciOpenParms.lpstrDeviceType=\"waveaudio\"; mciOpenParms.lpstrAlias=\" \"; PlayParms.dwCallback=0; PlayParms.dwTo=0; PlayParms.dwFrom=0;*/ while (TRUE) { SoundThread.myMailbox.Wait(); KIrp I=SoundThread.myQueue.RemoveHead(); code=(char)I->IoStatus.Information; if(code!=\' \')path[9]=code;//path[21]=code; else path[9]=\'_\';//path[21]=\'_\'; t<<\"所要发音的是字母:\"<<code<<\"所在位置是:\"<<path<<\"\\n\"; //sndPlaySound(TEXT(path), SND_FILENAME);//SND_ASYNC | SND_FILENAME); /* mciOpenParms.lpstrElementName=(LPCTSTR)path; mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);//打开音频设备; mciSendCommand(mciOpenParms.wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)(LPVOID)&PlayParms);//播放WAVE声音文件; mciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,NULL,NULL);//关闭音频设备; */ } } |
|
10楼#
发布于:2005-04-30 09:11
在驱动程序中能用sndPlaySound和mciSendCommand这些函数么?
|
|
11楼#
发布于:2005-04-30 10:13
sndPlaySound和mciSendCommand在驱动中不能用啊!你调用它,其实连接的是指向User模式下的地址,即一般<2G,驱动都是在>2G空间的,调用它绝对要报销,奇怪,你的居然是死机,不出兰屏吗?
|
|
|
12楼#
发布于:2005-05-01 00:03
sndPlaySound和mciSendCommand在驱动中不能用啊!你调用它,其实连接的是指向User模式下的地址,即一般<2G,驱动都是在>2G空间的,调用它绝对要报销,奇怪,你的居然是死机,不出兰屏吗? 确实不是蓝屏,只是死机 那请问有什么别的方法吗?除了PC喇叭 |
|
13楼#
发布于:2005-05-01 16:56
[quote]sndPlaySound和mciSendCommand在驱动中不能用啊!你调用它,其实连接的是指向User模式下的地址,即一般<2G,驱动都是在>2G空间的,调用它绝对要报销,奇怪,你的居然是死机,不出兰屏吗? 确实不是蓝屏,只是死机 那请问有什么别的方法吗?除了PC喇叭 [/quote] 偶黔驴技穷了,看wowocock的ring0 call ring3吧,而且在User mode下的SEH处理上好像也用了某种方法,使核心可以调用用户提供的回调函数后再返回核心,具体正在研究中 |
|
|
14楼#
发布于:2005-05-02 09:23
偶黔驴技穷了,看wowocock的ring0 call ring3吧,而且在User mode下的SEH处理上好像也用了某种方法,使核心可以调用用户提供的回调函数后再返回核心,具体正在研究中 正在研究那篇文章…… 可不可以通过与声卡驱动程序的通信来实现呀? 就相当于自己实现API一样,只不过是用驱动与驱动通信,声卡驱动有没有提供这方面的接口?我找过一段时间,只是无从下手,就没有见过声卡驱动的源码,只是个想法,也不知道可不可行 |
|
15楼#
发布于:2005-05-03 12:26
[quote]偶黔驴技穷了,看wowocock的ring0 call ring3吧,而且在User mode下的SEH处理上好像也用了某种方法,使核心可以调用用户提供的回调函数后再返回核心,具体正在研究中 正在研究那篇文章…… 可不可以通过与声卡驱动程序的通信来实现呀? 就相当于自己实现API一样,只不过是用驱动与驱动通信,声卡驱动有没有提供这方面的接口?我找过一段时间,只是无从下手,就没有见过声卡驱动的源码,只是个想法,也不知道可不可行 [/quote] 声卡驱动DDK例子中就有,好像得涉及到Stream,这样估计可以,因为wav就是流数据,搞出来告诉偶一声 |
|
|
16楼#
发布于:2005-05-07 13:36
声卡驱动DDK例子中就有,好像得涉及到Stream,这样估计可以,因为wav就是流数据,搞出来告诉偶一声 大佬,偶还没有搞出来呀,偶基础太弱了,研究了几天,没有结果,但偶没想放弃,只是想找一些志同道合的人一起研究一下,我不知道如何与声卡驱动通讯,Irp吗?那需要哪些参数,我目前用的是:先通过IoGetDeviceObjectPointer(……)得到设备名柄,再通过发送Irp包与声卡驱动通讯,但是我不知道接口是什么,Irp的MajorFunction()是什么?IRP_MJ_INTERNAL_DEVICE_CONTROL还是IRP_MJ_WRITE? 希望哪位大侠指点一二,感激涕零,感谢感谢,真心感谢 |
|
17楼#
发布于:2005-05-08 17:27
[quote]声卡驱动DDK例子中就有,好像得涉及到Stream,这样估计可以,因为wav就是流数据,搞出来告诉偶一声 大佬,偶还没有搞出来呀,偶基础太弱了,研究了几天,没有结果,但偶没想放弃,只是想找一些志同道合的人一起研究一下,我不知道如何与声卡驱动通讯,Irp吗?那需要哪些参数,我目前用的是:先通过IoGetDeviceObjectPointer(……)得到设备名柄,再通过发送Irp包与声卡驱动通讯,但是我不知道接口是什么,Irp的MajorFunction()是什么?IRP_MJ_INTERNAL_DEVICE_CONTROL还是IRP_MJ_WRITE? 希望哪位大侠指点一二,感激涕零,感谢感谢,真心感谢 [/quote] 与驱动通讯,就是用IoGetDeviceObjectPointer,至于Irp的MajorFunction()是什么?IRP_MJ_INTERNAL_DEVICE_CONTROL还是IRP_MJ_WRITE?不知老大DDK中声卡驱动的源码研究得怎样,估计研究到家就可以了,偶偷懒,坐等,嘻嘻... |
|
|