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;

}
С уважением,
Евгений
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.