...to determine how to interpret Xen wall-clock.
The Xen wall-clock value may be interpreted as local time or UTC, depending
on how Windows programs the emulated RTC. The updated method provides this
extra information, so used this rather than reading the registry directly.
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
IN PVOID Argument
);
+typedef NTSTATUS
+(*XENBUS_CACHE_CREATE_V1)(
+ IN PINTERFACE Interface,
+ IN const CHAR *Name,
+ IN ULONG Size,
+ IN ULONG Reservation,
+ IN XENBUS_CACHE_CTOR Ctor,
+ IN XENBUS_CACHE_DTOR Dtor,
+ IN XENBUS_CACHE_ACQUIRE_LOCK AcquireLock,
+ IN XENBUS_CACHE_RELEASE_LOCK ReleaseLock,
+ IN PVOID Argument OPTIONAL,
+ OUT PXENBUS_CACHE *Cache
+ );
+
/*! \typedef XENBUS_CACHE_CREATE
\brief Create a cache of objects of the given \a Size
\param Name A name for the cache which will be used in debug output
\param Size The size of each object in bytes
\param Reservation The target minimum population of the cache
+ \param Cap The maximum population of the cache
\param Ctor A callback which is invoked when a new object created
\param Dtor A callback which is invoked when an object is destroyed
\param AcquireLock A callback invoked to acquire a spinlock
IN const CHAR *Name,
IN ULONG Size,
IN ULONG Reservation,
+ IN ULONG Cap,
IN XENBUS_CACHE_CTOR Ctor,
IN XENBUS_CACHE_DTOR Dtor,
IN XENBUS_CACHE_ACQUIRE_LOCK AcquireLock,
\ingroup interfaces
*/
struct _XENBUS_CACHE_INTERFACE_V1 {
+ INTERFACE Interface;
+ XENBUS_CACHE_ACQUIRE CacheAcquire;
+ XENBUS_CACHE_RELEASE CacheRelease;
+ XENBUS_CACHE_CREATE_V1 CacheCreateVersion1;
+ XENBUS_CACHE_GET CacheGet;
+ XENBUS_CACHE_PUT CachePut;
+ XENBUS_CACHE_DESTROY CacheDestroy;
+};
+
+/*! \struct _XENBUS_CACHE_INTERFACE_V2
+ \brief CACHE interface version 1
+ \ingroup interfaces
+*/
+struct _XENBUS_CACHE_INTERFACE_V2 {
INTERFACE Interface;
XENBUS_CACHE_ACQUIRE CacheAcquire;
XENBUS_CACHE_RELEASE CacheRelease;
XENBUS_CACHE_DESTROY CacheDestroy;
};
-typedef struct _XENBUS_CACHE_INTERFACE_V1 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
+typedef struct _XENBUS_CACHE_INTERFACE_V2 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
/*! \def XENBUS_CACHE
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENBUS_CACHE_INTERFACE_VERSION_MIN 1
-#define XENBUS_CACHE_INTERFACE_VERSION_MAX 1
+#define XENBUS_CACHE_INTERFACE_VERSION_MAX 2
#endif // _XENBUS_CACHE_INTERFACE_H
...
);
-typedef NTSTATUS
-(*XENBUS_EVTCHN_BIND_V2)(
- IN PINTERFACE Interface,
- IN PXENBUS_EVTCHN_CHANNEL Channel,
- IN ULONG Cpu
- );
-
/*! \typedef XENBUS_EVTCHN_BIND
\brief Bind an event channel to a specific CPU
IN UCHAR Number
);
-typedef BOOLEAN
-(*XENBUS_EVTCHN_UNMASK_V1)(
+typedef VOID
+(*XENBUS_EVTCHN_UNMASK_V4)(
IN PINTERFACE Interface,
IN PXENBUS_EVTCHN_CHANNEL Channel,
IN BOOLEAN InCallback
\param Interface The interface header
\param Channel The channel handle
\param InCallback Set to TRUE if this method is invoked in context of the channel callback
+ \param Force Set to TRUE if the unmask must succeed, otherwise set to FALSE and the function will return TRUE if the unmask did not complete and there is still an event pending.
*/
-typedef VOID
+typedef BOOLEAN
(*XENBUS_EVTCHN_UNMASK)(
IN PINTERFACE Interface,
IN PXENBUS_EVTCHN_CHANNEL Channel,
- IN BOOLEAN InCallback
+ IN BOOLEAN InCallback,
+ IN BOOLEAN Force
+ );
+
+typedef VOID
+(*XENBUS_EVTCHN_SEND_V1)(
+ IN PINTERFACE Interface,
+ IN PXENBUS_EVTCHN_CHANNEL Channel
);
/*! \typedef XENBUS_EVTCHN_SEND
\brief Send an event to the remote end of the channel
+ It is assumed that the domain cannot suspend during this call so
+ IRQL must be >= DISPATCH_LEVEL.
+
\param Interface The interface header
\param Channel The channel handle
*/
IN PXENBUS_EVTCHN_CHANNEL Channel
);
+/*! \typedef XENBUS_EVTCHN_GET_COUNT
+ \brief Get the number of events received by the channel since it was opened
+
+ \param Interface The interface header
+ \param Channel The channel handle
+ \return The number of events
+*/
+typedef ULONG
+(*XENBUS_EVTCHN_GET_COUNT)(
+ IN PINTERFACE Interface,
+ IN PXENBUS_EVTCHN_CHANNEL Channel
+ );
+
+typedef NTSTATUS
+(*XENBUS_EVTCHN_WAIT_V5)(
+ IN PINTERFACE Interface,
+ IN PXENBUS_EVTCHN_CHANNEL Channel,
+ IN PLARGE_INTEGER Timeout OPTIONAL
+ );
+
/*! \typedef XENBUS_EVTCHN_WAIT
- \brief Wait for an event to the local end of the channel
+ \brief Wait for events to the local end of the channel
\param Interface The interface header
\param Channel The channel handle
+ \param Count The event count to wait for
\param Timeout An optional timeout value (similar to KeWaitForSingleObject(), but non-zero values are allowed at DISPATCH_LEVEL).
*/
typedef NTSTATUS
(*XENBUS_EVTCHN_WAIT)(
IN PINTERFACE Interface,
IN PXENBUS_EVTCHN_CHANNEL Channel,
+ IN ULONG Count,
IN PLARGE_INTEGER Timeout OPTIONAL
);
DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE,
0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23);
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V1
- \brief EVTCHN interface version 1
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V4
+ \brief EVTCHN interface version 4
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V1 {
+struct _XENBUS_EVTCHN_INTERFACE_V4 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
- XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
- XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_BIND EvtchnBind;
+ XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V2
- \brief EVTCHN interface version 2
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
+ \brief EVTCHN interface version 5
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V2 {
+struct _XENBUS_EVTCHN_INTERFACE_V5 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
- XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2;
- XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
- XENBUS_EVTCHN_SEND EvtchnSend;
+ XENBUS_EVTCHN_BIND EvtchnBind;
+ XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
+ XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
+ XENBUS_EVTCHN_WAIT_V5 EvtchnWaitVersion5;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V3
- \brief EVTCHN interface version 3
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V6
+ \brief EVTCHN interface version 6
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V3 {
+struct _XENBUS_EVTCHN_INTERFACE_V6 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
- XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2;
- XENBUS_EVTCHN_UNMASK EvtchnUnmask;
+ XENBUS_EVTCHN_BIND EvtchnBind;
+ XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
XENBUS_EVTCHN_SEND EvtchnSend;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
+ XENBUS_EVTCHN_WAIT_V5 EvtchnWaitVersion5;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V4
- \brief EVTCHN interface version 4
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V7
+ \brief EVTCHN interface version 7
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V4 {
+struct _XENBUS_EVTCHN_INTERFACE_V7 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_OPEN EvtchnOpen;
XENBUS_EVTCHN_BIND EvtchnBind;
- XENBUS_EVTCHN_UNMASK EvtchnUnmask;
+ XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4;
XENBUS_EVTCHN_SEND EvtchnSend;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
+ XENBUS_EVTCHN_GET_COUNT EvtchnGetCount;
+ XENBUS_EVTCHN_WAIT EvtchnWait;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-/*! \struct _XENBUS_EVTCHN_INTERFACE_V5
- \brief EVTCHN interface version 5
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V8
+ \brief EVTCHN interface version 8
\ingroup interfaces
*/
-struct _XENBUS_EVTCHN_INTERFACE_V5 {
+struct _XENBUS_EVTCHN_INTERFACE_V8 {
INTERFACE Interface;
XENBUS_EVTCHN_ACQUIRE EvtchnAcquire;
XENBUS_EVTCHN_RELEASE EvtchnRelease;
XENBUS_EVTCHN_UNMASK EvtchnUnmask;
XENBUS_EVTCHN_SEND EvtchnSend;
XENBUS_EVTCHN_TRIGGER EvtchnTrigger;
+ XENBUS_EVTCHN_GET_COUNT EvtchnGetCount;
XENBUS_EVTCHN_WAIT EvtchnWait;
XENBUS_EVTCHN_GET_PORT EvtchnGetPort;
XENBUS_EVTCHN_CLOSE EvtchnClose;
};
-typedef struct _XENBUS_EVTCHN_INTERFACE_V5 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+typedef struct _XENBUS_EVTCHN_INTERFACE_V8 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
/*! \def XENBUS_EVTCHN
\brief Macro at assist in method invocation
#endif // _WINDLL
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 5
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 4
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 8
#endif // _XENBUS_EVTCHN_INTERFACE_H
IN PINTERFACE Interface
);
+typedef NTSTATUS
+(*XENBUS_GNTTAB_CREATE_CACHE_V1)(
+ IN PINTERFACE Interface,
+ IN const CHAR *Name,
+ IN ULONG Reservation,
+ IN XENBUS_CACHE_ACQUIRE_LOCK AcquireLock,
+ IN XENBUS_CACHE_RELEASE_LOCK ReleaseLock,
+ IN PVOID Argument OPTIONAL,
+ OUT PXENBUS_GNTTAB_CACHE *Cache
+ );
+
/*! \typedef XENBUS_GNTTAB_CREATE_CACHE
\brief Create a cache of grant table entries
\param Interface The interface header
\param Name A name for the cache which will be used in debug output
\param Reservation The target minimum population of the cache
+ \param Cap The maximum population of the cache
\param AcquireLock A callback invoked to acquire a spinlock
\param ReleaseLock A callback invoked to release the spinlock
\param Argument An optional context argument passed to the callbacks
IN PINTERFACE Interface,
IN const CHAR *Name,
IN ULONG Reservation,
+ IN ULONG Cap,
IN XENBUS_CACHE_ACQUIRE_LOCK AcquireLock,
IN XENBUS_CACHE_RELEASE_LOCK ReleaseLock,
IN PVOID Argument OPTIONAL,
IN PXENBUS_GNTTAB_ENTRY Entry
);
+/*! \typedef XENBUS_GNTTAB_QUERY_REFERENCE
+ \brief Get the reference number of the entry
+
+ \param Interface The interface header
+ \param Reference The reference number
+ \param Pfn An optional pointer to receive the value of the reference frame number
+ \param ReadOnly An optional pointer to receive the boolean value of the read-only flag
+*/
+typedef NTSTATUS
+(*XENBUS_GNTTAB_QUERY_REFERENCE)(
+ IN PINTERFACE Interface,
+ IN ULONG Reference,
+ OUT PPFN_NUMBER Pfn OPTIONAL,
+ OUT PBOOLEAN ReadOnly OPTIONAL
+ );
+
+#define XENBUS_GNTTAB_CONSOLE_REFERENCE 0
+#define XENBUS_GNTTAB_STORE_REFERENCE 1
+
+
/*! \typedef XENBUS_GNTTAB_DESTROY_CACHE
\brief Destroy a cache of grant table entries
INTERFACE Interface;
XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
XENBUS_GNTTAB_RELEASE GnttabRelease;
- XENBUS_GNTTAB_CREATE_CACHE GnttabCreateCache;
+ XENBUS_GNTTAB_CREATE_CACHE_V1 GnttabCreateCacheVersion1;
XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference;
\ingroup interfaces
*/
struct _XENBUS_GNTTAB_INTERFACE_V2 {
+ INTERFACE Interface;
+ XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
+ XENBUS_GNTTAB_RELEASE GnttabRelease;
+ XENBUS_GNTTAB_CREATE_CACHE_V1 GnttabCreateCacheVersion1;
+ XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+ XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+ XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference;
+ XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache;
+ XENBUS_GNTTAB_MAP_FOREIGN_PAGES GnttabMapForeignPages;
+ XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages;
+};
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V3
+ \brief GNTTAB interface version 3
+ \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V3 {
+ INTERFACE Interface;
+ XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
+ XENBUS_GNTTAB_RELEASE GnttabRelease;
+ XENBUS_GNTTAB_CREATE_CACHE_V1 GnttabCreateCacheVersion1;
+ XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
+ XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
+ XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference;
+ XENBUS_GNTTAB_QUERY_REFERENCE GnttabQueryReference;
+ XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache;
+ XENBUS_GNTTAB_MAP_FOREIGN_PAGES GnttabMapForeignPages;
+ XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages;
+};
+
+/*! \struct _XENBUS_GNTTAB_INTERFACE_V4
+ \brief GNTTAB interface version 4
+ \ingroup interfaces
+*/
+struct _XENBUS_GNTTAB_INTERFACE_V4 {
INTERFACE Interface;
XENBUS_GNTTAB_ACQUIRE GnttabAcquire;
XENBUS_GNTTAB_RELEASE GnttabRelease;
XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess;
XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess;
XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference;
+ XENBUS_GNTTAB_QUERY_REFERENCE GnttabQueryReference;
XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache;
XENBUS_GNTTAB_MAP_FOREIGN_PAGES GnttabMapForeignPages;
XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages;
};
-typedef struct _XENBUS_GNTTAB_INTERFACE_V2 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
+typedef struct _XENBUS_GNTTAB_INTERFACE_V4 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE;
/*! \def XENBUS_GNTTAB
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1
-#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 2
+#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 4
#endif // _XENBUS_GNTTAB_INTERFACE_H
IN PVOID Argument
);
-typedef BOOLEAN
-(*XENBUS_SHARED_INFO_EVTCHN_POLL_V1)(
- IN PINTERFACE Interface,
- IN BOOLEAN (*Function)(PVOID, ULONG),
- IN PVOID Argument
- );
-
/*! \typedef XENBUS_SHARED_INFO_EVTCHN_ACK
\brief Private method for EVTCHN inerface
*/
IN ULONG Port
);
+typedef LARGE_INTEGER
+(*XENBUS_SHARED_INFO_GET_TIME_V2)(
+ IN PINTERFACE Interface
+ );
+
/*! \typedef XENBUS_SHARED_INFO_GET_TIME
- \brief Return the wallclock time from the shared info
+ \brief Retrieve the wallclock time from the shared info
\param Interface The interface header
- \return The wallclock time in units of 100ns
+ \param Time The wallclock time
+ \param Local Set, on return, if the wallclock is in local time
*/
-typedef LARGE_INTEGER
+typedef VOID
(*XENBUS_SHARED_INFO_GET_TIME)(
- IN PINTERFACE Interface
+ IN PINTERFACE Interface,
+ OUT PLARGE_INTEGER Time,
+ OUT PBOOLEAN Local
);
// {7E73C34F-1640-4649-A8F3-263BC930A004}
DEFINE_GUID(GUID_XENBUS_SHARED_INFO_INTERFACE,
0x7e73c34f, 0x1640, 0x4649, 0xa8, 0xf3, 0x26, 0x3b, 0xc9, 0x30, 0xa0, 0x4);
-/*! \struct _XENBUS_SHARED_INFO_INTERFACE_V1
- \brief SHARED_INFO interface version 1
+/*! \struct _XENBUS_SHARED_INFO_INTERFACE_V2
+ \brief SHARED_INFO interface version 2
\ingroup interfaces
*/
-struct _XENBUS_SHARED_INFO_INTERFACE_V1 {
+struct _XENBUS_SHARED_INFO_INTERFACE_V2 {
INTERFACE Interface;
XENBUS_SHARED_INFO_ACQUIRE SharedInfoAcquire;
XENBUS_SHARED_INFO_RELEASE SharedInfoRelease;
- XENBUS_SHARED_INFO_EVTCHN_POLL_V1 SharedInfoEvtchnPollVersion1;
+ XENBUS_SHARED_INFO_UPCALL_PENDING SharedInfoUpcallPending;
+ XENBUS_SHARED_INFO_EVTCHN_POLL SharedInfoEvtchnPoll;
XENBUS_SHARED_INFO_EVTCHN_ACK SharedInfoEvtchnAck;
XENBUS_SHARED_INFO_EVTCHN_MASK SharedInfoEvtchnMask;
XENBUS_SHARED_INFO_EVTCHN_UNMASK SharedInfoEvtchnUnmask;
- XENBUS_SHARED_INFO_GET_TIME SharedInfoGetTime;
+ XENBUS_SHARED_INFO_GET_TIME_V2 SharedInfoGetTimeVersion2;
};
-/*! \struct _XENBUS_SHARED_INFO_INTERFACE_V2
- \brief SHARED_INFO interface version 2
+/*! \struct _XENBUS_SHARED_INFO_INTERFACE_V3
+ \brief SHARED_INFO interface version 3
\ingroup interfaces
*/
-struct _XENBUS_SHARED_INFO_INTERFACE_V2 {
+struct _XENBUS_SHARED_INFO_INTERFACE_V3 {
INTERFACE Interface;
XENBUS_SHARED_INFO_ACQUIRE SharedInfoAcquire;
XENBUS_SHARED_INFO_RELEASE SharedInfoRelease;
XENBUS_SHARED_INFO_GET_TIME SharedInfoGetTime;
};
-typedef struct _XENBUS_SHARED_INFO_INTERFACE_V2 XENBUS_SHARED_INFO_INTERFACE, *PXENBUS_SHARED_INFO_INTERFACE;
+typedef struct _XENBUS_SHARED_INFO_INTERFACE_V3 XENBUS_SHARED_INFO_INTERFACE, *PXENBUS_SHARED_INFO_INTERFACE;
/*! \def XENBUS_SHARED_INFO
\brief Macro at assist in method invocation
#endif // _WINDLL
-#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN 1
-#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX 2
+#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN 2
+#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX 3
#endif // _XENBUS_SHARED_INFO_H
#ifndef _XENIFACE_IOCTLS_H_
#define _XENIFACE_IOCTLS_H_
+#include <windef.h>
+
/*! \brief XENIFACE device GUID */
DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65);
#define IOCTL_XENIFACE_SHAREDINFO_GET_TIME \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x840, METHOD_BUFFERED, FILE_ANY_ACCESS)
+/*! \brief Output for IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_SHAREDINFO_GET_TIME_OUT {
+ FILETIME Time; /*!< Current wallclock time */
+ BOOLEAN Local; /*!< TRUE is wallclock is in local time, FALSE if it is in UTC */
+} XENIFACE_SHAREDINFO_GET_TIME_OUT, *PXENIFACE_SHAREDINFO_GET_TIME_OUT;
+
/*! \brief Logs a message to Dom0
Input: NUL-terminated CHAR array containing the message to log
CloseHandle(token);
}
-bool CXenIfaceCreator::IsRTCInUTC()
-{
- HKEY key;
- std::string path;
- DWORD val = 0;
- DWORD length = sizeof(val);
- LRESULT lr;
-
- path = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation";
-
- lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path.c_str(), 0, KEY_READ, &key);
- if (lr != ERROR_SUCCESS)
- return false;
-
- lr = RegQueryValueEx(key, "RealTimeIsUniversal", NULL, NULL,
- (LPBYTE)&val, &length);
- RegCloseKey(key);
-
- // A non-present value -> false
- if (lr != ERROR_SUCCESS)
- return false;
-
- return val;
-}
-
void CXenIfaceCreator::SetXenTime()
{
- bool IsUTC = IsRTCInUTC();
-
- SYSTEMTIME cur = { 0 };
- if (IsUTC)
- GetSystemTime(&cur);
- else
- GetLocalTime(&cur);
+ bool local;
FILETIME now = { 0 };
- if (!m_device->SharedInfoGetTime(&now))
+ if (!m_device->SharedInfoGetTime(&now, &local))
return;
+ SYSTEMTIME cur = { 0 };
+ if (local)
+ GetLocalTime(&cur);
+ else
+ GetSystemTime(&cur);
+
SYSTEMTIME sys = { 0 };
if (!FileTimeToSystemTime(&now, &sys))
return;
if (memcmp(&cur, &sys, sizeof(SYSTEMTIME)) == 0)
return;
- CXenAgent::Log("RTC is in %s\n", IsUTC ? "UTC" : "local time");
+ CXenAgent::Log("RTC is in %s\n", local ? "local time" : "UTC");
CXenAgent::Log("Time Now = %d/%d/%d %d:%02d:%02d.%d\n",
cur.wYear, cur.wMonth, cur.wDay,
cur.wHour, cur.wMinute, cur.wSecond, cur.wMilliseconds);
sys.wYear, sys.wMonth, sys.wDay,
sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds);
- if (IsUTC)
- SetSystemTime(&sys);
- else
+ if (local)
SetLocalTime(&sys);
+ else
+ SetSystemTime(&sys);
}
/* 317fc439-3f77-41c8-b09e-08ad63272aa3 */
}
// sharedinfo interface
-bool CXenIfaceDevice::SharedInfoGetTime(FILETIME* time)
+bool CXenIfaceDevice::SharedInfoGetTime(FILETIME* time, bool* local)
{
- return Ioctl(IOCTL_XENIFACE_SHAREDINFO_GET_TIME,
- NULL, 0,
- time, sizeof(FILETIME));
+ XENIFACE_SHAREDINFO_GET_TIME_OUT out = { NULL };
+ if (!Ioctl(IOCTL_XENIFACE_SHAREDINFO_GET_TIME,
+ NULL, 0,
+ &out, sizeof(out)))
+ return false;
+ *time = out.Time;
+ *local = out.Local;
+ return true;
}
// logging
bool SuspendGetCount(DWORD *count);
public: // sharedinfo interface
- bool SharedInfoGetTime(FILETIME* time);
+ bool SharedInfoGetTime(FILETIME* time, bool *local);
public: // logging
bool Log(const std::string& msg);
; DisplayName Section DeviceID
; ----------- ------- --------
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_09000000
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_09000000
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_09000000
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_IFACE&REV_09000006
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_IFACE&REV_09000006
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_IFACE&REV_09000006
[XenIface_Device]
CopyFiles=XenIface_Device.Copy
&Fdo->GnttabInterface,
"xeniface-gnttab",
0,
+ 0,
GnttabAcquireLock,
GnttabReleaseLock,
Fdo,
KeSetEvent(Context->Event, 0, FALSE);
- XENBUS_EVTCHN(Unmask,
- &Context->Fdo->EvtchnInterface,
- Context->Channel,
- FALSE);
+ (VOID) XENBUS_EVTCHN(Unmask,
+ &Context->Fdo->EvtchnInterface,
+ Context->Channel,
+ FALSE,
+ TRUE);
}
_Function_class_(KSERVICE_ROUTINE)
*Info = sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT);
if (!In->Mask) {
- XENBUS_EVTCHN(Unmask,
- &Fdo->EvtchnInterface,
- Context->Channel,
- FALSE);
+ (VOID) XENBUS_EVTCHN(Unmask,
+ &Fdo->EvtchnInterface,
+ Context->Channel,
+ FALSE,
+ TRUE);
}
Trace("< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
*Info = sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT);
if (!In->Mask) {
- XENBUS_EVTCHN(Unmask,
- &Fdo->EvtchnInterface,
- Context->Channel,
- FALSE);
+ (VOID) XENBUS_EVTCHN(Unmask,
+ &Fdo->EvtchnInterface,
+ Context->Channel,
+ FALSE,
+ TRUE);
}
Trace("< LocalPort %lu, Context %p\n", Context->LocalPort, Context);
if (Context == NULL)
goto fail2;
- XENBUS_EVTCHN(Unmask,
- &Fdo->EvtchnInterface,
- Context->Channel,
- FALSE);
+ (VOID) XENBUS_EVTCHN(Unmask,
+ &Fdo->EvtchnInterface,
+ Context->Channel,
+ FALSE,
+ TRUE);
KeReleaseSpinLock(&Fdo->EvtchnLock, Irql);
DECLSPEC_NOINLINE
NTSTATUS
IoctlSharedInfoGetTime(
- __in PXENIFACE_FDO Fdo,
- __in PCHAR Buffer,
- __in ULONG InLen,
- __in ULONG OutLen,
- __out PULONG_PTR Info
+ __in PXENIFACE_FDO Fdo,
+ __in PCHAR Buffer,
+ __in ULONG InLen,
+ __in ULONG OutLen,
+ __out PULONG_PTR Info
)
{
- NTSTATUS status;
- PLARGE_INTEGER Value;
+ PXENIFACE_SHAREDINFO_GET_TIME_OUT Out;
+ LARGE_INTEGER Time;
+ BOOLEAN Local;
+ NTSTATUS status;
status = STATUS_INVALID_BUFFER_SIZE;
if (InLen != 0)
goto fail1;
- if (OutLen != sizeof(LARGE_INTEGER))
+ if (OutLen != sizeof(XENIFACE_SHAREDINFO_GET_TIME_OUT))
goto fail2;
- Value = (PLARGE_INTEGER)Buffer;
- *Value = XENBUS_SHARED_INFO(GetTime, &Fdo->SharedInfoInterface);
- *Info = (ULONG_PTR)sizeof(LARGE_INTEGER);
+ Out = (PXENIFACE_SHAREDINFO_GET_TIME_OUT)Buffer;
+ XENBUS_SHARED_INFO(GetTime, &Fdo->SharedInfoInterface, &Time,
+ &Local);
+ Out->Time.dwHighDateTime = Time.HighPart;
+ Out->Time.dwLowDateTime = Time.LowPart;
+ Out->Local = Local;
+ *Info = (ULONG_PTR)sizeof(XENIFACE_SHAREDINFO_GET_TIME_OUT);
return STATUS_SUCCESS;
}
void SessionsRemoveAll(XENIFACE_FDO *fdoData) {
- Trace("lock");
LockSessions(fdoData);
- Trace("in lock");
while (fdoData->SessionHead.Flink != &fdoData->SessionHead) {
RemoveSessionLocked(fdoData, (XenStoreSession *)fdoData->SessionHead.Flink);
}
- Trace("unlock");
UnlockSessions(fdoData);
- Trace("unlocked");
}
WNODE_FLAG_FIXED_INSTANCE_SIZE |
WNODE_FLAG_PDO_INSTANCE_NAMES;
if (fdoData->InterfacesAcquired) {
- *time = XENBUS_SHARED_INFO(GetTime, &fdoData->SharedInfoInterface).QuadPart;
+ LARGE_INTEGER info;
+
+ XENBUS_SHARED_INFO(GetTime, &fdoData->SharedInfoInterface, &info, NULL);
+ *time = info.QuadPart;
}
else {
*time = 0;
return STATUS_WMI_ITEMID_NOT_FOUND;
}
if (fdoData->InterfacesAcquired) {
- *time = XENBUS_SHARED_INFO(GetTime, &fdoData->SharedInfoInterface).QuadPart;
+ LARGE_INTEGER info;
+
+ XENBUS_SHARED_INFO(GetTime, &fdoData->SharedInfoInterface, &info, NULL);
+ *time = info.QuadPart;
}
else {
*time = 0;