VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/VBoxGuest/Helper.cpp@ 12474

Last change on this file since 12474 was 8155, checked in by vboxsync, 17 years ago

The Big Sun Rebranding Header Change

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.6 KB
Line 
1/** @file
2 *
3 * VBoxGuest -- VirtualBox Win32 guest support driver
4 *
5 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
16 * Clara, CA 95054 USA or visit http://www.sun.com if you need
17 * additional information or have any questions.
18 */
19
20//#define LOG_ENABLED
21
22#include "VBoxGuest_Internal.h"
23#include "Helper.h"
24#include <VBox/err.h>
25#include <VBox/VBoxGuestLib.h>
26
27#ifdef ALLOC_PRAGMA
28#pragma alloc_text (PAGE, VBoxScanPCIResourceList)
29#endif
30
31/* CM_RESOURCE_MEMORY_* flags which were used on XP or earlier. */
32#define VBOX_CM_PRE_VISTA_MASK (0x3f)
33
34/**
35 * Helper to scan the PCI resource list and remember stuff.
36 *
37 * @param pResList Resource list
38 * @param pDevExt Device extension
39 */
40NTSTATUS VBoxScanPCIResourceList(PCM_RESOURCE_LIST pResList, PVBOXGUESTDEVEXT pDevExt)
41{
42 NTSTATUS rc = STATUS_SUCCESS;
43 PCM_PARTIAL_RESOURCE_DESCRIPTOR partialData;
44
45 // enumerate the resource list
46 dprintf(("found %d resources\n", pResList->List->PartialResourceList.Count));
47 ULONG rangeCount = 0;
48 PBASE_ADDRESS baseAddress = pDevExt->baseAddress;
49 for (ULONG i = 0; i < pResList->List->PartialResourceList.Count; i++)
50 {
51 partialData = &pResList->List->PartialResourceList.PartialDescriptors[i];
52 switch (partialData->Type)
53 {
54 case CmResourceTypePort:
55 {
56 // overflow protection
57 if (rangeCount < PCI_TYPE0_ADDRESSES)
58 {
59 dprintf(("I/O range: Base = %08x : %08x Length = %08x \n",
60 partialData->u.Port.Start.HighPart,
61 partialData->u.Port.Start.LowPart,
62 partialData->u.Port.Length));
63 //@todo not so gut
64 dprintf(("I got all I want, my dear port, oh!\n"));
65 pDevExt->startPortAddress = (ULONG)partialData->u.Port.Start.LowPart;
66 // save resource information
67 baseAddress->RangeStart = partialData->u.Port.Start;
68 baseAddress->RangeLength = partialData->u.Port.Length;
69 baseAddress->RangeInMemory = FALSE;
70 baseAddress->ResourceMapped = FALSE;
71 // next item
72 rangeCount++; baseAddress++;
73 }
74 break;
75 }
76
77 case CmResourceTypeInterrupt:
78 {
79 dprintf(("Interrupt: Level = %x Vector = %x Mode = %x \n",
80 partialData->u.Interrupt.Level,
81 partialData->u.Interrupt.Vector,
82 partialData->Flags));
83 // save information
84 pDevExt->interruptLevel = partialData->u.Interrupt.Level;
85 pDevExt->interruptVector = partialData->u.Interrupt.Vector;
86 pDevExt->interruptAffinity = partialData->u.Interrupt.Affinity;
87 // check interrupt mode
88 if (partialData->Flags & CM_RESOURCE_INTERRUPT_LATCHED)
89 {
90 pDevExt->interruptMode = Latched;
91 }
92 else
93 {
94 pDevExt->interruptMode = LevelSensitive;
95 }
96 break;
97 }
98
99 case CmResourceTypeMemory:
100 {
101 // overflow protection
102 if (rangeCount < PCI_TYPE0_ADDRESSES)
103 {
104 dprintf(("Memory range: Base = %08x : %08x Length = %08x \n",
105 partialData->u.Memory.Start.HighPart,
106 partialData->u.Memory.Start.LowPart,
107 partialData->u.Memory.Length));
108 // we only care about read/write memory
109 /** @todo reconsider memory type */
110 if ((partialData->Flags & VBOX_CM_PRE_VISTA_MASK) == CM_RESOURCE_MEMORY_READ_WRITE)
111 {
112 pDevExt->memoryAddress = partialData->u.Memory.Start;
113 pDevExt->memoryLength = (ULONG)partialData->u.Memory.Length;
114 // save resource information
115 baseAddress->RangeStart = partialData->u.Memory.Start;
116 baseAddress->RangeLength = partialData->u.Memory.Length;
117 baseAddress->RangeInMemory = TRUE;
118 baseAddress->ResourceMapped = FALSE;
119 // next item
120 rangeCount++; baseAddress++;
121 } else
122 {
123 dprintf(("Ignoring memory: flags = %08x \n", partialData->Flags));
124 }
125 }
126 break;
127 }
128
129 case CmResourceTypeDma:
130 {
131 dprintf(("DMA resource found. Hmm...\n"));
132 break;
133 }
134
135 default:
136 {
137 dprintf(("Unexpected resource found %d. Hmm...\n", partialData->Type));
138 break;
139 }
140 }
141 }
142 // memorize the number of resources found
143 pDevExt->addressCount = rangeCount;
144
145 return rc;
146}
147
148
149NTSTATUS hlpVBoxMapVMMDevMemory (PVBOXGUESTDEVEXT pDevExt)
150{
151 NTSTATUS rc = STATUS_SUCCESS;
152
153 if (pDevExt->memoryLength != 0)
154 {
155 pDevExt->pVMMDevMemory = (VMMDevMemory *)MmMapIoSpace (pDevExt->memoryAddress, pDevExt->memoryLength, MmNonCached);
156 dprintf(("VBoxGuest::VBoxGuestPnp: VMMDevMemory: ptr = 0x%x\n", pDevExt->pVMMDevMemory));
157 if (pDevExt->pVMMDevMemory)
158 {
159 dprintf(("VBoxGuest::VBoxGuestPnp: VMMDevMemory: version = 0x%x, size = %d\n", pDevExt->pVMMDevMemory->u32Version, pDevExt->pVMMDevMemory->u32Size));
160
161 /* Check version of the structure */
162 if (pDevExt->pVMMDevMemory->u32Version != VMMDEV_MEMORY_VERSION)
163 {
164 /* Not our version, refuse operation and unmap the memory */
165 hlpVBoxUnmapVMMDevMemory (pDevExt);
166
167 rc = STATUS_UNSUCCESSFUL;
168 }
169 }
170 else
171 {
172 rc = STATUS_UNSUCCESSFUL;
173 }
174 }
175
176 return rc;
177}
178
179void hlpVBoxUnmapVMMDevMemory (PVBOXGUESTDEVEXT pDevExt)
180{
181 if (pDevExt->pVMMDevMemory)
182 {
183 MmUnmapIoSpace (pDevExt->pVMMDevMemory, pDevExt->memoryLength);
184 pDevExt->pVMMDevMemory = NULL;
185 }
186
187 pDevExt->memoryAddress.QuadPart = 0;
188 pDevExt->memoryLength = 0;
189}
190
191NTSTATUS hlpVBoxReportGuestInfo (PVBOXGUESTDEVEXT pDevExt)
192{
193 VMMDevReportGuestInfo *req = NULL;
194
195 int rc = VbglGRAlloc ((VMMDevRequestHeader **)&req, sizeof (VMMDevReportGuestInfo), VMMDevReq_ReportGuestInfo);
196
197 dprintf(("hlpVBoxReportGuestInfo: VbglGRAlloc rc = %d\n", rc));
198
199 if (VBOX_SUCCESS(rc))
200 {
201 req->guestInfo.additionsVersion = VMMDEV_VERSION;
202
203 /* we've already determined the Windows product before */
204 switch (winVersion)
205 {
206 case WINNT4:
207 req->guestInfo.osType = VBOXOSTYPE_WinNT4;
208 break;
209 case WIN2K:
210 req->guestInfo.osType = VBOXOSTYPE_Win2k;
211 break;
212 case WINXP:
213 req->guestInfo.osType = VBOXOSTYPE_WinXP;
214 break;
215 case WIN2K3:
216 req->guestInfo.osType = VBOXOSTYPE_Win2k3;
217 break;
218 case WINVISTA:
219 req->guestInfo.osType = VBOXOSTYPE_WinVista;
220 break;
221 default:
222 /* we don't know, therefore NT family */
223 req->guestInfo.osType = VBOXOSTYPE_WinNT;
224 break;
225 }
226
227 /** @todo registry lookup for additional information */
228
229
230 rc = VbglGRPerform (&req->header);
231
232 if (VBOX_FAILURE(rc) || VBOX_FAILURE(req->header.rc))
233 {
234 dprintf(("VBoxGuest::hlpVBoxReportGuestInfo: error reporting guest info to VMMDev."
235 "rc = %d, VMMDev rc = %Vrc\n", rc, req->header.rc));
236 }
237
238 rc = VBOX_SUCCESS(rc) ? req->header.rc : rc;
239
240 VbglGRFree (&req->header);
241 }
242
243 return VBOX_FAILURE(rc) ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS;
244}
Note: See TracBrowser for help on using the repository browser.

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