emugine
驱动牛犊
驱动牛犊
  • 注册日期2002-03-05
  • 最后登录2006-03-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3454回复:8

求教HalMakeBeep如何用,有分相送。

楼主#
更多 发布于:2004-11-19 15:17
ntddk.h里是这么定义的:
//
// System beep functions.
//
#if !defined(NO_LEGACY_DRIVERS)
NTHALAPI
BOOLEAN
HalMakeBeep(
    IN ULONG Frequency
    );
#endif // NO_LEGACY_DRIVERS
不知道这个HalMakeBeep怎么用,属于undocument的函数.我的开发环境是XPDDK,写的是WDM的driver.
你有好的想法吗? 来,我们一起驱动它!
sean198148
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2014-10-08
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望26点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-19 15:50
去看undocumented windows 2000 secret 的p403-p404.
sean198148
驱动牛犊
驱动牛犊
  • 注册日期2003-01-22
  • 最后登录2014-10-08
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望26点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-19 15:50
去看undocumented windows 2000 secrets 的p403-p404.
emugine
驱动牛犊
驱动牛犊
  • 注册日期2002-03-05
  • 最后登录2006-03-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-19 17:28
感谢并给分。

正在下载那书....
你有好的想法吗? 来,我们一起驱动它!
tigerL
驱动小牛
驱动小牛
  • 注册日期2003-12-24
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-19 19:41
http://www.driverdevelop.com/forum/viewthread.php?tid=28137
省元坊
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
5楼#
发布于:2004-11-20 02:21
HalMakeBeep没信心 !!
这又如何??

#include "ntddbeep.h"

void NTBeep()
{

BEEP_SET_PARAMETERS par;
NTSTATUS status;
IO_STATUS_BLOCK iosb;
UNICODE_STRING beepDev;
OBJECT_ATTRIBUTES objAttrib;
HANDLE bfile;

par.Frequency = 800;
par.Duration = 100;

    
    RtlInitUnicodeString(&beepDev, DD_BEEP_DEVICE_NAME_U);
    InitializeObjectAttributes(&objAttrib,
     &beepDev,
OBJ_CASE_INSENSITIVE,
                               NULL,
                               NULL);


    status = ZwCreateFile(&bfile, GENERIC_WRITE, &objAttrib, &iosb,
                          NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE,
                          FILE_OPEN, 0, NULL, 0);


    status = ZwDeviceIoControlFile(bfile, 0, 0, 0, &iosb,
                                   IOCTL_BEEP_SET, &par, sizeof par,
                                   0, 0);
if (status == STATUS_PENDING)
    status = iosb.Status;
    DbgPrint("NTBeep success !  \n");

}
emugine
驱动牛犊
驱动牛犊
  • 注册日期2002-03-05
  • 最后登录2006-03-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-23 10:05
HalMakeBeep没信心 !!
这又如何??

#include "ntddbeep.h"

void NTBeep()
{

BEEP_SET_PARAMETERS par;
NTSTATUS status;
IO_STATUS_BLOCK iosb;
UNICODE_STRING beepDev;
OBJECT_ATTRIBUTES objAttrib;
HANDLE bfile;

par.Frequency = 800;
par.Duration = 100;

    
    RtlInitUnicodeString(&beepDev, DD_BEEP_DEVICE_NAME_U);
    InitializeObjectAttributes(&objAttrib,
     &beepDev,
OBJ_CASE_INSENSITIVE,
                               NULL,
                               NULL);


    status = ZwCreateFile(&bfile, GENERIC_WRITE, &objAttrib, &iosb,
                          NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE,
                          FILE_OPEN, 0, NULL, 0);


    status = ZwDeviceIoControlFile(bfile, 0, 0, 0, &iosb,
                                   IOCTL_BEEP_SET, &par, sizeof par,
                                   0, 0);
if (status == STATUS_PENDING)
    status = iosb.Status;
    DbgPrint("NTBeep success !  n");

}


感激至死....

昨天我研究了一下,哥们出的招很到位,一直只是认为小小的BEEP函数到了driver里面还要如此费劲才能搞定有点不值当,但用户逼得紧迫来不及等待了, 我发现这个
 status = ZwDeviceIoControlFile(bfile, 0, 0, 0, &iosb,IOCTL_BEEP_SET, &par, sizeof par,0, 0);
无法找到声明,后来我用了Walter Oney Chapter 5
The I/O Request Packet里的Summary―Eight IRP-Handling Scenarios第6个场景Scenario 6―Your Own Synchronous IRP

SOMETYPE SomeFunction(PDEVICE_EXTENSION pdx,
  PDEVICE_OBJECT DeviceObject)
  {
  NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock,
    (PVOID) 42);
  if (!NT_SUCCESS(status))
    return <status>;
  PIRP Irp;
  Irp = IoBuildAsynchronousFsdRequest(IRP_MJ_XXX, DeviceObject,
    ...);
    -or-
  Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
  PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);
  stack->MajorFunction = IRP_MJ_XXX;
  <additional initialization)
  IoSetCompletionRoutine[Ex]([pdx->DeviceObject,] Irp,
    (PIO_COMPLETION_ROUTINE) CompletionRoutine, pdx,
    TRUE, TRUE, TRUE);
  ObReferenceObject(DeviceObject);
  IoCallDriver(DeviceObject, Irp);
  ObDereferenceObject(DeviceObject);
  }

NTSTATUS CompletionRoutine(PDEVICE_OBJECT junk, PIRP Irp,
  PDEVICE_EXTENSION pdx)
  {
  <IRP cleanup -- see below>
  IoFreeIrp(Irp);
  IoReleaseRemoveLock(&pdx->RemoveLock, (PVOID) 42);
  return STATUS_MORE_PROCESSING_REQUIRED;
  }

只可惜我电脑的speaker有problem,但没有BSOD过,我想问题应该不大,等用户试了再说.

大虾不愧是月专家分TOP10,表示感谢.





你有好的想法吗? 来,我们一起驱动它!
emugine
驱动牛犊
驱动牛犊
  • 注册日期2002-03-05
  • 最后登录2006-03-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-26 16:33
只可惜我电脑的speaker有problem,但没有BSOD过,我想问题应该不大,等用户试了再说.


本周三去用户处测试,BEEP真是满天飞.

对KMK专家再表感谢!
你有好的想法吗? 来,我们一起驱动它!
jiyu75
禁止发言
禁止发言
  • 注册日期2002-12-17
  • 最后登录2018-07-10
  • 粉丝0
  • 关注1
  • 积分-388分
  • 威望1181点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2015-10-20 15:35
用户被禁言,该主题自动屏蔽!
游客

返回顶部