ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

BOOL WINAPI DeviceIoControl ( IN HANDLE  hDevice,
IN DWORD  dwIoControlCode,
IN LPVOID lpInBuffer  OPTIONAL,
IN DWORD nInBufferSize  OPTIONAL,
OUT LPVOID lpOutBuffer  OPTIONAL,
IN DWORD nOutBufferSize  OPTIONAL,
OUT LPDWORD lpBytesReturned  OPTIONAL,
IN LPOVERLAPPED lpOverlapped  OPTIONAL 
)

Definition at line 132 of file deviceio.c.

Referenced by AuxGetAudio(), AuxSetAudio(), ClearCommBreak(), ClearCommError(), Control(), createIpForwardEntry(), DECLARE_INTERFACE_(), deleteIpForwardEntry(), EnableVolumeCompression(), EscapeCommFunction(), FindFirstVolumeW(), get_drive_connection(), GetCommMask(), GetCommModemStatus(), GetCommState(), GetCommTimeouts(), GetDeviceCapabilities(), GetDeviceData(), getDriverData(), hasArp(), HidD_FlushQueue(), HidD_GetAttributes(), HidD_GetConfiguration(), HidD_GetFeature(), HidD_GetIndexedString(), HidD_GetInputReport(), HidD_GetManufacturerString(), HidD_GetMsGenreDescriptor(), HidD_GetNumInputBuffers(), HidD_GetPhysicalDescriptor(), HidD_GetPreparsedData(), HidD_GetProductString(), HidD_GetSerialNumberString(), HidD_SetConfiguration(), HidD_SetFeature(), HidD_SetNumInputBuffers(), HidD_SetOutputReport(), IDirectSoundCaptureBufferImpl_Start(), IsWlanAdapter(), CKsInterfaceHandler::KsProcessMediaSamples(), KsSynchronousDeviceControl(), main(), MCICDA_CalcFrame(), MCICDA_CalcTime(), MCICDA_GetStatus(), MCICDA_Info(), MCICDA_Pause(), MCICDA_Play(), MCICDA_playLoop(), MCICDA_Resume(), MCICDA_Seek(), MCICDA_SetDoor(), MCICDA_SkipDataTracks(), MCICDA_Status(), MCICDA_Stop(), OpenAdapterHandle(), OpenDriverHandle(), PrimaryDirectSoundBuffer_Write(), PurgeComm(), RemoveDirectoryW(), SendRequest(), SerenumDetectLegacyDevice(), SerenumDetectPnpDevice(), SermouseDetectLegacyDevice(), SetCommBreak(), SetCommMask(), SetCommState(), SetCommTimeouts(), setDriverData(), SetIpNetEntry(), SetupComm(), SetWaveFormat(), SyncOverlappedDeviceIoControl(), tdiGetMibForIfEntity(), tdiGetMibForIpEntity(), tdiGetSetOfThings(), TestKs(), TransmitCommChar(), TuiDrawRegion(), TuiInit(), TuiSetCursorInfo(), TuiSetScreenInfo(), TuiSwapConsole(), WahCreateSocketHandle(), WaitCommEvent(), WlanConnect(), WlanDisconnect(), WlanPrintCurrentStatus(), WlanScan(), and WriteMidi().

{
    BOOL FsIoCtl;
    NTSTATUS Status;
    PVOID ApcContext;
    IO_STATUS_BLOCK Iosb;

    //
    // Note: on a TS Machine, we should call IsTSAppCompatEnabled and unless the
    // IOCTLs are IOCTL_STORAGE_EJECT_MEDIA, IOCTL_DISK_EJECT_MEDIA, FSCTL_DISMOUNT_VOLUME
    // we should call IsCallerAdminOrSystem and return STATUS_ACCESS_DENIED for
    // any other IOCTLs.
    //

    /* Check what kind of IOCTL to send */
    FsIoCtl = ((dwIoControlCode >> 16) == FILE_DEVICE_FILE_SYSTEM);

    /* CHeck for async */
    if (lpOverlapped != NULL)
    {
        /* Set pending status */
        lpOverlapped->Internal = STATUS_PENDING;

        /* Check if there's an APC context */
        ApcContext = (((ULONG_PTR)lpOverlapped->hEvent & 0x1) ? NULL : lpOverlapped);

        /* Send file system control? */
        if (FsIoCtl)
        {
            /* Send it */
            Status = NtFsControlFile(hDevice,
                                     lpOverlapped->hEvent,
                                     NULL,
                                     ApcContext,
                                     (PIO_STATUS_BLOCK)lpOverlapped,
                                     dwIoControlCode,
                                     lpInBuffer,
                                     nInBufferSize,
                                     lpOutBuffer,
                                     nOutBufferSize);
        }
        else
        {
            /* Otherwise send a device control */
            Status = NtDeviceIoControlFile(hDevice,
                                           lpOverlapped->hEvent,
                                           NULL,
                                           ApcContext,
                                           (PIO_STATUS_BLOCK)lpOverlapped,
                                           dwIoControlCode,
                                           lpInBuffer,
                                           nInBufferSize,
                                           lpOutBuffer,
                                           nOutBufferSize);
        }

        /* Check for or information instead of failure */
        if (!(NT_ERROR(Status)) && (lpBytesReturned))
        {
            /* Protect with SEH */
            _SEH2_TRY
            {
                /* Return the bytes */
                *lpBytesReturned = lpOverlapped->InternalHigh;
            }
            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
            {
                /* Return zero bytes */
                *lpBytesReturned = 0;
            }
            _SEH2_END;
        }

        /* Now check for any kind of failure except pending*/
        if (!(NT_SUCCESS(Status)) || (Status == STATUS_PENDING))
        {
            /* Fail */
            BaseSetLastNTError(Status);
            return FALSE;
        }
    }
    else
    {
        /* Sync case -- send file system code? */
        if (FsIoCtl)
        {
            /* Do it */
            Status = NtFsControlFile(hDevice,
                                     NULL,
                                     NULL,
                                     NULL,
                                     &Iosb,
                                     dwIoControlCode,
                                     lpInBuffer,
                                     nInBufferSize,
                                     lpOutBuffer,
                                     nOutBufferSize);
        }
        else
        {
            /* Send device code instead */
            Status = NtDeviceIoControlFile(hDevice,
                                           NULL,
                                           NULL,
                                           NULL,
                                           &Iosb,
                                           dwIoControlCode,
                                           lpInBuffer,
                                           nInBufferSize,
                                           lpOutBuffer,
                                           nOutBufferSize);
        }

        /* Now check if the operation isn't done yet */
        if (Status == STATUS_PENDING)
        {
            /* Wait for it and get the final status */
            Status = NtWaitForSingleObject(hDevice, FALSE, NULL);
            if (NT_SUCCESS(Status)) Status = Iosb.Status;
        }

        /* Check for success */
        if (NT_SUCCESS(Status))
        {
            /* Return the byte count */
            *lpBytesReturned = Iosb.Information;
        }
        else
        {
            /* Check for informational or warning failure */
            if (!NT_ERROR(Status)) *lpBytesReturned = Iosb.Information;

            /* Return a failure */
            BaseSetLastNTError(Status);
            return FALSE;
        }
    }

    /* Return success */
    return TRUE;
}

Generated on Sat May 26 2012 05:09:59 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.