Changeset 4800 in vbox for trunk/src/VBox/HostDrivers/Support/win
- Timestamp:
- Sep 14, 2007 2:59:15 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 24502
- Location:
- trunk/src/VBox/HostDrivers/Support/win
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
r4755 r4800 58 58 * Internal Functions * 59 59 *******************************************************************************/ 60 static void _stdcall VBox SupDrvUnload(PDRIVER_OBJECT pDrvObj);61 static NTSTATUS _stdcall VBox SupDrvCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp);62 static NTSTATUS _stdcall VBox SupDrvClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);63 static NTSTATUS _stdcall VBox SupDrvDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp);64 static int VBox SupDrvDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack);65 static NTSTATUS _stdcall VBox SupDrvNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp);66 static NTSTATUS VBox SupDrvErr2NtStatus(int rc);67 static NTSTATUS VBox SupDrvGipInit(PSUPDRVDEVEXT pDevExt);68 static void VBox SupDrvGipTerm(PSUPDRVDEVEXT pDevExt);69 static void _stdcall VBox SupDrvGipTimer(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2);70 static void _stdcall VBox SupDrvGipPerCpuDpc(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2);60 static void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj); 61 static NTSTATUS _stdcall VBoxDrvNtCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp); 62 static NTSTATUS _stdcall VBoxDrvNtClose(PDEVICE_OBJECT pDevObj, PIRP pIrp); 63 static NTSTATUS _stdcall VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp); 64 static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack); 65 static NTSTATUS _stdcall VBoxDrvNtNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp); 66 static NTSTATUS VBoxDrvNtErr2NtStatus(int rc); 67 static NTSTATUS VBoxDrvNtGipInit(PSUPDRVDEVEXT pDevExt); 68 static void VBoxDrvNtGipTerm(PSUPDRVDEVEXT pDevExt); 69 static void _stdcall VBoxDrvNtGipTimer(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2); 70 static void _stdcall VBoxDrvNtGipPerCpuDpc(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2); 71 71 72 72 … … 118 118 * Inititalize the GIP. 119 119 */ 120 rc = VBox SupDrvGipInit(pDevExt);120 rc = VBoxDrvNtGipInit(pDevExt); 121 121 if (NT_SUCCESS(rc)) 122 122 { … … 124 124 * Setup the driver entry points in pDrvObj. 125 125 */ 126 pDrvObj->DriverUnload = VBox SupDrvUnload;127 pDrvObj->MajorFunction[IRP_MJ_CREATE] = VBox SupDrvCreate;128 pDrvObj->MajorFunction[IRP_MJ_CLOSE] = VBox SupDrvClose;129 pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VBox SupDrvDeviceControl;130 pDrvObj->MajorFunction[IRP_MJ_READ] = VBox SupDrvNotSupportedStub;131 pDrvObj->MajorFunction[IRP_MJ_WRITE] = VBox SupDrvNotSupportedStub;126 pDrvObj->DriverUnload = VBoxDrvNtUnload; 127 pDrvObj->MajorFunction[IRP_MJ_CREATE] = VBoxDrvNtCreate; 128 pDrvObj->MajorFunction[IRP_MJ_CLOSE] = VBoxDrvNtClose; 129 pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VBoxDrvNtDeviceControl; 130 pDrvObj->MajorFunction[IRP_MJ_READ] = VBoxDrvNtNotSupportedStub; 131 pDrvObj->MajorFunction[IRP_MJ_WRITE] = VBoxDrvNtNotSupportedStub; 132 132 /* more? */ 133 133 dprintf(("VBoxDrv::DriverEntry returning STATUS_SUCCESS\n")); 134 134 return STATUS_SUCCESS; 135 135 } 136 dprintf(("VBox SupDrvGipInit failed with rc=%#x!\n", rc));136 dprintf(("VBoxDrvNtGipInit failed with rc=%#x!\n", rc)); 137 137 138 138 supdrvDeleteDevExt(pDevExt); … … 141 141 { 142 142 dprintf(("supdrvInitDevExit failed with vrc=%d!\n", vrc)); 143 rc = VBox SupDrvErr2NtStatus(vrc);143 rc = VBoxDrvNtErr2NtStatus(vrc); 144 144 } 145 145 … … 166 166 * @param pDrvObj Driver object. 167 167 */ 168 void _stdcall VBox SupDrvUnload(PDRIVER_OBJECT pDrvObj)169 { 170 dprintf(("VBox SupDrvUnload\n"));168 void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj) 169 { 170 dprintf(("VBoxDrvNtUnload\n")); 171 171 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pDrvObj->DeviceObject->DeviceExtension; 172 172 … … 182 182 * Terminate the GIP page and delete the device extension. 183 183 */ 184 VBox SupDrvGipTerm(pDevExt);184 VBoxDrvNtGipTerm(pDevExt); 185 185 supdrvDeleteDevExt(pDevExt); 186 186 IoDeleteDevice(pDrvObj->DeviceObject); … … 194 194 * @param pIrp Request packet. 195 195 */ 196 NTSTATUS _stdcall VBox SupDrvCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)197 { 198 dprintf(("VBox SupDrvCreate\n"));196 NTSTATUS _stdcall VBoxDrvNtCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp) 197 { 198 dprintf(("VBoxDrvNtCreate\n")); 199 199 PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp); 200 200 PFILE_OBJECT pFileObj = pStack->FileObject; … … 228 228 } 229 229 230 NTSTATUS rcNt = pIrp->IoStatus.Status = VBox SupDrvErr2NtStatus(rc);230 NTSTATUS rcNt = pIrp->IoStatus.Status = VBoxDrvNtErr2NtStatus(rc); 231 231 pIrp->IoStatus.Information = 0; 232 232 IoCompleteRequest(pIrp, IO_NO_INCREMENT); … … 242 242 * @param pIrp Request packet. 243 243 */ 244 NTSTATUS _stdcall VBox SupDrvClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)244 NTSTATUS _stdcall VBoxDrvNtClose(PDEVICE_OBJECT pDevObj, PIRP pIrp) 245 245 { 246 246 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pDevObj->DeviceExtension; 247 247 PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp); 248 248 PFILE_OBJECT pFileObj = pStack->FileObject; 249 dprintf(("VBox SupDrvClose: pDevExt=%p pFileObj=%p pSession=%p\n",249 dprintf(("VBoxDrvNtClose: pDevExt=%p pFileObj=%p pSession=%p\n", 250 250 pDevExt, pFileObj, pFileObj->FsContext)); 251 251 supdrvCloseSession(pDevExt, (PSUPDRVSESSION)pFileObj->FsContext); … … 265 265 * @param pIrp Request packet. 266 266 */ 267 NTSTATUS _stdcall VBox SupDrvDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)267 NTSTATUS _stdcall VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp) 268 268 { 269 269 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pDevObj->DeviceExtension; … … 300 300 #endif /* VBOX_WITHOUT_IDT_PATCHING */ 301 301 302 return VBox SupDrvDeviceControlSlow(pDevExt, pSession, pIrp, pStack);303 } 304 305 306 /** 307 * Worker for VBox SupDrvDeviceControl that takes the slow IOCtl functions.302 return VBoxDrvNtDeviceControlSlow(pDevExt, pSession, pIrp, pStack); 303 } 304 305 306 /** 307 * Worker for VBoxDrvNtDeviceControl that takes the slow IOCtl functions. 308 308 * 309 309 * @returns NT status code. … … 314 314 * @param pStack The stack location containing the DeviceControl parameters. 315 315 */ 316 static int VBox SupDrvDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack)317 { 318 NTSTATUS rcNt = STATUS_NOT_SUPPORTED;316 static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack) 317 { 318 NTSTATUS rcNt; 319 319 unsigned cbOut = 0; 320 320 int rc = 0; 321 dprintf2(("VBox SupDrvDeviceControlSlow(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n",321 dprintf2(("VBoxDrvNtDeviceControlSlow(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n", 322 322 pDevExt, pIrp, pStack->Parameters.DeviceIoControl.IoControlCode, 323 323 pIrp->AssociatedIrp.SystemBuffer, pStack->Parameters.DeviceIoControl.InputBufferLength, … … 332 332 if ((pStack->Parameters.DeviceIoControl.IoControlCode & 0x3) == METHOD_BUFFERED) 333 333 { 334 char *pBuf = (char *)pIrp->AssociatedIrp.SystemBuffer; 335 336 /* 337 * Do the job. 338 */ 339 rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession, 340 pBuf, pStack->Parameters.DeviceIoControl.InputBufferLength, 341 pBuf, pStack->Parameters.DeviceIoControl.OutputBufferLength, 342 &cbOut); 343 rcNt = VBoxSupDrvErr2NtStatus(rc); 344 345 /* sanity check. */ 346 AssertMsg(cbOut <= pStack->Parameters.DeviceIoControl.OutputBufferLength, 347 ("cbOut is too large! cbOut=%d max=%d! ioctl=%#x\n", 348 cbOut, pStack->Parameters.DeviceIoControl.OutputBufferLength, 349 pStack->Parameters.DeviceIoControl.IoControlCode)); 350 if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength) 351 cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength; 352 dprintf2(("VBoxSupDrvDeviceControlSlow: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc)); 334 /* Verify that the sizes in the request header are correct. */ 335 PSUPREQHDR pHdr = (PSUPREQHDR)pIrp->AssociatedIrp.SystemBuffer; 336 if ( pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr) 337 && pStack->Parameters.DeviceIoControl.InputBufferLength == pHdr->cbIn 338 && pStack->Parameters.DeviceIoControl.OutputBufferLength == pHdr->cbOut) 339 { 340 /* 341 * Do the job. 342 */ 343 rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession, pHdr); 344 if (!rc) 345 { 346 rcNt = STATUS_SUCCESS; 347 cbOut = pHdr->cbOut; 348 if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength) 349 { 350 cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength; 351 OSDBGPRINT(("VBoxDrvLinuxIOCtl: too much output! %#x > %#x; uCmd=%#x!\n", 352 pHdr->cbOut, cbOut, pStack->Parameters.DeviceIoControl.IoControlCode)); 353 } 354 } 355 else 356 rcNt = STATUS_INVALID_PARAMETER; 357 dprintf2(("VBoxDrvNtDeviceControlSlow: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc)); 358 } 359 else 360 { 361 dprintf(("VBoxDrvNtDeviceControlSlow: Mismatching sizes (%#x) - Hdr=%#lx/%#lx Irp=%#lx/%#lx!\n", 362 pStack->Parameters.DeviceIoControl.IoControlCode, 363 pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr) ? pHdr->cbIn : 0, 364 pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr) ? pHdr->cbOut : 0, 365 pStack->Parameters.DeviceIoControl.InputBufferLength, 366 pStack->Parameters.DeviceIoControl.OutputBufferLength)); 367 rcNt = STATUS_INVALID_PARAMETER; 368 } 353 369 } 354 370 else 355 dprintf(("VBoxSupDrvDeviceControlSlow: not buffered request (%#x) - not supported\n", 371 { 372 dprintf(("VBoxDrvNtDeviceControlSlow: not buffered request (%#x) - not supported\n", 356 373 pStack->Parameters.DeviceIoControl.IoControlCode)); 374 rcNt = STATUS_NOT_SUPPORTED; 375 } 357 376 } 358 377 #ifdef RT_ARCH_AMD64 359 378 else 360 dprintf(("VBoxSupDrvDeviceControlSlow: WOW64 req - not supported\n")); 379 { 380 dprintf(("VBoxDrvNtDeviceControlSlow: WOW64 req - not supported\n")); 381 rcNt = STATUS_NOT_SUPPORTED; 382 } 361 383 #endif 362 384 363 385 /* complete the request. */ 364 386 pIrp->IoStatus.Status = rcNt; 365 pIrp->IoStatus.Information = NT_SUCCESS(rcNt) ? cbOut : rc; /* does this rc passing actually work?!? */387 pIrp->IoStatus.Information = cbOut; 366 388 IoCompleteRequest(pIrp, IO_NO_INCREMENT); 367 389 return rcNt; … … 376 398 * @param pIrp IRP. 377 399 */ 378 NTSTATUS _stdcall VBox SupDrvNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp)379 { 380 dprintf(("VBox SupDrvNotSupportedStub\n"));400 NTSTATUS _stdcall VBoxDrvNtNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp) 401 { 402 dprintf(("VBoxDrvNtNotSupportedStub\n")); 381 403 pDevObj = pDevObj; 382 404 … … 808 830 * @param pDevExt Instance data. GIP stuff may be updated. 809 831 */ 810 static NTSTATUS VBox SupDrvGipInit(PSUPDRVDEVEXT pDevExt)832 static NTSTATUS VBoxDrvNtGipInit(PSUPDRVDEVEXT pDevExt) 811 833 { 812 834 dprintf2(("VBoxSupDrvTermGip:\n")); … … 850 872 */ 851 873 KeInitializeTimerEx(&pDevExt->GipTimer, SynchronizationTimer); 852 KeInitializeDpc(&pDevExt->GipDpc, VBox SupDrvGipTimer, pDevExt);874 KeInitializeDpc(&pDevExt->GipDpc, VBoxDrvNtGipTimer, pDevExt); 853 875 854 876 /* … … 862 884 for (unsigned i = 0; i < RT_ELEMENTS(pDevExt->aGipCpuDpcs); i++) 863 885 { 864 KeInitializeDpc(&pDevExt->aGipCpuDpcs[i], VBox SupDrvGipPerCpuDpc, pGip);886 KeInitializeDpc(&pDevExt->aGipCpuDpcs[i], VBoxDrvNtGipPerCpuDpc, pGip); 865 887 KeSetImportanceDpc(&pDevExt->aGipCpuDpcs[i], HighImportance); 866 888 if (pfnKeSetTargetProcessorDpc) … … 868 890 } 869 891 870 dprintf(("VBox SupDrvGipInit: ulClockFreq=%ld ulClockInterval=%ld ulClockIntervalActual=%ld Phys=%x%08x\n",892 dprintf(("VBoxDrvNtGipInit: ulClockFreq=%ld ulClockInterval=%ld ulClockIntervalActual=%ld Phys=%x%08x\n", 871 893 ulClockFreq, ulClockInterval, ulClockIntervalActual, Phys.HighPart, Phys.LowPart)); 872 894 return STATUS_SUCCESS; … … 898 920 * @param pDevExt Instance data. GIP stuff may be updated. 899 921 */ 900 static void VBox SupDrvGipTerm(PSUPDRVDEVEXT pDevExt)922 static void VBoxDrvNtGipTerm(PSUPDRVDEVEXT pDevExt) 901 923 { 902 924 dprintf(("VBoxSupDrvTermGip:\n")); … … 941 963 * The pvUser parameter is the pDevExt pointer. 942 964 */ 943 static void _stdcall VBox SupDrvGipTimer(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2)965 static void _stdcall VBoxDrvNtGipTimer(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2) 944 966 { 945 967 PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser; … … 982 1004 * The pvUser parameter is the pGip pointer. 983 1005 */ 984 static void _stdcall VBox SupDrvGipPerCpuDpc(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2)1006 static void _stdcall VBoxDrvNtGipPerCpuDpc(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2) 985 1007 { 986 1008 PSUPGLOBALINFOPAGE pGip = (PSUPGLOBALINFOPAGE)pvUser; … … 1173 1195 * @param rc supdrv error code (SUPDRV_ERR_* defines). 1174 1196 */ 1175 static NTSTATUS VBox SupDrvErr2NtStatus(int rc)1197 static NTSTATUS VBoxDrvNtErr2NtStatus(int rc) 1176 1198 { 1177 1199 switch (rc) -
trunk/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp
r4071 r4800 21 21 *******************************************************************************/ 22 22 #define LOG_GROUP LOG_GROUP_SUP 23 #include < windows.h>23 #include <Windows.h> 24 24 25 25 #include <VBox/sup.h> … … 32 32 #include <iprt/string.h> 33 33 #include "SUPLibInternal.h" 34 #include "SUPDRVIOC.h" 34 35 35 36 … … 603 604 * @returns VBOX error code on failure. 604 605 * @param uFunction IO Control function. 605 * @param pvIn Input data buffer. 606 * @param cbIn Size of input data. 607 * @param pvOut Output data buffer. 608 * @param cbOut Size of output data. 609 */ 610 int suplibOsIOCtl(unsigned uFunction, void *pvIn, size_t cbIn, void *pvOut, size_t cbOut) 606 * @param pvIn The request buffer. 607 * @param cbReq The size of the request buffer. 608 */ 609 int suplibOsIOCtl(uintptr_t uFunction, void *pvReq, size_t cbReq) 611 610 { 612 611 AssertMsg(g_hDevice != INVALID_HANDLE_VALUE, ("SUPLIB not initiated successfully!\n")); 613 /* 614 * Issue device I/O control. 615 */ 616 DWORD cbReturned = (ULONG)cbOut; 617 if (DeviceIoControl(g_hDevice, uFunction, pvIn, (ULONG)cbIn, pvOut, (ULONG)cbOut, &cbReturned, NULL)) 612 613 /* 614 * Issue the device I/O control. 615 */ 616 PSUPREQHDR pHdr = (PSUPREQHDR)pvReq; 617 Assert(cbReq == RT_MAX(pHdr->cbIn, pHdr->cbOut)); 618 DWORD cbReturned = (ULONG)pHdr->cbOut; 619 if (DeviceIoControl(g_hDevice, uFunction, pvReq, pHdr->cbIn, pvReq, cbReturned, &cbReturned, NULL)) 618 620 return 0; 621 619 622 return suplibConvertWin32Err(GetLastError()); 620 623 }
Note:
See TracChangeset
for help on using the changeset viewer.