From: Vibhav Pant vibhavp@gmail.com
--- dlls/winebth.sys/winebth.c | 62 ++++++++++++++++++++++++++++++++++++++ include/bthioctl.h | 7 +++++ 2 files changed, 69 insertions(+)
diff --git a/dlls/winebth.sys/winebth.c b/dlls/winebth.sys/winebth.c index 43631e02967..5d1f128c491 100644 --- a/dlls/winebth.sys/winebth.c +++ b/dlls/winebth.sys/winebth.c @@ -148,6 +148,68 @@ static NTSTATUS WINAPI dispatch_bluetooth( DEVICE_OBJECT *device, IRP *irp ) status = STATUS_SUCCESS; break; } + case IOCTL_BTH_GET_DEVICE_INFO: + { + BTH_DEVICE_INFO_LIST *list = irp->AssociatedIrp.SystemBuffer; + struct bluetooth_remote_device *device; + SIZE_T rem_devices; + + FIXME("IOCTL_BTH_GET_DEVICE_INFO: semi-stub!\n"); + + if (!list) + { + status = STATUS_INVALID_PARAMETER; + break; + } + if (outsize < sizeof( *list )) + { + status = STATUS_INVALID_BUFFER_SIZE; + break; + } + + rem_devices = (outsize - sizeof( *list ))/sizeof(BTH_DEVICE_INFO) + 1; + status = STATUS_SUCCESS; + irp->IoStatus.Information = 0; + + EnterCriticalSection( &ext->remote_devices_cs ); + LIST_FOR_EACH_ENTRY( device, &ext->remote_devices, struct bluetooth_remote_device, entry ) + { + list->numOfDevices++; + if (rem_devices > 0) + { + BTH_DEVICE_INFO *info; + + info = &list->deviceList[list->numOfDevices - 1]; + memset( info, 0, sizeof( *info ) ); + + EnterCriticalSection( &device->props_cs ); + if (device->props_mask & WINEBLUETOOTH_DEVICE_PROPERTY_NAME) + { + info->flags |= BDIF_NAME; + memcpy( info->name, device->props.name, sizeof( info->name ) ); + } + if (device->props_mask & WINEBLUETOOTH_DEVICE_PROPERTY_ADDRESS) + { + info->flags |= BDIF_ADDRESS; + info->address = RtlUlonglongByteSwap( device->props.address.ullLong ); + } + LeaveCriticalSection( &device->props_cs ); + + irp->IoStatus.Information += sizeof( *info ); + rem_devices--; + } + } + LeaveCriticalSection( &ext->remote_devices_cs ); + + irp->IoStatus.Information += sizeof( *list ); + if (list->numOfDevices) + irp->IoStatus.Information -= sizeof( BTH_DEVICE_INFO ); + + /* The output buffer needs to be exactly sized. */ + if (rem_devices) + status = STATUS_INVALID_BUFFER_SIZE; + break; + } case IOCTL_WINEBTH_RADIO_SET_FLAG: { const struct winebth_radio_set_flag_params *params = irp->AssociatedIrp.SystemBuffer; diff --git a/include/bthioctl.h b/include/bthioctl.h index a822c054f6c..56a665e9f41 100644 --- a/include/bthioctl.h +++ b/include/bthioctl.h @@ -23,6 +23,7 @@ #define __BTHIOCTL_H__
#define IOCTL_BTH_GET_LOCAL_INFO CTL_CODE(FILE_DEVICE_BLUETOOTH, 0x00, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_BTH_GET_DEVICE_INFO CTL_CODE(FILE_DEVICE_BLUETOOTH, 0x02, METHOD_BUFFERED, FILE_ANY_ACCESS)
#include <pshpack1.h>
@@ -43,6 +44,12 @@ typedef struct _BTH_LOCAL_RADIO_INFO BTH_RADIO_INFO radioInfo; } BTH_LOCAL_RADIO_INFO, *PBTH_LOCAL_RADIO_INFO;
+typedef struct _BTH_DEVICE_INFO_LIST +{ + ULONG numOfDevices; + BTH_DEVICE_INFO deviceList[1]; +} BTH_DEVICE_INFO_LIST, *PBTH_DEVICE_INFO_LIST; + #include <poppack.h>
#endif /* __BTHIOCTL_H__ */