VirtualBox

source: vbox/trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win-legacy.cpp@ 35263

Last change on this file since 35263 was 32474, checked in by vboxsync, 14 years ago

VBoxGuest/win: Fixes for NT4 boot.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.2 KB
Line 
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*******************************************************************************/
42RT_C_DECLS_BEGIN
43NTSTATUS vboxguestwinnt4CreateDevice(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICODE_STRING pRegPath);
44static NTSTATUS vboxguestwinnt4FindPCIDevice(PULONG pBusNumber, PPCI_SLOT_NUMBER pSlotNumber);
45RT_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 */
62NTSTATUS 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 */
162static 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
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use