VirtualBox

Changeset 2016 in vbox for trunk/src/VBox/Additions/common


Ignore:
Timestamp:
Apr 10, 2007 4:22:01 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
20304
Message:

Windows guest library: allocate the event structure from pool.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp

    r1083 r2016  
    8989    IO_STATUS_BLOCK ioStatusBlock;
    9090
    91     KEVENT event;
    92     KeInitializeEvent (&event, NotificationEvent, FALSE);
     91    KEVENT *pEvent;
     92#ifdef KEVENT_STACK_ALLOC
     93    KEVENT eventAlloc;
     94    pEvent = &eventAlloc;
     95#else
     96    pEvent = (KEVENT *)ExAllocatePool (NonPagedPool, sizeof (KEVENT));
     97    if (!pEvent) return VERR_NO_MEMORY;
     98#endif /* KEVENT_STACK_ALLOC */
     99    KeInitializeEvent (pEvent, NotificationEvent, FALSE);
    93100
    94101    PIRP irp = IoBuildDeviceIoControlRequest (u32Function,
     
    99106                                              cbData,
    100107                                              FALSE,
    101                                               &event,
     108                                              pEvent,
    102109                                              &ioStatusBlock);
    103110    if (irp == NULL)
    104111    {
    105112        Log(("vbglDriverIOCtl: IoBuildDeviceIoControlRequest failed\n"));
     113#ifndef KEVENT_STACK_ALLOC
     114        ExFreePool (pEvent);
     115#endif /* KEVENT_STACK_ALLOC */
    106116        return VERR_NO_MEMORY;
    107117    }
     
    109119    NTSTATUS rc = IoCallDriver (pDriver->pDeviceObject, irp);
    110120
     121    if (rc == STATUS_PENDING)
     122    {
     123        Log(("vbglDriverIOCtl: STATUS_PENDING\n"));
     124        rc = KeWaitForSingleObject(pEvent,
     125                                   Executive,
     126                                   KernelMode,
     127                                   FALSE,
     128                                   NULL);
     129
     130        rc = ioStatusBlock.Status;                     
     131    }   
     132
    111133    if (!NT_SUCCESS(rc))
    112134        Log(("vbglDriverIOCtl: IoCallDriver failed with ntstatus=%x\n", rc));
     135
     136#ifndef KEVENT_STACK_ALLOC
     137    ExFreePool (pEvent);
     138#endif /* KEVENT_STACK_ALLOC */
    113139
    114140    return NT_SUCCESS(rc)? VINF_SUCCESS: VERR_VBGL_IOCTL_FAILED;
Note: See TracChangeset for help on using the changeset viewer.

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