DeviceIoControl возвращает ERROR_GEN_FAILURE
От: ScorpeeOn  
Дата: 21.12.07 21:35
Оценка:
Привет Всем!
Помогите плз...
Пытаюсь от драйвера данные получить и не могу, т.к. DeviceIoControl не выполняется, а GetLastError говорит про ERROR_GEN_FAILURE.
В самом драйвере в диспетчерскую функцию заходит при запросе и даже копирует в буфер, но в юзермоде вот такая ошибка.
В чем причина?

Юзермод:
DeviceIoControl(hDriver, IOCTL_GET_PROCINFO, NULL, 0, chBuffer, 512, &dwRet, NULL)


Обработка запросов в драйвере:
NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
    ULONG ulOutputBufferLength;
    ULONG ulBytesSend = 0;
    PIO_STACK_LOCATION irpStack;
    PCHAR pOutputBuffer;
    LARGE_INTEGER liWaitMutex = {0xFFFFFFFF, 0xFFFFFFFF};
    PLIST_ENTRY pListEntry;
    PPROC_INFO pProcInfo;
    
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    switch(irpStack->Parameters.DeviceIoControl.IoControlCode) {

        case IOCTL_GET_PROCINFO:

            ulOutputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;

            if( ulOutputBufferLength >= MAX_PROC_BUFFER_SIZE ) {

                pOutputBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
                KeWaitForSingleObject(&kProcInfoMutex, Executive, KernelMode, FALSE, &liWaitMutex);
                if( !IsListEmpty(&DoubleHeadProcInfoList) ) {
                    pListEntry = RemoveHeadList(&DoubleHeadProcInfoList);
                    pProcInfo = CONTAINING_RECORD(pListEntry, PROC_INFO, linkfield);
                    RtlCopyMemory(pOutputBuffer, pProcInfo->chBuffer, pProcInfo->ulBuffLen);
                    ulBytesSend = pProcInfo->ulBuffLen;
                    ExFreePool(pProcInfo);                
                } // if( !IsListEmpty(&DoubleHeadProcInfoList) )
                KeReleaseMutex(&kProcInfoMutex, FALSE);

            } // if( irpStack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(PROC_INFO) )

            break;

        default:
            break;

    } // switch(irpStack->Parameters.DeviceIoControl.IoControlCode)

    Irp->IoStatus.Status = ntStatus;
   
    if(ntStatus == STATUS_SUCCESS)
        Irp->IoStatus.Information = ulBytesSend;
    else
        Irp->IoStatus.Information = 0;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    return ntStatus;

}
С уважением,
Евгений
Re: DeviceIoControl возвращает ERROR_GEN_FAILURE
От: Аноним  
Дата: 21.12.07 21:40
Оценка:
не понял прикола, а почему ntStatus остается STATUS_UNSUCCESSFUL до return'а?
Re[2]: DeviceIoControl возвращает ERROR_GEN_FAILURE
От: ScorpeeOn  
Дата: 21.12.07 21:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>не понял прикола, а почему ntStatus остается STATUS_UNSUCCESSFUL до return'а?


Да точно, забыл в STATUS_SUCCESSFUL установить после копирования
Спасиб!
С уважением,
Евгений
Re[3]: DeviceIoControl возвращает ERROR_GEN_FAILURE
От: Unmanaged Россия ICQ 476611995
Дата: 24.12.07 15:26
Оценка:
SO>Да точно, забыл в STATUS_SUCCESSFUL установить после копирования

STATUS_SUCCESS.
Не вводите в заблуждение остальных.
STATUS_INVALID_DEVICE_REQUEST
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.