From: Vibhav Pant vibhavp@gmail.com
--- dlls/winebth.sys/winebth.c | 65 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+)
diff --git a/dlls/winebth.sys/winebth.c b/dlls/winebth.sys/winebth.c index 8447b2fc5df..061f9d36a53 100644 --- a/dlls/winebth.sys/winebth.c +++ b/dlls/winebth.sys/winebth.c @@ -87,10 +87,75 @@ static NTSTATUS WINAPI dispatch_bluetooth(DEVICE_OBJECT *device, IRP *irp ) { IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation( irp ); ULONG code = stack->Parameters.DeviceIoControl.IoControlCode; + ULONG insize = stack->Parameters.DeviceIoControl.InputBufferLength; + ULONG outsize = stack->Parameters.DeviceIoControl.OutputBufferLength; NTSTATUS status = irp->IoStatus.Status;
TRACE( "device %p irp %p code %s\n", device, irp, debugstr_IoControlCode( code ) );
+ switch (code) + { + case IOCTL_BTH_GET_LOCAL_INFO: + { + BTH_LOCAL_RADIO_INFO *info = (BTH_LOCAL_RADIO_INFO *)irp->AssociatedIrp.SystemBuffer; + BOOL boolean; + WCHAR name[BLUETOOTH_MAX_NAME_SIZE]; + + if (info == NULL) + { + status = STATUS_INVALID_PARAMETER; + break; + } + if (insize < sizeof(*info) || outsize < sizeof(*info)) + { + status = STATUS_BUFFER_TOO_SMALL; + break; + } + + memset( info, 0, sizeof( *info ) ); + status = + IoGetDevicePropertyData( device, &DEVPKEY_BluetoothRadio_Address, LOCALE_NEUTRAL, 0, + sizeof( UINT64 ), &info->localInfo.address, NULL, NULL ); + if (status == STATUS_SUCCESS) info->localInfo.flags |= BDIF_ADDRESS; + + status = IoGetDevicePropertyData( device, &DEVPKEY_WineBluetooth_Radio_Class, + LOCALE_NEUTRAL, 0, sizeof( UINT32 ), + &info->localInfo.classOfDevice, NULL, NULL ); + if (status == STATUS_SUCCESS) info->localInfo.flags |= BDIF_COD; + + status = IoGetDevicePropertyData( device, &DEVPKEY_Device_FriendlyName, LOCALE_NEUTRAL, + 0, sizeof( name ), &name, NULL, NULL ); + if (status == STATUS_SUCCESS) + { + size_t size = wcstombs( info->localInfo.name, name, sizeof( info->localInfo.name ) ); + if (size != -1) + { + info->localInfo.flags |= BDIF_NAME; + info->localInfo.name[size-1] = '\0'; + } + } + + status = + IoGetDevicePropertyData( device, &DEVPKEY_WineBluetooth_Radio_Connectable, + LOCALE_NEUTRAL, 0, sizeof( BOOL ), &boolean, NULL, NULL ); + if (status == STATUS_SUCCESS && boolean) info->flags |= LOCAL_RADIO_CONNECTABLE; + + status = + IoGetDevicePropertyData( device, &DEVPKEY_WineBluetooth_Radio_Discoverable, + LOCALE_NEUTRAL, 0, sizeof( BOOL ), &boolean, NULL, NULL ); + if (status == STATUS_SUCCESS && boolean) info->flags |= LOCAL_RADIO_DISCOVERABLE; + + IoGetDevicePropertyData( device, &DEVPKEY_BluetoothRadio_Manufacturer, LOCALE_NEUTRAL, + 0, sizeof( UINT16 ), &info->radioInfo.mfg, NULL, NULL ); + + status = STATUS_SUCCESS; + irp->IoStatus.Information = sizeof( *info ); + } + default: + break; + } + + irp->IoStatus.Status = status; IoCompleteRequest( irp, IO_NO_INCREMENT ); return status;