[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 3/5] Define new IOCTLs for user-mode clients
IOCTL input is defined as XENIFACE_*_IN structs. IOCTL output is defined as XENIFACE_*_OUT structs. Signed-off-by: Rafal Wojdyla <omeg@xxxxxxxxxxxxxxxxxxxxxx> --- include/xeniface_ioctls.h | 190 ++++++++++++++++++++++++++++++++++++++++++++++ src/xeniface/driver.h | 2 +- src/xeniface/ioctls.h | 2 + 3 files changed, 193 insertions(+), 1 deletion(-) diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h index 1367f67..c6d9893 100644 --- a/include/xeniface_ioctls.h +++ b/include/xeniface_ioctls.h @@ -35,14 +35,204 @@ DEFINE_GUID(GUID_INTERFACE_XENIFACE, \ 0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 0x65); +/************************************************************************/ +/* store ioctls */ +/************************************************************************/ +// Define only for user mode clients. +#ifndef XENIFACE_KERNEL_MODE + +typedef enum _XENBUS_STORE_PERMISSION_MASK { + XENBUS_STORE_PERM_NONE = 0, + XENBUS_STORE_PERM_READ = 1, + XENBUS_STORE_PERM_WRITE = 2, +} XENBUS_STORE_PERMISSION_MASK; + +typedef struct _XENBUS_STORE_PERMISSION { + USHORT Domain; + XENBUS_STORE_PERMISSION_MASK Mask; +} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION; + +#endif + +#define XENIFACE_STORE_ALLOWED_PERMISSIONS (XENBUS_STORE_PERM_NONE | XENBUS_STORE_PERM_READ | XENBUS_STORE_PERM_WRITE) + +// TODO: document input/output format of these IOCTLs? #define IOCTL_XENIFACE_STORE_READ \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) + #define IOCTL_XENIFACE_STORE_WRITE \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) + #define IOCTL_XENIFACE_STORE_DIRECTORY \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) + #define IOCTL_XENIFACE_STORE_REMOVE \ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#pragma warning(push) +#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union +typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN { + PCHAR Path; + ULONG PathLength; // number of bytes, including the null terminator + ULONG NumberPermissions; + XENBUS_STORE_PERMISSION Permissions[0]; +} XENIFACE_STORE_SET_PERMISSIONS_IN, *PXENIFACE_STORE_SET_PERMISSIONS_IN; +#pragma warning(pop) + +#define IOCTL_XENIFACE_STORE_ADD_WATCH \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_STORE_ADD_WATCH_IN { + PCHAR Path; + ULONG PathLength; // number of bytes, including the null terminator + HANDLE Event; +} XENIFACE_STORE_ADD_WATCH_IN, *PXENIFACE_STORE_ADD_WATCH_IN; + +typedef struct _XENIFACE_STORE_ADD_WATCH_OUT { + PVOID Context; +} XENIFACE_STORE_ADD_WATCH_OUT, *PXENIFACE_STORE_ADD_WATCH_OUT; + +#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN { + PVOID Context; +} XENIFACE_STORE_REMOVE_WATCH_IN, *PXENIFACE_STORE_REMOVE_WATCH_IN; + +/************************************************************************/ +/* evtchn ioctls */ +/************************************************************************/ +#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN { + USHORT RemoteDomain; + ULONG RemotePort; + BOOLEAN Mask; + HANDLE Event; +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN; + +typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT { + ULONG LocalPort; +} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT; + +#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN { + USHORT RemoteDomain; + BOOLEAN Mask; + HANDLE Event; +} XENIFACE_EVTCHN_BIND_UNBOUND_IN, *PXENIFACE_EVTCHN_BIND_UNBOUND_IN; + +typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT { + ULONG LocalPort; +} XENIFACE_EVTCHN_BIND_UNBOUND_OUT, *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT; + +#define IOCTL_XENIFACE_EVTCHN_CLOSE \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_EVTCHN_CLOSE_IN { + ULONG LocalPort; +} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN; + +#define IOCTL_XENIFACE_EVTCHN_NOTIFY \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_EVTCHN_NOTIFY_IN { + ULONG LocalPort; +} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN; + +#define IOCTL_XENIFACE_EVTCHN_UNMASK \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_EVTCHN_UNMASK_IN { + ULONG LocalPort; +} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN; + +/************************************************************************/ +/* gntmem ioctls */ +/************************************************************************/ +// This IOCTL is pended forever, use IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT +// to get the result. This IOCTL must be asynchronous. +#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS { + XENIFACE_GNTTAB_READONLY = 1 << 0, + XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1, + XENIFACE_GNTTAB_USE_NOTIFY_PORT = 1 << 2, +} XENIFACE_GNTTAB_PAGE_FLAGS; + +typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN { + ULONG RequestId; // should be unique for each request + USHORT RemoteDomain; + ULONG NumberPages; + XENIFACE_GNTTAB_PAGE_FLAGS Flags; + ULONG NotifyOffset; + ULONG NotifyPort; +} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN; + +#define IOCTL_XENIFACE_GNTTAB_GET_GRANT_RESULT \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_IN { + ULONG RequestId; +} XENIFACE_GNTTAB_GET_GRANT_RESULT_IN, *PXENIFACE_GNTTAB_GET_GRANT_RESULT_IN; + +#pragma warning(push) +#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union +typedef struct _XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT { + PVOID Address; + ULONG References[0]; +} XENIFACE_GNTTAB_GET_GRANT_RESULT_OUT, *PXENIFACE_GNTTAB_GET_GRANT_RESULT_OUT; +#pragma warning(pop) + +#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN { + ULONG RequestId; +} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN, *PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN; + +// This IOCTL is pended forever, use IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT +// to get the result. This IOCTL must be asynchronous. +#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#pragma warning(push) +#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union +typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN { + ULONG RequestId; // should be unique for each request + USHORT RemoteDomain; + ULONG NumberPages; + XENIFACE_GNTTAB_PAGE_FLAGS Flags; + ULONG NotifyOffset; + ULONG NotifyPort; + ULONG References[0]; +} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN; +#pragma warning(pop) + +#define IOCTL_XENIFACE_GNTTAB_GET_MAP_RESULT \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x824, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_IN { + ULONG RequestId; +} XENIFACE_GNTTAB_GET_MAP_RESULT_IN, *PXENIFACE_GNTTAB_GET_MAP_RESULT_IN; + +typedef struct _XENIFACE_GNTTAB_GET_MAP_RESULT_OUT { + PVOID Address; +} XENIFACE_GNTTAB_GET_MAP_RESULT_OUT, *PXENIFACE_GNTTAB_GET_MAP_RESULT_OUT; + +#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \ + CTL_CODE(FILE_DEVICE_UNKNOWN, 0x825, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN { + ULONG RequestId; +} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN; + #endif // _XENIFACE_IOCTLS_H_ diff --git a/src/xeniface/driver.h b/src/xeniface/driver.h index 00f2d8f..313f297 100644 --- a/src/xeniface/driver.h +++ b/src/xeniface/driver.h @@ -32,7 +32,7 @@ #ifndef _XENIFACE_DRIVER_H #define _XENIFACE_DRIVER_H - +#define XENIFACE_KERNEL_MODE #include "fdo.h" #include "types.h" diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h index 63de9eb..7ee7801 100644 --- a/src/xeniface/ioctls.h +++ b/src/xeniface/ioctls.h @@ -32,6 +32,8 @@ #ifndef _IOCTLS_H_ #define _IOCTLS_H_ +#define XENIFACE_KERNEL_MODE + NTSTATUS XenIFaceIoctl( __in PXENIFACE_FDO Fdo, -- 1.8.1.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 |