[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for XENIFACE IOCTLs
> -----Original Message----- > From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On > Behalf Of Marek Marczykowski-Górecki > Sent: 09 July 2018 11:22 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Rafal Wojdyla <omeg@xxxxxxxxxxxxxxxxxxxxxx>; Marek Marczykowski- > Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> > Subject: [win-pv-devel] [PATCH] Add a user mode library wrapper for XENIFACE > IOCTLs > > From: Rafal Wojdyla <omeg@xxxxxxxxxxxxxxxxxxxxxx> > > Signed-off-by: Rafal Wojdyla <omeg@xxxxxxxxxxxxxxxxxxxxxx> > [fix compile warnings, update visual studio files] > Signed-off-by: Marek Marczykowski-Górecki > <marmarek@xxxxxxxxxxxxxxxxxxxxxx> > --- > This was posted before here: > https://lists.xenproject.org/archives/html/win-pv-devel/2015- > 11/msg00014.html > > Back then I've raised a concern about code duplication caused by a > different API than libxc (having libxenvchan in mind). But two years > latter it looks like it isn't such a problem. libxenchan is the only > piece being effectively duplicated (at least in Qubes OS), and > everything else is really different anyway because of Linux/Windows > differences. So, I think it isn't an issue. > > Also I've renamed XcEvtchnBindUnbound to XcEvtchnOpenUnbound, as > requested in review back then. > > This has been tested with vs2017/WDK10 build for Windows 7 64bit, both > on Windows 7 and Windows 10. The patch assume "Add Windows 7 build > target" patches applied, but it should be easy to apply without them > too. > I've updated vs2015 files too, but don't have tools to test them (it > isn't possible to download free vs2015 anymore). > --- > include/xencontrol.h | 342 ++++++++++ > src/xencontrol/xencontrol.c | 919 > +++++++++++++++++++++++++++ > src/xencontrol/xencontrol.rc | 24 + > src/xencontrol/xencontrol_private.h | 49 ++ > vs2015/package/package.vcxproj | 3 + > vs2015/xencontrol/xencontrol.vcxproj | 67 ++ > vs2015/xencontrol/xencontrol.vcxproj.filters | 13 + > vs2015/xeniface.sln | 38 ++ > vs2017/package/package.vcxproj | 3 + > vs2017/xencontrol/xencontrol.vcxproj | 67 ++ > vs2017/xencontrol/xencontrol.vcxproj.filters | 13 + > vs2017/xeniface.sln | 38 ++ > 12 files changed, 1576 insertions(+) > create mode 100644 include/xencontrol.h > create mode 100644 src/xencontrol/xencontrol.c > create mode 100644 src/xencontrol/xencontrol.rc > create mode 100644 src/xencontrol/xencontrol_private.h > create mode 100644 vs2015/xencontrol/xencontrol.vcxproj > create mode 100644 vs2015/xencontrol/xencontrol.vcxproj.filters > create mode 100644 vs2017/xencontrol/xencontrol.vcxproj > create mode 100644 vs2017/xencontrol/xencontrol.vcxproj.filters [snip] > + > +DWORD > +XcOpen( > + IN XENCONTROL_LOGGER *Logger, > + OUT PXENCONTROL_CONTEXT *Xc > + ) > +{ > + HDEVINFO DevInfo; > + SP_DEVICE_INTERFACE_DATA InterfaceData; > + SP_DEVICE_INTERFACE_DETAIL_DATA *DetailData = NULL; > + DWORD BufferSize; > + PXENCONTROL_CONTEXT Context; > + > + Context = malloc(sizeof(*Context)); > + if (Context == NULL) > + return ERROR_NOT_ENOUGH_MEMORY; > + > + Context->Logger = Logger; > + Context->LogLevel = XLL_INFO; > + Context->RequestId = 1; > + InitializeListHead(&Context->RequestList); > + InitializeCriticalSection(&Context->RequestListLock); > + > + DevInfo = SetupDiGetClassDevs(&GUID_INTERFACE_XENIFACE, 0, NULL, > DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); > + if (DevInfo == INVALID_HANDLE_VALUE) { > + _Log(Logger, XLL_ERROR, Context->LogLevel, __FUNCTION__, > + L"XENIFACE device class doesn't exist"); > + goto fail; > + } > + > + InterfaceData.cbSize = sizeof(InterfaceData); > + if (!SetupDiEnumDeviceInterfaces(DevInfo, NULL, > &GUID_INTERFACE_XENIFACE, 0, &InterfaceData)) { > + _Log(Logger, XLL_ERROR, Context->LogLevel, __FUNCTION__, > + L"Failed to enumerate XENIFACE devices"); > + goto fail; > + } > + > + SetupDiGetDeviceInterfaceDetail(DevInfo, &InterfaceData, NULL, 0, > &BufferSize, NULL); > + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { > + _Log(Logger, XLL_ERROR, Context->LogLevel, __FUNCTION__, > + L"Failed to get buffer size for device details"); > + goto fail; > + } > + > + // Using 'BufferSize' from failed function call > +#pragma warning(suppress: 6102) > + DetailData = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(BufferSize); > + if (!DetailData) { > + SetLastError(ERROR_OUTOFMEMORY); > + goto fail; > + } > + > + DetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); > + > + if (!SetupDiGetDeviceInterfaceDetail(DevInfo, &InterfaceData, DetailData, > BufferSize, NULL, NULL)) { > + _Log(Logger, XLL_ERROR, Context->LogLevel, __FUNCTION__, > + L"Failed to get XENIFACE device path"); > + goto fail; > + } > + > + Context->XenIface = CreateFile(DetailData->DevicePath, > + FILE_GENERIC_READ | FILE_GENERIC_WRITE, > + 0, > + NULL, > + OPEN_EXISTING, > + FILE_ATTRIBUTE_NORMAL | > FILE_FLAG_OVERLAPPED, > + NULL); No FILE_SHARE_READ/WRITE options set, preventing creation of other handles to xeniface. This includes the xenagent service (if started after a XenControl user), so no power control, etc. Should it be possible for more than one program to use XenControl at the same time? Owen > + > + if (Context->XenIface == INVALID_HANDLE_VALUE) { > + _Log(Logger, XLL_ERROR, Context->LogLevel, __FUNCTION__, > + L"Failed to open XENIFACE device, path: %s", > DetailData->DevicePath); > + goto fail; > + } > + > + _Log(Logger, XLL_ERROR, Context->LogLevel, __FUNCTION__, > + L"XenIface handle: %p", Context->XenIface); > + > + free(DetailData); > + *Xc = Context; > + return ERROR_SUCCESS; > + > +fail: > + _Log(Logger, XLL_ERROR, Context->LogLevel, __FUNCTION__, > + L"Error: 0x%x", GetLastError()); > + > + free(DetailData); > + return GetLastError(); > +} > + > +void > +XcClose( > + IN PXENCONTROL_CONTEXT Xc > + ) > +{ > + CloseHandle(Xc->XenIface); > + DeleteCriticalSection(&Xc->RequestListLock); > + free(Xc); > +} > + [snip] > -- > 2.13.6 > > > _______________________________________________ > win-pv-devel mailing list > win-pv-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/win-pv-devel _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |