|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 03/14] Add IOCTLs to get Instance, Name and Protocol
From: Owen Smith <owen.smith@xxxxxxxxxx>
Hard code these values for the default console, the values
should be read from xenstore
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
include/xencons_device.h | 17 ++++++++++
src/xencons/fdo.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 99 insertions(+)
diff --git a/include/xencons_device.h b/include/xencons_device.h
index eaf57d8..52f2671 100644
--- a/include/xencons_device.h
+++ b/include/xencons_device.h
@@ -36,4 +36,21 @@
DEFINE_GUID(GUID_XENCONS_DEVICE,
0xd3edd21, 0x8ef9, 0x4dff, 0x85, 0x6c, 0x8c, 0x68, 0xbf, 0x4f,
0xdc, 0xa3);
+#define __IOCTL_XENCONS_BEGIN 0x800
+
+#define IOCTL_XENCONS_GET_INSTANCE CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ __IOCTL_XENCONS_BEGIN + 0, \
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
+#define IOCTL_XENCONS_GET_NAME CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ __IOCTL_XENCONS_BEGIN + 1, \
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
+#define IOCTL_XENCONS_GET_PROTOCOL CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ __IOCTL_XENCONS_BEGIN + 2, \
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
#endif // _XENCONS_DEVICE_H
diff --git a/src/xencons/fdo.c b/src/xencons/fdo.c
index 6a7f70c..8e72dc6 100644
--- a/src/xencons/fdo.c
+++ b/src/xencons/fdo.c
@@ -2194,6 +2194,84 @@ fail1:
}
static DECLSPEC_NOINLINE NTSTATUS
+FdoDispatchControl(
+ IN PXENCONS_FDO Fdo,
+ IN PIRP Irp
+ )
+{
+ PIO_STACK_LOCATION StackLocation;
+ ULONG IoControlCode;
+ ULONG InputBufferLength;
+ ULONG OutputBufferLength;
+ PVOID Buffer;
+ PCHAR Value;
+ ULONG Length;
+ NTSTATUS status;
+
+ UNREFERENCED_PARAMETER(Fdo);
+
+ StackLocation = IoGetCurrentIrpStackLocation(Irp);
+ IoControlCode = StackLocation->Parameters.DeviceIoControl.IoControlCode;
+ InputBufferLength =
StackLocation->Parameters.DeviceIoControl.InputBufferLength;
+ OutputBufferLength =
StackLocation->Parameters.DeviceIoControl.OutputBufferLength;
+ Buffer = Irp->AssociatedIrp.SystemBuffer;
+
+ switch (IoControlCode) {
+ case IOCTL_XENCONS_GET_INSTANCE:
+ Value = "0";
+ break;
+ case IOCTL_XENCONS_GET_NAME:
+ Value = "default";
+ break;
+ case IOCTL_XENCONS_GET_PROTOCOL:
+ Value = "vt100";
+ break;
+ default:
+ status = STATUS_NOT_SUPPORTED;
+ goto fail1;
+ }
+ Length = (ULONG)strlen(Value);
+
+ status = STATUS_INVALID_PARAMETER;
+ if (InputBufferLength != 0)
+ goto fail2;
+
+ Irp->IoStatus.Information = Length;
+
+ status = STATUS_INVALID_BUFFER_SIZE;
+ if (OutputBufferLength == 0)
+ goto done;
+
+ RtlZeroMemory(Buffer, OutputBufferLength);
+
+ if (OutputBufferLength < Length)
+ goto fail3;
+
+ RtlCopyMemory(Buffer, Value, Length);
+ status = STATUS_SUCCESS;
+
+done:
+ Irp->IoStatus.Status = status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return status;
+
+fail3:
+ Error("fail3\n");
+
+fail2:
+ Error("fail2\n");
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ Irp->IoStatus.Status = status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
FdoDispatchDefault(
IN PXENCONS_FDO Fdo,
IN PIRP Irp
@@ -2250,6 +2328,10 @@ FdoDispatch(
status = FdoDispatchReadWrite(Fdo, Irp);
break;
+ case IRP_MJ_DEVICE_CONTROL:
+ status = FdoDispatchControl(Fdo, Irp);
+ break;
+
default:
status = FdoDispatchDefault(Fdo, Irp);
break;
--
2.8.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |