[c-host] initial ivshmem code and platform specific init

This commit is contained in:
Geoffrey McRae 2019-02-28 19:20:35 +11:00
parent f9020659e6
commit 6950379d94
7 changed files with 170 additions and 4 deletions

View File

@ -7,12 +7,15 @@ CFLAGS += -g -O0
CFLAGS += -I. CFLAGS += -I.
CFLAGS += -I../common CFLAGS += -I../common
OBJS = main.o OBJS = app.o
# if windows # if windows
ifdef OS ifdef OS
LDFLAGS = -L./dll LDFLAGS = -L./dll
OBJS += windebug.o LIBS += -lsetupapi
OBJS += windows/platform.o
OBJS += windows/windebug.o
CFLAGS += -I../vendor/kvm-guest-drivers-windows
ifeq ($(USE_DXGI), 1) ifeq ($(USE_DXGI), 1)
CFLAGS += -DUSE_DXGI -DCOBJMACROS -DINITGUID CFLAGS += -DUSE_DXGI -DCOBJMACROS -DINITGUID

View File

@ -17,13 +17,25 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "app.h"
#include <stdio.h> #include <stdio.h>
#include <windows.h> #include <windows.h>
#include "debug.h" #include "debug.h"
#include "capture/interfaces.h" #include "capture/interfaces.h"
int WINAPI WinMain(HINSTANCE hInstnace, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) int app_main()
{ {
unsigned int shmemSize = os_shmemSize();
void * shmemMap = NULL;
DEBUG_INFO("IVSHMEM Size : %u MiB", shmemSize / 1048576);
if (!os_shmemMmap(&shmemMap) || !shmemMap)
{
DEBUG_ERROR("Failed to map the shared memory");
return -1;
}
struct CaptureInterface * iface = NULL; struct CaptureInterface * iface = NULL;
for(int i = 0; CaptureInterfaces[i]; ++i) for(int i = 0; CaptureInterfaces[i]; ++i)
{ {

30
c-host/app.h Normal file
View File

@ -0,0 +1,30 @@
/*
Looking Glass - KVM FrameRelay (KVMFR) Client
Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
https://looking-glass.hostfission.com
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#include <stdbool.h>
int app_main();
// these must be implemented for each OS
unsigned int os_shmemSize();
bool os_shmemMmap(void **ptr);
void os_shmemUnmap();

View File

@ -19,7 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
#include "interface.h" #include "interface.h"
#include "debug.h" #include "debug.h"
#include "windebug.h" #include "windows/windebug.h"
#include <assert.h> #include <assert.h>
#include <dxgi.h> #include <dxgi.h>

121
c-host/windows/platform.c Normal file
View File

@ -0,0 +1,121 @@
/*
Looking Glass - KVM FrameRelay (KVMFR) Client
Copyright (C) 2017-2019 Geoffrey McRae <geoff@hostfission.com>
https://looking-glass.hostfission.com
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <windows.h>
#include <setupapi.h>
#include "app.h"
#include "debug.h"
#include "windebug.h"
#include "ivshmem/Public.h"
static HANDLE shmemHandle = INVALID_HANDLE_VALUE;
int WINAPI WinMain(HINSTANCE hInstnace, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HDEVINFO deviceInfoSet;
PSP_DEVICE_INTERFACE_DETAIL_DATA infData = NULL;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
deviceInfoSet = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE);
memset(&deviceInterfaceData, 0, sizeof(SP_DEVICE_INTERFACE_DATA));
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
if (SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &GUID_DEVINTERFACE_IVSHMEM, 0, &deviceInterfaceData) == FALSE)
{
DWORD error = GetLastError();
if (error == ERROR_NO_MORE_ITEMS)
{
DEBUG_WINERROR("Unable to enumerate the device, is it attached?", error);
return -1;
}
DEBUG_WINERROR("SetupDiEnumDeviceInterfaces failed", error);
return -1;
}
DWORD reqSize = 0;
SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &reqSize, NULL);
if (!reqSize)
{
DEBUG_WINERROR("SetupDiGetDeviceInterfaceDetail", GetLastError());
return -1;
}
infData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)calloc(reqSize, 1);
infData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, infData, reqSize, NULL, NULL))
{
free(infData);
DEBUG_WINERROR("SetupDiGetDeviceInterfaceDetail", GetLastError());
return -1;
}
shmemHandle = CreateFile(infData->DevicePath, 0, 0, NULL, OPEN_EXISTING, 0, 0);
if (shmemHandle == INVALID_HANDLE_VALUE)
{
SetupDiDestroyDeviceInfoList(deviceInfoSet);
free(infData);
DEBUG_WINERROR("CreateFile returned INVALID_HANDLE_VALUE", GetLastError());
return -1;
}
free(infData);
SetupDiDestroyDeviceInfoList(deviceInfoSet);
int result = app_main();
CloseHandle(shmemHandle);
return result;
}
unsigned int os_shmemSize()
{
IVSHMEM_SIZE size;
if (!DeviceIoControl(shmemHandle, IOCTL_IVSHMEM_REQUEST_SIZE, NULL, 0, &size, sizeof(IVSHMEM_SIZE), NULL, NULL))
{
DEBUG_WINERROR("DeviceIoControl Failed", GetLastError());
return 0;
}
return (unsigned int)size;
}
bool os_shmemMmap(void **ptr)
{
IVSHMEM_MMAP map = {0};
if (!DeviceIoControl(
shmemHandle,
IOCTL_IVSHMEM_REQUEST_MMAP,
NULL, 0,
&map, sizeof(IVSHMEM_MMAP),
NULL, NULL))
{
DEBUG_WINERROR("DeviceIoControl Failed", GetLastError());
return false;
}
*ptr = map.ptr;
return true;
}
void os_shmemUnmap()
{
}