[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH 10/14 v2] Respond to non-default console IOCTLs



From: Owen Smith <owen.smith@xxxxxxxxxx>

Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
 src/xencons/frontend.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 91 insertions(+), 3 deletions(-)

diff --git a/src/xencons/frontend.c b/src/xencons/frontend.c
index bdd2945..a6e57d1 100755
--- a/src/xencons/frontend.c
+++ b/src/xencons/frontend.c
@@ -1215,6 +1215,80 @@ FrontendDestroy(
 }
 
 static NTSTATUS
+FrontendGetProperty(
+    IN  PXENCONS_FRONTEND   Frontend,
+    IN  PIRP                Irp
+    )
+{
+    PIO_STACK_LOCATION      StackLocation;
+    ULONG                   IoControlCode;
+    ULONG                   InputBufferLength;
+    ULONG                   OutputBufferLength;
+    PVOID                   Buffer;
+    PCHAR                   Value;
+    ULONG                   Length;
+    NTSTATUS                status;
+
+    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 = PdoGetName(Frontend->Pdo);
+        break;
+    case IOCTL_XENCONS_GET_NAME:
+        Value = Frontend->Name;
+        break;
+    case IOCTL_XENCONS_GET_PROTOCOL:
+        Value = Frontend->Protocol;
+        break;
+    default:
+        Value = NULL;
+        break;
+    }
+
+    status = STATUS_NOT_SUPPORTED;
+    if (Value == NULL)
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (InputBufferLength != 0)
+        goto fail2;
+
+    Length = (ULONG)strlen(Value) + 1;
+    Irp->IoStatus.Information = Length;
+
+    status = STATUS_INVALID_BUFFER_SIZE;
+    if (OutputBufferLength == 0)
+        goto fail3;
+
+    RtlZeroMemory(Buffer, OutputBufferLength);
+    if (OutputBufferLength < Length)
+        goto fail4;
+
+    RtlCopyMemory(Buffer, Value, Length);
+
+    return STATUS_SUCCESS;
+
+fail4:
+    Error("fail4\n");
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static NTSTATUS
 FrontendAbiAcquire(
     IN  PXENCONS_CONSOLE_CONTEXT    Context
     )
@@ -1373,9 +1447,23 @@ FrontendAbiPutQueue(
     IN  PIRP                        Irp
     )
 {
-    UNREFERENCED_PARAMETER(Context);
-    UNREFERENCED_PARAMETER(Irp);
-    return STATUS_DEVICE_NOT_READY;
+    PXENCONS_FRONTEND               Frontend = (PXENCONS_FRONTEND)Context;
+    PIO_STACK_LOCATION              StackLocation;
+
+    StackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+    switch (StackLocation->MajorFunction) {
+    case IRP_MJ_READ:
+    case IRP_MJ_WRITE:
+        return STATUS_DEVICE_NOT_READY;
+
+    case IRP_MJ_DEVICE_CONTROL:
+        return FrontendGetProperty(Frontend, Irp);
+
+    default:
+        ASSERT(FALSE);
+        return STATUS_NOT_SUPPORTED;
+    }
 }
 
 static XENCONS_CONSOLE_ABI FrontendAbiV1 = {
-- 
2.8.3


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.