VirtualBox

Changeset 32474 in vbox


Ignore:
Timestamp:
Sep 14, 2010 11:35:57 AM (14 years ago)
Author:
vboxsync
Message:

VBoxGuest/win: Fixes for NT4 boot.

Location:
trunk/src/VBox/Additions/common/VBoxGuest
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win-legacy.cpp

    r32322 r32474  
    4141*******************************************************************************/
    4242RT_C_DECLS_BEGIN
     43NTSTATUS vboxguestwinnt4CreateDevice(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICODE_STRING pRegPath);
    4344static NTSTATUS vboxguestwinnt4FindPCIDevice(PULONG pBusNumber, PPCI_SLOT_NUMBER pSlotNumber);
    44 static void     vboxguestwinnt4FreeDeviceResources(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj);
    4545RT_C_DECLS_END
    4646
     
    4848#pragma alloc_text (INIT, vboxguestwinnt4CreateDevice)
    4949#pragma alloc_text (INIT, vboxguestwinnt4FindPCIDevice)
    50 #pragma alloc_text (INIT, vboxguestwinnt4FreeDeviceResources)
    5150#endif
    5251
    5352
    5453/**
    55  * Helper function to create the device object
    56  *
    57  * @returns NT status code
    58  * @param
     54 * Legacy helper function to create the device object.
     55 *
     56 * @returns NT status code.
     57 *
     58 * @param pDrvObj
     59 * @param pDevObj
     60 * @param pRegPath
    5961 */
    6062NTSTATUS vboxguestwinnt4CreateDevice(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICODE_STRING pRegPath)
     
    6365    NTSTATUS rc = STATUS_SUCCESS;
    6466
    65     Log(("VBoxGuest::vboxguestwinnt4CreateDevice: pDrvObj=%x, pDevObj=%x, pRegPath=%x\n",
     67    Log(("VBoxGuest::vboxguestwinnt4CreateDevice: pDrvObj=%p, pDevObj=%p, pRegPath=%p\n",
    6668         pDrvObj, pDevObj, pRegPath));
    6769
     
    7476        Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Device not found!\n"));
    7577
     78    bool fSymbolicLinkCreated = false;
     79    UNICODE_STRING szDosName;
    7680    PDEVICE_OBJECT pDeviceObject = NULL;
    7781    if (NT_SUCCESS(rc))
     
    8791            Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Device created\n"));
    8892
    89             UNICODE_STRING DosName;
    90             RtlInitUnicodeString(&DosName, VBOXGUEST_DEVICE_NAME_DOS);
    91             rc = IoCreateSymbolicLink(&DosName, &szDevName);
    92             if (NT_ERROR(rc))
     93            RtlInitUnicodeString(&szDosName, VBOXGUEST_DEVICE_NAME_DOS);
     94            rc = IoCreateSymbolicLink(&szDosName, &szDevName);
     95            if (NT_SUCCESS(rc))
    9396            {
     97                Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Symlink created\n"));
     98                fSymbolicLinkCreated = true;
     99            }
     100            else
    94101                Log(("VBoxGuest::vboxguestwinnt4CreateDevice: IoCreateSymbolicLink failed with rc = %#x\n", rc));
    95                 //IoDeleteDevice(pDeviceObject);
    96             }
    97             Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Symlink created\n"));
    98102        }
    99103        else
     
    110114
    111115        pDevExt = (PVBOXGUESTDEVEXT)pDeviceObject->DeviceExtension;
    112         Assert(pDevExt);
    113116        RtlZeroMemory(pDevExt, sizeof(VBOXGUESTDEVEXT));
    114117    }
    115118
    116     if (   NT_SUCCESS(rc)
    117         && pDevExt)
    118     {
     119    if (NT_SUCCESS(rc) && pDevExt)
     120    {
     121        Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Device extension created\n"));
     122
    119123        /* Store a reference to ourself. */
    120124        pDevExt->win.s.pDeviceObject = pDeviceObject;
     
    129133    }
    130134
     135    /* Do the actual VBox init ... */
    131136    if (NT_SUCCESS(rc))
    132     {
    133         rc = vboxguestwinInit(pDrvObj, pDevObj, pRegPath);
     137        rc = vboxguestwinInit(pDrvObj, pDeviceObject, pRegPath);
     138
     139    /* Clean up in case of errors. */
     140    if (NT_ERROR(rc))
     141    {
     142        if (fSymbolicLinkCreated && szDosName.Length > 0)
     143            IoDeleteSymbolicLink(&szDosName);
     144        if (pDeviceObject)
     145            IoDeleteDevice(pDeviceObject);
    134146    }
    135147
     
    140152
    141153/**
    142  * Helper function to handle the PCI device lookup
    143  *
    144  * @returns NT error codes
     154 * Helper function to handle the PCI device lookup.
     155 *
     156 * @returns NT status code.
     157 *
     158 * @param pBusNumber
     159 * @param pSlotNumber
     160 *
    145161 */
    146162static NTSTATUS vboxguestwinnt4FindPCIDevice(PULONG pBusNumber, PPCI_SLOT_NUMBER pSlotNumber)
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp

    r32457 r32474  
    435435        IoInitializeDpcRequest(pDevExt->win.s.pDeviceObject, vboxguestwinDpcHandler);
    436436#ifdef TARGET_NT4
     437        ULONG uInterruptVector;
     438        KIRQL irqLevel;
    437439        /* Get an interrupt vector. */
    438440        /* Only proceed if the device provides an interrupt. */
     
    440442            || pDevExt->win.s.interruptVector)
    441443        {
    442             pDevExt->win.s.interruptVector = HalGetInterruptVector(PCIBus,
    443                                                                    pDevExt->win.s.busNumber,
    444                                                                    pDevExt->win.s.interruptLevel,
    445                                                                    pDevExt->win.s.interruptVector,
    446                                                                    (PKIRQL)pDevExt->win.s.interruptLevel,
    447                                                                    &pDevExt->win.s.interruptAffinity);
     444            Log(("VBoxGuest::vboxguestwinInit: Getting interrupt vector (HAL): Bus: %u, IRQL: %u, Vector: %u\n",
     445                 pDevExt->win.s.busNumber, pDevExt->win.s.interruptLevel, pDevExt->win.s.interruptVector));
     446
     447            uInterruptVector = HalGetInterruptVector(PCIBus,
     448                                                     pDevExt->win.s.busNumber,
     449                                                     pDevExt->win.s.interruptLevel,
     450                                                     pDevExt->win.s.interruptVector,
     451                                                     &irqLevel,
     452                                                     &pDevExt->win.s.interruptAffinity);
     453            Log(("VBoxGuest::vboxguestwinInit: HalGetInterruptVector returns vector %u\n", uInterruptVector));
     454            if (uInterruptVector == 0)
     455                Log(("VBoxGuest::vboxguestwinInit: No interrupt vector found!\n"));
    448456        }
    449457        else
     
    452460        if (pDevExt->win.s.interruptVector)
    453461        {
     462            Log(("VBoxGuest::vboxguestwinInit: Connecting interrupt ...\n"));
     463
    454464            rc = IoConnectInterrupt(&pDevExt->win.s.pInterruptObject,          /* Out: interrupt object. */
    455465                                    (PKSERVICE_ROUTINE)vboxguestwinIsrHandler, /* Our ISR handler. */
    456466                                    pDevExt,                                   /* Device context. */
    457467                                    NULL,                                      /* Optional spinlock. */
     468#ifdef TARGET_NT4
     469                                    uInterruptVector,                          /* Interrupt vector. */
     470                                    irqLevel,                                  /* Interrupt level. */
     471                                    irqLevel,                                  /* Interrupt level. */
     472#else
    458473                                    pDevExt->win.s.interruptVector,            /* Interrupt vector. */
    459474                                    (KIRQL)pDevExt->win.s.interruptLevel,      /* Interrupt level. */
    460475                                    (KIRQL)pDevExt->win.s.interruptLevel,      /* Interrupt level. */
     476#endif
    461477                                    pDevExt->win.s.interruptMode,              /* LevelSensitive or Latched. */
    462478                                    TRUE,                                      /* Shareable interrupt. */
     
    479495    pDevExt->win.s.hgcm.s.WaitTimeout.QuadPart *= -10000; /* Relative in 100ns units. */
    480496
     497    Log(("VBoxGuest::vboxguestwinInit: Allocating kernel session data ...\n"));
    481498    int vrc = VBoxGuestCreateKernelSession(pDevExt, &pDevExt->win.s.pKernelSession);
    482499    if (RT_FAILURE(vrc))
     
    492509        Log(("VBoxGuest::vboxguestwinInit: Device is ready!\n"));
    493510        pDevExt->win.s.devState = WORKING;
     511    }
     512    else
     513    {
     514        pDevExt->win.s.pInterruptObject = NULL;
    494515    }
    495516
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette