mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-26 07:17:23 +00:00
[common] ivshmem: switch to using vectors
This commit is contained in:
parent
7c7eff8dba
commit
e040b88bf0
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include "common/ivshmem.h"
|
#include "common/ivshmem.h"
|
||||||
#include "common/option.h"
|
#include "common/option.h"
|
||||||
|
#include "common/vector.h"
|
||||||
#include "common/windebug.h"
|
#include "common/windebug.h"
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
@ -78,34 +79,21 @@ bool ivshmemInit(struct IVSHMEM * dev)
|
|||||||
PSP_DEVICE_INTERFACE_DETAIL_DATA infData = NULL;
|
PSP_DEVICE_INTERFACE_DETAIL_DATA infData = NULL;
|
||||||
SP_DEVINFO_DATA devInfoData = {0};
|
SP_DEVINFO_DATA devInfoData = {0};
|
||||||
SP_DEVICE_INTERFACE_DATA devInterfaceData = {0};
|
SP_DEVICE_INTERFACE_DATA devInterfaceData = {0};
|
||||||
int deviceAllocated = 1;
|
|
||||||
int deviceCount = 0;
|
|
||||||
struct IVSHMEMData * devices = malloc(sizeof(*devices) * deviceAllocated);
|
|
||||||
|
|
||||||
devInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_IVSHMEM, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
devInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_IVSHMEM, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||||
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||||
devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
||||||
|
|
||||||
|
Vector * devices = vector_create(sizeof(struct IVSHMEMData), 1);
|
||||||
if (!devices)
|
if (!devices)
|
||||||
{
|
{
|
||||||
DEBUG_ERROR("Failed to allocate memory");
|
DEBUG_ERROR("Failed to allocate memory");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; SetupDiEnumDeviceInfo(devInfoSet, deviceCount, &devInfoData); ++deviceCount)
|
for (int i = 0; SetupDiEnumDeviceInfo(devInfoSet, i, &devInfoData); ++i)
|
||||||
{
|
{
|
||||||
if (deviceCount >= deviceAllocated)
|
struct IVSHMEMData * device = vector_push(devices, NULL);
|
||||||
{
|
|
||||||
int newCount = deviceAllocated * 2;
|
|
||||||
struct IVSHMEMData * new = realloc(devices, newCount * sizeof(*new));
|
|
||||||
if (!new)
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("Failed to allocate memory");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
deviceAllocated = newCount;
|
|
||||||
devices = new;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD bus, addr;
|
DWORD bus, addr;
|
||||||
if (!SetupDiGetDeviceRegistryProperty(devInfoSet, &devInfoData, SPDRP_BUSNUMBER,
|
if (!SetupDiGetDeviceRegistryProperty(devInfoSet, &devInfoData, SPDRP_BUSNUMBER,
|
||||||
@ -122,8 +110,8 @@ bool ivshmemInit(struct IVSHMEM * dev)
|
|||||||
addr = 0xFFFFFFFF;
|
addr = 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
devices[deviceCount].busAddr = (((DWORD64) bus) << 32) | addr;
|
device->busAddr = (((DWORD64) bus) << 32) | addr;
|
||||||
memcpy(&devices[deviceCount].devInfoData, &devInfoData, sizeof(SP_DEVINFO_DATA));
|
memcpy(&device->devInfoData, &devInfoData, sizeof(SP_DEVINFO_DATA));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetLastError() != ERROR_NO_MORE_ITEMS)
|
if (GetLastError() != ERROR_NO_MORE_ITEMS)
|
||||||
@ -133,18 +121,20 @@ bool ivshmemInit(struct IVSHMEM * dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int shmDevice = option_get_int("os", "shmDevice");
|
const int shmDevice = option_get_int("os", "shmDevice");
|
||||||
qsort(devices, deviceCount, sizeof(*devices), ivshmemComparator);
|
qsort(vector_data(devices), vector_size(devices), sizeof(struct IVSHMEMData), ivshmemComparator);
|
||||||
|
|
||||||
for (int i = 0; i < deviceCount; ++i)
|
struct IVSHMEMData * device;
|
||||||
|
vector_forEachRefIdx(i, device, devices)
|
||||||
{
|
{
|
||||||
DWORD bus = devices[i].busAddr >> 32;
|
DWORD bus = device->busAddr >> 32;
|
||||||
DWORD addr = devices[i].busAddr & 0xFFFFFFFF;
|
DWORD addr = device->busAddr & 0xFFFFFFFF;
|
||||||
DEBUG_INFO("IVSHMEM %d%c on bus 0x%lx, device 0x%lx, function 0x%lx", i,
|
DEBUG_INFO("IVSHMEM %" PRIuPTR "%c on bus 0x%lx, device 0x%lx, function 0x%lx", i,
|
||||||
i == shmDevice ? '*' : ' ', bus, addr >> 16, addr & 0xFFFF);
|
i == shmDevice ? '*' : ' ', bus, addr >> 16, addr & 0xFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&devInfoData, &devices[shmDevice].devInfoData, sizeof(SP_DEVINFO_DATA));
|
device = vector_ptrTo(devices, shmDevice);
|
||||||
free(devices);
|
memcpy(&devInfoData, &device->devInfoData, sizeof(SP_DEVINFO_DATA));
|
||||||
|
vector_free(devices);
|
||||||
|
|
||||||
if (SetupDiEnumDeviceInterfaces(devInfoSet, &devInfoData, &GUID_DEVINTERFACE_IVSHMEM, 0, &devInterfaceData) == FALSE)
|
if (SetupDiEnumDeviceInterfaces(devInfoSet, &devInfoData, &GUID_DEVINTERFACE_IVSHMEM, 0, &devInterfaceData) == FALSE)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user