VBoxGuest-win-pnp.cpp revision bda3dd52e256c637c703aecf163ecc5b682a43a4
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * VBoxGuest-win-pnp - Windows Plug'n'Play specifics.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * Copyright (C) 2010-2013 Oracle Corporation
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * available from http://www.virtualbox.org. This file is free software;
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * General Public License (GPL) as published by the Free Software
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync/*******************************************************************************
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync* Header Files *
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync*******************************************************************************/
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync/*******************************************************************************
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync* Defined Constants And Macros *
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync*******************************************************************************/
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsyncstatic NTSTATUS vbgdNtSendIrpSynchronously(PDEVICE_OBJECT pDevObj, PIRP pIrp, BOOLEAN fStrict);
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsyncstatic NTSTATUS vbgdNtPnPIrpComplete(PDEVICE_OBJECT pDevObj, PIRP pIrp, PKEVENT pEvent);
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsyncstatic VOID vbgdNtShowDeviceResources(PCM_PARTIAL_RESOURCE_LIST pResourceList);
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync# pragma alloc_text(PAGE, vbgdNtSendIrpSynchronously)
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync# pragma alloc_text(PAGE, vbgdNtShowDeviceResources)
8b98c71a5a01d215eafbc3605cb7a66cc91ea774vboxsync * Irp completion routine for PnP Irps we send.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * @param pDevObj Device object.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * @param pIrp Request packet.
8b98c71a5a01d215eafbc3605cb7a66cc91ea774vboxsync * @param pEvent Semaphore.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * @return NT status code
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsyncstatic NTSTATUS vbgdNtPnpIrpComplete(PDEVICE_OBJECT pDevObj, PIRP pIrp, PKEVENT pEvent)
8b98c71a5a01d215eafbc3605cb7a66cc91ea774vboxsync * Helper to send a PnP IRP and wait until it's done.
8b98c71a5a01d215eafbc3605cb7a66cc91ea774vboxsync * @param pDevObj Device object.
8b98c71a5a01d215eafbc3605cb7a66cc91ea774vboxsync * @param pIrp Request packet.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * @param fStrict When set, returns an error if the IRP gives an error.
8b98c71a5a01d215eafbc3605cb7a66cc91ea774vboxsync * @return NT status code
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsyncstatic NTSTATUS vbgdNtSendIrpSynchronously(PDEVICE_OBJECT pDevObj, PIRP pIrp, BOOLEAN fStrict)
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync IoSetCompletionRoutine(pIrp, (PIO_COMPLETION_ROUTINE)vbgdNtPnpIrpComplete,
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync && (rc == STATUS_NOT_SUPPORTED || rc == STATUS_INVALID_DEVICE_REQUEST))
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync Log(("VBoxGuest::vbgdNtSendIrpSynchronously: Returning 0x%x\n", rc));
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * PnP Request handler.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * @param pDevObj Device object.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync * @param pIrp Request packet.
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsyncNTSTATUS vbgdNtPnP(PDEVICE_OBJECT pDevObj, PIRP pIrp)
9c0076729ec8138e89ce8a6af9a772b68f1f8dc7vboxsync PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pDevObj->DeviceExtension;
8b98c71a5a01d215eafbc3605cb7a66cc91ea774vboxsync PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
#ifdef LOG_ENABLED
static char *s_apszFnctName[] =
pStack->MinorFunction < RT_ELEMENTS(s_apszFnctName)) ? s_apszFnctName[pStack->MinorFunction] : "Unknown"));
case IRP_MN_START_DEVICE:
Log(("VBoxGuest::vbgdNtVBoxGuestPnP: START_DEVICE: pStack->Parameters.StartDevice.AllocatedResources = %p\n",
Log(("VBoxGuest::vbgdNtVBoxGuestPnP: START_DEVICE: No resources, pDevExt = %p, nextLowerDriver = %p!\n",
case IRP_MN_SURPRISE_REMOVAL:
return rc;
#ifdef VBOX_REBOOT_ON_UNINSTALL
Log(("VBoxGuest::vbgdNtGuestPnp: QUERY_REMOVE_DEVICE: Device cannot be removed without a reboot.\n"));
return rc;
case IRP_MN_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
#ifdef VBOX_REBOOT_ON_UNINSTALL
Log(("VBoxGuest::vbgdNtGuestPnp: QUERY_STOP_DEVICE: Device cannot be stopped without a reboot!\n"));
return rc;
case IRP_MN_STOP_DEVICE:
return rc;
return rc;
return rc;
#ifdef VBOX_STRICT
if (pIrpSp)
case IRP_MN_SET_POWER:
case DevicePowerState:
case PowerDeviceD0:
return STATUS_SUCCESS;
case IRP_MN_SET_POWER:
switch (enmPowerType)
case SystemPowerState:
switch (enmPowerAction)
case PowerActionSleep:
if ( pDevExt
case PowerActionShutdownReset:
case PowerActionShutdown:
case PowerActionShutdownOff:
if (pReq)
Log(("VBoxGuest::PowerStateRequest: Error communicating new power status to VMMDev. vrc = %Rrc\n", vrc));
case PowerActionHibernate:
if (pDevExt)
TRUE,
TRUE,
TRUE);