[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 02/14] Refactor: Move console handler to console.h/.c
From: Owen Smith <owen.smith@xxxxxxxxxx> Split the console specific code from the general fdo code. Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xencons/console.c | 323 +++++++++++++++++++++++++++++++++++++++++ src/xencons/console.h | 80 ++++++++++ src/xencons/fdo.c | 260 +++++++-------------------------- vs2015/xencons/xencons.vcxproj | 1 + 4 files changed, 454 insertions(+), 210 deletions(-) create mode 100755 src/xencons/console.c create mode 100755 src/xencons/console.h diff --git a/src/xencons/console.c b/src/xencons/console.c new file mode 100755 index 0000000..e26e1db --- /dev/null +++ b/src/xencons/console.c @@ -0,0 +1,323 @@ +/* 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. +*/ + +#include <ntddk.h> + +#include "driver.h" +#include "console.h" +#include "stream.h" +#include "dbg_print.h" +#include "assert.h" +#include "util.h" + +struct _XENCONS_CONSOLE { + PXENCONS_FDO Fdo; + LIST_ENTRY List; + KSPIN_LOCK Lock; +}; + +typedef struct _XENCONS_HANDLE { + LIST_ENTRY ListEntry; + PFILE_OBJECT FileObject; + PXENCONS_STREAM Stream; +} XENCONS_HANDLE, *PXENCONS_HANDLE; + +#define CONSOLE_POOL 'SNOC' + +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 VOID +__ConsoleDestroyHandle( + IN PXENCONS_CONSOLE Console, + IN PXENCONS_HANDLE Handle + ) +{ + UNREFERENCED_PARAMETER(Console); + + Trace("%p\n", Handle->FileObject); + + RtlZeroMemory(&Handle->ListEntry, sizeof(LIST_ENTRY)); + + StreamDestroy(Handle->Stream); + Handle->Stream = NULL; + + Handle->FileObject = NULL; + + ASSERT(IsZeroMemory(Handle, sizeof(XENCONS_HANDLE))); + __ConsoleFree(Handle); +} + +static PXENCONS_HANDLE +__ConsoleFindHandle( + IN PXENCONS_CONSOLE Console, + IN PFILE_OBJECT FileObject + ) +{ + KIRQL Irql; + PLIST_ENTRY ListEntry; + PXENCONS_HANDLE Handle; + NTSTATUS status; + + KeAcquireSpinLock(&Console->Lock, &Irql); + + for (ListEntry = Console->List.Flink; + ListEntry != &Console->List; + ListEntry = ListEntry->Flink) { + Handle = CONTAINING_RECORD(ListEntry, + XENCONS_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 +ConsoleDispatchCreate( + IN PXENCONS_CONSOLE Console, + IN PFILE_OBJECT FileObject + ) +{ + PXENCONS_HANDLE Handle; + KIRQL Irql; + NTSTATUS status; + + ASSERT(__ConsoleFindHandle(Console, FileObject) == NULL); + + Handle = __ConsoleAllocate(sizeof(XENCONS_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; + + KeAcquireSpinLock(&Console->Lock, &Irql); + InsertTailList(&Console->List, &Handle->ListEntry); + KeReleaseSpinLock(&Console->Lock, Irql); + + Trace("%p\n", Handle->FileObject); + + return STATUS_SUCCESS; + +fail2: + Error("fail2\n"); + + ASSERT(IsZeroMemory(Handle, sizeof(XENCONS_HANDLE))); + __ConsoleFree(Handle); + +fail1: + Error("fail1 (%08x)\n", status); + + return status; +} + +NTSTATUS +ConsoleDispatchCleanup( + IN PXENCONS_CONSOLE Console, + IN PFILE_OBJECT FileObject + ) +{ + PXENCONS_HANDLE Handle; + KIRQL Irql; + NTSTATUS status; + + Handle = __ConsoleFindHandle(Console, FileObject); + status = STATUS_UNSUCCESSFUL; + + if (Handle == NULL) + goto fail1; + + 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 +ConsoleDispatchReadWrite( + IN PXENCONS_CONSOLE Console, + IN PIRP Irp + ) +{ + PIO_STACK_LOCATION StackLocation; + PXENCONS_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_SUCCESS; + +fail2: + Error("fail2\n"); + +fail1: + Error("fail1 (%08x)\n", status); + + return status; +} + +NTSTATUS +ConsoleEnable( + IN PXENCONS_CONSOLE Console + ) +{ + UNREFERENCED_PARAMETER(Console); + return STATUS_SUCCESS; +} + +VOID +ConsoleDisable( + IN PXENCONS_CONSOLE Console + ) +{ + KIRQL Irql; + LIST_ENTRY List; + PLIST_ENTRY ListEntry; + PXENCONS_HANDLE Handle; + + 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, + XENCONS_HANDLE, + ListEntry); + + __ConsoleDestroyHandle(Console, Handle); + } +} + +NTSTATUS +ConsoleCreate( + IN PXENCONS_FDO Fdo, + OUT PXENCONS_CONSOLE *Console + ) +{ + NTSTATUS status; + + *Console = __ConsoleAllocate(sizeof(XENCONS_CONSOLE)); + + status = STATUS_NO_MEMORY; + if (*Console == NULL) + goto fail1; + + (*Console)->Fdo = Fdo; + InitializeListHead(&(*Console)->List); + KeInitializeSpinLock(&(*Console)->Lock); + + return STATUS_SUCCESS; + +fail1: + Error("fail1 (%08x)\n", status); + + return status; +} + +VOID +ConsoleDestroy( + IN PXENCONS_CONSOLE Console + ) +{ + RtlZeroMemory(&Console->Lock, sizeof(KSPIN_LOCK)); + + ASSERT(IsListEmpty(&Console->List)); + RtlZeroMemory(&Console->List, sizeof(LIST_ENTRY)); + + Console->Fdo = NULL; + + ASSERT(IsZeroMemory(Console, sizeof(XENCONS_CONSOLE))); + __ConsoleFree(Console); +} diff --git a/src/xencons/console.h b/src/xencons/console.h new file mode 100755 index 0000000..e295a69 --- /dev/null +++ b/src/xencons/console.h @@ -0,0 +1,80 @@ +/* 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 +ConsoleEnable( + IN PXENCONS_CONSOLE Console + ); + +extern VOID +ConsoleDisable( + IN PXENCONS_CONSOLE Console + ); + +extern NTSTATUS +ConsoleDispatchCreate( + IN PXENCONS_CONSOLE Console, + IN PFILE_OBJECT FileObject + ); + +extern NTSTATUS +ConsoleDispatchCleanup( + IN PXENCONS_CONSOLE Console, + IN PFILE_OBJECT FileObject + ); + +extern NTSTATUS +ConsoleDispatchReadWrite( + IN PXENCONS_CONSOLE Console, + IN PIRP Irp + ); + +#endif // _XENCONS_CONSOLE_H diff --git a/src/xencons/fdo.c b/src/xencons/fdo.c index 94465a5..6a7f70c 100644 --- a/src/xencons/fdo.c +++ b/src/xencons/fdo.c @@ -47,7 +47,7 @@ #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" @@ -69,12 +69,6 @@ typedef struct _FDO_RESOURCE { 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; @@ -93,8 +87,7 @@ struct _XENCONS_FDO { FDO_RESOURCE Resource[RESOURCE_COUNT]; - LIST_ENTRY HandleList; - KSPIN_LOCK HandleLock; + PXENCONS_CONSOLE Console; XENBUS_DEBUG_INTERFACE DebugInterface; XENBUS_SUSPEND_INTERFACE SuspendInterface; @@ -788,18 +781,31 @@ fail1: return status; } -static FORCEINLINE VOID +static FORCEINLINE NTSTATUS __FdoD3ToD0( IN PXENCONS_FDO Fdo ) { + NTSTATUS status; + Trace("====>\n"); ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL); + status = ConsoleEnable(Fdo->Console); + if (!NT_SUCCESS(status)) + goto fail1; + (VOID) FdoSetDistribution(Fdo); Trace("<====\n"); + + return STATUS_SUCCESS; + +fail1: + Error("fail1 (%08x)\n", status); + + return status; } static FORCEINLINE VOID @@ -813,6 +819,8 @@ __FdoD0ToD3( FdoClearDistribution(Fdo); + ConsoleDisable(Fdo->Console); + Trace("<====\n"); } @@ -822,9 +830,12 @@ FdoSuspendCallbackLate( ) { 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 @@ -853,7 +864,9 @@ FdoD3ToD0( if (!NT_SUCCESS(status)) goto fail2; - __FdoD3ToD0(Fdo); + status = __FdoD3ToD0(Fdo); + if (!NT_SUCCESS(status)) + goto fail3; status = XENBUS_SUSPEND(Register, &Fdo->SuspendInterface, @@ -862,7 +875,7 @@ FdoD3ToD0( Fdo, &Fdo->SuspendCallbackLate); if (!NT_SUCCESS(status)) - goto fail3; + goto fail4; KeLowerIrql(Irql); @@ -880,11 +893,14 @@ FdoD3ToD0( return STATUS_SUCCESS; -fail3: +fail4: Error("fail4\n"); __FdoD0ToD3(Fdo); +fail3: + Error("fail3\n"); + XENBUS_STORE(Release, &Fdo->StoreInterface); fail2: @@ -902,77 +918,6 @@ fail1: 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( @@ -991,8 +936,6 @@ FdoD0ToD3( #pragma prefast(suppress:28123) (VOID) IoSetDeviceInterfaceState(&Dx->Link, FALSE); - FdoDestroyAllHandles(Fdo); - PowerState.DeviceState = PowerDeviceD3; PoSetPowerState(Fdo->Dx->DeviceObject, DevicePowerState, @@ -2166,88 +2109,6 @@ done: 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, @@ -2259,7 +2120,8 @@ FdoDispatchCreate( StackLocation = IoGetCurrentIrpStackLocation(Irp); - status = FdoCreateHandle(Fdo, StackLocation->FileObject); + status = ConsoleDispatchCreate(Fdo->Console, + StackLocation->FileObject); Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -2274,27 +2136,12 @@ FdoDispatchCleanup( ) { 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 = ConsoleDispatchCleanup(Fdo->Console, + StackLocation->FileObject); Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -2326,29 +2173,17 @@ FdoDispatchReadWrite( 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) - goto fail1; - IoMarkIrpPending(Irp); - status = StreamPutQueue(Handle->Stream, Irp); + status = ConsoleDispatchReadWrite(Fdo->Console, + Irp); if (!NT_SUCCESS(status)) - goto fail2; + goto fail1; return STATUS_PENDING; -fail2: - Error("fail2\n"); - fail1: Error("fail1 (%08x)\n", status); @@ -2641,8 +2476,9 @@ FdoCreate( 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; @@ -2655,11 +2491,17 @@ FdoCreate( 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"); @@ -2744,10 +2586,8 @@ FdoDestroy( 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)); diff --git a/vs2015/xencons/xencons.vcxproj b/vs2015/xencons/xencons.vcxproj index ff65d9f..12f5b70 100644 --- a/vs2015/xencons/xencons.vcxproj +++ b/vs2015/xencons/xencons.vcxproj @@ -67,6 +67,7 @@ <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> -- 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 |