У меня есть текущая задача отправить аудиоданные из виртуального аудиодрайвера в приложение пользовательского режима.
Сначала мне нужно создать экземпляр этого виртуального звукового драйвера из приложения пользовательского режима ...
Пожалуйста, посмотрите фрагмент кода ниже
//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 - прямой ввод-вывод из ядра "Добро пожаловать в мир Portcl") в буфер вывода позже, я бы заменил ее на аудиоданные ... Почему не работает deviceIoControl, хотя я получаю строку, которую передаю в драйвере, но значение bytesReturn всегда приходит как случайное значение, а значение bRes всегда ложно ...