Changeset 2515 in vbox for trunk/src/VBox/HostDrivers/Support/win32
- Timestamp:
- May 5, 2007 1:10:33 AM (18 years ago)
- Location:
- trunk/src/VBox/HostDrivers/Support/win32
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/win32/SUPDrv-win32.cpp
r1850 r2515 65 65 static NTSTATUS _stdcall VBoxSupDrvClose(PDEVICE_OBJECT pDevObj, PIRP pIrp); 66 66 static NTSTATUS _stdcall VBoxSupDrvDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp); 67 static int VBoxSupDrvDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack); 67 68 static NTSTATUS _stdcall VBoxSupDrvNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp); 68 69 static NTSTATUS VBoxSupDrvErr2NtStatus(int rc); … … 136 137 return STATUS_SUCCESS; 137 138 } 138 else139 dprintf(("VBoxSupDrvGipInit failed with rc=%#x!\n", rc)); 139 dprintf(("VBoxSupDrvGipInit failed with rc=%#x!\n", rc)); 140 140 141 supdrvDeleteDevExt(pDevExt); 141 142 } … … 272 273 PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp); 273 274 PSUPDRVSESSION pSession = (PSUPDRVSESSION)pStack->FileObject->FsContext; 274 char *pBuf = (char *)pIrp->AssociatedIrp.SystemBuffer; /* all requests are buffered. */ 275 unsigned cbOut = 0; 276 dprintf2(("VBoxSupDrvDeviceControl(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n", 275 276 #ifdef VBOX_WITHOUT_IDT_PATCHING 277 /* 278 * Deal with the two high-speed IOCtl that takes it's arguments from 279 * the session and iCmd, and only returns a VBox status code. 280 */ 281 ULONG ulCmd = pStack->Parameters.DeviceIoControl.IoControlCode; 282 if ( ulCmd == SUP_IOCTL_FAST_DO_RAW_RUN 283 || ulCmd == SUP_IOCTL_FAST_DO_HWACC_RUN 284 || ulCmd == SUP_IOCTL_FAST_DO_NOP) 285 { 286 int rc = supdrvIOCtlFast(ulCmd, pDevExt, pSession); 287 288 /* Complete the I/O request. */ 289 NTSTATUS rcNt = pIrp->IoStatus.Status = STATUS_SUCCESS; 290 pIrp->IoStatus.Information = sizeof(rc); 291 __try 292 { 293 *(int *)pIrp->UserBuffer = rc; 294 } 295 __except(EXCEPTION_EXECUTE_HANDLER) 296 { 297 rcNt = pIrp->IoStatus.Status = GetExceptionCode(); 298 dprintf(("VBoxSupDrvDeviceContorl: Exception Code %#x\n", rcNt)); 299 } 300 IoCompleteRequest(pIrp, IO_NO_INCREMENT); 301 return rcNt; 302 } 303 #endif /* VBOX_WITHOUT_IDT_PATCHING */ 304 305 return VBoxSupDrvDeviceControlSlow(pDevExt, pSession, pIrp, pStack); 306 } 307 308 309 /** 310 * Worker for VBoxSupDrvDeviceControl that takes the slow IOCtl functions. 311 * 312 * @returns NT status code. 313 * 314 * @param pDevObj Device object. 315 * @param pSession The session. 316 * @param pIrp Request packet. 317 * @param pStack The stack location containing the DeviceControl parameters. 318 */ 319 static int VBoxSupDrvDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack) 320 { 321 NTSTATUS rcNt = STATUS_NOT_SUPPORTED; 322 unsigned cbOut = 0; 323 int rc = 0; 324 dprintf2(("VBoxSupDrvDeviceControlSlow(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n", 277 325 pDevObj, pIrp, pStack->Parameters.DeviceIoControl.IoControlCode, 278 326 pBuf, pStack->Parameters.DeviceIoControl.InputBufferLength, 279 327 pStack->Parameters.DeviceIoControl.OutputBufferLength, pSession)); 280 328 281 #ifdef __WIN64__ 282 /* 283 * Don't allow 32-bit processes to do any I/O controls. 284 */ 285 if (IoIs32bitProcess(pIrp)) 286 { 287 dprintf(("VBoxSupDrvDeviceControl: returns STATUS_NOT_SUPPORTED - WOW64 req\n")); 288 return STATUS_NOT_SUPPORTED; 289 } 329 #ifdef __AMD64__ 330 /* Don't allow 32-bit processes to do any I/O controls. */ 331 if (!IoIs32bitProcess(pIrp)) 290 332 #endif 291 292 int rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession, 293 pBuf, pStack->Parameters.DeviceIoControl.InputBufferLength, 294 pBuf, pStack->Parameters.DeviceIoControl.OutputBufferLength, 295 &cbOut); 296 297 /* sanity check. */ 298 AssertMsg(cbOut <= pStack->Parameters.DeviceIoControl.OutputBufferLength, 299 ("cbOut is too large! cbOut=%d max=%d! ioctl=%#x\n", 300 cbOut, pStack->Parameters.DeviceIoControl.OutputBufferLength, 301 pStack->Parameters.DeviceIoControl.IoControlCode)); 302 if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength) 303 cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength; 333 { 334 /* Verify that it's a buffered CTL. */ 335 if ((pStack->Parameters.DeviceIoControl.IoControlCode & 0x3) == METHOD_BUFFERED) 336 { 337 char *pBuf = (char *)pIrp->AssociatedIrp.SystemBuffer; 338 339 /* 340 * Do the job. 341 */ 342 rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession, 343 pBuf, pStack->Parameters.DeviceIoControl.InputBufferLength, 344 pBuf, pStack->Parameters.DeviceIoControl.OutputBufferLength, 345 &cbOut); 346 rcNt = VBoxSupDrvErr2NtStatus(rc); 347 348 /* sanity check. */ 349 AssertMsg(cbOut <= pStack->Parameters.DeviceIoControl.OutputBufferLength, 350 ("cbOut is too large! cbOut=%d max=%d! ioctl=%#x\n", 351 cbOut, pStack->Parameters.DeviceIoControl.OutputBufferLength, 352 pStack->Parameters.DeviceIoControl.IoControlCode)); 353 if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength) 354 cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength; 355 dprintf2(("VBoxSupDrvDeviceControlSlow: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc)); 356 } 357 else 358 dprintf(("VBoxSupDrvDeviceControlSlow: not buffered request (%#x) - not supported\n", 359 pStack->Parameters.DeviceIoControl.IoControlCode)); 360 } 361 #ifdef __AMD64__ 362 else 363 dprintf(("VBoxSupDrvDeviceControlSlow: WOW64 req - not supported\n")); 364 #endif 304 365 305 366 /* complete the request. */ 306 NTSTATUS rcNt = pIrp->IoStatus.Status = VBoxSupDrvErr2NtStatus(rc);307 pIrp->IoStatus.Information = NT_SUCCESS(rcNt) ? cbOut : rc; 367 pIrp->IoStatus.Status = rcNt; 368 pIrp->IoStatus.Information = NT_SUCCESS(rcNt) ? cbOut : rc; /* does this rc passing actually work?!? */ 308 369 IoCompleteRequest(pIrp, IO_NO_INCREMENT); 309 310 dprintf2(("VBoxSupDrvDeviceControl: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));311 370 return rcNt; 312 371 } -
trunk/src/VBox/HostDrivers/Support/win32/SUPLib-win32.cpp
r1890 r2515 617 617 AssertMsg(g_hDevice != INVALID_HANDLE_VALUE, ("SUPLIB not initiated successfully!\n")); 618 618 /* 619 * Issue device iocontrol.619 * Issue device I/O control. 620 620 */ 621 621 DWORD cbReturned = (ULONG)cbOut; … … 624 624 return suplibConvertWin32Err(GetLastError()); 625 625 } 626 627 628 #ifdef VBOX_WITHOUT_IDT_PATCHING 629 int suplibOSIOCtlFast(unsigned uFunction) 630 { 631 /* 632 * Issue device I/O control. 633 */ 634 int rc = VERR_INTERNAL_ERROR; 635 DWORD cbReturned = (ULONG)sizeof(rc); 636 if (DeviceIoControl(g_hDevice, uFunction, NULL, 0, &rc, (DWORD)sizeof(rc), &cbReturned, NULL)) 637 return rc; 638 return suplibConvertWin32Err(GetLastError()); 639 } 640 #endif 626 641 627 642
Note:
See TracChangeset
for help on using the changeset viewer.