~siretart/ubuntu/raring/virtualbox-ose/bug.1101867

« back to all changes in this revision

Viewing changes to src/VBox/Additions/common/VBoxGuest/VBoxGuest-win-legacy.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2011-01-30 23:27:25 UTC
  • mfrom: (0.3.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20110130232725-2ouajjd2ggdet0zd
Tags: 4.0.2-dfsg-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Add Apport hook.
    - debian/virtualbox-ose.files/source_virtualbox-ose.py
    - debian/virtualbox-ose.install
  - Drop *-source packages.
* Drop ubuntu-01-fix-build-gcc45.patch, fixed upstream.
* Drop ubuntu-02-as-needed.patch, added to the Debian package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/** @file
 
2
 *
 
3
 * VBoxGuest-win-legacy - Windows NT4 specifics.
 
4
 *
 
5
 * Copyright (C) 2010 Oracle Corporation
 
6
 *
 
7
 * This file is part of VirtualBox Open Source Edition (OSE), as
 
8
 * available from http://www.virtualbox.org. This file is free software;
 
9
 * you can redistribute it and/or modify it under the terms of the GNU
 
10
 * General Public License (GPL) as published by the Free Software
 
11
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 
12
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 
13
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 
14
 */
 
15
 
 
16
/*******************************************************************************
 
17
*   Header Files                                                               *
 
18
*******************************************************************************/
 
19
#include "VBoxGuest-win.h"
 
20
#include "VBoxGuestInternal.h"
 
21
#include <VBox/err.h>
 
22
#include <VBox/log.h>
 
23
#include <VBox/version.h>
 
24
#include <VBox/VBoxGuestLib.h>
 
25
 
 
26
 
 
27
/*******************************************************************************
 
28
*   Defined Constants And Macros                                               *
 
29
*******************************************************************************/
 
30
 
 
31
/* Reenable logging, this was #undef'ed on iprt/log.h for RING0. */
 
32
#define LOG_ENABLED
 
33
 
 
34
#ifndef PCI_MAX_BUSES
 
35
# define PCI_MAX_BUSES 256
 
36
#endif
 
37
 
 
38
 
 
39
/*******************************************************************************
 
40
*   Internal Functions                                                         *
 
41
*******************************************************************************/
 
42
RT_C_DECLS_BEGIN
 
43
NTSTATUS vboxguestwinnt4CreateDevice(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICODE_STRING pRegPath);
 
44
static NTSTATUS vboxguestwinnt4FindPCIDevice(PULONG pBusNumber, PPCI_SLOT_NUMBER pSlotNumber);
 
45
RT_C_DECLS_END
 
46
 
 
47
#ifdef ALLOC_PRAGMA
 
48
#pragma alloc_text (INIT, vboxguestwinnt4CreateDevice)
 
49
#pragma alloc_text (INIT, vboxguestwinnt4FindPCIDevice)
 
50
#endif
 
51
 
 
52
 
 
53
/**
 
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
 
61
 */
 
62
NTSTATUS vboxguestwinnt4CreateDevice(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICODE_STRING pRegPath)
 
63
{
 
64
    int vrc = VINF_SUCCESS;
 
65
    NTSTATUS rc = STATUS_SUCCESS;
 
66
 
 
67
    Log(("VBoxGuest::vboxguestwinnt4CreateDevice: pDrvObj=%p, pDevObj=%p, pRegPath=%p\n",
 
68
         pDrvObj, pDevObj, pRegPath));
 
69
 
 
70
    /*
 
71
     * Find our virtual PCI device
 
72
     */
 
73
    ULONG uBusNumber, uSlotNumber;
 
74
    rc = vboxguestwinnt4FindPCIDevice(&uBusNumber, (PCI_SLOT_NUMBER*)&uSlotNumber);
 
75
    if (NT_ERROR(rc))
 
76
        Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Device not found!\n"));
 
77
 
 
78
    bool fSymbolicLinkCreated = false;
 
79
    UNICODE_STRING szDosName;
 
80
    PDEVICE_OBJECT pDeviceObject = NULL;
 
81
    if (NT_SUCCESS(rc))
 
82
    {
 
83
        /*
 
84
         * Create device.
 
85
         */
 
86
        UNICODE_STRING szDevName;
 
87
        RtlInitUnicodeString(&szDevName, VBOXGUEST_DEVICE_NAME_NT);
 
88
        rc = IoCreateDevice(pDrvObj, sizeof(VBOXGUESTDEVEXT), &szDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObject);
 
89
        if (NT_SUCCESS(rc))
 
90
        {
 
91
            Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Device created\n"));
 
92
 
 
93
            RtlInitUnicodeString(&szDosName, VBOXGUEST_DEVICE_NAME_DOS);
 
94
            rc = IoCreateSymbolicLink(&szDosName, &szDevName);
 
95
            if (NT_SUCCESS(rc))
 
96
            {
 
97
                Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Symlink created\n"));
 
98
                fSymbolicLinkCreated = true;
 
99
            }
 
100
            else
 
101
                Log(("VBoxGuest::vboxguestwinnt4CreateDevice: IoCreateSymbolicLink failed with rc = %#x\n", rc));
 
102
        }
 
103
        else
 
104
            Log(("VBoxGuest::vboxguestwinnt4CreateDevice: IoCreateDevice failed with rc = %#x\n", rc));
 
105
    }
 
106
 
 
107
    /*
 
108
     * Setup the device extension.
 
109
     */
 
110
    PVBOXGUESTDEVEXT pDevExt = NULL;
 
111
    if (NT_SUCCESS(rc))
 
112
    {
 
113
        Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Setting up device extension ...\n"));
 
114
 
 
115
        pDevExt = (PVBOXGUESTDEVEXT)pDeviceObject->DeviceExtension;
 
116
        RtlZeroMemory(pDevExt, sizeof(VBOXGUESTDEVEXT));
 
117
    }
 
118
 
 
119
    if (NT_SUCCESS(rc) && pDevExt)
 
120
    {
 
121
        Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Device extension created\n"));
 
122
 
 
123
        /* Store a reference to ourself. */
 
124
        pDevExt->win.s.pDeviceObject = pDeviceObject;
 
125
 
 
126
        /* Store bus and slot number we've queried before. */
 
127
        pDevExt->win.s.busNumber = uBusNumber;
 
128
        pDevExt->win.s.slotNumber = uSlotNumber;
 
129
 
 
130
    #ifdef VBOX_WITH_GUEST_BUGCHECK_DETECTION
 
131
        rc = hlpRegisterBugCheckCallback(pDevExt);
 
132
    #endif
 
133
    }
 
134
 
 
135
    /* Do the actual VBox init ... */
 
136
    if (NT_SUCCESS(rc))
 
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);
 
146
    }
 
