Isolate console handler code from fdo code.
This will make the console code easier to maintain.
Signed-off-by: Owen Smith <owen.smith@citrix.com>
Rename __ConsoleDestroy() to __ConsoleDestroyHandle() and introduce
__ConsoleCreateHandle() which is called by ConsoleOpen() to allocate and
initialize a handle.
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
--- /dev/null
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define INITGUID 1
+
+#include <ntddk.h>
+#include <wdmguid.h>
+#include <ntstrsafe.h>
+#include <stdlib.h>
+
+#include "driver.h"
+#include "console.h"
+#include "stream.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define CONSOLE_POOL 'SNOC'
+
+typedef struct _CONSOLE_HANDLE {
+ LIST_ENTRY ListEntry;
+ PFILE_OBJECT FileObject;
+ PXENCONS_STREAM Stream;
+} CONSOLE_HANDLE, *PCONSOLE_HANDLE;
+
+struct _XENCONS_CONSOLE {
+ PXENCONS_FDO Fdo;
+ LIST_ENTRY List;
+ KSPIN_LOCK Lock;
+};
+
+static FORCEINLINE PVOID
+__ConsoleAllocate(
+ IN ULONG Length
+ )
+{
+ return __AllocatePoolWithTag(NonPagedPool, Length, CONSOLE_POOL);
+}
+
+static FORCEINLINE VOID
+__ConsoleFree(
+ IN PVOID Buffer
+ )
+{
+ __FreePoolWithTag(Buffer, CONSOLE_POOL);
+}
+
+static FORCEINLINE NTSTATUS
+__ConsoleCreateHandle(
+ IN PXENCONS_CONSOLE Console,
+ IN PFILE_OBJECT FileObject,
+ OUT PCONSOLE_HANDLE *Handle
+ )
+{
+ NTSTATUS status;
+
+ *Handle = __ConsoleAllocate(sizeof(CONSOLE_HANDLE));
+
+ status = STATUS_NO_MEMORY;
+ if (*Handle == NULL)
+ goto fail1;
+
+ status = StreamCreate(Console->Fdo, &(*Handle)->Stream);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ (*Handle)->FileObject = FileObject;
+
+ return STATUS_SUCCESS;
+
+fail2:
+ Error("fail2\n");
+
+ ASSERT(IsZeroMemory(Handle, sizeof(CONSOLE_HANDLE)));
+ __ConsoleFree(Handle);
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+static FORCEINLINE VOID
+__ConsoleDestroyHandle(
+ IN PXENCONS_CONSOLE Console,
+ IN PCONSOLE_HANDLE Handle
+ )
+{
+ UNREFERENCED_PARAMETER(Console);
+
+ RtlZeroMemory(&Handle->ListEntry, sizeof(LIST_ENTRY));
+
+ StreamDestroy(Handle->Stream);
+ Handle->Stream = NULL;
+
+ Handle->FileObject = NULL;
+
+ ASSERT(IsZeroMemory(Handle, sizeof(CONSOLE_HANDLE)));
+ __ConsoleFree(Handle);
+}
+
+static PCONSOLE_HANDLE
+__ConsoleFindHandle(
+ IN PXENCONS_CONSOLE Console,
+ IN PFILE_OBJECT FileObject
+ )
+{
+ KIRQL Irql;
+ PLIST_ENTRY ListEntry;
+ PCONSOLE_HANDLE Handle;
+ NTSTATUS status;
+
+ KeAcquireSpinLock(&Console->Lock, &Irql);
+
+ for (ListEntry = Console->List.Flink;
+ ListEntry != &Console->List;
+ ListEntry = ListEntry->Flink) {
+ Handle = CONTAINING_RECORD(ListEntry,
+ CONSOLE_HANDLE,
+ ListEntry);
+
+ if (Handle->FileObject == FileObject)
+ goto found;
+ }
+
+ status = STATUS_UNSUCCESSFUL;
+ goto fail1;
+
+found:
+ KeReleaseSpinLock(&Console->Lock, Irql);
+
+ return Handle;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ KeReleaseSpinLock(&Console->Lock, Irql);
+
+ return NULL;
+}
+
+NTSTATUS
+ConsoleOpen(
+ IN PXENCONS_CONSOLE Console,
+ IN PFILE_OBJECT FileObject
+ )
+{
+ PCONSOLE_HANDLE Handle;
+ KIRQL Irql;
+ NTSTATUS status;
+
+ status = __ConsoleCreateHandle(Console, FileObject, &Handle);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ KeAcquireSpinLock(&Console->Lock, &Irql);
+ InsertTailList(&Console->List, &Handle->ListEntry);
+ KeReleaseSpinLock(&Console->Lock, Irql);
+
+ Trace("%p\n", Handle->FileObject);
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+ConsoleClose(
+ IN PXENCONS_CONSOLE Console,
+ IN PFILE_OBJECT FileObject
+ )
+{
+ PCONSOLE_HANDLE Handle;
+ KIRQL Irql;
+ NTSTATUS status;
+
+ Handle = __ConsoleFindHandle(Console, FileObject);
+
+ status = STATUS_UNSUCCESSFUL;
+ if (Handle == NULL)
+ goto fail1;
+
+ Trace("%p\n", Handle->FileObject);
+
+ KeAcquireSpinLock(&Console->Lock, &Irql);
+ RemoveEntryList(&Handle->ListEntry);
+ KeReleaseSpinLock(&Console->Lock, Irql);
+
+ __ConsoleDestroyHandle(Console, Handle);
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+ConsolePutQueue(
+ IN PXENCONS_CONSOLE Console,
+ IN PIRP Irp
+ )
+{
+ PIO_STACK_LOCATION StackLocation;
+ PCONSOLE_HANDLE Handle;
+ NTSTATUS status;
+
+ StackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+ Handle = __ConsoleFindHandle(Console, StackLocation->FileObject);
+
+ status = STATUS_UNSUCCESSFUL;
+ if (Handle == NULL)
+ goto fail1;
+
+ status = StreamPutQueue(Handle->Stream, Irp);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ return STATUS_PENDING;
+
+fail2:
+ Error("fail2\n");
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+ConsoleD3ToD0(
+ IN PXENCONS_CONSOLE Console
+ )
+{
+ Trace("====>\n");
+
+ UNREFERENCED_PARAMETER(Console);
+
+ Trace("<====\n");
+
+ return STATUS_SUCCESS;
+}
+
+VOID
+ConsoleD0ToD3(
+ IN PXENCONS_CONSOLE Console
+ )
+{
+ KIRQL Irql;
+ LIST_ENTRY List;
+ PLIST_ENTRY ListEntry;
+ PCONSOLE_HANDLE Handle;
+
+ Trace("====>\n");
+
+ InitializeListHead(&List);
+
+ KeAcquireSpinLock(&Console->Lock, &Irql);
+
+ ListEntry = Console->List.Flink;
+ if (!IsListEmpty(&Console->List)) {
+ RemoveEntryList(&Console->List);
+ InitializeListHead(&Console->List);
+ AppendTailList(&List, ListEntry);
+ }
+
+ KeReleaseSpinLock(&Console->Lock, Irql);
+
+ while (!IsListEmpty(&List)) {
+ ListEntry = RemoveHeadList(&List);
+ ASSERT3P(ListEntry, != , &List);
+
+ Handle = CONTAINING_RECORD(ListEntry,
+ CONSOLE_HANDLE,
+ ListEntry);
+
+ __ConsoleDestroyHandle(Console, Handle);
+ }
+
+ Trace("<====\n");
+}
+
+NTSTATUS
+ConsoleCreate(
+ IN PXENCONS_FDO Fdo,
+ OUT PXENCONS_CONSOLE *Console
+ )
+{
+ NTSTATUS status;
+
+ Trace("====>\n");
+
+ *Console = __ConsoleAllocate(sizeof(XENCONS_CONSOLE));
+
+ status = STATUS_NO_MEMORY;
+ if (*Console == NULL)
+ goto fail1;
+
+ (*Console)->Fdo = Fdo;
+ InitializeListHead(&(*Console)->List);
+ KeInitializeSpinLock(&(*Console)->Lock);
+
+ Trace("<====\n");
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+VOID
+ConsoleDestroy(
+ IN PXENCONS_CONSOLE Console
+ )
+{
+ Trace("====>\n");
+
+ ASSERT(IsListEmpty(&Console->List));
+ RtlZeroMemory(&Console->List, sizeof(LIST_ENTRY));
+
+ RtlZeroMemory(&Console->Lock, sizeof(KSPIN_LOCK));
+
+ Console->Fdo = NULL;
+
+ ASSERT(IsZeroMemory(Console, sizeof(XENCONS_CONSOLE)));
+ __ConsoleFree(Console);
+
+ Trace("<====\n");
+}
--- /dev/null
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENCONS_CONSOLE_H
+#define _XENCONS_CONSOLE_H
+
+#include <ntddk.h>
+
+#include "driver.h"
+
+typedef struct _XENCONS_CONSOLE XENCONS_CONSOLE, *PXENCONS_CONSOLE;
+
+extern NTSTATUS
+ConsoleCreate(
+ IN PXENCONS_FDO Fdo,
+ OUT PXENCONS_CONSOLE *Console
+ );
+
+extern VOID
+ConsoleDestroy(
+ IN PXENCONS_CONSOLE Console
+ );
+
+extern NTSTATUS
+ConsoleD3ToD0(
+ IN PXENCONS_CONSOLE Console
+ );
+
+extern VOID
+ConsoleD0ToD3(
+ IN PXENCONS_CONSOLE Console
+ );
+
+extern NTSTATUS
+ConsoleOpen(
+ IN PXENCONS_CONSOLE Console,
+ IN PFILE_OBJECT FileObject
+ );
+
+extern NTSTATUS
+ConsoleClose(
+ IN PXENCONS_CONSOLE Console,
+ IN PFILE_OBJECT FileObject
+ );
+
+extern NTSTATUS
+ConsolePutQueue(
+ IN PXENCONS_CONSOLE Console,
+ IN PIRP Irp
+ );
+
+#endif // _XENCONS_CONSOLE_H
#include "driver.h"
#include "registry.h"
#include "fdo.h"
-#include "stream.h"
+#include "console.h"
#include "thread.h"
#include "names.h"
#include "dbg_print.h"
CM_PARTIAL_RESOURCE_DESCRIPTOR Translated;
} FDO_RESOURCE, *PFDO_RESOURCE;
-typedef struct _FDO_HANDLE {
- LIST_ENTRY ListEntry;
- PFILE_OBJECT FileObject;
- PXENCONS_STREAM Stream;
-} FDO_HANDLE, *PFDO_HANDLE;
-
struct _XENCONS_FDO {
PXENCONS_DX Dx;
PDEVICE_OBJECT LowerDeviceObject;
FDO_RESOURCE Resource[RESOURCE_COUNT];
- LIST_ENTRY HandleList;
- KSPIN_LOCK HandleLock;
+ PXENCONS_CONSOLE Console;
XENBUS_DEBUG_INTERFACE DebugInterface;
XENBUS_SUSPEND_INTERFACE SuspendInterface;
return status;
}
-static FORCEINLINE VOID
+static FORCEINLINE NTSTATUS
__FdoD3ToD0(
IN PXENCONS_FDO Fdo
)
(VOID) FdoSetDistribution(Fdo);
Trace("<====\n");
+
+ return STATUS_SUCCESS;
}
static FORCEINLINE VOID
)
{
PXENCONS_FDO Fdo = Argument;
+ NTSTATUS status;
__FdoD0ToD3(Fdo);
- __FdoD3ToD0(Fdo);
+
+ status = __FdoD3ToD0(Fdo);
+ ASSERT(NT_SUCCESS(status));
}
// This function must not touch pageable code or data
if (!NT_SUCCESS(status))
goto fail2;
- __FdoD3ToD0(Fdo);
+ status = __FdoD3ToD0(Fdo);
+ if (!NT_SUCCESS(status))
+ goto fail3;
status = XENBUS_SUSPEND(Register,
&Fdo->SuspendInterface,
Fdo,
&Fdo->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail4;
KeLowerIrql(Irql);
DevicePowerState,
PowerState);
+ status = ConsoleD3ToD0(Fdo->Console);
+ ASSERT(NT_SUCCESS(status));
+
#pragma prefast(suppress:28123)
(VOID) IoSetDeviceInterfaceState(&Dx->Link, TRUE);
return STATUS_SUCCESS;
-fail3:
+fail4:
Error("fail4\n");
__FdoD0ToD3(Fdo);
+fail3:
+ Error("fail3\n");
+
XENBUS_STORE(Release, &Fdo->StoreInterface);
fail2:
XENBUS_SUSPEND(Release, &Fdo->SuspendInterface);
- __FdoD0ToD3(Fdo);
-
fail1:
Error("fail1 (%08x)\n", status);
return status;
}
-static FORCEINLINE VOID
-__FdoDestroyHandle(
- IN PXENCONS_FDO Fdo,
- IN PFDO_HANDLE Handle
- )
-{
- UNREFERENCED_PARAMETER(Fdo);
-
- Trace("%p\n", Handle->FileObject);
-
- RtlZeroMemory(&Handle->ListEntry, sizeof (LIST_ENTRY));
-
- StreamDestroy(Handle->Stream);
- Handle->Stream = NULL;
-
- Handle->FileObject = NULL;
-
- ASSERT(IsZeroMemory(Handle, sizeof (FDO_HANDLE)));
- __FdoFree(Handle);
-}
-
-static VOID
-FdoDestroyHandle(
- IN PXENCONS_FDO Fdo,
- IN PFDO_HANDLE Handle
- )
-{
- KIRQL Irql;
-
- KeAcquireSpinLock(&Fdo->HandleLock, &Irql);
- RemoveEntryList(&Handle->ListEntry);
- KeReleaseSpinLock(&Fdo->HandleLock, Irql);
-
- __FdoDestroyHandle(Fdo, Handle);
-}
-
-static VOID
-FdoDestroyAllHandles(
- IN PXENCONS_FDO Fdo
- )
-{
- KIRQL Irql;
- LIST_ENTRY List;
- PLIST_ENTRY ListEntry;
- PFDO_HANDLE Handle;
-
- InitializeListHead(&List);
-
- KeAcquireSpinLock(&Fdo->HandleLock, &Irql);
-
- ListEntry = Fdo->HandleList.Flink;
- if (!IsListEmpty(&Fdo->HandleList)) {
- RemoveEntryList(&Fdo->HandleList);
- InitializeListHead(&Fdo->HandleList);
- AppendTailList(&List, ListEntry);
- }
-
- KeReleaseSpinLock(&Fdo->HandleLock, Irql);
-
- while (!IsListEmpty(&List)) {
- ListEntry = RemoveHeadList(&List);
- ASSERT3P(ListEntry, !=, &List);
-
- Handle = CONTAINING_RECORD(ListEntry,
- FDO_HANDLE,
- ListEntry);
-
- __FdoDestroyHandle(Fdo, Handle);
- }
-}
-
// This function must not touch pageable code or data
static DECLSPEC_NOINLINE VOID
FdoD0ToD3(
#pragma prefast(suppress:28123)
(VOID) IoSetDeviceInterfaceState(&Dx->Link, FALSE);
- FdoDestroyAllHandles(Fdo);
+ ConsoleD0ToD3(Fdo->Console);
PowerState.DeviceState = PowerDeviceD3;
PoSetPowerState(Fdo->Dx->DeviceObject,
return status;
}
-static NTSTATUS
-FdoCreateHandle(
- IN PXENCONS_FDO Fdo,
- IN PFILE_OBJECT FileObject
- )
-{
- PFDO_HANDLE Handle;
- KIRQL Irql;
- NTSTATUS status;
-
- Handle = __FdoAllocate(sizeof (FDO_HANDLE));
-
- status = STATUS_NO_MEMORY;
- if (Handle == NULL)
- goto fail1;
-
- status = StreamCreate(Fdo, &Handle->Stream);
- if (!NT_SUCCESS(status))
- goto fail2;
-
- Handle->FileObject = FileObject;
-
- KeAcquireSpinLock(&Fdo->HandleLock, &Irql);
- InsertTailList(&Fdo->HandleList, &Handle->ListEntry);
- KeReleaseSpinLock(&Fdo->HandleLock, Irql);
-
- Trace("%p\n", Handle->FileObject);
-
- return STATUS_SUCCESS;
-
-fail2:
- Error("fail2\n");
-
- ASSERT(IsZeroMemory(Handle, sizeof (FDO_HANDLE)));
- __FdoFree(Handle);
-
-fail1:
- Error("fail1 (%08x)\n", status);
-
- return status;
-}
-
-static PFDO_HANDLE
-FdoFindHandle(
- IN PXENCONS_FDO Fdo,
- IN PFILE_OBJECT FileObject
- )
-{
- KIRQL Irql;
- PLIST_ENTRY ListEntry;
- PFDO_HANDLE Handle;
- NTSTATUS status;
-
- KeAcquireSpinLock(&Fdo->HandleLock, &Irql);
-
- for (ListEntry = Fdo->HandleList.Flink;
- ListEntry != &Fdo->HandleList;
- ListEntry = ListEntry->Flink) {
- Handle = CONTAINING_RECORD(ListEntry,
- FDO_HANDLE,
- ListEntry);
-
- if (Handle->FileObject == FileObject)
- goto found;
- }
-
- status = STATUS_UNSUCCESSFUL;
- goto fail1;
-
-found:
- KeReleaseSpinLock(&Fdo->HandleLock, Irql);
-
- return Handle;
-
-fail1:
- Error("fail1 (%08x)\n", status);
-
- KeReleaseSpinLock(&Fdo->HandleLock, Irql);
-
- return NULL;
-}
-
static DECLSPEC_NOINLINE NTSTATUS
FdoDispatchCreate(
IN PXENCONS_FDO Fdo,
StackLocation = IoGetCurrentIrpStackLocation(Irp);
- status = FdoCreateHandle(Fdo, StackLocation->FileObject);
+ status = ConsoleOpen(Fdo->Console, StackLocation->FileObject);
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
)
{
PIO_STACK_LOCATION StackLocation;
- PFDO_HANDLE Handle;
NTSTATUS status;
StackLocation = IoGetCurrentIrpStackLocation(Irp);
- Handle = FdoFindHandle(Fdo, StackLocation->FileObject);
-
- status = STATUS_UNSUCCESSFUL;
- if (Handle == NULL)
- goto fail1;
-
- FdoDestroyHandle(Fdo, Handle);
- status = STATUS_SUCCESS;
-
- Irp->IoStatus.Status = status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return status;
-
-fail1:
- Error("fail1 (%08x)\n", status);
+ status = ConsoleClose(Fdo->Console, StackLocation->FileObject);
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
IN PIRP Irp
)
{
- PIO_STACK_LOCATION StackLocation;
- PFDO_HANDLE Handle;
NTSTATUS status;
- StackLocation = IoGetCurrentIrpStackLocation(Irp);
-
- Handle = FdoFindHandle(Fdo, StackLocation->FileObject);
-
- status = STATUS_UNSUCCESSFUL;
- if (Handle == NULL)
+ status = ConsolePutQueue(Fdo->Console, Irp);
+ if (status != STATUS_PENDING)
goto fail1;
- IoMarkIrpPending(Irp);
-
- status = StreamPutQueue(Handle->Stream, Irp);
- if (!NT_SUCCESS(status))
- goto fail2;
-
return STATUS_PENDING;
-fail2:
- Error("fail2\n");
-
fail1:
Error("fail1 (%08x)\n", status);
if (!NT_SUCCESS(status))
goto fail11;
- InitializeListHead(&Fdo->HandleList);
- KeInitializeSpinLock(&Fdo->HandleLock);
+ status = ConsoleCreate(Fdo, &Fdo->Console);
+ if (!NT_SUCCESS(status))
+ goto fail12;
FunctionDeviceObject->Flags |= DO_BUFFERED_IO;
FunctionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
+fail12:
+ Error("fail12\n");
+
+ RtlZeroMemory(&Fdo->ConsoleInterface,
+ sizeof(XENBUS_CONSOLE_INTERFACE));
+
fail11:
Error("fail11\n");
- RtlZeroMemory(&Fdo->ConsoleInterface,
- sizeof (XENBUS_CONSOLE_INTERFACE));
+ RtlZeroMemory(&Fdo->StoreInterface,
+ sizeof (XENBUS_STORE_INTERFACE));
fail10:
Error("fail10\n");
Dx->Fdo = NULL;
- RtlZeroMemory(&Fdo->HandleLock, sizeof (KSPIN_LOCK));
-
- ASSERT(IsListEmpty(&Fdo->HandleList));
- RtlZeroMemory(&Fdo->HandleList, sizeof (LIST_ENTRY));
+ ConsoleDestroy(Fdo->Console);
+ Fdo->Console = NULL;
RtlZeroMemory(&Fdo->ConsoleInterface,
sizeof (XENBUS_CONSOLE_INTERFACE));
<ClCompile Include="../../src/xencons/driver.c" />
<ClCompile Include="../../src/xencons/fdo.c" />
<ClCompile Include="../../src/xencons/registry.c" />
+ <ClCompile Include="../../src/xencons/console.c" />
<ClCompile Include="../../src/xencons/stream.c" />
<ClCompile Include="../../src/xencons/thread.c" />
</ItemGroup>
<ClCompile Include="../../src/xencons/driver.c" />
<ClCompile Include="../../src/xencons/fdo.c" />
<ClCompile Include="../../src/xencons/registry.c" />
+ <ClCompile Include="../../src/xencons/console.c" />
<ClCompile Include="../../src/xencons/stream.c" />
<ClCompile Include="../../src/xencons/thread.c" />
</ItemGroup>