Changeset 34349 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Miniport
- Timestamp:
- Nov 25, 2010 1:53:58 AM (14 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Miniport
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo-win.h
r34130 r34349 261 261 uint32_t cbLength) 262 262 { 263 return vboxUpdatePointerShape( pCommon,263 return vboxUpdatePointerShape(&pCommon->guestCtx, 264 264 pointerAttr->Enable & 0x0000FFFF, 265 265 (pointerAttr->Enable >> 16) & 0xFF, -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp
r34346 r34349 3194 3194 if (RT_SUCCESS(rc)) 3195 3195 { 3196 rc = VBoxHGSMISendViewInfo (commonFromDeviceExt(PrimaryExtension),3196 rc = VBoxHGSMISendViewInfo(&commonFromDeviceExt(PrimaryExtension)->guestCtx, 3197 3197 commonFromDeviceExt(PrimaryExtension)->cDisplays, 3198 3198 vbvaInitInfoDisplay, -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
r34346 r34349 72 72 */ 73 73 74 /** Host HGSMI capabilities the guest can handle */75 uint32_t fCaps;76 74 /** Whether HGSMI is enabled. */ 77 75 bool bHGSMI; … … 136 134 typedef FNHGSMIFILLVIEWINFO *PFNHGSMIFILLVIEWINFO; 137 135 138 int VBoxHGSMISendViewInfo(P VBOXVIDEO_COMMON pCommon, uint32_t u32Count, PFNHGSMIFILLVIEWINFO pfnFill, void *pvData);136 int VBoxHGSMISendViewInfo(PHGSMIGUESTCOMMANDCONTEXT pCtx, uint32_t u32Count, PFNHGSMIFILLVIEWINFO pfnFill, void *pvData); 139 137 140 138 void VBoxSetupDisplaysHGSMI (PVBOXVIDEO_COMMON pCommon, 141 139 uint32_t AdapterMemorySize, uint32_t fCaps); 142 140 143 bool vboxUpdatePointerShape (P VBOXVIDEO_COMMON pCommon,141 bool vboxUpdatePointerShape (PHGSMIGUESTCOMMANDCONTEXT pCtx, 144 142 uint32_t fFlags, 145 143 uint32_t cHotX, -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp
r34346 r34349 111 111 } 112 112 113 typedef int FNHGSMICALLINIT (PVBOXVIDEO_COMMON pCommon, void *pvContext, void *pvData);114 typedef FNHGSMICALLINIT *PFNHGSMICALLINIT;115 116 typedef int FNHGSMICALLFINALIZE (PVBOXVIDEO_COMMON pCommon, void *pvContext, void *pvData);117 typedef FNHGSMICALLFINALIZE *PFNHGSMICALLFINALIZE;118 113 119 114 void* vboxHGSMIBufferAlloc(PHGSMIGUESTCOMMANDCONTEXT pCtx, … … 152 147 } 153 148 154 static int vboxCallChannel (PVBOXVIDEO_COMMON pCommon, 155 uint8_t u8Ch, 156 uint16_t u16Op, 157 HGSMISIZE cbData, 158 PFNHGSMICALLINIT pfnInit, 159 PFNHGSMICALLFINALIZE pfnFinalize, 160 void *pvContext) 149 150 static int vboxQueryConfHGSMI(PHGSMIGUESTCOMMANDCONTEXT pCtx, uint32_t u32Index, 151 uint32_t *pulValue) 161 152 { 162 153 int rc = VINF_SUCCESS; 154 VBVACONF32 *p; 155 LogFunc(("u32Index = %d\n", u32Index)); 163 156 164 157 /* Allocate the IO buffer. */ 165 void *p = HGSMIHeapAlloc (&pCommon->guestCtx.heapCtx, cbData, u8Ch, u16Op); 166 167 if (!p) 168 { 158 p = (VBVACONF32 *)HGSMIHeapAlloc(&pCtx->heapCtx, 159 sizeof(VBVACONF32), HGSMI_CH_VBVA, 160 VBVA_QUERY_CONF32); 161 if (p) 162 { 163 /* Prepare data to be sent to the host. */ 164 p->u32Index = u32Index; 165 p->u32Value = 0; 166 rc = vboxHGSMIBufferSubmit(pCtx, p); 167 if (RT_SUCCESS(rc)) 168 { 169 *pulValue = p->u32Value; 170 LogFunc(("u32Value = %d\n", p->u32Value)); 171 } 172 /* Free the IO buffer. */ 173 HGSMIHeapFree(&pCtx->heapCtx, p); 174 } 175 else 169 176 rc = VERR_NO_MEMORY; 177 LogFunc(("rc = %d\n", rc)); 178 return rc; 179 } 180 181 182 static int vboxHGSMIBufferLocation(PHGSMIGUESTCOMMANDCONTEXT pCtx, 183 HGSMIOFFSET offLocation) 184 { 185 HGSMIBUFFERLOCATION *p; 186 int rc = VINF_SUCCESS; 187 188 /* Allocate the IO buffer. */ 189 p = (HGSMIBUFFERLOCATION *)HGSMIHeapAlloc(&pCtx->heapCtx, 190 sizeof(HGSMIBUFFERLOCATION), 191 HGSMI_CH_HGSMI, 192 HGSMI_CC_HOST_FLAGS_LOCATION); 193 if (p) 194 { 195 /* Prepare data to be sent to the host. */ 196 p->offLocation = offLocation; 197 p->cbLocation = sizeof(HGSMIHOSTFLAGS); 198 rc = vboxHGSMIBufferSubmit(pCtx, p); 199 /* Free the IO buffer. */ 200 HGSMIHeapFree (&pCtx->heapCtx, p); 170 201 } 171 202 else 203 rc = VERR_NO_MEMORY; 204 return rc; 205 } 206 207 208 static int vboxHGSMISendCapsInfo(PHGSMIGUESTCOMMANDCONTEXT pCtx, 209 uint32_t fCaps) 210 { 211 VBVACAPS *pCaps; 212 int rc = VINF_SUCCESS; 213 214 /* Allocate the IO buffer. */ 215 pCaps = (VBVACAPS *)HGSMIHeapAlloc(&pCtx->heapCtx, 216 sizeof(VBVACAPS), HGSMI_CH_VBVA, 217 VBVA_INFO_CAPS); 218 219 if (pCaps) 172 220 { 173 221 /* Prepare data to be sent to the host. */ 174 if (pfnInit) 175 { 176 rc = pfnInit (pCommon, pvContext, p); 177 } 178 179 if (RT_SUCCESS (rc)) 180 { 181 rc = vboxHGSMIBufferSubmit(&pCommon->guestCtx, p); 182 183 if (RT_SUCCESS(rc) && pfnFinalize) 184 { 185 rc = pfnFinalize (pCommon, pvContext, p); 186 } 187 } 188 else 189 { 190 AssertFailed (); 191 rc = VERR_INTERNAL_ERROR; 192 } 193 222 pCaps->rc = VERR_NOT_IMPLEMENTED; 223 pCaps->fCaps = fCaps; 224 rc = vboxHGSMIBufferSubmit(pCtx, pCaps); 225 if (RT_SUCCESS(rc)) 226 { 227 AssertRC(pCaps->rc); 228 rc = pCaps->rc; 229 } 194 230 /* Free the IO buffer. */ 195 HGSMIHeapFree (&pCommon->guestCtx.heapCtx, p); 196 } 197 231 HGSMIHeapFree(&pCtx->heapCtx, pCaps); 232 } 233 else 234 rc = VERR_NO_MEMORY; 198 235 return rc; 199 236 } 200 237 201 static int vboxCallVBVA (PVBOXVIDEO_COMMON pCommon, 202 uint16_t u16Op, 203 HGSMISIZE cbData, 204 PFNHGSMICALLINIT pfnInit, 205 PFNHGSMICALLFINALIZE pfnFinalize, 206 void *pvContext) 207 { 208 return vboxCallChannel (pCommon, 209 HGSMI_CH_VBVA, 210 u16Op, 211 cbData, 212 pfnInit, 213 pfnFinalize, 214 pvContext); 215 } 216 217 typedef struct _QUERYCONFCTX 218 { 219 uint32_t u32Index; 220 uint32_t *pulValue; 221 } QUERYCONFCTX; 222 223 static int vbvaInitQueryConf (PVBOXVIDEO_COMMON, void *pvContext, void *pvData) 224 { 225 QUERYCONFCTX *pCtx = (QUERYCONFCTX *)pvContext; 226 VBVACONF32 *p = (VBVACONF32 *)pvData; 227 228 p->u32Index = pCtx->u32Index; 229 p->u32Value = 0; 230 231 return VINF_SUCCESS; 232 } 233 234 static int vbvaFinalizeQueryConf (PVBOXVIDEO_COMMON, void *pvContext, void *pvData) 235 { 236 QUERYCONFCTX *pCtx = (QUERYCONFCTX *)pvContext; 237 VBVACONF32 *p = (VBVACONF32 *)pvData; 238 239 if (pCtx->pulValue) 240 { 241 *pCtx->pulValue = p->u32Value; 242 } 243 244 Log(("VBoxVideo::vboxQueryConf: u32Value = %d\n", p->u32Value)); 245 return VINF_SUCCESS; 246 } 247 248 static int vboxQueryConfHGSMI (PVBOXVIDEO_COMMON pCommon, uint32_t u32Index, uint32_t *pulValue) 249 { 250 Log(("VBoxVideo::vboxQueryConf: u32Index = %d\n", u32Index)); 251 252 QUERYCONFCTX context; 253 254 context.u32Index = u32Index; 255 context.pulValue = pulValue; 256 257 int rc = vboxCallVBVA (pCommon, 258 VBVA_QUERY_CONF32, 259 sizeof (VBVACONF32), 260 vbvaInitQueryConf, 261 vbvaFinalizeQueryConf, 262 &context); 263 264 Log(("VBoxVideo::vboxQueryConf: rc = %d\n", rc)); 265 238 239 static int vboxVBVAInitInfoHeap(PHGSMIGUESTCOMMANDCONTEXT pCtx, 240 uint32_t u32HeapOffset, uint32_t u32HeapSize) 241 { 242 VBVAINFOHEAP *p; 243 int rc = VINF_SUCCESS; 244 245 /* Allocate the IO buffer. */ 246 p = (VBVAINFOHEAP *)HGSMIHeapAlloc(&pCtx->heapCtx, 247 sizeof (VBVAINFOHEAP), HGSMI_CH_VBVA, 248 VBVA_INFO_HEAP); 249 if (p) 250 { 251 /* Prepare data to be sent to the host. */ 252 p->u32HeapOffset = u32HeapOffset; 253 p->u32HeapSize = u32HeapSize; 254 rc = vboxHGSMIBufferSubmit(pCtx, p); 255 /* Free the IO buffer. */ 256 HGSMIHeapFree(&pCtx->heapCtx, p); 257 } 258 else 259 rc = VERR_NO_MEMORY; 266 260 return rc; 267 261 } 268 262 269 int VBoxHGSMISendViewInfo(PVBOXVIDEO_COMMON pCommon, uint32_t u32Count, PFNHGSMIFILLVIEWINFO pfnFill, void *pvData) 263 264 int VBoxHGSMISendViewInfo(PHGSMIGUESTCOMMANDCONTEXT pCtx, uint32_t u32Count, 265 PFNHGSMIFILLVIEWINFO pfnFill, void *pvData) 270 266 { 271 267 int rc; 272 268 /* Issue the screen info command. */ 273 void *p = vboxHGSMIBufferAlloc(&pCommon->guestCtx, sizeof(VBVAINFOVIEW) * u32Count, 274 HGSMI_CH_VBVA, VBVA_INFO_VIEW); 275 Assert(p); 269 void *p = vboxHGSMIBufferAlloc(pCtx, sizeof(VBVAINFOVIEW) * u32Count, 270 HGSMI_CH_VBVA, VBVA_INFO_VIEW); 276 271 if (p) 277 272 { … … 279 274 rc = pfnFill(pvData, pInfo); 280 275 if (RT_SUCCESS(rc)) 281 vboxHGSMIBufferSubmit ( &pCommon->guestCtx, p);282 vboxHGSMIBufferFree (&pCommon->guestCtx, p);276 vboxHGSMIBufferSubmit (pCtx, p); 277 vboxHGSMIBufferFree(pCtx, p); 283 278 } 284 279 else … … 288 283 289 284 290 int vbvaInitInfoCaps (PVBOXVIDEO_COMMON pCommon, void *pvContext, void *pvData) 291 { 292 VBVACAPS *pCaps = (VBVACAPS*)pvData; 293 pCaps->rc = VERR_NOT_IMPLEMENTED; 294 pCaps->fCaps = pCommon->fCaps; 295 return VINF_SUCCESS; 296 } 297 298 299 int vbvaFinalizeInfoCaps (PVBOXVIDEO_COMMON, void *pvContext, void *pvData) 300 { 301 VBVACAPS *pCaps = (VBVACAPS*)pvData; 302 AssertRC(pCaps->rc); 303 return pCaps->rc; 304 } 305 306 static int vbvaInitInfoHeap (PVBOXVIDEO_COMMON pCommon, void *pvContext, void *pvData) 307 { 308 NOREF (pvContext); 309 VBVAINFOHEAP *p = (VBVAINFOHEAP *)pvData; 310 311 p->u32HeapOffset = pCommon->cbVRAM 312 - pCommon->cbMiniportHeap 313 - VBVA_ADAPTER_INFORMATION_SIZE; 314 p->u32HeapSize = pCommon->cbMiniportHeap; 315 316 return VINF_SUCCESS; 317 } 318 319 static int hgsmiInitFlagsLocation (PVBOXVIDEO_COMMON pCommon, void *pvContext, void *pvData) 320 { 321 NOREF (pvContext); 322 HGSMIBUFFERLOCATION *p = (HGSMIBUFFERLOCATION *)pvData; 323 324 p->offLocation = pCommon->cbVRAM - sizeof (HGSMIHOSTFLAGS); 325 p->cbLocation = sizeof (HGSMIHOSTFLAGS); 326 327 return VINF_SUCCESS; 328 } 329 330 331 static int vboxSetupAdapterInfoHGSMI (PVBOXVIDEO_COMMON pCommon) 285 static int vboxSetupAdapterInfoHGSMI(PHGSMIGUESTCOMMANDCONTEXT pCtx, 286 HGSMIOFFSET offBufferLocation, 287 uint32_t fCaps, uint32_t u32HeapOffset, 288 uint32_t u32HeapSize) 332 289 { 333 290 Log(("VBoxVideo::vboxSetupAdapterInfo\n")); 334 291 335 292 /* setup the flags first to ensure they are initialized by the time the host heap is ready */ 336 int rc = vboxCallChannel(pCommon, 337 HGSMI_CH_HGSMI, 338 HGSMI_CC_HOST_FLAGS_LOCATION, 339 sizeof (HGSMIBUFFERLOCATION), 340 hgsmiInitFlagsLocation, 341 NULL, 342 NULL); 293 int rc = vboxHGSMIBufferLocation(pCtx, offBufferLocation); 343 294 AssertRC(rc); 344 if (RT_SUCCESS(rc) && pCommon->fCaps)295 if (RT_SUCCESS(rc) && fCaps) 345 296 { 346 297 /* Inform about caps */ 347 rc = vboxCallVBVA (pCommon, 348 VBVA_INFO_CAPS, 349 sizeof (VBVACAPS), 350 vbvaInitInfoCaps, 351 vbvaFinalizeInfoCaps, 352 NULL); 298 rc = vboxHGSMISendCapsInfo(pCtx, fCaps); 353 299 AssertRC(rc); 354 300 } … … 356 302 { 357 303 /* Report the host heap location. */ 358 rc = vboxCallVBVA (pCommon, 359 VBVA_INFO_HEAP, 360 sizeof (VBVAINFOHEAP), 361 vbvaInitInfoHeap, 362 NULL, 363 NULL); 304 rc = vboxVBVAInitInfoHeap(pCtx, u32HeapOffset, u32HeapSize); 364 305 AssertRC(rc); 365 306 } 366 367 368 307 Log(("VBoxVideo::vboxSetupAdapterInfo finished rc = %d\n", rc)); 369 370 308 return rc; 371 309 } … … 393 331 memset(pCommon, 0, sizeof(*pCommon)); 394 332 pCommon->cbVRAM = AdapterMemorySize; 395 pCommon->fCaps = fCaps;396 333 pCommon->cDisplays = 1; 397 334 pCommon->bHGSMI = VBoxHGSMIIsSupported (); … … 449 386 /* The miniport heap is used for the host buffers. */ 450 387 uint32_t cbMiniportHeap = 0; 451 vboxQueryConfHGSMI (pCommon, VBOX_VBVA_CONF32_HOST_HEAP_SIZE, &cbMiniportHeap); 388 vboxQueryConfHGSMI(&pCommon->guestCtx, VBOX_VBVA_CONF32_HOST_HEAP_SIZE, 389 &cbMiniportHeap); 452 390 453 391 if (cbMiniportHeap != 0) … … 516 454 /* Query the configured number of displays. */ 517 455 uint32_t cDisplays = 0; 518 vboxQueryConfHGSMI (pCommon, VBOX_VBVA_CONF32_MONITOR_COUNT, &cDisplays); 456 vboxQueryConfHGSMI(&pCommon->guestCtx, VBOX_VBVA_CONF32_MONITOR_COUNT, 457 &cDisplays); 519 458 520 459 Log(("VBoxVideo::VBoxSetupDisplays: cDisplays = %d\n", … … 532 471 { 533 472 /* Setup the information for the host. */ 534 rc = vboxSetupAdapterInfoHGSMI (pCommon); 473 rc = vboxSetupAdapterInfoHGSMI(&pCommon->guestCtx, 474 pCommon->cbVRAM - sizeof(HGSMIHOSTFLAGS), 475 fCaps, 476 pCommon->cbVRAM 477 - pCommon->cbMiniportHeap 478 - VBVA_ADAPTER_INFORMATION_SIZE, 479 pCommon->cbMiniportHeap); 535 480 536 481 if (RT_FAILURE(rc)) … … 564 509 } 565 510 566 /* 567 * Send the pointer shape to the host. 568 */ 569 typedef struct _MOUSEPOINTERSHAPECTX 570 { 571 uint32_t fFlags; 572 uint32_t cHotX; 573 uint32_t cHotY; 574 uint32_t cWidth; 575 uint32_t cHeight; 576 uint32_t cbData; 577 uint8_t *pPixels; 578 int32_t i32Result; 579 } MOUSEPOINTERSHAPECTX; 580 581 static int vbvaInitMousePointerShape (PVBOXVIDEO_COMMON, void *pvContext, void *pvData) 582 { 583 MOUSEPOINTERSHAPECTX *pCtx = (MOUSEPOINTERSHAPECTX *)pvContext; 584 VBVAMOUSEPOINTERSHAPE *p = (VBVAMOUSEPOINTERSHAPE *)pvData; 585 586 /* Will be updated by the host. */ 587 p->i32Result = VINF_SUCCESS; 588 589 /* We have our custom flags in the field */ 590 p->fu32Flags = pCtx->fFlags; 591 592 p->u32HotX = pCtx->cHotX; 593 p->u32HotY = pCtx->cHotY; 594 p->u32Width = pCtx->cWidth; 595 p->u32Height = pCtx->cHeight; 596 597 if (p->fu32Flags & VBOX_MOUSE_POINTER_SHAPE) 598 { 511 512 bool vboxUpdatePointerShape(PHGSMIGUESTCOMMANDCONTEXT pCtx, 513 uint32_t fFlags, 514 uint32_t cHotX, 515 uint32_t cHotY, 516 uint32_t cWidth, 517 uint32_t cHeight, 518 uint8_t *pPixels, 519 uint32_t cbLength) 520 { 521 VBVAMOUSEPOINTERSHAPE *p; 522 uint32_t cbData = 0; 523 int rc = VINF_SUCCESS; 524 525 if (fFlags & VBOX_MOUSE_POINTER_SHAPE) 526 { 527 /* Size of the pointer data: sizeof (AND mask) + sizeof (XOR_MASK) */ 528 cbData = ((((cWidth + 7) / 8) * cHeight + 3) & ~3) 529 + cWidth * 4 * cHeight; 599 530 /* If shape is supplied, then always create the pointer visible. 600 531 * See comments in 'vboxUpdatePointerShape' 601 532 */ 602 p->fu32Flags |= VBOX_MOUSE_POINTER_VISIBLE; 603 604 /* Copy the actual pointer data. */ 605 memcpy (p->au8Data, pCtx->pPixels, pCtx->cbData); 606 } 607 608 return VINF_SUCCESS; 609 } 610 611 static int vbvaFinalizeMousePointerShape (PVBOXVIDEO_COMMON, void *pvContext, void *pvData) 612 { 613 MOUSEPOINTERSHAPECTX *pCtx = (MOUSEPOINTERSHAPECTX *)pvContext; 614 VBVAMOUSEPOINTERSHAPE *p = (VBVAMOUSEPOINTERSHAPE *)pvData; 615 616 pCtx->i32Result = p->i32Result; 617 618 return VINF_SUCCESS; 619 } 620 621 bool vboxUpdatePointerShape (PVBOXVIDEO_COMMON pCommon, 622 uint32_t fFlags, 623 uint32_t cHotX, 624 uint32_t cHotY, 625 uint32_t cWidth, 626 uint32_t cHeight, 627 uint8_t *pPixels, 628 uint32_t cbLength) 629 { 630 uint32_t cbData = 0; 631 632 if (fFlags & VBOX_MOUSE_POINTER_SHAPE) 633 { 634 /* Size of the pointer data: sizeof (AND mask) + sizeof (XOR_MASK) */ 635 cbData = ((((cWidth + 7) / 8) * cHeight + 3) & ~3) 636 + cWidth * 4 * cHeight; 637 } 638 533 fFlags |= VBOX_MOUSE_POINTER_VISIBLE; 534 } 639 535 #ifndef DEBUG_misha 640 Log(("vboxUpdatePointerShape: cbData %d, %dx%d\n", 641 cbData, cWidth, cHeight)); 536 LogFunc(("cbData %d, %dx%d\n", cbData, cWidth, cHeight)); 642 537 #endif 643 644 538 if (cbData > cbLength) 645 539 { 646 Log (("vboxUpdatePointerShape:calculated pointer data size is too big (%d bytes, limit %d)\n",540 LogFunc(("calculated pointer data size is too big (%d bytes, limit %d)\n", 647 541 cbData, cbLength)); 648 542 return false; 649 543 } 650 651 MOUSEPOINTERSHAPECTX ctx; 652 653 ctx.fFlags = fFlags; 654 ctx.cHotX = cHotX; 655 ctx.cHotY = cHotY; 656 ctx.cWidth = cWidth; 657 ctx.cHeight = cHeight; 658 ctx.pPixels = pPixels; 659 ctx.cbData = cbData; 660 ctx.i32Result = VERR_NOT_SUPPORTED; 661 662 int rc = vboxCallVBVA (pCommon, VBVA_MOUSE_POINTER_SHAPE, 663 sizeof (VBVAMOUSEPOINTERSHAPE) + cbData, 664 vbvaInitMousePointerShape, 665 vbvaFinalizeMousePointerShape, 666 &ctx); 544 /* Allocate the IO buffer. */ 545 p = (VBVAMOUSEPOINTERSHAPE *)HGSMIHeapAlloc(&pCtx->heapCtx, 546 sizeof(VBVAMOUSEPOINTERSHAPE) 547 + cbData, 548 HGSMI_CH_VBVA, 549 VBVA_MOUSE_POINTER_SHAPE); 550 if (p) 551 { 552 /* Prepare data to be sent to the host. */ 553 /* Will be updated by the host. */ 554 p->i32Result = VINF_SUCCESS; 555 /* We have our custom flags in the field */ 556 p->fu32Flags = fFlags; 557 p->u32HotX = cHotX; 558 p->u32HotY = cHotY; 559 p->u32Width = cWidth; 560 p->u32Height = cHeight; 561 if (p->fu32Flags & VBOX_MOUSE_POINTER_SHAPE) 562 /* Copy the actual pointer data. */ 563 memcpy (p->au8Data, pPixels, cbData); 564 rc = vboxHGSMIBufferSubmit(pCtx, p); 565 if (RT_SUCCESS(rc)) 566 rc = p->i32Result; 567 /* Free the IO buffer. */ 568 HGSMIHeapFree(&pCtx->heapCtx, p); 569 } 570 else 571 rc = VERR_NO_MEMORY; 667 572 #ifndef DEBUG_misha 668 Log (("VBoxVideo::vboxMousePointerShape: rc %d, i32Result = %d\n", rc, ctx.i32Result));573 LogFunc(("rc %d\n", rc)); 669 574 #endif 670 671 return RT_SUCCESS(rc) && RT_SUCCESS(ctx.i32Result); 575 return RT_SUCCESS(rc); 672 576 } 673 577
Note:
See TracChangeset
for help on using the changeset viewer.