从Virtual Audio Driver将音频数据发送到用户模式应用程序

时间:2012-01-20 09:34:29

标签: c++ windows virtual device-driver wdm

我目前的任务是将音频数据从虚拟音频驱动程序发送到用户模式应用程序。

首先,我需要从用户模式应用程序创建该虚拟音频驱动程序的实例...

请参阅下面的代码段

//Generating the device info
//That works
SetupDiGetClassDevs( &KSCATEGORY_AUDIO, NULL, NULL,  DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );

//Enumerating device interface
//That works
SetupDiEnumDeviceInterfaces(dev_info, &DeviceInfoData, &KSCATEGORY_AUDIO, i, &did);

//Getting the path to device (pdd)
//That works
bRes = SetupDiGetDeviceInterfaceDetail(dev_info, &did, pdd, required_size, NULL, NULL);

//Handle to the device
//That works
HANDLE hHandle = CreateFile( pdd->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, NULL);

//Passing the Handle
//That fails
//PData is the Out buffer where we get the driver sending value
bool bRc = DeviceIoControl ( hHandle,
                         (DWORD)IOCTL_SIOCTL_METHOD_OUT_DIRECT,  NULL, 0, &PData,
               sizeof( PData), &bytesReturned, NULL );

你能指出原因吗?

对于上述用户模式应用程序,我曾经写过一段IOCTL代码,如下所示......

NTSTATUS IoCtlHandler(PDEVICE_OBJECT pDeviceObject, PIRP Irp)
{
    PAGED_CODE();
    UINT dwDataSize = 0;
    PBYTE pReturnData ;

       pReturnData = (PBYTE)"IOCTL - Direct In I/O From Kernel Welcome to the world of   Portcl";
    dwDataSize = sizeof("IOCTL - Direct In I/O From Kernel! Welcome to the world of Portcl");

    //Point to a certain IRP location
     pIoStackIrp = IoGetCurrentIrpStackLocation(Irp);

     if(pIoStackIrp) 
     {

         switch(pIoStackIrp->Parameters.DeviceIoControl.IoControlCode)
         {
        //that ioctl  i pass inside the DeviceIoControl function
               case IOCTL_SIOCTL_METHOD_OUT_DIRECT:
             {
                 pOutputBuffer = NULL;
                 NtStatus = STATUS_UNSUCCESSFUL;

                 if(Irp->MdlAddress)
                 {
                                   pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp-    >MdlAddress, NormalPagePriority);
                 }
                                                                                                          RtlCopyBytes(pOutputBuffer, pReturnData, dwDataSize);

                 break;
             }
         }
     }

     Irp->IoStatus.Information = dwDataSize;
     Irp->IoStatus.Status = NtStatus;

    //After all complete the IRP structure  
        //As it is a adapter driver we pass this information to handle by adapter itself
    NtStatus = PcDispatchIrp(pDeviceObject, Irp);

    return NtStatus;
}

请你指出我的错误。为了我的测试目的,我只是将一个字符串(IOCTL - 直接在I / O从内核欢迎使用到Portcl世界中)传递到输出缓冲区,稍后我会将其替换为音频数据...为什么deviceIoControl失败虽然我得到了字符串,无论我在驱动程序中传递了什么,但bytesReturn值总是作为随机值,bRes值始终为false ...

0 个答案:

没有答案