147
 
 
148
    Log(("VBoxGuest::vboxguestwinnt4CreateDevice: Returning rc = 0x%x\n", rc));
 
149
    return rc;
 
150
}
 
151
 
 
152
 
 
153
/**
 
154
 * Helper function to handle the PCI device lookup.
 
155
 *
 
156
 * @returns NT status code.
 
157
 *
 
158
 * @param pBusNumber
 
159
 * @param pSlotNumber
 
160
 *
 
161
 */
 
162
static NTSTATUS vboxguestwinnt4FindPCIDevice(PULONG pBusNumber, PPCI_SLOT_NUMBER pSlotNumber)
 
163
{
 
164
    NTSTATUS rc;
 
165
 
 
166
    ULONG busNumber;
 
167
    ULONG deviceNumber;
 
168
    ULONG functionNumber;
 
169
    PCI_SLOT_NUMBER slotNumber;
 
170
    PCI_COMMON_CONFIG pciData;
 
171
 
 
172
    Log(("VBoxGuest::vboxguestwinnt4FindPCIDevice\n"));
 
173
 
 
174
    rc = STATUS_DEVICE_DOES_NOT_EXIST;
 
175
    slotNumber.u.AsULONG = 0;
 
176
 
 
177
    /* Scan each bus. */
 
178
    for (busNumber = 0; busNumber < PCI_MAX_BUSES; busNumber++)
 
179
    {
 
180
        /* Scan each device. */
 
181
        for (deviceNumber = 0; deviceNumber < PCI_MAX_DEVICES; deviceNumber++)
 
182
        {
 
183
            slotNumber.u.bits.DeviceNumber = deviceNumber;
 
184
 
 
185
            /* Scan each function (not really required...). */
 
186
            for (functionNumber = 0; functionNumber < PCI_MAX_FUNCTION; functionNumber++)
 
187
            {
 
188
                slotNumber.u.bits.FunctionNumber = functionNumber;
 
189
 
 
190
                /* Have a look at what's in this slot. */
 
191
                if (!HalGetBusData(PCIConfiguration, busNumber, slotNumber.u.AsULONG,
 
192
                                   &pciData, sizeof(ULONG)))
 
193
                {
 
194
                    /* No such bus, we're done with it. */
 
195
                    deviceNumber = PCI_MAX_DEVICES;
 
196
                    break;
 
197
                }
 
198
 
 
199
                if (pciData.VendorID == PCI_INVALID_VENDORID)
 
200
                {
 
201
                    /* We have to proceed to the next function. */
 
202
                    continue;
 
203
                }
 
204
 
 
205
                /* Check if it's another device. */
 
206
                if ((pciData.VendorID != VMMDEV_VENDORID) ||
 
207
                    (pciData.DeviceID != VMMDEV_DEVICEID))
 
208
                {
 
209
                    continue;
 
210
                }
 
211
 
 
212
                /* Hooray, we've found it! */
 
213
                Log(("VBoxGuest::vboxguestwinnt4FindPCIDevice: Device found!\n"));
 
214
 
 
215
                *pBusNumber = busNumber;
 
216
                *pSlotNumber = slotNumber;
 
217
                rc = STATUS_SUCCESS;
 
218
            }
 
219
        }
 
220
    }
 
221
 
 
222
    return rc;
 
223
}
 
224