/*++ Copyright (c) 2003 Aleksandrov O.E. All rights Reserved Copyright (c) 2003 Ђ«ҐЄc ­¤а®ў Ћ.…. All rights Reserved Module Name: MI1201Get_SetControlInfo.h Abstract: Include file for MI1201-AGM Port I/O Driver Функции управления и получения информации о драйвере --*/ #include "MI1201Get_SetControlInfo.h" // Get IOCTL interface definitions // Разрешение ВЫГРУЗКИ СТРАНИЦ на диск (paging) #ifdef ALLOC_PRAGMA // насколько я понял при запуске BUILD это ОПРЕДЕЛЕНО #pragma alloc_text (PAGE, MI1201IoctlGetControlInfo) #endif NTSTATUS MI1201IoctlGetControlInfo( // получение информации о драйвере IN PLOCAL_DEVICE_INFO pLDI, IN PIRP pIrp, IN PIO_STACK_LOCATION IrpStack ) { PMI1201_CONTROL_INFO_INPUT_BUFFER_BASE_PART pIOBuffer; // Указатель на буфер (исходная информация) ULONG ReturnedDataSize; // Возвращаемый размер данных ULONG InBufferSize; // Amount of data avail. from caller. ULONG OutBufferSize; // Max data that caller can accept. ULONG InDataSize; // размер входных данных ULONG OutDataSize; // размер выходных данных ULONG FullInDataSize; // размер входных данных из сведений записанных в буфер ULONG ControlCode, ControlSubCode; // tTestAlingment x; PAGED_CODE(); // Size of buffer containing data from application InBufferSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength; // Size of buffer for data to be sent to application OutBufferSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; pIrp->IoStatus.Information = 0; // Проверяем минимально-необходимый размер буфера if (InBufferSize < sizeof(MI1201_CONTROL_INFO_INPUT_BUFFER_BASE_PART) ){ return STATUS_INVALID_PARAMETER; } pIOBuffer = (PMI1201_CONTROL_INFO_INPUT_BUFFER_BASE_PART)pIrp->AssociatedIrp.SystemBuffer; FullInDataSize = pIOBuffer->FullSize; ControlCode = pIOBuffer->ControlCode; ControlSubCode = pIOBuffer->ControlSubCode; // Проверяем минимально-необходимый входных данных if ( (InBufferSize < FullInDataSize) || (sizeof(MI1201_CONTROL_INFO_INPUT_BUFFER_BASE_PART) > FullInDataSize) ){ return STATUS_INVALID_PARAMETER; } // Определяем размеры входной и возвращаемой информации InDataSize = sizeof(MI1201_CONTROL_INFO_INPUT_BUFFER_BASE_PART); switch (ControlCode){ case MI1201_GET_CONTROL_CODE_GET_VERSION: OutDataSize = sizeof(MI1201_CONTROL_INFO_OUTPUT_BUFFER_GET_VERSION); break; case MI1201_GET_CONTROL_CODE_GET_CAPABILITIES: OutDataSize = sizeof(MI1201_CONTROL_INFO_OUTPUT_BUFFER_GET_CAPABILITIES); break; case MI1201_GET_CONTROL_CODE_GET_ABORT_STATE: OutDataSize = sizeof(MI1201_CONTROL_INFO_OUTPUT_GET_ABORT_STATE); break; default: return STATUS_INVALID_PARAMETER; }; // Проверяем минимально-необходимый выходных данных if ( (InBufferSize < InDataSize) || (OutBufferSize < OutDataSize ) ){ return STATUS_INVALID_PARAMETER; } // ВСЕ ХОРОШО switch (ControlCode){ case MI1201_GET_CONTROL_CODE_GET_VERSION: ((PMI1201_CONTROL_INFO_OUTPUT_BUFFER_GET_VERSION)pIOBuffer)->InternalVersion = cDriverInternalVersion; ReturnedDataSize = OutDataSize; break; case MI1201_GET_CONTROL_CODE_GET_CAPABILITIES: ((PMI1201_CONTROL_INFO_OUTPUT_BUFFER_GET_CAPABILITIES)pIOBuffer)->Capabilities = 0 | MI1201_CAP_FLAG_ARRAY_IO_SINGLE_PORT | MI1201_CAP_FLAG_WAIT_ON_SINGLE_PORT // Ожидания на порту события по маске и образцу указанное число миллисекунд | MI1201_CAP_FLAG_ARRAY_IO_RAW_PORTS // Возможность ввода/вывода в несколько портов нескольких массивов (нескольких значений за один раз) | MI1201_CAP_FLAG_WRITE_AND_WAIT_ON_SINGLE_PORT // Запись в порт 1 + Ожидания на порту 2 события по маске и образцу указанное число миллисекунд | MI1201_CAP_FLAG_ARRAY_IO_RAW_PORTS_AND_WAIT // Возможность ввода/вывода/ожидания в несколько портов нескольких массивов (нескольких значений за один раз) ; ReturnedDataSize = OutDataSize; break; case MI1201_GET_CONTROL_CODE_GET_ABORT_STATE: ((PMI1201_CONTROL_INFO_OUTPUT_GET_ABORT_STATE)pIOBuffer)->State = AbortState(pLDI); ReturnedDataSize = OutDataSize; break; default: return STATUS_INVALID_PARAMETER; }; pIrp->IoStatus.Information = ReturnedDataSize; return STATUS_SUCCESS; };