diff --git a/meshconsole/MeshConsole.vcxproj b/meshconsole/MeshConsole.vcxproj
index 630ca50..c094136 100644
--- a/meshconsole/MeshConsole.vcxproj
+++ b/meshconsole/MeshConsole.vcxproj
@@ -510,7 +510,7 @@
Async
- SetupAPI.lib;Crypt32.lib;Ncrypt.lib;DbgHelp.lib;Gdiplus.lib;Iphlpapi.lib;ws2_32.lib;..\openssl\libstatic\libcrypto64MTd.lib;..\openssl\libstatic\libssl64MTd.lib;%(AdditionalDependencies)
+ SetupAPI.lib;Crypt32.lib;Ncrypt.lib;DbgHelp.lib;Gdiplus.lib;Iphlpapi.lib;ws2_32.lib;..\openssl\libstatic\libcrypto64MTd.lib;..\openssl\libstatic\libssl64MTd.lib;dxguid.lib;dxgi.lib;D3d11.lib;%(AdditionalDependencies)
$(OutDir)$(TargetName)$(TargetExt)
/ignore:4099 %(AdditionalOptions)
diff --git a/meshcore/KVM/Windows/kvm.c b/meshcore/KVM/Windows/kvm.c
index f707a95..55bbdd1 100644
--- a/meshcore/KVM/Windows/kvm.c
+++ b/meshcore/KVM/Windows/kvm.c
@@ -1225,178 +1225,184 @@ void kvm_cleanup()
// D3D_FEATURE_LEVEL *pFeatureLevel,
// ID3D11DeviceContext **ppImmediateContext
// );
+// UINT(*D3D11CalcSubresource)(
+// UINT MipSlice,
+// UINT ArraySlice,
+// UINT MipLevels
+// );
//}D3D11_Functions;
-
-
+//
+//
//void DD_Init()
//{
- //int i;
- //HRESULT hr;
- //ID3D11Device* m_Device;
- //ID3D11DeviceContext* m_DeviceContext;
- //IDXGIFactory2* m_Factory;
- //DWORD m_OcclusionCookie;
- //DXGI_OUTDUPL_DESC lOutputDuplDesc;
- //ID3D11Texture2D *lGDIImage;
- //ID3D11Texture2D *desktopImage;
- //ID3D11Texture2D *destinationImage;
-
- //DXGI_OUTDUPL_FRAME_INFO lFrameInfo;
- //IDXGIResource *lDesktopResource;
-
- //D3D11_Functions funcs;
-
- //HMODULE _D3D = NULL;
- //if ((_D3D = LoadLibraryExA((LPCSTR)"D3D11.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32)) != NULL)
- //{
- // (FARPROC)funcs.D3D11CreateDevice = GetProcAddress(_D3D, "D3D11CreateDevice");
- //}
-
- //D3D_DRIVER_TYPE DriverTypes[] =
- //{
- // D3D_DRIVER_TYPE_HARDWARE,
- // D3D_DRIVER_TYPE_WARP,
- // D3D_DRIVER_TYPE_REFERENCE,
- //};
- //UINT NumDriverTypes = ARRAYSIZE(DriverTypes);
-
- //// Feature levels supported
- //D3D_FEATURE_LEVEL FeatureLevels[] =
- //{
- // D3D_FEATURE_LEVEL_11_0,
- // D3D_FEATURE_LEVEL_10_1,
- // D3D_FEATURE_LEVEL_10_0,
- // D3D_FEATURE_LEVEL_9_1
- //};
- //UINT NumFeatureLevels = ARRAYSIZE(FeatureLevels);
- //D3D_FEATURE_LEVEL FeatureLevel;
-
- //// Create device
- //for (UINT DriverTypeIndex = 0; DriverTypeIndex < NumDriverTypes; ++DriverTypeIndex)
- //{
- // hr = funcs.D3D11CreateDevice(NULL, DriverTypes[DriverTypeIndex], NULL, 0, FeatureLevels, NumFeatureLevels, D3D11_SDK_VERSION, &m_Device, &FeatureLevel, &m_DeviceContext);
- // if (SUCCEEDED(hr))
- // {
- // // Device creation succeeded, no need to loop anymore
- // break;
- // }
- //}
- //if (FAILED(hr))
- //{
- // DebugBreak();
- //}
-
- //// Get DXGI factory
- //IDXGIDevice* DxgiDevice = NULL;
- //hr = m_Device->lpVtbl->QueryInterface(m_Device, &IID_IDXGIDevice, (void**)&DxgiDevice);
- //if (FAILED(hr))
- //{
- // DebugBreak();
- //}
-
- //IDXGIAdapter* DxgiAdapter = NULL;
- //hr = DxgiDevice->lpVtbl->GetParent(DxgiDevice, &IID_IDXGIAdapter, (void**)&DxgiAdapter);
- //DxgiDevice->lpVtbl->Release(DxgiDevice);
- //DxgiDevice = NULL;
- //if (FAILED(hr))
- //{
- // DebugBreak();
- //}
-
- //hr = DxgiAdapter->lpVtbl->GetParent(DxgiAdapter, &IID_IDXGIFactory2, (void**)&m_Factory);
- //DxgiAdapter->lpVtbl->Release(DxgiAdapter);
- //DxgiAdapter = NULL;
- //if (FAILED(hr))
- //{
- // DebugBreak();
- // //return ProcessFailure(m_Device, L"Failed to get parent DXGI Factory", L"Error", hr, SystemTransitionsExpectedErrors);
- //}
-
- //IDXGIOutput1 *DxgiOutput1;
- //hr = m_Device->lpVtbl->QueryInterface(m_Device, &IID_IDXGIOutput, (void**)&DxgiOutput1);
- //if (FAILED(hr))
- //{
- // DebugBreak();
- //}
-
- //IDXGIOutputDuplication *dupl = NULL;
- //DxgiOutput1->lpVtbl->DuplicateOutput(DxgiOutput1, m_Device, &dupl);
-
- //// Create GUI drawing texture
- //dupl->lpVtbl->GetDesc(dupl, &lOutputDuplDesc);
-
- //D3D11_TEXTURE2D_DESC desc;
- //desc.Width = lOutputDuplDesc.ModeDesc.Width;
- //desc.Height = lOutputDuplDesc.ModeDesc.Height;
- //desc.Format = lOutputDuplDesc.ModeDesc.Format;
- //desc.ArraySize = 1;
- //desc.BindFlags = D3D11_BIND_RENDER_TARGET;
- //desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
- //desc.SampleDesc.Count = 1;
- //desc.SampleDesc.Quality = 0;
- //desc.MipLevels = 1;
- //desc.CPUAccessFlags = 0;
- //desc.Usage = D3D11_USAGE_DEFAULT;
-
- //hr = m_Device->lpVtbl->CreateTexture2D(m_Device, &desc, NULL, &lGDIImage);
- //hr = m_Device->lpVtbl->CreateTexture2D(m_Device, &desc, NULL, &destinationImage);
-
- //if (FAILED(hr))
- //{
- // DebugBreak();
- //}
-
- //// Get new frame
- //for (i = 0; i < 5; ++i)
- //{
- // hr = dupl->lpVtbl->AcquireNextFrame(dupl, 250, &lFrameInfo, &lDesktopResource);
- // if (hr != DXGI_ERROR_WAIT_TIMEOUT) { break; }
- // Sleep(100);
- //}
- //
- //hr = lDesktopResource->lpVtbl->QueryInterface(lDesktopResource, &IID_ID3D11Texture2D, &desktopImage);
-
- //// Copy image into GDI drawing texture
- //m_DeviceContext->lpVtbl->CopyResource(m_DeviceContext, lGDIImage, desktopImage);
-
- //// Draw cursor image into GDI drawing texture
- //IDXGISurface1 *surface;
- //hr = lGDIImage->lpVtbl->QueryInterface(lGDIImage, &IID_IDXGISurface1, &surface);
-
-
- //// Copy from CPU access texture to bitmap buffer
-
- //D3D11_MAPPED_SUBRESOURCE resource;
- //UINT subresource = D3D11CalcSubresource(0, 0, 0);
- //m_DeviceContext->lpVtbl->Map(m_DeviceContext, destinationImage, subresource, D3D11_MAP_READ_WRITE, 0, &resource);
-
- //BITMAPINFO lBmpInfo;
-
- //// BMP 32 bpp
-
- //ZeroMemory(&lBmpInfo, sizeof(BITMAPINFO));
- //lBmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- //lBmpInfo.bmiHeader.biBitCount = 32;
- //lBmpInfo.bmiHeader.biCompression = BI_RGB;
- //lBmpInfo.bmiHeader.biWidth = lOutputDuplDesc.ModeDesc.Width;
- //lBmpInfo.bmiHeader.biHeight = lOutputDuplDesc.ModeDesc.Height;
- //lBmpInfo.bmiHeader.biPlanes = 1;
- //lBmpInfo.bmiHeader.biSizeImage = lOutputDuplDesc.ModeDesc.Width * lOutputDuplDesc.ModeDesc.Height * 4;
-
-
- //BYTE* pBuf = (BYTE*)ILibMemory_SmartAllocate(lBmpInfo.bmiHeader.biSizeImage);
- //UINT lBmpRowPitch = lOutputDuplDesc.ModeDesc.Width * 4;
- //BYTE* sptr = (BYTE*)resource.pData;
- //BYTE* dptr = pBuf + lBmpInfo.bmiHeader.biSizeImage - lBmpRowPitch;
- //UINT lRowPitch = min(lBmpRowPitch, resource.RowPitch);
- //size_t h;
-
- //for (h = 0; h < lOutputDuplDesc.ModeDesc.Height; ++h)
- //{
- // memcpy_s(dptr, lBmpRowPitch, sptr, lRowPitch);
- // sptr += resource.RowPitch;
- // dptr -= lBmpRowPitch;
- //}
+// int i;
+// HRESULT hr;
+// ID3D11Device* m_Device;
+// ID3D11DeviceContext* m_DeviceContext;
+// IDXGIFactory2* m_Factory;
+// DWORD m_OcclusionCookie;
+// DXGI_OUTDUPL_DESC lOutputDuplDesc;
+// ID3D11Texture2D *lGDIImage;
+// ID3D11Texture2D *desktopImage;
+// ID3D11Texture2D *destinationImage;
+//
+// DXGI_OUTDUPL_FRAME_INFO lFrameInfo;
+// IDXGIResource *lDesktopResource;
+//
+// D3D11_Functions funcs;
+//
+// HMODULE _D3D = NULL;
+// if ((_D3D = LoadLibraryExA((LPCSTR)"D3D11.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32)) != NULL)
+// {
+// (FARPROC)funcs.D3D11CreateDevice = GetProcAddress(_D3D, "D3D11CreateDevice");
+// (FARPROC)funcs.D3D11CalcSubresource = GetProcAddress(_D3D, "D3D11CalcSubresource");
+// }
+//
+// D3D_DRIVER_TYPE DriverTypes[] =
+// {
+// D3D_DRIVER_TYPE_HARDWARE,
+// D3D_DRIVER_TYPE_WARP,
+// D3D_DRIVER_TYPE_REFERENCE,
+// };
+// UINT NumDriverTypes = ARRAYSIZE(DriverTypes);
+//
+// // Feature levels supported
+// D3D_FEATURE_LEVEL FeatureLevels[] =
+// {
+// D3D_FEATURE_LEVEL_11_0,
+// D3D_FEATURE_LEVEL_10_1,
+// D3D_FEATURE_LEVEL_10_0,
+// D3D_FEATURE_LEVEL_9_1
+// };
+// UINT NumFeatureLevels = ARRAYSIZE(FeatureLevels);
+// D3D_FEATURE_LEVEL FeatureLevel;
+//
+// // Create device
+// for (UINT DriverTypeIndex = 0; DriverTypeIndex < NumDriverTypes; ++DriverTypeIndex)
+// {
+// hr = funcs.D3D11CreateDevice(NULL, DriverTypes[DriverTypeIndex], NULL, 0, FeatureLevels, NumFeatureLevels, D3D11_SDK_VERSION, &m_Device, &FeatureLevel, &m_DeviceContext);
+// if (SUCCEEDED(hr))
+// {
+// // Device creation succeeded, no need to loop anymore
+// break;
+// }
+// }
+// if (FAILED(hr))
+// {
+// DebugBreak();
+// }
+//
+// // Get DXGI factory
+// IDXGIDevice* DxgiDevice = NULL;
+// hr = m_Device->lpVtbl->QueryInterface(m_Device, &IID_IDXGIDevice, (void**)&DxgiDevice);
+// if (FAILED(hr))
+// {
+// DebugBreak();
+// }
+//
+// IDXGIAdapter* DxgiAdapter = NULL;
+// hr = DxgiDevice->lpVtbl->GetParent(DxgiDevice, &IID_IDXGIAdapter, (void**)&DxgiAdapter);
+// DxgiDevice->lpVtbl->Release(DxgiDevice);
+// DxgiDevice = NULL;
+// if (FAILED(hr))
+// {
+// DebugBreak();
+// }
+//
+// hr = DxgiAdapter->lpVtbl->GetParent(DxgiAdapter, &IID_IDXGIFactory2, (void**)&m_Factory);
+// DxgiAdapter->lpVtbl->Release(DxgiAdapter);
+// DxgiAdapter = NULL;
+// if (FAILED(hr))
+// {
+// DebugBreak();
+// //return ProcessFailure(m_Device, L"Failed to get parent DXGI Factory", L"Error", hr, SystemTransitionsExpectedErrors);
+// }
+//
+// IDXGIOutput1 *DxgiOutput1;
+// hr = m_Device->lpVtbl->QueryInterface(m_Device, &IID_IDXGIOutput, (void**)&DxgiOutput1);
+// if (FAILED(hr))
+// {
+// DebugBreak();
+// }
+//
+// IDXGIOutputDuplication *dupl = NULL;
+// DxgiOutput1->lpVtbl->DuplicateOutput(DxgiOutput1, m_Device, &dupl);
+//
+// // Create GUI drawing texture
+// dupl->lpVtbl->GetDesc(dupl, &lOutputDuplDesc);
+//
+// D3D11_TEXTURE2D_DESC desc;
+// desc.Width = lOutputDuplDesc.ModeDesc.Width;
+// desc.Height = lOutputDuplDesc.ModeDesc.Height;
+// desc.Format = lOutputDuplDesc.ModeDesc.Format;
+// desc.ArraySize = 1;
+// desc.BindFlags = D3D11_BIND_RENDER_TARGET;
+// desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
+// desc.SampleDesc.Count = 1;
+// desc.SampleDesc.Quality = 0;
+// desc.MipLevels = 1;
+// desc.CPUAccessFlags = 0;
+// desc.Usage = D3D11_USAGE_DEFAULT;
+//
+// hr = m_Device->lpVtbl->CreateTexture2D(m_Device, &desc, NULL, &lGDIImage);
+// hr = m_Device->lpVtbl->CreateTexture2D(m_Device, &desc, NULL, &destinationImage);
+//
+// if (FAILED(hr))
+// {
+// DebugBreak();
+// }
+//
+// // Get new frame
+// for (i = 0; i < 5; ++i)
+// {
+// hr = dupl->lpVtbl->AcquireNextFrame(dupl, 250, &lFrameInfo, &lDesktopResource);
+// if (hr != DXGI_ERROR_WAIT_TIMEOUT) { break; }
+// Sleep(100);
+// }
+//
+// hr = lDesktopResource->lpVtbl->QueryInterface(lDesktopResource, &IID_ID3D11Texture2D, &desktopImage);
+//
+// // Copy image into GDI drawing texture
+// m_DeviceContext->lpVtbl->CopyResource(m_DeviceContext, lGDIImage, desktopImage);
+//
+// // Draw cursor image into GDI drawing texture
+// IDXGISurface1 *surface;
+// hr = lGDIImage->lpVtbl->QueryInterface(lGDIImage, &IID_IDXGISurface1, &surface);
+//
+//
+// // Copy from CPU access texture to bitmap buffer
+//
+// D3D11_MAPPED_SUBRESOURCE resource;
+// UINT subresource = funcs.D3D11CalcSubresource(0, 0, 0);
+// m_DeviceContext->lpVtbl->Map(m_DeviceContext, destinationImage, subresource, D3D11_MAP_READ_WRITE, 0, &resource);
+//
+// BITMAPINFO lBmpInfo;
+//
+// // BMP 32 bpp
+//
+// ZeroMemory(&lBmpInfo, sizeof(BITMAPINFO));
+// lBmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+// lBmpInfo.bmiHeader.biBitCount = 32;
+// lBmpInfo.bmiHeader.biCompression = BI_RGB;
+// lBmpInfo.bmiHeader.biWidth = lOutputDuplDesc.ModeDesc.Width;
+// lBmpInfo.bmiHeader.biHeight = lOutputDuplDesc.ModeDesc.Height;
+// lBmpInfo.bmiHeader.biPlanes = 1;
+// lBmpInfo.bmiHeader.biSizeImage = lOutputDuplDesc.ModeDesc.Width * lOutputDuplDesc.ModeDesc.Height * 4;
+//
+//
+// BYTE* pBuf = (BYTE*)ILibMemory_SmartAllocate(lBmpInfo.bmiHeader.biSizeImage);
+// UINT lBmpRowPitch = lOutputDuplDesc.ModeDesc.Width * 4;
+// BYTE* sptr = (BYTE*)resource.pData;
+// BYTE* dptr = pBuf + lBmpInfo.bmiHeader.biSizeImage - lBmpRowPitch;
+// UINT lRowPitch = min(lBmpRowPitch, resource.RowPitch);
+// size_t h;
+//
+// for (h = 0; h < lOutputDuplDesc.ModeDesc.Height; ++h)
+// {
+// memcpy_s(dptr, lBmpRowPitch, sptr, lRowPitch);
+// sptr += resource.RowPitch;
+// dptr -= lBmpRowPitch;
+// }
//}