[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH 4/4] Add Log IOCTL
> -----Original Message----- > From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On > Behalf Of Owen Smith > Sent: 28 June 2016 11:36 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Owen Smith > Subject: [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> Reviewed-by: Paul Durrant <paul.durrant@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 _______________________________________________ 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 |