|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 4/4] Add Log IOCTL
Adds an IOCTL that sends a user defined message to Xen to log.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
include/xeniface_ioctls.h | 15 ++++++++++++++
src/xeniface/ioctls.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++
src/xeniface/ioctls.h | 8 ++++++++
3 files changed, 74 insertions(+)
diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
index dcddb5e..86a6eea 100644
--- a/include/xeniface_ioctls.h
+++ b/include/xeniface_ioctls.h
@@ -369,4 +369,19 @@ typedef struct _XENIFACE_SUSPEND_REGISTER_OUT {
#define IOCTL_XENIFACE_SHAREDINFO_GET_TIME \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x840, METHOD_BUFFERED, FILE_ANY_ACCESS)
+/*! \brief Logs a message to Dom0
+
+ Input: NUL-terminated CHAR array containing the message to log
+ Must be less than XENIFACE_LOG_MAX_LENGTH long, and only contain
+ printable or newline characters ( isprint(x) || x == '\n' )
+
+ Output: None
+*/
+#define IOCTL_XENIFACE_LOG \
+ CTL_CODE(FILE_DEVICE_UNKNOWN, 0x84F, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Maximum number of CHARs for IOCTL_XENIFACE_LOG, including NUL
terminator
+*/
+#define XENIFACE_LOG_MAX_LENGTH 256
+
#endif // _XENIFACE_IOCTLS_H_
diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c
index 7092a56..639b015 100644
--- a/src/xeniface/ioctls.c
+++ b/src/xeniface/ioctls.c
@@ -85,6 +85,53 @@ __FreeCapturedBuffer(
}
}
+static FORCEINLINE
+BOOLEAN
+__IsValidStr(
+ __in PCHAR Str,
+ __in ULONG Len
+ )
+{
+ for ( ; Len--; ++Str) {
+ if (*Str == '\0')
+ return TRUE;
+ if (*Str == '\n' || *Str == '\r')
+ continue; // newline is allowed
+ if (!isprint((unsigned char)*Str))
+ break;
+ }
+ return FALSE;
+}
+
+DECLSPEC_NOINLINE
+NTSTATUS
+IoctlLog(
+ __in PXENIFACE_FDO Fdo,
+ __in PCHAR Buffer,
+ __in ULONG InLen,
+ __in ULONG OutLen
+ )
+{
+ NTSTATUS status;
+
+ status = STATUS_INVALID_BUFFER_SIZE;
+ if (InLen == 0 || InLen > XENIFACE_LOG_MAX_LENGTH || OutLen != 0)
+ goto fail1;
+
+ status = STATUS_INVALID_PARAMETER;
+ if (!__IsValidStr(Buffer, InLen))
+ goto fail2;
+
+ XenIfaceDebugPrint(INFO, "USER: %s\n", Buffer);
+ return STATUS_SUCCESS;
+
+fail2:
+ XenIfaceDebugPrint(ERROR, "Fail2\n");
+fail1:
+ XenIfaceDebugPrint(ERROR, "Fail1 (%08x)\n", status);
+ return status;
+}
+
// Cleanup store watches and event channels, called on file object close.
_IRQL_requires_(PASSIVE_LEVEL) // EvtchnFree calls KeFlushQueuedDpcs
VOID
@@ -262,6 +309,10 @@ XenIfaceIoctl(
status = IoctlSharedInfoGetTime(Fdo, Buffer, InLen, OutLen,
&Irp->IoStatus.Information);
break;
+ // misc
+ case IOCTL_XENIFACE_LOG:
+ status = IoctlLog(Fdo, Buffer, InLen, OutLen);
+ break;
default:
status = STATUS_INVALID_DEVICE_REQUEST;
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index d06f6b5..14da674 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -418,5 +418,13 @@ IoctlSharedInfoGetTime(
__out PULONG_PTR Info
);
+NTSTATUS
+IoctlLog(
+ __in PXENIFACE_FDO Fdo,
+ __in PCHAR Buffer,
+ __in ULONG InLen,
+ __in ULONG OutLen
+ );
+
#endif // _IOCTLS_H_
--
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 |