#include <suspend_interface.h>
#include <store_interface.h>
#include <console_interface.h>
-#include <xencons_device.h>
#include <version.h>
#include "driver.h"
#include "fdo.h"
#include "pdo.h"
#include "mutex.h"
-#include "console.h"
#include "thread.h"
#include "names.h"
#include "dbg_print.h"
FDO_RESOURCE Resource[RESOURCE_COUNT];
- PXENCONS_CONSOLE Console;
-
XENBUS_DEBUG_INTERFACE DebugInterface;
XENBUS_SUSPEND_INTERFACE SuspendInterface;
XENBUS_STORE_INTERFACE StoreInterface;
__FdoReleaseMutex(Fdo);
- status = ConsoleD3ToD0(Fdo->Console);
- ASSERT(NT_SUCCESS(status));
-
-#pragma prefast(suppress:28123)
- (VOID) IoSetDeviceInterfaceState(&Fdo->Dx->Link, TRUE);
-
Trace("<====\n");
return STATUS_SUCCESS;
Trace("====>\n");
-#pragma prefast(suppress:28123)
- (VOID) IoSetDeviceInterfaceState(&Fdo->Dx->Link, FALSE);
-
- ConsoleD0ToD3(Fdo->Console);
-
__FdoAcquireMutex(Fdo);
for (ListEntry = Fdo->Dx->ListEntry.Flink;
return status;
}
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchCreate(
- IN PXENCONS_FDO Fdo,
- IN PIRP Irp
- )
-{
- PIO_STACK_LOCATION StackLocation;
- NTSTATUS status;
-
- StackLocation = IoGetCurrentIrpStackLocation(Irp);
-
- status = ConsoleOpen(Fdo->Console, StackLocation->FileObject);
-
- Irp->IoStatus.Status = status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchCleanup(
- IN PXENCONS_FDO Fdo,
- IN PIRP Irp
- )
-{
- PIO_STACK_LOCATION StackLocation;
- NTSTATUS status;
-
- StackLocation = IoGetCurrentIrpStackLocation(Irp);
-
- status = ConsoleClose(Fdo->Console, StackLocation->FileObject);
-
- Irp->IoStatus.Status = status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchClose(
- IN PXENCONS_FDO Fdo,
- IN PIRP Irp
- )
-{
- NTSTATUS status;
-
- UNREFERENCED_PARAMETER(Fdo);
-
- status = STATUS_SUCCESS;
-
- Irp->IoStatus.Status = status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchReadWrite(
- IN PXENCONS_FDO Fdo,
- IN PIRP Irp
- )
-{
- NTSTATUS status;
-
- status = ConsolePutQueue(Fdo->Console, Irp);
- if (status != STATUS_PENDING)
- goto fail1;
-
- return STATUS_PENDING;
-
-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,
status = FdoDispatchPower(Fdo, Irp);
break;
- case IRP_MJ_CREATE:
- status = FdoDispatchCreate(Fdo, Irp);
- break;
-
- case IRP_MJ_CLEANUP:
- status = FdoDispatchCleanup(Fdo, Irp);
- break;
-
- case IRP_MJ_CLOSE:
- status = FdoDispatchClose(Fdo, Irp);
- break;
-
- case IRP_MJ_READ:
- case IRP_MJ_WRITE:
- status = FdoDispatchReadWrite(Fdo, Irp);
- break;
-
default:
status = FdoDispatchDefault(Fdo, Irp);
break;
DEFINE_FDO_GET_INTERFACE(Store, PXENBUS_STORE_INTERFACE)
DEFINE_FDO_GET_INTERFACE(Console, PXENBUS_CONSOLE_INTERFACE)
-#pragma warning(push)
-#pragma warning(disable:6014) // Leaking memory '&Dx->Link'
-
NTSTATUS
FdoCreate(
IN PDEVICE_OBJECT PhysicalDeviceObject
Dx = (PXENCONS_DX)FunctionDeviceObject->DeviceExtension;
RtlZeroMemory(Dx, sizeof (XENCONS_DX));
- status = IoRegisterDeviceInterface(PhysicalDeviceObject,
- &GUID_XENCONS_DEVICE,
- NULL,
- &Dx->Link);
- if (!NT_SUCCESS(status))
- goto fail2;
-
Dx->Type = FUNCTION_DEVICE_OBJECT;
Dx->DeviceObject = FunctionDeviceObject;
Dx->DevicePnpState = Added;
if (!NT_SUCCESS(status))
goto fail11;
- status = ConsoleCreate(Fdo, &Fdo->Console);
- if (!NT_SUCCESS(status))
- goto fail12;
-
- FunctionDeviceObject->Flags |= DO_BUFFERED_IO;
-
Dx->Fdo = Fdo;
InitializeMutex(&Fdo->Mutex);
status = PdoCreate(Fdo, NULL);
if (!NT_SUCCESS(status))
- goto fail13;
+ goto fail12;
FunctionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
-fail13:
- Error("fail13\n");
+fail12:
+ Error("fail12\n");
Dx->Fdo = Fdo;
RtlZeroMemory(&Dx->ListEntry, sizeof(LIST_ENTRY));
Fdo->References = 0;
- ConsoleDestroy(Fdo->Console);
- Fdo->Console = NULL;
-
-fail12:
- Error("fail12\n");
-
RtlZeroMemory(&Fdo->ConsoleInterface,
sizeof(XENBUS_CONSOLE_INTERFACE));
fail3:
Error("fail3\n");
- RtlFreeUnicodeString(&Dx->Link);
-
-fail2:
- Error("fail2\n");
-
IoDeleteDevice(FunctionDeviceObject);
fail1:
Dx->Fdo = NULL;
- ConsoleDestroy(Fdo->Console);
- Fdo->Console = NULL;
-
RtlZeroMemory(&Fdo->ConsoleInterface,
sizeof (XENBUS_CONSOLE_INTERFACE));
ASSERT(IsZeroMemory(Fdo, sizeof (XENCONS_FDO)));
__FdoFree(Fdo);
- RtlFreeUnicodeString(&Dx->Link);
-
IoDeleteDevice(FunctionDeviceObject);
}
-
-#pragma warning(pop)
#include <stdlib.h>
#include <suspend_interface.h>
+#include <xencons_device.h>
#include <version.h>
#include "driver.h"
#include "names.h"
#include "fdo.h"
#include "pdo.h"
+#include "console.h"
#include "thread.h"
#include "dbg_print.h"
#include "assert.h"
XENBUS_SUSPEND_INTERFACE SuspendInterface;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate;
+
+ PXENCONS_CONSOLE Console;
};
static FORCEINLINE PVOID
KeLowerIrql(Irql);
+ status = ConsoleD3ToD0(Pdo->Console);
+ if (!NT_SUCCESS(status))
+ goto fail4;
+
+#pragma prefast(suppress:28123)
+ (VOID) IoSetDeviceInterfaceState(&Pdo->Dx->Link, TRUE);
+
Trace("(%s) <====\n", __PdoGetName(Pdo));
return STATUS_SUCCESS;
+fail4:
+ Error("fail4\n");
+
+ KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+
+ XENBUS_SUSPEND(Deregister,
+ &Pdo->SuspendInterface,
+ Pdo->SuspendCallbackLate);
+ Pdo->SuspendCallbackLate = NULL;
+
fail3:
Error("fail3\n");
ASSERT3U(KeGetCurrentIrql(), == , PASSIVE_LEVEL);
+#pragma prefast(suppress:28123)
+ (VOID) IoSetDeviceInterfaceState(&Pdo->Dx->Link, FALSE);
+
+ ConsoleD0ToD3(Pdo->Console);
+
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
XENBUS_SUSPEND(Deregister,
{
NTSTATUS status;
- status = PdoD3ToD0(Pdo);
+ if (Pdo->Dx->Link.Length != 0)
+ goto done;
+
+ status = IoRegisterDeviceInterface(__PdoGetDeviceObject(Pdo),
+ &GUID_XENCONS_DEVICE,
+ NULL,
+ &Pdo->Dx->Link);
if (!NT_SUCCESS(status))
goto fail1;
+done:
+ status = PdoD3ToD0(Pdo);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
__PdoSetDevicePnpState(Pdo, Started);
Irp->IoStatus.Status = STATUS_SUCCESS;
return STATUS_SUCCESS;
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1 (%08x)\n", status);
return status;
}
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchCreate(
+ IN PXENCONS_PDO Pdo,
+ IN PIRP Irp
+ )
+{
+ PIO_STACK_LOCATION StackLocation;
+ NTSTATUS status;
+
+ StackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+ status = ConsoleOpen(Pdo->Console, StackLocation->FileObject);
+
+ Irp->IoStatus.Status = status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchCleanup(
+ IN PXENCONS_PDO Pdo,
+ IN PIRP Irp
+ )
+{
+ PIO_STACK_LOCATION StackLocation;
+ NTSTATUS status;
+
+ StackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+ status = ConsoleClose(Pdo->Console, StackLocation->FileObject);
+
+ Irp->IoStatus.Status = status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchClose(
+ IN PXENCONS_PDO Pdo,
+ IN PIRP Irp
+ )
+{
+ NTSTATUS status;
+
+ UNREFERENCED_PARAMETER(Pdo);
+
+ status = STATUS_SUCCESS;
+
+ Irp->IoStatus.Status = status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchReadWrite(
+ IN PXENCONS_PDO Pdo,
+ IN PIRP Irp
+ )
+{
+ NTSTATUS status;
+
+ status = ConsolePutQueue(Pdo->Console, Irp);
+ if (status != STATUS_PENDING)
+ goto fail1;
+
+ return STATUS_PENDING;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ Irp->IoStatus.Status = status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return status;
+}
+
static DECLSPEC_NOINLINE NTSTATUS
PdoDispatchDefault(
IN PXENCONS_PDO Pdo,
status = PdoDispatchPower(Pdo, Irp);
break;
+ case IRP_MJ_CREATE:
+ status = PdoDispatchCreate(Pdo, Irp);
+ break;
+
+ case IRP_MJ_CLEANUP:
+ status = PdoDispatchCleanup(Pdo, Irp);
+ break;
+
+ case IRP_MJ_CLOSE:
+ status = PdoDispatchClose(Pdo, Irp);
+ break;
+
+ case IRP_MJ_READ:
+ case IRP_MJ_WRITE:
+ status = PdoDispatchReadWrite(Pdo, Irp);
+ break;
+
default:
status = PdoDispatchDefault(Pdo, Irp);
break;
Dx->Pdo = Pdo;
- status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
+ status = ConsoleCreate(Fdo, &Pdo->Console);
if (!NT_SUCCESS(status))
goto fail5;
+ status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
+ if (!NT_SUCCESS(status))
+ goto fail6;
+
status = STATUS_UNSUCCESSFUL;
if (__PdoIsEjectRequested(Pdo))
- goto fail6;
+ goto fail7;
Info("%p (%s)\n",
PhysicalDeviceObject,
__PdoGetName(Pdo));
+ PhysicalDeviceObject->Flags |= DO_BUFFERED_IO;
PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
+fail7:
+ Error("fail7\n");
+
+ FdoRemovePhysicalDeviceObject(Fdo, Pdo);
+
fail6:
Error("fail6\n");
- FdoRemovePhysicalDeviceObject(Fdo, Pdo);
+ (VOID)__PdoClearEjectRequested(Pdo);
+
+ ConsoleDestroy(Pdo->Console);
+ Pdo->Console = NULL;
fail5:
Error("fail5\n");
- (VOID)__PdoClearEjectRequested(Pdo);
-
Dx->Pdo = NULL;
RtlZeroMemory(&Pdo->SuspendInterface,
Dx->Pdo = NULL;
+ ConsoleDestroy(Pdo->Console);
+ Pdo->Console = NULL;
+
+ RtlFreeUnicodeString(&Pdo->Dx->Link);
+
RtlZeroMemory(&Pdo->SuspendInterface,
sizeof(XENBUS_SUSPEND_INTERFACE));