[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 04/20] Remove win32stubagent
This is 1 large code deletion patch, the liteagent will be reimplemented over the next set of patches Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/win32stubagent/WmiAccessor.cpp | 1331 ------------------------------------ src/win32stubagent/WmiAccessor.h | 88 --- src/win32stubagent/XSAccessor.cpp | 230 ------- src/win32stubagent/XSAccessor.h | 126 ---- src/win32stubagent/XService.cpp | 1044 ---------------------------- src/win32stubagent/XService.h | 54 -- src/win32stubagent/errors.cpp | 102 --- src/win32stubagent/messages.mc | 66 -- src/win32stubagent/stdafx.cpp | 39 -- src/win32stubagent/stdafx.h | 43 -- src/win32stubagent/w32xagent.rc | 60 -- src/win32stubagent/xen.ico | Bin 25214 -> 0 bytes vs2012/liteagent/LiteAgent.vcxproj | 34 +- vs2013/liteagent/LiteAgent.vcxproj | 31 - 14 files changed, 2 insertions(+), 3246 deletions(-) delete mode 100644 src/win32stubagent/WmiAccessor.cpp delete mode 100644 src/win32stubagent/WmiAccessor.h delete mode 100644 src/win32stubagent/XSAccessor.cpp delete mode 100644 src/win32stubagent/XSAccessor.h delete mode 100644 src/win32stubagent/XService.cpp delete mode 100644 src/win32stubagent/XService.h delete mode 100644 src/win32stubagent/errors.cpp delete mode 100644 src/win32stubagent/messages.mc delete mode 100644 src/win32stubagent/stdafx.cpp delete mode 100644 src/win32stubagent/stdafx.h delete mode 100644 src/win32stubagent/w32xagent.rc delete mode 100644 src/win32stubagent/xen.ico diff --git a/src/win32stubagent/WmiAccessor.cpp b/src/win32stubagent/WmiAccessor.cpp deleted file mode 100644 index b85ff8e..0000000 --- a/src/win32stubagent/WmiAccessor.cpp +++ /dev/null @@ -1,1331 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "stdafx.h" -#define _WIN32_DCOM -#include <windows.h> -#include <iostream> -#include <algorithm> -#include <hash_map> -#include <stdio.h> -#include "winerror.h" -#include "WMIAccessor.h" -#include "XService.h" -#include "comutil.h" - -//#include "xs_private.h" -#include <wbemidl.h> - -#include <version.h> - -#define WIDEN2(x) L ## x -#define WIDEN(x) WIDEN2(x) - -#define OBJECT_NAME_A(_Name) OBJECT_PREFIX_STR "XenStore" #_Name -#define OBJECT_NAME_W(_Name) WIDEN(OBJECT_PREFIX_STR) L"XenStore" WIDEN(#_Name) - -#pragma comment(lib, "wbemuuid.lib") -#pragma comment(lib, "uuid.lib") -#pragma comment(lib, "comsuppw.lib") - -BSTR mkBstr(const char *string, size_t len) { - BSTR res = NULL; - size_t returned; - wchar_t* wstring = new wchar_t[len+1]; - if (wstring == NULL) { - goto malloc_wstring; - } - mbstowcs_s(&returned, wstring, len+1, string, len); - res = SysAllocString(wstring); - delete wstring; -malloc_wstring: - return res; -} - -char * formatCharStrInt(const char *fmt, va_list l) { - char *buf = NULL; - int cnt = _vscprintf(fmt, l); - buf = (char *)XsAlloc(cnt+1); - if (buf == NULL) { - goto malloc_buf; - } - _vsnprintf(buf, cnt+1, fmt, l); -malloc_buf: - return buf; -} - -char * formatCharStr(const char *fmt, ... ) { - char *buf =NULL; - va_list l; - va_start(l, fmt); - buf = formatCharStrInt(fmt, l); - va_end(l); - return buf; -} - -BSTR formatBstr(const char *fmt, ...) -{ - char *buf; - va_list l; - BSTR res = NULL; - va_start(l, fmt); - buf = formatCharStrInt(fmt, l); - va_end(l); - res = mkBstr(buf, strlen(buf)); - XsFree(buf); - return res; -} - -int setVariantString(VARIANT* var, const char *data, size_t len) { - int err=-1; - VariantInit(var); - var->vt=VT_BSTR; - var->bstrVal = mkBstr(data, len); - if (var->bstrVal == NULL) { - goto sysalloc; - } - err=0; -sysalloc: - return err; -} - - -int setVariantString(VARIANT* var, const char *string) { - return setVariantString(var, string, strlen(string)); -} - - -class WatchSink : public IWbemObjectSink -{ - LONG m_lRef; - bool bDone; - HANDLE triggerevent; - HANDLE triggererror; -public: - char *path; - WatchSink(HANDLE event, HANDLE errorevent, const char *path) { - m_lRef = 1; - triggerevent = event; - triggererror = errorevent; - this->path = NULL; - if (path) { - this->path=(char *)XsAlloc(strlen(path)+1); - strcpy(this->path, path); - } - } - ~WatchSink() { bDone = TRUE; } - - virtual ULONG STDMETHODCALLTYPE AddRef(); - virtual ULONG STDMETHODCALLTYPE Release(); - virtual HRESULT STDMETHODCALLTYPE - QueryInterface(REFIID riid, void** ppv); - - virtual HRESULT STDMETHODCALLTYPE Indicate( - /* [in] */ - LONG lObjectCount, - /* [size_is][in] */ - IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray - ); - - virtual HRESULT STDMETHODCALLTYPE SetStatus( - /* [in] */ LONG lFlags, - /* [in] */ HRESULT hResult, - /* [in] */ BSTR strParam, - /* [in] */ IWbemClassObject __RPC_FAR *pObjParam - ); -}; - - -ULONG WatchSink::AddRef() -{ - return InterlockedIncrement(&m_lRef); -} - -ULONG WatchSink::Release() -{ - LONG lRef = InterlockedDecrement(&m_lRef); - if(lRef == 0) - delete this; - return lRef; -} - -HRESULT WatchSink::QueryInterface(REFIID riid, void** ppv) -{ - if (riid == IID_IUnknown || riid == IID_IWbemObjectSink) - { - *ppv = (IWbemObjectSink *) this; - AddRef(); - return WBEM_S_NO_ERROR; - } - else return E_NOINTERFACE; -} - - -HRESULT WatchSink::Indicate(long lObjCount, IWbemClassObject **pArray) -{ - for (long i = 0; i < lObjCount; i++) - { - IWbemClassObject *pObj = pArray[i]; - SetEvent(this->triggerevent); - // ... use the object. - - // AddRef() is only required if the object will be held after - // the return to the caller. - } - - return WBEM_S_NO_ERROR; -} - -HRESULT WatchSink::SetStatus( - /* [in] */ LONG lFlags, - /* [in] */ HRESULT hResult, - /* [in] */ BSTR strParam, - /* [in] */ IWbemClassObject __RPC_FAR *pObjParam - ) -{ - if (FAILED(hResult)) { - XsLog("WMI Asyc watch failed %p\n", this); - SetEvent(this->triggererror); - } - return WBEM_S_NO_ERROR; -} - - - -struct WMIAccessor -{ - IWbemServices *mpSvc; - IWbemServices *mpXSSvc; - - HANDLE owning_thread; -}; - -struct WMIAccessor *wmi = NULL; - -static string wstring2string(const wstring& wstr) -{ - int len; - - len = WideCharToMultiByte(CP_UTF8, - 0, - wstr.c_str(), - -1, - NULL, - 0, - NULL, - NULL); - - string str(len, 0); - - len = WideCharToMultiByte(CP_UTF8, - 0, - wstr.c_str(), - -1, - &str[0], - (int)str.length(), - NULL, - NULL); - - return str; -} - -static string bstr2string(const BSTR& bstr) -{ - wstring wstr(bstr); - - return wstring2string(wstr); -} - -IWbemClassObject *getClass(WMIAccessor **wmi, BSTR path) { - if (*wmi == NULL) - return NULL; - - if ((*wmi)->mpXSSvc == NULL) - return NULL; - - IWbemClassObject *returnedObject; - HRESULT hres = (*wmi)->mpXSSvc->GetObject(path,WBEM_FLAG_RETURN_WBEM_COMPLETE, - NULL, &returnedObject, NULL); - if (FAILED(hres)) { - returnedObject =NULL; - } - return returnedObject; -} - -IWbemClassObject *getObject(WMIAccessor **wmi, BSTR path) { - IEnumWbemClassObject *returnedEnum; - IWbemClassObject *returnedObject; - if (*wmi == NULL) - return NULL; - ASSERT((*wmi)->mpXSSvc != NULL); - HRESULT hres = (*wmi)->mpXSSvc->CreateInstanceEnum(path, WBEM_FLAG_FORWARD_ONLY, - NULL, - &returnedEnum); - if (FAILED(hres)) { - OutputDebugString("GetEnum failed\n"); - returnedObject =NULL; - return returnedObject; - } - ULONG objects; - - hres = returnedEnum->Next(WBEM_INFINITE, 1, &returnedObject, &objects); - - - if (FAILED(hres) || objects < 1) { - OutputDebugString("GetFromEnum failed\n"); - returnedObject =NULL; - } - - return returnedObject; -} - -HRESULT methodExec(WMIAccessor** wmi, IWbemClassObject* instance, const wchar_t *methodname, IWbemClassObject *inMethodInst, IWbemClassObject **outMethodInst) -{ - HRESULT hres=E_FAIL ; - - IWbemClassObject *outstore=NULL; - BSTR bpathname = SysAllocString(L"__PATH"); - if (bpathname == NULL){ - goto allocpathname; - } - - - VARIANT instancepath; - VariantInit(&instancepath); - hres = instance->Get(bpathname, 0, &instancepath, NULL, NULL); - if (FAILED(hres)) { - goto getclassname; - } - - - BSTR bmethodname = SysAllocString(methodname); - if (bmethodname == NULL){ - goto allocmethodname; - } - - hres = (*wmi)->mpXSSvc->ExecMethod(instancepath.bstrVal, bmethodname, 0, NULL,inMethodInst, &outstore, NULL); - if (outMethodInst != NULL) { - *outMethodInst = NULL; - if (!FAILED(hres)){ - *outMethodInst = outstore; - } - } - - SysFreeString(bmethodname); -allocmethodname: - -getclassname: - VariantClear(&instancepath); - SysFreeString(bpathname); -allocpathname: - return hres; -} -static IEnumWbemClassObject* runXSQuery(WMIAccessor **wmi, BSTR query) -{ - if (wmi == NULL) - return NULL; - - ASSERT((*wmi)->mpXSSvc != NULL); - - // Use the IWbemServices pointer to make requests of WMI. - // Make requests here: - IEnumWbemClassObject* pEnumerator = NULL; - HRESULT hres = (*wmi)->mpXSSvc->ExecQuery(L"WQL", - query, - WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, - NULL, - &pEnumerator); - if (FAILED(hres)) - { - DBGPRINT(("ExecQuery failed\n")); - pEnumerator = NULL; - } - return pEnumerator; -} -static IEnumWbemClassObject* runQuery(WMIAccessor *wmi, BSTR query) -{ - if (wmi == NULL) - return NULL; - - ASSERT(wmi->mpSvc != NULL); - - // Use the IWbemServices pointer to make requests of WMI. - // Make requests here: - IEnumWbemClassObject* pEnumerator = NULL; - HRESULT hres = wmi->mpSvc->ExecQuery(L"WQL", - query, - WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, - NULL, - &pEnumerator); - if (FAILED(hres)) - { - DBGPRINT(("ExecQuery failed\n")); - pEnumerator = NULL; - } - return pEnumerator; -} - -LONG wmicount = 0; -static BOOLEAN com_initialized = false; -static IWbemLocator *locator = 0; -BOOL InitCom(void) { - HRESULT hres; - XsLog("Init COM"); - hres = CoInitializeEx(0, COINIT_MULTITHREADED); - if (FAILED(hres)) { - goto err_out; - } - com_initialized = TRUE; - //wmi->owning_thread = GetCurrentThread(); - //XsLog("Wmi connect thread %p", GetCurrentThread()); - // Initialize COM security. Most of this is irrelevant to us. - XsLog("Init security"); - hres = CoInitializeSecurity( - NULL, /* Security descriptor. Only relevant to servers */ - -1, /* Nr. of auth services. Only relevant to servers */ - NULL, /* List of auth services. Only relevant to servers */ - NULL, /* Reserved */ - RPC_C_AUTHN_LEVEL_DEFAULT, /* Default authentication. The - details don't really matter when - you're localhost. */ - RPC_C_IMP_LEVEL_IMPERSONATE, /* WMI needs to be able to - impersonate us. */ - NULL, /* Authentication info */ - EOAC_NONE, /* Additional capabilities */ - NULL /* Reserved */ - ); - if (FAILED(hres)) { - goto err_out; - } - OutputDebugString("CreateInstance\n"); - hres = CoCreateInstance( - CLSID_WbemLocator, - 0, - CLSCTX_INPROC_SERVER, - IID_IWbemLocator, - (LPVOID *) &locator); - OutputDebugString("Check hres\n"); - if (FAILED(hres)) { - goto err_out; - } - if (locator == NULL) { - OutputDebugString("Null locator"); - goto err_out; - } - return true; -err_out: - return false; -} - -BOOL ConnectToWMI(void) -{ - InitCom(); - HRESULT hres; - OutputDebugString("Connect to WMI"); - wmicount++; - - wmi = (struct WMIAccessor *)XsAlloc(sizeof(*wmi)); - if (wmi == NULL) { - return false; - } - memset(wmi, 0, sizeof(*wmi)); - - - OutputDebugString("Connect Server\n"); - try { - hres = locator->ConnectServer( - L"root\\CIMV2", // WMI namespace - NULL, // User name - NULL, // User password - NULL, // Locale - 0, // Security flags - NULL, // Authority - NULL, // Context object - &(wmi->mpSvc) // IWbemServices proxy - ); - } - catch(...) { - OutputDebugString("Exception connecting to server\n"); - goto err_out; - } - - OutputDebugString("Check result\n"); - if (FAILED(hres)) { - goto err_out; - } - /* WMI needs to impersonate us, because it normally runs as an - unprivileged user and needs our authority in order to access - device files and so forth. Turn impersonation on. */ - OutputDebugString("Proxy blanket\n"); - hres = CoSetProxyBlanket( - wmi->mpSvc, // the proxy to set - RPC_C_AUTHN_WINNT, /* LAN manager authentication, - although it doesn't really - matter on localhost. */ - RPC_C_AUTHZ_NONE, // LANMAN can't do much authorization. - NULL, // Server principal name - RPC_C_AUTHN_LEVEL_CALL, // Do authentication on every call - RPC_C_IMP_LEVEL_IMPERSONATE, // Allow full impersonation. - NULL, // Use current client identity - EOAC_NONE // No extended proxy capabilities - ); - if (FAILED(hres)) { - goto err_out; - } - OutputDebugString("WMI Server\n"); - hres = locator->ConnectServer( - L"root\\WMI", // WMI namespace - NULL, // User name - NULL, // User password - NULL, // Locale - 0, // Security flags - NULL, // Authority - NULL, // Context object - &wmi->mpXSSvc // IWbemServices proxy - ); - - if (FAILED(hres)) { - goto err_out; - } - OutputDebugString("Impersonation\n"); - /* WMI needs to impersonate us, because it normally runs as an - unprivileged user and needs our authority in order to access - device files and so forth. Turn impersonation on. */ - hres = CoSetProxyBlanket( - wmi->mpXSSvc, // the proxy to set - RPC_C_AUTHN_WINNT, /* LAN manager authentication, - although it doesn't really - matter on localhost. */ - RPC_C_AUTHZ_NONE, // LANMAN can't do much authorization. - NULL, // Server principal name - RPC_C_AUTHN_LEVEL_CALL, // Do authentication on every call - RPC_C_IMP_LEVEL_IMPERSONATE, // Allow full impersonation. - NULL, // Use current client identity - EOAC_NONE // No extended proxy capabilities - ); - if (FAILED(hres)) { - goto err_out; - } - - - OutputDebugString("Wmi connected\n"); - /* All done. */ - return true; - -err_out: - OutputDebugString("WMI connection failed\n"); - ReleaseWMIAccessor(&wmi); - return false; -} - - -void ReleaseCom(void) { - - if (com_initialized) { - OutputDebugString("Release locator\n"); - locator->Release(); - //XsLog("Wmi disconnect thread %p", GetCurrentThread()); - //ASSERT((*wmi)->owning_thread == GetCurrentThread()); - com_initialized = 0; - OutputDebugString("Uninitialize com\n"); - CoUninitialize(); - - } -} - -/* Careful: WMI accessors must be released on the same thread that - allocated them. */ -void ReleaseWMIAccessor(struct WMIAccessor **wmi) -{ - OutputDebugString("Should I release wmi?\n"); - if (*wmi == NULL) - return; - OutputDebugString("Get rid of WMI servers\n"); - if ((*wmi)->mpXSSvc != NULL) - (*wmi)->mpXSSvc->Release(); - if ((*wmi)->mpSvc != NULL) - (*wmi)->mpSvc->Release(); - OutputDebugString("Clear WmI\n"); - /* Poison wmi to make use-after-free()s a bit more obvious. */ - memset((*wmi), 0xab, sizeof(**wmi)); - XsFree(*wmi); - *wmi = NULL; - ReleaseCom(); - OutputDebugString("Released WMI\n"); -} - -/* The fact that something is documented as being a uint64_t field - doesn't imply that it will be returned as a VT_UI8 field in a - variant structure. Work around this with a handy conversion - function. */ -static uint64_t -GetVariantUint64(VARIANT *vtData) -{ - switch (vtData->vt) { - case VT_I2: - return vtData->iVal; - case VT_I4: - return vtData->lVal; - case VT_I8: - return vtData->llVal; - case VT_UI2: - return vtData->uiVal; - case VT_UI4: - return vtData->ulVal; - case VT_UI8: - return vtData->ullVal; - case VT_BSTR: - /* Yes, I really do mean BSTR: XP returns 64 bit values as - strings, and we then have to do atoill on it. */ - return _wtoi64(vtData->bstrVal); - default: - DBGPRINT(("Bad uint64_t variant %d.\n",vtData->vt)); - return -1; - } -} - -static HRESULT -QueryVariant(WMIAccessor *wmi, PWCHAR field, PWCHAR table, VARIANT *vt) -{ - IEnumWbemClassObject *pEnum; - BSTR query; - size_t query_len; - IWbemClassObject *pclsObj; - HRESULT hr; - ULONG uReturn; - - query_len = strlen("SELECT FROM ") + wcslen(field) + wcslen(table) + 1; - query = SysAllocStringLen(NULL, (UINT)query_len); - if (query == NULL) { - hr = E_OUTOFMEMORY; - goto err; - } - swprintf_s(query, query_len, L"SELECT %s FROM %s", field, table); - pEnum = runQuery(wmi, query); - SysFreeString(query); - - if (pEnum == NULL) { - hr = E_OUTOFMEMORY; - goto err; - } - - hr = pEnum->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); - pEnum->Release(); - if (FAILED(hr)) - goto err; - if (uReturn == 0) { - hr = E_FAIL; - goto err; - } - - hr = pclsObj->Get(field, 0, vt, NULL, NULL); - pclsObj->Release(); - - return hr; - -err: - return hr; -} - -static uint64_t -QueryUint64(WMIAccessor *wmi, PWCHAR field, PWCHAR table) -{ - HRESULT hr; - uint64_t res; - VARIANT vt; - - memset(&vt, 0, sizeof(vt)); - - hr = QueryVariant(wmi, field, table, &vt); - if (FAILED(hr)) - return 0; - - res = GetVariantUint64(&vt); - VariantClear(&vt); - return res; -} - -static BSTR -QueryBstr(WMIAccessor *wmi, PWCHAR field, PWCHAR table) -{ - HRESULT hr; - VARIANT vt; - - memset(&vt, 0, sizeof(vt)); - - hr = QueryVariant(wmi, field, table, &vt); - if (FAILED(hr)) - return NULL; - if (vt.vt != VT_BSTR) { - VariantClear(&vt); - return NULL; - } - return vt.bstrVal; -} - - - -/* hash comparator for strings which strips off trailing .exe - * suffix */ -class string_eq_exe { -private: - static size_t len_without_suffix(const char *x) - { - size_t l; - l = strlen(x); - if (l > 4 && !strcmp(x + l - 4, ".exe")) - l -= 4; - return l; - } - -public: - enum {bucket_size = 4, min_buckets = 8}; - bool operator()(const string &a, const string &b) const - { - const char *a_c, *b_c; - size_t a_l, b_l; - a_c = a.c_str(); - b_c = b.c_str(); - a_l = len_without_suffix(a_c); - b_l = len_without_suffix(b_c); - - if (a_l != b_l) - return 1; - if (memcmp(a_c, b_c, a_l)) - return 1; - else - return 0; - } - - size_t operator()(const string &a) const - { - size_t acc = 0; - const char *c_str = a.c_str(); - size_t len = len_without_suffix(c_str); - unsigned x; - for (x = 0; x < len; x++) - acc = (acc * 17 + c_str[x]) % 257; - return acc; - } -}; - - -IWbemClassObject *getBase(WMIAccessor** wmi) -{ - IWbemClassObject* base = getObject(wmi, OBJECT_NAME_W(Base)); - if (base == NULL) { - *wmi = NULL; - return NULL; - } - return base; -} - -IWbemClassObject *getBaseClass(WMIAccessor** wmi) -{ - IWbemClassObject* baseclass = getClass(wmi, OBJECT_NAME_W(Base)); - if (baseclass == NULL) { - *wmi = NULL; - return NULL; - } - return baseclass; -} - -ULONGLONG get64BitUnsigned(VARIANT *var) { - ULONGLONG res = 0; - switch (var->vt) { - case VT_BSTR: { - VARIANT outvar; - VariantInit(&outvar); - VariantChangeType(&outvar, var, 0, VT_UI8); - res = outvar.ullVal; - VariantClear(&outvar); - } - break; - case VT_UI8: { - res = var->ullVal; - } - break; - } - return res; -} - -FILETIME WmiGetXenTime(WMIAccessor **wmi) { - FILETIME out; - - IWbemClassObject *base = getBase(wmi); - if (base == NULL) { - DBGPRINT(("Unable to find base WMI session\n")); - goto getbasefailed; - } - - VARIANT timevar; - BSTR timename = mkBstr("XenTime", 7); - if (timename == NULL) - goto buildtimenamefailed; - - - - if (FAILED(base->Get(timename, 0, &timevar, NULL, NULL))) - goto gettimefailed; - - ULONGLONG time =get64BitUnsigned(&timevar);; - - out.dwLowDateTime = (DWORD)time; - out.dwHighDateTime = (DWORD)(time>>32); - return out; - -gettimefailed: -buildtimenamefailed: -getbasefailed: - out.dwLowDateTime = 0; - out.dwHighDateTime = 0; - return out ; -} - -IWbemClassObject *openSession(WMIAccessor** wmi, const char *sessionname) -{ - HRESULT hres; - - BSTR query = formatBstr("SELECT * FROM " OBJECT_NAME_A(Session) " WHERE Id=\"" OBJECT_PREFIX_STR " Xen Win32 Service : %s\"", sessionname); - if (query == NULL) - goto formatsessionbstrfailed; - - IEnumWbemClassObject * sessions = runXSQuery(wmi, query); - SysFreeString(query); - - if (sessions) { - IWbemClassObject *returnedObject; - ULONG count; - hres = sessions->Next(WBEM_INFINITE, 1, &returnedObject, &count); - sessions->Release(); - - if (count>0) { - if (sessionname !=NULL ) { - if (!WmiSessionEnd(wmi, returnedObject)) { - return NULL; - } - } - else { - return returnedObject; - } - } - } - - IWbemClassObject *base = getBase(wmi); - if (base==NULL) { - DBGPRINT(("Unable to find base WMI session\n")); - goto getbasefailed; - } - - IWbemClassObject *baseclass = getBaseClass(wmi); - - if (baseclass == NULL) - goto getbaseclassfailed; - - IWbemClassObject *inMethod; - - IWbemClassObject *inMethodInst; - IWbemClassObject *outMethodInst; - if (FAILED(baseclass->GetMethod(L"AddSession",0,&inMethod, NULL))) - goto getmethodaddsessionfailed; - - if (FAILED(inMethod->SpawnInstance(0, &inMethodInst))) - goto inmethodspawnfailed; - - VARIANT var; - var.vt = VT_BSTR; - var.bstrVal=formatBstr(VENDOR_NAME_STR " " PRODUCT_NAME_STR " Win32 Service : %s", sessionname); - - if (var.bstrVal == NULL) - goto formatnamebstrfailed; - - if (FAILED(inMethodInst->Put(L"Id", 0, &var, 0))) - goto methodputfailed; - - if (FAILED(methodExec(wmi, base, L"AddSession", inMethodInst, &outMethodInst))) - goto methodexecaddsessionfailed; - - if (FAILED(outMethodInst->Get(L"SessionId", 0, &var, NULL, NULL))) - goto outmethodgetfailed; - - size_t query_len; - query_len = strlen("SELECT * FROM " OBJECT_NAME_A(Session) " WHERE SessionId=")+10; - query = SysAllocStringLen(NULL, (UINT)query_len); - - if (query == NULL) - goto allocqueryfailed; - - swprintf_s(query,query_len, L"SELECT * FROM " OBJECT_NAME_W(Session) L" WHERE SessionId=%d", var.uintVal); - - sessions = runXSQuery(wmi, query ); - SysFreeString(query); - - if (sessions) { - IWbemClassObject *returnedObject; - ULONG count; - hres = sessions->Next(WBEM_INFINITE, 1, &returnedObject, &count); - sessions->Release(); - if (count>0) { - return returnedObject; - } - - } - - outMethodInst->Release(); - VariantClear(&var); - inMethodInst->Release(); - inMethod->Release(); - base->Release(); - baseclass->Release(); - return NULL; - -allocqueryfailed: -outmethodgetfailed: - outMethodInst->Release(); - -methodexecaddsessionfailed: -methodputfailed: - VariantClear(&var); - -formatnamebstrfailed: - inMethodInst->Release(); -inmethodspawnfailed: - inMethod->Release(); - - -getmethodaddsessionfailed: - baseclass->Release(); - -getbaseclassfailed: - base->Release(); - -getbasefailed: - - -formatsessionbstrfailed: - return NULL; -} - -IWbemClassObject* sessionMethodStart(WMIAccessor**wmi, - const wchar_t *methodname) -{ - IWbemClassObject *inMethod; - IWbemClassObject *inMethodInst = NULL; - IWbemClassObject *sessionClass; - HRESULT hr; - - ASSERT(wmi != NULL); - - sessionClass = getClass(wmi, OBJECT_NAME_W(Session)); - if (sessionClass == NULL) - goto getclassfailed; - - hr = sessionClass->GetMethod(methodname,0,&inMethod, NULL); - if (FAILED(hr)) - goto getmethodfailed; - - hr = inMethod->SpawnInstance(0, &inMethodInst); - if (FAILED(hr)) - goto spawninstancefailed; - - inMethod->Release(); - - sessionClass->Release(); - return inMethodInst; - - -spawninstancefailed: - inMethod->Release(); - -getmethodfailed: - sessionClass->Release(); - -getclassfailed: - return NULL; -} - - -char * bstrToChar(BSTR bst, size_t *len) { - *len = wcslen(bst); - char *space = (char *)XsAlloc(*len+1); - if (space) - wcstombs_s(len, space, *len+1, bst, _TRUNCATE); - return space; -} - -void WmiSessionLog(WMIAccessor** wmi, void **sessionhandle,const char *fmt, va_list args) { - IWbemClassObject **session = (IWbemClassObject **)sessionhandle; - - char* message = formatCharStrInt(fmt,args); - - OutputDebugString(message); - if (((*wmi)==NULL) || ((*sessionhandle)==NULL) ) { - goto nowmi; - } - VARIANT vmessage; - if (setVariantString(&vmessage, message)) - goto setvmessage; - - IWbemClassObject *inMethodInst = sessionMethodStart( wmi, L"Log"); - if (!inMethodInst) - goto sessionstart; - - if (FAILED(inMethodInst->Put(L"Message",0,&vmessage,0))) - goto methodputfailed; - - if (FAILED(methodExec(wmi,*session, L"Log", inMethodInst, NULL))) - goto methodexecfailed; - -methodexecfailed: -methodputfailed: - inMethodInst->Release(); - -sessionstart: - VariantClear(&vmessage); - -setvmessage: -nowmi: - return; -} - -char* WmiSessionGetEntry(WMIAccessor** wmi, void **sessionhandle, - const char * path, size_t* len) -{ - *len = 0; - IWbemClassObject **session = (IWbemClassObject **)sessionhandle; - - VARIANT vpath; - if (setVariantString(&vpath, path)) - goto setvpath; - - IWbemClassObject *outMethodInst = NULL; - - IWbemClassObject *inMethodInst = sessionMethodStart( wmi, L"GetValue"); - if (inMethodInst == NULL) - goto sessionmethodstartfailed; - - if (FAILED(inMethodInst->Put(L"PathName",0,&vpath,0))) - goto methodexecfailed; - - methodExec(wmi,*session, L"GetValue", inMethodInst, &outMethodInst); - if (outMethodInst==NULL) - goto sessionExec; - - VARIANT outval; - VariantInit(&outval); - - if (FAILED(outMethodInst->Get(L"value", 0, &outval, NULL, NULL))) - goto methodgetfailed; - - char *space = NULL; - - if (V_VT(&outval) == VT_BSTR) - { - space = bstrToChar(outval.bstrVal, len); - } - - outMethodInst->Release(); - inMethodInst->Release(); - VariantClear(&vpath); - VariantClear(&outval); - return space; - -methodgetfailed: - outMethodInst->Release(); - -methodexecfailed: -sessionExec: - inMethodInst->Release(); - -sessionmethodstartfailed: - VariantClear(&vpath); - -setvpath: - return NULL; -} - -int WmiSessionSetEntry(WMIAccessor** wmi, void **sessionhandle, - const char*path, const char * value, size_t len) -{ - int err = -1; - IWbemClassObject **session = (IWbemClassObject **)sessionhandle; - - VARIANT vpath; - if (setVariantString(&vpath, path)) - goto setvpath; - - VARIANT vvalue; - if (setVariantString(&vvalue, value)) - goto setvvalue; - - IWbemClassObject *outMethodInst; - - IWbemClassObject *inMethodInst = sessionMethodStart( wmi, L"SetValue"); - if (!inMethodInst) - goto sessionstart; - - inMethodInst->Put(L"PathName",0,&vpath,0); - inMethodInst->Put(L"value",0,&vvalue,0); - - if (FAILED(methodExec(wmi,*session, L"SetValue", inMethodInst, &outMethodInst))) - goto methodexecfailed; - - if (outMethodInst!=NULL) - outMethodInst->Release(); - - inMethodInst->Release(); - SysFreeString(vvalue.bstrVal); - SysFreeString(vpath.bstrVal); - - return 0; - -methodexecfailed: - XsLog("WmiSessionSetEntry:MethodExec Failed"); - inMethodInst->Release(); - -sessionstart: - XsLog("WmiSessionSetEntry:SessionStart Failed"); - SysFreeString(vvalue.bstrVal); - -setvvalue: - XsLog("WmiSessionSetEntry:SetVValue Failed"); - SysFreeString(vpath.bstrVal); - -setvpath: - XsLog("WmiSessionSetEntry:SetVPath Failed "); - return err; -} - -int WmiSessionSetEntry(WMIAccessor** wmi, void **sessionhandle, - const char*path, const char * value) { - return WmiSessionSetEntry(wmi, sessionhandle, path, value, strlen(value)); -} - -int WmiSessionRemoveEntry(WMIAccessor** wmi, void **sessionhandle, - const char*path){ - - int err = -1; - IWbemClassObject **session = (IWbemClassObject **)sessionhandle; - - VARIANT vpath; - if (setVariantString(&vpath, path)) - goto setvpath; - - IWbemClassObject *inMethodInst = sessionMethodStart( wmi, L"RemoveValue"); - if (!inMethodInst) - goto sessionstart; - - if (FAILED(inMethodInst->Put(L"PathName",0,&vpath,0))) - goto methodputfailed; - - IWbemClassObject* outMethodInst; - - if (FAILED(methodExec(wmi,*session, L"RemoveValue", inMethodInst, &outMethodInst))) - goto methodexecfailed; - - if (outMethodInst != NULL) - outMethodInst->Release(); - - err=0; - inMethodInst->Release(); - VariantClear(&vpath); - return err; -methodexecfailed: - OutputDebugString(__FUNCTION__ " MethodExecFailed"); -methodputfailed: - OutputDebugString(__FUNCTION__ " MethodPutFailed"); - inMethodInst->Release(); - -sessionstart: - OutputDebugString(__FUNCTION__ " SessionStartFailed"); - VariantClear(&vpath); - - OutputDebugString(__FUNCTION__ " SessionExecFailed"); -setvpath: - OutputDebugString(__FUNCTION__ " SetVpathFailed"); - return err; -} - - -BOOL WmiSessionUnwatch(WMIAccessor** wmi, void **sessionhandle, - void *watchhandle) { - IWbemClassObject **session = (IWbemClassObject **)sessionhandle; - XsLog("Unwatch %p",watchhandle); - WatchSink * sink = (WatchSink *)watchhandle; - - VARIANT vpath; - if (setVariantString(&vpath, sink->path)) - goto setvpath; - - IWbemClassObject *outMethodInst; - IWbemClassObject *inMethodInst = sessionMethodStart( wmi, L"RemoveWatch"); - if (!inMethodInst) - goto sessionstart; - - inMethodInst->Put(L"PathName",0,&vpath,0); - if FAILED(methodExec(wmi,*session, L"RemoveWatch", inMethodInst, &outMethodInst)) - goto methodexecfailed; - if (outMethodInst==NULL) - goto sessionexecfailed; - - outMethodInst->Release(); - -methodexecfailed: -sessionexecfailed: - inMethodInst->Release(); - -sessionstart: -setvpath: - sink->Release(); - return true; -} - -BOOL WmiSessionStart(WMIAccessor** wmi, void **sessionhandle, const char* sessionname) -{ - IWbemClassObject **session = (IWbemClassObject **)sessionhandle; - if ((*session = openSession(wmi, sessionname)) == NULL) { - return false; - } - return true; -} - - -BOOL WmiSessionEnd(WMIAccessor** wmi, void *sessionhandle) -{ - HRESULT hr; - ASSERT(*wmi != NULL); - - IWbemClassObject *session = (IWbemClassObject *)sessionhandle; - if (session==NULL) { - return false; - } - hr = methodExec(wmi, session, L"EndSession", NULL,NULL); - if FAILED(hr) - goto execmethodfailed; - session->Release(); - return true; - -execmethodfailed: - return false; - -} - -void *WmiSessionWatch(WMIAccessor** wmi, void **sessionhandle, - const char *path, HANDLE event, HANDLE errorevent) { - - HRESULT hr; - - IWbemClassObject **session = (IWbemClassObject **)sessionhandle; - - ASSERT((*wmi) != NULL); - ASSERT((*sessionhandle) != NULL); - - WatchSink * sink = new WatchSink(event, errorevent, path); - BSTR query=formatBstr("SELECT * from " OBJECT_NAME_A(WatchEvent) " WHERE EventId=\"%s\"", path); - if (query == NULL) { - goto formatstringfailed; - } - - hr = (*wmi)->mpXSSvc->ExecNotificationQueryAsync(L"WQL", query,0,NULL, sink); - if (FAILED(hr)){ - *wmi = NULL; - goto wmifailed; - } - - VARIANT vpath; - if (setVariantString(&vpath, path)){ - goto setvpath; - } - - - IWbemClassObject *inMethodInst = sessionMethodStart( wmi, L"SetWatch"); - if (!inMethodInst) - goto sessionstart; - - hr = inMethodInst->Put(L"PathName",0,&vpath,0); - if (FAILED(hr)) - goto methodputfailed; - - hr = methodExec(wmi,*session, L"SetWatch", inMethodInst, NULL); - if (FAILED(hr)) - goto methodexecfailed; - - VariantClear(&vpath); - - SysFreeString(query); - - return sink; - - -methodexecfailed: - OutputDebugString(__FUNCTION__ " : methodexecfailed\n"); -methodputfailed: - OutputDebugString(__FUNCTION__ " : methodputfailed\n"); - inMethodInst->Release(); -sessionstart: - OutputDebugString(__FUNCTION__ " : sessionstart\n"); - VariantClear(&vpath); -setvpath: - OutputDebugString(__FUNCTION__ " : setvpath\n"); -wmifailed: - SysFreeString(query); -formatstringfailed: - OutputDebugString(__FUNCTION__ " : formatstringfailed\n"); - delete sink; - return NULL; -} - -void *WmiUnsuspendedEventWatch(WMIAccessor **wmi, HANDLE event, HANDLE errorevent) -{ - HRESULT hr; - - ASSERT(*wmi != NULL); - - WatchSink * sink = new WatchSink(event, errorevent, NULL); - BSTR query=formatBstr("SELECT * from " OBJECT_NAME_A(UnsuspendedEvent)); - if (query==NULL) { - goto formatstringfailed; - } - - hr = (*wmi)->mpXSSvc->ExecNotificationQueryAsync(L"WQL", query,0,NULL, sink); - if FAILED(hr) - goto asyncqueryfailed; - - SysFreeString(query); - return sink; - -asyncqueryfailed: - SysFreeString(query); -formatstringfailed: - delete sink; - return NULL; -} - diff --git a/src/win32stubagent/WmiAccessor.h b/src/win32stubagent/WmiAccessor.h deleted file mode 100644 index e37ef71..0000000 --- a/src/win32stubagent/WmiAccessor.h +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef _WMIACCESSOR_H -#define _WMIACCESSOR_H - -#include <Wbemidl.h> -#include <list> -#include <vector> -#include <map> -#include <string> - -#include "XSAccessor.h" - -using namespace std; - -typedef unsigned __int64 uint64_t; - -struct WMIAccessor; - -extern struct WMIAccessor *wmi; - -extern LONG wmicount; -BOOL InitCom(void); -void ReleaseCom(void); -BOOL ConnectToWMI(void); -void ReleaseWMIAccessor(struct WMIAccessor **); - -void UpdateProcessListInStore(WMIAccessor **wmi); - -int WmiSessionSetEntry(WMIAccessor** wmi, void **sessionhandle, - const char*path, const char * value); - -int WmiSessionSetEntry(WMIAccessor** wmi, void **sessionhandle, - const char*path, const char * value, size_t len); -char* WmiSessionGetEntry(WMIAccessor** wmi, void **sessionhandle, - const char * path, size_t* len) ; - -void *WmiSessionWatch(WMIAccessor** wmi, void **sessionhandle, - const char *path, HANDLE event, HANDLE errorevent); -BOOL WmiSessionUnwatch(WMIAccessor** wmi, void **sessionhandle, - void *watchhandle); - -int WmiSessionRemoveEntry(WMIAccessor** wmi, void **sessionhandle, - const char*path); - -char **WmiSessionGetChildren(WMIAccessor** wmi, void **sessionhandle, - const char * path, unsigned *numentries); - - -void *WmiUnsuspendedEventWatch(WMIAccessor **wmi, HANDLE event, HANDLE errorevent); - -int WmiSessionTransactionAbort(WMIAccessor** wmi, void **sessionhandle); -int WmiSessionTransactionCommit(WMIAccessor** wmi, void **sessionhandle); -int WmiSessionTransactionStart(WMIAccessor** wmi, void **sessionhandle); -BOOL WmiSessionStart(WMIAccessor** wmi, void **sessionhandle, const char *sessionname); -BOOL WmiSessionEnd(WMIAccessor** wmi, void *sessionhandle); -FILETIME WmiGetXenTime(WMIAccessor **wmi); -void WmiSessionLog(WMIAccessor** wmi, void **sessionhandle,const char *fmt, va_list args); -#endif diff --git a/src/win32stubagent/XSAccessor.cpp b/src/win32stubagent/XSAccessor.cpp deleted file mode 100644 index c60fb8b..0000000 --- a/src/win32stubagent/XSAccessor.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <windows.h> -#include "stdafx.h" -#include "XSAccessor.h" -#include "WMIAccessor.h" - -static __declspec(thread) void *WmiSessionHandle = NULL; - -static LONG volatile threadcount = 0; -static __declspec(thread) LONG localthreadcount = 0; -static __declspec(thread) LONG localwmicount = 0; - -static long update_cnt=0xF0000000; -#define XENSTORE_MAGIC 0x7e6ec123 - -void *XsAlloc(size_t size) { - void *buf; - - buf = malloc(size + 8); - if (!buf) { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return NULL; - } - memset(buf, 0, size + 8); - *(unsigned *)buf = XENSTORE_MAGIC; - return (void *)((ULONG_PTR)buf + 8); -} - -void XsFree(const void *buf) { - void *orig_buf; - - if (!buf) - return; - orig_buf = (void *)((ULONG_PTR)buf - 8); - if (*(unsigned *)orig_buf != XENSTORE_MAGIC) { - OutputDebugString("XsFree() invoked on bad pointer\n"); - DebugBreak(); - } - free(orig_buf); -} - -void GetXenTime(FILETIME *now) -{ - *now = WmiGetXenTime(&wmi); -} - - -int ListenSuspend(HANDLE event, HANDLE errorevent) -{ - if (!WmiUnsuspendedEventWatch(&wmi, event, errorevent)) - return -1; - else - return 0; -} - -BOOL InitXSAccessor() -{ - OutputDebugString("XSAccessor\n"); - if (wmicount != localwmicount) { - - if (localthreadcount == 0) { - localthreadcount = InterlockedIncrement(&threadcount); - } - char wminame[12]; - _snprintf(wminame, 12, "XS%x", localthreadcount); - if (WmiSessionStart(&wmi, &WmiSessionHandle, wminame)) { - localwmicount = wmicount; - return true; - } - OutputDebugString("XSAccessor Failed\n"); - return false; - } - return true; -} - -void XsLog(const char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - WmiSessionLog(&wmi, &WmiSessionHandle, fmt, args); - va_end(args); -} - - -BOOL ShutdownXSAccessor(void) -{ - if (wmi == NULL) { - return false; - } - if (WmiSessionHandle == NULL) { - return false; - } - return WmiSessionEnd(&wmi, WmiSessionHandle); - -} - -int XenstorePrintf(const char *path, const char *fmt, ...) -{ - va_list l; - char buf[4096]; - int cnt; - - va_start(l, fmt); - cnt = _vsnprintf(buf, sizeof(buf), fmt, l); - va_end(l); - if (cnt < 0) { - DBGPRINT (("Cannot format data for XenstorePrintf!")); - return -1; - } - OutputDebugString(buf); - /* Now have the thing we're trying to write. */ - return WmiSessionSetEntry(&wmi, &WmiSessionHandle, path, buf); -} - -BOOL XenstoreKickXapi() -{ - /* New protocol */ - if (XenstorePrintf("data/update_cnt", "%I64d", update_cnt)){ - XsLog("New kick failed "); - return false; - } - /* Old protocol */ - if (WmiSessionSetEntry(&wmi, &WmiSessionHandle, "data/updated", "1")){ - XsLog("Old kick failed"); - return false; - } - update_cnt++; - return true; -} - - -int -XenstoreRemove(const char *path) -{ - if (wmi == NULL) - return -1; - - if (WmiSessionHandle == NULL) - return -1; - - if (WmiSessionRemoveEntry(&wmi, &WmiSessionHandle, path)) - return -1; - else - return 0; -} - -ssize_t -XenstoreRead(const char* path, char** value) -{ - size_t len; - *value =WmiSessionGetEntry(&wmi, &WmiSessionHandle, path, &len); - if (*value) - return (ssize_t)len; - else - return -1; -} - - -bool XenstoreReadDword(const char *path, DWORD *value) { - char* buffer; - ssize_t len; - len = XenstoreRead(path, &buffer); - if (len <= 0) { - return false; - } - *value = atoi(buffer); - - XsFree(buffer); - - return true; -} - -void * -XenstoreWatch(const char *path, HANDLE event, HANDLE errorevent) -{ - - if (wmi == NULL) { - OutputDebugString("WMI is null\n"); - return NULL; - } - if (WmiSessionHandle == NULL) { - OutputDebugString("Session is null\n"); - return NULL; - } - return WmiSessionWatch(&wmi, &WmiSessionHandle, path, event, errorevent); -} - -BOOL -XenstoreUnwatch(void *watch) -{ - return WmiSessionUnwatch(&wmi, &WmiSessionHandle, watch); -} - -void -XenstoreFree(void *tofree) -{ - return XsFree(tofree); -} - diff --git a/src/win32stubagent/XSAccessor.h b/src/win32stubagent/XSAccessor.h deleted file mode 100644 index 2ed41b0..0000000 --- a/src/win32stubagent/XSAccessor.h +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - - -#ifndef _XSACCESSOR_H -#define _XSACCESSOR_H - -#include <string> -#include "windows.h" - - -using namespace std; - -#define MAX_XENBUS_PATH 256 - -#ifdef AMD64 -typedef long long ssize_t; -#else -typedef long ssize_t; -#endif - -BOOL InitXSAccessor(); -BOOL ShutdownXSAccessor(); -ssize_t XenstoreRead(const char *path, char **value); -int XenstoreRemove(const char *path); -int XenstorePrintf(const char *path, const char *fmt, ...); -int XenstoreWrite(const char *path, const void *data, size_t len); -BOOL XenstoreKickXapi(void); -void *XenstoreWatch(const char *path, HANDLE event, HANDLE errorevent); -BOOL XenstoreUnwatch(void *watch); -int ListenSuspend(HANDLE evt, HANDLE errorevent); -void GetXenTime(FILETIME *res); -void XsLog(const char *fmt, ...); -void XenstoreFree(void *tofree); -void *XsAlloc(size_t size); -void XsFree(const void *buf); -bool XenstoreReadDword(const char * path, DWORD *value); - -#if DBG - -#include <stdarg.h> // va_list -#include <stdio.h> // vsprintf -#include <malloc.h> - -#include <assert.h> -#include <tchar.h> - -__inline void DebugPrint( IN LPCTSTR msg, IN ... ) -{ - TCHAR buffer[256]; - int res; - va_list args; - - va_start( args, msg ); -#pragma prefast(suppress: 28719, "Yes, we all know _vsnprintf is banned in drivers, this is user level"); - res = _vsntprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), msg, args); - if (res >= 0) - { - OutputDebugString( buffer ); - } - else - { - TCHAR *p; - int count; - - count = 512; - for (;;) { - p = (TCHAR *)malloc(count * sizeof (TCHAR)); - if (!p) { - OutputDebugString(_T("Out of memory for debug message!\n")); - break; - } - res = _vsntprintf(p, count, msg, args); - if (res >= 0) - break; - - free(p); - count += 256; - } - if (p) { - OutputDebugString( p ); - free(p); - } - } - va_end(args); -} - -#define DBGPRINT(_x_) DebugPrint _x_ -#define ASSERT assert - -#else - -#define DBGPRINT(_x_) -#define ASSERT - -#endif // DBG - -#endif diff --git a/src/win32stubagent/XService.cpp b/src/win32stubagent/XService.cpp deleted file mode 100644 index 1fbb138..0000000 --- a/src/win32stubagent/XService.cpp +++ /dev/null @@ -1,1044 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <windows.h> -#include <shlobj.h> -#include <process.h> -#include "powrprof.h" -#include <winuser.h> -#include "stdafx.h" -#include "XSAccessor.h" -#include "WMIAccessor.h" -#include "XService.h" - -#include "messages.h" - -#include <setupapi.h> -#include <cfgmgr32.h> -#include <initguid.h> -#include <devguid.h> -#include <wintrust.h> -#include <shellapi.h> - -#ifdef _WIN64 -#define XENTOOLS_INSTALL_REG_KEY "SOFTWARE\\Wow6432Node\\Citrix\\XenTools" -#define XENTOOLS_INSTALL_REG_KEY64 "SOFTWARE\\Citrix\\XenTools" -#else -#define XENTOOLS_INSTALL_REG_KEY "SOFTWARE\\Citrix\\XenTools" -#endif - -SERVICE_STATUS ServiceStatus; -SERVICE_STATUS_HANDLE hStatus; - -static HANDLE hServiceExitEvent; -static ULONG WindowsVersion; -static BOOL LegacyHal = FALSE; -static HINSTANCE local_hinstance; - -HANDLE eventLog; -#define SIZECHARS(x) (sizeof((x))/sizeof(TCHAR)) - -// Internal routines -static DWORD WINAPI ServiceControlHandler(DWORD request, DWORD evtType, - LPVOID, LPVOID); -static void ServiceControlManagerUpdate(DWORD dwExitCode, DWORD dwState); -static void WINAPI ServiceMain(int argc, char** argv); -static void GetWindowsVersion(); - -void PrintError(const char *func, DWORD err) -{ - LPVOID lpMsgBuf; - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - err, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, - NULL); - OutputDebugString((LPTSTR)lpMsgBuf); - XsLog("%s failed: %s (%x)", func, lpMsgBuf, err); - XenstorePrintf("control/error", "%s failed: %s (%x)", func, lpMsgBuf, err); - LocalFree(lpMsgBuf); -} - -void PrintError(const char *func) -{ - PrintError(func, GetLastError()); -} - -void PrintUsage() -{ - printf("Usage: xenservice [-u]\n"); - - printf("\t -u: uninstall service\n"); -} - - - -struct watch_event { - HANDLE event; - void *watch; -}; - -static void -ReleaseWatch(struct watch_event *we) -{ - if (we == NULL) - return; - if (we->event != INVALID_HANDLE_VALUE) - CloseHandle(we->event); - if (we->watch) - XenstoreUnwatch(we->watch); - free(we); -} - -static char * InitString(const char * inputstring) -{ - char *outputstring = (char *)calloc((strlen(inputstring)+1),sizeof(char)); - if (outputstring == NULL) - goto failalloc; - strcpy(outputstring, inputstring); - return outputstring; - -failalloc: - XsLog(__FUNCTION__ " : Fail malloc"); - return NULL; -} - -static void FreeString(const char *string) -{ - free((void *)string); -} - -static char* PrintfString(const char *fmt, ...){ - va_list l; - va_start(l, fmt); - int numchars = _vscprintf(fmt, l); - char *outputstring = (char *)calloc(numchars + 1, sizeof(char)); - - if (outputstring == NULL) - return NULL; - - _vsnprintf(outputstring, numchars, fmt, l); - return outputstring; -} - -static struct watch_event * -EstablishWatch(const char *path, HANDLE errorevent) -{ - struct watch_event *we; - DWORD err; - XsLog("Establish watch %s",path); - we = (struct watch_event *)malloc(sizeof(*we)); - if (!we) { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return NULL; - } - memset(we, 0, sizeof(*we)); - we->watch = NULL; - we->event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (we->event != INVALID_HANDLE_VALUE) - we->watch = XenstoreWatch(path, we->event, errorevent); - if (we->watch == NULL) { - OutputDebugString("Watch is null\n"); - err = GetLastError(); - ReleaseWatch(we); - SetLastError(err); - return NULL; - } - return we; -} - -struct watch_feature { - struct watch_event *watch; - const char *feature_flag; - const char *name; - BOOL (*handler)(void *); - void *ctx; -}; - -#define MAX_FEATURES 10 -struct watch_feature_set { - struct watch_feature features[MAX_FEATURES]; - unsigned nr_features; -}; - -static BOOL -AddFeature(struct watch_feature_set *wfs, const char *path, - const char *flag, const char *name, - BOOL (*handler)(void *), void *ctx, HANDLE errorevent) -{ - unsigned n; - if (wfs->nr_features == MAX_FEATURES) - goto failfeatures; - - n = wfs->nr_features; - - wfs->features[n].watch = EstablishWatch(path, errorevent); - if (wfs->features[n].watch == NULL) - goto failwatch; - - wfs->features[n].feature_flag = flag; - wfs->features[n].handler = handler; - wfs->features[n].ctx = ctx; - wfs->features[n].name = InitString(name); - if (wfs->features[n].name == NULL) - goto failname; - wfs->nr_features++; - return true; - -failname: - PrintError("Failed to allocate string"); -failwatch: - PrintError("EstablishWatch() for AddFeature()"); -failfeatures: - XsLog("Too many features"); - PrintError("Too many features!", ERROR_INVALID_FUNCTION); - return false; -} - -static void RemoveFeatures(struct watch_feature_set *wfs) { - unsigned x; - for (x = 0; x < wfs->nr_features; x++) { - ReleaseWatch(wfs->features[x].watch); - wfs->features[x].watch = NULL; - FreeString(wfs->features[x].name); - XenstoreRemove(wfs->features[x].feature_flag); - } - wfs->nr_features = 0; -} - -static BOOL -AdvertiseFeatures(struct watch_feature_set *wfs) -{ - unsigned x; - for (x = 0; x < wfs->nr_features; x++) { - if (wfs->features[x].feature_flag != NULL) - if (XenstorePrintf(wfs->features[x].feature_flag, "1")){ - XsLog("Failed to advertise %s",wfs->features[x].name); - } - } - return true; -} - - -void ServiceUninstall() -{ - SC_HANDLE hSvc; - SC_HANDLE hMgr; - - hMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - - if ( hMgr ) - { - hSvc = OpenService(hMgr, SVC_NAME, SERVICE_ALL_ACCESS); - - if (hSvc) - { - // try to stop the service - if ( ControlService( hSvc, SERVICE_CONTROL_STOP, &ServiceStatus ) ) - { - printf("Stopping %s.", SVC_DISPLAYNAME); - Sleep( 1000 ); - - while ( QueryServiceStatus( hSvc, &ServiceStatus ) ) - { - if ( ServiceStatus.dwCurrentState == SERVICE_STOP_PENDING ) - { - printf("."); - Sleep( 1000 ); - } - else - break; - } - - if ( ServiceStatus.dwCurrentState == SERVICE_STOPPED ) - printf("\n%s stopped.\n", SVC_DISPLAYNAME ); - else - printf("\n%s failed to stop.\n", SVC_DISPLAYNAME ); - } - - // now remove the service - if ( DeleteService(hSvc) ) - printf("%s uninstalled.\n", SVC_DISPLAYNAME ); - else - printf("Unable to uninstall - %d\n", GetLastError()); - - CloseServiceHandle(hSvc); - - } - else - printf("Unable to open service - %d\n", GetLastError()); - - CloseServiceHandle(hMgr); - } - else - printf("Unable to open scm - %d\n", GetLastError()); - -} - - -int __stdcall -WinMain(HINSTANCE hInstance, HINSTANCE ignore, - LPSTR lpCmdLine, int nCmdShow) -{ - local_hinstance = hInstance; - - if (strlen(lpCmdLine) == 0) { - SERVICE_TABLE_ENTRY ServiceTable[2]; - ServiceTable[0].lpServiceName = SVC_NAME; - ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; - - ServiceTable[1].lpServiceName = NULL; - ServiceTable[1].lpServiceProc = NULL; - - DBGPRINT(("XenSvc: starting ctrl dispatcher ")); - - // Start the control dispatcher thread for our service - if (!StartServiceCtrlDispatcher(ServiceTable)) - { - int err = GetLastError(); - if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) - { - DBGPRINT(("XenSvc: unable to start ctrl dispatcher - %d", GetLastError())); - } - } - else - { - // We get here when the service is shut down. - } - } else if (!strcmp(lpCmdLine, "-u") || !strcmp(lpCmdLine, "\"-u\"")) { - ServiceUninstall(); - } else { - PrintUsage(); - } - - return 0; -} - -void AcquireSystemPrivilege(LPCTSTR name) -{ - HANDLE token; - TOKEN_PRIVILEGES tkp; - DWORD err; - - LookupPrivilegeValue(NULL, name, &tkp.Privileges[0].Luid); - tkp.PrivilegeCount = 1; - tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - if (!OpenProcessToken(GetCurrentProcess(), - TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, - &token)) { - DBGPRINT(("Failed to open local token.\n")); - } else { - AdjustTokenPrivileges(token, FALSE, &tkp, - NULL, 0, NULL); - err = GetLastError(); - if (err != ERROR_SUCCESS) { - PrintError("AdjustTokenPrivileges", err); - } - } -} - -static void AcquireSystemShutdownPrivilege(void) -{ - AcquireSystemPrivilege(SE_SHUTDOWN_NAME); -} - -enum XShutdownType { - XShutdownPoweroff, - XShutdownReboot, - XShutdownSuspend, - XShutdownS3 -}; - -static BOOL maybeReboot(void *ctx) -{ - char *shutdown_type; - BOOL res; - enum XShutdownType type; - int cntr = 0; - - XsLog("Check if we need to shutdown"); - - if (XenstoreRead("control/shutdown", &shutdown_type) < 0) { - XsLog("No need to shutdown"); - return true; - } - XsLog("Shutdown type %s\n", shutdown_type); - if (strcmp(shutdown_type, "poweroff") == 0 || - strcmp(shutdown_type, "halt") == 0) { - type = XShutdownPoweroff; - } else if (strcmp(shutdown_type, "reboot") == 0) { - type = XShutdownReboot; - } else if (strcmp(shutdown_type, "hibernate") == 0) { - type = XShutdownSuspend; - } else if (strcmp(shutdown_type, "s3") == 0) { - type = XShutdownS3; - } else { - DBGPRINT(("Bad shutdown type %s\n", shutdown_type)); - goto out; - } - - XsLog("Report Shutdown Event"); - /* We try to shutdown even if this fails, since it might work - and it can't do any harm. */ - AcquireSystemShutdownPrivilege(); - - if (eventLog) { - DWORD eventId; - - switch (type) { - case XShutdownPoweroff: - eventId = EVENT_XENUSER_POWEROFF; - break; - case XShutdownReboot: - eventId = EVENT_XENUSER_REBOOT; - break; - case XShutdownSuspend: - eventId = EVENT_XENUSER_HIBERNATE; - break; - case XShutdownS3: - eventId = EVENT_XENUSER_S3; - break; - } - } - - XsLog("Do the shutdown"); - - /* do the shutdown */ - switch (type) { - case XShutdownPoweroff: - case XShutdownReboot: - if (WindowsVersion >= 0x500 && WindowsVersion < 0x600) - { - /* Windows 2000 InitiateSystemShutdownEx is funny in - various ways (e.g. sometimes fails to power off after - shutdown, especially if the local terminal is locked, - not doing anything if there's nobody logged on, etc.). - ExitWindowsEx seems to be more reliable, so use it - instead. */ - /* XXX I don't really understand why - InitiateSystemShutdownEx behaves so badly. */ - /* If this is a legacy hal then use EWX_SHUTDOWN when shutting - down instead of EWX_POWEROFF. */ - /* Similar problem on XP. Shutdown/Reboot will hang until the Welcome - screen screensaver is dismissed by the guest */ -#pragma warning (disable : 28159) - res = ExitWindowsEx((type == XShutdownReboot ? - EWX_REBOOT : - (LegacyHal ? - EWX_SHUTDOWN : - EWX_POWEROFF))| - EWX_FORCE, - SHTDN_REASON_MAJOR_OTHER| - SHTDN_REASON_MINOR_ENVIRONMENT | - SHTDN_REASON_FLAG_PLANNED); -#pragma warning (default: 28159) - if (!res) { - PrintError("ExitWindowsEx"); - return false; - } - else - { - if (XenstoreRemove("control/shutdown")) - return false; - } - } else { -#pragma warning (disable : 28159) - res = InitiateSystemShutdownEx( - NULL, - NULL, - 0, - TRUE, - type == XShutdownReboot, - SHTDN_REASON_MAJOR_OTHER | - SHTDN_REASON_MINOR_ENVIRONMENT | - SHTDN_REASON_FLAG_PLANNED); -#pragma warning (default: 28159) - if (!res) { - PrintError("InitiateSystemShutdownEx"); - return false; - } else { - if (XenstoreRemove("control/shutdown")) - return false; - } - } - break; - case XShutdownSuspend: - if (XenstorePrintf ("control/hibernation-state", "started")) - return false; - /* Even if we think hibernation is disabled, try it anyway. - It's not like it can do any harm. */ - res = SetSystemPowerState(FALSE, FALSE); - if (XenstoreRemove ("control/shutdown")) - { - return false; - } - if (!res) { - /* Tell the tools that we've failed. */ - PrintError("SetSystemPowerState"); - if (XenstorePrintf ("control/hibernation-state", "failed")) - return false; - } - break; - case XShutdownS3: - if (XenstorePrintf ("control/s3-state", "started")) - return false; - res = SetSuspendState(FALSE, TRUE, FALSE); - XenstoreRemove ("control/shutdown"); - if (!res) { - PrintError("SetSuspendState"); - if (XenstorePrintf ("control/s3-state", "failed")) - return false; - } - break; - } - -out: - XenstoreFree(shutdown_type); - return true; -} - -static bool registryMatchString(HKEY hKey, - LPCTSTR lpValueName, - LPCTSTR comparestring, - bool matchcase) -{ - bool result = false; - LONG buffersize = sizeof(TCHAR)*256; - TCHAR *outstring = NULL; - DWORD outstringsize; - LONG status; - do { - outstringsize = buffersize; - outstring = (TCHAR *)realloc(outstring, outstringsize); - - status = RegQueryValueEx(hKey, - lpValueName, - NULL, - NULL, - (LPBYTE) outstring, - &outstringsize); - buffersize *= 2; - } while (status == ERROR_MORE_DATA); - - if (status == ERROR_FILE_NOT_FOUND) - goto done; - - if (matchcase) { - if (_tcsncmp(comparestring, outstring, outstringsize)) - goto done; - } - else { - if (_tcsnicoll(comparestring, outstring, outstringsize)) - goto done; - } - - result = true; - -done: - free(outstring); - - return result; -} - -static bool -adjustXenTimeToUTC(FILETIME *now) -{ - DWORD dwtimeoffset; - long timeoffset; - char *vm; - char *rtckey; - LARGE_INTEGER longoffset; - ULARGE_INTEGER longnow; - size_t vmlen; - - // XenTime is assumed to be in UTC, so we need to remove any - // offsets that are applied to it - - __try { - vmlen = XenstoreRead("vm", &vm); - if (vmlen <= 0) - goto fail_readvm; - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - goto fail_readvm; - } - - rtckey = PrintfString("%s/rtc/timeoffset", vm); - if (rtckey == NULL) - goto fail_rtckey; - - _try { - BOOL rtcreadworked; - __try { - rtcreadworked = XenstoreReadDword(rtckey, &dwtimeoffset); - } - __except(EXCEPTION_EXECUTE_HANDLER) { - rtcreadworked = false; - } - if (!rtcreadworked) { - if (!XenstoreReadDword("platform/timeoffset", &dwtimeoffset)) - goto fail_platformtimeoffset; - } - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - goto fail_platformtimeoffset; - } - timeoffset = (long)dwtimeoffset; - - //Convert offset from seconds to nanoseconds - longoffset.QuadPart = (LONGLONG)timeoffset; - longoffset.QuadPart = longoffset.QuadPart * 10000000; - - // Subtract nanosecond timeoffset from now - longnow.LowPart = now->dwLowDateTime; - longnow.HighPart = now->dwHighDateTime; - longnow.QuadPart -= longoffset.QuadPart; - now->dwLowDateTime = longnow.LowPart; - now->dwHighDateTime = longnow.HighPart; - - FreeString(rtckey); - XsFree(vm); - return true; - -fail_platformtimeoffset: - XsLog("%s: Read platform time offset", __FUNCTION__); - FreeString(rtckey); - -fail_rtckey: - XsLog("%s: Read RTC Key", __FUNCTION__); - XsFree(vm); - -fail_readvm: - XsLog("%s: Read VM Key", __FUNCTION__); - return false; -} - -static bool hosttimeIsUTC() -{ - HKEY InstallRegKey; - bool utc = false; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - XENTOOLS_INSTALL_REG_KEY, - 0, - KEY_ALL_ACCESS, - &InstallRegKey) != ERROR_SUCCESS) - goto fail_registrykey; - -#ifdef _WIN64 - - if (registryMatchString(InstallRegKey, "HostTime", "UTC", false)) - { - utc = true; - goto done; - } - - RegCloseKey(InstallRegKey); - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - XENTOOLS_INSTALL_REG_KEY64, - 0, - KEY_ALL_ACCESS, - &InstallRegKey) != ERROR_SUCCESS) - goto fail_registrykey; - -#endif - - if (registryMatchString(InstallRegKey, "HostTime", "UTC", false)) - { - utc=true; - } - -#ifdef _WIN64 -done: -#endif - RegCloseKey(InstallRegKey); - return utc; - -fail_registrykey: - XsLog("%s: Open Registry Key", __FUNCTION__); - - return false; -} - -static void -setTimeToXenTime(void) -{ - FILETIME now = {0}; - SYSTEMTIME sys_time; - SYSTEMTIME current_time; - bool utc=false; - XsLog("Set time to XenTime"); - - GetXenTime(&now); - if ((now.dwLowDateTime == 0) && (now.dwHighDateTime == 0)) { - XsLog("Cannot set system time to xentime, unable to contact WMI"); - goto fail_readtime; - } - - utc = hosttimeIsUTC(); - - if (utc) { - XsLog("Try UTC"); - if (!adjustXenTimeToUTC(&now)) - goto fail_adjusttime; - } - - if (!FileTimeToSystemTime(&now, &sys_time)) { - XsLog("Gould not convert file time to system time"); - PrintError("FileTimeToSystemTime()"); - DBGPRINT(("FileTimeToSystemTime(%x.%x)\n", - now.dwLowDateTime, now.dwHighDateTime)); - } else { - GetLocalTime(¤t_time); - XsLog("Time is now %d.%d.%d %d:%d:%d.%d", - current_time.wYear, current_time.wMonth, current_time.wDay, - current_time.wHour, current_time.wMinute, current_time.wSecond, - current_time.wMilliseconds); - XsLog("Set time to %d.%d.%d %d:%d:%d.%d", - sys_time.wYear, sys_time.wMonth, sys_time.wDay, - sys_time.wHour, sys_time.wMinute, sys_time.wSecond, - sys_time.wMilliseconds); - if (utc) { - if (!SetSystemTime(&sys_time)) - PrintError("SetSystemTime()"); - } - else { - if (!SetLocalTime(&sys_time)) - PrintError("SetLocalTime()"); - } - } - - return; - -fail_adjusttime: - XsLog("%s: Adjust time", __FUNCTION__); - -fail_readtime: - XsLog("%s: ReadTime", __FUNCTION__); -} - -/* We need to resync the clock when we recover from suspend/resume. */ -static void -finishSuspend(void) -{ - DBGPRINT(("Coming back from suspend.\n")); - setTimeToXenTime(); -} - - - -// -// Main loop -// -BOOL Run() -{ - bool exit=false; - PCHAR pPVAddonsInstalled = NULL; - - HANDLE suspendEvent; - - int cntr = 0; - struct watch_feature_set features; - BOOL snap = FALSE; - - OutputDebugString("Trying to connect to WMI\n"); - while (!ConnectToWMI()) { - OutputDebugString("Unable to connect to WMI, sleeping\n"); - if (WaitForSingleObject(hServiceExitEvent, 1000*10) == WAIT_OBJECT_0) { - exit = true; - return exit; - } - } - while (InitXSAccessor()==false) { - OutputDebugString("Unable to initialise WMI session, sleeping\n"); - if (WaitForSingleObject(hServiceExitEvent, 1000*10) == WAIT_OBJECT_0) { - exit = true; - return exit; - } - } - XsLog("Guest agent lite main loop starting"); - - if (eventLog == NULL) - XsLog("Event log was not initialised"); - - setTimeToXenTime(); - - memset(&features, 0, sizeof(features)); - - HANDLE wmierrorEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - if (!wmierrorEvent) { - PrintError("CreateEvent() wmierrorEvent"); - return exit; - } - - - XsLog("About to add feature shutdown"); - if (!AddFeature(&features, "control/shutdown", "control/feature-shutdown", - "shutdown", maybeReboot, NULL, wmierrorEvent)) { - return exit; - } - - suspendEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - if (!suspendEvent) { - PrintError("CreateEvent() suspendEvent"); - return exit; - } - - if (ListenSuspend(suspendEvent, wmierrorEvent) < 0) { - PrintError("ListenSuspend()"); - CloseHandle(suspendEvent); - suspendEvent = NULL; - return exit; - } - - - XsLog("About to advertise features"); - AdvertiseFeatures(&features); - - XsLog("About to kick xapi "); - XenstoreKickXapi(); - - while (1) - { - DWORD status; - int nr_handles = 1; - HANDLE handles[3 + MAX_FEATURES]; - unsigned x; - - handles[0] = hServiceExitEvent; - if (wmierrorEvent) - handles[nr_handles++] = wmierrorEvent; - if (suspendEvent) - handles[nr_handles++] = suspendEvent; - for (x = 0; x < features.nr_features; x++) - handles[nr_handles++] = features.features[x].watch->event; - - XsLog("win agent going to sleep"); - status = WaitForMultipleObjects(nr_handles, handles, FALSE, INFINITE); - XsLog("win agent woke up for %d", status); - - /* WAIT_OBJECT_0 happens to be 0, so the compiler gets shirty - about status >= WAIT_OBJECT_0 (since status is unsigned). - This is more obviously correct than the compiler-friendly - version, though, so just disable the warning. */ - -#pragma warning (disable: 4296) - if (status >= WAIT_OBJECT_0 && - status < WAIT_OBJECT_0 + nr_handles) -#pragma warning (default: 4296) - { - HANDLE event = handles[status - WAIT_OBJECT_0]; - if (event == hServiceExitEvent) - { - XsLog("service exit event"); - exit = true; - break; - } - else if (event == suspendEvent) - { - if (!ReportEvent(eventLog, EVENTLOG_SUCCESS, 0, EVENT_XENUSER_UNSUSPENDED, NULL, 0, 0, - NULL, NULL)) { - XsLog("Cannot send to event log %x",GetLastError()); - } - XsLog("Suspend event"); - finishSuspend(); - AdvertiseFeatures(&features); - XenstoreKickXapi(); - XsLog("Handled suspend event"); - } - else if (event == wmierrorEvent) - { - ReportEvent(eventLog, EVENTLOG_SUCCESS, 0, EVENT_XENUSER_WMI, NULL, 0, 0, - NULL, NULL); - break; - } - else - { - BOOL fail = false; - for (x = 0; x < features.nr_features; x++) { - if (features.features[x].watch->event == event) { - XsLog("Fire %p",features.features[x].name); - XsLog("fire feature %s", features.features[x].name); - OutputDebugString("Event triggered\n"); - if (!(features.features[x].handler(features.features[x].ctx))) - { - XsLog("Firing feature failed"); - PrintError("Feature failed"); - fail = true; - } - XsLog("fired feature %s", - features.features[x].name); - } - } - if (fail) { - XsLog("Resetting"); - ReportEvent(eventLog, EVENTLOG_SUCCESS, 0, EVENT_XENUSER_UNEXPECTED, NULL, 0, 0, - NULL, NULL); - break; - } - } - } - else - { - PrintError("WaitForMultipleObjects()"); - break; - } - } - OutputDebugString("WMI Watch loop terminated\n"); - RemoveFeatures(&features); - XenstoreKickXapi(); - - XsLog("Guest agent lite loop finishing"); - ReleaseWMIAccessor(&wmi); - - - - - XsLog("Guest agent lite loop finished %d", exit); - return exit; -} - - -// Service initialization -bool ServiceInit() -{ - ServiceStatus.dwServiceType = SERVICE_WIN32; - ServiceStatus.dwCurrentState = SERVICE_START_PENDING; - ServiceStatus.dwControlsAccepted = - SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | - SERVICE_ACCEPT_SESSIONCHANGE; - ServiceStatus.dwWin32ExitCode = 0; - ServiceStatus.dwServiceSpecificExitCode = 0; - ServiceStatus.dwCheckPoint = 0; - ServiceStatus.dwWaitHint = 0; - - hStatus = RegisterServiceCtrlHandlerEx( - "XenService", - ServiceControlHandler, - NULL); - if (hStatus == (SERVICE_STATUS_HANDLE)0) - { - // Registering Control Handler failed - DBGPRINT(("XenSvc: Registering service control handler failed - %d\n", GetLastError())); - return false; - } - - ServiceStatus.dwCurrentState = SERVICE_RUNNING; - SetServiceStatus (hStatus, &ServiceStatus); - - return true; -} - -void WINAPI ServiceMain(int argc, char** argv) -{ - // Perform common initialization - eventLog = RegisterEventSource(NULL, "xensvc"); - hServiceExitEvent = CreateEvent(NULL, false, false, NULL); - if (hServiceExitEvent == NULL) - { - DBGPRINT(("XenSvc: Unable to create the event obj - %d\n", GetLastError())); - return; - } - - if (!ServiceInit()) - { - DBGPRINT(("XenSvc: Unable to init xenservice\n")); - return; - } - BOOL stopping; - - do { - - __try - { - stopping = Run(); - - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - __try { - XsLog("Exception hit %x", GetExceptionCode()); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - } - stopping = false; - } - } while (!stopping); - - XsLog("Guest agent service stopped"); - ShutdownXSAccessor(); - DeregisterEventSource(eventLog); - ServiceControlManagerUpdate(0, SERVICE_STOPPED); - return; -} - -void ServiceControlManagerUpdate(DWORD dwExitCode, DWORD dwState) -{ - ServiceStatus.dwWin32ExitCode = dwExitCode; - ServiceStatus.dwCurrentState = dwState; - SetServiceStatus (hStatus, &ServiceStatus); -} - -// Service control handler function -static DWORD WINAPI ServiceControlHandler(DWORD request, DWORD evtType, - LPVOID eventData, LPVOID ctxt) -{ - UNREFERENCED_PARAMETER(ctxt); - UNREFERENCED_PARAMETER(eventData); - - switch(request) - { - case SERVICE_CONTROL_STOP: - DBGPRINT(("XenSvc: xenservice stopped.\n")); - ServiceControlManagerUpdate(0, SERVICE_STOP_PENDING); - SetEvent(hServiceExitEvent); - return NO_ERROR; - - case SERVICE_CONTROL_SHUTDOWN: - DBGPRINT(("XenSvc: xenservice shutdown.\n")); - ServiceControlManagerUpdate(0, SERVICE_STOP_PENDING); - SetEvent(hServiceExitEvent); - return NO_ERROR; - - default: - DBGPRINT(("XenSvc: unknown request.")); - break; - } - - ServiceControlManagerUpdate(0, SERVICE_RUNNING); - return ERROR_CALL_NOT_IMPLEMENTED; -} diff --git a/src/win32stubagent/XService.h b/src/win32stubagent/XService.h deleted file mode 100644 index 32ee163..0000000 --- a/src/win32stubagent/XService.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef _XSERVICE_H -#define _XSERVICE_H - -#include <version.h> - -#define SVC_NAME "xensvc" -#define SVC_DISPLAYNAME PRODUCT_NAME_STR ## "Interface Service" -#define SVC_DESC "Monitors and provides various metrics to XenStore" - -void PrintError(const char *func); -void PrintError(const char *func, DWORD err); -void StartClipboardSync(void); -void FinishClipboardSync(void); -void ClipboardConsoleChanged(void); - -void XsDumpLogThisThread(void); -void XsInitPerThreadLogging(void); -void XsLogMsg(const char *fmt, ...); -void DoVolumeDump(void); - -void AcquireSystemPrivilege(LPCTSTR name); - -#endif diff --git a/src/win32stubagent/errors.cpp b/src/win32stubagent/errors.cpp deleted file mode 100644 index caf47cc..0000000 --- a/src/win32stubagent/errors.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* Black-box data recorder. This records stuff which is happening - while the agent runs, and tries to push it out to dom0 syslog if we - crash. */ -#include "stdafx.h" -#include <windows.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include "XService.h" -#include "XSAccessor.h" - - -#define RING_SIZE 8192 - -struct message_ring { - HANDLE handle; - unsigned prod_idx; - unsigned cons_idx; - unsigned char payload[RING_SIZE]; -}; - -static __declspec(thread) struct message_ring message_ring; - -static char * -Xsvasprintf(const char *fmt, va_list args) -{ - char *work; - int work_size; - int r; - - work_size = 32; - while (1) { - work = (char *)malloc(work_size); - if (!work) - return work; - r = _vsnprintf(work, work_size, fmt, args); - if (r == 0) { - free(work); - return NULL; - } - if (r != -1 && r < work_size) { - return work; - } - free(work); - work_size *= 2; - } -} - -static char * -Xsasprintf(const char *fmt, ...) -{ - va_list args; - char *res; - - va_start(args, fmt); - res = Xsvasprintf(fmt, args); - va_end(args); - return res; -} - -void -XsLogMsg(const char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - XsLog(fmt, args); - va_end(args); -} - - diff --git a/src/win32stubagent/messages.mc b/src/win32stubagent/messages.mc deleted file mode 100644 index 0289c44..0000000 --- a/src/win32stubagent/messages.mc +++ /dev/null @@ -1,66 +0,0 @@ -SeverityNames=(Informational=0x1) -FacilityNames=(XenUser=0xd60) - -MessageId=0x0001 -Facility=XenUser -Severity=Informational -SymbolicName=EVENT_XENUSER_POWEROFF -Language=English -The tools requested that the local VM shut itself down. -. - -MessageId=0x0002 -Facility=XenUser -Severity=Informational -SymbolicName=EVENT_XENUSER_REBOOT -Language=English -The tools requested that the local VM reboot. -. - -MessageId=0x0003 -Facility=XenUser -Severity=Informational -SymbolicName=EVENT_XENUSER_HIBERNATE -Language=English -The tools requested that the local VM hibernate itself. -. - -MessageId=0x0004 -Facility=XenUser -Severity=Informational -SymbolicName=EVENT_XENUSER_S3 -Language=English -The tools requested that the local VM enter power state S3. -. - -MessageId=0x0005 -Facility=XenUser -Severity=Informational -SymbolicName=EVENT_XENUSER_WMI -Language=English -The tools noticed that WMI became non-functional. -. - -MessageId=0x0006 -Facility=XenUser -Severity=Informational -SymbolicName=EVENT_XENUSER_STARTED -Language=English -The tools initiated. -. - -MessageId=0x0007 -Facility=XenUser -Severity=Informational -SymbolicName=EVENT_XENUSER_UNSUSPENDED -Language=English -The tools returned from suspend. -. - -MessageId=0x0008 -Facility=XenUser -Severity=Informational -SymbolicName=EVENT_XENUSER_UNEXPECTED -Language=English -The tools experienced an unexpected error. -. diff --git a/src/win32stubagent/stdafx.cpp b/src/win32stubagent/stdafx.cpp deleted file mode 100644 index 72ced79..0000000 --- a/src/win32stubagent/stdafx.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -// stdafx.cpp : source file that includes just the standard includes -// XenService.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/src/win32stubagent/stdafx.h b/src/win32stubagent/stdafx.h deleted file mode 100644 index 391a848..0000000 --- a/src/win32stubagent/stdafx.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - - -#include <iostream> -#include <tchar.h> - -// TODO: reference additional headers your program requires here diff --git a/src/win32stubagent/w32xagent.rc b/src/win32stubagent/w32xagent.rc deleted file mode 100644 index 78e5cc7..0000000 --- a/src/win32stubagent/w32xagent.rc +++ /dev/null @@ -1,60 +0,0 @@ -/* Copyright (c) Citrix Systems Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - - -#include <windows.h> -#include <ntverp.h> - -#undef VER_COMPANYNAME_STR -#undef VER_PRODUCTNAME_STR -#undef VER_PRODUCTVERSION -#undef VER_PRODUCTVERSION_STR - -#include <version.h> - -#define VER_COMPANYNAME_STR VENDOR_NAME_STR -#define VER_LEGALCOPYRIGHT_STR "Copyright (c) Citrix Systems Inc." - -#define VER_PRODUCTNAME_STR "XENIFACE" -#define VER_PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,MICRO_VERSION,BUILD_NUMBER -#define VER_PRODUCTVERSION_STR MAJOR_VERSION_STR "." MINOR_VERSION_STR "." MICRO_VERSION_STR "." BUILD_NUMBER_STR - -#define VER_INTERNALNAME_STR "w32xagent.exe" -#define VER_FILEVERSION_STR "1.0" -#define VER_FILEDESCRIPTION_STR "w32agent" -#define VER_ORIGINALFILENAME_STR "w32xagent.exe" -#define VER_FILETYPE VFT_APP -#define VER_FILESUBTYPE 0 - -xen_icon ICON "xen.ico" - -#include "common.ver" -#include "messages.rc" \ No newline at end of file diff --git a/src/win32stubagent/xen.ico b/src/win32stubagent/xen.ico deleted file mode 100644 index 844c993ba290e5055a8900ca8786ea0e031138a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25214 zcmeHv30zgh`}eRfDyxbp%LPP0P*D&;Ku|!*C70CP%6&KYl**FK5>3So1>E;F_XT$} zv_#yu(o#fox2%4ZmHNETcg{JNdoN(xr{DX&|IfeC@0poro^94MXU@3@VJ7TEXs8p% zmSTXl5OakPI-QcgV=lxqra3t&`9L!vZrKUu7tC)f);I{^P!9ZR-d2d6?%-GQ1FVF2 z(^uoyi8cO091YO;InR7UTWS0{F~CxY%5Mr0$Ud+M(SrfM5K@&$rj0MDT*#EvR3+jo zCmE?CH#e6HNd6Z@NHO>yNVxoEuo*kH6rQnTQ_|ALjva1XWHUA`ZDL|#TG}LInUu7| z#FhmGiHXT+h7vXt6AP4(mpG|dlTC_7E-1)LF4mMXk#%SxPp`?wkjzFjO$J&Zl$WfS zHeuHb*i6(^t8t#9D5a$dy+A4|p+;3yLJeDnqLh}WxV>pAl%=Z)C}Q=XKV~u*5W@h} zXaagVE0XF}0Yp>5uhFHZse1Nex+JA*?8S5`pjQLBT3ZNkklsj#v{q0Gq*WujtdrtR zDfE(h6n;%0dAQbWU#f<s1%17gCewRVOqcA^CkPbNQP(F*!*YQsT?(*IOjjx_)vy9p zliDwe)hA3>y9jj6QBc(YHB4`*<+V6b4j`@NG^*@gDNsz2DXFFuMT#2sw0Ks4UmMS+ zmNj-3Fm$PSzKF8s7i-c?7|lo4RQmiCWzBaXN?#u^$Bow$rMs~fJ&se>Bw;4w$3nzm zjd~=6H{wDe91*7qVS$)6nepWr$H+WEJYEPEW5ME>#aV$6g@_%C<6PuzgwWzt<Sls3 z{EHaHydW##IdLjDUO-<i_ze6gMBczp&41H+Y4z3W&rKlPL*G8ENVb>Oep-8y+P-Rg z<36Kf#51(}jNp4-=^<5VAil3~ioyRt;>+K=&lryd8|9wDnw5~E+)IY5*|8H7TjCxv zNg>#zaSkC_PP5|ap-c>ed71|X)4budl<O_e{iy{7yb?@R*9#t+Q?Vjw>jx(vV<FJ; zNT*35HXzk80mYc%GLPj%UC<SC=_T`W2~_#zG6Vs2J!E!Pq4@*f<eD~>?V&nc_5_#5 zYM$9ymTgYt3Y*lgMEy<M!?gW`Y5NM3_Q$Fq@AX>$@XVHb0=2sk756V%Mh>}D3!dI) z#N&57h9rh(ArDm`mjzOJ))+!4vkfy%55sb#b6KuX)d79b3;lAa!yYd!80St59YY)E zshlo7q+)PmU@H+{Ir)O)oa>Ahu^FA1*o+gSTk?2mCTuw3#BePhed=*R`jdiYqYLOU z_aevKkp+mEAY<9vpg%c9Q=4gWTCC~S+d*5ixyM-RY<OM6+QTgdlohmc@InT%#`{iN zMU?lu`k?g!6Z$dUs^TL0g@uWJ{rZXV<Hw6B9zvx1Sc!Chdojn)Ow11uVnMLA$f#LC zOb>Dvvujrp)9ZSP`E^}HW`vhmRZEDqb%fYZSBNd)LgYl5iHz8qVpC&Rk=-mp97?bh z`R(jQQ9B{d_I43h##R+yycI4cw{9wybx067!<vb8{kw=Pw!i&@(c(sW4RL>6n3y>w zO=M+diKR=IidCytiM4Cjij5mLiru?+ivtG^hypIVkh4RsTSt!`6~~Sp6DLlb5T{R{ z7U$2O7hiw<wYYlqs<?6EhPZX>mbiQOu6Xd^f%x&qAH^@f{33q;{de)~nOuGKP4jQ! z-xm1a&;q=Y|39dvl|H<HapnyS3=HDH5oew&!sV7h{=VMco*o{a-rm0cL6*-Gv9b&a z^!4(p5uk<|UY@>zA(my>VBO5EXI5ltc=-mhjZ(Z~PfBn@h9%gm5(2E;+eEkORe+Z_ zn=lbzcIiru5`it$@H7=*c25INFBuF7CIVphLb1YVe3f)#0jnTyjmOg@XmszO;wo4L z`g$^5;jCs96dDSB12qBmrkbSdIjhQ`&nkubI<xv}o(&tu$bSuk6=uHHi%~)p1U;+i z4Oj(MWkS3b>Zk(28iDhWsH!?-W$7z9;<WOp$}+^Lc~!h>Rn>r1P!%RIi(Vimm~-JO zdz>Q8ELD^yvhr6beAO((hg8<QQQ0MnKU&Dj(yx*}=mi>R#`Hy;@Iwu(0(}f<8k;6) zP*kaskIG-sFld}Ijx#K&sPG3>aWx7C0#QZ<uCl^bK`tgiYsmQc5R(!#P)YufVheSQ z1r&ZKd*e{7KR&*JVUd&M4|KP;mul3a2F2<*6%!0H%I)plmG)u&avW6lI!5fA2|<A@ zSNW^k**S6E&W`DJ`hK<3cSX3pot-SNE=QbIAoDvpmA69(*0_+-EX4%dm3MNovy<%H zKn`}!&Me@-dbGNNy;vYFm=)SNsN*eAXYK6f?Cjv+P(Dgk8E0c>XUotm#Mg6nw$>^7 zc?4NIySqc8p2lu%XJcb+V`F2hxfdVhY^}00zs|wO$K6fZs8FGTovp211sjH~E$18@ zoSog=+<hu&>Ul&5TD$wH5{?cI%%lYe2S<h5$K6^#-(kSf&rgwXb9OWgteSQE`1v{N z)nm>Cx%v3}L&TjcVi-6NZhv<-rE!#HmpyXy^XC8~kkJC?n3?I0#oj=K1>F2XApt88 zl7W*7&CQry69^4eWF(V%VVYkFb}69q<1#JyYYAr8nQB*D3evgz*G15?BIEC-EA4*7 z7Wl@iNq`X{)Zbl)+py9srdO^t_k^x`XlUK~_1Q{w&IFd`izbMhdr+Xx!ou9l%-q64 z$C>BduVpn}W<Q|VVU=po>>9@Md6u_9#c{49wng+zJzsgGo?jKJ=U1uxNQiP)g7Ygp zIpF+Cp5t)L&#dzNipAvll@=Ew@2#Fw@wreg@&<7#^8D;(8iS1UCmH^MI2DRYv6BnB zfj?Tl5OnritA`eA_0;OEwF5VSa;}%Ewo{?nZY&tbh5B|SrJeDds$;}6@E%46OC^$5 zgXh#ao|Ymb$VFuE^XB46Pq8oDO6+V<LF|sO6T6}u#kz)-#hM0H#ExiJF}+bOaVXMK z9E-6O2b#EwU5VaeS$uV|`qesOXS3=er&Wm9@>+=4)Gk`=c|A&;Y-}aYHnS0DlWoPt zHumD%Hjd&-S4WZG+(qQI_YxO6xQcJvIx)>jobKQ$9<($Qg>4<h?XKm--7faxDnHW} z4s;dw2DylvW2%Vz?^Y4{-GjxxH{!+Kx4Md{!}^KC!(JDkkM1t=#`Y3<?+p-lQa!}& zk96YBCpz(9Ms@LEez3?-eM@}t;c#(c+6Q9Bj2UA6`t@SdrcGk==FMW~&Ykj^_spD$ z;%w$*aemPZadGJ!@zu&K`TU!gmnY7hJEwo{{pOo*#P#df#dqI*C!c%2|Ni@bpL-34 z*1yUB87=TnKc~jZP)6NjV?%5CSFi40D>OE?Bui|lPe9F(29c2sLTUzhgqm{1`qgL< zr4J1P{EQi5eIg=dh*F}+`aXsXvHtZVj6#Em`X0p$vAW<=f=*+I^$z44sC-n$MFu7W zdaDef9-eIxTKnRG$+vMk4sAK*5h|-0>%|W_?PX|$=N*|sqMDaf5bKU78-*dcYSq?A zwUab=Ssq$N28E$jvMg3eRbU{t5^peNP&jbaD3w@2EbsKxpfPB92S=1USXot2|F@DH z?X;|w1Imkwt(5Zi?Hg$vC@-gO0&J|LZ&F3Fq}h~1xeM=KWoRUeY~;1Iq_}Xo2(`7g zE@xwH-B=b_TU*PxT_aA(28`uBJ3>3q+aV<x+BYr-^=tsUcqgaUvRo#e6owXdvRs6^ z8a++vGp<Vih*)R0+NA_HXGNSXIAf1y8uZ0*p<Y9i5N5AQOCK%kB^ZTpOT%K;VBy>_ zCLyV5v!+d(CdNcNTNoEJL#VlP<vP(ZG0}A@JDZo7A83cz(DK;tl`nOE!3$<VkV*YT z*`M+CQ5;dKjoe1?-h+4_GX4>7Eed&?k*mCWa7^W`hX$eSp0IN=f>w?=SCuPd9nb}x z&@H!sYzsEAPjO=C82Wt*_9j{|*r&{{=_pplx{75{9%5q?Z?UbJn>f(ML+tNdP3&pm zE4H?-C%){c6DPX*iu~6DMSiC`;=~(~;(UJ}aekz)xH7^|Tpw3M9PXJYP7X*GXZkh~ z=SIFJ?tL00_Uzds4jw!x@AH=~U6S|phYuf$pMU;Y{QB#!|DI=S{qb-7ZwvfiZUOy1 z#Y_gxx|x}clbf59jhV7sn3=mMM-DFLa?LO=KC}YCjE^|9;AkeytQ@_)t2#QmdwcW2 zhLxF_wPQJ*&ePpn=UvXRoVA%5&X#l>ym8C1SMudNb-HS5-nM-C^6p^p<b<u6nI#{l z=yZV2y@Dkh;3F6<RDgYp;zK|S>7YeL<wUZg%rb|WoonUFu6AZ9mBFCCc=w2Rka!oF z$_zkRK`RF@WFU)m7B{>e3^SqQE9>x=(LZwGBP(-;CBueMo>7V6$?#(YFmRxVV>|$9 z&`<^*@InT%&{5_W7XOH|21;OyVa0%bH%4_vT}A@qbw)2nKgLMLJ1UR{4Q1c~FJvGK z9nb}x|FwERHv?@2TkebyMlz$<tFOK~uS=IMU%c_g8<!ZDd-v}BW8c1gp8%Zxsav;h z-!lD5=gyr^wrbUCHOqX$co(t^=zuQhgzkU5KUk*)1IM5^iw|Nn=RMnE_UQtA95G_V z(+LwMJexduvc#M@b0|AITLNi~4j%Bb%u}w@Ro;Z>u&zlA^iOjJbi)R0Sr~Nt-%7F$ zGX~njfuUo>v)}W%O@GjQhJWj(q|lysJ5v6jFp0}uT!`P#OCYV$!2@2%Xm#n;tJlw5 zkG-sVGGj1oaL_Se6Ski-^UJOl%VE4=Ogb|H*v5N3d-g1Z-|6Y;&z8-aOt~YH=*pm~ zbZdMyx;rnB?yss#4>w29_dBBK`<!Trhn#-6DT3~=45hmn0d(vAs&r+5yOf0v=z`Af z-Mimy*|OzEwl#r)IfD5P+b=yYSO&ghZNNGa!hOAK@ZiBuFb<Zo%|m07=thbg-N_81 z2OH|s!|m)N{6xGBh%|v(1|BYdus)pbWCT*t=t^|x?IeOu=w=&Fd5)ZCn^PHmV4DFS z;L8imZRW$6L7gEN#_e(f?SnqwKRk&FM^>WSbA#wU`|yC<^}$BQXZ7hmz;(I5AzYTB zTo2Gt#ysGaGU$`FVRU;=09_mEDs{sKY;k*CW81SBBj5uAzQCuy981iDG3VT-O`9e> z&L4~&JND_)nUg91?fP`%V;$XH9!mGtgwefK^%!;O?g}0kOuM_R4&7Z^hwdz?O?MWX zfN3a`Jm6hXSIXX7%{o{YWQsoYqGO}#6KugI<^?|-En#0!2lNBRlHrMFiNVk1SZ6SA z0{ZmnbMO84-+#J<^<5a^NjE<AquUE>N#79Po*zQDvV!T>yqfeK_s4g00_nTifpl|L z0NtEv0;Zu%@-XkM%$js7J6P(_>s$~*MU#B#!XOWV&2i(#JwqMX7xV+h66OPZD|KCB zI>tQKEnSZuJ@U{7&~t9ECtXkTrJET+5;tZA(v2AbR5ab6iaxDQ*C+c?;Upg_{FpIO zN7p8J)3px)FBP0-8p^<PoqdE1WT6APZld1MKPO1?oE@Ol0Y0c>3G)GSTE~EoCFTOt zFm5XIcwdb%2;Wcjtw!IbdQst&>I%3X*CzVVRrc@O4?O9c_dMuI3a=+)-0AY@Ds*{N z75aLF8+|>zaxq45nrSEl4|uP<Q;ohE=fOI>q^@hIJL}f$eEYs9o$Osz_5*xT=kx^j z4*~ZFqjAJ}w0-$bojSdabq4b&cW^j;#Wueg??vCRoh$6?<*`-i>(TD?75j5(Xl1%M zxFTH`;7aHFxzPDO&UCJ~6P@enNauPO0C|ARzyn^$TpV0U>VPijyqr=^+JG(K(r`D* z9TYC_6<C+lwH5b=AovQOwF$s!%x!m`uV=B2Z6BOOXL>r(rIGH8Ds*v}8=Yr+=LS@y zvwdCYOfM%o-QAH+b*n(9x|FAroyyV4j^*e?2YWj4nqBGOGVp*GGLVIiv%Q?9&hrDg zErwK*wqW<-h$^xizQ8BkAK1sq4BV%&*O0HjIF@bC<81iIkt3fho-vv7+LotP9V*lE z_LXT_+e);wwJR-c=|W4IJJaH1CtB3hkrpL7(Bgy&bg;P{ec95QzHGs0Zbe_bQW8g* zwm!j*vg67tXk3A^8#~Z^*0CVTkrp;%y{tR8OGP@>gWIMLw^9F!bf&K><+rgV_=It! z-lwtGz<MP6fMbk%H(qaU;a<3PP!b*MP=OAm^`aYv*XZ``+hyYB&6_lDY(Lr%XG@0@ zEa>wl=A~kDye;kBxQ6(fyE1X<=zjXVLq$6FS~<$^Se}k|aiD^(j&!VjIf75{O<j*B zvA@{!Vc!bhZFnCx2yMTJ>v_1T6&-C?j*hnF{(dK!{&V*R@ppan?CDc^bc9#~2v7d} zleVu|K=Y!?)4oRLbg+?`5%xB+pjiXjOFr-$%4#})`{@VD>m5pmn_1E4&21>Jr7azK z)sFqJmwp^dvLyJX_5t>My%^QuJEJ_;Yv)HFee`rg-z3UyYE6e&$Dw2!nLg6lk8YjF zEz^I^pK~XU)1*e8v@_bA_C^amrpH#HhY#+Tkk{(+l-r{qwHxh^Gp7TME$BcKOFEcn zrTD=<z?XwbRs`R$=i_mHm3_wEyDofZRN`+%|G=8Fvnk)l6Rc<-(Abjp##zuFZohp^ z?CH|VY5F#V?b5=7`}b*5rv%y%VL>^Of>uUYQ{L_!rLjsH`t{<<8MM2h8SRc%uqVb` z+JtTRAbnwfb~ddj*COn_*=IaIB*6EsUAw-Dv9n}i3hj(CryTY-C&q$yaXap6XwEb< z+8N2<vixyf=$A(iON;?+93X!D+i$es!?$T}s1?l^(23B#S|7n_Ee+qV9@$H~;>yvE z20}vGk+#gFZTJ9Ra$+r{efWqmq&@@Te&)$zCkta|<y#$TTZ9>HYoG#Y#@70x7~z8U zcdkPZubeM)JitHrd_3<EJ^JB$rJdC}82bOits9inN=I8+ryd5jq%S7^z(<TBJjb!` zm;-*i=5NFLx~4-IZ4NV|&EbqNL7NOwkMjoD7Ux7)cC3=~S~~cWmp}jbo%Z)jFw$wL z-_SOEQG7BZ_y}L|EXuy)c{+go-vQdH_F=@|JijnL3$vi(Q%BS9zy12$zA$WaE&ciA zkuPk=&?oo^UwICH%f8F|0MCaap1aRhN4pSzxBb%C*EfM4-ngb;V=;a-KTXpZ^LZ;W zX>C2rm$n1n;3L)<Zu6hmf1GX9;kD;?JZtlJ=YJdP;;Yd4y<7frJi-52!~4*@TGoHt z7JS8-fvNw?g9RBO#Eg~$ru0(s%R<cQ!{!lkeKl=!)4urgk3VR`{0y2{)1H<F|Aqci z>>K#6ji2inKZ_%He-k7mmIj-%ZUswfnvouAxyFZhF=JevN_4a6x_)gm^%-?Ct=H-N zFDWJ5lNJP->+MRt2KL~Cw5{5OkLvjOk=tLJzgsXT7PJbZg#kihaZO7C7S*(%MXVoK z7-&`ul@I(M1={mkd03A5m%ZSA_d)xnG%LWOSU20zY)bp=gXR}}RM(%&?7v(;dEd4P zv}`WRt|25A*0QCAAvVOn)8O{8r1?P>G(XT>B0Ip0G)%3*`^xN$5^ZbP{ts?GzhC%w z6Ey$h_h~{6Tgnbp?XW%AmG;>O%`f<<`hSW2m-jE8%d>I+%IepV=2aIG3qyHdTf02X z58*v;O&iJzw4$s4OUmSS%B*27G0WeArVZ=&+%bRo$N^dy?n(u`<~)7!M0StqSOO7c zhj;I!(IJ&+ZUEb2d$0@p^J|sU`vo6y|H4@%`!Dwod?ppo`-eZXQu$oWS4b?ZUzz6D zb*Ajv4wMyAo-%9N(Y!z#n#=7y*WZ$6)v%<LSEA`R-Yb+9e!O>w7RUQZeHmQWy{SX# zPj2h70@kLRH;U-(#0Z*Evz)Y>UB^-Sq4@<Lv46mMEBmkQ-)yjkVh+!$?Lsqkf)+)2 z(!$7UlwGe9W!7<~c_9uomvv?Y+R<$8=TTukbob6}>56H4B9A@w#(^DarjMBsHuh>o zKR>u<G~S@ZP{)6M{+XtY9890osz_OEKRc|l^a;LU?y762;r`i@=fGzeL$f<1(R44K z!_hvpq;ViEi1MbaaCe$lm-`j+H617=xH6qTb+W8xl=pxm3ujTfuO+4XSd_q$W_(6; z`Qmf$6;F6PZC|^J-VOJqdEr&1Pw)+62WQ6I_J+?d<~#?wU<_qWolKv42+C^UMJrlH z(2}Iuv>?`B=I4d6o-hx}S+|OQ{rRV2{PZLJYJjW9zo3~looJfQ$_UeatVzO`$06(b z>cB2Jp0F1x3zyEHqjwV`Xo{y9!8eQ@oO`qX`sYVH!*kw>`{f#*(Pp$yqM0GCw5C%c zt$ZzxmbQqX1&xC#E4n((jq;()m>QJH>3LDUG&fR5{0$#v)c2q{Vby4MJ$D|v&NQvM zy~I>MJAGQx{L9hw8s#ZH(1B+1_?XXn7be!`=jpoqY#mO^T1C?GHqo@QeLSt{(u~%; z(Sl}2`Vf4AZ`{s5u&+kX@2dYseekh6-^W@;(fS^(X?2%mTJc&uEqbLsKXZrByyzN~ z5$Q{F>U-0yy47e#ohme=R%J>Lu1M2^TqLFiavcJ=4>WLID+3?+AqRQrfxgU`0I7dL zQe9fsI)+wtYD$Ze!wJ3^wEcYczr^{8S_ez+gCkg9r?pF>S>Za`G^i_W9MGB8_kN95 zcWX&Y+s4y^<Os@YQitX>3Z{&P0W`aTAI+-oLo@4n(TuvDlpb1*((6=}m|ojmp9US} z-~&J8AP+szH@|5(Eq*nIR(5J8?QQ7OLGr>E_=K~2_8p<b`IXiO{4CRG$dDm;mVB1h zIE)s(+K6_(^A>F#)sHp}=}znWb)wa8wxMO*p9@>Y5dWT#G85|2+_>755gS5tqJwC5 z!$6uH6+p8hYv_SI=qLvt_#p@R1<f1MlD3U$WtSGTu1`m42lf`Wh$i@eH3w&Ec>ln@ z>lk(n{n-_K*8<Zmcr8lDT%PyoWJ;^+OKbbQPJ2Iok8(a3P1{r6qAer))5f=Y(z?E# zX+_spX-S7>w4hZS&2JGyS;<k9*|Y&=CPmP^#QJ(54?4=h2mZzF5@~s-7PPu&d-`l} zcc~ZpVP{qMb~Gu}hu{O|EbsSsv2V{kzcr`>#?ktel$1Z`vi#KO+O%<4UpmC+q5G#y zpgkXtqny;SwEf)?wB_x=v}t%hT0f{et?u24R=nAcmUZDez21Trw@;=;uQikL;tsFS z(oQXDdABySsz(P}+rJxa9NI_9Ll5*pFZ6F1(vzk(tVOVm^IN=sVBfLc{N?#M>cD*R z{RP$|K0ki~J)g#e(q|+3)0d00=t%Z#I-D_`4yLEkKGf%v4=88CyR>8c7}`E=6m5NH zIBiWCMq9=Xr7dH)zc@x7bd-Y+{E&k@^gti<Zs0miiLN7k$JsrvHxJmKmwJDp*1??X z?SndK{V=&jV_MOxGkv)vn+nz}r~KuMWctX0x%7GFEIKr2I_1uqN(a&>Gty}P^hvaT z+9xtb9(0t05B!jWF6cpeS@({V*1WO4-FY0}!#foA|E1m^8H^)ymbJoI!hFD-{-_17 z!|@Gh+XpFhA!j?C+p&etZ262%ZCpnu*RSS!t)SzpmQntSB_#kl%E1SI$er81nYO<7 zHcgL<An3+i#dyd22eyszjxqDn@9zxiAm5*2PGeodI+ihIGCyl^JrZMR(>tT-#QHUK z<!~-tK6HTZse9?tzTFZR_vVlWjfQgY74Y6*Q_3hxPl%SfpcA^W&Tzl4W}kHoylcVv z=3l<^()=weW*rt-Te&Zepf7MQgw64<B+<CqyjC_(q&33^(cbh=={Wm#Y5!ij#?My( z()nvv(%$J)BoBBY16k;RF4l?n^k?z@fo=U`@2?H(!+J5EEU{O@yg)s$=fk*4e>a6b z>fDi1BEuy3H|*5kMo1v7(ZK^=j1$PhZ|>V$IJ;-v|F!Q2N~wnx>cO@@!`@q~3&sF| zIvIRFp#QEw^BL!@I5Wn%H~a0zz&Y&S9_NPsy=a>4$^PKj2G2lTpV?fWO&o9G{<)5N z0h}&k+78AxoK@nym1VG|z-Jo<#(1gs(--jte|SRvo`gTxlz$&3SLlCtqW^m`<JI5g z#Hqi_;qQx>UH;BRiwlv*_ezNQ4W|~TBF{5Wi;?~RIi$il1AlXoH>gh`@?1}?-dZew z$HVO+f5*e^B>xh^c>ee`mDLf)xoW$zfNW>A-Hm^@qhsaVR!%bd_wqMdVB*Ayk&J1K zb&MhgsX!Vultumx)z1}Sog)}U^HciM)*;O)zeflawsWKht;{5l25sx$R|q`dh0Jr6 zzCa=C=m1^WWBb#$?VRXtS9`iQ*oE%D=T7(2eCWYUe~J5(ed+$Vs&sFN3*CLgp1y7C zNRUze=<oujO0dBH^bf|+>5g7>yIVQB&)*Z=pU2<i@V5{TmegU?R$~74L#Fw=3zUHe zypVxx`ulIgkC$o-=3kdNb^v|d(UtCgq@#QM4Z}VD7Uo_?kP`Fv9QOd^HJaq%@0^gI zt?=IY&{OJwF6b;#$x;aLHFHdVy58QFZu9p6cRul<JN#XRjFC14%J};PJ)P6H`8x<L ze~Z6`fG+6#t9Ib>4%4~KFL1qY^7jZg`CABm%->STG=C#;6BrAC#xcq?XnB-rd|U>d z&<z`<R9lj`tmtqD9ltBDL<irftViyfNLQkx-7C^n{=VVbKvyapR8iuZ%=7#7K9y*H zx5_1OqPH7K9{x7rNC$7&FDlJG(?`r5Gk`94<nI=y^rQ#(?$QrG{9uF|g;!}&H~w~` z3%}#)=BUS|uFkZ1_J{Q7(IX?={jP{k53a57@%!@2uU8=0fGtxW;8%VN7rMmn$1gIz zNlBnz?i7_c3&WZ2qETHbzqJEh<oD>{UDBmK;atlw;LP#csXb-6)XBVvVZ*cyI3GFZ z?E!R_-zlGc#a53CUA*bxi326h)1Z6Tk__6B<U~7~I@67-R}4){{_CI3DWOm5W*e{t zn_3%idfJ9JV(4TOD>|8AZG=-z?dkf;Df)9sLqnHN9jE<k78#Oc`p$_%bh23mMPDg8 zVGA}5?62F}z7`#8WJ&o9#K&UQSj}H}w>>@nQF-TD!k_`+$2&Kv;5FZ3J*vE3FXv&4 z?d#VAP8S_aaHS*BmI`7JTc{{bAMad~9)5MIM1N@JpYqx6;odO@vYHN#^*Z?*0=5O4 z2KA@Ikrs3~%2J7uE(3@7JC~y?vow=N@uP?LY0fJlbTIO-^{{>3xhMhYgArCQgtd{5 zbOC>zt&H&a@nf1huoG>Muq{<zZUbvcH?d!|E7q0vMcB~3`qs2xjgdCQwg`LLwKThg zWy}Y|fc%annY1jzNiQ#TLN5chOxl0ln%1GTr-7XcdxJD+Y?rZs=Z&eYN4&-ypD>XA z`1L=AF39xPXHU_LMn05dq8GN<zTx<rwxnYt%4z6GyP_P55m|wDF?KSh^Lg=~JiZJA z-X$C!*h2Cg?%s%gyjf^iEYm;#^b<|*+>EwFsk&JgY_WaA`4>5z&wzHuxN_T6Gy-Td z6N2bxK1VkUXooY|lZ<%xw+W#;r;e6rBYZQl>eC6dBBly|gTwbBw#D}K>kmdD`eS{x z8|5VFXjc<YB~J9FZB6~?i-j|&=)hLGd2pM=jRV{0@`go})6`e;f?vb#<mz;JT{hi0 zmaF0*#|P=w7yD_?%!#xj*2Adp)hPh`Bc=`SPrF{JLAzfKq1~-((Vo_|Wg79zLX$U? z+m-B3umM||UBeh{u)MK9?d{Z%@1t>a;LXPR_(1n2^m0g$@>0he@wB%ipZ~LN*f6wd znC7w$Y447q)%<Sl^WmN7@LL_|(2(|YcxcC$#^)nCOBpSOPUwaWLz|{)E*~*vSbtg@ z=}viX_n`a<!xVftl=5E!$0v@E{6|uHOI^?j-KO?R%QN4)DMS0yk|;0AOX*8z=6>?> zm@|=%j2kF*Ko@kDW~(e3e4X^p7@FI_o7ObqIWS=aotQqJ&Sp)a^NVNlH)EOf)v9cX zORKWz;<5}`1|IOPX~gf8SQa{7wBDw^u$+AUNMrx!)^wp2{EljK`$n{HSU37&;%GYl z>HGYh&Ik0xN26%p&~CK(wHW5n(cEAcf(*;!Iq13lZECZ$Jp6~Qw6_M()Q&AEo!?Q+ z4sxXoFG~reK|>jMRJ$+K*QMDji^h8YE6<<$bu|}%R>cCxHqZUdF8jx)7JrRYKFt7f z%lPdsY~fFg82@fpClHLkqL!o*mpQ?X9*hx;b&MhvNQ354LcoBa^3Z`U9&~<`AKjZ; zQvzwwxEv_851GDhb$ms-KAxZRrm$QoKpA+zYhYGD=PJI(6}`{j*}nk5tNFpP$87d1 zueT5X?uYl7j0?m3=*r0I5|@Tor(*+sB~A=h=;xV-<p9}M+mrb_`0SDNpPwGdZyZh@ z+(|h-0{FXeU;6BW9+HM{AI{C}CuyKVhUKR*)*Wo?NvC`I(z$Uh>DPNV<j}dtdyo|) zcz^usFEU@WYq8`39{?H1GK#)@-G@$e^OGp(6H50_9yGdNe|P!_9e=Zio(H^;VOgN) zNQdf_-^pK(Bc1v872kZNAHt^(=I}aDQ(q2V$f)w`_O|rnvLK0L9Dnx77%BVb<KO6q ztCwW@{;iv|tZO4ZA7ofwj;l=xI?C@HDzUtOJLx<2A{VnhqGNA1pgUjeku>a$R=+cl z@?Nh)kYRbWANqj4<ma{HZ${Da)c$mO(oi}zaWI|WJW%jvLpt^G5IXbeC^|D`6z%WL z?@rYI!#Lvfh~*7E=nQ`&`62)>WK723y5-ScbaLP;bZ%68{+_;V37`x-ENe7=H9gSD zplxl!=<{Albm8qz5=euFGVo~prNvzSQuFr_|LvnfgWs)|rqhs?%4e;)yi!31vi}Ek CuCXov diff --git a/vs2012/liteagent/LiteAgent.vcxproj b/vs2012/liteagent/LiteAgent.vcxproj index e67918a..b133576 100644 --- a/vs2012/liteagent/LiteAgent.vcxproj +++ b/vs2012/liteagent/LiteAgent.vcxproj @@ -137,7 +137,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> <WarningLevel>Level3</WarningLevel> - <PrecompiledHeader>Create</PrecompiledHeader> + <PrecompiledHeader>NotUsing</PrecompiledHeader> <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> @@ -166,7 +166,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ClCompile> <WarningLevel>Level3</WarningLevel> - <PrecompiledHeader>Create</PrecompiledHeader> + <PrecompiledHeader>NotUsing</PrecompiledHeader> <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> @@ -193,38 +193,8 @@ </CustomBuildStep> </ItemDefinitionGroup> <ItemGroup> - <ClCompile Include="..\..\src\win32stubagent\errors.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> - <ClCompile Include="..\..\src\win32stubagent\stdafx.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> - <ClCompile Include="..\..\src\win32stubagent\WmiAccessor.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> - <ClCompile Include="..\..\src\win32stubagent\XSAccessor.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> - <ClCompile Include="..\..\src\win32stubagent\XService.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> </ItemGroup> <ItemGroup> - <ClInclude Include="..\..\src\win32stubagent\stdafx.h" /> - <ClInclude Include="..\..\src\win32stubagent\WmiAccessor.h" /> - <ClInclude Include="..\..\src\win32stubagent\XSAccessor.h" /> - <ClInclude Include="..\..\src\win32stubagent\XService.h" /> </ItemGroup> <ItemGroup> <CustomBuild Include="..\..\src\win32stubagent\messages.mc"> diff --git a/vs2013/liteagent/LiteAgent.vcxproj b/vs2013/liteagent/LiteAgent.vcxproj index 50dbe43..a8f59a3 100644 --- a/vs2013/liteagent/LiteAgent.vcxproj +++ b/vs2013/liteagent/LiteAgent.vcxproj @@ -197,39 +197,8 @@ </CustomBuildStep> </ItemDefinitionGroup> <ItemGroup> - <ClCompile Include="..\..\src\win32stubagent\errors.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> - <ClCompile Include="..\..\src\win32stubagent\stdafx.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> - <ClCompile Include="..\..\src\win32stubagent\WmiAccessor.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> - <ClCompile Include="..\..\src\win32stubagent\XSAccessor.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - </ClCompile> - <ClCompile Include="..\..\src\win32stubagent\XService.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader> - <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile> - </ClCompile> </ItemGroup> <ItemGroup> - <ClInclude Include="..\..\src\win32stubagent\stdafx.h" /> - <ClInclude Include="..\..\src\win32stubagent\WmiAccessor.h" /> - <ClInclude Include="..\..\src\win32stubagent\XSAccessor.h" /> - <ClInclude Include="..\..\src\win32stubagent\XService.h" /> </ItemGroup> <ItemGroup> <CustomBuild Include="..\..\src\win32stubagent\messages.mc"> -- 1.9.4.msysgit.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |